opengl 我应该如何制作使用GPU进行计算的多线程程序?

p5cysglq  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(145)

我正在制作一个使用计算着色器的模拟程序,我遇到了一个问题。我目前正在使用OpenGL上下文来渲染GUI的东西,以控制和观看模拟。我使用相同的上下文来调用glDispatchCompute。
这可能会导致程序窗口冻结,因为模拟可能在任何UPS下运行(如每秒0.1 - 10000次更新),而窗口应以固定的FPS更新(显示刷新率,通常为60 FPS)。
当模拟很慢并且一步需要例如600毫秒来计算时,这就成了一个问题。交换缓冲区函数等待所有计算着色器执行,因此- FPS下降。
我如何使更新和渲染彼此独立?在CPU上我可以只产生第二个线程,但OpenGL上下文不是多线程的。我应该使用Vulkan来完成这个任务吗?

643ylb08

643ylb081#

即使使用Vulkan,也无法将一大块工作推到GPU上,并 * 保证 * 稍后的图形工作只会中断GPU的处理。处理这一问题的最可靠方法是将计算工作分成一定大小的块,您可以合理地确定这些块不会中断帧速率,并将它们与渲染命令交错。
Vulkan提供了一些方法,允许GPU执行可中断的工作,但不需要任何特殊的中断功能。你可以创建一个优先级最低的计算队列,创建一个优先级最高的图形队列。但即使这样,也需要假设:

  1. Vulkan实现提供了多个队列,而许多嵌入式实现则没有。
    1.队列优先级实现会在提交高优先级工作时抢占正在进行的工作。这种情况 * 可能 * 发生,但规范没有提供任何保证。Here is some documentation about the behavior of GPUs,因此其中一些可以处理这种情况。它已经有几年的历史了,所以最近的GPU可能更好,但它应该让你开始。
    总的来说,Vulkan * 可以 * 提供帮助,但是您需要对其进行分析,如果您关心没有足够队列来做任何事情的实现,您需要有一个后备方案。
    当然,OpenGL在这方面的用处更小,因为它根本没有显式的队列系统。因此,将工作分开是确保计算任务不会使渲染器饥饿的唯一方法。

相关问题