組み込み関数を使用した先行ゼロの計算
-
27-09-2019 - |
質問
組み込みシステム(FLACデコード、Windows CE、ARM 926 MCU)で動作するコードを最適化しようとしています。
デフォルトの実装はマクロとルックアップテーブルを使用します: ジェネラコディセタグプレ
ただし、ほとんどのCPUには、x86ではbsr
、ARMではclz
という専用の命令がすでにあります( http://www.devmaster.net/articles/fixed-point-optimizations/ )、それはより効率的であるはずです。
Windows CEには、組み込み関数 _CountLeadingZeros があります。その値を呼び出すだけです。ただし、マクロの4倍の速度です(1,000万回の反復で測定)。
専用のASM命令に依存する(はずの)組み込み関数が4倍遅くなる可能性はどのようにありますか?
解決
分解を確認してください。コンパイラが命令を挿入したことを確認しますか?備考セクションに次のテキストがあります:
この関数は次の方法で実装できます ランタイム関数の呼び出し。
それがあなたのケースで起こっていることだと思います。
CLZ命令はARMv5以降でのみ使用可能であることに注意してください。ARMv5コードが必要かどうかをコンパイラに伝える必要があります: ジェネラコディセタグプレ
(Microsoftは「ARMv5」ではなく「ARM5」を誤って使用しています)
所属していません StackOverflow