函数调用与内联之间的GLSL性能差异

时间:2017-12-07 22:51:03

标签: performance opengl glsl gpu shading

如果将像+运算符这样简单的东西包装到函数中,它是否会在GLSL中产生性能差异?

例如,这两个场景:

示例1:

in uniform float uValueA;
in uniform float uValueB;

void main()
{
    float value = uValueA + uValueB;
    // [...]
}

示例2:

in uniform float uValueA;
in uniform float uValueB;

float addValues(float a, float b)
{
    return a + b;
}

void main()
{
    float value = addValues(uValueA, uValueB);
    // [...]
}

编译后的最终产品有什么不同吗?或者它们会产生相同数量的指令和性能吗?

2 个答案:

答案 0 :(得分:1)

几年前,当我测试这个特定案例时,我发现函数或内联代码之间没有性能差异。如果我没记错的话,当时我使用Nvidia和/或AMD的工具来查看从GLSL文件生成的汇编代码。这也证实了无论我是否使用过功能,装配都是相同的。这表明函数是内联的。

我建议您在两个版本的着色器的汇编代码中查找自己以说服自己。这个问题(https://gamedev.stackexchange.com/questions/65695/aquire-disassembly-of-shader-code)解释了获取此信息的一些方法。

答案 1 :(得分:0)

您基本上不能假设着色器的优化,因为编译是特定于供应商的。有意义的是,编译器会优化这个非常简单的情况,并内联函数,使两者等效,但这绝不是保证。理论上,它们可以为每个函数调用插入一百万个无操作(尽管编写编译器的人可能会被解雇:))。

也就是说,您可以“预优化”您的GLSL代码,以便在将代码发送到编译器之前执行这些类型的优化(通常是脱机完成的)。 glsl-optimizer经常用于此目的,并在Unity引擎中内置。