我正在从事一个涉及 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 跟踪的屏幕截图。