1

我正在从事一个涉及 cuda 和 freeglut 的项目,并且我正试图从中获取每一点汁液。

我有一个循环进行一些计算然后绘制。我从 nsight 跟踪中注意到,每秒大约有 100 到 200 毫秒的时间,似乎什么都没做。这简直是​​不能接受的。理想情况下,我希望消除这个失速,因为它使我只能以最快的速度前进 80%-90%。

停顿不会发生在第二个开始时的点上,而是以非常有规律的间隔发生。

我的处理循环看起来像这样

cudaDeviceSynchronize();

kernel_call_1( ... , stream0);

if(T != 0) cudaStreamWaitEvent(stream1, event0, 0);
     cudaMemcpyAsync( ... ,cudaMemcpyDeviceToHost,stream1);


kernel_call_2( ... , stream0);
cudaEventRecord(event0, stream0);


drawGL( ... );

OpenGL 是在与 CUDA 不同的卡上完成的,CUDA 的输出通过 memcpy 被带到主机上,并通过 glTexSubImage3D 推送到 OpenGL。

CUDA 或 OpenGL 或 FreeGLUT 是否会在我背后做任何可能导致失速的事情?

编辑:我注意到的其他事情,NSight 区分了 cpu 和 gpu 帧。如果我查看 cpu 帧,它们似乎会慢慢地与 gpu 不同步。这种情况一直持续到停顿,在这种情况下,单个 cpu 帧运行时间很长,但 gpu 帧继续以相同的速度运行,并将它们拉回同步。OpenGL 是否在我背后进行同步,有什么方法可以控制这种行为吗?

编辑:这是 NSight 跟踪的屏幕截图。 NSight 追踪

4

1 回答 1

0

根据一位 NVIDIA 员工的说法,在提出这个问题时(2014 年),情况如下:

OpenGL 跟踪具有用于 GPU 工作负载事件(绘制调用、命令缓冲区、传输和帧)的单个缓冲区。当这填满时,记录将被转储,导致停顿。请注意 CPU 帧如何超过 GPU 帧结束时间。如果您禁用 OpenGL 跟踪,我认为停顿会消失。我们希望在 4.0 之后的 Nsight 版本中显着减少图形跟踪开销。

所以可能的解决方案是在 Nsight 中禁用 OpenGL 跟踪。

[此答案添加为社区 wiki 条目,以保留评论中的答案并将问题从未回答队列中删除。根据需要随意投票和编辑]。

于 2021-11-01T04:21:02.320 回答