救命!使用太多内存后,CUDA内核将不再启动

时间:2011-04-27 06:18:34

标签: cuda

我正在编写一个需要以下内核启动的程序:

dim3 blocks(16,16,16); //grid dimensions
dim3 threads(32,32); //block dimensions
get_gaussian_responses<<<blocks,threads>>>(pDeviceIntegral,itgStepSize,pScaleSpace);

我忘了在程序结束时释放pScaleSpace数组,然后通过CUDA分析器运行程序,它连续运行15次,耗费大量内存/导致大量碎片。现在每当我运行程序时,内核甚至都没有启动。如果我查看分析器记录的函数调用列表,那么内核就不存在了。我意识到这是一个非常愚蠢的错误,但我不知道在这一点上我能做些什么来让程序再次运行。我已重新启动计算机,但这没有帮助。如果我减小内核的尺寸,它运行正常,但当前尺寸在我卡的允许最大值范围内。

Max threads per block: 1024
Max grid dimensions: 65535,65535,65535

任何建议都表示赞赏,提前谢谢!

3 个答案:

答案 0 :(得分:1)

尝试使用较少数量的线程启动。如果可行,则意味着每个线程都在做大量工作或使用大量内存。因此,CUDA可能无法在您的硬件上实际启动最大可能的线程数。

您可能必须提高CUDA代码的效率才能启动更多线程。如果内核中有复杂的逻辑,你可以尝试将内核切成小块。或者获得更强大的硬件。

答案 1 :(得分:1)

如果您编译代码如下:

nvcc -Xptxas="-v" [other compiler options]

汇编程序将报告代码所需的本地堆内存数。这可以是一个有用的诊断,以查看内核的内存占用量。还有一个API调用cudaThreadSetLimit,可用于控制内核在执行期间尝试使用的每线程堆内存量。

最近的工具包附带了一个名为cuda-memchk的实用程序,它提供类似于内核内存访问的valgrind分析,包括缓冲区溢出和非法内存使用。可能是你的代码在某处溢出了一些内存并覆盖了GPU内存的其他部分,使得卡处于危险状态。

答案 2 :(得分:1)

我明白了! nVidia NSight 2.0 - 据称支持CUDA 4 - 改变了我的CUDA_INC_PATH以使用CUDA 3.2。难怪它不会让我为每个块分配1024个线程。考虑到我已经安装了CUDA 4.0 RC2,这是一个非常愚蠢和烦人的错误。