Exception cuda gdb:代码中没有指示的内核

Exception cuda gdb:代码中没有指示的内核,exception,pointers,cuda,cuda-gdb,Exception,Pointers,Cuda,Cuda Gdb,我最初的问题是,我的函数有一长串参数,超过了允许作为参数传递给cuda内核的内存(我不记得有多少字节,因为我已经有一段时间没有处理过了)。因此,我绕过这个问题的方法是定义一个新的结构,它的成员是指向其他结构的指针,我可以稍后从内核中取消引用这些结构 。。。这就是当前问题开始的地方:当我试图从内核中取消对指针(我先前创建的结构的成员)的引用时,我得到CUDA\u EXCEPTION\u 5,扭曲超出范围的地址 …来自cuda gdb。最重要的是,cuda gdb给出的内核名和参数(被报告为“此时不

我最初的问题是,我的函数有一长串参数,超过了允许作为参数传递给cuda内核的内存(我不记得有多少字节,因为我已经有一段时间没有处理过了)。因此,我绕过这个问题的方法是定义一个新的结构,它的成员是指向其他结构的指针,我可以稍后从内核中取消引用这些结构

。。。这就是当前问题开始的地方:当我试图从内核中取消对指针(我先前创建的结构的成员)的引用时,我得到
CUDA\u EXCEPTION\u 5,扭曲超出范围的地址
…来自cuda gdb。最重要的是,cuda gdb给出的内核名和参数(被报告为“此时不存在”的参数)并不是我在代码中创建的

现在,关于更多细节:

以下是涉及的结构:

typedef struct {

    int strx;
    int stry;
    int strz;
    float* el;

} manmat;

typedef struct {

    manmat *x;
    manmat *y;
    manmat *z;

} manmatvec;
下面是我如何将内核的参数分组到main中:

int main () {

...
...

    manmat resu0;
    resu0.strx = n+2;       resu0.stry = m+2;       resu0.strz = l+2;
    if (cudaMalloc((void**)&resu0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resu0" << endl ;
    manmat resv0;
    resv0.strx = n+2;       resv0.stry = m+2;       resv0.strz = l+2;
    if (cudaMalloc((void**)&resv0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resv0" << endl ;
    manmat resw0;
    resw0.strx = n+2;       resw0.stry = m+2;       resw0.strz = l+2;
    if (cudaMalloc((void**)&resw0.el,sizeof(float) * (n+2)*(m+2)*(l+2)) != cudaSuccess) cout << endl << " ERROR allocating memory for manmat resw0" << endl ;
    manmatvec residues0 ;

    residues0.x = &resu0;
    residues0.y = &resv0;
    residues0.z = &resw0;

    exec_res_std_2d <<<numBlocks2D, threadsPerBlock2D>>> (residues0, ......) ;

 .....
}
最后,这是cuda gdb作为输出给出的结果:

..................
[Launch of CUDA Kernel 1065 (exec_res_std_2d<<<(1,2,1),(32,16,1)>>>) on Device 0]
[Launch of CUDA Kernel 1066 (exec_res_bot_2d<<<(1,2,1),(32,16,1)>>>) on Device 0]

Program received signal CUDA_EXCEPTION_5, Warp Out-of-range Address.
[Switching focus to CUDA kernel 1065, grid 1066, block (0,0,0), thread (0,2,0), device 0, sm 0, warp 2, lane 0]
0x0000000003179020 in fdivide<<<(1,2,1),(32,16,1)>>> (a=warning: Variable is not live at this point. Value is undetermined.
..., pt=warning: Variable is not live at this point. Value is undetermined.
..., cells=warning: Variable is not live at this point. Value is undetermined.
...) at ola.cu:1626
1626    ola.cu: No such file or directory.
    in ola.cu
非常欢迎任何能帮助我解决这个问题的答案、提示或建议! 请注意,我最近才开始使用cuda-c编程,我对cuda gdb不是很有经验。我在c代码中进行的大多数调试都是通过检查代码各个点的输出来“手动”完成的


此外,此代码在特斯拉M2090上运行,并且也编译为在2.0体系结构上运行。

这将是一个问题:

manmatvec residues0 ;

    residues0.x = &resu0;
    residues0.y = &resv0;
    residues0.z = &resw0;
resu0
resv0
resw0
变量分配在主机堆栈上的主机内存中。您将主机地址放入manmatvec结构,然后将manmatvec传递到内核中。在接收端,CUDA代码无法访问结构中提供的主机内存地址

如果要传递
resu0
resv0
resw0
变量的地址,则需要从设备内存中分配它们


我不知道这是否是整个问题的症结所在,但我很确定这是一个最大的问题。

我理解你的论点,你是对的,这些都是在主机端分配的。但它们存在的全部意义在于我使用它们访问和操作设备端的内存(指针成员指向设备内存)因此,我想我的下一个问题是,我如何从设备端分配它们,并将它们放在全局内存中,以便其他内核可以使用它们…?再次感谢您的响应不仅仅是在主机端分配的。剩余变量驻留在主机内存中。设备无法访问主机内存。这就是为什么您在第1626行-设备试图取消引用包含主机内存地址的指针。您需要在主机端的设备内存中分配剩余变量。这使得在主机端设置它们的值更加困难。(1)计算设备内存的大小3*(sizeof(manmat)+(sizeof(float)*((n+2)+(m+3)+(l+2)))。注意:我不知道为什么在这个计算中使用“*”。(2)malloc是一块主机内存,cudaMalloc是一块设备内存。(3)为每个子内存分配将主机指针强制转换为,并填充值。在设置manmat.el字段时,使用deviceptr(而不是主机指针)。(4)从主机到设备的cudaMemcpy。(5)用deviceptrs填写manmatvec。如果您的大小计算为(n+m+l+6)*4,且总和小于4K,则可以通过参数传递所有这些。
[New Thread 0x7ffff3b69700 (LWP 12465)]
[Context Create of context 0x1292340 on Device 0]
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.1619c10.o.LkkWns
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.1940ad0.o.aHtC7W
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2745680.o.bVXEWl
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2c438b0.o.cgUqiP
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2c43980.o.4diaQ4
warning: no loadable sections found in added symbol-file /tmp/cuda-dbg/12456/session1/elf.1292340.2dc9380.o.YYJAr5
manmatvec residues0 ;

    residues0.x = &resu0;
    residues0.y = &resv0;
    residues0.z = &resw0;