24

今日、この抜粋に出くわしました:

ほとんどの古いマイクロプロセッサでは、ビット演算は加算および減算演算よりもわずかに高速で、通常は乗算および除算演算よりも大幅に高速です。最新のアーキテクチャでは、これは当てはまりません。ビット単位の演算は、通常、加算と同じ速度です (ただし、乗算よりも高速です)。

古いマイクロプロセッサでビット単位の演算が加算/減算演算よりもわずかに高速だった理由に興味があります。

レイテンシの原因と考えられるのは、加算/減算を実装する回路がいくつかのレベルの論理ゲート (並列加算器など) に依存しているのに対し、ビット単位の演算にははるかに単純な回路実装があることです。これが理由ですか?

最新のプロセッサでは、算術演算とビット単位の演算の両方が 1 クロック サイクル内で実行されることは知っていますが、純粋に回路の伝搬時間について言えば、最新のプロセッサでは理論的にはまだレイテンシが存在しますか?

最後に、ビットごとのシフト操作の実行に関する概念的な C の質問がありました。

unsigned x = 1;
x <<= 5;

unsigned y = 0;
y += 32;

xとの両方yが値を保持する必要があります32が、その値に到達するために5 つの個別の左シフトが必要でしxたか (パイプを介して実装されたビット単位のシフトのように)? 明確にするために、クロックサイクル数ではなく、回路の動作について純粋に質問しています。

4

6 に答える 6

26

任意のバイナリ ビット演算では、各出力ビットは、入力内の対応する 2 つのビットのみに依存します。加算演算では、各出力ビットは、入力内の対応するビットと、右側 (低い値に向かって) のすべてのビットに依存します。

たとえば、01111111 + 00000001 の左端のビットは 1 ですが、01111110 + 00000001 の左端のビットは 0 です。

最も単純な形式では、加算器は 2 つの下位ビットを加算し、1 つの出力ビットとキャリーを生成します。次に、次の 2 つの最下位ビットが追加され、キャリーが追加されて、別の出力ビットと別のキャリーが生成されます。これが繰り返されます。したがって、最上位の出力ビットは加算チェーンの最後にあります。古いプロセッサのように少しずつ操作を行うと、最後まで時間がかかります。

いくつかの入力ビットをより複雑なロジック構成に供給することにより、これを高速化する方法があります。しかしもちろん、それにはチップ内のより多くの領域とより多くの電力が必要です。

今日のプロセッサには、ロード、ストア、加算、乗算、浮動小数点演算など、さまざまな種類の作業を実行するためのさまざまなユニットがあります。今日の機能を考えると、加算を行う作業は他のタスクに比べて小さいため、単一のプロセッサ サイクルに収まります。

おそらく、理論的には、ビット演算を加算よりも高速に実行するプロセッサを作成できます。(そして、少なくとも紙の上では、異なるユニットが独自のペースで作業を行う、非同期で動作するエキゾチックなプロセッサがあります。) しかし、使用中の設計では、プロセッサ内の多くのことを調整するための定期的な固定サイクルが必要です。実行ユニットへのディスパッチ、実行ユニットからレジスタへの結果の送信など、さまざまな機能があります。一部の実行ユニットは、ジョブを完了するのに複数のサイクルを必要とします (たとえば、一部の浮動小数点ユニットは、浮動小数点加算を行うのに約 4 サイクルかかります)。だから、あなたはミックスを持つことができます。ただし、現在のスケールでは、加算ではなくビット演算に適合するようにサイクル時間を短くすることは、経済的ではない可能性があります。

于 2013-03-27T20:35:04.010 に答える
4

加算の複雑な点 (通常は無料で減算できます) は、厄介なキャリーの問題があることです。

したがって、単純なソリューションは N 倍の全加算器になります。ここで、N は ALU のビット幅です。

これらの厄介なキャリーは、多くの伝搬遅延があることを意味します。また、1 回のキャリー オフによって結果全体が不正確になる可能性があるため、すべてのキャリー値と順番にチェーンの他のすべての全加算器が安定するまで、かなりの時間を待たなければなりません。

この特定のボトルネックを回避する方法はたくさんありますが、全加算器のチェーンほど実装が単純でリソースが安価なものはありません。(シリコンに実装されたルックアップ テーブルが最速)

詳細が必要な場合は、代わりにhttp://electronics.stackexchange.comで質問する必要があります。

于 2013-03-27T20:38:16.987 に答える
2

最後の質問に答えるには、場合によって異なります。一部のアーキテクチャ (z80 など) は 1 だけシフトし、一部のアーキテクチャはより大きな定数や変数によるシフトを公開しますが、それらを「1 ずつシフト」の束として内部的に実装します (x86 の古い実装など)。 1 サイクルで 1 以上シフトできるアーキテクチャもありますが、シフト量が一定の場合のみ、バレル シフターを使用し、1 サイクルで変数をシフトできるアーキテクチャ (x86 の最新の実装など) があります。 、まだまだ可能性はあります。

バレル シフターの回路の深さは、それが実行できる最大シフトの対数です。これは、必ずしもレジスターの幅ではありません。幅よりも 1 小さい場合があり、さらに小さいと考えられます。

于 2013-03-28T11:23:34.380 に答える
0

一部の追加の実装では、キャリー ビットに対して追加のサイクルを実行する必要があります。例: 16 ビット整数は、8 ビット プロセッサで複数の命令を必要とします。これはシフトにも当てはまります。ただし、シフトは常に高さビットを次のバイトの下位ビットにシフトできます。加算は、追加ラウンドで下位ビットを加算する必要があります。

于 2013-03-27T20:38:56.020 に答える
-1

ビット単位の演算子は、より短い時間で実行されます。

  • プロセッサは、ビット単位の演算を実行するために 1 つの命令を使用し、(たとえば) 1 つの実行サイクルを使用します。一方、他の算術命令 (特に、乗算と除算) はより多くの実行サイクルを使用します。
  • ほとんどの場合、ビット単位の演算は 1 つのレジスタで実行され、他の算術命令は複数のレジスタを処理する必要があります。

そのため、ビットのシフトは他の算術演算よりも高速です

于 2013-03-27T20:37:08.027 に答える
-2

これは、イントロからアセンブリクラスまで輝いていました。ただし、シフトは、プロセッサが実行できる最速の命令にすぎません。加算と減算を実行するには、いくつかの命令が必要です。最新のプロセッサはより最適化されていると思います。

おそらく、誰かがこれにもっと正確かつ徹底的に答えることができるでしょう。

于 2013-03-27T20:30:12.563 に答える