CUDA:在2D阵列上使用volatile时出错

时间:2011-07-14 19:04:55

标签: cuda

我在Turning off coalescing中遇到了这个帖子Nvidia Forum,其中声称“到目前为止,将内存指针/数组设置为”volatile“似乎有助于大规模随机访问。(增加50%以上)表现?!)“。

我正在使用CUDA在GPU(Fermi)上进行有限差分计算(3D Stencil Computation),并希望提高计算性能。由于访问3D阵列的z轴是随机的(3D阵列在Z,Y,X从慢到快放置),我觉得使用volatile是一个更好的选择。目前我正在使用共享内存

__shared__ float 2dplane[32][32]

当我尝试使用volatile

volatile float **plane = 2dplane;

,我收到此错误

  

错误:类型为“float()[16]”的值不能用于初始化   “volatile float * ”类型的实体

任何人都可以告诉我如何在2d数组上使用volatile [代码示例会很有帮助]。而且,如果有人告诉我可以获得多少性能提升,那就太棒了。

1 个答案:

答案 0 :(得分:4)

您的共享内存数组不是2D,并且未声明为volatile,这就是赋值语句非法的原因。

至于NVIDIA董事会的不稳定建议,我只能说你不应该相信你所阅读的所有内容,因为这是无稽之谈(如果你敢的话,谷歌“天空飞行”)。 volatile关键字控制编译器如何以及是否强制执行从寄存器到内存的写操作。它对内存吞吐量没有任何好处。