プロセッサの高速化技術(processor speedup techniques)

分類
テクノロジ系 コンピュータ構成要素
出る試験
基本情報応用情報
重要度
★★★☆☆

命令を重ねて流す工夫でプロセッサを速くする技術。代表がパイプラインで、工場の流れ作業と同じ考え方。

もう少し詳しい説明

プロセッサ(計算と命令の実行を受け持つ部品。CPUと同じものを指します)を速くする方法は、大きく2つに分かれます。クロック周波数を上げて1拍を短くするか、1拍で進む仕事を増やすか。周波数のほうは、出た熱を捨てきれなくなって上げられなくなったので、現在の主役は後者です。ここで説明するのは、その後者の工夫です。

パイプライン

パイプラインは、命令の処理を段階に分け、1段階ずらして次の命令を流し込むやり方です。

プロセッサは1つの命令を「取り出す → 解読する → 実行する → 書き戻す」という段階に分けて処理します。1つずつ順番にやると、解読している間、取り出す装置は何もしていません。この遊びをなくすのがパイプラインです。

1234567クロック命令1読解実書命令2読解実書命令3読解実書命令4読解実書
読=命令フェッチ、解=解読、実=実行、書=書き戻しです。1段階ずらして次の命令を流し込むので、4命令が7クロックで終わります(1つずつ順番にやると16クロック)。色の付いた4クロック目を縦に見てください。4つの段階が同時に動いていて、どの装置も遊んでいません。

命令1を解読している間に、命令2を取り出し始める。命令1を実行している間に、命令2を解読し、命令3を取り出す。こうしてどの装置も常に何かをしている状態にします。

コインランドリーに例えると分かりやすいです。 洗濯 → 乾燥 → 畳む の3段階があるとき、1人分を最後まで終えてから次の人を始めるのではなく、1人目が乾燥機に入った時点で2人目の洗濯を始める。全体にかかる時間が大きく縮みます。

必要なクロック数は式で出ます。

クロック数 = 段数 + 命令数 − 1

図の例は4段・4命令なので、こうなります。

クロック数 = 4 + 4 − 1 = 7クロック(重ねずに1つずつやると 4 × 4 = 16クロック)

重ねずに1つずつ実行した場合(16クロック)の、半分以下で終わっています。

なぜ「段数 + 命令数 − 1」になるのか

この式は丸暗記しなくても組み立てられます。2つに分けて見てください。

クロック数 = 〔段数〕 + 〔命令数 − 1〕

上の図(4段・4命令)に当てはめると、こうなります。

クロック数 = 〔4〕 + 〔4 − 1〕 = 4 + 3 = 7(重ねなければ16)

前半の「段数」は、1本目の命令が終わるまでにかかる時間です。4段なら、命令1が書き戻しを終えるまでに4クロックかかります。

この4クロックのあいだ、パイプラインはまだ満員になっていません。上の図の左上を見てください。1クロック目に動いているのは「読」の装置だけで、残り3つは何もしていません。2クロック目で2つ、3クロック目で3つ、そして4クロック目でようやく4つすべてが動き出します。この満員になるまでの助走期間のことを、立ち上がりと呼んでいます。

後半の「命令数 − 1」は、助走が終わったあとにかかる時間です。いったん満員になれば、あとは1クロックごとに1命令ずつ仕上がっていきます。

命令1より後の3命令で、3クロック。これが「命令数 − 1」の正体です。最初の1命令だけは助走に含まれているので、1を引いています。

命令が多いほど得をする

ここが実際の性能に効いてくる点です。助走にかかる時間(段数ぶん)は、命令が何個あっても変わりません。 4命令でも1000命令でも、立ち上がりは同じ4クロックです。一方、仕上がっていくほうは命令数に比例して増えます。

ということは、命令数が多いほど、全体に占める助走の割合が小さくなり、無駄が減ります。4段のパイプラインで数を変えて並べると、こうなります。

命令数パイプライン重ねない場合1命令あたり
4命令7クロック16クロック1.75クロック
10命令13クロック40クロック1.3クロック
1000命令1003クロック4000クロック約1.003クロック

右端の列を縦に見てください。命令数が増えるほど、1命令あたりのクロック数が1に近づいていきます。これはつまり「1クロックで1命令が仕上がる」状態で、パイプラインが目指している理想の形です。

実際のプログラムは何億という命令を実行するので、助走の4クロックは誤差の範囲になります。パイプラインが現在のプロセッサで当たり前に使われているのは、このためです。

パイプラインが乱れるとき

パイプラインは次に何をするかが決まっていることを前提にしています。これが崩れると止まります。これをハザードと呼びます。

いちばん困るのが分岐です。「もし○○なら飛ぶ」という命令があると、その条件が確定するまで、次に取り出すべき命令が分かりません。先に取り出してしまった命令が無駄になり、パイプラインを捨てて入れ直すことになります。

対策として、分岐予測(どちらに飛びそうかを過去の傾向から当てる)や投機実行(当たると見込んで先に実行してしまう)が使われます。外れたら捨てるだけなので、当たる確率が高ければ得になります。

もっと速くする3つの方向

パイプラインを前提に、さらに踏み込んだ技術が3つあります。何を増やすのかで区別してください。

技術何を増やすかひとことで
スーパーパイプライン段数段階をもっと細かく割って、1段を短くする
スーパースカラパイプラインの本数パイプラインを複数並べ、同時に複数命令を流す
VLIW1命令に詰める処理同時に実行できる処理を1つの長い命令にまとめておく

3つとも言葉が似ていて取り違えやすいので、ひとつずつ図で見ていきます。

スーパーパイプライン:段をもっと細かく割る

段数を増やす方式です。さきほどの4段を、さらに半分ずつに割って8段にします。

12345678910クロック命令1読1読2解1解2実1実2書1書2命令2読1読2解1解2実1実2書1書2命令3読1読2解1解2実1実2書1書2
色を付けた読1・読2のように、1つの段階が2つに分かれています。1段あたりの仕事が軽くなるので、その1段を短い時間で終えられる、つまりクロックを速くできます。そのかわり、1本目の命令が終わるまでの助走が8クロックぶんに伸びるので、分岐の予測を外して作り直すときの損も大きくなります。

なぜ細かく割ると速くなるのか。 パイプラインでは、いちばん時間のかかる段に合わせてクロックの間隔を決める必要があります。4段のうち1つだけ重い仕事があると、ほかの3段は早く終わっていても、その重い段が終わるまで次へ進めません。つまりいちばん遅い段が全体の足を引っ張ります。

そこで、重い段を2つに割って軽くします。どの段も軽くなれば、1段にかける時間そのものを短くできる、つまりクロック周波数を上げられます。1拍が短くなるので、同じ1秒でより多くの命令を流せます。

コインランドリーでいえば、「洗濯」という1工程を「給水・洗い・すすぎ・脱水」の4工程に割るようなものです。1人が次の機械へ移るまでの間隔が短くなり、行列が速く流れます。

弱点は、立ち上がりが長くなることです。段数が8になると、1本目の命令が終わるまでに8クロックかかります。分岐の予測を外してパイプラインを捨てたとき、作り直しにかかる時間もそのぶん大きくなります。

スーパースカラ:ラインそのものを増やす

パイプラインの本数を増やす方式です。同じものを2本3本と並べて、1クロックに複数の命令を同時に流し込みます。

12345クロック命令1読解実書命令2読解実書命令3読解実書命令4読解実書
パイプラインを2本用意した場合です。色を付けた1クロック目を縦に見てください。命令1と命令2が同時に始まっています。1クロックごとに2命令ずつ流し込めるので、4命令が5クロックで終わります(1本なら7クロックです)。

4命令を2本のパイプラインに振り分けると、5クロックで終わります。1本のときは7クロックだったので、さらに短くなりました。

注目すべきは1命令あたりのクロック数(CPI。Cycles Per Instruction)です。満員になったあとは1クロックに2命令ずつ仕上がるので、CPIは0.5になります。CPIは1が理想だと説明しましたが、スーパースカラは1を下回れるのです。4本並べれば0.25です。

ただし、いつでも本数ぶん速くなるわけではありません。2つの命令が同時に流せるのは、互いに関係がないときだけです。「命令2が、命令1の計算結果を使う」という関係があると、命令1が終わるまで命令2は進めません。どの命令なら同時に流せるかを、プロセッサが実行しながら判断しています。

VLIW:1つの命令に処理を詰め込む

1つの命令に入れる処理を増やす方式です。名前のとおり(Very Long Instruction Word = とても長い命令語)、ふつうより長い命令を使います。

ここだけ、ほかの2つと考え方が根本的に違います。

プログラムふつうに書いたものコンパイラ同時にやれる処理を探して詰める1つの長い命令4つぶんの処理が入っているプロセッサ中身をそのまま並べて実行するだけ
VLIWでは、同時に実行してよい処理を探す仕事をコンパイラが受け持ちます。プロセッサが動き出す前、プログラムを翻訳する段階で済ませてしまうということです。プロセッサ側は、1つの長い命令に詰め込まれた処理をそのまま並べて実行するだけなので、回路が簡単になります。そのかわり、うまく詰め込めるかどうかはコンパイラの出来次第です。

スーパースカラでは、「どの命令なら同時に流せるか」をプロセッサが動きながら判断していました。そのための回路が必要で、複雑になります。

VLIWは、その判断をコンパイラに任せます。コンパイラは、人が書いたプログラムを機械語(プロセッサがそのまま実行できる、0と1で書かれた命令)へ翻訳するソフトです。その翻訳の段階で「この4つは同時にやって大丈夫だ」と調べ上げ、1つの長い命令にまとめて詰めておきます。プロセッサは中身を疑わず、詰められたとおりに並べて実行するだけです。

長所は、ハードウェアが簡単になること。 判断する回路が要らないので、その分を別のことに使えます。

短所は、コンパイラ任せになること。 うまく詰められなければ、長い命令の中に空きができてしまい、効果が出ません。また、同じプログラムが別の設計のプロセッサでは動かないことがあります(詰め方がプロセッサの構造と結びついているため)。

VLIWだけは、仕事を分けるのがプロセッサではなくコンパイラ。ここが試験での区別点です。問題文に「コンパイラ」が出てきたらVLIW、と覚えてしまって構いません。

並べる方向の高速化

ここまでは1つのプロセッサの中を速くする話でした。別の方向として、プロセッサやコアそのものを増やすやり方があります。これはマルチプロセッサで扱います。

試験ではこう出る

科目A(旧・午前)では、パイプラインのクロック数計算が定番です。「段数 + 命令数 − 1」の式がそのまま使えます。選択肢には段数 × 命令数(重ねなかった場合)が必ず混ざります。

次に多いのが、スーパースカラ・スーパーパイプライン・VLIWの区別です。説明文を読んでどれかを選ばせる形で、

という対応を押さえれば解けます。VLIWにコンパイラが出てくるのが一番の手掛かりです。

応用情報では、ハザードや分岐予測の仕組み、パイプラインの効果が薄れる条件まで踏み込んで問われます。

関連する用語

プロセッサ
命令を取り出して実行する部品。その中で命令を重ねて流すのがパイプライン
クロック周波数
1秒間の拍の数。これを上げられなくなったので、1拍で進む量を増やす方向に変わった
CPI・MIPS・FLOPS
性能指標。パイプラインはCPIを1に近づける技術と言える
マルチプロセッサ
プロセッサの数を増やす方向の高速化。1つの中を速くするのとは別の道

ミニクイズ

各段階が1クロックで終わり、待たされることはないものとする。5段のパイプラインを持つプロセッサで10個の命令を実行するとき、必要なクロック数はいくつか。

正解は 4番:14クロック

最初の命令が終わるまでに5クロックかかり、そのあとは1クロックごとに1命令ずつ仕上がります。残り9命令で9クロックなので、5 + 9 = 14クロックです。式にすると「段数 + 命令数 − 1」です。50クロックは重ねずに1つずつ実行した場合(10×5)、15クロックは段数と命令数を単純に足した値、10クロックは最初の命令の立ち上がりを数え忘れた値です。

間違えた用語の復習リストを見る →

この分野をまとめて解く → コンピュータ構成要素とハードウェアのミニテスト(全33問)

最終更新:2026-10-12