glsl矢量化数据相乘

时间:2014-03-20 18:39:15

标签: opengl glsl

这(在GLSL顶点着色器中)是否更快

 float f1, f2, f3, f4;
 float v1, v2, v3, v4;

 vec4 m = vec2(f1*v1, f2*v2, f3*v3, f4*v4);

比这个?

 float f1, f2, f3, f4;
 float v1, v2, v3, v4;
 float m1, m2, m3, m4;

 m1 = f1*v1;
 m2 = f2*v2;
 m3 = f3*v3;
 m4 = f4*v4;

已更新

这个案子怎么样?

 vec4 m = vec2(f1/v1, f2*v2, f3+v3, f4-v4);

1 个答案:

答案 0 :(得分:2)

使用下降编译器,2个代码应生成相同的机器二进制文件。 在这种情况下,您应该关注可读性。一个简单的代码如下:

vec4 f = vec4(f1, f2, f3, f4);
vec4 v = vec4(v1, v2, v3, v4);
vec4 m = f * v;
  

这个案子怎么样?

下降编译器可能会将代码保留为标量(或标量simd)单位。它将尝试查找类似的指令并将它们打包在一起以用于VLIW,SSE样式指令。它还可以查看其他指令及其依赖关系然后命令指令来改进缓存,流水线操作,乱序执行,并行ALU,使用MAD,FMA等指令...... 它实际上取决于硬件和编译器/优化器行为。 通常,编译器不会做似乎正确的事情。相反,它会尝试减少缓存抖动和注册压力,从而有机会隐藏延迟。