CUDA共享内存不是在调试时阻止的

时间:2013-04-02 20:31:10

标签: cuda shared-memory nsight

基本上,我很难理解这里到底出了什么问题。

在调试时,共享内存似乎不以块独占方式运行。正常运行代码时,不会打印任何内容。但是,如果我尝试调试它,则在块之间共享共享内存并到达print语句。

这是一个例子,显然这不是非常有用的代码,但它在我的系统上重现了这个问题。难道我做错了什么?这是调试器中的错误或预期行为吗?

__global__ 
void test()
{
    __shared__ int result[1];
    if (blockIdx.x == 0 && blockIdx.y == 0 && blockIdx.z == 0)
        result[0] = 4444;
    else
    {
        if (result[0] == 4444)
            printf("This should never print if shared memory is unique\n");
    }
}

启动它:

test<<<dim3(8,8,1), dim3(8,8,1)>>>();

完全有可能我完全误解了共享内存。

感谢您的帮助。

其他信息: 我使用的是GTX 460.为项目设置了Compute_20和sm_20。我正在使用nsight 3.0预览版在Visual Studio 2010中编写代码。

1 个答案:

答案 0 :(得分:6)

之间存在微妙但重要的区别
  

共享内存在块之间共享,print语句是   达到

  

共享内存由连续块重复使用,print语句为   达到

你假设前者,但后者才是真正发生的事情。

您的代码(第一个块除外)是从未初始化的内存中读取。这本身就是未定义的行为。 C ++(和CUDA)不保证静态声明的内存在进入或超出范围时设置为任何值。您不能指望result的值不会为4444,尤其是当它可能存储在与之前的块相同的共享暂存空间中时,可能已将其设置为值4444。

代码和这个问题的整个前提是有缺陷的,你应该从结果中得出结论,你看到其他未定义的行为是未定义的。