2013-02-14 59 views
1

考虑下面的代码CUDA:异步数据传输CUDA

CudaMemCpyAsync(H2d, data1...., StreamA); 
KernelB<<<..., StreamB>>>(data1,...); 
CudaMemCpyAsync(D2H, output using data1, ...., StreamA); 

何时 “CudaMemCpyAsync(D2H .....,StreamA);”在代码开始?在KernelB执行结束后开始执行吗?我是否替换“CudaMemCpyAsync(D2H .....,StreamA);”与“CudaMemCpy(D2H .....,StreamA);”如果我必须将KernelB的输出复制回主机?

另外,固定的内存使用量在异步数据传输中是绝对必需的吗?

在此先感谢。

回答

3

用户创建的CUDA流相对于彼此和主机是异步的。发布到相同CUDA流的任务将被序列化。所以在你的情况下,cudaMemCpyAsync(D2H, output using data1, ...., StreamA);将等待先前的内存复制完成。但是不能保证当这个内存拷贝启动时,内核就会完成它的执行。因为StreamAStreamB彼此是异步的w.r.t。

此外,主机不会等待这些流完成执行。

如果您希望主机等待流,您可以使用cudaDeviceSynchronizecudaStreamSynchronize

If you do not use pinned memory, the memory copies will not overlap with kernel execution.