亲爱的CUDA用户我正在转发来自nvidia董事会的问题: 我目前正在GPU上进行图像处理,我有一个内核,在大图像上运行时需要500到700毫秒的时间。它曾经在较小的图像上完美地工作,但现在的问题是整个显示器甚至鼠标光标都变得迟钝(OS = win7)
我的想法是在4或8次内核启动中拆分我的内核,希望驱动程序可以更频繁地刷新(在每次内核启动之间)。
不幸的是它根本没用,所以我还能尝试什么来避免这种冻结的显示效果呢?我被建议在每个内核之间添加一个cudaStreamQuery(0)
调用,以避免被驱动程序打包。
注意:我准备交易表演以获得顺畅!
答案 0 :(得分:4)
GPU尚未设计用于内核启动之间的上下文切换,这就是为什么长时间运行的内核导致延迟显示的原因。将内核分成多个启动可能对Windows Vista / Windows 7以外的平台有所帮助。在这些平台上,每次CUDA驱动程序想要时,Windows显示驱动程序模型都需要昂贵的用户 - >内核转换(“内核thunk”)将工作提交给GPU。
为了分摊内核thunk的成本,CUDA驱动程序将GPU命令排队并批量提交。驱动程序使用启发式方法来处理来自内核thunk的性能损失与不立即提交工作的增加的延迟。多内核解决方案发生的事情是驱动程序一次性将内核或一系列内核提交给GPU。
您是否尝试过cudaStreamQuery(0)建议?可能有帮助的原因是因为它强制 CUDA驱动程序将工作提交给GPU,即使很少有工作要处理。