如何在全局内存中“流式传输”数据?

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:如何将大字节 [] 流式传输到文件?

在 java servlet 中流式传输大文件

当 AMQ 主题中没有数据可读取时如何停止流式传输

如何在谷歌云数据流中停止流式传输管道

如何通过 PHP api 在 Flutter 中流式传输 MySQL 数据库记录?

如何将多文件(b、t、f)形状的数据流式传输到 TensorFlow 数据集中