AMD';s OpenCL提供类似于CUDA';什么是GPUDirect?

AMD';s OpenCL提供类似于CUDA';什么是GPUDirect?,cuda,opencl,nvidia,amd,gpudirect,Cuda,Opencl,Nvidia,Amd,Gpudirect,NVIDIA提供减少内存传输开销的功能。我想知道AMD/ATI是否也有类似的概念?具体而言: 1) AMD GPU与网卡接口时是否避免第二次内存传输。如果图形在某一点丢失,这里描述了GPUDirect对从一台机器上的GPU获取数据并通过网络接口传输的影响:使用GPUDirect,GPU内存进入主机内存,然后直接进入网络接口卡。如果没有GPUDirect,GPU内存将进入一个地址空间中的主机内存,然后CPU必须进行复制,以将内存进入另一个主机内存地址空间,然后它可以进入网卡 2) 当两个GPU在同

NVIDIA提供减少内存传输开销的功能。我想知道AMD/ATI是否也有类似的概念?具体而言:

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

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


编辑:顺便说一句,我不完全确定GPUDirect中有多少是vaporware,有多少是真正有用的。我从来没有听说过GPU程序员用它来做真正的事情。对此也欢迎您的想法。

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

这里有一条关于这个主题的信息线索

希望这有帮助


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

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

零拷贝并不适用于所有应用程序。以下是AMD应用程序OpenCL编程指南中关于何时使用它的建议:

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

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


AMD应用程序OpenCL编程指南:

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

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

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

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

要使用此技术,您必须:

  • 有一个兼容的AMD GPU(不是所有的都支持DirectGMA)。您可以使用AMD提供的OpenCL、DirectX或OpenGL扩展

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

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


您能否提供这两种技术的文字说明,以防以后删除链接的图形?另外,我发现第二个图形不清楚提供了什么。@gpu:mvapich2在其最新版本中有gpu直接支持,我使用过它,它确实更快-您可以调用
MPI\u Send
MPI\u recv
,并将gpu内存指针作为参数传递,一切都“正常工作”。GPUDirect绝对不是vaporware。GPU之间的P2P是真实存在的,并且对于GPU之间的直接通信非常有用。CUDA与CL_MEM_ALLOC_HOST_PTR具有等价物,但它们与GPUDirect不同。CUDA可以访问主机内存alloca