アウト・オブ・オーダー実行プロセッサ
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/03/12 14:15 UTC 版)
「アウト・オブ・オーダー実行」の記事における「アウト・オブ・オーダー実行プロセッサ」の解説
OoOでは、命令及び実行結果を一時溜めておく場所を作り、命令の実行を次のように細分化する。 命令フェッチ。 命令にリオーダ・バッファ(reorder buffer)のエントリを割り当てる。 命令を命令待ち行列または命令発行キュー(reservation station, issue queue)に送る(dispatch)。 命令待ち行列内の命令は、入力オペランドが得られるまで実行されない。入力オペランドが得られた段階で、待ち行列内にそれより古い命令があっても先に待ち行列から取り除かれ、実行されることになる。 命令が適当な実行ユニットに対して発行(issue)され、実行される。 実行結果がリオーダ・バッファに格納される。 リオーダ・バッファ内の命令のうち、最も古い命令の実行が完了すると、その実行結果はレジスタファイルに書き戻され、命令はリオーダ・バッファから取り除かれる。これを卒業ないしリタイア(graduation, retire)ステージと呼ぶ。命令待ち行列とは異なり、より新しい命令が実行完了状態であっても、それより古い命令がリオーダ・バッファ内にリタイアせずに残っている場合は、その(より新しい)命令がリタイアすることはできない。 OoOの鍵になるコンセプトはある命令の実行に必要なデータが得られない状態でも、プロセッサの動作を止めず他の命令を実行し続けられるようにすることである。インオーダ実行では必要なデータが全部揃わないと(2)の段階で実行が止まってしまう。この点を改善したのがOoOである。 OoOプロセッサはこの半端な時間(スロット)を他の「準備ができている」命令に当て、後にリタイアステージで実行結果をレジスタファイルに反映させる順序を修正することで、順序通り命令を実行したのと同じ結果が得られるようにする。本来のプログラムコードに書かれた命令の順序は「プログラム順」(program order)と呼ばれるが、この種のプロセッサの内部では「データ順」(data order)で扱われる。つまり、データないしオペランドがプロセッサのレジスタに用意される順序である。これら二種類の順序間の変換を行い、同時に出力に論理的な整合性を持たせるためには相当複雑な回路が必要である。プロセッサはまるでランダムな順序で命令を実行するように見える。 命令パイプラインが深くなり、主記憶装置(あるいはキャッシュメモリ)に比べプロセッサが高速になる程OoOの威力は増す。例えば、現代のプロセッサはメモリの数倍の速さで動作しており(=メモリを読み書きするのに沢山のサイクル数を必要とする)、バス上にデータが乗るのを待つのは非常にサイクル数を無駄にすることになる(ノイマンズ・ボトルネック参照)。
※この「アウト・オブ・オーダー実行プロセッサ」の解説は、「アウト・オブ・オーダー実行」の解説の一部です。
「アウト・オブ・オーダー実行プロセッサ」を含む「アウト・オブ・オーダー実行」の記事については、「アウト・オブ・オーダー実行」の概要を参照ください。
- アウト・オブ・オーダー実行プロセッサのページへのリンク