インオーダー実行とアウトオブオーダー実行の違い:発行順・ハザード・回路規模・IPCを比較

インオーダー実行のCPUは、命令をプログラムの順に発行して実行します。前の命令がキャッシュミスなどで待つと、後ろの命令も止まります。アウトオブオーダー実行のCPUは、依存関係を調べて準備のできた命令から先に実行し、結果はリオーダバッファ(ROB)でプログラムの順に確定させます。待ち時間の間に別の命令を進められるのでIPCが高くなりますが、レジスタリネーミングや命令を選ぶ回路が必要になり、回路の規模と電力が大きくなります。

項目インオーダー実行アウトオブオーダー実行
命令の発行・実行の順プログラムの順準備のできた命令から、順序を入れ替えて実行する
結果の確定(リタイア)プログラムの順リオーダバッファ(ROB)で、プログラムの順に確定する
前の命令が待っているとき後ろの命令も止まる(ストール)依存しない後ろの命令を先に進める
データハザードへの対応フォワーディングとストール。命令の並べ方はコンパイラに頼るフォワーディングに加え、ハードウェアが動的に命令をスケジューリングする
見かけの依存(WAR・WAW)順序を守るので、基本的に問題になりにくいレジスタリネーミングで物理レジスタを割り当て直して取り除く
主な追加の回路少ない。簡素なパイプラインリネーミングの表、物理レジスタ、発行キュー、ROB、ロード・ストアキュー
キャッシュミスの影響大きい。ミスのたびにパイプラインが止まりやすい数百命令分の窓の中で別の命令を進め、待ち時間の一部を隠せる
IPC低め。同じ発行幅ならアウトオブオーダーより低い高い。広い発行幅と組み合わせて1を大きく超える
回路規模と電力小さい。面積や電力あたりの性能を高めやすい大きい。命令を選ぶ回路やROBの面積と電力が増える
使われる場所マイコン、組込み用の小さなコア、省電力を優先するコアの一部、GPUの演算コアPC・サーバー・スマートフォンの高性能コア

数値は代表的な目安で、世代や製品によって異なります。

どんなときに使うか

インオーダー実行
面積と電力を小さく抑えたいとき、実行時間を予測しやすくしたいとき。マイコンや組込み用のコア、多数の小さなコアを並べる設計などで使います。
アウトオブオーダー実行
1本のスレッドをできるだけ速く実行したいとき。PCやサーバー、スマートフォンの高性能コアで使います。
組み合わせ
1つのチップに、アウトオブオーダーの高性能コアと、インオーダーや規模を抑えたアウトオブオーダーの省電力コアを並べる構成があります。重い処理は高性能コアに、軽い処理は省電力コアに割り当てて、性能と電力を両立させます。

よくある質問

アウトオブオーダー実行で、プログラムの結果が変わってしまうことはないのですか?

1本のスレッドの中では変わりません。実行の順序は入れ替えても本当のデータの依存(RAW)は守り、結果はリオーダバッファでプログラムの順に確定させるからです。分岐予測ミスや例外が起きたときは、それ以降の命令の結果を捨てて正しい状態に戻すので、外から見るとプログラムの順に実行したように見えます。

インオーダー実行でも、1サイクルに複数の命令を実行できますか?

できます。順序を守ったまま、隣り合う依存のない命令を同時に発行するインオーダーのスーパースカラがあります。ただし、前の命令が止まると後ろも進めないので、アウトオブオーダーほどIPCは上がりません。

レジスタリネーミングとROBは、それぞれ何をしますか?

レジスタリネーミングは、同じレジスタ名の使い回しで生じる見かけの依存(WARとWAW)を、物理レジスタを割り当て直して取り除き、並列に実行できる命令を増やします。ROBは、順序を入れ替えて実行した命令の結果を保持し、プログラムの順に確定させて、正確な例外を実現します。

インオーダーのCPUで性能を上げるにはどうしますか?

コンパイラが命令の並べ方を工夫し、ロードの結果を使う命令を離して置くなど、待ちが起きにくい順に並べます。フォワーディングでストールを減らすほか、キャッシュミスを減らすデータの並べ方やプリフェッチも効果があります。

理解度チェック

命令の依存関係を調べ、実行できる命令からプログラムの順序と異なる順で実行して性能を高める方式はどれか。

  1. Aインオーダー実行
  2. Bアウトオブオーダー実行
  3. Cシングルサイクル実行
答えと解説を見る

正解:B. アウトオブオーダー実行

アウトオブオーダー実行では、前の命令の結果やメモリからのデータを待っている命令を後回しにし、準備のできた後続の命令を先に実行します。特にキャッシュミスの待ち時間に別の仕事を進められるのが大きな利点です。数百命令分の窓から実行できる命令を探す回路、レジスタリネーミング、結果を順序どおりに確定するリオーダバッファなどが必要で、回路と電力は大きくなります。

アウトオブオーダー実行のCPUで、順序を入れ替えて実行した命令の結果を、プログラムの本来の順序で確定(リタイア)させるための仕組みはどれか。

  1. Aリオーダバッファ
  2. Bスヌープフィルタ
  3. CTLB
答えと解説を見る

正解:A. リオーダバッファ

リオーダバッファは、順序を入れ替えて実行された命令の結果を一時的に保持し、プログラムの順序どおりに確定(リタイア)させる仕組みで、最近の高性能コアでは数百命令分の大きさがあります。分岐予測ミスや例外が起きたときは、それ以降の命令の結果を捨てて正しい状態に戻せるため、外から見るとプログラムどおりに実行されたように見えます(正確な例外)。

アウトオブオーダー実行のCPUで使われるレジスタリネーミングの主な目的はどれか。

  1. Aレジスタの数を減らして回路を小さくする
  2. Bプログラムが使うレジスタ名を変えずに、物理レジスタを割り当て直して、見かけ上の依存(WARやWAW)を取り除く
  3. Cレジスタの値を暗号化する
答えと解説を見る

正解:B. プログラムが使うレジスタ名を変えずに、物理レジスタを割り当て直して、見かけ上の依存(WARやWAW)を取り除く

命令セットのレジスタ数は16〜32個程度と限られるため、同じレジスタ名が使い回され、本当のデータの流れとは関係のない依存(逆依存WAR、出力依存WAW)が生じます。レジスタリネーミングは、数百個の物理レジスタを動的に割り当て、書き込みのたびに新しい物理レジスタを使うことでこれらを取り除き、並列に実行できる命令を増やします。本当の依存(RAW)は取り除けません。

  1. 1クロックサイクルに複数の命令を同時に発行・実行するプロセッサの方式を何と呼ぶか。
  2. パイプラインで、前の命令の結果を次の命令がすぐ使う(データハザード)とき、レジスタへの書き込みを待たずに演算結果を直接次の命令に渡す手法はどれか。
  3. 1クロックあたりに実行できる命令数を表す指標はどれか。

CPU・アーキテクチャの練習問題へ

関連する用語の解説

アウトオブオーダー実行
命令の依存関係を調べ、実行できる命令からプログラムの順序と異なる順に実行して性能を高める方式。結果はリオーダバッファで本来の順に確定させる。
スーパースカラ
1クロックサイクルに複数の命令を同時に発行・実行するプロセッサの方式。複数の演算器を並べ、互いに依存しない命令を並列に処理する。
IPC
Instructions Per Cycle の略で、1クロックあたりに実行できる命令の数。CPUの設計上の効率を表し、性能はおおよそIPCとクロック周波数の積になる。逆数はCPI。
パイプライン処理
命令の処理を取り出し・解読・実行などの段階に分け、複数の命令を少しずつずらして同時に処理する方式。
分岐予測
条件分岐の結果を実行前に予測し、パイプラインを止めずに先の命令を処理する技術。予測が外れると処理をやり直す。

関連する比較