OpenCL部分缓冲区DMA读/写

时间:2013-07-11 11:33:38

标签: opencl dma

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

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

所以我的问题是,如果OpenCL的内存映射机制(clEnqueueMapBuffer& clEnqueueUnmapMemObject)可以只读取/写入2D缓冲区的边框而不用触发整个缓冲区的完整副本。

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

1 个答案:

答案 0 :(得分:3)

为了能够使用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()

此功能允许写入缓冲区的2或3D区域。另一种可能性是使用子缓冲区创建function

clCreateSubBuffer()

然而,没有二维缓冲的概念。