我正在使用Totalview尝试调试CUDA内核。我选择了在CUDA中调试内存错误的选项,并停止主机上的内存错误。
我在这一行的某个内核中停止了:
d_test_filt[i*cols+j] = cuCmulf(cuCmulf(d_usKernel[i*cols + j],d_convolver[i*cols + j]),d_rr[i*cols + j]) ;
栏中的错误显示“Lane User Stack Overflow”
这个错误究竟意味着什么?我该如何解决这个问题?
在这种情况下,所有这些d_数组都已在设备上分配。 i * cols + j远小于数组的大小(1024 x 1024),其中i和j分别为311和808
答案 0 :(得分:3)
CUDA-gdb手册说:
CUDA_EXCEPTION_2:“车道用户堆栈溢出”
当线程超过其堆栈内存限制时会发生这种情况。
有关CUDA-gdb手册说明通道的说明:
设备线程属于一个块,而该块又属于一个内核。 线程,块和内核是焦点的软件坐标。一个 设备线程在一个通道上运行。车道属于经线,属于 到SM,而SM又属于设备。 Lane,warp,SM和 device是焦点的硬件坐标。软件和 硬件坐标可以互换使用,也可以同时使用 只要它们保持连贯。
CUDA-gdb手册提供了有关从车道等检索信息的更多信息。对于此错误,您超出了AJG85所说的最大堆栈内存限制。
答案 1 :(得分:1)
堆栈溢出可能是由许多因素引起的。通常它意味着它所说的。调用堆栈中的内存量有限,您已超出它。可能导致这种情况的一些常见错误是深度递归和无限循环,其中您在堆栈上有如此多的调用,超出了可用内存。
这与超出范围或越界异常不同,在这种情况下,您尝试访问的内存超出了可能导致的对象分配和可用的内存通过索引在问题中描述的数组末尾。不是这里的情况。
我不知道 Lane用户是什么,但我怀疑这是与CUDA相关的术语,你可以在nvidia网站的某个地方查找。您需要显示更多周围的代码以获得更好的答案,因为您显示的内容不足以识别可能导致此错误的原因。