在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。