NOP

料理から学ぶCPUアーキテクチャ

先日「なるばい!お弁当男子宣言」をいたしました。

なるばい!は佐賀県の方言でして、意味は「なってやる!」です。

今まで本当に料理をしてこなかったのですが、

この10日間で、下記のメニューを作りました。弁当のメニューになったものもあるし、夕食として作ったものもあります。

ということで、数は少ないながらもちまちま料理を行う中で

「料理はCPUと同じだ」

という気づきを得るに至りました。

理系の人間、特にプログラマは即刻料理を始めるべきです。

チャーハンをつくる場合(逐次処理)

ここまで読んだ人は「こいつ、なにを言ってるんだ?」と訝しんでいることでしょう。

安心してください。最後まで読んでも「こいつ、なにを言ってるんだ?」となって終わります。いつも通りです。投げない!ブレない!。

さて、チャーハンを作る場合の工程ですが、大まかに言えば

  1. お米を炊く
  2. 材料を切る
  3. 炒める
  4. 盛り付ける

というステップを刻むことになります。

このステップをパソコンのCPUに強引に当てはめれば、例えばADD命令(足し算)を取り上げると

  1. ADD命令を解釈する(今から足し算をするぞ!と理解する)
  2. 足す数と足される数をメモリからREADしてくる
  3. 足し算を実行する
  4. 結果をアウトプット(メモリにライトバック;書き戻し)する

ということになりますね。

ならないかもしれないけどなるってことにしときます。

チャーハンをつくる場合(パイプライン処理)

先ほどあげた、チャーハン作成の工程

  1. お米を炊く
  2. 材料を切る
  3. 炒める
  4. 盛り付ける

について、

仮に、十分なスペースと調理器具、そして人手があると仮定すれば

上記4ステップは並行して実行することが可能です。

チャーハン3人前を作ることを考えます。

説明のために、一気に3人分作るのではなく、

1人前ずつ別個につくることとします。

リンガーハット方式ですね。

仮に一人での調理(逐次処理)であれば、

チャーハン3人前(便宜上、チャーハン○、△、□と名づけます)

を作る過程は下記の通りです。

まずチャーハン○を完成させて、次にチャーハン△に取り掛かって、、

という流れです。数字は時間を表しています。時間8でようやくチャーハン△が完成しています。

次に、炊く・切る・炒める・盛るをそれぞれ一人の担当者に割り振って、合計四人で調理する場合は下記の通り。

チャーハン□まで完成するのにトータル時間6で済んでいます。

チャーハンに喩えたせいで話が分かりづらくなってきました。

もう一度CPUに話をもってくると

  1. ADD命令を解釈する(IF)
  2. 足す数と足される数をメモリから(RD)
  3. 足し算を実行する(EX)
  4. 結果をアウトプット(メモリにライトバック)する(WR)

という各工程はそれぞれの演算を行う機器が独立して存在していれば

とうように実行可能です。

IF(Instruction Fetch;命令取得・解読)では

「今度は足し算やるぞ!その次は引き算、さらにかけ算ね!」という指示をだし(○、△、□に対応)

RD(READ; データ読み込み)は、

それぞれの演算の対象となるデータをメモリからそれぞれ読み込んできます。

EX(Execute;処理実行)で実際に演算を行い

WR(Write Back)では、演算結果をメモリに書き戻します。

このように、

「チャーハンを作る」という一つの作業を

「炊く」「切る」「炒める」「盛る」という要素に分割して、

それぞれを並列に実行するようなアーキテクチャを

「パイプライン」と呼びます。

4工程に分割しているので4段パイプラインです。

ちなみに上記の画像で時間として割り振った数字が、クロック周波数に該当します。

クロック周波数が高いほど演算が速いというのは、CPUの各機能はクロックと歩調を合わせて(同期して)

演算を行うから、ということです。

まとめ

パイプライン CPUのアーキテクチャを理解することで

料理も上手にできるわけではないことがわかりました。

そして、強引に料理とCPUアーキテクチャを結び付けようとしたら

余計分かりにくくなってしまうことが分かりました。

これは完全に説明力不足です。

料理と共に、精進します。。。

渾身のたまご&たまご弁当

=====

編集後記:

先日負傷した背中の痛みがMAXです。

定期券を落し、警察署に遺失届をだしてきました。

若干風邪気味です。

そろそろいいことが起こりそうな気がする!

一日一新:

ヤフオク!出品