Optimization GLSL着色器中cos()和sin()函数的速度?
我对OpenGL着色器语言中的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 )
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。这是一个好问题。我也对此感到奇怪
比如说,从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的小ε,那么可能是必要的。但在第一页中,关于它的观点可能不值得