Ruleru
LLM を聞いて学ぶ

10/27(火) · 12:27

第2章 前半: CPUの内側とメモリの階層

『日本語技術教科書 Vol.0』の第2章 前半。CPUの内側とメモリの階層を、2 人の掛け合いで解説する。

この回を聴く

AIこの記事は AI の Claude が書きました。

  • 足し算 1 つにも、レジスタ、演算回路、制御が関わり、命令の重なりや分岐の予測で待ちの出方が変わる。
  • キャッシュは配置と使い方に左右され、遅延と帯域は別の数字として数える。
  • 仮想アドレスは表で物理番地に変換され、ページフォールトは必ずしもエラーではない。

教材の 2.1 節から 2.3 節まで。

2.1.1〜2.1.3 足し算の内側と命令の重なり

『日本語技術教科書 ボリュームゼロ』の第2章前半は、第1章で一瞬の出来事として扱った足し算の中身を開く。教材は、32 ビットのレジスタが 8 本あり、同時に 2 つ読んで 1 つ書ける仮の構成を置く。2 つのレジスタを足して 3 つ目へ入れる命令では、番号を送って値を受け取り、演算回路へ渡し、許可の信号が立った時点で宛先が書き換わる。演算回路は CPU 全体の別名ではなく一部品で、命令を選んで読み解く制御も欠かせない。宛先の番号と結果の値は、同じ種類の情報ではない。

命令セットが決めるレジスタに対して、内部にはそれより多い物理的な保持場所がある場合がある。同じ名前を続けて更新する命令でも、古い値を待つ側と新しい値を作る側に別の場所を割り当てられ、教材はこの付け替えをレジスタリネーミングと呼ぶ。ソースの変数が 1 つのレジスタに住み続けるという見方は成り立たない。

パイプラインは、命令を取得、解読、実行、メモリ、書き戻しの 5 段に分け、1 段ずつずらして流す説明モデルで、すべての CPU が 5 段という話ではない。独立した 4 命令なら全体は 5 + 3 = 8 周期で終わる。1 つの結果が出るまでの遅延と、一定時間に終わる量(スループット)は別の量である。次の命令が未完成の値を欲しがるのがデータ依存で、メモリから読む値はメモリの段の終わりまで届かず、次の命令の実行の段の始まりに間に合わないので、教材のモデルでは 1 周期止まる。実機ではキャッシュミスなどで待ちが変わる。依存のない命令を先に流す順序の入れ替えもあり、結果は元の順序で確定させる。

分岐の判定を待つと流れに空きができるため、過去の結果から行き先を当てて先へ進める。教材の例は 0 から 3 の数を持つ予測器で、0 と 1 なら分岐しない、2 と 3 なら分岐すると答え、当たりはずれで数を 1 つ動かす。外れたら進めた結果を捨てて取り直す。時間は失うが答えは守られ、的中率 9 割は答えの 9 割が正しいという意味ではない。命令の 2 割が分岐で、そのうち 1 割が外れ、1 回 12 周期を失うなら、全命令 1 つあたりの追加は 0.24 周期になる。

2.1.4〜2.2.2 周波数、コア、キャッシュ

実行時間は、命令数、1 命令あたりの周期、周波数から決まる。10 億命令、平均 1.5 周期、30 億周期/秒なら 0.5 秒である。1 つのコアに 2 つの実行状態を持たせる方式でも、演算回路は共有するので、論理 CPU の数が倍でも回路が倍になるわけではない。処理の 8 割を 4 コアへ分けられても残る 2 割が直列なら、時間は 0.4 で、速くなるのは 4 倍でなく 2.5 倍にとどまる。

キャッシュは、大容量と低遅延を同時に満たしにくいので階層を作る。写しを運ぶ単位がキャッシュラインで、教材は 64 バイトと仮定する。整数 1 つを読んでも 1 ライン分が運ばれ得る。4 つの集合を持つ小さな例では、4096 番地と 4352 番地が同じ集合に当たり、交互に読むと合計 128 バイトでも互いを追い出す。原因は容量でなく置き場所の取り合いである。平均の待ち時間は、1 ナノ秒に外れの分を足して 1.8 ナノ秒と計算されていた。

4096 番地から 4 バイトの要素を 16 個続けて読むと、ミスは最初の 1 回だけで、残る 15 回はヒットする。64 バイトおきに 4 つ読むと、使う量は 16 バイトでも 256 バイトぶんのラインを運ぶ。書き込みの方式の 1 つ、ライトバックでは、まずキャッシュの中だけを書き換え、メモリへの反映はあとに回す。書いた、別のコアから読める、メモリへ戻った、SSD に残った、の 4 つは別の段階である。8 バイトしか離れていない変数を 2 つのコアが書き続けると、同じラインの奪い合い(偽共有)が起こる。

2.3.1〜2.3.3 メモリと仮想アドレス

DRAM は電荷でビットを覚え、抜けた分を補う更新が要る。ランダムアクセスという名前でも、どこでも同じ時間で届くわけではない。64 バイトの読み出しに 100 ナノ秒かかり、次をその完了後にしか出せないなら、進む量は毎秒 0.64 ギガバイトにすぎない。独立した要求を重ねれば毎秒 40 ギガバイトという条件も成り立ち、そのためには進行中の要求が約 63 件要る。遅延と帯域は別の数字である。

仮想アドレスは、表を介して実際の置き場所へ結びつけられる。ページが 4096 バイトで、仮想番地が 16 進で 12345 なら、上の 12 がページ番号、下の 345 がページ内の位置になる。表がページ番号 12 に物理の 9 を割り当てれば、物理番地は 9345 である。表を多段にして使う枝だけ作る方法があり、変換結果を覚えておく TLB が当たれば表をたどらずに済む。TLB で見つからなかったからといって、そのページがメモリから消えているとは限らない。

ページフォールトは通常の経路で終えられず OS の助けが要る例外だが、エラー終了とは限らない。有効な領域でも物理のページが未用意なら、初めて触った時点で用意する。許可の無い番地への書き込みなら拒否される。1 回のフォールトが SSD の読み出し 1 回とも限らない。領域を確保できても全部がメモリに居座る約束ではなく、足りなくなればメモリ不足の処理に入る。

次は第2章の後半で、SSD の中、GPU への転送、配列の置き方、LLM の容量の見積もりを扱う。

出典

  • オーナー(AI で作った教材、Web には公開していない) 日本語技術教科書 Vol.0 コンピュータからPython・機械学習・LLMへ 第2章 2026-10-18