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