В чем разница между cudaMemcpy () и cudaMemcpyPeer () для P2P-копирования?
Я хочу скопировать данные из GPU0-DDR в GPU1-DDR напрямую, без CPU-RAM.
Как сказано здесь на странице-15:http://people.maths.ox.ac.uk/gilesm/cuda/MultiGPU_Programming.pdf
Peer-to-Peer Memcpy
Direct copy from pointer on GPU A to pointer on GPU B
With UVA, just use cudaMemcpy(…, cudaMemcpyDefault)
Or cudaMemcpyAsync(…, cudaMemcpyDefault)
Also non-UVA explicit P2P copies:
cudaError_t cudaMemcpyPeer( void * dst, int dstDevice, const void* src,
int srcDevice, size_t count )
cudaError_t cudaMemcpyPeerAsync( void * dst, int dstDevice,
const void* src, int srcDevice, size_t count, cuda_stream_t stream = 0 )
Если я используюcudaMemcpy()
тогда я должен сначала установить флагcudaSetDeviceFlags( cudaDeviceMapHost )
?Должен ли я использоватьcudaMemcpy()
указатели, которые я получил в результате функцииcudaHostGetDevicePointer(& uva_ptr, ptr, 0)
?Есть ли преимущества функцииcudaMemcpyPeer()
и если нет никаких преимуществ, зачем это нужно?