2

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

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

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

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

4

1 回答 1

3

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

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

注意粗体字的“可能”。

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

现在只写缓冲区的一部分,你可以看看这个函数

clEnqueueWriteBufferRect()

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

clCreateSubBuffer()

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

于 2013-07-12T08:20:02.087 回答