this answer中有人写道


[..]大多数编译器不会将a + b + c + d优化为(a + b)+(c + d)(这是一种优化,因为第二个表达式可以更好地通过管道传递)


最初的问题是,由于浮点运算的不精确性,某些包含float值的表达式如何能够或不能重新排序。

我对以上部分更感兴趣:为什么-如果使用unsigned int值-如果将a+b+c+d重写为(a+b)+(c+d),生成利用CPU管道的代码会更容易吗?

最佳答案

a + b和c + d可以并行计算。

像这样:

x = a+b
y = c+d
return x+y // requires x and y




x = a+b
y = x+c // requires x
return y+d // requires y (and thus x)


计算y时,必须等待x的结果首先出现,它们之间存在数据相关性。请参阅Wikipedia上的Instruction-level parallelism

10-06 03:46