博文

异步执行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

想换个新路由器

我现在的路由器是netgear r6300v2,真的是太赞了。网上口碑甚好。这是我用的第一款基于ARM的路由器。但是我还是想换一个更好一点的。

于是在思索两种方案,一个是继续走ARM的路买一个r6300的升级版,另一个是选一个mini-itx无风扇的系统装Linux做软路由。

能提供WIFI解决方案的硬件厂商并不多。进入到802.11ac时代以后,大玩家就只剩下高通、Broadcom、Intel、Marvell、联发科、Quantenna、RealTek。

高通家的:
先说WiSoC。AC时代主要是IPQ4018/IPQ4019/IPQ402。Cortex A7,主频717 MHz,比如Google Wifi,netgear Orbi就采用了这系列。
AD时代主要是IPQ8072/IPQ8074,目前基本上还没有对应产品上市。
然后说纯CPU。主要是IPQ8062/IPQ8064/IPQ8065等等,这些只是处理器,用的是Krait处理器,全是ARMv7双核,主频1.0G-1.7G左右,和A15相仿。 代表作Netgear R7800和Google OnHub。

Broadcom:
Broadcom的WiSoC卖的不好,主要还是处理器和wifi芯片组分开卖。
处理器典型如Broadcom Northstar系列:
A9系列:BCM4707/BCM4708/BCM4709/...,比如著名的6300v2用的就是BCM4708A0,主频0.8 G,小米路由1用的是BCM4708A0,主频1G。这些基本都是基于Cortex A9。Northstar系列A53系列:如ASUS RT-AC86U、Netgear R8000P

联发科:
联发科的MT7620A/MT7620N WiSoC 可谓爆款中的爆款。比如小米路由3就是采用的它。缺点也蛮多,这款产品是MIPS的,不是ARM。而且不支持usb 3.0。

RealTek:
我发现他家的RTL8812BU是当前市面上唯一一个支持MU-MIMO的USB3.0 模块。意思是说,想买一个USB3.0的支持MU-MIMO的网卡,那么只能是他们家的。

再说x86这边。大部分低功耗的主板都只有一个网口,所以不适合做路由。高功耗的主板需要风扇,对我来说太吵了。我找来找去,非山寨的,就只有超微在做这样的产品。目前看中了E200-9B。E100…