18

我对Open GL Shader Languagesin()的速度和cos()相关信息感兴趣。

GLSL 规范文档指出:

内置函数基本上分为三类:

  • ...
  • ...
  • 它们代表一个操作图形硬件可能会在某个时候加速。三角函数属于这一类。

编辑:

正如已经指出的那样,计算单个操作的时钟周期sin()cos()不能真正说明整个性能故事。

因此,为了澄清我的问题,我真正感兴趣的是是否值得优化sin()cos()呼吁常见案例。

例如,在我的应用程序中,参数为0. 那么这样的事情是否有意义:

float sina, cosa;

if ( rotation == 0 )
{
   sina = 0;
   cosa = 1;
}
else
{
   sina = sin( rotation );
   cosa = cos( rotation );
}

或者GLSL编译器或sin()cos()实现会为我处理这样的优化吗?

4

6 回答 6

20

例如,在我的应用程序中,参数为 0 是很常见的。所以这样的事情是否有意义:

不。

你的编译器会做两件事之一。

  1. 它将发出一个实际的条件分支。在最好的情况下,如果 0 是一个局部一致的值(这样着色器组通常会一起达到 0 或非零值),那么您可能会获得改进的性能。
  2. 它将评估条件的双方,并且只存储其中正确一方的结果。在这种情况下,你一无所获。

一般来说,使用条件逻辑来围绕这样的小型表演跳舞并不是一个好主意。它需要非常大才有价值,比如 adiscard或其他东西。

另外,请注意浮点等价不太可能起作用。除非您实际上将包含 0.0 的统一或顶点属性传递给着色器,否则不会。即使在 0 和非零之间进行插值也可能永远不会为任何片段产生精确的 0。

于 2012-04-14T19:46:40.750 回答
9

这是一个很好的问题。我也想知道这一点。

自 2005 年左右以来,Google 的链接在主流卡cos上都是单周期的。sin

于 2012-08-06T06:23:18.267 回答
5

你必须自己测试一下,但我很确定着色器中的分支比sinorcos计算要昂贵得多。GLSL 编译器在优化着色器方面做得很好,担心这是过早的优化。如果你后来发现,在你的整个程序中,你的着色器是瓶颈,那么你可以担心优化它。

如果您想查看特定平台的着色器的汇编代码,我建议您使用AMD GPU ShaderAnalyzer

于 2012-04-14T19:46:08.823 回答
2

不确定这是否回答了您的问题,但很难告诉您一条指令需要多少个时钟/插槽,因为它在很大程度上取决于 GPU。通常是一个循环。但即使不是,编译器也可能重新排列指令执行的顺序以隐藏真正的成本。对 sin/cos 使用纹理查找肯定会更慢,因为它是执行指令。

于 2012-04-14T16:28:06.053 回答
1

看看你可以在一个着色器中连续获得多少罪孽,与 math.abs、frac 等相比......我认为 gtx 470 每个片段可以处理 200 个罪孽函数,没有问题,帧将比空着色器。它非常快,您可以发送结果。这将是计算效率的一个很好的指标。

于 2014-08-19T15:45:02.137 回答
-1

编译器评估两个分支,这使得条件非常昂贵。如果在着色器中同时使用 sin 和 cos,则只能计算 sin(a) 和 cos(a) = sqrt(1.0 - sin(a)),因为 sin(x)*sin(x) + cos(x)* cos(x) 始终为 1.0

于 2015-08-14T17:49:23.447 回答