ショートバージョン
次の行で:
aData[i] = aData[i] + ( aOn * sin( i ) );
aOn
が0
またはの場合1
、プロセッサは実際に乗算を実行しますか、それとも条件付きで結果 ( 0
for 0
、other-value for 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 条件はループ内にある必要があります (上記の例のような条件は 1 つだけではなく、多数の条件があります。また、への変更は、aOn
ループごとではなく、すぐに有効になる必要があります。 )。
if
パフォーマンスの一貫性を無視すると、2 つのオプション間のパフォーマンスのトレードオフは、ステートメントの実行にかかる時間と乗算の時間にあります。
1
いずれにせよ、プロセッサがやのような値に対して実際の乗算を実行しない場合0
、最初のオプションは win-win のソリューション (分岐予測なし、パフォーマンスの向上) になる可能性があることは容易にわかります。