博文

LLVM 6.0发布,附下载地址及安装办法

官方文档: http://releases.llvm.org/6.0.0/docs/CMake.html

下载地址:
http://llvm.org/releases/6.0.0/

如果你没有找到与你系统对应的二进制包,可按下述步骤编译及安装:
下载源代码 mkdir llvm
cd llvm

aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/llvm-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/cfe-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/compiler-rt-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/lldb-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/lld-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/clang-tools-extra-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/polly-6.0.0.src.tar.xz
aria2c -x 5 -j 5 -k 1M http://releases.llvm.org/6.0.0/openmp-6.0.0.src.tar.xz

解压缩
for filename in *.xz; do tar -Jxf $filename ; done

mv cfe-6.0.0.src llvm-6.0.0.src/tools/clang
mv compiler-rt-6.0.0.src llvm-6.0.0.src/projects/compiler-rt
mv clang-tools-extra-6.0.0.src llvm-6.0.0.src/tools/clang/tool…

异步执行task的时候,一定要把完成通知放在最末尾的地方

请看下面这段示例代码。这段程序的目的是计算1*2+3*4+5*6=? 。它试图并行的计算3个乘法,然后汇总。如果乘号的两边是大矩阵或者向量,这样的多线程计算会得到很好的加速。
#include <atomic> #include <condition_variable> #include <mutex> #include <pthread.h> #include <stdio.h> #include <thread> #include <unistd.h> #define DISALLOW_COPY_AND_ASSIGN(TypeName) \ TypeName(const TypeName &) = delete; \ void operator=(const TypeName &) = delete class SubTask; void *runSubTask(void *); class Job { public: Job() {} void compute(); void onSubTaskFinished() { if (--active_tasks == 0) { cv_.notify_all(); } } std::atomic<size_t> active_tasks; private: std::mutex m_; std::condition_variable cv_; DISALLOW_COPY_AND_ASSIGN(Job); }; class SubTask { public: int v1; int v2; std::atomic<int> *result; Job *parent; int task_id; ~SubTask() { printf("Sub task %d finished\n", task_id); } //BUG!…

Linux调整分区及备份恢复小结

如果想要扩展一个分区,那么只能向后扩展,不能向前扩展。
调整一个分区的大小分为三步:

1. 用fdisk/gdisk调整分区表。
     不能直接modify。需要先删除该分区,再新建。
2. fsck
3. 用resize2fs调整元数据信息

resize2fs要求分区的起始位置不能变。

"when  recreating the partition, make sure you create it with the same starting disk cylinder as before!  Otherwise, the resize operation will certainly not work, and you  may  lose  your  entire filesystem."

如果需要往前移动,那么最好是先备份再恢复。作为一个FreeBSD的老用户,我非常信赖dump/restore这两个命令。简略步骤如下:
$ mkfs.ext4 /dev/sda3
$ mount /dev/sda3 /mnt/a
$ cd /mnt/a
$ dump -a0f - /dev/sda4 | restore -rf -





linux wifi regulatory database在新版本kernel中的更改

更新linux kernel后经常会遇到这样的错误信息:

“Direct firmware load for regulatory.db failed”

这是因为新版本的kernel更改了load regulatory.db 的方式
解决办法是手动从https://mirrors.edge.kernel.org/pub/software/network/wireless-regdb/ 下载最新的包,解压缩后把regulatory.db regulatory.db.p7s 复制到/lib/firmware即可

然后reboot,看到这样的信息就对了
"cfg80211: Loading compiled-in X.509 certificates for regulatory database"


参考:https://wireless.wiki.kernel.org/en/developers/regulatory/wireless-regdb

终于在Fedora 27上把nvidia-docker2装上了

在开始一切工作之前,先把和nvidia以及cuda相关的rpm全删掉。

第一步是装显卡驱动。
不要通过rpmfusion来安装cuda和nvidia的driver,否则会遇到各种version mismatch。我需要最新的kernel,最新的gpu driver,但是我不需要最新的CUDA!!

kernel启动的命令行参数一定要注意加上rd.driver.blacklist=nouveau。我是通过EFI启动的,如果不加这个,会在kernel boot的时候初始化fb,加载nouveau,然后nvidia的闭源驱动就无法初始化了。nouveau就是个占着茅坑不拉屎的废物,任何时候都不要用它!!


然后,怎么装cuda。
nvidia-docker2依赖于cuda,但是cuda在fedora 27上实际上是个半残废。
Fedora 26和Fedora 27的gcc是 7.x,太新了。没法和cuda9一起用。cuda9要求gcc的version<=6.x 。所以需要Fedora的version <=25。
cuda提供了Fedora 25的rpm repo,如果直接安装这个,会依赖于很多Fedora 25的package,会引来冲突。
我是用cuda的run file来安装cuda 9.0, 在fedora 27上。
安装的时候会询问是否装drivers。此时要选择不装。因为那个driver版本太老,在新的kernel上编译不过。


最后是docker。
$ dnf install docker-ce
不要安装nvidia-docker2这个包,否则会把docker这个rpm带进来。安装nvidia-container-runtime即可。

dnf install nvidia-container-runtime

$ cat /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

n…

这几天玩快手玩的入迷

国庆这几天我在家啥事没干,除了看电视就是玩“快手”。快手是一个短视频App,非常火爆,对我来说就像是一个迷一般的存在。

快手视频圈破了一个谎言:“中美有巨大的文化差异,中国人不爱拍视频上网炫耀,所以YouTube这样类型的网站在中国没有用户基础”。10多年前,优酷、土豆、酷6、六间房等一群中国的视频网站都号称自己是中国的YouTube,但是实际上干的是以“用户上传”为名的盗版影视剧。接着他们又撕破自己谎言,为自己正名,说YouTube那套在中国行不通。二三个学生对着摄像头抱着吉他弹啊弹,也不咋好听,就有几百万的播放量,这在中国不可能。对于这种文化差异,分析的头头是道,在2012年前后,这基本是同行的共识。反正我是信了。但是自从近些年有了快手,这谎言真是不攻自破了。快手才是中国的YouTube。无数优秀的企业家怀揣着这样的梦想但是都没有成功,只有快手把这条路走通了,印证了这是可行的。

快手吸引我之处在于它浓浓的村土气息。比如,一堆堆的玉米棒子,晒怎么割蜂蜜吃蜂蜜的,一个小姑娘坐那开拖拉机,小县城的婚礼,商场为了招揽顾客而做的各种奇葩演出…… 这些是我平时想看却又看不到的。我很想去山里找个农家院住半个月,去秦岭山里走走,夏天去地里帮农民割麦子。我很怀念小时候我们把收来的谷子放在一个大木缸里面使劲摔,把谷粒打出来。我居然能在快手上找到这样的视频!还有,一些厂妹在晒她们在工厂里的生活。那一排排的机器,也是我从来没见过的。

同时,快手又是一家很低调的技术公司。该公司招人的bar很高,能人不少。可以明显看出它的视频个性化推荐做的很不错,绝对是国内领先地位。但是却鲜有见他们在各种技术大会上招摇。

不过快手的直播真是太差劲了。我看见的全是美女秀场。一口浓浓的东北腔,不停的在说“谢谢xxx送的****"。没什么才艺,没什么内容,就是干巴巴的在不停招呼客人。实在是没兴趣。

另一方面,快手的内容还是太偏PGC。能进入我的feed流的,基本都是有几十万或上百万粉丝的专业号。内容太集中,太单调。


ACK, SACK, D-SACK

In an ACK, the Acknowledgment Number field indicates the number for the next byte in the contiguous byte stream that the ACK’s sender expects to receive。

SACK(RFC 2018): SACK包含多个块,每个块里是已收到的。

通常来说  ACK < SLE1 < SRE1 < SLE2 < SRE2 ...

ACK是我下一个想要的,[SLE1, SRE1],[SLE2, SRE2]是我已经收到的。


D-SACK(rfc2883): 这种是SLE1<ACK的情形

例如:
Transmitted    Received    ACK Sent
Segment        Segment     (Including SACK Blocks)

3000-3499      3000-3499   3500 (ACK dropped)
3500-3999      3500-3999   4000 (ACK dropped)
3000-3499      3000-3499   4000, SACK=3000-3500

OS:Windows Server 2008 and Windows Vista, Linux 2.4+

Fast retransmit: 连续收到多个重复的ACK。

TODO: RFC 3517