【发布时间】:2013-07-06 09:30:47
【问题描述】:
简短版
在下面一行:
aData[i] = aData[i] + ( aOn * sin( i ) );
如果aOn 是0 或1,处理器是实际执行乘法运算,还是有条件地计算结果(0 对应0,其他值对应1)?
长版
我正在研究算法性能一致性,其中部分涉及到Branch Prediction 的效果。
假设是这段代码:
for ( i = 0; i < iNumSamples; i++ )
aData[i] = aData[i] + ( aOn * sin( i ) );
将提供比此代码更稳定的性能(分支预测可能会破坏性能):
for ( i = 0; i < iNumSamples; i++ )
{
if ( aOn )
aData[i] = aData[i] + sin( i );
}
aOn 是0 或1,它可以在另一个线程执行循环期间切换。
实际的条件计算(上例中的+ sin( i ))涉及到更多的处理,并且if条件必须在循环内(有多种条件,不仅仅是上例中的一个;另外,更改为@987654335 @ 应该立即生效,而不是每个循环)。
忽略性能一致性,两个选项之间的性能权衡在于执行 if 语句和乘法的时间。
无论如何,很容易发现,如果处理器不会对 1 和 0 等值执行实际乘法,则第一个选项可能是双赢的解决方案(无分支预测,性能更好)。
【问题讨论】:
-
编译器很可能会将这些优化掉。
-
我检查过优化和不优化,这对
0、1和任何其他数字的乘数之间的相对性能没有影响(尽管优化确实在所有情况下都会略微提高性能) .那么优化究竟与处理器是否进行乘法相关? -
@iamnotmaynard 除非 aOn 是常量,否则编译器无法优化它,但 OP 没有给出任何指示。
标签: c++ c performance algorithm processors