运行并发副本时内核操作:
如果我的内核runTime是dataCopy操作的两倍,那么每个内核运行会得到2个副本吗?
我看到的流示例显示了1:1的关系。 (复制时间=内核运行的时间。)我想知道当有不同的东西时会发生什么。每次内核启动是否总有一个复制操作(最大值)?或者复制操作是否独立于内核启动运行?即如果运行和运行,我可能会为每次内核启动完成5次复制操作。复制时间以这种方式解决。
(我试图找出在内核启动之前要排队的复制操作数量。)
一对一:(复制时间=内核运行时间)
< - stream1Copy - >< - stream2Copy - >
..............................< -stream1Kernel->
二对一:(复制时间= 1/2内核运行时间)
< -stream1Copy->< -stream2Copy->< -stream3Copy->
............................< ---------- --------- stream1Kernel --->
答案 0 :(得分:1)
每个内核启动可以有多个副本。只有一个副本(具有双拷贝引擎的设备上的每个方向)可以在特定时间运行到特定GPU,但是一旦完成,另一个可以立即启动。在内核启动流以外的流中发出的异步副本将完全异步运行到该内核启动,假设其他流是流0.(这也假设您使用固定内存,即cudaHostAlloc来创建相关的主机端缓冲区。)
您可能需要阅读最佳做法指南中的relevant section。
您经常看到计算和复制的1:1分析的原因是假设复制的数据将由内核调用消耗(或由内核调用生成),因此逻辑上我们可以想到数据块这条路。但是,如果将代码构造为一系列副本更容易,那么应该没有问题。当然,如果您可以将所有数据批量处理到单个cudaMemcpy调用中,那么传输相同数据的一系列副本的效率会稍微高一些。
visual profiler将帮助您准确了解以时间轴方式将数据复制操作与内核操作进行比较的过程。