dr dobbs cuda(倒车阵)教程

时间:2010-08-15 12:59:54

标签: cuda

我正在Dr.Dobb上阅读Supercomputing for the Masses: Part 5,我有一个关于作者(快速)反转阵列代码的问题。

我理解需要使用共享内存,但我没有在reverseArray_multiblock_fast.cu的代码中获得性能提升

在reverseArray_multiblock_fast.cu中,数组元素从全局内存转移到共享内存,然后从共享内存转移到全局内存。我无法理解为什么这比直接从全局内存中读取数组元素并将其写入全局内存中的另一个索引更好。

你可以向我解释一下吗?

3 个答案:

答案 0 :(得分:4)

答案是:GPU喜欢读取和写入对齐的连续数据块(在cuda中称为合并),因此在快速实现中,您以理想的方式读取块以共享内存然后将其反转,然后将其写出按顺序排列。请注意,执行重新排序的线程不一定是将数据写回全局内存的线程。

答案 1 :(得分:3)

结帐Supercomputing for the Masses: Part 6
它解释了一切......

答案 2 :(得分:2)

你提出了一个有趣的观点,因为那篇文章是在2008年写的。

在原始CUDA设备(Compute Capability 1.0和1.1)上,使用“合并”模式访问全局内存至关重要。这意味着如果线程0访问字节地址A处的四个字节,则连续线程1-15必须分别访问地址A + 4到A + 60(* 1)。

因此,本文中的代码获取线程0-15以读取连续且增加的地址,存储到共享存储器中,然后以相反的顺序从共享存储器读取并写入连续且增加的地址。因此,对全局内存的读取和写入都符合严格的合并要求。

自撰写本文以来,已经推出了更新的CUDA设备(Compute Capability 1.2和1.3以及现在的2.0和2.1),它们执行某种程度的自动合并。具体来说,在这种情况下,按顺序读取并按相反的顺序写入是完全可以接受的 - 硬件认识到写入是合并写入的排列,只需为您重新排序即可。

总而言之,在具有Compute Capability 1.2或更高版本的设备上,您不需要通过共享内存来解决此特定问题。当然,共享内存在许多其他问题中仍然非常宝贵!

有关详细信息,请查看“CUDA最佳实践指南”(可在CUDA developer site上找到)中的内存性能部分以及高级CUDA培训课程(例如this recording)。< / p>

* 1:还要注意地址A必须与64字节边界对齐。