**这是本文档旧的修订版!**
编译并行计算基准测试工具shoc踩坑记
roofline
今天新学到了一个测试GPU等并行计算架构算法效率的模型:roofline
我对此模型的理解基本上就是首先测试出设备在各种计算/访存比下的极限性能,然后将自己的算法与之对比,以判断还有没有改进的空间,画成图大概是这样的:
图中线条是极限性能(还没搞明白黑线红线是什么区别),各种点是文章中出现的CUDA kernel
。点的位置越靠近线越说明达到了极限性能。
shoc
自己做测试还是麻烦。有一个做好了的开源基准测试工具shoc。然而由于代码老旧,编译踩了一些坑,记录如下:
编译环境
- manjaro linux 20170606
- 默认编译器指向gcc 6.3.1,以便跟系统软件匹配,然而这个编译shoc时是用不到的
- gcc-4.9.3,装它就是为了给cuda 8用
- cuda 8.0
- GT750M显卡
坑们
- nvcc一定要出现在
PATH
中。由于平时编译CUDA程序都用CMake
或者nsight
,不会手写nvcc命令,所以注意不到这东西不在PATH
中。如果PATH
中找不到nvcc命令,shoc的configure脚本不会报错,但是会自动屏蔽cuda代码; - 修改
configure
脚本,删去-gencode=arch=compute_13,code=sm_13
等老旧设备相关代码,加入符合自己硬件的架构(这一点nvcc做的相当不智能)。cuda 8 碰到这些老旧硬件的命令会直接报错。 - 有cuda 8在那里堵着,全套东西都要用gcc-4.9编译。修改环境变量
CC
,CXX
:export CXX=/usr/bin/g++-4.9
,export CC=/usr/bin/gcc-4.9
- 此时虽然
make
命令会按照修改过的环境变量调用gcc-4.9,但nvcc
仍然会顺着系统链接去找gcc-6.3,解决方法是继续修改configure
脚本,在刚才删去compute_13
的地方,加上-ccbin=/usr/bin/gcc-4.9
,指定nvcc要编译C
代码的话去找gcc-4.9
; 此处安利一波CMake
,如果设置了自定义编译器,CMake
会自己处理好nvcc
命令; - 如果你向我一样折腾了半天gcc版本问题,终于做完这一切再
make
时发现出了一堆关于c++11
、string
相关的链接错误,说明之前不小心用gcc-6.3
编译的东西还在,make clean
然后重来即可; - 其他步骤按
configure --help
和INSTALL.txt
执行。