本文不谈CUDA优化,只谈如何正确写出CUDA程序,先写对,再说优化。最近写CUDA程序也是断断续续的,经常程序写完了需要很长的时间调试,各种错误,调试的方法也是简单的printf(),目前没找到更好的调试方法,如果有更好的办法的化希望告知。
昨天总结了下为什么写的CUDA程序总是出错(就先别说优化呢?写对再再谈别的吧),总结出一些心得和经验(算是经验)吧,结合例子看吧。
首先谈谈调试方法吧,目前我遇到的主要是两种错误:内存错误和逻辑错误,其他错误。
其他错误
对于其他错误,一般加上错误处理即可,错误处理见CUDA编程的错误处理
这样便于快速定位,不加的话出错误了定位更难受。
内存错误
目前对于内存错误,编译的时候加入下面选项
-ftz=true -Xcompiler -rdynamic -lineinfo
运行的前可以先用cuda-memcheck检查下
cuda-memcheck a.out
如果有内存错误,会输出报告,告知你哪一行访问了非法内存,往往问题是出在kernel里,这样就可以快速定位到行,进行排错了。cuda-memcheck还有其他很多功能,目前我就用到这个,其他的等需要的时候再说吧。
逻辑错误
确定好没有内存错误,没有其他错误后,发现结果不对,这也是最头疼的地方,目前为止一直用的printf打印方法来进行观察,没用过cuda-gdb,也在网上搜索了很多关于CUDA的调试方法,也没有个好的结果,用cuda-gdb一是感觉还得学cuda-gdb的使用,而是使用起来也不是那么方便(没有细看cuda-gdb的用法,有兴趣的可以看看),这里对于printf方法,也是摸索出一些方法。首先写程序的时候这样写CUDA Pro Tip:Write Flexible Kernels with Grid-Stride Loops,这样是为了用printf调试方便。用printf调试的时候,把block数和thread数都设置为1,就可以很好的用printf进行调试了。用printf的时候也可以一个功能一个功能(一段代码一段代码)的进行打印,这样来进行定位。
自己总结的一些小经验,有更好的方法,希望大家指出。
如何写出正确的CUDA程序
每次写完CUDA程序后总是各种错误,然后拍错会花很长的时间,好吧,我承认是自己太笨的原因。总结出一些小方法(大神勿喷)
先看一个例子,矩阵*向量,看看调试方法以及自己的思考
kernel1(错误)
__global__ void MxvBlock(const float *h_a, const float *h_b,