微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Nvidia CUDA:Profiler 表明内存传输操作不是异步执行的

如何解决Nvidia CUDA:Profiler 表明内存传输操作不是异步执行的

我已经分析了我的 CUDA 应用程序,但分析结果与我预期的不同。

CUDA profile

以下是我的应用程序工作原理的摘要

  • 使用了 4 个流
  • cpu 循环轮询每个流的状态
  • 如果发现流空闲,则调用一个函数launch_job

这个函数看起来像这样:

launch_job(cudaStream_t stream,...)
{
    cudamemcpyAsync(...,stream);
    cuda_process_kernel<<<grid,block,stream>>>(...);
    cudaError_t err = cudaGetLastError();
    if(err) ...
    cudamemcpyAsync(...,stream);
}

对于分析器屏幕截图中看到的 4 个内核线程启动的第一个块,每次调用 launch_job 时流都不同。

然而,内存传输或内核执行没有重叠。

我本来希望看到至少一个内存传输与内核函数执行重叠,如果不是两个内存传输。 (一个是 H2D 方向,另一个是 D2H 方向,但这可能很明显。)

我是否从根本上误解了流的工作方式?或者我的 launch_job 函数没有产生并行化内存传输和内核函数执行是否有其他原因?

解决方法

请试试这个:

  1. 对于每个流,执行 cudaMemcpyAsync(...,stream) 以复制 H2D。
  2. 对于每个流,在该流上启动内核;
  3. 对于每个流,执行 cudaMemcpyAsync(...,stream) 以复制 D2H。

请注意,这里有三个 for 循环。如果您的 GPU 支持,您的分析器应该会在不同的流之间显示一些重叠。

另外,如果你的数据真的很小,比如只有 1MB,你可能看不到太多重叠,如果你每个流上有 100MB 的数据副本会更明显。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。