OpenCL部分缓冲区DMA读/写

OpenCL部分缓冲区DMA读/写,opencl,dma,Opencl,Dma,所以我有一个我喜欢用OpenCL实现的应用程序,它使用MPI分布在多台机器上 现在,在算法的每次迭代中,我都需要同步MPI进程之间的缓冲区,但关键是:只需要同步/复制2D缓冲区的边界,而不需要同步/复制整个区域 因此,我的问题是,是否可以使用OpenCL的内存映射机制(ClenqueueEmapBuffer&clEnqueueUnmapMemObject)只读取/写入2D缓冲区的边界,而不触发整个缓冲区的完整副本 基本上,这只有在OpenCL使用DMA而不是主机端缓冲区拷贝时才能起作用。所以我的

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

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

因此,我的问题是,是否可以使用OpenCL的内存映射机制(ClenqueueEmapBuffer&clEnqueueUnmapMemObject)只读取/写入2D缓冲区的边界,而不触发整个缓冲区的完整副本


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

为了能够使用DMA,缓冲区应该在页面锁定内存中。AMD和NVIDIA在其编程指南中指出,要在页面锁定内存中创建缓冲区,应使用CL_MEM_ALLOC_HOST_PTR标志。以下是NVIDIA在其报告的第3.3.1节中所说的内容

OpenCL应用程序不能直接控制内存是否可用 对象是否在页锁定内存中分配,但它们可以 使用CL_MEM_ALLOC_HOST_PTR标志和此类对象创建对象 是否有可能被驱动程序分配到页面锁定内存中 最好的表现

请注意粗体显示的“可能”

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

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

此函数允许写入缓冲区的2或3D区域。另一种可能是使用子缓冲区,通过以下方式创建它们:


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

ClenqueueWriteBufferect/clEnqueueReadBufferRect似乎就是我想要的,谢谢。
clEnqueueWriteBufferRect()
clCreateSubBuffer()