CUDA编程注意事项(一)


 这段时间负责使用CUDA优化LBP算法,因为刚开始学习使用CUDA,所以走了很多弯路,挖了很多坑,现在对在这段时间学习到的经验进行总结,以备后续开发时参考。至于CUDA优化LBP部分,因为还没有确定不采用,所以还不敢发到网上,或许过段时间会写个blog介绍一下思路。

注意下载的CUDA版本与驱动版本相符

 如果版本不符,你运行cuda程序的时候,会报找不到GPU的错误(好像时这么个错,记不太清了)。驱动版本在cmd中使用nvidia-smi查看,如下图可以看到我的驱动版本是441.22。CUDA编程注意事项(一)
和驱动版本对应的CUDA版本如下图,或者请查验 CUDA文档
CUDA编程注意事项(一)

关于CUDA报错

 CUDA报错不像C或者C++那样精确且及时。在第1000行报的错,问题可能出在500行。再比如函数A先后调用函数B和函数C,如果函数C的位置报错,那真正出现问题的可能是B。所以当某一变量或者函数出错时,不仅仅应检查当前位置,也应检查之前相关的内容。
 另外CUDA是不会主动报错的,应主动使用*cudaGetLastError()函数捕获错误,然后使用cudaGetErrorString(cudaError_t cudaErrorCode)*对错误进行描述。

应进行充分的单元测试

 CUDA不像Python没有try{}except{}语句,发生异常无法跳过。而且在运行时,如果一个线程出现问题,被同一kernel函数启动的其它所有线程也会被终止。甚至在本次开发中常常出现一个线程出现问题进而导致kernel函数被终止,进而后续所有的kernel函数被终止的情况。
 在进行开发时,应对尽可能糟糕的情况,尽可能大的数据量进行测试,以保证程序的正确性。

GPU上进行的操作应尽可能简单

 这个要统筹考虑,如果要效率高,那就应该把并行的操作尽可能的安排到GPU上进行,但那样有会有一些莫名其妙的报错(真的莫名其妙,无法理解)。