这是一个相当不言自明的问题。附加一些背景信息。
如何在CUDA内核中检查malloc()
失败?我用Google搜索了一下,并没有发现malloc()
在CUDA实现中返回的内容。
此外,我不知道如何向主机发出信号,告知CUDA内核中存在错误。我怎么能这样做?
我认为一种方法是发送一个字符数组,每个内核线程一个元素,并让内核放置一个0x01
来表示错误,0x00
表示没有错误。然后主机可以复制这个内存并检查是否有非零字节?
但这似乎浪费了记忆力。有没有更好的办法?像cudaThrowError()之类的东西? ... 也许? ...
追加:
我遇到了一个cuda错误:GPUassert: the launch timed out and was terminated main.cu
如果你谷歌这个,你会找到Linux用户的信息(谁有混合图形解决方案) - 修复有时与optirun --no-xorg
一起运行。
但在我的情况下,这不起作用。
如果我为一个足够小的数据集运行我的程序,我没有错误。对于足够大的数据集,但不是太大,我必须通过传递--no-xorg
标志来防止超时错误。对于甚至更大的数据集,无论--no-xorg
标志如何,都会出现超时错误。
这暗示我可能还有别的东西出错了?
如果内存不足,我的内核中可能会发生malloc()
失败?
我已经检查了我的代码和估计的内存使用情况 - 我不会认为这是问题所在,但无论如何我想查看。
答案 0 :(得分:2)
如何在CUDA内核中检查malloc()失败?
behavior与主机上的malloc
相同。如果发生malloc故障,则返回的指针将为NULL。
因此在malloc之后检查NULL,并做一些事情来解决它:
#include <assert.h>
...
int *data
data = (int *)malloc(dsize*sizeof(int));
assert(data != NULL);
...rest of your code...
注意:
以这种方式在内核中使用assert
是合法的。如果断言被命中,则内核将暂停,并向主机返回错误,您可以使用proper cuda error checking或cuda-memcheck
来观察。这不是处理malloc故障的唯一可行方法,这只是一个建议。
这可能是您实际代码的问题,也可能不是。不过,这是一种很好的做法。