如何在CUDA内核中检查malloc()失败?

时间:2015-10-25 15:39:22

标签: linux cuda

这是一个相当不言自明的问题。附加一些背景信息。

如何在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()失败?

我已经检查了我的代码和估计的内存使用情况 - 我不会认为这是问题所在,但无论如何我想查看。

1 个答案:

答案 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...

注意:

  1. 以这种方式在内核中使用assert是合法的。如果断言被命中,则内核将暂停,并向主机返回错误,您可以使用proper cuda error checkingcuda-memcheck来观察。这不是处理malloc故障的唯一可行方法,这只是一个建议。

  2. 这可能是您实际代码的问题,也可能不是。不过,这是一种很好的做法。