CUDA:为什么有大量的GPU空闲时间?

时间:2012-09-01 06:41:24

标签: cuda profiling

问题

总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

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

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

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