【问题标题】:Asynchronous data transfer CUDA异步数据传输 CUDA
【发布时间】:2013-02-14 07:23:28
【问题描述】:

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

另外,在异步数据传输中是否绝对需要固定内存使用?

提前致谢。

【问题讨论】:

    标签: asynchronous cuda


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2022-08-02
      • 2022-07-27
      • 1970-01-01
      • 2012-12-14
      • 2015-12-01
      相关资源
      最近更新 更多