私はCortex-Mベースのmicrocontrollerで-127と127の間の値をクランプしようとしています。Cこのブランチレスハックは実際には高速ですか?
2つの競合する関数があります.1つは条件付きのものを使用し、もう1つは分岐なしのハックを使用します。hereです。
// 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;
}
は今、私はこれらのいずれかの方法が他よりも高速であるかもしれないいくつかのケースでは知っている、そしてその逆が、一般的には、それはそれは本当に私には関係ないと見て無店舗技法を使用する価値があります私が使っているのは、私の場合はどちらもうまくいくでしょうか?
マイクロコントローラのバックグラウンドは、ARMベースのマイクロコントローラで、3段階のパイプライン、フェッチ、デコード、実行で90MIPSで動作しますが、何らかの分岐予測器があるようですが、詳細を掘り下げることはできませんでした。
ベンチマークしましたか? –
コードがコンパイルされたときに最適化がオフになっているように見えます。 –
ARMでのパフォーマンスは気になりますが、生成されたASM for x86を検討しています。それはあなたをどこにでもつかまえません。 – hobbs