caffe 支持 CUDA Dynamic Parallelism

CUDA从3.5开始就支持了动态并行,就是支持GPU线程再直接启动一组子计算线程,而在这个之前GPU计算线程都是由CPU线程启动的。
为了支持这个动态并行特性,需要链接 cudadevrt 库。

不过,caffe 始终没有应用这个CUDA特性。 我自己fork了一个分支启用了该特性 支持动态并行的caffe实现
为了启用该特性,还更改了cuda代码的编译链接过程,原来都是每个cu文件直出可链接的目标文件。这个分支时每个cu文件都先 device-c 到一个目标文件,再把所有的cu的目标文件 dlink 到一个可链接的目标文件。
启用这个特性的所有修改都在 Makefile 中,我定义了一个 CUDA_DYNAMIC_PARALLEL 标识控制是否启用, 在 Makefile.config 中定义 CUDA_DYNAMIC_PARALLEL := 1 即可启用。启用后也传递了一个 CUDA_DYNAMIC_PARALLEL 预定义变量到编译器以方便代码中据此控制区分下代码。

启用后即可在cuda代码中享用动态并行特性了。

至于能不能显著提高计算速度?对原有的层没有影响,这是要修改代码的啊,可能原有的部分层会受益于此功能,我没检查。对于新增层的话,如果层计算逻辑可以包含用GPU计算线程新起计算线程的话,就可受益,毕竟不必在绕回到CPU线程由CPU线程来启动下一轮GPU线程。

ubuntu获取网卡IP和MAC地址

ip addr | grep link/ether | awk '{print $2}'
ip=`ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'`
mac=`ifconfig | grep HWaddr | awk -F" " '{print $5}'`
/sys/class/net/eth0/address
# lshw可以获取很多硬件信息哦
lshw -class network
# 获取网卡名称
ip -o -4 route show to default | awk '{print $5}'

问题1,环回lo和虚拟网卡要不要
docker或者别的虚拟网卡存在,看您需要不需要避免获取到虚拟网卡的。

问题2,网卡命名的问题
之前一般被系统命名为eth0,现在改别的命名规则了。看要不要把网卡名称写死了,还是要求自动获取网卡名。

问题3,多网卡
这个问题一般不重要,一般也就不用指定特定网卡,只要是真实网络接口即可。若只需要一个,awk里打印完一个立即 exit 即可。

那这段代码有什么用呢?
比如自动设置机器名称为与MAC地址有关的名字避免克隆系统名称冲突,就可以写个服务启动后立即修改下机器名 hostname,更改机器名称为MAC有关