これは、非常に複雑な答えを持つ簡単な質問です。
まず、いくつかの背景。
実際の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サイクルかかることがわかっているため、設計者は、一般的な使用には遅すぎる場合でも、より多くのスペースと電力効率の良い方法を使用できます。