[英]How should I make multithreaded program that uses GPU for computation?
我正在制作使用计算着色器的模拟程序,但遇到了问题。 我目前正在使用 OpenGL 上下文来呈现 GUI 内容以控制和观看模拟。 我使用相同的上下文来调用 glDispatchCompute。
这可能会导致程序 window 冻结,因为模拟可能在任何 UPS 中运行(例如每秒 0.1 - 10000 次更新),而 window 应该以固定 FPS 更新(显示刷新率,通常为 60 FPS)。
这成为一个问题,当模拟很慢并且单步需要,例如 600 毫秒来计算。 交换缓冲区 function 等待所有计算着色器执行,因此 - FPS 下降。
如何使更新和渲染相互独立? 在 CPU 上,我只能生成第二个线程,但 OpenGL 上下文不是多线程的。 我应该使用 Vulkan 来完成这项任务吗?
即使使用 Vulkan,也无法将大量工作推到 GPU 并保证后面的图形工作只会中断 GPU 的处理。 处理这个问题的最可靠方法是将您的计算工作分解成一定大小的块,您可以合理地确定这些块不会破坏您的帧速率并将它们与您的渲染命令交织在一起。
Vulkan 提供了允许GPU 执行可中断工作的方法,但不需要任何特定的中断功能。 您可以创建优先级最低的计算队列,并创建优先级最高的图形队列。 但即使这样假设:
Vulkan 实现提供了多个队列。 许多嵌入式的没有。
如果提交了更高优先级的工作,队列优先级实现将抢占正在进行的工作。 这可能会发生,但规范不提供任何保证。 Here is some documentation about the behavior of GPUs ,因此其中一些可以处理。 它已经有几年历史了,所以更新的 GPU 可能会更好,但它应该可以帮助您入门。
总体而言,Vulkan可以提供帮助,但您需要对其进行概要分析,如果您关心没有足够队列来执行任何操作的实现,则需要进行回退。
OpenGL 对此的用处当然更少,因为它根本没有明确的排队系统。 因此,分解工作确实是确保计算任务不会使渲染器饿死的唯一方法。
问题未解决?试试以下方法:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.