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

12
NVIDIA提供GPUDirect来减少内存传输开销。我想知道AMD/ATI是否有类似的概念?具体来说:
1. AMD的GPU在与网络卡进行接口时,是否避免了第二次内存传输,如此处所述。如果图形在某个点丢失,这里描述了GPUDirect在从一台机器上的GPU获取数据并传输到网络接口时的影响:使用GPUDirect,GPU内存直接传输到主机内存,然后直接传输到网络接口卡。没有GPUDirect,GPU内存传输到主机内存的一个地址空间,然后CPU必须进行复制,将内存复制到另一个主机内存地址空间,然后才能传输到网络卡。
2. AMD的GPU是否允许在同一PCIe总线上共享两个GPU时进行P2P内存传输,如此处所述。如果图形在某个点丢失,这里描述了GPUDirect在同一PCIe总线上的GPU之间传输数据时的影响:使用GPUDirect,数据可以直接在同一PCIe总线上的GPU之间传输,而无需经过主机内存。没有GPUDirect,数据始终必须返回到主机,然后才能传输到另一个GPU,无论该GPU位于何处。
编辑:顺便说一句,我不太确定GPUDirect到底有多少是虚幻的,有多少是真正有用的。我从来没有听说过有GPU程序员在实际中使用它。对此的想法也欢迎。

你能否提供一份文本描述这两种技术,以防链接图像在以后的某个时间被删除?此外,我发现第二张图不太清楚所提供的内容。 - James
@gpu:mvapich2在最近的版本中具有GPU直接支持,我已经使用过它,确实更快-您可以调用MPI_SendMPI_recv并将GPU内存指针作为参数传递,一切“都能正常工作”。 - talonmies
4
GPUDirect绝对不是虚幻的产品。GPU之间的点对点(P2P)通信确实存在,并且可以用于GPU之间的直接通信,具有实际的应用价值。 - harrism
3个回答

5

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

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

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

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

要使用此技术,您必须:

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

  • 需要外围驱动程序(网络卡、视频捕获卡等)将物理地址公开给GPU DMA引擎以读/写。或者能够编程外围DMA引擎将数据传输到/从GPU暴露的内存中。

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

将OpenCL与PCIe设备接口化


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

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将其实现为固定/页面锁定内存中的分配。我相当确定在GPU上运行时,AMD的OpenCL SDK也是如此。

6
CUDA有CL_MEM_ALLOC_HOST_PTR的相当物,但它们与GPUDirect并不相同。CUDA可以从GPU内核中访问主机内存分配。它还可以分配页面锁定的主机指针以使DMA到GPU更加高效。但是如@gpu的问题所述,GPUDirect超越了这两者。 - harrism
明白了。目前我不认为OpenCL有相应的替代方案。 - Ani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接