首页 文章

异步数据传输CUDA

提问于
浏览
1

考虑下面的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的输出复制回主机?

此外,异步数据传输中绝对需要固定内存使用吗?

提前致谢 .

1 回答

  • 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.

相关问题