ALU
ALU(Arithmetic Logic Unit)は、デジタル回路の中核を担う演算装置として知られており、コンピュータ内部で算術演算や論理演算を効率よく実行するために利用されている。CPUの一部として動作し、プログラムから与えられた命令に基づいて二進数の加算や減算、ビット単位の論理操作などを担うことで、さまざまな計算タスクを実現する。初期の時代には真空管やトランジスタを用いた簡素な構造だったが、半導体技術の発展によって高集積化・高性能化が進んできた。近年はプロセッサの設計が多様化し、単純なALUのみならず浮動小数点演算ユニットやベクトル演算ユニットなど、多彩な専用演算ブロックが集積される傾向にある。ソフトウェア面でもハードウェアの特性を考慮した高度な最適化が求められるようになり、コンパイラのレベルでALUの命令セットと相互作用を考慮する場面が増えてきている。
ALUの概要
ALUは二つの入力と一つの出力から成る単純な設計に始まり、そこに加算器や論理ゲートを組み合わせる構造が基本となっている。入力に対してどの種の処理を実行するかは制御信号によって指定され、制御ユニットから届く命令コードによってALUは必要な回路パスを選択する。たとえば加算を行うときは加算器回路を通り、論理ANDを行うときはANDゲートの組み合わせを通るといった具合である。こうしたシンプルな仕組みでありながら、大規模な演算回路に発展させられる柔軟性があるため、現代のCPUやDSPなど、ほぼあらゆるデジタルシステムの核心として機能している。
2023年というか、ここ2年くらいで動かしてみたCPU(ALU)たち。左から
6800,68B00,6502,65C02,Z80,8080,8086,8088,2901,68008,68000,80286。
6800と6502以外はCP/Mか同86か同68Kを載せた。
どれもCPU以外の回路をSTM32で代替してる。
というか実質STM32の勉強だった気がする#2023年作ったものまとめ pic.twitter.com/CALZfw67bd— スダ/渡波郁「お嬢様 投資をはじめる!」1~3巻発売中 (@sudamin) December 29, 2023
演算と論理の関係
ALUが担う機能は大きく分けて算術演算と論理演算に分類される。算術演算には加算・減算・乗算・除算などが含まれ、論理演算にはAND、OR、XORなどのビットレベルの操作が含まれる。算術演算は数値処理の要となるため、加算器の性能を高める試みが盛んに行われてきた。一方、論理演算はデータのビット単位での加工を可能にし、複雑な条件分岐やマスク処理など、プログラム上で幅広い応用が期待できる。これらを統合して命令単位で切り替える役割を負うのがALUの制御信号であり、この設計次第で演算効率や消費電力に大きな影響が出る。
代表的な動作
ALUの代表的な動作は、まず演算対象となるオペランドをレジスタやメモリから取得し、制御信号で指定された種類の処理を実行する流れにある。演算結果はフラグレジスタと呼ばれる領域に、オーバーフローやゼロフラグなどとともに格納される。これらのフラグをCPUが読み取り、条件分岐やループの継続判定などに利用することで、プログラム全体の制御がスムーズに行われる。ハードウェアレベルで効率よく演算を進めるためには、各ステージで発生するレイテンシを最小化する回路設計が不可欠になる。
加算と減算
ALUの主要機能の中でも加算と減算は最も基本的な演算といえる。加算はキャリーチェーンと呼ばれる構造が演算速度を決定づける要因になり、高速化のためにはキャリールックアヘッド加算器やキャリースキップ加算器などの工夫がなされる。一方で減算は補数表現を利用して加算器とほぼ同じ構造で実装されるのが一般的であり、補数の形成コストを抑えながら機能を統合できるメリットがある。これによって実装コストが低減され、簡素な制御回路で複数の演算を実現できるようになる。
設計アプローチ
ALUの設計には、ゲートレベルからアーキテクチャレベル、さらには高位合成レベルまでさまざまなアプローチが存在する。ゲートレベルではANDゲートやORゲートなどの論理素子を直接組み合わせることで、加算器や乗算器などを実装する方法が取られる。アーキテクチャレベルではパイプライン処理や複数段の演算ユニットの配置など、大局的な設計方針に重点が置かれ、高位合成レベルではハードウェア記述言語(HDL)を自動コンパイルすることで最適な回路を生成する技術が利用される。どのレベルを採用するかは、求める性能や開発期間、設計リソースなどによって柔軟に決定される。
ゲートレベル設計
ゲートレベル設計では最小限のロジックゲートを組み合わせることによる回路最適化が重要視される。一般的にAND、OR、NOTなどの基本ゲートとフリップフロップを駆使し、ブール代数を用いて出力の論理式を簡単化する手法がとられる。キャリールックアヘッドのような構造を導入する場合、ブロックごとにキャリーを先取り演算するゲートを配置して全体の遅延を減らす工夫を行う。手動で回路を最適化するには膨大な労力がかかる一方、現在ではEDA(Electronic Design Automation)ツールが発達し、設計者の意図を伝えるだけで自動合成できる環境が整いつつある。
並列化とパイプライン
高性能を求める分野では、演算単位を並列化したりパイプライン化することで演算速度が大きく向上する。複数のALUを同時に動作させるマルチコア設計や、複数の命令を段階的に処理して処理効率を上げるスーパーパイプラインなどの技術が代表的である。一方で並列化やパイプラインには追加のリソースと複雑な制御回路が必要になるため、消費電力や設計工数との兼ね合いが課題になる。組込み用の小規模マイコンでは、消費電力を重視して単純なALUを搭載し、パイプラインを最小限に抑える戦略がとられることも多い。
TPUに搭載されているという2次元パイプライン。早い話が行列積専用ALUって事だろうけれど毎ステップ左から数値が流れ込んできて乗算が行われその結果が1セル下にズレるから行列積がパイプラインで物凄い密度で行える、と言ってるように見えるがイマイチよくわからないので誰か解説して欲しい。 pic.twitter.com/fNVa7B2vaU
— くまぎ (@kumagi) April 5, 2017
高速化のための工夫
高速化のアプローチとしては、ゲート遅延を低減するための短いパイプラインステージの設定や、キャリー演算を並列化する仕組みの導入、フラグの更新を省略する速算モードなどが挙げられる。さらにクロック周波数の向上に合わせて回路規模が増大し、チップ上で発生する熱の制御も避けては通れない問題となる。近年は省電力化の観点からもクロックゲーティングや電源管理技術が重視され、不要な演算ブロックをダイナミックに停止する仕組みなどが検討されている。このようにALUはシンプルな構成でありながら、ハイエンド領域でも重要な性能指標を左右する要素となっている。
多様な応用
ALUは基本的に二進数演算を扱う構造でありながら、汎用CPUやGPU、DSP、AIアクセラレータといった多彩なプラットフォームで不可欠な役割を果たしている。組込み分野では省スペースで安価に構築されたALUが用いられ、スマートデバイスや家電などで利用されるソフトウェアを効率よく実行する。逆にハイパフォーマンスコンピューティングの領域では、複数のALUを大規模にアレイ状に配置し、並列処理を駆使して膨大な計算を短時間で処理する形態が一般的になっている。今後も新しいアーキテクチャや回路技術が生まれるに従い、ALUは多角的な進化を遂げていくはずである。