Cortex-M ベースのマイクロコントローラーで -127 から 127 の間の値をクランプしようとしています。
競合する 2 つの関数があり、1 つは条件を使用し、もう 1 つは分岐のないハックを使用します。
// Using conditional statements
int clamp(int val) { return ((val > 127) ? 127 : (val < -127) ? -127 : val); }
// Using branchless hacks
int clamp(int val) {
val -= -127;
val &= (~val) >> 31;
val += -127;
val -= 127;
val &= val >> 31;
val += 127;
return val;
}
場合によっては、これらの方法の1つが他の方法よりも高速である可能性があり、その逆もあることがわかりましたが、一般的には、どちらを使用してもかまわないので、ブランチレス技術を使用する価値があります。私の場合はうまくいきますか?
マイクロコントローラの背景を少し説明すると、これは 90 MIPS で動作する ARM ベースのマイクロコントローラで、3 段階のパイプライン、フェッチ、デコード、実行を備えており、ある種の分岐予測子があるようですが、詳細を掘り下げることはできませんでした。