0

运行并发复制和内核操作时:
如果我的内核运行时间是 dataCopy 操作的两倍,每次内核运行我会得到 2 个副本吗?
我看到的流示例显示了 1:1 的关系。(复制时间=内核运行时间。)我想知道当有什么不同时会发生什么。每次内核启动总是有一个复制操作(最大)吗?或者复制操作是否独立于内核启动运行?即,如果运行和复制时间以这种方式运行,我可能会在每次内核启动时完成 5 次复制操作。
(我试图弄清楚在内核启动之前要排队多少次复制操作。)

一对一:(复制时间=内核运行时间)
<--stream1Copy--><--stream2Cop​​y-->
.......... .......<-stream1Kernel->

二比一:(复制时间 = 1/2 内核运行时间)
<-stream1Copy-><-stream2Cop​​y-><-stream3Copy->
.................... .........<---------stream1Kernel------------>

4

1 回答 1

1

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

您可能需要阅读最佳实践指南中的相关部分

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

可视化分析器将帮助您以时间线方式准确了解数据复制操作与内核操作的比较。

于 2012-11-28T19:37:07.627 回答