今天新学到了一个测试GPU等并行计算架构算法效率的模型:roofline
我对此模型的理解基本上就是首先测试出设备在各种计算/访存比下的极限性能,然后将自己的算法与之对比,以判断还有没有改进的空间,画成图大概是这样的:
图中线条是极限性能(还没搞明白黑线红线是什么区别),各种点是文章中出现的CUDA kernel
。点的位置越靠近线越说明达到了极限性能。
自己做测试还是麻烦。有一个做好了的开源基准测试工具shoc。然而由于代码老旧,编译踩了一些坑,记录如下:
PATH
中。由于平时编译CUDA程序都用CMake
或者nsight
,不会手写nvcc命令,所以注意不到这东西不在PATH
中。如果PATH
中找不到nvcc命令,shoc的configure脚本不会报错,但是会自动屏蔽cuda代码;
configure
脚本,删去-gencode=arch=compute_13,code=sm_13
等老旧设备相关代码,加入符合自己硬件的架构(这一点nvcc做的相当不智能)。cuda 8 碰到这些老旧硬件的命令会直接报错。
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
命令;make
时发现出了一堆关于c++11
、string
相关的链接错误,说明之前不小心用gcc-6.3
编译的东西还在,make clean
然后重来即可;configure --help
和INSTALL.txt
执行。