加算・減算・論理演算などの計算を実行するCPUの演算回路
ALU(Arithmetic Logic Unit=算術論理演算装置)とは、CPUの中で実際に計算を行う回路です。2つの入力値(AとB)と「どんな演算をするか」の指示を受け取り、足し算・引き算・論理演算などを実行して1つの結果を出力します。日本語では単に「演算装置」とも呼びます。
身近な例で考えると、ALUは電卓の計算部分です。電卓に「5」「+」「3」と入力すると「8」が出るように、ALUも2つの数と演算の種類を受け取って答えを返します。ただし電卓と違い、ALU自身は「次に何を計算するか」を決めません。それを決めて指示するのは制御装置です。ALUは指示された計算をただ実行する役割に徹します。
上のツールで入力AとBをスライダーで変え、演算種別ボタンを切り替えてみてください。▶のような自動再生はありませんが、値を動かすたびに結果・ビット計算・フラグが即座に更新されます。とくに「255 + 1」のプリセットでは桁あふれが起きる様子が観察できます。
ALUが実行できる演算は、大きく算術演算と論理演算の2種類に分けられます。これがALUの名前(Arithmetic = 算術、Logic = 論理)の由来です。
| 分類 | 演算 | 記号 | 内容 |
|---|---|---|---|
| 算術 | 加算 ADD | + | 2つの値を足す |
| 算術 | 減算 SUB | − | 2つの値を引く |
| 論理 | 論理積 AND | ∧ | 両方が1のビットだけ1 |
| 論理 | 論理和 OR | ∨ | どちらかが1なら1 |
| 論理 | 排他的論理和 XOR | ⊕ | 値が異なるビットだけ1 |
論理演算はビットごとに独立して計算される点がポイントです。たとえばANDなら、A・Bの同じ位置のビットを見比べ、両方1のときだけ結果のそのビットが1になります。上のツールの「0xF0 AND 0x0F」プリセットで、上位4ビットと下位4ビットの取り出し(マスク処理)の動きが確認できます。
なお、乗算(掛け算)や除算(割り算)はALUが直接持たないことも多く、その場合は加算とシフト演算の繰り返しで実現されます。ALUは「四則演算と論理演算を行う回路」と捉えておくとよいでしょう。
ALUは計算結果を出すと同時に、その結果の性質を表す情報をフラグレジスタ(フラグ=旗、状態を示す1ビットの集まり)に記録します。代表的なフラグは次の3つです。
・ゼロフラグ (Z):結果が0のとき1になる
・キャリーフラグ (C):加算で桁あふれ、減算で借りが出たとき1になる
・符号フラグ (S):結果の最上位ビット(MSB)が1のとき1になる(負を表すことが多い)
これらのフラグは、後に続く条件分岐命令の判断材料になります。たとえば「2つの値を引き算してゼロフラグが立った(=結果が0)」なら、その2値は等しいと分かります。プログラムの if (a == b) は、内部では「a − b を計算してゼロフラグを見る」という形で実現されているのです。
上のツールでプリセット「5 − 5」を選ぶとゼロフラグが、「255 + 1」を選ぶとキャリーフラグが立ちます。入力Bを大きくして「A < B」となる減算をすると、借りが発生してキャリー(ボロー)フラグが立つ様子も観察できます。フラグはALUが演算結果に応じて自動で立て、分岐命令がそれを参照するという流れになっています。
コンピュータは5つの装置(5大装置)で動いています。
・制御装置:命令を解読して指揮する司令塔
・演算装置(ALU):実際に計算を行う
・記憶装置(レジスタ+主記憶):データや命令を記憶する
・入力装置・出力装置:外とのやり取りを担う
ALUはこの中で「唯一、計算をする装置」です。なぜALUだけが計算をするのでしょうか。それは役割を分担して専門化することで、全体の設計がシンプルになるからです。制御装置は命令の解読だけ、ALUは計算だけ、レジスタは記憶だけと役割を分けると、それぞれを独立して作れます。制御装置はALUに「計算の指令」を送るだけでよく、ALUは計算に特化した回路を積むことができます。
身近な例で言うと、工場のライン作業です。ラインごとに1つの仕事だけを担当することで、全員が得意な仕事に集中し、全体の生産効率が上がります。コンピュータの5大装置も同じ発想で設計されており、ALUは「計算する」という1つの仕事だけに集中できる仕組みです。
ALUは専用のハードウェア回路(電子回路)として作られています。プログラムとして書いたソフトウェアではなく、最初から「計算する」という目的だけのために設計された物理的な回路です。
なぜハードウェアにするのか。それは速さが決定的に違うからです。ソフトウェアで計算しようとすると、命令を1つずつ読み込んでから処理を行うため、手順が増えます。一方、ALUの回路は電気信号が流れるだけで即座に計算結果が出ます。命令を読む手間がないため、ソフトウェアとは比べ物にならない速度で動きます。
わかりやすいアナロジーで考えると、「自動ドア(ハードウェア)vs 手でドアを押す(ソフトウェア)」の違いです。どちらもドアは開きますが、センサーが反応して機械が自動で動く自動ドアのほうが圧倒的に速い。ALUも同じで、計算専用の回路がそのままデータに働きかけるため、プログラムを逐一解釈する方式より格段に速く計算できます。コンピュータが1秒間に何億回もの計算をこなせるのは、ALUがハードウェア回路だからです。