【问题标题】:How the Vertex Shaders of OpenGL 4.X process huge number of verticesOpenGL 4.X 的顶点着色器如何处理大量顶点
【发布时间】:2013-11-16 06:37:03
【问题描述】:

在 OpenGL 4.3+ 中,Compute Shader 允许用户显式配置每个块中的线程数以及用于处理数据的块数(glDispatchCompute)。但是,在 Vertex Shader 中,我不需要提供任何线程/块配置。 那么对于顶点着色器,是否有一种自动方式在块/进程之间分配工作负载?当我有大量顶点要处理时,我是否可以明确地为顶点着色器提供配置?

【问题讨论】:

  • 驱动程序/GPU 本身已经安排了大部分管道以这种方式工作。如果它必须使用单个扭曲/波前(线程调度单元)串行转换顶点,那将是非常低效的。由于顶点/片段着色器无法读取相邻顶点/片段的结果,因此它们很容易并行调度。您在计算着色器中明确考虑的调度已经隐式发生在正常渲染管道中。自统一着色器模型以来,负载平衡一直是 GPU 设计的主要部分;你必须在着色器中做一些异国情调(GL4 时代)的事情才能弄乱它
  • 感谢您的 cmets :) 在这种情况下,这是否意味着不同驱动程序之间的工作负载分配机制可能不同?如果我想进行一些数据优化以提高性能,是否可以找出这个分布的任何“模式”? (例如,重新排序顶点以降低缓存未命中率)
  • 要找出模式,您可能可以像这段代码一样使用“原子计数器”,它可以找出光栅化模式:geeks3d.com/20120309/…

标签: opengl glsl vertex-shader


【解决方案1】:

我是否可以明确地为顶点着色器提供配置?

没有。

那么对于顶点着色器,是否有一种自动方式在块/进程之间分配工作负载?

是的。 GPU/驱动程序应该已经在幕后处理了这些问题。

通过在服务器端内存中使用大批量,您已经告诉 OpenGL 实现尽可能快地渲染它们。

这不像 OpenGL 以某种“慢”模式启动,你必须关闭它。

【讨论】:

  • 感谢您的快速回复。因此,在这种情况下,驱动程序负责处理器之间的工作负载分配。但是程序员是否有可能知道驱动程序/GPU是如何做到的,以防我们想要进行数据优化(例如顶点缓存优化)以获得更好的性能
  • ARB_debug_output 或特定于供应商的扩展(如果存在)可能公开类似的信息。可能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2016-05-04
  • 2012-08-05
  • 1970-01-01
相关资源
最近更新 更多