ピアツーピアをサポートしていない(同じPCIルートハブにない)GPU用の古いAPIを使用して、異なるプロセスで2つの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_RECV
(プロセス1、デバイスMPI_Send関数を経由して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のみのためであり、メモリをコピーしないので、私がやっていることが正しいかどうかについてあいまいさがあります。 –