调试时共享内存问题

时间:2011-06-16 18:23:56

标签: debugging cuda

我正在尝试使用Nsight来调试以下代码:

__device__ void change(int shared[])
{
    if(threadIdx.x<10)
        shared[threadIdx.x]=threadIdx.x;
}
__global__ void MyK()
{
    int shared[10]; 
    change(shared);
    __syncthreads();
}

我在主方法中调用我的内核,如下所示:

cudaSetDevice(1);
MyK<<<1,20>>>();

当我在更改(共享)之前放置一个断点时,我可以看到创建了共享数组并将其值设置为0。 当断点放在__syncthreads()之后;我在调试器中得到“无法解析名称共享”。

我不能将共享数组传递给另一个设备函数吗?

3 个答案:

答案 0 :(得分:1)

您在内存监视窗口中看到“无法解析共享名称”的原因是因为共享数组正在被编译器优化,因为更改后共享阵列的任何部分都没有使用它(共享) 。与前面提到的user586831一样,尝试输出该值作为设备函数的返回值。

另外请注意,不确定您是否真的是指“_ 共享 _”数组,还是通过名称“shared”引用该数组。无论如何,你在上面的代码中没有使用共享内存。 “int shared”只是一个普通的整数数组类型。您需要指定_ 共享 _限定符才能声明共享内存。对于例如extern _ shared _ int shared [10]

答案 1 :(得分:0)

这是实际代码还是你从缓冲区声明中省略了_ _ shared _ _?

还要记住_ _device _ _函数由编译器内联 调试器只能在整个过程中的某个时刻停止。 尝试使用至少16或32个线程的多个内核,否则您将无法运行 一个完整的SP,可能会欺骗调试器。

答案 2 :(得分:0)

为某些线程而不是所有线程调用__syncthreads()会导致死锁。 threadIdx.x < 10来电_syncthreads() 如前所述,您不在此处使用共享内存。 如果您之后没有使用该值,则编译器会很聪明,因此内存位置可能无效。 尝试输出该值作为设备功能的返回值。应该可以正常工作,尤其是移动/移除__syncthreads()时。