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