Gur*_*rgg 3 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");
}
}
Run Code Online (Sandbox Code Playgroud)
并推出它:
test<<<dim3(8,8,1), dim3(8,8,1)>>>();
Run Code Online (Sandbox Code Playgroud)
完全有可能我完全误解了共享内存.
谢谢您的帮助.
其他信息: 我使用的是GTX 460.为项目设置了Compute_20和sm_20.我正在使用nsight 3.0预览在Visual Studio 2010中编写代码.
两者之间存在微妙但重要的区别
块之间共享共享内存,并且到达print语句
和
连续块重用共享内存并到达打印语句
你假设前者,但后者才是真正发生的事情.
除第一个块外,您的代码是从未初始化的内存中读取的.这本身就是未定义的行为.C++(和CUDA)不保证静态声明的内存在进入或超出范围时设置为任何值.您不能指望result不会有4444的值,特别是当它可能存储在与之前的块相同的共享暂存空间中时,可能已将其设置为值4444.
代码和这个问题的整个前提是有缺陷的,你应该从结果中得出结论,你看到其他未定义的行为是未定义的.
| 归档时间: |
|
| 查看次数: |
124 次 |
| 最近记录: |