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