我在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 [代码示例会很有帮助]。而且,如果有人告诉我可以获得多少性能提升,那就太棒了。
答案 0 :(得分:4)
您的共享内存数组不是2D,并且未声明为volatile
,这就是赋值语句非法的原因。
至于NVIDIA董事会的不稳定建议,我只能说你不应该相信你所阅读的所有内容,因为这是无稽之谈(如果你敢的话,谷歌“天空飞行”)。 volatile关键字控制编译器如何以及是否强制执行从寄存器到内存的写操作。它对内存吞吐量没有任何好处。