每个OpenGL管道上有多少个线程?

时间:2018-06-06 03:27:23

标签: multithreading opengl glsl gpu

每个阶段为OpenGL管道确定的线程数是多少?

我的意思是说,我有两个程序:

在一个我有600个三角形,但是这些三角形都在相同的位置,并且非常小,以至于它们被栅格化为单个像素/

另一方面,我只有一个三角形,但这个三角形比我的屏幕大,每个像素着色。

在第一种情况下,顶点着色器有600 * 3个线程,片段着色器有1个线程是有意义的。

在第二种情况下,顶点着色器只有三个线程,片段着色器有1920 * 1080个线程。

但是我不认为这是实际管理线程的方式。

那么在管道的每个阶段实际生成了多少个线程?

有没有办法至少部分影响生成的线程数?

2 个答案:

答案 0 :(得分:2)

你不知道,你可能无法控制它,即使你可以,也可能是一个坏主意。

首先,the OpenGL spec仅定义您可以调用的函数,您使用的参数以及它们的行为方式。完全如何 OpenGL驱动程序和GPU实际执行这是一个实现细节。 GPU创建者开发了大量extensions用于与其硬件不符合规范的接口,但我还没有看到一个能够完成您描述的内容。

因此,实现可以完全按照您的描述进行操作,但可能不会。有大量的变量会影响线程分配:

  • 可用线程
  • 额外负载(来自其他程序)
  • 共享资源
  • 历史调用(前一帧中的输入看起来像什么)
  • 历史着色器性能(片段着色器速度与顶点着色器速度)

但是,常见的实现是根据上述变量将N个线程池动态指定给不同的管道阶段。这意味着,如果您的片段着色器比顶点着色器获得更多的计算,将来可能会为它们分配更多的线程。

答案 1 :(得分:0)

出于对话的目的,我将假设通过" thread",你的意思是"invocation"。 "线程"不存在于GLSL中;只有"调用"。

  

在第一种情况下,顶点着色器有600 * 3个线程,片段着色器有1个线程是有意义的。

不,它不会。

VS的调用频率完全取决于您提供这些三角形的方式。例如,如果它们实际上是相同的三角形,并且您使用索引缓冲区为3个顶点中的每个顶点获取相同的内存位置,则完全可以完全执行VS并且仅执行3次。

片段着色器的定义更不明确。也许硬件意识到所有潜在的光栅化器调用都会覆盖相同的位置......也许它不会赢。此外,即使只写入三角形中的一个片段,大多数光栅化器也会执行多个调用。这些隐藏的调用用于计算纹理坐标的渐变,通常用于使常见情况更快。

  

在第二种情况下,顶点着色器只有三个线程,片段着色器有1920 * 1080个线程。

它可能比这更多。

为了使单个三角形覆盖屏幕上的每个像素,该三角形可能必须大于渲染器的保护带。这意味着三角形可能必须被剪切到视图体积。

因此,虽然VS会产生一个三角形,但光栅化器可能会看到2个甚至3个三角形。

这意味着这些三角形的边缘之间会有重叠区域,其中“#34;隐藏"我所谈到的FS调用将存在。所以你可能会有比你做像素更多的FS调用。

  

那么在管道的每个阶段实际生成了多少个线程?

你不知道。你无法知道。一般来说,你不应该尝试来了解。

  

有没有办法至少部分影响生成的线程数?

是:渲染更多或更少的东西。这将为您提供更多或更少的调用。这就是OpenGL为您提供的所有控制权,以及您应该需要的所有控制权。