在不使用互操作性的情况下并行运行CUDA和OpenGL

时间:2014-06-10 19:09:41

标签: c++ opengl cuda

我正在使用nVidia Tesla C2050 GPU构建实时信号处理和显示系统。设计使得信号处理部分作为单独的程序运行并使用CUDA进行所有计算。同时,如果需要,我可以启动一个单独的显示程序,使用OpenGL显示处理过的信号。由于设计是将进程作为独立进程运行,我没有任何CUDA-OpenGL互操作性这两个程序相互交换数据UNIX流套接字。

信号处理程序大部分时间都使用GPU来处理CUDA。我每隔50毫秒刷新一次OpenGL帧,而CUDA程序每次运行大约700毫秒,两次连续运行通常由30-40毫秒。当我一次运行一个程序(即只有CUDA或OpenGL部件正在运行)时,一切都运行良好。但是当我一起启动程序时,显示器也不是它应该是的,而CUDA部件产生正确的输出。我检查了套接字实现,我相信套接字工作正常。

我的问题是,由于我只有一个GPU而且没有CUDA-OpenGL互操作性,并且两个进程都定期使用GPU,CUDA内核和OpenGL内核之间的上下文切换是否可能相互干扰。我是否应该将设计更改为使用单个程序来运行具有CUDA-OpenGL互操作性的部件。

1 个答案:

答案 0 :(得分:4)

计算能力5.0及更少的设备无法同时运行图形和计算。 Tesla C2050不支持任何形式的抢占,因此在CUDA内核执行时,GPU不能用于渲染OpenGL命令。 CUDA-OpenGL互操作无法解决这个问题。

如果你有一个GPU,那么最好的选择是将CUDA内核分解为更短的启动时间,以便GPU可以在图形中的计算之间切换。在前面提到的情况下,CUDA内核的执行时间不应超过50ms - GLRenderTime。

使用第二个GPU进行图形渲染将是更好的选择。