ちょっと勉強のためというか、この手の解説文をあまり読んだことが無かったので、昔先輩にお勧めされた記事を翻訳してみることにした。 chip-architect.comというページに載っている、アウトオブオーダ処理について解説された記事だ。非常に長い。
Chip Architect: Detailed Architecture of AMD's Opteron
AMDのOpteronのアウトオブオーダ処理について非常に詳細な解説がされており、とても興味深い。
ちなみに、非常に汚い翻訳ではあるが、日本語化を進めている(原著者に許可はもらっていないけれども)。
その中でも、アウトオブオーダ処理の基本的な部分であるリオーダバッファ、レジスタファイル、フューチャーファイルについての部分を最近翻訳している。 要約すると、
1.9 レジスタリネーミングとアウトオブオーダ処理
IPCの低下を防ぐためのレジスタリネーミングについて。これはヘネパタでも紹介されている非常に基本的な構造。 Write After Writeによるハザードを防ぐために、命令毎に書き込み先のレジスタをダイナミックに変更するというもの。
1.11 IFFRF: Integer Future File and Register File
1.12 IFFRFの"Future File"セクション
フューチャーファイルとアーキテクチャレジスタの解説。アーキテクチャレジスタは、プロセッサにおいて命令の実行が完全人終了し、例外が発生したりその命令が取り消されることのない状態を管理している。 そのため、例外が発生するとフューチャーファイルにアーキテクチャレジスタの内容が書き戻される(下記の図のUsed Only On Exceptionsの部分が相当する)。
一方で、フューチャーファイルは現在実行中の命令、というか実行が完了したが前の命令の影響でまだリタイアできない(基本的にインオーダ完了なので、ある命令が完了するためには、前の命令がすべて完了している必要がある)状態のものも含めて格納されている。 フューチャーファイルは、これからディスパッチされる命令がソースオペランドを読み込むために利用される。現在の最新の状態で、すべての命令がキャンセルされることなく実行されることを想定すると、フューチャーファイルから最新の値を取得してディスパッチするのが最適、というわけだ。
かなり長い解説記事、現時点ではまだここまで。さらにリオーダバッファについてと、浮動小数点オペレーションについても読み進めていこう。