English / 日本語
← 基礎編の入口へ戻る 第3章:第1部・機械を分解する

第3章 命令はこう実行される ― 5つの手順と、流れ作業

この章のねらい。 前章で、部品はひととおりそろいました。この章では、命令ひとつが、その部品たちを使って実際にどう実行されるかを見ます。つかみどころは、ふたつです。ひとつは、命令ひとつは決まった5つの手順をこなして完成すること。もうひとつは、その手順を重ねて進めると、CPUがぐっと速くなること――これを流れ作業(パイプライン)と呼びます。むずかしい式は出てきません。

3.1 命令ひとつは、5つの手順でできている

たとえば「x1 と x2 を足して、x3 に入れる」という、たった一つの命令。これも、一瞬でパッと終わるわけではありません。CPUは、次の5つの手順を、いつも同じ順番でこなして、ひとつの命令を完成させます。

命令を実行する5つの手順 取ってくる、読み解く、計算する、メモリを使う、書き戻す、の順に1つの命令が進み、終わると次の命令の取ってくるへ戻る。1手順がおおむねクロック1拍。 ① 取ってくる(フェッチ) 次に実行する命令を、メモリから読み出す ② 読み解く(デコード) 命令を解読し、使う値をレジスタから用意する ③ 計算する(実行) ALUで、実際に足し算などの計算をする ④ メモリを使う(メモリアクセス) 必要なら、データメモリを読み書きする ⑤ 書き戻す(ライトバック) 計算の結果を、レジスタに保存する ↻ 終わったら、次の命令へ(①に戻る。1手順がおおむねクロック1拍)
ひとつの命令は、この5つの手順を上から順にこなして完成する。終われば、次の命令がまた①から始まる。1手順あたり、おおむねクロック1拍です。

3.2 なぜ、この順番でしか進めないのか

この5つは、順番を入れ替えられません。前の手順の答えが出てからでないと、次の手順を始められないからです。命令を②で読み解く前に、③の計算はできない。③で計算してからでないと、⑤で結果を保存できない。――料理と同じです。材料を切る前に炒めることはできませんし、炒める前に盛りつけることもできません。やるべきことに順番があるので、いつも①から⑤へと進みます。

3.3 ここで、もったいないことに気づく

順番に進めるのはいいのですが、一つ、もったいない点があります。ある命令が②「読み解く」をしている間、①「取ってくる」を担当した部品は、もう手が空いています。次の命令はまだ手をつけていないのに、せっかくの部品が遊んでいる。――なら、その空いた部品に、次の命令の「取ってくる」を、もう始めさせればいい。こう考えると、CPUの速さは何倍にもなります。

3.4 流れ作業(パイプライン)― 工場の組み立てライン

この「手順を重ねて進める」やり方を、流れ作業(パイプライン)と呼びます。思い浮かべてほしいのは、工場の自動車の組み立てラインです。ラインでは、1台目が「塗装」の工程にいるあいだ、2台目は「部品の組み付け」、3台目は「車体づくり」…と、各工程の担当が、いつも別の車を相手に働いています。誰も手を止めていません。

CPUもこれと同じです。5つの手順の担当が、それぞれ別の命令を同時に進める。手順は5つあっても、うまく流れれば、命令はおよそ1拍にひとつのペースで、次々に完成していきます。下の表で、その様子を見てみましょう。

流れ作業(パイプライン)の様子 縦に命令1から命令4、横に時刻1から8。各命令が5つの手順を1拍ずつずらして進む。時刻5を縦に見ると、命令1は手順5、命令2は手順4、命令3は手順3、命令4は手順2と、4命令が別々の手順を同時に進めている。 時刻 → 1 2 3 4 5 6 7 8 命令1 命令2 命令3 命令4 ①取ってくる ②読み解く ③計算する ④メモリを使う ⑤書き戻す
横は時間(クロックの拍)。オレンジの時刻5を縦に見ると、命令1は手順⑤、命令2は手順④、命令3は手順③、命令4は手順②。4つの命令が、それぞれ別の手順を同時に進めています。これが、流れ作業の速さの正体です。

3.5 ただし、手順の長さが揃っていること

この流れ作業がうまくいくには、ひとつ条件があります。各手順が、だいたい同じ時間で、きれいに終わることです。どの命令も単純で、手順の長さが揃っていれば、ラインはなめらかに流れます。ところが、一つだけ妙に手間のかかる命令が混じると、その手順でラインが止まり、後ろがつかえてしまう。

だから、命令を単純に、粒をそろえて作っておくと有利になります。この考え方が、次の第4章「CISCとRISC」――命令ひとつにどこまで仕事を詰め込むか、という話につながっていきます。

3.6 まとめ

この章は、どの判断のための知識か。 流れ作業の仕組みが分かると、自分チップのコアで「手順をいくつの工程に分けるか」を選ぶ目が持てます。分け方が浅いと、作りは小さく省電力ですが速度は控えめ。深く分けると、速いかわりに回路は増えます――この速度と、面積・電力のかね合いの判断です。さらに、開発ボードがうまく動かないとき、命令がどの手順でつまずいたかを切り分ける手がかりにもなります。序章の“決めることマップ”でいう 「頭脳」 の工程数選びと、最後の 「検証」 の土台です。