ビット演算のTips集。
The Aggregate Magic Algorithms
DSPのようにパイプラインが深いCUPの場合*1、if文などの条件分岐があるとせっかくパイプラインに先読みしてあった命令が全てキャンセルされて時間ロスが生じる。なのでソフトウェアの時間制約が厳しい場合は極力条件文を避ける必要がある。
例えば、xの絶対値をyに代入する場合、
float x, y; if (x < 0) { y = x * -1; } else { y = x; }
の代わりに
float x, y; y = x; *((int *) &y) &= 0x7fffffff;
のように書くと速度が向上する場合がある*2。
なのでDSPのプログラムを書くときにはビット演算は知っておいて損は無い。
(追記)
手元のDSPで実測してみた。CUPサイクル数と処理時間はif文の場合を基準に差分で表示してある。
方法 | サイクル数 | 処理時間[ns] |
if文 | 0 | 0 |
fabs() | -384 | -575 |
ビット演算 | -400 | -599 |