Debugging 调试时出现共享内存问题

Debugging 调试时出现共享内存问题,debugging,cuda,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(); } \uuuuu设备\uuuuuu无效更改(int共享[]) { 如

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

__device__ void change(int shared[])
{
    if(threadIdx.x<10)
        shared[threadIdx.x]=threadIdx.x;
}
__global__ void MyK()
{
    int shared[10]; 
    change(shared);
    __syncthreads();
}
\uuuuu设备\uuuuuu无效更改(int共享[])
{

如果(threadIdx.x是实际代码还是从缓冲区声明中省略了u

还请记住uu u设备u u u函数由编译器内联,并且 调试器只能在整个过程中的某个点停止。 尝试使用至少16或32个线程的多线程内核,否则您将无法运行
SP已满,这可能会欺骗调试器。

对某些线程(而不是所有线程)调用
\u syncthreads()
会导致死锁。
threadIdx.x<10
调用
\u syncthreads()
如前所述,此处不使用共享内存。 如果在内存位置无效之后不使用该值,编译器是聪明的。
尝试输出该值作为设备函数的返回值。应该可以正常工作,尤其是当您移动/删除
\uu syncthreads()
时,您会看到“无法解析共享名称”的原因内存监视窗口中的错误是因为编译器正在优化共享数组,因为在更改(共享)后,内核的任何部分都没有使用它。与前面提到的user586831一样,请尝试输出该值作为设备函数的返回值


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

这看起来不像C标签删除。@ PMG也不是C++。它完全是CUDA。在这个例子中,你根本没有使用共享内存。你可能想改变标题。
cudaSetDevice(1);
MyK<<<1,20>>>();