第3章 命令はこう実行される ― 5つの手順と、流れ作業
3.1 命令ひとつは、5つの手順でできている
たとえば「x1 と x2 を足して、x3 に入れる」という、たった一つの命令。これも、一瞬でパッと終わるわけではありません。CPUは、次の5つの手順を、いつも同じ順番でこなして、ひとつの命令を完成させます。
- ① 取ってくる(フェッチ)。 次に実行する命令を、メモリから読み出す。「どの命令か」を手元に持ってくる手順です。
- ② 読み解く(デコード)。 その命令が「何をせよ」という指示なのかを解読し、使う値をレジスタから用意する。
- ③ 計算する(実行)。 ALUで、実際に足し算などの計算をする。
- ④ メモリを使う(メモリアクセス)。 命令によっては、データメモリを読み書きする(このひと手間がいらない命令も多くあります)。
- ⑤ 書き戻す(ライトバック)。 計算の結果を、レジスタに保存する。これで一つの命令が完成です。
3.2 なぜ、この順番でしか進めないのか
この5つは、順番を入れ替えられません。前の手順の答えが出てからでないと、次の手順を始められないからです。命令を②で読み解く前に、③の計算はできない。③で計算してからでないと、⑤で結果を保存できない。――料理と同じです。材料を切る前に炒めることはできませんし、炒める前に盛りつけることもできません。やるべきことに順番があるので、いつも①から⑤へと進みます。
3.3 ここで、もったいないことに気づく
順番に進めるのはいいのですが、一つ、もったいない点があります。ある命令が②「読み解く」をしている間、①「取ってくる」を担当した部品は、もう手が空いています。次の命令はまだ手をつけていないのに、せっかくの部品が遊んでいる。――なら、その空いた部品に、次の命令の「取ってくる」を、もう始めさせればいい。こう考えると、CPUの速さは何倍にもなります。
3.4 流れ作業(パイプライン)― 工場の組み立てライン
この「手順を重ねて進める」やり方を、流れ作業(パイプライン)と呼びます。思い浮かべてほしいのは、工場の自動車の組み立てラインです。ラインでは、1台目が「塗装」の工程にいるあいだ、2台目は「部品の組み付け」、3台目は「車体づくり」…と、各工程の担当が、いつも別の車を相手に働いています。誰も手を止めていません。
CPUもこれと同じです。5つの手順の担当が、それぞれ別の命令を同時に進める。手順は5つあっても、うまく流れれば、命令はおよそ1拍にひとつのペースで、次々に完成していきます。下の表で、その様子を見てみましょう。
3.5 ただし、手順の長さが揃っていること
この流れ作業がうまくいくには、ひとつ条件があります。各手順が、だいたい同じ時間で、きれいに終わることです。どの命令も単純で、手順の長さが揃っていれば、ラインはなめらかに流れます。ところが、一つだけ妙に手間のかかる命令が混じると、その手順でラインが止まり、後ろがつかえてしまう。
だから、命令を単純に、粒をそろえて作っておくと有利になります。この考え方が、次の第4章「CISCとRISC」――命令ひとつにどこまで仕事を詰め込むか、という話につながっていきます。
3.6 まとめ
- 命令ひとつは、5つの手順で完成する。 取ってくる→読み解く→計算する→メモリを使う→書き戻す。前の手順の答えで次が決まるので、順番は変えられない。
- 手順を重ねて進めるのが、流れ作業(パイプライン)。 各手順の担当が別々の命令を同時に進めるので、うまく流れれば、ほぼ1拍にひとつ命令が完成する。
- うまく流れる条件は、手順の長さが揃っていること。 だから命令は単純なほうが有利――第4章へ続く。