2010年9月5日日曜日

アウトオブオーダとスケジューリング

前回パイプラインの細分化が命令実行時のペナルティーを高める話しをしましたが、CPUの設計及びCPUの命令を作成するコンパイラが何も対策をしていない訳では在りません。

パイプラインに投入される命令に依存関係があった場合は、命令の実行を一時的に内部に留めて置き、後に投入される命令の実行に依存関係の無い命令を先に実行する仕組みがCPUに搭載されています。これをアウトオブオーダー実行といいます。

アウトオブオーダー実行
基本的な動作原理は以下になります。
  1. 命令を読み込む
  2. 読み込んだ命令に実行中の命令と依存関係が在った場合は、命令をバッファに貯めておき、依存関係のある命令の実行が終わったら実行する。
  3. 命令を実行する
  4. 実行した命令より本来先に実行されるべき命令があったら、結果をバッファに貯めておき、自分より前に実行されるべき命令が無くなったら、結果を発表する。
この仕組みがあれば、バッファに貯められる限り、依存関係がある為に実行できない命令の実行を後回しにする事が出来ます。
そして、その仕組みによりパイプラインの細分化によるデメリットを減少させる事が出来ます。
インテルのCPUではペンティアムプロからアウトオブオーダー実行が搭載されていました。

命令スケジューリング
しかし、アウトオブオーダー実行を実現する為の仕組みが、CPUの面積を多く使用してしまうという事もあり、組込機器では採用し難いという問題があります。
ですが、逆に組み込み機器の場合は使用するCPUが決まっており命令実行手順が分かっている為、最初から実行時の命令の依存関係で問題が出ないように、コンパイラが命令の実行順序を変えてしまう事が可能です。これをスケジューリングと呼びます。

コンシューマゲーム等の組込機器の開発者が、コンパイラで最適化をかけてコンパイルしたプログラムをソースレベルデバックした際、ステップ実行しているのに実行中のソースコードの場所が行ったり来たりするのは、実行結果に影響が出ない範囲で命令の実行順序を入れ替えている事に関係があります。

0 件のコメント:

コメントを投稿