cuda-memcheck正在为发布模式CUDA内核报告此信息:
========= Error: process didn't terminate successfully
========= Invalid __global__ read of size 4
========= at 0x000002c8 in xx_kernel
========= by thread (0,0,0) in block (0,0)
========= Address 0x10101600014 is out of bounds
=========
========= ERROR SUMMARY: 1 error
此故障仅在发布模式下发生。在cuda-gdb下运行时也不会发生这种情况。
如何获取0x000002c8地址并确定导致错误的代码?我查看了缓存的中间文件(.ptx,.cubin等)并没有看到明确的方法来确定错误的源代码。
这是在带有CUDA 3.2的x86_64 Linux上。
更新:原来这是3.2中的编译器错误。升级到4.0会使memcheck错误消失。此外,我能够使用4.0版的cuobjdump来反汇编CUBIN,但由于它是发布模式并进行了优化,因此将反汇编与源代码相匹配非常困难。
答案 0 :(得分:7)
下载CUDA Toolkit 4.0 from the NVIDIA Developer Zone。使用支持2.x cubins的新cuobjdump
。
cuobjdump -sass /path/to/your/cubin > /path/to/dump.txt
。
示例输出(在sm_20 cubin上测试,代码版本2.3)
...
/*6018*/ /*0xe00100075003ff9a*/ CAL 0x46d8;
/*6020*/ /*0x10001de428000000*/ MOV R0, R4;
/*6028*/ /*0x00001de428000000*/ MOV R0, R0;
/*6030*/ /*0x40011de428000000*/ MOV R4, R16;
...
答案 1 :(得分:4)
内核中的这种错误与内存访问有关,而内存访问不仅基于线程标识符。
考虑到您使用的每个内存区域已正确分配给GPU ,只需 threadIdx.x 等基于 的访问权限引起任何问题。因此:
data[blockDim.y * blockDim.x * threadIdx.z + blockDim.x * threadIdx.y + threadIdx.x]
这样的表达式很常见)data[threadIdx.x + offset]
) ---- 编辑(以下评论) ----
请参阅@ Cicada关于设备的cuobjdump补充的答案> 2.X