5

組み込みシステム(FLACデコード、Windows CE、ARM 926 MCU)で動作するコードを最適化しようとしています。

デフォルトの実装では、マクロとルックアップテーブルを使用します。

/* counts the # of zero MSBs in a word */
#define COUNT_ZERO_MSBS(word) ( \
 (word) <= 0xffff ? \
  ( (word) <= 0xff? byte_to_unary_table[word] + 24 : \
              byte_to_unary_table[(word) >> 8] + 16 ) : \
  ( (word) <= 0xffffff? byte_to_unary_table[word >> 16] + 8 : \
              byte_to_unary_table[(word) >> 24] ) \
)

static const unsigned char byte_to_unary_table[] = {
    8, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4,
    3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};

bsrただし、ほとんどのCPUには、x86およびclzARM(http://www.devmaster.net/articles/fixed-point-optimizations/ )に専用の命令がすでにあり、より効率的です。

_CountLeadingZerosWindows CEには、その値を呼び出すだけの組み込み関数があります。ただし、マクロの4倍の速度です(1,000万回の反復で測定)。

専用のASM命令に依存する(はずの)組み込み関数が4倍遅くなる可能性はありますか?

4

1 に答える 1

6

分解を確認してください。コンパイラが命令を挿入したことを確認しますか?備考セクションには、次のテキストがあります。

この関数は、ランタイム関数を呼び出すことで実装できます。

それがあなたの場合に起こっていることだと思います。

CLZ命令は、ARMv5以降でのみ使用可能であることに注意してください。ARMv5コードが必要かどうかをコンパイラーに通知する必要があります。

/QRarch5 ARM5 Architecture
/QRarch5T ARM5T Architecture

(Microsoftは「ARMv5」の代わりに「ARM5」を誤って使用しています)

于 2010-10-28T16:45:20.050 に答える