- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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 互操作性的部件。
最佳答案
计算能力 5.0 及更低版本的设备无法同时运行图形和计算。 Tesla C2050 不支持任何形式的抢占,因此当 CUDA 内核正在执行时,GPU 不能用于渲染 OpenGL 命令。 CUDA-OpenGL 互操作没有解决这个问题。
如果您只有一个 GPU,那么最好的选择是将 CUDA 内核分成更短的启动时间,以便 GPU 可以在图形计算之间切换。在上述情况下,CUDA 内核的执行时间不应超过 50 毫秒 - GLRenderTime。
使用第二个 GPU 进行图形渲染会是更好的选择。
关于c++ - 在不使用互操作性的情况下并行运行 CUDA 和 OpenGL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24149059/
我是一名优秀的程序员,十分优秀!