如何从全局内存中“流”出数据?

时间:2011-06-28 13:12:23

标签: opencl gpgpu

codeproject.com展示Part 2: OpenCL™ – Memory Spaces表明Global memory should be considered as streaming memory [...]和that the best performance will be achieved when streaming contiguous memory addresses or memory access patterns that can exploit the full bandwidth of the memory subsystem.

我对这句话的理解是,为了获得最佳性能,应该在GPU处理内核时不断填充和读取全局内存。但我不知道,我将如何实现这样一个概念,而且我无法在我读过的(相当简单的)示例和教程中认识到它。

知道一个好的例子还是可以链接到一个?

奖金问题:这在CUDA框架中类似吗?

2 个答案:

答案 0 :(得分:3)

我同意talonmies关于他对该指南的解释:顺序内存访问是最快的。很明显(对于任何支持OpenCL的开发人员),顺序内存访问是最快的,所以有趣的是NVidia明确地说明了这一点。

您的解释虽然不是该文件所说的,但也是正确的。如果你的算法允许它,最好以异步方式上传合理大小的块,这样它就可以更快地在计算机上启动,重叠计算与DMA传输到系统RAM或从系统RAM传输。

拥有多个wavefront / warp也很有帮助,因此设备可以交错它们以隐藏内存延迟。良好的GPU经过大量优化,能够非常快速地进行切换,以便在内存被阻塞时保持忙碌状态。

答案 1 :(得分:2)

  

我对这句话的理解是,   这是为了获得最佳性能   应该不断填写和阅读全球   GPU工作时的内存   内核

这不是一个真正正确的解释。

典型的OpenCL设备(即GPU)具有极高带宽,高延迟的全局存储系统。这种存储器系统针对访问连续或线性存储器访问进行了高度优化。你引用的那篇文章实际上是说OpenCL内核应该被设计成以GPU内存最佳的连续方式访问全局内存。 NVIDIA将这种最佳,连续的内存访问称为“合并”,并在其CUDA和OpenCL指南中详细讨论了其硬件的内存访问模式优化。