|
アウト・オブ・オーダー実行(-じっこう、)とは、高性能プロセッサにおいてクロックあたりの命令実行数(IPC値)を増やし性能を上げるための手法の1つで、機械語プログラム中の命令の並び順に依らず、データなどの依存関係から見て処理可能な命令について逐次開始・実行・完了させるものである。頭文字で'OoO'あるいは'O-o-O'とも書かれる。「順序を守らない実行」の意である。 プロセッサの設計と実装において、命令レベルの並列性(''Instruction-level parallelism''; ILP)を高めることは1つの目標でありスーパースケーラにより1サイクルあたり2命令を越えることが可能になったが、フォンノイマンアーキテクチャの前提である逐次実行が、並列化を施す上での障壁となる。アウト・オブ・オーダー実行(以下、OoO)は、結果(意味)に影響を与えないことを保証しながら可能な限り順序に従わずどんどん実行することにより、複数命令の同時実行の可能性を広げる最適化手法の1つである。 アウト・オブ・オーダー実行に対して、順序通り実行することを、イン・オーダー実行と言う。 == 歴史 == 最初にアウト・オブ・オーダー実行を行ったマシンは、1960年代のCDC 6600とされている。6600ではscoreboardingという手法が発明された。ライト・アフター・ライト (WAW) 及びライト・アフター・リード (WAR) を解決しているが、レジスタ・リネーミングは行っていない。続いてIBM System/360 モデル91がTomasuloのアルゴリズム(データを更新する場合、共通データバスにブロードキャストする)を導入した。scoreboardingとTomasuloのアルゴリズムはどちらもこの分野における基本的なアイディアである。 アウト・オブ・オーダー実行はある種のデータフロー手法とも言える。データフローマシンは1980年代のコンピュータアーキテクチャー研究の主戦場であった。1980年代にこの分野に関連する研究をリードしたのはYale Pattと彼の開発になるHPSmシミュレータであった。 現実のコンピュータでは、ゼロ除算やページフォールトといった例外が発生するが、アウト・オブ・オーダー実行中のそれらへの対処は頭の痛い問題である。1985年のJ.E.Smith & A.R.Pleszkunの論文によって、アウト・オブ・オーダー実行において例外をうまく処理する手法が示された。 最初にアウト・オブ・オーダー実行を行った商用マイクロプロセッサは1990年発表のPOWER1とされている。x86ではP6マイクロアーキテクチャ(Pentium Pro、1995年)が初である。他には、IBMとモトローラのPowerPC 601 (1992/1993)、富士通とHALのSparc641 (1995)、ヒューレット・パッカードのPA-8000 (1996)、MIPSの MIPS R10000 (1996)、AMD K5 (1996)、DEC Alpha の 21264 (1998)などがある。 OoOではないことを特に示す意味があるだろうプロセッサには、サンのUltraSPARC(SPARC T3以前の場合。富士通のSPARC64では実現)、インテルとヒューレット・パッカードが共同開発したItanium、トランスメタのCrusoeなどがある。これらでは、レジスタウィンドウがレジスタリネーミングと相性が悪い、プロセッサコアの命令体系にVLIWを採用しコア外のコンパイラなどで依存や並列実行を解決している、依存関係が無い異なるスレッドの命令を並列実行することで性能を得ている、といった理由でOoOが採用されていない。 原理上、アウト・オブ・オーダー実行のためには性能比以上にプロセッサが複雑になる傾向があるため、たとえば電力効率が求められる組込みプロセッサにはあまり採用されていない。 抄文引用元・出典: フリー百科事典『 ウィキペディア(Wikipedia)』 ■ウィキペディアで「アウト・オブ・オーダー実行」の詳細全文を読む 英語版ウィキペディアに対照対訳語「 Out-of-order execution 」があります。 スポンサード リンク
|