Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Optimization GLSL着色器中cos()和sin()函数的速度?_Optimization_Opengl_Glsl_Shader_Jogl - Fatal编程技术网

Optimization GLSL着色器中cos()和sin()函数的速度?

Optimization GLSL着色器中cos()和sin()函数的速度?,optimization,opengl,glsl,shader,jogl,Optimization,Opengl,Glsl,Shader,Jogl,我对OpenGL着色器语言中的sin()和cos()的速度感兴趣 报告指出: 内置功能基本上分为三类: 它们代表了图形硬件可能在某个点加速的操作。三角函数属于这一类 类别 编辑: 如前所述,计算单个操作(如sin()和cos()的时钟周期并不能真正说明整个性能 为了澄清我的问题,我真正感兴趣的是,对于常见情况,是否值得优化掉sin()和cos()调用 例如,在我的应用程序中,参数0非常常见。这样做有意义吗: float sina, cosa; if ( rotation == 0 )

我对OpenGL着色器语言中的
sin()
cos()
的速度感兴趣

报告指出:

内置功能基本上分为三类:

  • 它们代表了图形硬件可能在某个点加速的操作。三角函数属于这一类 类别
编辑:

如前所述,计算单个操作(如
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()
实现会为我提供这样的优化吗?

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

您必须自己进行测试,但我非常确定着色器中的分支要比
sin
cos
计算昂贵得多。GLSL编译器非常擅长优化着色器,担心这是过早的优化。如果您后来发现,在整个程序中,着色器是瓶颈,那么您可以担心如何优化它

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

例如,在我的应用程序中,参数为0是非常常见的。这样做有意义吗:

float sina, cosa;

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

您的编译器将执行以下两项操作之一

  • 它将发出一个实际的条件分支。在最好的情况下,如果0是一个局部一致的值(这样,着色器组通常一起达到0或非零),则可能会获得更好的性能
  • 它将评估条件的两个方面,并仅存储其中正确一个的结果。在这种情况下,你一无所获
  • 一般来说,使用条件逻辑围绕这样的小性能跳舞不是一个好主意。它需要非常大才有价值,比如
    丢弃
    或其他什么


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

    这是一个好问题。我也对此感到奇怪


    比如说,从2005年左右开始,cos和sin都是主流卡上的单周期。

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

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

    你的意思是什么“现代GPU为
    sin()
    cos()
    ”提供硬件加速?如果它在GPU上运行,可以说是硬件加速的。在任何情况下,你最好的办法就是尝试一下,并对其进行分析,因为如果没有更多的上下文,GPU上的时钟周期在某种程度上是毫无意义的。即使在同一供应商的不同卡之间,执行单元的数量也可能存在差异,因此周期只能说明部分情况。有了这些GPU,我认为您将拥有这些三角函数中最快的执行时间。有趣的问题…正如和问题中指出的,这个问题本质上是无法回答的。特定使用
    sin
    可能不需要任何费用,这取决于您使用它的位置和硬件。@user1118321优点。我修改了我的问题,试图让它更明确一点。对于上面的问题,您可能会发现着色器执行两个分支,然后才决定使用哪个结果。在我看来,您在这里进行的这种优化不值得费心,甚至可能会导致性能降低,而不是性能提高。我在规范中没有看到任何关于sincos()的内容。实际的函数名是什么?这是一个扩展吗?我很抱歉,事实上我认为它可能只是D3D,甚至我认为编译器会隐式地为它生成sin和cos指令。FWIW,有一个ARB片段指令
    SCS
    ,它在x组件中返回sine(input.x),在y组件中返回cos(input.x)。“在汇编代码中”。着色器没有“程序集”。它随着平台的变化而变化。甚至从司机的改版到司机的改版,一个穿制服的分支机构很可能是免费的。我在这种情况下使用过这种技术,但它是合适的。@RobertRouhani感谢AMD GPU ShaderAnalyzer链接。断开链接,下面是对URL的更新:我将实际将0.0值作为顶点属性传递给着色器。但好的一点是,如果我没有测试这个值是否是远离0的小ε,那么可能是必要的。但在第一页中,关于它的观点可能不值得