我想在不支持點對點的GPU(它們不在同一個PCI根集線器上)上使用舊的API API在不同進程中的兩個GPU之間複製數據。但是,我在同步時遇到問題。的基本步驟我理解他們是:如何使用cudaMemcpyPeer在不能使用P2P的不同進程中的GPU之間複製GPU數據?
(過程0,設備0):
void * d_X;
cudaMalloc(&d_X, size);
// Put something into d_X;
cudaIpcMemHandle_t data;
cudaIpcGetMemHandle(&data, (void *)d_X);
- >發送地址和大小通過MPI_SEND爲流程1/MPI_RECV
(流程1,設備1):
cudaSetDevice(1);
void * d_Y;
cudaMalloc(&d_Y, size);
cudaSetDevice(0); // Need to be on device 0 to copy from device 0
void * d_X;
cudaIpcOpenMemHandle(&d_X, data, cudaIpcMemLazyEnablePeerAccess);
cudaMemcpyPeer(d_Y, 1, d_X, 0, size);
cudaIpcCloseMemHandle(d_X);
這是基本正確的嗎?一旦我確定這是正確的方法,我需要弄清楚如何正確同步,因爲很明顯,我有同步問題(基本上覆制了過時的內存)。
我的GPU確實支持UVA,但cudaDeviceCanAccessPeer
返回0.我實際上試圖編寫一些適用於P2P和此的代碼,但這是我遇到的問題。
你是否研究過cuda simpleIPC示例代碼? –
不幸的是,這隻適用於P2P,並且不會複製內存,所以我所做的是否正確是不明確的。 –