Cuda OutOfRangeStore异常,其中没有对数组进行超出范围的赋值

Cuda OutOfRangeStore异常,其中没有对数组进行超出范围的赋值,cuda,Cuda,能力3.5(GTX Titan)、CUDA 5、VS 2010和Nsignt。非图形应用程序 当达到某个块大小时,我将得到OutOfRangeStore异常,说明内存空间=全局大小=4 这适用于:块大小为4(及以下)的10000个线程或块大小为32的898个线程 这不起作用:块大小为5(及以上)的10000个线程或块大小为32的899个线程 在使用Nsight进行调试时,代码在我分配浮点数组的位置中断,例如float*x=new float[someSmallValue],上面和下面的行正在分配

能力3.5(GTX Titan)、CUDA 5、VS 2010和Nsignt。非图形应用程序

当达到某个块大小时,我将得到
OutOfRangeStore
异常,说明
内存空间=全局大小=4

这适用于:块大小为4(及以下)的10000个线程或块大小为32的898个线程

这不起作用:块大小为5(及以上)的10000个线程或块大小为32的899个线程

在使用Nsight进行调试时,代码在我分配浮点数组的位置中断,例如
float*x=new float[someSmallValue]
,上面和下面的行正在分配其他数组,因此没有分配到超出范围的变量。实际上,整个函数都是更新数组

如果我在函数中乱序数组的分配,我仍然会在相同的位置(函数的最后一行)得到错误

我的直觉是我在SM级别上达到了“某物”的最大值

您以前是否遇到过类似的问题,您能建议我去哪里查找吗?

我尝试了以下方法:

  • 分析,看看我是否在消耗全局内存,然而,虽然我能够分析事务和其他东西,但我无法分析程序执行的最大使用全局内存,我使用96个寄存器,0个共享内存。我正在关注“CUDA发布”部分
您建议在探查器中查找其他位置吗?

  • 我在编译时查看NVCC编译器输出,试图分析我的程序正在执行的操作,这是一段引文:
ptxas:info:u Z14DeletePointersP10DevSimTemp的函数属性 8字节堆栈帧、8字节溢出存储、8字节溢出加载ptxas:info:fabsf的函数属性 0字节堆栈帧,0字节溢出存储,0字节溢出加载ptxas:info:updateTimeStep的函数属性 24字节堆栈帧,20字节溢出存储,20字节溢出加载ptxas:info: _Z21COPYNEXTSTEPTORUNINGP10DEVSIMTEMPII 0字节堆栈帧,0字节溢出存储,0字节溢出加载ptxas:info: _Z21SendTimeStepStoreResultSPK19DevSimulationResultP10DevSimTempii 0字节堆栈帧,0字节溢出存储,0字节溢出加载ptxas:info: _Z26更新LCSResultSPK19DEVSIMulationResultP10DEVSIMTEMPIPFPIFIIS4_ 64字节堆栈帧,60字节溢出存储,60字节溢出加载
泄漏会导致错误吗?从bug搜索的角度来看(而不是从性能的角度来看)这有用吗?

也许堆空间已经用完了。默认情况下,只有一小部分堆空间可用。您可以通过以下方式查看您拥有多少:

size_t heap_size;
cudaDeviceGetLimit(&heap_size, cudaLimitMallocHeapSize);

并使用相应的
cudaDeviceSetLimit()
调用调整该值。

这就是问题所在!我把堆的大小增加了一倍。
size_t heap_size;
cudaDeviceGetLimit(&heap_size, cudaLimitMallocHeapSize);