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 读/写的主要内容,如果未能解决你的问题,请参考以下文章