コンピューターは実際にキャリールックアヘッド加算器を使用していますか?


12

大学のCSコースには、Kogge-Stone、Lander-Fischerなどのキャリールックアヘッドアダーに関する多くの詳細があります。それらは「業界で一般的」と表現されています。ただし、実際には具体的にどこでも使用されているという最近の証拠はありません(おそらくマンチェスターのキャリーチェーンを除いて)。Google検索では、ジャーナルと学術研究のページのみが返されます。せいぜい、架空の実装が与えられます。

私の質問は、キャリールックアヘッド加算器が使用される特定の場所/実装はありますか?または、それらは現実の世界とは無関係ですか?


1
高性能プロセッサのサイクルタイムとそれらのシングルサイクルによるレイテンシの増加は、リップルキャリーを使用していないことを示しています(ただし、これによりキャリーセレクトが可能になります)。Intelの22nmプロセスであっても、64ビットを300ps未満で波打つことはほとんどありません。
ポールA.クレイトン

@ PaulA.Claytonキャリーセレクトまたはデコーダーのような加算器が使用されているいくつかのデータシートを見ると、印象がわかります。
qwr 2014

回答:


16

これは、非常に複雑な答えを持つ簡単な質問です。

まず、いくつかの背景。

実際のVLSI設計は、絶えず変化するトレードオフのバランスを特徴とする非常に技術的な分野です。回路が回答を計算するのにかかる時間は、めったに重要な要素ではありません。また、消費電力と物理的領域に加えて、設計している回路が実際にアナログであることを明らかにする一連の要因(配線抵抗、寄生容量など)もあります。これらはすべて実際の回路で重要であり、どのデザインを選択するかに影響を与える可能性があります。

次に、プロジェクトのライフサイクル全体を考慮する必要があります。VLSIの実現に適切な加算器は、FPGAの実現には適切でない場合があります。デザインがFPGAでテストされているフェーズを通過する場合は、状況を把握できます。

第三に、すべての加算器が等しくなるわけではありません。典型的なCPUには、さまざまなタスクを実行する多くの加算器があります。おそらく、いくつかの整数ALU、浮動小数点仮数加算器、アドレス計算を行う加算器、分岐ターゲットを計算する加算器などがあります。それはあなたが現代の乗算ユニットで見つけるキャリーセーブ加算器を数えていません。それぞれに独自の特性と制約があります。

たとえば、分岐ターゲットの計算では、通常、フルワードに小さな定数を追加します。これは、2つのフルワードを加算するものとは異なる加算器の設計を示唆しています。同様に、浮動小数点加算では、加算後の丸めステップが必要であり、1サイクル未満で済むため、残りのサイクルを盗んで加算を終了できなかった理由はありません。

最後に、そしておそらく最も重要なこととして、ビッグプレーヤー(Intel、AMD、NVIDIAなど)は、ペーパーや特許を取得できると思わない限り、明白な理由により、低レベルの実装の詳細についてかなり緊張しています。それでも、リバースエンジニアリングを行わないと、実際に何をしたのかわからないことがよくあります。

そうは言っても、私たちが知っていることがいくつかあります。

理解する必要がある重要なことは、キャリールックアヘッドメソッドはビルディングブロックであり、必ずしもメソッド自体ではないということです。ここで類推が正しいかもしれません。

アルゴリズムクラスについて考える場合、クイックソート、マージソート、挿入ソートなどのソートアルゴリズムの束をおそらく学んだでしょう。現実の世界では、ソートがパフォーマンスのボトルネックである場合、まともなエンジニアは、これらを「実際の」ソートを構築できる原始的な構成要素と考えるでしょう。

たとえば、GNU C ++標準ライブラリのソートアルゴリズムでは、間隔が十分に小さくなると挿入ソートを使用して、クイックソートを使用します。ただし、数回パスした後、クイックソートパーティショニングが病理学的動作に影響を与えたように見える場合は、ヒープソートにフォールバックします。これは、1つの産業レベルのソートを作成するための3つの異なるソートアルゴリズムです。

同じことが加算回路にも当てはまります。たとえば、Pentium 4整数ユニットは、Kogge-StoneとBrent-Kungの混合であるHan-Carlson加算器を使用したことが知られています。(Han-Carlsonは特に興味深いものです。これは、伝搬遅延とダイ領域の間のトレードオフにおける「スイートスポット」であり、電力効率も非常に高いためです)。

「純粋な」キャリールックアヘッド加算器は、合成回路の標準です(たとえば、Verilogの「+」演算子をCadenceまたはSynopsysにフィードする場合)。手のデザインに関しては、スーパースカラーを備えた最新のハイエンドCPU順序実行エンジンは、整数ユニットの設計が少し異なる方向に向かっているようです。

投機的加算器は、伝搬遅延が非常に小さい回路ですが、正しく動作するのは一部の時間(95%の時間は通常)であり、非常に少ないロジックで、投機的加算器が正しい結果を返すかどうかを判断することができます。つまり、1つのサイクルで、投機的加算とキャリールックアヘッド加算の半分を並行して実行するという考え方です。投機的加算器が正しい答えを返した場合、命令は完了です。それ以外の場合は、パイプラインを停止して、正確な加算の残りの半分を実行します。

低速パスには2サイクルかかることがわかっているため、設計者は、一般的な使用には遅すぎる場合でも、より多くのスペースと電力効率の良い方法を使用できます。


6

はい、多くのコンピュータはキャリールックアヘッド加算器を使用しています。私はいくつかの古いマイクロプロセッサをリバースエンジニアリングして、いくつかの例をあげることができます。

Intel 8008(最初の8ビットプロセッサ)のALUには、ダイナミックロジックで実装された大きなキャリールックアヘッド回路が含まれていました。この回路は、ALU自体と同じくらいのダイスペースを占めていました。キャリールックアヘッドは8008データシートの図3に示されています。ALUのキャリールックアヘッドを備えた1970年代の他のプロセッサは見たことがありません。そのため、8008はこの点で少し変わっています。

6502は、プログラムカウンター(PC)インクリメンターにプリミティブキャリールックアヘッドを使用します。PCの下位バイトからのキャリーがあるかどうかを検出し、これを使用して上位バイトをインクリメントします。これにより、リップルキャリーが16ビットから8ビットに削減されます。6502のALUはリップルキャリーを使用しますが、キャリーロジックがビットを交互に反転するため、パスからインバーターが切り離され、わずかに高速になります。

Z-80には、PCの更新、inc / dec命令、およびループカウンターに使用される16ビットインクリメンター/デクリメンターがあります。キャリースキップ構造を使用しているため、2ビットのグループに対してキャリーが計算されます。さらに、ビット0〜7、7〜11、および12〜14からのキャリーを生成するために、いくつかのキャリールックアヘッドを使用します。その他のキャリーはリップルキャリーで計算されます(詳細)。驚いたことに、Z-80のALUは4ビットなので、各8ビット演算はALUを2回通過します。

一方、8085は、16ビットインクリメンター/デクリメンターにリップルキャリーを使用します。しかし、6502と同様に、キャリーロジックを交互のビットで反転させることにより、ビット速度が少し向上します。

ARM-1は、無桁上げ先見、単にリップルキャリーの32ビットALUを有しています。また、交互のビットでキャリーを反転させるトリックを使用します。

ミニコンピュータの世界では、多くのプロセッサは、内部キャリールックアヘッドを持つ有名な74181 4ビットALUチップから構築されました。例としては、Data General Nova、Xerox Alto、VAX-11 / 780、TI-990などがあります。(より長いウィキペディアのリストを参照してください。)これらの一部は、各4ビットチップ間でリップルキャリーを使用し、一部は74182キャリールックアヘッドチップを使用して完全な先読みを行います。

要約すると、さまざまなマイクロプロセッサは、パフォーマンスの目標とクリティカルパス上にある操作に応じて、さまざまなキャリーテクニックを使用します。ALUは、完全なキャリールックアヘッド(8008など)を使用することも、ハーフサイズ(Z-80など)にすることもできます。インクリメンターは通常8ビットプロセッサでは16ビットであり、リップル遅延が2倍になるため、パフォーマンスの問題になる可能性があります。インクリメンターは、リップルキャリー(8085)、1つのキャリールックアヘッド(6502)、または複数のキャリールックアヘッドステージ(Z-80)を持つことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.