ほとんどの最新の 64 ビット プロセッサ (Intel Core 2 Duo や Intel i7 シリーズなど) では、x86_64 コマンドmulq
とそのバリアントの速度はオペランドに依存しますか? たとえば、乗算11 * 13
は よりも高速11111111 * 13131313
ですか? それとも、常に最悪の場合の時間がかかりますか?
3 に答える
6
TL;DR: いいえ。定数長の整数演算 (非線形の除算を除く) は、オペランドの数値に関係なく、一定数のサイクルを消費します。
mulq
2 つの QWORD 引数を取ります。
値は、次のようにリトル エンディアン バイナリ形式 (x86 アーキテクチャで使用) で表されます。
1011000000000000000000000000000000000000000000000000000000000000 = 13
1000110001111010000100110000000000000000000000000000000000000000 = 13131313
どちらも 64 ビット値であるため、プロセッサはこれらの両方を同じ「サイズ」と見なします。
したがって、オペランドの実際の数値に関係なく、サイクル カウントは常に同じである必要があります。
より詳しい情報:
浮動小数点演算を高速化するために使用できる先行ゼロ予測と先行ゼロ検出 [ 1 ][ 2 ] (LZA / LZD )の概念があります。
ただし、私の知る限り、これらの方法のいずれかを整数演算に使用する主流のプロセッサはありません。これは、ほとんどの整数演算 (この場合は乗算) の単純な性質による可能性が最も高いです。LZA/LZD のオーバーヘッドは、とにかく短い時間で完全な乗算を完了することができる単純な整数演算回路の場合、それだけの価値がない場合があります。
于 2012-06-05T19:49:38.117 に答える
2
手元に参照はありませんが、オペランドの値が不変であるレイテンシ/スループットにお金をかけます。そうでなければ、スケジュールを立てるのは悪夢です。
于 2012-06-05T19:47:19.627 に答える