使用CUDA合并内存访问2d阵列

时间:2015-03-01 00:38:43

标签: c++ arrays cuda gpgpu nvidia

我正在处理一段CUDA C ++代码,并且需要每个线程实质上通过BOTH行主要和列专业访问全局内存中的2D数组。具体来说,我需要每个线程块:

  • 生成它自己的一维数组(比如说,gridDim元素)
  • 将这些内容写入全局内存
  • 读取每个写入数组的第n个元素,其中n是块ID。

我看到它的方式,只有写入或读取可以合并,而另一个将访问每个元素的单独高速缓存行(并执行非常繁琐)。我已经读过纹理内存有2-d缓存机制,但不知道它是否可以用来改善这种情况。

BTW我使用的是GTX 770,因此它的GK104 Kepler卡具有3.0的计算能力。

非常感谢任何帮助或建议!感谢。

2 个答案:

答案 0 :(得分:1)

事实证明我的算法本身必须重新编写,因为无法通过上述方法避免非合并操作的性能损失。相反,我能够合并每个块上的值并使用更少的全局内存。

作为旁注,我对合并与非合并操作进行了一些实验,以确定它导致的减速程度。事实证明,非合并读取比合并慢大约10倍,而非合并写入大约慢15倍。因此,我认为非合并读取是两个邪恶中的较小者......

答案 1 :(得分:-1)

在这种情况下,在每个访问模式之间进行转置操作以使数据按最佳顺序排列是值得的。转置本身可以编写为使用SMEM,因此它的读取和写入是合并的。

请参阅:http://www.nvidia.com/content/nvision2008/tech_presentations/Game_Developer_Track/NVISION08-Image_Processing_and_Video_with_CUDA.pdf

或者(并且Christian在他的评论中提到)如果你能够做出次优的传球做类似于SMEM转置的事情,你可以跳过完整的转置并只使用它的概念来优化它。