2-1命令の種類と実行手順
12月20日の夜9時、こむぎ堂のクリスマスケーキの予約が締め切られました。ミナトはレジ横のノートPCで、紙と通販から集まった予約を表計算ソフトに打ち込み、種類ごとの個数を集計していました。同じPCで、厨房に貼る注文書を印刷し、店頭のモニタで流すケーキの紹介動画も書き出しています。画面の砂時計はなかなか消えず、スクロールはかくかくと引っかかります。それなのに、キーボードで数字を打つと、文字だけはすぐに画面に出てきました。粉の袋を片づけていた店長がのぞき込みます。「年が明けたらPCを買い替えようか。チラシに『8コア』とか『最大4.8GHz』とか書いてあるけど、どっちの数字が大きいほうが、こういう夜に速くなるんだろう」。ミナトは相棒に打ち込みました。「遅いのに、キーを押すとちゃんと反応するのはなぜ?」
相棒の返事は、PCの中で起きていることを小さく分ける提案でした。「まず、プロセッサが1つの命令をどう片づけるかを見てみよう。速さの話は、その後でないと比べられないから」。
プロセッサ(CPU)が実行するプログラムは、主記憶に並んだ機械語の命令の列です。1つの命令は、何をするかを表す部分(命令部)と、何を相手にするかを表す部分(アドレス部、オペランドとも呼びます)からできています。「主記憶の何番地の値を読み込め」「この2つを足せ」「何番地へ書き戻せ」といった、ごく小さな動作の一つ一つが命令です。予約表で「チョコケーキの予約を1つ増やす」だけでも、プロセッサの中では、今の個数を読み込む、1を足す、書き戻す、の少なくとも3つの命令に分かれます。
プロセッサは、どの命令も同じ手順で片づけます。次に実行する命令の番地を覚えているレジスタ(プログラムカウンタ)を見て、その番地から命令を取り出す。取り出した命令の命令部を読み解き、何をすればよいかを決める。命令が主記憶のデータを使うなら、そのデータを取り出す。そして演算などの処理を実行し、結果をしまう。取出し・解読・データの取出し・実行の4段階を終えると、プログラムカウンタは次の命令を指していて、また同じ手順が始まります。この繰り返しの1周を、命令の実行サイクルと呼びます。
ここから基本情報!実行手順の段階と命令の形
実行サイクルの最初の段階、プログラムカウンタが指す番地から主記憶の命令を読み出し、プロセッサの命令レジスタへ入れる段階を命令フェッチといいます。続いて、命令レジスタに入った命令の命令部を解読し、どの演算をするのか、オペランドはどこにあるのかといった、実行に必要な制御の情報を取り出す段階が命令デコードです。この解読を受け持つ回路はデコーダ(命令解読器)と呼ばれます。
命令の中にアドレスをいくつ書くかで、命令の形も変わります。「Aの番地の値とBの番地の値を足し、結果をCの番地に入れる」のように、演算の対象2つと結果の置き場所を、3つのアドレスで別々に指定する形を3アドレス命令と呼びます。1つの命令で済むぶん命令は長くなります。結果を対象の片方に上書きする2アドレス命令や、片方をアキュムレータに決めておく1アドレス命令にすると、命令は短くなる代わりに、同じ計算に要る命令の数が増えます。
基本情報の範囲ここまで
命令の種類は、思っているほど多くありません。読む、書く、足す、比べる、次に進む場所を変える。予約の集計も、注文書の印刷も、動画の書き出しも、プロセッサから見ればこうした小さな動作を何億回も並べたものです。
ここから基本情報!機械語命令の種類
機械語の命令は、働きによっていくつかの種類に分けられます。予約の集計に当てはめると、次の表のようになります。
| 種類 | 働き | 予約の集計での例 |
|---|---|---|
| 転送命令 | 主記憶とレジスタの間、レジスタどうしでデータを移したり写したりする | チョコケーキの予約数を主記憶からレジスタへ読み込む |
| 算術演算命令 | 加算・減算・乗算・除算など、数値の計算をする | 予約数に1を足す、個数に単価を掛ける |
| 論理演算命令 | ビットごとに論理積・論理和・否定などをとる | 「配達あり」を表すビットだけを取り出す |
| シフト命令 | ビット列を左右にずらす | 個数を2倍、4倍にする |
| 比較命令 | 2つの値を比べ、結果をフラグ(状態を表すビット)に残す | 予約数が焼ける上限の60個に届いたかを調べる |
| 分岐命令 | 次に実行する命令の番地を変える | 上限に届いていたら「受付終了」の処理へ移る |
| 入出力命令 | プロセッサと入出力装置の間でデータをやり取りし、装置を制御する | 注文書のデータをプリンタへ送る |
シフト命令で2進数を左に1ビットずらすと、値は2倍になります。5は2進数で00000101で、左へ1ビットずらすと00001010、つまり10です。右へ1ビットずらせば2で割った値(余りは捨てる)になるので、2のべき乗の掛け算や割り算を、乗算命令より少ない手間で済ませられます。
比較命令と分岐命令は、組にして使います。比較命令は値を比べるだけで、次に進む場所は変えません。その結果のフラグを見て、条件を満たしたときだけ飛ぶのが条件分岐です。これに対し、条件を見ずに、いつも指定した番地へ飛ぶ分岐を無条件分岐といいます。繰返し処理の最後で、ループの先頭へ戻るときに使われます。
基本情報の範囲ここまで
2-2アドレス指定
集計表には、12月21日から25日までの5日分の予約数が、主記憶の上に並んで入っています。「5日分を合計して」と頼むと、プロセッサは同じ足し算の命令を5回繰り返します。でも、命令は同じでも、読みにいく日付の場所は毎回違います。同じ命令で、どうやって違う場所を読むのでしょうか。
命令のアドレス部に書いてある数は、いつもそのままデータの番地になるとは限りません。アドレス部の値にレジスタの値を足したり、アドレス部が指す場所にさらに番地が書いてあったりと、実際に読みにいく番地を計算で決める方法がいくつもあります。これをアドレス指定方式(アドレス修飾)と呼びます。5日分の合計は、「先頭の番地」に「何日目か」を足して番地を決める方法を使えば、同じ命令のまま読み進められます。
ここから基本情報!アドレス指定方式の計算
アドレス指定方式で計算した結果、実際にアクセスする主記憶の番地を有効アドレス(実効アドレス)といいます。方式ごとの違いは、同じ主記憶の中身で計算してみると分かります。いま、主記憶の100番地に「300」、300番地に「25」が入っていて、命令のアドレス部は100だとします。
アドレス部の値がそのまま有効アドレスになるのが直接アドレス指定です。有効アドレスは100で、読み出されるデータは300です。アドレス部が指す番地に、データではなく、データのある番地が入っているとみなすのが間接アドレス指定です。100番地を見ると300とあるので、有効アドレスは300、読み出されるデータは25です。主記憶へのアクセスが1回多くなります。
アドレス部の値を、プログラムカウンタの値に足して有効アドレスを求めるのが相対アドレス指定です。プログラムカウンタが500を指していれば、有効アドレスは600です。今いる場所から何番地先、という指定になるので、プログラムを主記憶のどこに置いても分岐先がずれず、分岐命令でよく使われます。
アドレス部の値に、指標レジスタ(インデックスレジスタ)の値を足して有効アドレスを求めるのが指標アドレス指定です。場面の5日分の予約数が100番地から104番地に並んでいるなら、アドレス部を100にしておき、指標レジスタを0、1、2、3、4と1ずつ増やしながら同じ命令を繰り返せば、100番地から104番地までを順に読めます。配列の要素を順に処理するときの方式です。
| 方式 | 有効アドレスの求め方 | 有効アドレス |
|---|---|---|
| 直接アドレス指定 | アドレス部そのまま | 100 |
| 間接アドレス指定 | 100番地の中身 | 300 |
| 相対アドレス指定 | 500+100 | 600 |
| 指標アドレス指定 | 100+3 | 103 |
基本情報の範囲ここまで
2-3割込み
動画の書き出しが半分ほど進んだところで、プリンタが止まり、画面の隅に「用紙がありません」と出ました。ミナトが紙を補充すると、印刷は続きから再開します。その間も、書き出しの進み具合を示す棒は少しずつ伸びていました。プロセッサが命令を1つずつ順に実行しているだけなら、プリンタの紙切れには、いつ気づけたのでしょう。
プロセッサが手の空いたときに入出力装置の様子を見にいくやり方では、キーを押してから文字が出るまでに待たされ、見にいくたびに本来の処理が止まります。そこでコンピュータは、何かが起きた側からプロセッサに知らせを送る方法をとります。実行中のプログラムを一時中断させ、起きたことへの処理を先にさせて、終わったら元のプログラムを続きから再開させる仕組みを割込みといいます。冒頭の夜、重い作業の最中でもキーを押した文字がすぐ出たのは、キーボードからの割込みに、プロセッサがその都度応えていたからです。
キー入力のような外からの割込みが来ると、プロセッサは今の命令を終えたところで、プログラムカウンタやレジスタの値を退避します。続いて、割込みの原因に応じた処理(割込み処理ルーチン)に移り、キーの文字を受け取る、紙切れを知らせる、といった処理をします。処理が終わったら、退避しておいた値を戻し、中断した番地から元のプログラムを再開します。動画の書き出しの側から見ると、少し止まっていたことに気づかないまま、続きを実行していることになります。
ここから基本情報!外から来る割込み
割込みは、原因がプロセッサの外にあるか、実行中のプログラムの中にあるかで二つに分けます。プロセッサの外の装置や出来事が原因になるものを外部割込み、実行中の命令が原因になるものを内部割込みといいます。紙切れもキー入力も、プログラムの外で起きたことなので外部割込みです。
入出力装置が、データの転送が終わったことや、紙切れのような異常が起きたことをプロセッサに知らせる割込みが入出力割込みです。プリンタへの送り出しを入出力装置に任せている間、プロセッサは動画の書き出しを進めておき、終わりの知らせが来てから次の仕事を渡せます。
一定の時間がたつたびに割込みを起こすタイマーをインターバルタイマといいます。OSはこのタイマー割込みを合図に、プロセッサを使うプログラムを短い間隔で切り替えます。集計・印刷・書き出しが同時に進んで見えたのは、この切り替えのおかげでもあります。
オーブンの制御基板のようなマイコンには、別の役割のタイマーが入っていることがあります。プログラムが正常に動いている間は、決まった間隔でタイマーを数え直させ、数え直しが途絶えて時間切れになったら、プログラムが止まった(暴走した)とみなして割込みやリセットをかける仕組みで、ウォッチドッグタイマと呼びます。番犬(watchdog)のように、決まった合図が来なくなったら知らせる役目です。
ハードウェアの故障や電源の異常を知らせる割込みもあります。主記憶に書いたデータのビットが、読み出したときに化けていたことを、パリティビットとの食い違いから見つけるのがメモリパリティエラーです。こうしたハードウェアの誤りや電源の異常による割込みは機械チェック割込みと呼ばれます。実行中のプログラムとは関係なく起きるので、外部割込みに分類されます。
基本情報の範囲ここまで
割込みには優先の順位もあります。電源が落ちそうだという知らせと、キーが1つ押されたという知らせが同時に来たら、先に片づけるべきは電源の方です。
ここから基本情報!内から起こす割込みと多重割込み
内部割込みの代表は、ゼロで割った、演算結果が桁あふれ(オーバーフロー)した、といった実行中の命令の異常で起きるもので、プログラム割込みとも呼ばれます。主記憶にないページを読みにいったときのページフォールトも内部割込みです。
異常ではなく、プログラムがわざと割込みを起こすこともあります。割込みを起こすための専用の命令を実行して発生させる割込みをソフトウェア割込みといいます。その主な使い道が、OSへの頼みごとです。アプリケーションのプログラムが、プリンタへの出力やファイルの読み書きをOSに依頼するときに起こす割込みをSVC割込み(スーパーバイザコール割込み)といいます。SVCはSuperVisor Callの略です。
なぜ、アプリケーションが自分でプリンタを動かさず、わざわざOSに頼むのでしょうか。プロセッサには動作の状態が二つあり、入出力装置を直接動かす命令や、主記憶の割当てを変える命令は、OSが動く特権モード(カーネルモード)でしか実行できません。アプリケーションは制限のあるユーザモードで動いているので、SVC割込みで特権モードに切り替え、OSに処理を代わってもらいます。どのプログラムでも装置を勝手に動かせたら、1つの誤りがPC全体を止めてしまうからです。
割込みの処理をしている最中に、別の割込みが来ることもあります。処理中の割込みより優先度の高い割込みなら、それを中断して先に受け付け、低いものは待たせる仕組みを多重割込みといいます。紙切れの処理中に電源異常の知らせが来れば、電源の方を先に処理し、それから紙切れの処理に戻ります。
基本情報の範囲ここまで
2-4プロセッサの性能
翌日の昼休み、店長が家電量販店のチラシを2枚、作業台に並べました。1台目は「3.2GHz」、2台目は「基本2.5GHz/最大4.8GHz」。「数字が大きいほうが速いんでしょ? でも『最大』って何?」
プロセッサの中の回路は、一定の間隔で刻まれる信号(クロック)に合わせて、一斉に一歩ずつ動きます。この信号が1秒間に何回刻まれるかをクロック周波数(動作周波数)といい、単位はHz(ヘルツ)です。3.2GHzなら1秒間に32億回です。同じ種類のプロセッサどうしなら、クロック周波数が高いほど、1秒間に進める手順が多くなります。
2台目の「最大4.8GHz」は、いつもその速さで動くわけではありません。ターボブーストは、インテル社のプロセッサにある機能の名前で、処理が重いときに、発熱や消費電力に余裕がある範囲で、クロック周波数を基本の値より一時的に引き上げます。ほかの会社のプロセッサにも、名前は違っても同じ考えの機能があります。熱がこもれば元に戻すので、薄いノートPCで重い作業を続けると、最大の値は長くは続きません。
ただし、クロック周波数だけで速さは決まりません。1つの命令を終えるのに何クロックかかるかは、プロセッサの作りによって違うからです。クロック周波数が同じ2台でも、1命令に平均4クロックかかるものと2クロックで済むものとでは、後者が倍の命令を実行できます。チラシの数字が別の種類のプロセッサどうしの比較になっているとき、GHzの大小だけでは決められません。
ここから基本情報!性能を数で比べる
クロックの1回分の時間をサイクルタイムといい、クロック周波数の逆数です。1GHzなら、1÷1,000,000,000で1ナノ秒です。1命令の実行に平均何クロックかかるかを表すのがCPI(Cycles Per Instruction)です。
1秒間に実行できる命令の数を、百万(10の6乗)を単位にして表したものがMIPS(Million Instructions Per Second)です。クロック周波数が2GHzで、CPIが4のプロセッサなら、1秒間の命令の数は2,000,000,000÷4=500,000,000、つまり500MIPSです。1命令の平均の実行時間で考えても同じで、サイクルタイム0.5ナノ秒×4クロック=2ナノ秒、1秒をこれで割ると5億命令になります。
CPIの平均は、どんな命令をどれだけの割合で実行するかで変わります。命令の種類ごとに、実行時間(またはクロック数)と出てくる割合を組にした表を命令ミックスといい、割合で重みを付けて平均をとると、そのプロセッサの平均の速さを見積もれます。予約の集計のような事務の処理を想定して、次の割合だったとします。
| 命令の種類 | 出てくる割合 | 1命令のクロック数 | 割合×クロック数 |
|---|---|---|---|
| 転送 | 50% | 2 | 1.0 |
| 演算 | 30% | 4 | 1.2 |
| 分岐 | 20% | 6 | 1.2 |
| 平均(CPI) | 100% | 3.4 |
CPIの平均は3.4です。このプロセッサのクロック周波数が3.4GHzなら、3,400,000,000÷3.4=1,000,000,000で、1,000MIPSになります。同じプロセッサでも、分岐の多いプログラムを実行すれば平均は大きくなり、MIPSの値は下がります。
科学技術の計算では、整数の命令より、小数を扱う浮動小数点数の演算の速さが問われます。1秒間に浮動小数点数の演算を何回できるかを表すのがFLOPS(Floating-point Operations Per Second)で、スーパーコンピュータやGPUの性能を表すときに、GFLOPS(10の9乗)、TFLOPS(10の12乗)のように接頭語を付けて使います。
基本情報の範囲ここまで
2-5パイプラインと命令の並列実行
こむぎ堂の朝は、生地をこねる、発酵させる、形を整える、焼く、の順に進みます。1回目の生地がオーブンに入るころ、作業台では2回目の生地を丸め、ボウルでは3回目の生地が膨らんでいます。1回分を焼き上げてから次の生地をこね始めていたら、開店に間に合いません。
プロセッサも、命令を1つ終えてから次の命令に取りかかっていたのでは、回路の多くが手を空けて待つことになります。取出し・解読・データの取出し・実行の各段階は使う回路が違うので、パンの工程と同じように、ずらして重ねられます。同じクロック周波数のまま、1秒間に終わる命令の数を増やすこの工夫が、いまのプロセッサの速さを支えています。
ここから基本情報!命令を重ねて流す
命令の実行をいくつかの段階(ステージ)に分け、1つめの命令が解読に進んだら2つめの命令の取出しを始める、というように、段階をずらして複数の命令を同時に進める方式をパイプライン(パイプライン制御)といいます。1つの命令にかかる時間は変わりませんが、命令が次々に流れ出てくるので、一定の時間に終わる命令の数が増えます。
4段階のパイプラインで、どの段階も1クロックで済むとして、5つの命令を実行してみます。重ねずに1つずつ進めると、4クロック×5命令で20クロックかかります。重ねると、1つめの命令が4クロックで出てきた後は、1クロックごとに次の命令が出てくるので、4+(5−1)=8クロックで済みます。段階の数をk、命令の数をnとすると、k+(n−1)クロックです。
流れが乱れるのは、分岐命令が来たときです。分岐するかどうかは実行の段階まで進まないと分からないので、その後ろで取り出しておいた命令が無駄になることがあります。そこで、過去の結果などから分岐先を予測し、結果が決まる前に予測した側の命令を実行しておく方法がとられます。これを投機実行といいます。予測が当たれば待ち時間がなくなり、外れたら先に進めておいた結果を捨てて、正しい側からやり直します。
パイプラインをさらに速くする方法は、大きく三つあります。
| 方式 | やり方 | パン作りにたとえると |
|---|---|---|
| スーパーパイプライン | 段階をさらに細かく分けて段数を増やし、1段あたりの仕事を軽くして、クロック周波数を上げる | 「成形」を「分割」「丸め」「形づくり」に分け、1人の持ち場を短くする |
| スーパースカラ | パイプラインを複数持ち、同時に実行できる命令をプロセッサが実行中に見つけて、並べて流す | 作業台を2台にして、手の空いた台に次の生地を回す |
| VLIW(Very Long Instruction Word) | 同時に実行できる複数の命令を、コンパイラがあらかじめ1つの長い命令にまとめておく | 前の晩に、2台の作業台それぞれの手順を1枚の指示書に書いておく |
基本情報の範囲ここまで
2-6コアの数と処理の並行
チラシの1台目には「4コア」、2台目には「8コア」とありました。店長はチラシを裏返して首をひねります。「コアって、プロセッサとは違うの? うちのPCの中にはプロセッサがいくつ入ってるんだろう」
レジ横のノートPCに入っているプロセッサは1個です。このように、1台のコンピュータがプロセッサを1個だけ持つ構成をシングルプロセッサといいます。一方、プロセッサの中で命令を取り出して実行する中心の部分を、コアと呼びます。昔のプロセッサはコアを1つしか持っていませんでした。
ここから基本情報!
コアを1つだけ持つプロセッサをシングルコアプロセッサといいます。シングルコアプロセッサを速くするには、クロック周波数を上げるかパイプラインを工夫するしかありませんが、クロック周波数を上げるほど発熱と消費電力が大きくなり、2000年代の半ばごろには頭打ちになっていきました。
基本情報の範囲ここまで
そこで、1つのプロセッサのパッケージの中にコアを複数並べ、それぞれのコアに別々の処理を同時に実行させる形が広まりました。これがマルチコアプロセッサです。コアが2つのものをデュアルコアCPU、4つのものをクアッドコアCPUと呼びます。チラシの1台目はクアッドコアです。コアがいくつあっても、パッケージとしてのプロセッサは1個です。
コアが1つしかなくても、PCでは複数のアプリケーションを同時に動かせます。OSが、それぞれのプログラムにプロセッサを使わせる時間をごく短く区切り、次々に切り替えているからです。複数の仕事(タスク)を並行して進めるこのやり方をマルチタスクといいます。コアが1つなら、ある瞬間に実行されているのは1つの仕事だけで、同時に見えるのは切替えが速いからです。コアが複数あれば、本当に同時に実行できる仕事が増えます。
1つのアプリケーションの中でも、仕事を分けられます。1つのプログラム(プロセス)の中に、並行して実行できる処理の流れ(スレッド)を複数作り、それぞれを進める方式をマルチスレッドといいます。動画の書き出しソフトは、映像を時間で区切って複数のスレッドに分け、それぞれを別のコアに処理させられます。コアが4つから8つになると、この書き出しは速くなりやすいのです。
2-7並列処理の方式
年明けから、小麦粉の値上がりに合わせて、通販の全商品を同じ割合で値上げすることになりました。ミナトが表計算ソフトで価格の列全体に同じ計算式を当てると、120品の値段が一度に書き換わります。1品ずつ計算するのと、同じ計算を120品にまとめて当てるのとでは、どこが違うのでしょうか。
処理を同時に進める方法は、コアを増やすことだけではありません。同じ命令をたくさんのデータに一度に当てる方法もあれば、別々の命令を別々のデータに当てる方法もあります。コンピュータの並列処理は、命令の流れとデータの流れがそれぞれ1本か複数本かで、四つの型に分けて考えられます。
ここから基本情報!命令とデータの流れで分ける4つの型
命令の流れ(Instruction stream)が1本(Single)か複数(Multiple)か、データの流れ(Data stream)が1本か複数かを組み合わせると、次の四つになります。この分け方は、考えた人の名前からフリンの分類と呼ばれます。
| 型 | 命令の流れ | データの流れ | 特徴と例 |
|---|---|---|---|
| SISD | 1本 | 1本 | 1つの命令で1つのデータを順に処理する。並列処理をしない、ノイマン型のコンピュータの基本の形 |
| SIMD | 1本 | 複数 | 1つの命令で複数のデータを同時に処理する。画像の画素や表の列に同じ計算を当てる処理に向く。GPUやプロセッサのベクトル演算の命令 |
| MISD | 複数 | 1本 | 1つのデータに複数の命令を同時に当てる。分類の上ではあるが、実際に使われている例は少ない |
| MIMD | 複数 | 複数 | 複数のプロセッサ(コア)が、それぞれ別の命令で別のデータを処理する。マルチコアプロセッサやマルチプロセッサシステム |
場面の値上げは、SIMDの考え方にあたります。「1.05倍する」という1つの命令を、120品の値段という複数のデータに同時に当てているからです。冒頭の夜のように、集計・印刷・動画の書き出しという別々の処理を別々のコアで進めるのはMIMDです。
基本情報の範囲ここまで
2-8マルチプロセッサシステム
夕方、通販サイトを預けているサーバの会社からメールが届きました。「クリスマス前の注文の増加に備え、サーバを2台に増やして、1台が止まってももう1台で受付を続けられるプランをご用意しています」。店長は月額の料金の欄を見て、「2台にすると、どれくらい止まりにくくなるの?」とミナトに聞きました。
同じ働きをする装置を横に並べ、どれか1台でも動いていれば全体として動き続けられるようにした構成を並列システムといいます。全部の装置がそろって動いていないと全体が止まる直列の構成と比べると、止まりにくさがはっきり違います。稼働率(全体の時間のうち、動いている時間の割合)が0.9のサーバ1台なら、止まっている割合は0.1です。2台を並列にすると、全体が止まるのは2台とも止まったときだけなので、その割合は0.1×0.1=0.01、稼働率は1−0.01=0.99に上がります。
サーバの会社のプランのように、複数のコンピュータをネットワークでつなぎ、利用者からは1台のシステムに見えるようにまとめて運用する形をクラスタ(クラスタリング)といいます。1台が故障したら残りの台が処理を引き継いで止まりにくくする使い方と、注文を複数の台に振り分けて混雑に耐える使い方があります。
ここから基本情報!プロセッサをつなぐ形と、速くなる限界
1つのシステムに複数のプロセッサを載せ、処理を分担させて速さと止まりにくさを上げる構成を、マルチプロセッサシステムといいます。プロセッサどうしのつなぎ方で二つに分かれます。
複数のプロセッサが1つの主記憶を共有し、1つのOSがすべてのプロセッサをまとめて管理する形を密結合マルチプロセッサシステムといいます。データを主記憶に置けばどのプロセッサからも読めるので、受け渡しが速く済みます。ただし主記憶は共有なので、プロセッサを増やすほど主記憶の取り合いが起き、性能は台数に比例して伸びなくなります。
それぞれのプロセッサが自分の主記憶とOSを持ち、通信でやり取りしながら処理を分担する形を疎結合マルチプロセッサシステムといいます。1台のプロセッサが故障しても、ほかは自分の主記憶とOSで動き続けられます。上で見たクラスタは、この形をコンピュータ単位で作ったものです。
複数のプロセッサで分担するときは、処理の歩調を合わせる必要があります。5日分の予約数を4つのコアで手分けして数えたら、4つとも数え終わるのを待ってから合計を出さないと、途中の数で合計してしまいます。このように、複数の処理の間でタイミングをそろえることを同期といいます。回路の世界では、共通のクロック信号に合わせて動作の区切りをそろえることも同期と呼び、そろえずに処理の終わりの合図などで進める方式を非同期と呼びます。
プロセッサを増やしても、処理が増やした数だけ速くなるとは限りません。処理の中には、手分けできない部分が必ず残るからです。並列にできない部分の割合が、全体の速さの伸びの上限を決めるという考え方をアムダールの法則といいます。処理全体のうち並列にできる部分の割合をp、プロセッサ(コア)の数をnとすると、速くなる倍率は 1÷((1−p)+p÷n)です。
冒頭の夜の動画の書き出しで、80%がコアに分けられる処理だったとします。4コアなら1÷(0.2+0.8÷4)=1÷0.4=2.5倍、8コアでも1÷(0.2+0.1)=約3.3倍です。コアをいくら増やしても、分けられない20%の時間は縮まないので、5倍を超えることはありません。
基本情報の範囲ここまで
1月の初め、ミナトは2枚のチラシの横に、あの夜の作業を書き出しました。予約の集計は、表の上から順に足していく処理で、ほとんど1つのコアで進みます。動画の書き出しは、コアを増やすほど速くなりやすい処理です。そして注文書の印刷は、プロセッサではなく、プリンタの速さと紙の残りで決まっていました。店長は2台目のチラシに丸を付けます。「集計はふだんも使うから最大4.8GHzが役に立つし、年に何回かの動画は8コアで分けてもらえばいい、ってことだね」
あの夜に画面がかくついたのは、1つのプロセッサの中で、集計と印刷と書き出しの命令が、割込みとタスクの切替えを挟みながら順番待ちをしていたからでした。クロック周波数は1つの流れの速さを、コアの数は同時に流せる本数を決めます。どちらで速くなるかは、処理を手分けできるかどうかで変わります。
ところが、新しいPCの仕様を見比べていたミナトは、もう一つの欄で手が止まりました。「メモリ8GB」「SSD256GB」。動画の書き出しが遅かったのは、本当にプロセッサだけのせいだったのでしょうか。