Haw*_*awk 4 profiling cuda nsight
我正在尝试使用适用于VS 2010的Parallel Nsight 2.1版来优化我的CUDA程序.
我的程序在带有GTX 480板的Windows 7(32位)机器上运行.我安装了CUDA 4.1 32位工具包和301.32驱动程序.
程序中的一个循环包括到设备的主机数据的副本,内核的执行以及从设备到主机的结果的复制.
正如您在下面的分析器结果图片中所看到的,内核在四个不同的流中运行.每个流中的内核依赖于"流2"中复制到设备的数据.这就是为什么asyncMemcpy在不同流中启动内核之前与CPU同步的原因.

令我恼火的是第一次内核启动结束(10.5778679285)与内核执行开始(10.5781500)之间的巨大差距.启动内核大约需要300美元,这在一个小于1毫秒的处理周期中是一个巨大的开销.
此外,内核执行和结果的数据副本没有重叠回主机,这进一步增加了开销.
这种行为有明显的原因吗?
我可以通过跟踪告诉我三个问题.
Nsight CUDA分析每个API调用增加约1μs.您同时启用了CUDA运行时和CUDA驱动程序API跟踪.如果您要禁用CUDA运行时跟踪,我猜您会将宽度减少50μs.
由于您使用的是Windows 7上的GTX 480,因此您在WDDM驱动程序模型上执行.在WDDM上,驱动程序必须进行内核调用才能提交引入大量开销的工作.为避免减少此开销,CUDA驱动程序缓冲内部SW队列中的请求,并在队列已满时将请求发送到驱动程序,以便通过同步调用刷新请求.可以使用cudaEventQuery强制驱动程序刷新工作,但这可能会产生其他性能影响.
您似乎正在以深度优先的方式将您的工作提交给流.在计算能力2.x和3.0设备上,如果以广度优先的方式提交流,则可以获得更好的结果.在您的情况下,您可能会看到内核之间的重叠.
时间线截图没有为我提供足够的信息来确定在完成所有内核之后内存副本的启动原因.给定API调用模式I,您应该能够在每个流完成其启动之后看到传输.
如果您正在等待所有流完成,那么执行cudaDeviceSynchronize可能比4 cudaStreamSynchronize调用更快.
下一版本的Nsight将具有其他功能,以帮助理解SW排队以及向计算引擎和内存复制引擎提交工作.
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |