谁能给我解释一下cudaGetLastError()和cudaGetErrorString()是怎么调用的,在什么时候调用,原理是什么:
谢谢!!
还有通过在内核函数内printf信息和宏来处理错误是什么意思啊
谁能给我解释一下cudaGetLastError()和cudaGetErrorString()是怎么调用的,在什么时候调用,原理是什么:
谢谢!!
还有通过在内核函数内printf信息和宏来处理错误是什么意思啊
LZ您好:
1:简单地说,cudaGetLastError()可以得到当前或者之前可能出错的记录,并通过返回值得到错误信息的枚举值。配合cudaGetErrorString()可以得到该错误枚举值所对应的说明字符串,您可以将该字符串打印出来查看。
2:稍微详细一点说,实际上检查出错有两种方法,一种是前面说的cudaGetLastError()的方法,另外一种是对于同步返回的函数,直接通过一个cudaError_t类型的变量接收其返回值并检查;对于异步返回的函数(如kernel函数)在函数后面添加cudaDeviceSynchronize()函数,并检查cudaDeviceSynchronize()的返回值。
这两种方法,前面一种方法略简便,但是因为其有一个内部的对错误信息的缓冲机制,所以可能会引起一些混淆;后者略繁杂,但是每一步比较清晰。您可以酌情选择。
3:关于cudaGetLastError()的其他详细讨论,请参阅如下讨论帖:
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6514&extra=&page=1
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6798
http://cudazone.nvidia.cn/forum/forum.php?mod=viewthread&tid=6426
祝您调试顺利~
关于您的第二个问题:
从计算能力2.0的GPU开始,支持在kernel内使用printf()函数,您可以通过在kenrel内printf()输出一些信息来检验您的代码运行情况,有没有BUG等。
需要说明的是:
1:各个线程的printf顺序是不被保证的,也就是说,这个是乱序的。
2:您需要在整个程序结束之前添加适当的同步,以保证printf()的正确输出。如在main()函数return之前添加cudaDeviceReset()。
3:您可以使用kernel内部的printf()作为您调试的一个辅助手段,但是推荐您将nsight等调试工具作为主力手段。在某些情况下,即便printf()看上去输出的正确的,您的kernel也可能运行不正确乃至已经挂掉。
4:您的代码在编译的时候,需要指定合适的编译参数。如果按照1.x计算能力编译,将无法在kernel中使用printf。
至于您说的“宏”的情况,请您补充相关问题描述。
大致如此,祝您好运~