CUDA memcheck地址 - 如何确定代码中的位置?

时间:2011-06-23 04:02:28

标签: cuda gpgpu gpu-programming

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,但由于它是发布模式并进行了优化,因此将反汇编与源代码相匹配非常困难。

2 个答案:

答案 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