OpenCL 部分缓冲区 DMA 读/写

Posted

技术标签:

【中文标题】OpenCL 部分缓冲区 DMA 读/写【英文标题】:OpenCL partial buffer DMA read/write 【发布时间】:2013-07-11 11:33:37 【问题描述】:

所以我有一个我喜欢使用 OpenCL 实现的应用程序,它使用 MPI 分布在多台机器上。

现在在算法的每次迭代中,我都需要在 MPI 进程之间同步缓冲区,但这里有一个问题:只有 2D 缓冲区的边界需要同步/复制,而不是整个区域。

所以我的问题是,是否可以使用 OpenCL 的内存映射机制(clEnqueueMapBuffer 和 clEnqueueUnmapMemObject)仅读取/写入 2D 缓冲区的边界而不会触发整个缓冲区的完整副本。

基本上,这只有在 OpenCL 使用 DMA 而不是主机端缓冲区副本时才有效。所以我的问题真的是 OpenCL 是否支持对离散 PCIe GPU 上的设备缓冲区数据进行 DMA 访问。如果是,在什么硬件和操作系统上?

【问题讨论】:

【参考方案1】:

为了能够使用 DMA,缓冲区应位于页面锁定内存中。 AMD 和 NVIDIA 在他们的编程指南中声明,要在页面锁定内存中拥有一个缓冲区,它应该使用 CL_MEM_ALLOC_HOST_PTR 标志创建。这是 NVIDIA 在其guide: 的第 3.3.1 节中所说的

OpenCL 应用程序无法直接控制是否内存 对象是否分配在页面锁定内存中,但它们可以 使用 CL_MEM_ALLOC_HOST_PTR 标志和此类对象创建对象 可能被驱动程序分配在页面锁定内存中 最佳性能。

注意用粗体表示的“可能”。

哪个操作系统? NVIDIA 不谈论操作系统,因此任何操作系统 NVIDIA 都提供驱动程序(AMD 相同)。 哪种硬件?我猜任何有 DMA 控制器。

现在要仅写入缓冲区的一部分,您可以查看function:

clEnqueueWriteBufferRect()

此函数允许写入缓冲区的 2D 或 3D 区域。另一种可能性是使用带有function 的子缓冲区创建它们:

clCreateSubBuffer()

但是,它并没有 2D 缓冲区的概念。

【讨论】:

clEnqueueWriteBufferRect/clEnqueueReadBufferRect 似乎是我想要的,谢谢。

以上是关于OpenCL 部分缓冲区 DMA 读/写的主要内容,如果未能解决你的问题,请参考以下文章

通用环形缓冲区 LwRB 使用指南

通用环形缓冲区 LwRB 使用指南

通用环形缓冲区 LwRB 使用指南

反向代理缓存

如何在 OpenCL 内核中更新 OpenCL-OpenGL 共享缓冲区数据?

OpenCL 并行缓冲区压缩障碍问题