No history yet

命令レベル並列性の深化

スーパースカラ実行: パイプラインを超えて

基本的なパイプライン処理は、命令をステージに分割することでスループットを向上させますが、クロックサイクルあたりの命令実行数(IPC)は依然として1が上限です。現代の高性能プロセッサは、この限界を突破するためにスーパースカラ・アーキテクチャを採用しています。これは、パイプラインを複数並列に用意し、1サイクルで複数の命令を同時に発行・実行する技術です。

複数の実行ユニット(整数演算器、浮動小数点演算器、ロード/ストアユニットなど)をプロセッサ内に実装することで、依存関係のない命令を同時に処理できます。たとえば、ある命令が整数演算を行い、次の命令が浮動小数点演算を行う場合、これらは異なる実行ユニットに同時にディスパッチされ、並列に実行されます。これにより、IPCは理論上、実行ユニットの数まで増加させることが可能です。

パイプライン処理は、タスクをより小さなステージに分割してスループットを向上させます。

しかし、単純な多重発行には限界があります。命令間のデータ依存性(RAW、WAR、WAWハザード)が並列実行を妨げるためです。コンパイラによる静的な命令スケジューリングだけでは、実行時の動的な状況(キャッシュミスなど)に対応できず、パイプラインがストールする頻度が高くなります。この問題を解決するのが、動的スケジューリングです。

Tomasuloのアルゴリズムと動的スケジューリング

動的スケジューリングの中核をなすのが、IBM System/360 Model 91で初めて実装されたです。このアルゴリズムは、ハードウェアが実行時に命令の依存関係を解決し、アウトオブオーダ(OoO)実行を可能にします。その核心は、レジスタ・ファイルと実行ユニットの間に「リザベーション・ステーション」を設けることにあります。

命令が発行されると、それは対応する実行ユニットのリザベーション・ステーションに送られます。リザベーション・ステーションは、命令のオペランドが利用可能になるまで待機します。オペランドがレジスタにあれば即座に読み込まれますが、もし他の未完了の命令によって生成される途中であれば、その命令を生成するリザベーション・ステーションの「タグ」を記録します。結果が共通データバス(CDB)を通じてブロードキャストされると、タグに一致するすべてのリザベーション・ステーションがその値を取り込み、実行可能状態になります。

このメカニズムにより、WAR(Write-After-Read)およびWAW(Write-After-Write)ハザードは完全に解消されます。なぜなら、命令は発行時にレジスタから値を読み込むか、あるいは値を生成するタグを確保するだけであり、後の命令が先にレジスタに書き込んでも問題は生じないからです。これは、レジスタ・リネーミングの一形態と見なすことができます。物理レジスタはもはや唯一の値の保持場所ではなく、リザベーション・ステーションとリオーダ・バッファが一時的な「仮想レジスタ」として機能します。

リオーダ・バッファと精密例外

アウトオブオーダ実行は性能を向上させますが、プログラムの正当性を保証するという新たな課題を生み出します。命令がプログラム順とは異なる順序で完了するため、例外(ゼロ除算やページフォルトなど)が発生した場合、どの命令が原因で、どの状態を保存すべきかを特定するのが困難になります。これを解決するのがです。

ROBは、命令をプログラム順に格納する循環バッファです。命令はインオーダで発行され、ROBのエントリを確保します。その後、アウトオブオーダで実行が完了すると、結果はROB内の対応するエントリに書き込まれますが、まだアーキテクチャ状態(レジスタ・ファイルやメモリ)には反映されません。

ROBの先頭にある命令が完了すると、その結果が初めてレジスタ・ファイルやメモリにコミットされます。このコミット処理は厳密にインオーダで行われます。もしROBの先頭の命令が例外を発生させていた場合、プロセッサはその命令までの結果をコミットし、後続の命令の結果をすべて破棄します。これにより、例外発生時のプロセッサ状態が、その命令が実行される直前の状態と一致することが保証され、「精密例外」が実現されます。

インオーダー発行、アウトオブオーダ実行、インオーダー・コミット。この3つの組み合わせが、現代の高性能プロセッサの基本原則です。

リザベーション・ステーション、レジスタ・リネーミング、そしてROBが連携することで、プロセッサは「命令ウィンドウ」と呼ばれる、現在処理中の命令群の中から依存関係のないものを探し出し、最大限の並列性を引き出すことができます。

命令ウィンドウのサイズ(リザベーション・ステーションとROBの総エントリ数)は、プロセッサがどれだけ先の命令まで見通してアウトオブオーダ実行できるかを決定します。ウィンドウが大きければ大きいほど、より多くのILPを見つけ出す機会が増えますが、その分、回路が複雑化し、消費電力も増大するというトレードオフが存在します。キャッシュミスのような長いレイテンシを持つイベントを隠蔽するには、数百エントリからなる広大な命令ウィンドウが必要になります。

これら高度なILP技術は、もはや単一のコア性能を追求するためだけのものではありません。マルチコア時代においても、各コアの性能を最大化し、システム全体のスループットを向上させるための根幹技術として、その重要性は揺るぎないものとなっています。

これらの概念がどのように連携して機能するか、知識をテストしてみましょう。

Quiz Questions 1/5

スーパースカラ・アーキテクチャの主な目的は何ですか?

Quiz Questions 2/5

Tomasuloのアルゴリズムにおいて、WAR(Write-After-Read)およびWAW(Write-After-Write)ハザードを解消する中心的なメカニズムは何ですか?

スーパースカラ実行から精密例外の実現まで、ILPの核心的なメカニズムは、現代のコンピューティングの性能を静かに、しかし強力に支えています。