救命啊!CUDA内核在使用过多内存后将不再启动

救命啊!CUDA内核在使用过多内存后将不再启动,cuda,Cuda,我正在编写一个需要以下内核启动的程序: dim3 blocks(16,16,16); //grid dimensions dim3 threads(32,32); //block dimensions get_gaussian_responses<<<blocks,threads>>>(pDeviceIntegral,itgStepSize,pScaleSpace); 感谢您的建议,谢谢 尝试用较少的线程数启动。如果这样做有效,则意味着每个线程都在做大量工作

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

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

感谢您的建议,谢谢

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


您可能需要提高CUDA代码的效率,才能启动更多线程。如果内核内部有复杂的逻辑,您可以尝试将内核分割成更小的部分。或者使用更强大的硬件。

尝试使用更少的线程启动。如果这样做有效,则意味着每个线程都在做大量工作或使用大量内存。因此,CUDA无法在硬件上实际启动尽可能多的线程


您可能需要提高CUDA代码的效率,才能启动更多线程。如果内核内部有复杂的逻辑,您可以尝试将内核分割成更小的部分。或者获得更强大的硬件。

如果您像这样编译代码:

nvcc -Xptxas="-v" [other compiler options]
汇编程序将报告代码所需的本地堆内存数量。这是查看内核内存占用情况的有用诊断。还有一个API调用,可用于控制内核在执行期间尝试和消耗的每线程堆内存量


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

如果您这样编译代码:

nvcc -Xptxas="-v" [other compiler options]
汇编程序将报告代码所需的本地堆内存数量。这是查看内核内存占用情况的有用诊断。还有一个API调用,可用于控制内核在执行期间尝试和消耗的每线程堆内存量



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

我明白了!nVidia NSight 2.0——据说它支持CUDA 4——将我的CUDA_INC_路径更改为使用CUDA 3.2。难怪它不允许我为每个块分配1024个线程。抛开所有的安慰和喜悦不谈,考虑到我已经安装了CUDA 4.0 RC2,这真是一个愚蠢而恼人的错误。

我明白了!nVidia NSight 2.0——据说它支持CUDA 4——将我的CUDA_INC_路径更改为使用CUDA 3.2。难怪它不允许我为每个块分配1024个线程。抛开所有的安慰和喜悦不谈,考虑到我已经安装了CUDA 4.0 RC2,这是一个非常愚蠢和恼人的错误。

请检查您的内核代码是否有任何错误。您也可以尝试使用cuda memcheck运行您的程序。另外,试着用较少的线程数启动内核,看看它是否有效。用较少的线程启动程序是有效的(16x16而不是32x32),但根据设备属性,我应该能够使用1024个线程/块。谢谢你的建议,我会去检查我的代码是否有错误。卡洛斯:很高兴它成功了,请看我下面的回复。你在使用cuda 4.0吗?由于旧版本中不允许使用三维网格(块(16,16,16)),请检查内核代码中是否有任何错误。您也可以尝试使用cuda memcheck运行您的程序。另外,试着用较少的线程数启动内核,看看它是否有效。用较少的线程启动程序是有效的(16x16而不是32x32),但根据设备属性,我应该能够使用1024个线程/块。谢谢你的建议,我会去检查我的代码是否有错误。卡洛斯:很高兴它成功了,请看我下面的回复。你在使用cuda 4.0吗?因为旧版本中不允许使用三维网格(块(16,16,16)),我想我应该更清楚一点。代码在这么多线程中工作得非常好,然后突然停止工作。我没有更改内核代码或内核启动参数中的任何内容。请尝试我的cuda memchk建议。您的代码可能存在未诊断的缓冲区溢出。Fermi硬件具有良好的片上内存保护,但在全局内存中仍有大量空间进行有害的缓冲区溢出。感谢您,我尝试使用cuda memcheck并获得以下结果:“============错误摘要:0个错误”。我想我会继续找的我想我应该更清楚一点。代码在这么多线程中工作得非常好,然后突然停止工作。我没有更改内核代码或内核启动参数中的任何内容。请尝试我的cuda memchk建议。您的代码可能存在未诊断的缓冲区溢出。Fermi硬件具有良好的片上内存保护,但在全局内存中仍有大量空间进行有害的缓冲区溢出。感谢您,我尝试使用cuda memcheck并获得以下结果:“============错误摘要:0个错误”。我想我会继续找的我想我应该更清楚一点。代码在这么多线程中工作得非常好,然后突然停止工作。我没有改变内核代码或内核启动参数中的任何内容。他们似乎工作得很好,然后就停止工作了:-)我想我应该更清楚一点。代码在这么多线程中工作得非常好,然后突然停止工作。我没有改变内核代码或内核启动参数中的任何内容。他们似乎工作得很好,然后就停止工作了:-)