【发布时间】:2012-08-10 15:33:24
【问题描述】:
场景:
我有两台机器,一个客户端和一个服务器,用 Infiniband 连接。服务器机器有一个 NVIDIA Fermi GPU,但客户端机器没有 GPU。我有一个在 GPU 机器上运行的应用程序,它使用 GPU 进行一些计算。 GPU 上的结果数据从不被服务器机器使用,而是直接发送到客户端机器而不进行任何处理。现在我正在使用cudaMemcpy 将数据从 GPU 获取到服务器的系统内存,然后通过套接字将其发送到客户端。我正在使用SDP 启用RDMA 进行此通信。
问题:
在这种情况下,我是否可以利用 NVIDIA 的 GPUDirect 技术摆脱cudaMemcpy 调用?我相信我已正确安装了 GPUDirect 驱动程序,但如果不先将数据复制到主机,我不知道如何启动数据传输。
我的猜测是无法将 SDP 与 GPUDirect 结合使用,但是否有其他方法可以启动从服务器机器的 GPU 到客户端机器的 RDMA 数据传输?
奖励:如果有人有一种简单的方法来测试我是否正确安装了 GPUDirect 依赖项,那也会很有帮助!
【问题讨论】:
-
在 CUDA 代码示例 SDK 中,您可以找到一些演示您想要的示例代码 - developer.nvidia.com/cuda/cuda-cc-sdk-code-samples。您需要使用
cudaMemcpyAsync异步复制到 GPU w.r.t 主机。 -
我有 CUDA SDK,但我没有看到任何使用 GPUDirect 技术的示例。您知道我应该查看的特定示例程序吗?
-
我目前没有下载它,但我认为我提供的链接中的“使用多 GPU 进行简单点对点传输”示例就是你想要的。
-
如果我错了,我会去看看并回帖,但我不是在寻找 GPU 到 GPU (P2P) 传输。我很确定我可以通过普通的
cudaMemcpy调用来做到这一点。我正在寻找一种使用 RDMA 和 Infiniband 直接从 GPU 传输到另一台主机上的内存的方法。 -
好的,在这种情况下,您肯定需要使用固定内存(通过
cudaMallocHost进行malloc),或者使用cudaHostRegister函数。我猜你只需要固定内存,如果设置正常,GPUDirect 将启用 RDMA 传输(如果你这样做后的吞吐量比当前更好,那么你可以肯定会有所改进)。而且据我所知,GPUDirect 只会加速 cudaMemCpy,而且它不能被移除,如果你有很多 memcpy 函数(H2D,D2H),那么你可以使用cudaMemcpyDefault。
标签: cuda infiniband rdma gpudirect