如何解决Nvidia CUDA:Profiler 表明内存传输操作不是异步执行的
我已经分析了我的 CUDA 应用程序,但分析结果与我预期的不同。
以下是我的应用程序工作原理的摘要:
这个函数看起来像这样:
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
函数没有产生并行化内存传输和内核函数执行是否有其他原因?
解决方法
请试试这个:
- 对于每个流,执行 cudaMemcpyAsync(...,stream) 以复制 H2D。
- 对于每个流,在该流上启动内核;
- 对于每个流,执行 cudaMemcpyAsync(...,stream) 以复制 D2H。
请注意,这里有三个 for 循环。如果您的 GPU 支持,您的分析器应该会在不同的流之间显示一些重叠。
另外,如果你的数据真的很小,比如只有 1MB,你可能看不到太多重叠,如果你每个流上有 100MB 的数据副本会更明显。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。