Какое количество устройств я должен установить 0 или 1 в cudaSetDevice();
, чтобы скопировать P2P (GPU0->GPU1) с помощью cudaStreamCreate(stream); cudaMemcpyPeerAsync(p1, 1, p0, 0, size, stream);
?
Код:
// Set device 0 as current
cudaSetDevice(0);
float* p0;
size_t size = 1024 * sizeof(float);
// Allocate memory on device 0
cudaMalloc(&p0, size);
// Set device 1 as current
cudaSetDevice(1);
float* p1;
// Allocate memory on device 1
cudaMalloc(&p1, size);
// Set device 0 as current
cudaSetDevice(0);
// Launch kernel on device 0
MyKernel<<<1000, 128>>>(p0);
// What number do I must to set 0 or 1?
cudaSetDevice(1); // cudaSetDevice(0);
cudaStream_t stream;
cudaStreamCreate(stream);
// Copy p0 to p1
cudaMemcpyPeerAsync(p1, 1, p0, 0, size, stream);
cudaStreamSynchronize(stream);
// Launch kernel on device 1
cudaSetDevice(1);
MyKernel<<<1000, 128>>>(p1);
ОБНОВЛЕНИЕ 31.03.2014: Или текущий контекст важен только для __global__ kernel_function()
, но не для cudaMemcpyPeerAsync()
? А для cudaMemcpyAsync()
и cudaMemcpyPeerAsync()
важно только то, что поток был создан для устройства, из (исходного указателя) которого копируются данные, не так ли?