命令のコミット

各命令は、デコードが終わりリザベーションステーションに発行された時点で、仕掛り中(In Flightと呼ばれる)の命令としてコミット機構にエントリを確保して登録される。コミット機構の各エントリは、その命令の状態や、使用資源、命令の番地(プログラムカウンタの値)などの情報を持っている。

コミット機構は、新たに発行される命令が最後に追加され、コミットされた命令に対応するエントリが先頭から取り除かれるので、論理的にはFIFOであるが、64~128エントリで各エントリは100ビット程度と規模が大きいので、物理的にはシフトレジスタではなく128エントリ×100ビットというようなレジスタで構成し、先頭と末尾などを指すポインタを設けたリング状の構造で作られることが多い。この場合は、コミットリングと呼ばれる。また、実行ユニットは演算が終了すると結果をリザルトバスに載せるのと同時に、対応するコミット機構のエントリに演算終了を書き込むというようなアクセスが必要なるが、コミット機構がシフトレジスタ構造であると、エントリの位置が動いてしまい都合が悪い。しかし、リング構造であればエントリの物理位置は変わらないので、命令デコード時に確保したエントリ番号をリザベーションステーションのOPRタグ部に格納し、それをインデックスとしてアクセスできるというメリットがある。

図6.22 コミットリングの構造

そして、コミット機構は、演算ユニットから実行終了が通知された命令に対して、命令の状態を実行完了とする。各命令は、実行を完了して結果を物理レジスタに書き込んだとしても、以前の状態に巻き戻す可能性があるので、まだ、仕掛り中の扱いであるが、命令をコミットすると、使用している資源を解放し、それ以前の状態に戻ることは出来なくなる。したがって、プログラム順で、その命令以前のすべての命令がコミットしていることという条件で次の命令のコミットを行うようにすれば、命令の実行はアウトオブオーダ実行であってもインオーダ実行と同じ順序でアーキテクチャ状態が更新されることになる。

また、命令の実行過程でトラップや割り込みが発生した場合には、それがコミット機構に通知され、その命令以前のすべての命令をコミットし、トラップが発生した命令以降の仕掛り中の命令はキャンセルして未実行の状態に戻して割り込み処理に入るので、Preciseな割り込みが実現できる。

そして、コミット機構は、トラップが発生した命令アドレスを再開情報として保持し、仕掛り中のすべての命令のエントリを参照して、仕掛り中の命令に割り当てられている資源の解放を行う。主要な使用資源は、リザベーションステーションのエントリ、リネームされた物理レジスタなどであるが、その時点でリザベーションステーションに残っているエントリは、すべて仕掛り中の命令に対応するものであるので、無条件にクリアしてしまってよい。

一方、物理レジスタに関しては、レジスタリネーム表を元に戻し、キャンセルされる命令の結果を格納する筈であった物理レジスタ番号をフリーリストに戻してやる必要がある。

このレジスタリネーム表の巻き戻しは、コミット機構に結果を格納する物理レジスタ番号とともに、図6.22に"前PRd"と書いた、以前の物理レジスタ番号を記憶しておき、この情報を使って、末尾から逆順に、キャンセルされる命令に割り当てられていた物理レジスタのフリーリストへの返却と、レジスタリネーム表を書き戻していくというような方法が採られる。

また、各サイクルでのレジスタリネーム表とフリーリストのを全体をコピーして記憶しておけば、状態を復元するサイクルに対応するレジスタリネーム表とフリーリストの状態を読み出して復元することが出来る。

前者の方法は(単純な実装では)1サイクルに1命令分しか戻れず、巻き戻しには時間が掛かるが物量は少なくて済む。一方、後者の方法は、一発で巻き戻すことが出来るが、巻き戻しの可能性のあるサイクルすべてのレジスタリネーム表とフリーリストの状態を記憶するレジスタが多数セット必要であり、必要な物量が大きい。このため、レジスタリネーム表とフリーリストの状態の記憶は、毎サイクルではなく、ある程度、飛び飛びに行い、一旦、戻りたい時点より前の時点のレジスタリネーム表を復元してから、戻りたい時点まで命令を再実行するとか、戻りたい時点の直後の時点の記憶されたレジスタリネーム表のデータを復元して、さらに戻りたい時点まで空きレジスタの巻き戻しを行うという両者を混合した復元を行うプロセサも存在する。

また、ここでは、コミット機構は各命令に対してエントリを持つ方式について述べたが、命令の発行時に同時に発行された命令をグループとして、グループ単位でコミット機構のエントリを作るという方式を採るプロセサもある。この場合には、グループ内の全部の命令を纏めてコミットすることになるので、命令ごとにコミットする前述の方式に比べて、多少、資源の解放が遅れてロスが生じるが、コミット機構のエントリ数は削減でき、コミットの論理もある程度簡単化できる。ただし、各エントリに記憶する命令アドレスは1つで良いが、 4命令分の情報を保持する必要があり、各エントリのサイズは大きくなる。