Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

アウトオブオーダー実行(アウトオブオーダーじっこう)とは | 意味や読み方など丁寧でわかりやすい用語解説

アウトオブオーダー実行(アウトオブオーダーじっこう)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

アウトオブオーダー実行 (アウトオブオーダーじっこう)

英語表記

out-of-order execution (アウトオブオーダーエクスキューション)

用語解説

アウトオブオーダー実行は、現代の高性能なCPUに広く採用されている、プログラムの処理速度を向上させるための重要な技術である。日本語では「順序外実行」とも呼ばれる。コンピュータのプログラムは、人間が記述した命令が順番に並んだものであるが、アウトオブオーダー実行機能を持つCPUは、この命令を必ずしも書かれた順序通りには実行しない。その代わりに、命令間の依存関係をCPU自身が解析し、実行の準備が整った命令から順次、前倒しで実行していく。例えば、ある計算結果を待たなければならない命令があっても、その待ち時間中に、その計算とは無関係で先に実行できる後続の命令を見つけ出して処理を進める。これにより、CPU内部の計算ユニットが遊んでいる時間を極力減らし、処理全体の効率を大幅に高めることができる。重要なのは、たとえ内部的な実行順序が入れ替わったとしても、最終的にプログラムから見える実行結果は、命令が書かれた通りの順序で実行された場合と全く同じになるように、CPUが厳密に制御している点である。この仕組みによって、プログラマはCPUの内部動作を意識することなく、高速化の恩恵を受けることが可能となる。

アウトオブオーダー実行の理解を深めるためには、まずその対義語である「インオーダー実行(順序通り実行)」の問題点を把握する必要がある。初期の単純なCPUは、プログラムに書かれた命令を1番目、2番目、3番目と愚直に順番通り実行していた。この方式はパイプライン処理という技術で高速化されたが、限界があった。パイプライン処理では、命令の実行を複数のステージ(命令の読み込み、解読、実行、結果の書き込みなど)に分割し、流れ作業のように並行処理する。しかし、インオーダー実行のパイプラインでは、ある命令が前の命令の実行結果を利用する場合(データ依存)、前の命令の処理が完了するまで後続の命令は待機状態(ストール)に入ってしまう。このストールが発生すると、たとえ後続に依存関係のない実行可能な命令があったとしても、それらもまとめて待たされることになり、CPUの性能が十分に引き出せないという課題があった。

このインオーダー実行の非効率性を解決するために考案されたのが、アウトオブオーダー実行である。アウトオブオーダー実行を行うCPUの内部は、インオーダー実行のCPUよりもはるかに複雑な構造を持つ。処理の流れは概ね次のようになる。まず、プログラムの命令は順番通りにCPUに読み込まれ、解読(デコード)される。ここまではインオーダー実行と変わらない。次に、デコードされた命令はすぐには実行されず、「リオーダバッファ」や「命令ウィンドウ」と呼ばれる一時的な格納領域に送られる。この際、「レジスタ・リネーミング」という重要な処理が行われる。これは、プログラム上のレジスタ(CPU内の一時的な記憶領域)と、CPU内部に多数用意された物理的なレジスタを動的に割り当て直す技術である。これにより、本来は無関係なのに偶然同じレジスタを使っていることによる見せかけの依存関係(偽の依存関係)を解消し、命令の並列実行の可能性を最大限に引き出す。

リオーダバッファに溜められた命令群の中から、スケジューラと呼ばれる回路が、実行に必要なデータが全て揃っている命令を常に監視している。そして、依存関係が解消され実行可能になった命令を見つけ次第、空いている演算ユニット(加算器や乗算器など)に送り込んで実行させる。この段階で、プログラム上の順序とは異なる順番で命令が実行されることになる。複数の演算ユニットが同時に並列して、それぞれ異なる命令を処理することで、CPU全体のスループットが劇的に向上する。

実行が終わった命令の結果は、すぐにはプログラムから見える状態にはならず、一旦リオーダバッファ内に保持される。そして、CPUは元のプログラムの命令順を記憶しており、その順序に従って結果を確定させていく。この処理を「コミット」または「リタイア」と呼ぶ。つまり、1番目の命令の実行結果が確定し、次に2番目の命令の結果が確定し、というように、最終的な結果の書き込みは必ずインオーダー(順序通り)で行われる。この厳密な順序管理により、途中の実行順序がどれだけ入れ替わろうとも、プログラムの正当性が保証されるのである。もし途中で例外処理や分岐予測の失敗が発生した場合は、その命令以降の処理結果をすべて破棄し、正しい状態から処理をやり直すことができる。

このように、アウトオブオーダー実行は、CPUの計算資源を最大限に活用して性能を高めるための洗練された技術である。しかし、その反面、CPUの内部回路は極めて複雑化し、設計コストや消費電力が増大するというデメリットも存在する。また、より積極的に性能を追求するために行われる「投機的実行」と組み合わせられることが多く、これが近年問題となった「Spectre」や「Meltdown」といったセキュリティ上の脆弱性の原因の一つともなった。それでもなお、アウトオブオーダー実行は、今日の高性能プロセッサにおいて不可欠な基本技術として、その中核を担い続けている。

関連コンテンツ