【发布时间】:2017-07-22 15:32:15
【问题描述】:
在不讨论过早优化的情况下,我有几个关于 g++ 或其他编译器在选择相关编译器标志时如何处理 SSE 优化的问题:
-
为了在多行代码上执行 SSE 指令,是否需要重新排序多行代码?例如
a[0] = a1+a2+a3; x[0] = a1*a1; a[1] = b1+b2+b3; x[1] = b1*b1; a[2] = c1+c2+c3; x[2] = c1*c1;编译器在哪里可以将这些行重新排序为两组 SSE 指令?
-
编译器是否意识到何时采用类似的操作集(不在数组中)并将它们组合成 SSE 指令?例如
a = a1+a2+a3; b = b1+b2+b3; c = c1+c2+c3; -
编译器是否优化了 for 循环中的指令以进行 SSE 优化?例如
for(unsigned int i = 0; i < 4; i++) { x[i] = x[i]*k; a[i] = a[i]*c; }
编译器在尝试优化时会结合 1、2 和 3 吗?
听听人们对各种 SSE 优化编译器的想法会很有趣。
edit:我主要是在询问 g++,但其他“主流”编译器也很有趣。我也主要谈论浮点运算。
【问题讨论】:
-
您只是在谈论 float/double 上的严格垂直操作吗?因为整数、不动点等,以及需要扩大/缩小或排列的操作是另一回事......
-
这是一个有趣的问题,但目前范围太广。 “编译器”实际上是无限的。如果你能把它缩小到一个特定的编译器,那么它会变得更有责任感。你已经标记了它 [g++];这是否意味着您只想专注于 GCC?
标签: g++ compiler-optimization sse