内核启动和内核执行之间的时间

时间:2012-08-30 11:38:30

标签: cuda profiling nsight

我正在尝试使用适用于VS 2010的Parallel Nsight 2.1版来优化我的CUDA程序。

我的程序在带有GTX 480板的Windows 7(32位)机器上运行。我已经安装了CUDA 4.1 32位工具包和301.32驱动程序。

程序中的一个循环包括向设备提供主机数据的副本,内核的执行以及从设备到主机的结果复制。

正如您在下面的探查器结果图片中所看到的,内核在四个不同的流中运行。每个流中的内核依赖于“流2”中复制到设备的数据。这就是为什么asyncMemcpy在不同流中启动内核之前与CPU同步的原因。

enter image description here

图中令我恼火的是第一次内核启动结束(10.5778679285)和内核执行开始(10.5781500)之间的巨大差距。启动内核需要大约300美元,这在处理周期小于1毫秒时是一个巨大的开销。

此外,内核执行和结果的数据副本没有重叠回主机,这进一步增加了开销。

这种行为有明显的原因吗?

1 个答案:

答案 0 :(得分:6)

我可以通过跟踪告诉我三个问题。

  1. Nsight CUDA分析每次API调用增加约1μs。您同时启用了CUDA运行时和CUDA驱动程序API跟踪。如果您要禁用CUDA运行时跟踪,我猜您会将宽度减少50μs。

  2. 由于您使用的是Windows 7上的GTX 480,因此您正在执行WDDM驱动程序模型。在WDDM上,驱动程序必须进行内核调用才能提交引入大量开销的工作。为避免减少此开销,CUDA驱动程序缓冲内部SW队列中的请求,并在队列已满时将请求发送到驱动程序,以便通过同步调用刷新请求。可以使用cudaEventQuery强制驱动程序刷新工作,但这可能会产生其他性能影响。

  3. 您似乎正在以深度优先的方式向溪流提交作品。在计算能力2.x和3.0设备上,如果以广度优先的方式提交流,则可以获得更好的结果。在您的情况下,您可能会发现内核之间存在重叠。

  4. 时间轴截图没有为我提供足够的信息来确定在完成所有内核后内存副本的启动原因。给定API调用模式I,您应该能够在每个流完成其启动之后看到传输。

    如果您正在等待所有流完成,那么执行cudaDeviceSynchronize可能比4 cudaStreamSynchronize调用更快。

    下一版本的Nsight将提供其他功能,以帮助理解SW排队以及向计算引擎和内存复制引擎提交工作。

相关问题