我正在尝试使用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()之后;我在调试器中得到“无法解析名称共享”。
我不能将共享数组传递给另一个设备函数吗?
答案 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()
时。