6

2の累乗でシフトすると、論理的な右シフトの実行が速くなるかどうかを知りたいです。

たとえば、

myUnsigned >> 4

より速く

myUnsigned >> 3

皆さんの最初の反応は、このような小さなことについて心配する必要はないということです。正しいアルゴリズムとコレクションを使用して、重要な桁を削減していることを感謝します。私はあなたに完全に同意しますが、私は本当に組み込みチップ(ATMega328)からできる限りのことを絞り出そうとしています-私はちょうど「woohoo!」に値するパフォーマンスシフトを得ました。除算をビットシフトに置き換えることで、これが重要になることをお約束します。

4

9 に答える 9

21

データシートを見てみましょう。

http://atmel.com/dyn/resources/prod_documents/8271S.pdf

私が見る限り、ASR(算術右シフト)は常に1ビットずつシフトし、シフトするビット数を取ることはできません。実行には1サイクルかかります。したがって、右にnビットシフトするとnサイクルかかります。2の累乗は、他の数値とまったく同じように動作します。

于 2010-09-16T11:55:47.110 に答える
5

AVR命令セットでは、算術シフトは一度に1ビットずつ発生します。したがって、この特定のマイクロコントローラーの場合、シフトとは、コンパイラー>> nが実際にn個の個別の操作を行うことを意味します。asr>>3>>4

ちなみに、これはAVRをかなり珍しいものにします。

于 2010-09-16T11:59:34.473 に答える
4

この情報については、プロセッサのドキュメントを参照する必要があります。特定の命令セットであっても、モデルによってコストが異なる場合があります。非常に小さなプロセッサでは、たとえば、1つシフトすると、他の値よりも速くなる可能性があります(一部のIA32プロセッサのローテーション命令の場合ですが、この命令がコンパイラによって生成されることはめったにないためです)。

http://atmel.com/dyn/resources/prod_documents/8271S.pdfによると、ATMega328のすべての論理シフトは1サイクルで実行されます。しかしもちろん、コメントで指摘されているように、すべての論理シフトは1ビットです。したがって、シフトバイのコストはn命令のnサイクルです。n

于 2010-09-16T11:54:04.483 に答える
4

実際、ATMega には、ほとんどの (すべてではないにしても) 他の 8 ビット MCU のようなバレル シフターがありません。したがって、より強力な CPU のような任意の値ではなく、毎回 1だけシフトできます。その結果、4 でシフトすることは、理論的には3 でシフトするより遅くなります。

ただし、ATMegaにはスワップニブル命令があるため、実際x >> 4にはATMegaよりも高速ですx >> 3

であると仮定するxと、uint8_t3つの右シフトx >>= 3によって実装されます。

x >>= 1;
x >>= 1;
x >>= 1;

一方x >>= 4、スワップとビットクリアのみが必要です

swap(x);    // swap the top and bottom nibbles AB <-> BA
x &= 0x0f;

また

x &= 0xf0;
swap(x);

より大きなレジスタ間シフトについては、それを最適化するさまざまな方法もあります

低い部分と高い部分で構成されるuint16_t変数を使用すると、単純にyy0y1y >> 8

y0 = y1;
y1 = 0;

同様y >> 9に最適化することができます

y0 = y1 >> 1;
y1 = 0;

したがって、char で 3 シフトするよりもさらに高速です。


結論として、シフト時間はシフト距離によって異なりますがより長い値や 2 のべき乗でない値の場合、必ずしも遅くなるとは限りません。一般に、8 ビット char 内でシフトするには、最大で 3 つの命令が必要です。

コンパイラ エクスプローラのデモをいくつか示します。

  • 4 の右シフトは、上記の aswapなどによって実現されます。and

      swap r24
      andi r24,lo8(15)
    
  • 3 の右シフトは、3 つの命令で実行する必要があります。

      lsr r24
      lsr r24
      lsr r24
    

左シフトも同様に最適化

x<<1 と x<<10 のどちらが速いですか?も参照してください。

于 2013-07-28T13:06:12.493 に答える
2

プロセッサの構築方法によって異なります。プロセッサにバレル回転がある場合、1 回の操作で任意の数のビットをシフトできますが、チップ スペースと電力バジェットが必要になります。最も経済的なハードウェアは、ラップアラウンド ビットに関するオプションを使用して、1 つずつ右に回転できます。次は左右どちらかに1回転できるもの。1 シフター、2 シフター、4 シフターなどを持つ構造を想像できます。この場合、4 が 3 よりも高速になる可能性があります。

于 2010-09-16T12:08:51.213 に答える
2

最初にコードを逆アセンブルしてから時間をかけます。時間を無駄にしていると人々に言われてがっかりしないでください。あなたが得た知識は、大企業の火を消すための後任者になる立場にあなたを置きます. この業界では、舞台裏の知識を持っている人の数が驚くべき速さで減少しています。

他の人がここで本当の答えを説明したように聞こえますが、どの逆アセンブリが示すか、単一ビットシフト命令です。したがって、4 シフトは 3 シフトにかかった時間の 133% かかり、3 シフトは 4 シフトの時間の 75% になります。そして、あなたの測定値はその違いを反映しているはずです。そうでない場合は、実行時間を完全に理解するまでこの実験を続けます。

于 2010-09-16T21:01:21.703 に答える
1

ターガープロセッサにビットシフト命令がある場合(これは非常に可能性が高いです)、2の累乗ビットのシフトと他の数値のシフトの間に違いがあるかどうかは、その命令のハードウェア実装に依存します。ただし、違いが生じる可能性はほとんどありません。

于 2010-09-16T11:52:46.577 に答える
0

あらゆる点で、測定を開始するまで、パフォーマンスについて話し始めることはできません。プログラムを除算でコンパイルします。走る。時間を測定します。シフトで繰り返します。

于 2010-09-16T11:59:06.330 に答える