问题
总 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
谢谢你的帮助!