AMD 的 OpenCL 是不是提供类似于 CUDA 的 GPUDirect 的功能?

Posted

技术标签:

【中文标题】AMD 的 OpenCL 是不是提供类似于 CUDA 的 GPUDirect 的功能?【英文标题】:Does AMD's OpenCL offer something similar to CUDA's GPUDirect?AMD 的 OpenCL 是否提供类似于 CUDA 的 GPUDirect 的功能? 【发布时间】:2012-03-06 10:31:12 【问题描述】:

NVIDIA 提供GPUDirect 以减少内存传输开销。我想知道 AMD/ATI 是否有类似的概念?具体来说:

1) AMD GPU 在与网卡接口时是否避免第二次内存传输,as described here。如果图形在某些时候丢失,这里描述了 GPUDirect 对从一台机器上的 GPU 获取数据以通过网络接口传输的影响:使用 GPUDirect,GPU 内存进入主机内存,然后直接进入网络接口卡。如果没有 GPUDirect,GPU 内存在一个地址空间去 Host 内存,然后 CPU 必须做一个复制把内存拿到另一个 Host 内存地址空间,然后才能出去到网卡。

2) 当两个 GPU 在同一条 PCIe 总线上共享时,AMD GPU 是否允许 P2P 内存传输,as described here。如果图形在某些时候丢失,这里描述了 GPUDirect 对在同一 PCIe 总线上的 GPU 之间传输数据的影响:使用 GPUDirect,数据可以直接在同一 PCIe 总线上的 GPU 之间移动,而无需接触主机内存。如果没有 GPUDirect,数据总是必须先返回主机,然后才能到达另一个 GPU,无论该 GPU 位于何处。

编辑:顺便说一句,我不完全确定 GPUDirect 有多少是蒸汽软件,有多少实际上是有用的。我从未真正听说过 GPU 程序员将它用于真正的事情。也欢迎对此提出想法。

【问题讨论】:

您能否提供这两种技术的文字说明,以防链接的图形在以后被删除?另外,我发现第二张图片不清楚提供的内容。 @gpu: mvapich2 在他们最近的版本中有 GPU 直接支持,我用过它,它确实更快 - 你可以调用 MPI_SendMPI_recv 并传递 GPU 内存指针作为参数和一切“正常工作”。 GPUDirect 绝对不是蒸汽软件。 GPU 之间的 P2P 是真实的,对于 GPU 之间的直接通信很有用。 【参考方案1】:

虽然这个问题已经很老了,但我想补充一下我的答案,因为我认为这里的当前信息不完整。

正如@Ani 的回答中所述,您可以使用 CL_MEM_ALLOC_HOST_PTR 分配主机内存,并且您很可能会获得一个固定的主机内存,根据实施情况避免第二次复制。例如,NVidia OpenCL 最佳实践指南指出:

OpenCL 应用程序无法直接控制内存对象是否在 是否分配在固定内存中,但它们可以使用 CL_MEM_ALLOC_HOST_PTR 标志和这样的对象很可能被分配在 驱动程序固定内存以获得最佳性能

我发现以前的答案中缺少的是 AMD 提供 DirectGMA 技术的事实。该技术使您能够直接在 GPU 和 PCI 总线上的任何其他外围设备(包括其他 GPU)之间传输数据,而无需通过系统内存。它更类似于 NVidia 的 RDMA(并非在所有平台上都可用)。

要使用这项技术,您必须:

拥有兼容的 AMD GPU(并非所有 GPU 都支持 DirectGMA)。您可以使用 AMD 提供的 OpenCL、DirectX 或 OpenGL 扩展。

让外围驱动程序(网卡、视频采集卡等)公开一个物理地址,GPU DMA 引擎可以从中读取/写入。或者能够对外围 DMA 引擎进行编程,以将数据传输到/从 GPU 暴露的内存中。

我使用这项技术将数据直接从视频捕获设备传输到 GPU 内存,然后从 GPU 内存传输到专有 FPGA。这两种情况都非常有效,没有任何额外的复制。

Interfacing OpenCL with PCIe devices

【讨论】:

【参考方案2】:

我认为您可能正在寻找 clCreateBuffer 中的 CL_MEM_ALLOC_HOST_PTR 标志。虽然 OpenCL 规范声明此标志“此标志指定应用程序希望 OpenCL 实现从主机可访问内存中分配内存”,但不确定 AMD 的实现(或其他实现)可以用它做什么。

这是一个关于主题 http://www.khronos.org/message_boards/viewtopic.php?f=28&t=2440 的信息线程

希望这会有所帮助。

编辑:我知道 nVidia 的 OpenCL SDK 将其实现为在固定/页面锁定内存中的分配。我相当肯定这就是 AMD 的 OpenCL SDK 在 GPU 上运行时所做的。

【讨论】:

CUDA 具有 CL_MEM_ALLOC_HOST_PTR 的等价物,但它们与 GPUDirect 不同。 CUDA 可以从 GPU 内核中访问主机内存分配。它还可以分配页面锁定的主机指针,以使对 GPU 的 DMA 更加高效。但 GPUDirect 超越了这两者,如@gpu 的问题中所述。 明白。那么,目前我不相信 OpenCL 有等价物。【参考方案3】:

正如@ananthonline 和@harrism 所指出的,GPUDirect 的许多功能在 OpenCL 中没有直接的等价物。但是,如果您试图减少内存传输开销,如问题的第一句所述,零拷贝内存可能会有所帮助。通常,当应用程序在 GPU 上创建缓冲区时,缓冲区的内容会从 CPU 内存整体复制到 GPU 内存。零拷贝内存,没有前期拷贝;相反,数据在被 GPU 内核访问时被复制。

零拷贝并非对所有应用程序都有意义。以下是 AMD APP OpenCL 编程指南中关于何时使用它的建议:

零拷贝主机常驻内存对象可以提高主机时的性能 设备以稀疏的方式访问内存,或者当内存很大时 主机内存缓冲区在多个设备和副本之间共享 太贵了。选择此项时,转移的成本必须 大于访问速度较慢的额外成本。

编程指南的表 4.3 描述了将哪些标志传递给 clCreateBuffer 以利用零复制(CL_MEM_ALLOC_HOST_PTR 或 CL_MEM_USE_PERSISTENT_MEM_AMD,具体取决于您想要设备可访问的主机内存还是主机可访问的设备内存)。请注意,零拷贝支持取决于操作系统和硬件; Linux 或更早版本的 Windows 似乎不支持它。

AMD APP OpenCL 编程指南:http://developer.amd.com/sdks/AMDAPPSDK/assets/AMD_Accelerated_Parallel_Processing_OpenCL_Programming_Guide.pdf

【讨论】:

以上是关于AMD 的 OpenCL 是不是提供类似于 CUDA 的 GPUDirect 的功能?的主要内容,如果未能解决你的问题,请参考以下文章

在 64 位 Ubuntu 14.04 中使用 Nvidia *和* AMD GPU 进行 OpenCL 开发

OpenCL / AMD:深度学习 [关闭]

OpenCL 平台术语

Nvidia 和 AMD 硬件上的 OpenCL FFT?

将 OSX 上的 OpenCL 设备设置为专用的 AMD GPU

OpenCL AMD 与 NVIDIA 性能对比