CUDA:什么是分散写入?

9

CUDA SDK中的各种CUDA演示文稿都提到了“散布写入”。什么是散布写入,它为什么如此优秀?与之相反的是什么?

2个回答

6
我将使用CUDA的术语。 "散写(scattered write)" 表示您从每个CUDA线程向任意地址进行写入操作(即,您的warp的线程不会按顺序写入内存,例如)。 这与帧缓冲区写入形成对比,后者是2D一致的,并且可以由硬件合并。 直到不久前,这些是GPU可用的唯一写入方式。
它们是 "收集读取(gather read)" 的相反操作,后者从分散的位置读取数据,并在执行SIMD方式的线程warp之前收集所有数据。 然而,通过任意纹理获取,GPU长期提供了收集读取。

6
散写入非常好,因为它允许您写入任何内存地址。以前的着色器实现通常受限于给定着色器程序可以写入的内存地址。
“而图形API中的片段程序仅限于在预定位置输出32个浮点数(RGBA * 8渲染目标),CUDA支持散写入-即对任何地址进行无限数量的存储。这使得许多以前使用图形API无法有效执行的新算法能够通过CUDA高效执行。”
来自CUDA FAQ:

http://forums.nvidia.com/index.php?s=fd8a3833d78a50e273c5c731476eed0d&showtopic=84440&pid=478583&start=0&#entry478583

基本上,它使CUDA程序更容易编写,因为它们不受结果写入位置的限制。请记住,在GPU上获得良好性能的关键之一是利用内存局部性。过度使用散布写入(通过大量写入全局内存)很可能会影响您的性能。

这仍然发生在“设备内存”上,对吧?(与I/O分散/聚集操作相反,这些操作允许DMA引擎将内容从不同的主内存位置驱动到单个I/O条带中) - PypeBros
正确。这指的是GPU上的内存,而不是全局内存。 - Ade Miller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接