2

问题

总 GPU 时间 + 总 CPU 开销小于总执行时间。为什么?

细节

我正在研究全局内存访问和内核启动的频率如何影响性能,我设计了一个包含多个小内核和总共约 10 万个内核调用的代码。每个内核从全局内存中读取数据,处理它们,然后写回全局内存。正如预期的那样,代码运行速度比只有一个大内核和很少内核启动的原始设计慢得多。

当我使用命令行分析器获取“gputime”(GPU 内核或内存复制方法的执行时间)和“cputime”(非阻塞方法的 CPU 开销,阻塞方法的 gputime 和 CPU 开销之和)时,问题就出现了. 据我了解,所有 gputimes 和所有 cputimes 的总和应该超过整个执行时间(最后一个“gpuendtimestamp”减去第一个“gpustarttimestamp”),但事实恰恰相反(gputimes 之和=13.835064 s,cputimes 之和=4.547344 s,总时间=29.582793)。在一个内核的结束和下一个内核的开始之间,往往有大量的等待时间,大于下一个内核的 CPU 开销。遇到这个问题的内核大多是:memcpyDtoH、memcpyDtoD 以及 launch_closure_by_value、fast_scan 等推力内部函数。可能的原因是什么?

系统 Windows 7、TCC 驱动程序、VS 2010、CUDA 4.2

谢谢你的帮助!

4

1 回答 1

1

这可能是分析(会增加延迟)和 Windows WDDM 子系统的组合。为了克服后者的高延迟,CUDA 驱动程序批处理 GPU 操作并通过单个 Windows 内核调用分组提交它们。如果 CUDA API 命令位于未提交的批处理中,这可能会导致 GPU 长时间处于不活动状态。

(将@talonmies 的评论复制到答案中,以启用投票和接受。)

于 2012-09-01T15:27:56.963 回答