命令パイプライン

読み:めいれいぱいぷらいん / 英語表記:instruction pipeline

CPUの命令処理を複数の段階に分け、異なる命令の処理を重ね合わせて進める仕組み。一つの命令の完了を待ってから次を始める方式に比べ、単位時間に処理できる命令数を増やせる。

イマシルちゃんの解説

命令パイプラインは、CPUが命令を処理する手順をいくつかの段階に分けて進める方式だよ。
命令を読み出す段階や、意味を調べる段階、計算する段階などに分けるんだ。
先の命令が計算に進んだら、空いた段階では次の命令を読み出せるよ。
料理で切る担当が次の材料に取りかかる間に、別の担当が先の材料を調理するのと似ているね。
一つの命令に必要な作業が減るわけではないけれど、各段階を休ませずに使えるので、次々と処理を終えやすくなるんだ。

より深い解説

段階を分けて並行に進める

命令の読出し、解読、演算、結果の書込みなどを段階に分ける。段階の数や分け方はCPUによって異なる。各段階で別の命令を扱い、処理の途中を重ね合わせて実行する。

観点意味
深さ一つの命令が通る段階の数
パイプラインピッチ次の段階へ処理を進める時間の間隔
レイテンシ一つの命令が完了するまでの時間
スループット単位時間に完了する仕事の量

一つの命令が速く終わることと、全体で多くの命令を終えられることは異なる。段階を分ける目的は、主に後者の改善である。

理想的な実行時間

深さをD、各段階の時間をP秒、命令の個数をIとする。最初の命令にはD × P秒かかり、その後は一つずつ1ピッチの間隔で完了する。

最初の命令にかかる時間 = D × P
残る命令にかかる時間 =(I − 1)× P
全体の時間 = (D + I − 1)× P

この式は、1本のパイプライン、各段階の時間が等しいこと、途中で待ちが生じないことを仮定している。命令ごとの所要時間を単純に加算すると、重なって進む分を無視した計算になる。

独自の数値例

深さ4、各段階2ns、命令数6という条件を考える。

対象計算結果
最初の命令の完了4 × 28ns
残りを終えるまで(6 − 1)× 210ns
全体(4 + 6 − 1)× 218ns
重ねず順番に処理する場合6 × 4 × 248ns

命令の個数が多いほど、最初に全段階を満たす時間の割合は小さくなる。ただし、深さを増やすだけで無条件に性能が上がるわけではない。

処理が止まる要因

通常どおり次へ進めない要因を、パイプラインハザードという。

種類例
データハザード前の命令の演算結果を、次の命令が必要とする
制御ハザード分岐先が決まるまで次の命令を確定できない
構造ハザード同時に使いたい回路やメモリなどの資源が競合する

必要に応じて処理を待たせるストールや、結果の受渡しの工夫、分岐予測などで対処する。実測の性能では、これらの待ちと予測失敗の影響も含めて評価する。

ほかの並列化との違い

スーパースカラは複数の実行系列などを使い、一度に複数の命令を扱う考え方である。マルチプロセッサはCPU自体を複数用意する。処理段階を分けること、実行できる系列を増やすこと、CPUを増やすことを区別する。

命令の割当てと内部制御

VLIWでは、並列に実行する複数の操作を長い命令語にまとめる。どの演算器へ割り当てるかを、主にコンパイラが静的に決める。一方、スーパースカラでは、実行時にプロセッサが命令の並列実行を判断する。

マイクロプログラム制御は、機械語命令の処理を、内部の細かな制御操作の列によって実現する方法である。命令処理を複数の段階に分け、別の命令の各段階を重ねるパイプライン制御とは、着目する点が異なる。

実際の試験ではここに出る!全2問

ネットワークスペシャリスト

午前Ⅱ

テクニカルエンジニア(ネットワーク)

午前
↑