如何在全局内存中“流式传输”数据?
Posted
技术标签:
【中文标题】如何在全局内存中“流式传输”数据?【英文标题】:How to "stream" data from and to global memory? 【发布时间】:2011-06-28 13:12:23 【问题描述】: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 框架中的类比吗?
【问题讨论】:
【参考方案1】:我同意他对该准则的解释:顺序内存访问是最快的。很明显(对于任何支持 OpenCL 的开发人员而言)顺序内存访问是最快的,所以 NVidia 明确地这样说明它很有趣。
您的解释虽然不是该文件所说的,但也是正确的。如果您的算法允许,最好异步上传合理大小的块,以便它可以更快地开始计算,重叠计算与系统 RAM 的 DMA 传输。
拥有多个波前/扭曲也很有帮助,因此设备可以将它们交错以隐藏内存延迟。优秀的 GPU 已经过高度优化,能够以极快的速度进行这种切换,从而在内存阻塞时保持忙碌。
【讨论】:
【参考方案2】:我对这句话的理解是, 为了获得最佳性能之一 应不断填写和阅读全球 GPU 工作时的内存 内核
这并不是一个正确的解释。
典型的 OpenCL 设备(即 GPU)具有极高的带宽、高延迟的全局内存系统。这种内存系统针对连续或线性内存访问进行了高度优化。您引用的那篇文章的真正意思是 OpenCL 内核应该被设计为以一种最适合 GPU 内存的连续方式访问全局内存。 NVIDIA 将这种优化的、连续的内存访问称为“合并”,并在其 CUDA 和 OpenCL 指南中详细讨论了针对其硬件的内存访问模式优化。
【讨论】:
以上是关于如何在全局内存中“流式传输”数据?的主要内容,如果未能解决你的问题,请参考以下文章
Spring WebClient:如何将大字节 [] 流式传输到文件?