リプルキャリー・キャリールックアヘッド・キャリーセーブ加算器の違い:遅延・回路規模・用途を比較

どれも全加算器を組み合わせた加算回路ですが、桁上げの扱い方が違います。リプルキャリー(リップルキャリー)加算器は全加算器を直列につなぎ、桁上げが下位から上位へ順に伝わるので、遅延はビット数nに比例します(O(n))。桁上げ先見加算器(キャリールックアヘッド加算器)は、各桁の生成信号と伝搬信号からすべての桁上げを並列に求め、先見回路を階層化すれば遅延はO(log n)で済みます。桁上げ保存加算器(キャリーセーブ加算器)は、3つの数を、桁上げを伝えずに和と桁上げの2つの数にまとめる回路で、遅延はビット数によらず全加算器1段分です。乗算器では、桁上げ保存加算器の木(ウォレスツリーなど)で部分積を減らし、最後に残った2つの数を高速な加算器で足します。

項目リプルキャリー加算器桁上げ先見加算器(キャリールックアヘッド)桁上げ保存加算器(キャリーセーブ)
入力と出力2つの数(と桁上げ入力)を足し、1つの和と桁上げ出力を出す2つの数(と桁上げ入力)を足し、1つの和と桁上げ出力を出す3つの数を、和Sと桁上げCyの2つの数にまとめる(A + B + C = S + Cy)
桁上げの扱い各全加算器が下位からの桁上げを待ち、順に上位へ伝える生成信号 g = a·b と伝搬信号 p = a ⊕ b を使い、c(i+1) = g(i) + p(i)·c(i) を展開して、桁上げを並列に求める隣の桁へは伝えず、1桁左にずらした数として次の段へ渡す
遅延の増え方O(n)。最悪の場合、桁上げが最下位から最上位まで伝わるO(log n)(先見回路を階層化した場合)O(1)。ビット数によらず全加算器1段分
64ビットでの目安桁上げが全加算器64段を通る4ビットのブロックを3階層に組む。並列プレフィックス加算器なら、Kogge-Stone型で桁上げの計算はlog₂64 = 6段1段は全加算器1個分の遅延。64個の部分積を2つにまとめるウォレスツリーは10段
回路規模最小。nビットで全加算器n個先見回路の分だけ大きい。速い構成ほどゲートと配線が多い(Kogge-Stone型ではおおむねn log n)1段は全加算器n個で、桁上げを伝える回路はない。乗算器の木全体では、部分積のビット数(n²程度)に比例する
結果の形通常の2進数通常の2進数和と桁上げの2つの数に分かれた冗長な形。1つの値にするには、最後に普通の加算器で足す必要がある
主な用途速度が問われない小さな回路や低消費電力の回路。FPGAでは専用の桁上げ回路(キャリーチェーン)を使って作られることが多いCPUのALU、アドレスの計算、浮動小数点ユニット、乗算器の最終段の加算乗算器の部分積の加算(ウォレスツリー、ダッダツリー)、積和演算の累積、多数の数の加算
関連する方式キャリースキップ加算器、キャリーセレクト加算器(速度と面積が中間)並列プレフィックス加算器(Kogge-Stone型、Brent-Kung型など)4:2コンプレッサ、部分積を減らすブースのアルゴリズムとの組み合わせ

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

リプルキャリー加算器
ビット数が少ないとき、または速度より面積や消費電力を優先するときに使います。回路が単純で規則的なので、FPGAのように専用の高速な桁上げの経路をもつデバイスでは、この形で効率よく実装できます。
桁上げ先見加算器(キャリールックアヘッド)
2つの数の加算を1回で速く終える必要があるときに使います。CPUのALUや、クリティカルパスに入る加算器が代表的です。階層化の方法や並列プレフィックス加算器の種類によって、段数と、面積・配線量とのかね合いを選びます。
桁上げ保存加算器(キャリーセーブ)
3つ以上の数を足すときに使います。途中では桁上げの伝わりを待たずに数を減らし、最後に1回だけ桁上げ先見加算器などで足すので、多数の部分積を足す乗算器や、積和演算を繰り返すMACで効果が大きくなります。

よくある質問

O(n)とO(log n)の差は、実際にどのくらいですか?

64ビットでは、リプルキャリー加算器の桁上げは全加算器64段を通りますが、Kogge-Stone型の並列プレフィックス加算器では、桁上げの計算はlog₂64 = 6段です。1段あたりの遅延は回路によって違うので単純な比にはなりませんが、ビット数が増えるほど差は大きくなり、GHz級のプロセッサの64ビットの加算にリプルキャリー加算器では間に合いません。

桁上げ保存加算器の動きを、数で確かめるには?

4ビットの5(0101)、6(0110)、7(0111)を入れると、各桁の和のビットを集めた数Sは0100(4)、桁上げのビットを集めて1桁左にずらした数Cyは1110(14)になります。4 + 14 = 18で、5 + 6 + 7と一致します。各桁は独立した全加算器なので、桁上げを待つ必要がありません。

ウォレスツリーの段数はどう決まりますか?

各段で桁上げ保存加算器が3つの数を2つにまとめるので、数はおよそ3分の2ずつ減ります。部分積がh個のとき、1段で2⌊h/3⌋ + (h mod 3)個になり、8個なら4段、16個なら6段、32個なら8段、64個なら10段で2つになります。段数はビット数の対数に比例する程度で、最後に残った2つの数を高速な加算器で足すと積が完成します。

キャリールックアヘッドの式を、大きなビット数でそのまま使わないのはなぜですか?

桁上げの式を完全に展開すると、上位の桁ほど項が増え、入力の数が非常に多いゲートが必要になるからです。そこで4ビット程度のブロックごとにグループ生成信号Gとグループ伝搬信号Pを求め、上の階層で同じ形の先見回路を使います。並列プレフィックス加算器は、この考え方を一般化したものです。

理解度チェック

全加算器を直列につないだリプルキャリー加算器の欠点として正しいものはどれか。

  1. A負の数を扱えない
  2. B桁上げが下位から順に伝わるため、ビット数に比例して遅延が大きくなる
  3. Cビット数が増えても回路の規模が変わらない
答えと解説を見る

正解:B. 桁上げが下位から順に伝わるため、ビット数に比例して遅延が大きくなる

リプルキャリー加算器では、各全加算器が下位からの桁上げを待ってから計算するため、桁上げが最下位から最上位まで順に伝わり、遅延がビット数に比例して増えます。64ビットでは全加算器64段分の遅延になり、GHzで動くCPUには遅すぎます。回路が小さく単純なので、速度が問われない用途で使われます。高速化には桁上げ先見、桁上げ選択、並列プレフィックス(Kogge-Stone など)加算器が使われます。

桁上げ先見(キャリールックアヘッド)加算器が高速な理由として正しいものはどれか。

  1. A加算のビット数を減らすため
  2. Bクロック周波数を2倍にするため
  3. C各ビットの桁上げを、下位からの伝搬を待たずに入力から並列に計算するため
答えと解説を見る

正解:C. 各ビットの桁上げを、下位からの伝搬を待たずに入力から並列に計算するため

桁上げ先見加算器は、各ビットの生成 G = A・B(必ず桁上げを出す)と伝搬 P = A⊕B(下位の桁上げを通す)を使い、C1 = G0 + P0・C0、C2 = G1 + P1・G0 + P1・P0・C0 … のように各桁の桁上げを入力から並列に計算します。遅延はビット数の対数に比例して増えるだけになります。ただし式が長くなるため、4ビット程度のブロックを階層的に組み合わせて使います。

桁上げ先見加算器で使う、各桁の生成信号 g と伝搬信号 p の定義(a、bはその桁の入力)と、上の桁への桁上げ c(i+1) の式の組み合わせとして正しいものはどれか。

  1. Ag = a + b、p = a・b、c(i+1) = p + g・c(i)
  2. Bg = a・b、p = a ⊕ b、c(i+1) = g + p・c(i)
  3. Cg = a ⊕ b、p = a・b、c(i+1) = g・p・c(i)
答えと解説を見る

正解:B. g = a・b、p = a ⊕ b、c(i+1) = g + p・c(i)

その桁で a と b がともに1なら、下からの桁上げに関係なく必ず桁上げが生じるので、生成信号は g = a・b です。a と b のどちらか一方だけが1なら、下からの桁上げをそのまま上へ伝えるので、伝搬信号は p = a ⊕ b(OR とすることもある)です。よって c(i+1) = g(i) + p(i)・c(i) となり、これを展開すると、各桁の桁上げを入力のg・pと最下位の桁上げだけから2段の論理で並列に求められます。生成と伝搬を取り違えた式では正しく計算できません。

  1. 乗算器で多数の部分積を足し合わせるのに、桁上げ保存加算器が使われる主な理由はどれか。
  2. 高速な乗算器で使われるウォレスツリーの特徴として正しいものはどれか。
  3. 全加算器の入力として正しい組み合わせはどれか。

計算機算術の練習問題へ

関連する用語の解説

全加算器
2つのビットと下位の桁からの桁上げの3入力を足し、和と上位への桁上げを出す回路。桁上げ入力のないものは半加算器。直列につなぐと多ビットの加算器になる。
桁上げ先見加算器
各桁の生成信号 g = a·b と伝搬信号 p = a ⊕ b から、桁上げを下位からの伝わりを待たずに並列に求める加算器。ビット数が多くても遅延が小さい。キャリールックアヘッド加算器ともいう。
桁上げ保存加算器
3つの数を、桁上げを伝えずに「和」と「桁上げ」の2つの数にまとめる加算器。全加算器を桁ごとに並べただけで遅延が一定なので、乗算器で多数の部分積を足すのに使われる。
ウォレスツリー
乗算器で、多数の部分積を桁上げ保存加算器の木で並列に減らしていく構成。段数がビット数の対数程度で済み、高速な乗算器に使われる。最後に2つの数を通常の加算器で足す。
ブースのアルゴリズム
乗数のビットの並びを2ビットずつなどに区切って符号付きの桁に置き換え、部分積の数を減らす乗算の方法。基数4のブース法では部分積がほぼ半分になる。
クリティカルパス
回路の中で遅延が最も大きく、動作できる最大のクロック周波数を決める経路。STAではスラックが最小の経路にあたり、高速化はこの経路の遅延を減らすことから始める。

関連する比較