Cuda 从GPU到远程主机的GPUDirect RDMA传输 脚本:

Cuda 从GPU到远程主机的GPUDirect RDMA传输 脚本:,cuda,infiniband,rdma,gpudirect,Cuda,Infiniband,Rdma,Gpudirect,我有两台机器,一台客户端和一台服务器,与Infiniband连接。服务器计算机具有NVIDIA Fermi GPU,但客户端计算机没有GPU。我有一个在GPU机器上运行的应用程序,它使用GPU进行一些计算。服务器机器从不使用GPU上的结果数据,而是直接发送到客户端机器,而不进行任何处理。现在我正在做一个cudaMemcpy,将数据从GPU获取到服务器的系统内存,然后通过套接字发送到客户端。我正在使用以启用此通信 问题: 在这种情况下,我是否可以利用NVIDIA的GPUDirect技术来摆脱cud

我有两台机器,一台客户端和一台服务器,与Infiniband连接。服务器计算机具有NVIDIA Fermi GPU,但客户端计算机没有GPU。我有一个在GPU机器上运行的应用程序,它使用GPU进行一些计算。服务器机器从不使用GPU上的结果数据,而是直接发送到客户端机器,而不进行任何处理。现在我正在做一个
cudaMemcpy
,将数据从GPU获取到服务器的系统内存,然后通过套接字发送到客户端。我正在使用以启用此通信

问题: 在这种情况下,我是否可以利用NVIDIA的GPUDirect技术来摆脱
cudaMemcpy
调用?我相信我已经正确安装了GPUDirect驱动程序,但我不知道如何在不首先将数据复制到主机的情况下启动数据传输

我的猜测是,不可能将SDP与GPUDirect结合使用,但是是否有其他方法可以启动从服务器机器的GPU到客户端机器的RDMA数据传输


奖励:如果有人能用一种简单的方法来测试我是否正确安装了GPUDirect依赖项,那也会很有帮助

GPUDirect RDMA是一项新功能,将与NVIDIA的infiniband合作伙伴合作实施。它是在CUDA 5.0中发布的,但目前尚未推出。查看更新。

在CUDA代码示例SDK中,您可以找到一些示例代码,演示您想要的内容-。您需要使用
cudaMemcpyAsync
异步复制到GPU w.r.t主机。我有CUDA SDK,但我没有看到任何使用GPUDirect技术的示例。你知道我应该看一个具体的示例程序吗?我目前没有下载它,但我认为我给出的链接中的“使用多GPU的简单点对点传输”示例正是你想要的。如果我错了,我会去看一看并发回,但我不寻找GPU到GPU(P2P)传输。我很确定我可以通过正常的
cudaMemcpy
调用做到这一点。我正在寻找的是一种使用RDMA和Infiniband直接从GPU传输到另一台主机上的内存的方法。好的,在这种情况下,您肯定需要使用固定内存(malloc via
cudaMallocHost
),或者使用
cudahosterregister
函数。我猜您只需要固定内存,如果设置正常,GPUDirect将启用RDMA传输(如果执行此操作后的吞吐量比当前更好,那么您可以肯定会有所改进)。据我所知,GPUDirect只会加速cudaMemCpy,而且它不能被删除,如果你有很多memcpy函数(H2D,D2H),那么你可以只使用
cudaMemcpyDefault
。我见过这个功能,但它看起来像是针对GPU的P2P传输。它还允许我将数据直接复制到远程节点,而不涉及源节点上的CPU吗?引用您链接到的页面:“使用GPU和其他PCIe设备之间的直接内存访问(DMA)消除CPU带宽和延迟瓶颈…”这让我不清楚CUDA驱动程序是否支持RDMA,或者是否只支持P2P传输。它似乎很容易被支持,但该页面似乎并没有明确说明这一点。这似乎仍然是一个很好的答案,所以我接受它。这里的关键词是“远程”,即不是同一PCI-e总线上的对等点。这将需要NVIDIA与之合作的特定Infiniband卡制造商的支持。但是,我们能否通过Infiniband RDMA访问点对点,即GPU1 Core能否通过内核函数中指向GPU2-RAM的指针进行访问?GPU1核心GPU2-RAM@Alex,否,PC1的GPU1无法通过正常的内存读取操作访问远程PC2的RAM(GPU2-RAM)。RDMA意味着PC1可以通过infiniband发布请求,将一些内存从PC2(或GPU2-RAM)复制到一些本地内存(PC1 RAM或GPU1 RAM),而无需远程PC2执行中断或memcpy。请求在QP:106页“5.2.7 rdma_post_读取…远程内存区域的内容将被读取到本地数据缓冲区”中明确发布。只有在完成此请求后,您才能访问数据的本地副本。