Cuda 并发:短拷贝,长内核

Cuda 并发:短拷贝,长内核,cuda,cuda-streams,Cuda,Cuda Streams,运行并发复制和内核操作时: 如果我的内核运行时长度是dataCopy操作的两倍,那么每个内核运行是否会得到2个副本? 我看到的流示例显示了1:1的关系。(复制时间=内核运行时间。)我想知道当出现不同的情况时会发生什么。是否每次内核启动都有一个拷贝操作(最大)?或者复制操作是否独立于内核启动运行?i、 e.如果运行和复制时间是这样的话,我可能会在每次内核启动时完成5次复制操作。 (我试图计算出在内核启动之前要排队执行多少复制操作。) 一对一:(复制时间=内核运行时间) .............

运行并发复制和内核操作时:
如果我的内核运行时长度是dataCopy操作的两倍,那么每个内核运行是否会得到2个副本?
我看到的流示例显示了1:1的关系。(复制时间=内核运行时间。)我想知道当出现不同的情况时会发生什么。是否每次内核启动都有一个拷贝操作(最大)?或者复制操作是否独立于内核启动运行?i、 e.如果运行和复制时间是这样的话,我可能会在每次内核启动时完成5次复制操作。
(我试图计算出在内核启动之前要排队执行多少复制操作。)

一对一:(复制时间=内核运行时间)

..............................

二对一:(复制时间=1/2内核运行时间)


每个内核启动可以有多个副本。在特定时间,只有一个拷贝(双拷贝引擎设备上的每个方向)可以运行到特定GPU,但一旦完成,另一个拷贝可以立即启动。假设niether流为流0,则在所讨论的内核启动流以外的流中发布的异步拷贝将与该内核启动完全异步运行。(这还假设您正在使用固定内存,即cudaHostAlloc来创建相关的主机端缓冲区。)

您可能需要阅读《最佳实践指南》中的

您经常看到compute和copy的1:1分析的原因是,假设复制的数据将被内核调用消耗(或由内核调用生成),因此从逻辑上我们可以这样看待数据块。但是,如果将代码结构为一系列副本更容易,那么应该没有问题。当然,如果您可以将所有数据批处理到一个cudaMemcpy调用中,那么这将比传输相同数据的一系列副本稍微有效一些


将帮助您以时间轴的方式准确地查看将数据复制操作与内核操作进行比较的情况。

我对Visual Profiler的理解是,这仅适用于Win环境。nonWin env是否有类似的工具?是的,在linux环境中,您可以使用
nvvp
命令运行visual profiler,或者如果您有CUDA 5,您可以通过运行
nsight
命令从nsight Eclipse Edition工具中访问它。您可能想看看我在回答中链接的文档,特别是。