コンピュータの仕組みを根本から説明できますか?
コンピュータを理解するには、まず一つの物理的現実を受け入れなければなりません。コンピュータの中に魔法は一切ありません。あるのは電気信号だけです。より正確に言えば、高電圧と低電圧だけです。
現在使われているチップの基礎材料はシリコンです。シリコンは半導体です。半導体には物理的特性があり、異なる元素をドープし、電極の電圧を制御することで、導通するかしないかを制御できます。この電気で導通と遮断を制御できる微小な構造をトランジスタと呼びます。
現代のCPUには数百億個のトランジスタが搭載されています。TSMCの現在の3ナノメートルプロセスとは、これらのトランジスタが極めて小さく作られ、爪の先ほどのシリコン片に数百億個を詰め込めることを意味します。
トランジスタの核となる機能は一つだけ覚えればいいです。制御端子に高電圧をかけると導通し、低電圧をかけると遮断されます。これが最下層の物理的現実です。高電圧を論理1、低電圧を論理0と定義します。コンピュータの原理はすべて、この二つの状態の上に成り立っています。
トランジスタがあれば、それらを組み合わせて論理ゲートを作ることができます。
二つのトランジスタを直列に接続したとします。電流が一方の端からもう一方の端に流れる(出力が1になる)のは、両方の制御端子が高電圧、つまり両方の入力が1の場合だけです。どちらかが0なら電流は遮断され、出力は0です。この物理回路をANDゲートと呼びます。
同様に、二つのトランジスタを並列に接続した場合、少なくとも一方の入力が1であれば電流が流れ、出力は1になります。両方が0の場合のみ出力は0です。これがORゲートです。
少し異なる接続方法を使い、1を入力すると0を出力し、0を入力すると1を出力するようにしたものがNOTゲートです。
AND、OR、NOTゲートがあれば、物理世界は正式に数学の世界に入ります。ここでお勧めの古典的な教科書を紹介します。Charles Petzoldの『Code』です。この本には無駄が一切なく、電信機から始めて論理ゲートの配線方法を説明しています。物理的な直感の第一層を築くのに最適です。この記事を読んだ後にぜひ手に取ってみてください。目から鱗が落ちる体験ができるはずです。
論理ゲートができたところで、どうやってコンピュータに足し算をさせるのでしょうか。
2進数では、1足す1は10です。つまり、現在のビットは0になり、次の桁に1を繰り上げます。これは実際には二つの論理操作です。第一に、現在のビットを判断します。両方の入力が1なら現在のビットは0、一方が1で他方が0なら現在のビットは1です。この論理は先ほど説明した基本ゲートを組み合わせて実装でき、XORゲートと呼ばれます。第二に、繰り上がりを判断します。両方の入力が1のときだけ繰り上がりが発生します。これはまさにANDゲートの機能です。
XORゲートとANDゲートを接続すれば、1ビットの2進数加算を物理的に実現できます。これを半加算器と呼びます。複数の半加算器をカスケード接続して繰り上がり信号を処理すれば、全加算器になります。この全加算器を64個接続すれば、64ビットの2進数を加算できる物理回路が完成します。
a = b + c というコードを書いたとき、最下層では、bとcを表す電気信号が数万個のトランジスタからなるこの加算回路に同時に流れ込み、極めて短い物理的遅延の後、回路の反対側から結果を表す安定した高電圧と低電圧が出力されます。
これが算術論理演算装置(ALU)です。神秘的で核心的な部品などではなく、人間が設計した数学的ルールに従ってハードワイヤリングされた、半導体論理ゲートの高密度な網目構造にすぎません。加算の他にも、配線の構成を変えることで、減算、ビットシフト、さらには乗算も実行できます。
しかし、計算ができるだけでは役に立ちません。計算結果は単なる電気信号の集まりであり、電源が切れたり入力が変わったりすると結果は消えてしまいます。コンピュータはデータを記憶できなければなりません。ここでメモリとレジスタの登場です。
電気信号を使って状態を記憶するにはどうすればよいでしょうか。電子技術者は極めて巧妙な回路を発明しました。それがフリップフロップです。これはフィードバックループを持つ論理ゲート回路です。簡単に言えば、出力信号を入力に戻す仕組みです。この設計により、元の入力が取り除かれても、回路は内部のフィードバックによって現在の高電圧または低電圧状態を維持できます。
このフリップフロップに特定の書き込み信号を与えると、内部状態を更新してロックします。再び書き込み信号を送らない限り、その0または1を永久に保持し続けます。
64個のフリップフロップを一列に並べれば、64ビットの2進数を記憶できます。CPU内部でALUのすぐ隣にあり、フリップフロップで作られたこの超高速記憶ユニットがレジスタです。物理的な位置が演算回路のすぐ隣にあるため、電気信号の伝送距離が最短で、極めて高速です。もちろん製造コストも非常に高いため、ごく小さなサイズにしかできません。
ここで、伝説的な書籍を強く推薦します。『Computer Systems: A Programmer’s Perspective』、IT業界で有名なCSAPPです。カーネギーメロン大学の教科書です。この本の最も優れている点は、アセンブリ言語からハードウェアアーキテクチャ、オペレーティングシステムに至るまでの壁を打ち破ることです。これを理解すれば、なぜあるコードは速く実行され、あるコードは遅いのかがわかるようになります。物理レベルの思考でコードを書き始めるからです。
さらに踏み込んで、オペレーティングシステム、コンピュータ構成原理、ネットワークといったハードコアな基礎を体系的に一度に理解したい方のために、データ構造とアルゴリズム、コンピュータ構成原理などをカバーしたコレクションをまとめました。
ウェブ全体で累計100万以上ダウンロード – あなたのスキルを飛躍的に向上させるコンピュータ基礎知識です。
さらに外側に進みましょう。レジスタだけでは不十分な場合、どうすればいいでしょうか。より大容量のストレージが必要です。ここでマザーボードに挿すメモリモジュールの出番です。専門用語ではダイナミックランダムアクセスメモリ、DRAMと呼ばれます。
DRAMの物理的原理はレジスタとはまったく異なります。フリップフロップではなく、微小なコンデンサを使って電荷を蓄えます。電荷がある状態が1、ない状態が0です。コンデンサの構造は極めて単純で、1ビットのデータを保存するのにトランジスタ1個とコンデンサ1個しか必要としないため、容量を非常に大きくできます。現在では数十GBから数百GBが普通です。
しかしコンデンサには致命的な欠点があります。電荷が漏れることです。放っておけば、1を表す電荷は数ミリ秒で漏れ去り、0になってしまいます。そのためマザーボードには専用の制御回路が必要で、極めて短い間隔でメモリのデータを読み出して再充電します。これが動的リフレッシュです。コンピュータの電源を抜くとメモリの内容が一瞬で消えるのはこのためです。
これで、計算を行えるALUとデータを記憶できるレジスタとメモリが揃いました。次の核心的な問題は、これらの無生物がどうやって動き出すのか、誰が加算、乗算、結果の保存という順序を指示するのかです。
これがコントロールユニットの役割であり、コンピュータが機械と呼ばれる核心的なメカニズムです。
マザーボードには水晶発振器があります。電源が入っている間、一定周波数のパルス信号を生成する水晶振動子です。例えばCPUが4.0GHzと表記されている場合、この水晶が毎秒40億回の高低電圧の切り替えを生成することを意味します。
これがコンピュータの鼓動です。CPU内部のすべての論理ゲートとフリップフロップは、この鼓動に厳密に同期して動作します。
CPU内部には、プログラムカウンタと呼ばれる非常に特殊なレジスタがあります。中にはメモリアドレスだけが格納されています。
鼓動の最初の拍が打たれると、CPUは最初の仕事である命令フェッチを行います。マザーボード上の金属配線を通じて、プログラムカウンタに格納されたアドレスをメモリに送信します。メモリはそのアドレスに格納された長い0と1の列をCPUに返送します。
この長い0と1の列が命令です。命令がCPUに戻ると、コントロールユニットに入力されます。コントロールユニットもまたハードワイヤリングされた論理ゲートの集まりであり、その役割はデコードです。例えば、送られてきた0と1の先頭数桁が1011である場合、内部の配線構造によって、これらの高低電圧が偶然にもALU内の加算回路へのスイッチを活性化します。同時に、命令の後半部分は、加算する二つのデータがどのレジスタにあるかを指定します。
次の拍が打たれると、実行フェーズが始まります。活性化された加算回路がデータを受け取り、電気信号が瞬時に加算器の論理ゲート網を駆け抜け、結果が生成されます。
さらに次の拍で、結果が指定されたレジスタに書き戻されます。
最後に、プログラムカウンタが自動的に1増加し、メモリ内の次の命令を指します。そしてサイクルが再開します。毎秒数十億回のサイクルです。
これがコンピュータが動作するすべての最下層の真実です。高度な知能など一切なく、水晶発振器が盲目的に拍を刻み、プログラムカウンタが機械的にアドレスを増加させ、コントロールユニットが読み取った0と1に応じて機械的に信号経路を切り替え、ALUが受け取った電圧レベルを受動的に新しい電圧レベルに変換しているだけです。
皆さんが普段書いているPythonコードやJavaコードは、最終的にコンパイラと呼ばれるソフトウェアによって、特定のCPUアーキテクチャ向けの極めて退屈な機械命令列、つまり純粋な0と1に完全に変換されます。
ここまでで、砂(シリコン)からプログラムに至る完全なチェーンをたどり終えました。多くの人がこの段階で理解できた気になりますが、現在の実際の業界環境では、従来のCPUの原理を理解しただけでは合格点にすら達しません。
現在最もホットなAI大規模モデルを踏まえて、視野を拡張する必要があります。今、実際の計算基盤がどうなっているのかを見てみましょう。
現在、大規模モデルに取り組んでいるチームは、トレーニングであれ推論であれ、CPUで計算することは絶対にありません。なぜでしょうか。
CPUは複雑な論理制御を処理するように設計されているからです。CPUを見てみると、その面積の大部分は分岐予測、キャッシュ管理、コントロールユニットに割り当てられています。純粋な数値計算に使われるALUの部分は、実はそれほど大きくありません。CPUは複雑な管理プロセスに長けた高学歴の知識人のようなものです。1+1の計算はできますし、ついでにエラーがないか分析もしてくれるかもしれませんが、同時に処理できるのは数個だけです。
大規模モデルの根底にある数学的本質は、非常に大規模な行列乗算です。例えば、数千×数千の二つの行列の乗算。これには数億回の乗算と加算が必要です。論理は極めて単純で、乗算・加算・乗算・加算の繰り返しであり、複雑な分岐判断は一切ありませんが、データ量が驚異的です。
従来のCPUでこれを計算しようとすると、確かに毎秒数十億の命令を実行できますが、数千億のパラメータを前にすれば、焼け石に水です。
大規模モデルが実際に何を計算しているのかを本当に理解するには、もし数学的な直感がまだ公式の暗記に留まっているなら、3Blue1Brownの『線形代数の本質』を強くお勧めします。復習や導出を容易にするために、3Blue1Brownの中英ノートまとめと一緒にご覧ください。高度な行列乗算や線形変換を直感的に可視化しており、数千ものパラメータの積和演算を物理レベルのイメージとして捉えられるようになります。
3Blue1Brown線形代数ノート:おそらくウェブ上で最高の中英まとめ
この大量の行列計算の特性が、GPUを生み出しました。グラフィックスプロセッシングユニット、今では汎用並列計算ユニットと呼ぶべきものです。
GPUの設計思想はCPUとは完全に逆です。複雑な制御回路や大きなキャッシュの大部分を削除し、空いた物理スペースのすべてを最も単純なALUで埋め尽くします。現在のNVIDIA H100チップには、数万もの計算コアが搭載されています。各コアの周波数はCPUコアより低く、制御論理も弱いですが、すべて同時に動作できます。
GPUを、算数しかできない小学生10万人の大群だと考えてください。彼らに「左手の数と右手の数を掛けなさい」という極めて単純な命令を与えます。10万人の小学生が同じクロック拍動で同時に結果を計算します。大規模モデルに必要な超並列行列演算において、GPUの効率はCPUの数百倍から数千倍です。
実はAIも、CPUの加算器と同じで、それほど神秘的なものではありません。依然として論理と行列の積み重ねにすぎません。ディープラーニングの理解をゼロから構築したいなら、Twitterで多くの人が「AIに対する幻想を完全に打ち砕く」と評価した『Deep Learning with Python』をお勧めします。順伝播と逆伝播のテンソル計算を自分で理解できたとき、大規模モデルの中にも魔法は一切ないことに気付くでしょう。
この本を読んで、AIに対する幻想が完全に打ち砕かれました!
ハードウェアに戻りましょう。低レベルのアルゴリズム最適化を行うとき、ほとんどの労力はVRAM帯域幅との戦いに費やされます。これは多くの上級プログラマーがつまずくポイントでもあります。
ALUの計算速度は非常に速いからです。先ほど述べたように、メモリモジュールはコンデンサの充放電でデータを保存し、CPUやGPUからある程度の物理的距離があります。電気信号がマザーボード上を伝わるのにも時間がかかります。現在AIチップが直面している最大の課題は、学界でフォンノイマンボトルネックと呼ばれるものです。
つまり、数千の計算コアが一瞬で手元のデータを処理し終え、その後、低速なメモリから新しいデータが運ばれてくるのを待つしかない状態です。チップ内の計算回路をどれだけ高速にしても、データを十分に供給できなければ、演算能力は無駄になります。
この問題を解決するために、ハードウェアエンジニアは追い詰められました。通常のメモリモジュールは遠すぎて遅すぎるので、メモリとGPUチップを同じ基板に直接パッケージしてしまえばいいのです。データ転送のチャネル幅を広げるために、従来の配線ではなく、シリコンインターポーザと呼ばれる技術を使い、シリコン内部に何千もの微細な導通穴を開けて、メモリと計算コアを直接接続します。これが高帯域メモリ、HBMとして市場で大注目されています。
この部分に強い興味を持ち、将来のAI時代に真に代替不可能なアーキテクチャエンジニアや低レベル開発者として高収入を得たいのであれば、『コンピュータアーキテクチャ 定量的アプローチ』に取り組むことを強くお勧めします。この本は二人のチューリング賞受賞者によって書かれ、シリコンバレーのハードウェアエンジニアはほぼ全員が持っています。大量の実データと数式を使って、なぜチップが特定のキャッシュアーキテクチャで設計されなければならないのか、マルチコア並列処理のボトルネックが正確にどこにあるのかを教えてくれます。読んでいて非常に退屈で、難しい章もありますが、低レベルの理解における認知ギャップを埋めるための必須の道です。
元の質問に戻りましょう。なぜこれらすべての用語を学んでもまだ混乱しているのでしょうか。従来の教育は、物理的な実体と論理的な抽象化の間の血肉のつながりを断ち切っているからです。
CPUを魔法のブラックボックスとして扱うとき、それらの用語は理解不能な定義のように感じられます。しかし、物理法則に従って下から上へとたどっていけば:
- 高低の電圧が論理ゲートを構成できるから、計算を行える算術ユニットができた。
- フィードバック回路が電圧状態を固定できるから、データを記憶できるレジスタができた。
- 電気信号の流れをリズミカルに制御する必要があったから、水晶発振器とコントロールユニットができた。
- このシステムが複雑すぎて人間が直接電圧レベルを入力できないから、命令セットを発明し、0と1をアセンブリ言語で包み、最終的にCやPythonで包んだ。
この業界で長年経験を積んできた実務者として、責任を持って言えます。現代では、フロントエンドフレームワークは次々と入れ替わり、バックエンドのマイクロサービスアーキテクチャも数年ごとに主流が変わります。AIの大規模モデルアーキテクチャでさえ急速に進化しています。今日学んだ高度なアプリケーション開発技術は、来年には時代遅れになっているかもしれません。実際、多くの基本的なコーディング作業は、大規模モデル自体が平均的なプログラマーよりも上手にこなせてしまいます。
しかし、唯一変わらないものがあります。それは、半導体物理に基づくこのコンピュータの基本的な動作原理です。ソフトウェアがどのように抽象化されようと、アルゴリズムがどんなに高度になろうと、最終的にはすべてシリコン上の電圧の起伏に帰着します。高度なパフォーマンス最適化や最先端の計算リソース管理であればあるほど、エンジニアはすべてのソフトウェア抽象化層を見通し、基盤となるハードウェアの動作状態を直接把握する能力を必要とします。
こうした低レベルの知識は自分には遠いものだと思わないでください。極度にパフォーマンスを消費するコードに直面したとき、キャッシュラインのメカニズムを低レベルで理解しているからこそ、メモリ内の配列の配置順を調整してCPUのキャッシュヒット率を劇的に向上させ、コードの実行速度を10倍にできるのです。その瞬間、基本原理を習得することによる大きな制御感を味わうことができるでしょう。