"Lane User Stack Overflow"调试 CUDA 程序

"Lane User Stack Overflow" debugging CUDA program

本文关键字:CUDA 程序 调试 Stack Lane User Overflow      更新时间:2023-10-16

我正在使用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 * 1024),其中I和j分别为311和808

CUDA-gdb手册说:

CUDA_EXCEPTION_2: " Lane User Stack Overflow "

当线程超过其堆栈内存限制时发生。

对于什么是lane的解释,CUDA-gdb手册说:

设备线程属于一个块,而这个块又属于一个内核。线程、块和内核是焦点的软件坐标。一个设备线程在通道上运行。一条小巷属于一条经线,经线属于到一个SM,而SM又属于一个设备。车道,经线,SM,还有设备是硬件坐标的焦点。软件和硬件坐标可以互换使用,也可以同时作为只要它们保持一致。

CUDA-gdb手册有更多关于从lane中获取信息的信息。对于这个错误,您超出了AJG85所说的最大堆栈内存限制。

堆栈溢出可能由多种因素引起。一般来说,它的意思就是它所说的。调用堆栈上的内存量是有限的,而您已经超出了它。可能导致这种情况的一些常见错误是深度递归和无限循环,当你在堆栈上调用太多时,会超过可用的内存。

这与out of rangeout of bounds异常不同,当您试图访问超出分配和可用对象的内存时,可能是由于索引超过了数组的末尾,如您在问题中所描述的。这里不是这样。

我不知道Lane User是什么,但我怀疑这是与CUDA相关的术语,你可能可以在nvidia网站的某个地方查找。为了得到更好的答案,您需要显示更多的周围代码,因为您所显示的内容不足以确定可能导致此错误的原因。