用户
 找回密码
 立即注册
godsappoint 该用户已被删除
发表于 2013-10-7 09:05:34
101802
谁能给我解释一下cudaGetLastError()和cudaGetErrorString()是怎么调用的,在什么时候调用,原理是什么:

谢谢!!
还有通过在内核函数内printf信息和宏来处理错误是什么意思啊
使用道具 举报 回复
发表于 2013-10-8 09:24:30
LZ您好:

1:简单地说,cudaGetLastError()可以得到当前或者之前可能出错的记录,并通过返回值得到错误信息的枚举值。配合cudaGetErrorString()可以得到该错误枚举值所对应的说明字符串,您可以将该字符串打印出来查看。

2:稍微详细一点说,实际上检查出错有两种方法,一种是前面说的cudaGetLastError()的方法,另外一种是对于同步返回的函数,直接通过一个cudaError_t类型的变量接收其返回值并检查;对于异步返回的函数(如kernel函数)在函数后面添加cudaDeviceSynchronize()函数,并检查cudaDeviceSynchronize()的返回值。
这两种方法,前面一种方法略简便,但是因为其有一个内部的对错误信息的缓冲机制,所以可能会引起一些混淆;后者略繁杂,但是每一步比较清晰。您可以酌情选择。

3:关于cudaGetLastError()的其他详细讨论,请参阅如下讨论帖:
http://cudazone.nvidia.cn/forum/ ... p;extra=&page=1
http://cudazone.nvidia.cn/forum/ ... thread&tid=6798
http://cudazone.nvidia.cn/forum/ ... thread&tid=6426

祝您调试顺利~
使用道具 举报 回复 支持 反对
发表于 2013-10-8 09:31:51
关于您的第二个问题:

从计算能力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。

至于您说的“宏”的情况,请您补充相关问题描述。

大致如此,祝您好运~
使用道具 举报 回复 支持 反对
发新帖
您需要登录后才可以回帖 登录 | 立即注册