12

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

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

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

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

4

3 回答 3

5

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

正如@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。这两种情况都非常有效,并且不涉及任何额外的复制。

将 OpenCL 与 PCIe 设备连接

于 2019-06-22T10:27:25.520 回答
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 上运行时所做的事情。

于 2012-02-15T21:08:26.010 回答
2

正如@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

于 2012-02-24T22:36:47.270 回答