我将使用CUDA的术语。 "散写(scattered write)" 表示您从每个CUDA线程向任意地址进行写入操作(即,您的warp的线程不会按顺序写入内存,例如)。 这与帧缓冲区写入形成对比,后者是2D一致的,并且可以由硬件合并。 直到不久前,这些是GPU可用的唯一写入方式。它们是 "收集读取(gather read)" 的相反操作,后者从分散的位置读取数据,并在执行SIMD方式的线程warp之前收集所有数据。 然而,通过任意纹理获取,GPU长期提供了收集读取。
散写入非常好,因为它允许您写入任何内存地址。以前的着色器实现通常受限于给定着色器程序可以写入的内存地址。“而图形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上获得良好性能的关键之一是利用内存局部性。过度使用散布写入(通过大量写入全局内存)很可能会影响您的性能。