2010年9月4日土曜日

今までもCPUの処理速度向上の戦いは並列化との戦いだった

昔はSIMDマルチコアも無かったじゃないかと思う人も多いと思いますが、互換性が重視されるPCのCPUに限っても並列化の技術を駆使して高速化を行ってきました。

ゲームエンジンの性能向上を考える為にCPUの処理速度向上と並列化について考えます。

パイプライン
 CPUの動作速度の指標となるxGHzと言う値ですが、これはCPUが一秒間に何回状態を更新出来るか、動作周波数を表す値になります。

動作周波数が高くなれば実行できる命令数が多くなり処理速度の向上になりますが、実際にはそうならないケースが多くあります。

その原因がCPUのパイプライン機構です。パイプラインとはバケツリレーのような物です。バケツリレーはバケツを運びますが、パイプラインでは実行する命令を運びます。
初期のパイプラインは次の役割の人(機能)たちで構成されていました。
  1. 命令の実行準備をする人
  2. 命令を実行する人
  3. 命令の実行結果を発表する人
簡単な命令を実行する場合で各役割の人が一回状態を更新する間に仕事を終えられれば、三回状態の更新が行われる間に準備から結果発表が行われます。
そして、命令の実行準備をする人は、自分が準備した命令の実行と結果発表が行われている間に、別の命令の実行準備が可能です。
命令の実行と結果発表を行う人も同様に、毎回次々と来る命令をこなしていく事により、最初の一回を除いて一回状態を更新する度に、毎回新しい命令の実行準備と結果発表が行えます。
この役割分担の細分化を行えば、見せ掛け上の処理速度向上が行えます。
初代ペンティアムプロセッサでは、整数の計算を行う場合に5つの役割を使って命令を実行していました。そして動作周波数の向上の為に、役割分担は細分化されて行き、ペンティアム4では20の機能で役割分担を行っています。

ただし、この仕組みにも問題はあります。何らかの問題で命令の実行準備が滞ってしまった場合、命令を実行する人と結果を発表する人の仕事が一時的に無くなってしまい、命令の実行効率が低下してしまいます。
命令の実行準備が滞る原因として大きな物は、命令同士の依存関係があります。
命令の実行準備をする時に、現在実行中の命令の結果が必要な場合、結果が分るまで準備が出来ません。
ペンティアム4では一番目の命令と2番目の命令に依存関係があった場合は20回分の待ちが発生する訳です。
その為パイプラインで効率良く命令を実行するためには、実行する命令同士の依存関係が出来るだけ少ない必要があります。

またパイプラインを複数用意して実行する仕組みが実装されているCPUもあります。
複数のパイプラインがあれば、動作周波数に対して実行できる命令の数が上がります。
初代ペンティアムにはUパイプとVパイプ二つのパイプラインがあり、同時に2つの命令を実行する事が可能です。
しかし命令同士の依存関係の問題は付いてまわり、依存関係が無い命令しか同時に実行する事は出来ません。

このようにCPUの高速化の歴史は並列化の歴史でもありました。

0 件のコメント:

コメントを投稿