(57)【特許請求の範囲】
【請求項１】
マルチビット出力を提供するステート・マシンが、マルチビット出力のそれぞれのビットがマルチスレッド・プロセッサで実行される複数のスレッドのうち関連するスレッドのそれぞれのステータスを示すように出力するステップと、
前記ステート・マシンが、マルチスレッド・プロセッサ内の第１のスレッドのステータスの変化を検出するステップと、
構成ロジックが、前記マルチスレッド・プロセッサ内の第１のスレッドのステータス変化に応答してステート・マシンのマルチビット出力に応じてマルチスレッド・プロセッサ内の機能ユニットを構成するステップを含み、
機能ユニットを構成するステップは、前記マルチスレッド・プロセッサの部分から前記スレッドに関連した残りの保留しているメモリアクセスのどれをも排出するために、フェンス命令を第１のスレッドの命令ストリームに挿入するステップを有し、フェンス命令により、すべてのメモリ・アクセスの実行が完了しプロセッサから排出されたと仮定している命令ストリーム内のイベント境界を定義することを特徴とするマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項２】
マルチビット出力のそれぞれのビットは関連するスレッドのステータスがアクティブまたはインアクティブであることを示すことを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項３】
機能ユニットを構成するステップは、第１のスレッドのステータスの変化がインアクティブ状態からアクティブ状態への遷移を含むときにマルチスレッド・プロセッサ内の第１と第２の両方のスレッドを処理するように機能ユニットを分割するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項４】
機能ユニットを構成するステップは、第１のスレッドのステータスの変化がアクティブ状態からインアクティブ状態への遷移を含むときにマルチスレッド・プロセッサ内の第１のスレッドではなく、第２のスレッドを処理するように機能ユニットの分割を解除するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項５】
第１のスレッドのステータスの変化を検出するステップは第１のスレッドに対するイベントの発生を検出するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項６】
第１のスレッドのイベントの発生に応答して第１の信号をアサートし、第１の信号のアサートのときにステート・マシンを評価するステップを有することを特徴とする請求項５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項７】
マルチスレッド・プロセッサ内の機能ユニットは第１の信号のデアサート後ステート・マシンのマルチビット出力に従って構成されることを特徴とする請求項６に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項８】
第１のスレッドのステータスの変化を検出するステップは第１のスレッドをアクティブ状態からスリープ状態に遷移させる第１のスレッドに対するスリープ・イベントの発生を検出するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項９】
スリープ・イベントの発生の検出に応答して、禁止レジスタをセットし、第１のスレッドのスリープ状態に対するブレーク・イベントでないイベントを禁止するステップを有することを特徴とする請求項８に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１０】
マルチスレッド・プロセッサ内の機能ユニットを構成するステップは第１のスレッドに対するマルチスレッド・プロセッサ内の状態を保存し解放するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１１】
第１のスレッドに対するマルチスレッド・プロセッサ内の状態を保存し解放するステップはメモリ・リソース内の第１のスレッドに対する状態を記録するステップを有することを特徴とする請求項１０に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１２】
マルチスレッド・プロセッサ内の機能ユニットを構成するステップはマルチスレッド・プロセッサ内のレジスタ・ファイル内のレジスタをマルチスレッド・プロセッサ内の第２のスレッドで使用できるようにするステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１３】
機能ユニットは、メモリ順序バッファ、ストア・バッファ、変換ルックアサイド・バッファ、リオーダ・バッファ、レジスタ・エイリアス・テーブル、および空きリスト・マネージャを備え、機能ユニットのグループのうちの１つを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１４】
機能ユニットを構成するステップは、マルチスレッド・プロセッサ内の状態を復元するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１５】
第１のスレッドのステータスの変化を検出するステップは第１のスレッドをスリープ状態からアクティブ状態に遷移させる第１のスレッドに対するブレーク・イベントの発生を検出するステップを有することを特徴とする請求項１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１６】
ブレーク・イベントを構成しない第１のスレッドに対し第３のイベントを検出するステップと、第１のスレッドと関連する保留レジスタ内に第３のイベントを記録するステップを有することを特徴とする請求項１５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする方法。
【請求項１７】
マルチビット出力を備えるステート・マシンであって、マルチビット出力のそれぞれのビットがマルチスレッド・プロセッサで実行される複数のスレッドのうち関連するスレッドのそれぞれのステータスを示し、マルチスレッド・プロセッサ内の第１のスレッドに対するステータスの変化を検出するステート・マシンと、
ステート・マシンのマルチビット出力に応じてマルチスレッド・プロセッサ内の機能ユニットを構成する構成ロジックと、
前記マルチスレッド・プロセッサの部分から前記スレッドに関連した残りの保留しているメモリアクセスのどれをも排出するために、フェンス命令を第１のスレッドの命令ストリームに導入するマイクロコード・シーケンサを備え、前記フェンス命令で、すべてのメモリ・アクセスの実行が完了しプロセッサから排出されるようにする命令ストリーム内のイベント境界を定義することを特徴とするマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項１８】
マルチビット出力のそれぞれのビットは関連するスレッドのステータスをアクティブまたはインアクティブであることを示すことを特徴とする請求項１７に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項１９】
第１のスレッドに対するステータスの変化がインアクティブ状態からアクティブ状態への遷移を含み、第２のスレッドがアクティブ状態にあるときに、構成ロジックが機能ユニットを分割し、マルチスレッド・プロセッサ内の第１のスレッドと第２のスレッドの両方を処理することを特徴とする請求項１８に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２０】
ステート・マシンは第１のスレッドのイベントの発生を検出することにより、第１のスレッドのステータスの変化を検出することを特徴とする請求項１７に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２１】
第１のスレッドのイベントの発生に応答してクリア信号をアサートするイベント検出器を備え、第１の信号のアサートのときにステート・マシンを評価することを特徴とする請求項２０に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２２】
構成ロジックはクリア信号のデアサート後ステート・マシンのマルチビット出力に従ってマルチスレッド・プロセッサ内の機能ユニットを構成することを特徴とする請求項２１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２３】
前記イベント検出装置は、第１のスレッドのステータスの変化を検出するために、第１のスレッドをスリープ状態からアクティブ状態に遷移させる第１のスレッドのブレーク・イベントの発生を検出する請求項２１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２４】
前記イベント検出装置は、ブレーク・イベントを継続させず、前記第１のスレッドに関連する保留レジスタ内に第３のイベントをログする前記第１のスレッドについての第３のイベントを検出することを特徴とする請求項２１に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２５】
前記ステート・マシンは、前記第１のスレッドのステータス変化を検出するために、第１のスレッドをアクティブ状態からスリープ状態に遷移させる第１のスレッドのスリープ・イベントの発生を検出することを特徴とする請求項１７に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２６】
スリープ・イベントの発生の検出に応答して、禁止レジスタをセットし、第１のスレッドのスリープ状態に対するブレーク・イベントでないイベントを禁止するマイクロ命令を発行するマイクロコード・シーケンサを備えることを特徴とする請求項２５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２７】
構成ロジックは、第１のスレッドに対する関連する機能ユニット内の状態を保存し、解放し、復元することを特徴とする請求項１８に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２８】
機能ユニットと関連する構成ロジックが状態を保存し解放するためにメモリ・リソース内の第１のスレッドに関する状態情報を記録し、機能ユニットへの第１のスレッドの状態情報をメモリ・リソースから復元し状態を復元することを特徴とする請求項２５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項２９】
機能ユニットと関連する構成ロジックは、第１のスレッドが終了した場合に第１のスレッドに割り当てられているマルチスレッド・プロセッサのレジスタ・ファイル内のレジスタをマルチスレッド・プロセッサ内の第２のスレッドに利用できるようにし、第２のスレッドが終了した場合に第２のスレッドに割り当てられているマルチスレッド・プロセッサのレジスタ・ファイル内のレジスタをマルチスレッド・プロセス内の第１のスレッドに利用できるようにすることを特徴とする請求項２５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項３０】
機能ユニットが、メモリ順序バッファ、ストア・バッファ、変換ルックアサイド・バッファ、リオーダ・バッファ、レジスタ・エイリアス・テーブル、および空きリスト・マネージャを含む、機能ユニットのグループのうちの１つを有することを特徴とする請求項２５に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項３１】
前記構成ロジックは、マルチスレッド・プロセッサ内の状態を復元することを特徴とする請求項１７に記載のマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【請求項３２】
それぞれのビットがマルチスレッド・プロセッサで実行される複数のスレッドのうち関連するスレッドのそれぞれのステータスを示すマルチビット出力を送出し、且つマルチスレッド・プロセッサ内の第１のスレッドに対するステータスの変化を検出する第１の手段と、
ステート・マシンのマルチビット出力に応じてマルチスレッド・プロセッサ内の機能ユニットを構成する第２の手段とから構成され、
前記機能ユニットを構成する手段は、前記マルチスレッド・プロセッサの部分から前記スレッドに関連した残りの保留しているメモリアクセスのどれをも排出するために、フェンス命令を第１のスレッドの命令ストリームに挿入する機能を有し、このフェンス命令で、すべてのメモリ・アクセスの実行が完了しプロセッサから排出されたと仮定している命令ストリーム内のイベント境界を定義することを特徴とするマルチスレッド・プロセッサ内の複数のスレッドに出入りする装置。
【発明の詳細な説明】
【０００１】
（発明の分野）
本発明は、一般に、マルチスレッド・プロセッサに関するものであり、より具体的には、マルチスレッド（ＭＴ）プロセッサ内の複数のスレッドに入り、そこから出る方法と装置に関するものである。
【０００２】
（発明の背景）
マルチスレッド（ＭＴ）プロセッサの設計は近年、プロセッサの性能を上げるうえで非常に魅力的なオプションとして考えられるようになってきている。とりわけプロセッサ内でマルチスレッドで動作させると、各種のプロセッサ・リソースをより効果的に利用することができる可能性があり、特にプロセッサ内の実行ロジックをより効果的に利用できることが考えられる。特に、複数のスレッドをプロセッサの実行ロジックに送ることで、そうしなかった場合に特定のスレッドの処理が停止していたり他の何らかの遅延が生じてアイドル状態にあるクリック・サイクルを利用して、さらにスレッドを処理できる。特定のスレッドの処理の停止は、プロセッサ内のパイプライン内で実行が多い場合に生じる。たとえば、スレッド内にキャッシュ・ミスまたは分岐予測誤り（つまり、待ち時間の長い動作）が含まれると、通常、関連するスレッド停止の処理が行われる。長い待ち時間の動作が実行ロジックの効率に及ぼすマイナスの効果は、メモリ・アクセスおよび取得速度の向上をしのぐ実行ロジックのスループットの近年の増大により悪化している。
【０００３】
マルチスレッド・コンピュータ・アプリケーションは、さらに、Ｗｉｎｄｏｗｓ（登録商標）  ＮＴやＵｎｉｘ（登録商標）オペレーティング・システムなど普及している多くのオペレーティング・システムによってこのようなマルチスレッド・アプリケーションがサポートされ、次第に一般的なものとなってきている。マルチスレッド・コンピュータ・アプリケーションは、特にマルチメディア分野で効率がよい。
【０００４】
大まかに言うと、マルチスレッド・プロセッサは、関連するプロセッサ内で採用されているスレッドのインタリーブすなわち切り替え方式に応じて、２つのカテゴリ（つまり、密設計または疎設計）に分類できる。密マルチスレッド設計では、プロセッサ内に複数のアクティブ・スレッドをサポートし、通常、２つの異なるスレッドをサイクルごとにインタリーブする。疎マルチスレッド設計では、通常、キャッシュ・ミスなどの待ち時間が長くなるイベントが発生すると異なるスレッドの命令をインタリーブする。疎マルチスレッド設計については、Ｅｉｃｋｅｍａｙｅｒ，  Ｒ．、Ｊｏｈｎｓｏｎ，  Ｒ．、他著「Ｅｖａｌｕａｔｉｏｎ  ｏｆ  Ｍｕｌｔｉｔｈｒｅａｄｅｄ  Ｕｎｉｐｒｏｃｅｓｓｏｒｓ  ｆｏｒ  Ｃｏｍｍｅｒｃｉａｌ  Ａｐｐｌｉｃａｔｉｏｎ  Ｅｎｖｉｒｏｎｍｅｎｔｓ」（Ｔｈｅ  ２３ｒｄ  Ａｎｎｕａｌ  Ｉｎｔｅｒｎａｔｉｏｎａｌ  Ｓｙｍｐｏｓｉｕｍ  ｏｎ  Ｃｏｍｐｕｔｅｒ  Ａｒｃｈｉｔｅｃｔｕｒｅ，  ｐｐ．  ２０３−２１２，  Ｍａｙ  １９９６）で説明されている。密設計と疎設計の違いについては、Ｌａｕｄｏｎ，  Ｊ、Ｇｕｐｔａ，  Ａ著「Ａｒｃｈｉｔｅｃｔｕｒａｌ  ａｎｄ  Ｉｍｐｌｅｍｅｎｔａｔｉｏｎ  Ｔｒａｄｅｏｆｆｓ  ｉｎ  ｔｈｅ  Ｄｅｓｉｇｎ  ｏｆ  Ｍｕｌｔｉｐｌｅ−Ｃｏｎｔｅｘｔ  Ｐｒｏｃｅｓｓｏｒｓ」（Ｍｕｌｔｉｔｈｒｅａｄｅｄ  Ｃｏｍｐｕｔｅｒ  Ａｒｃｈｉｔｅｃｔｕｒｅｓ：  Ａ  Ｓｕｍｍａｒｙ  ｏｆ  ｔｈｅ  Ｓｔａｔｅ  ｏｆ  ｔｈｅ  Ａｒｔ，  Ｒ．Ａ．  Ｉａｎｎｕｃｉ  他、編、ｐｐ．  １６７−２００，  Ｋｌｕｗｅｒ  Ａｃａｄｅｍｉｃ  Ｐｕｂｌｉｓｈｅｒｓ，  Ｎｏｒｗｅｌｌ，  Ｍａｓｓａｃｈｕｓｅｔｔｓ，  １９９４）で詳述されている。Ｌａｕｄｏｎはさらに、密設計のサイクルごとの切り替えと疎設計の完全パイプライン・インターロックとを組合せるインタリーブ方式（またはブロック方式）を提案している。このために、Ｌａｕｄｏｎは特定のサイクル数分について特定のスレッド（またはコンテキスト）を使用できないようにする「バックオフ」命令を提案している。このような「バックオフ」命令は、キャッシュ・ミスなどのあらかじめ決められているイベントの発生があったときに発行される。Ｌａｕｄｏｎは、この方法で、単にスレッドの１つを使用不能にすることで実際のスレッド切り替えを実行しなくてすむようにしている。
【０００５】
プロセッサのマルチスレッドされたアーキテクチャでは、順序が狂っている推測実行プロセッサのアーキテクチャ・コンテキストにおいてさらに多くの問題を抱える。具体的には、命令ストリームの流れに予期しない変化を引き起こす可能性のあるイベント（たとえば、分岐命令、例外、または割り込み）の処理は、複数のスレッドを考慮した場合に複雑なものとなる。複数のスレッド間のリソース共有を実装した場合（つまり、プロセッサによってサポートされる各スレッドについて機能ユニットの重複に制限があるか、またはない）、特定のスレッドに関するイベント発生の処理は、そのようなイベントの処理でさらにスレッドを考慮する必要があるという点で複雑になる。
【０００６】
リソース共有がマルチスレッド・プロセッサ内に実装されている場合、マルチスレッド・プロセッサ内で処理されるスレッドの状態の変化に対応して共有リソースの利用度を高めることがさらに望ましい。
【０００７】
（発明の概要）
本発明では、マルチビット出力を備えるステート・マシンを保持し、マルチビット出力のそれぞれのビットがマルチスレッド・プロセッサ内で実行される複数のスレッドのうち関連するスレッドのそれぞれのステータスを示す方法を提示している。マルチスレッド・プロセッサ内の第１のスレッドのステータスの変化が検出される。マルチスレッド・プロセッサ内の機能ユニットは、ステート・マシンのマルチビット出力に応じて構成される。
【０００８】
本発明の他の特徴は、付属の図面と後の詳細な説明から明らかであろう。
【０００９】
本発明は、同様の参照は同様の要素を表す付属の図面の図で、例を使って説明するが、これに限定されるわけではない。
【００１０】
（詳細な説明）
マルチスレッド・プロセッサ内の複数のスレッドに入り、出る方法と装置について説明する。以下の説明では、説明のため本発明を完全に理解できるように多数の特定の詳細を定めている。ただし、当業者であれば、こうした具体的内容がなくても本発明を実践できることは明白であろう。
【００１１】
本明細書の目的のために、「イベント」という用語は、プロセッサ内の命令ストリーム（マクロ命令またはマイクロ命令）の処理の変更または中断を行う、プロセッサの内部または外部のイベントを含むものとして解釈するものとする。したがって、「イベント」という用語は、プロセッサの内部または外部で発生する可能性のある分岐命令プロセス、例外および中断を含むものと解釈するが、ただしこれに限られるわけではない。
【００１２】
本明細書の目的のために、「プロセッサ」という用語は、命令（たとえば、マクロ命令またはマイクロ命令）のシーケンスを実行できるマシンを意味すると解釈し、汎用マイクロプロセッサ、専用マイクロプロセッサ、グラフィック・コントローラ、オーディオ・コントローラ、マルチメディア・コントローラ、マイクロコントローラ、またはネットワーク・コントローラを含むものと解釈するが、ただしこれらに限られるわけではない。さらに、「プロセッサ」という用語は、なかんずく、ＣＩＳＣ（Ｃｏｍｐｌｅｘ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒｓ）、ＲＩＳＣ（Ｒｅｄｕｃｅｄ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｓｅｔ  Ｃｏｍｐｕｔｅｒｓ）、またはＶＬＩＷ（Ｖｅｒｙ  Ｌｏｎｇ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｗｏｒｄ）の各プロセッサを意味するものとする。
【００１３】
さらに、「クリアリング・ポイント」という用語は、イベントを取り扱う、または処理できる命令ストリーム内の場所のフロー・マーカまたはその他の命令による命令ストリーム（マイクロ命令またはマクロ命令ストリームを含む）内に用意された命令を含むものと解釈する。
【００１４】
「命令」という用語は、マクロ命令またはマイクロ命令を含むものと解釈するが、これらに限られない。
【００１５】
本発明の例示的な実施形態については、ハードウェアかソフトウェアで主に実施されるものとして説明している。しかしながら、当業者であれば、多くの機能をハードウェア、ソフトウェア、またはハードウェアとソフトウェアの組合せで実施できることは理解されるであろう。
【００１６】
本発明の実施形態を実施するソフトウェア（たとえば、マイクロ命令およびマクロ命令）は、プロセッサによってかつ／またはプロセッサ自体（たとえば、キャッシュまたはマイクロコード・シーケンサ）内でアクセス可能なメイン・メモリ内に全部または少なくとも一部常駐する。たとえば、イベント・ハンドラおよびステート・マシンは、マイクロコード・シーケンサからディスパッチされたマイクロコードとして実装できる。
【００１７】
ソフトウェアはさらに、ネットワーク・インタフェース・デバイスを介して送受信できる。
【００１８】
本明細書の目的のために、「機械読み取り可能媒体」という用語は、マシンから実行できる命令のシーケンスを格納またはエンコードし、マシンに本発明の方法の１つを実行させることができる媒体を含むものと解釈する。「機械読み取り可能媒体」という用語は、したがって、ソリッドステート・メモリ、光磁気ディスク、およびキャリア波信号を含むものと解釈するが、ただしこれらに限られるわけではない。
【００１９】
プロセッサ・パイプライン
図１は、プロセッサ・パイプライン１０の一実施形態を示す高レベル・ブロック図である。パイプライン１０は、命令（たとえば、マクロ命令）を取り出し、パイプライン１０に送るフェッチ・パイプ段１２から開始する、多数のパイプ段を含む。たとえば、マクロ命令は、プロセッサに搭載された、あるいはそれと密接に関連するキャッシュ・メモリから取り出すことも、またプロセッサ・バスを介して外部メイン・メモリから取り出すこともできる。フェッチ・パイプ段１２から、マクロ命令がパイプ・デコード段１４に送られ、そこでマクロ命令はプロセッサ内で実行するのに適したマイクロ命令（「マイクロコード」とも呼ばれる）に翻訳される。その後、マイクロ命令は、パイプ割り当て段１６の下流に伝播され、そこで、使用可能かどうか、また必要かどうかに応じて、プロセッサ・リソースが各種のマイクロ命令に割り当てられる。それから、マイクロ命令は実行段１８で実行された後、パイプ・リタイヤ段２０でリタイヤする、つまり「書き戻される」（たとえば、アーキテクチャ状態にコミットされる）。
【００２０】
マイクロプロセッサ・アーキテクチャ
図２は、汎用マイクロプロセッサの形式のプロセッサ３０の例示的な一実施形態を示すブロック図である。プロセッサ３０は、以下で、マルチスレッド（ＭＴ）プロセッサとして説明されており、したがって、複数の命令スレッド（またはコンテキスト）を処理することができる。しかし、明細書の後のほうで取り上げている多くの教示は、マルチスレッド・プロセッサに特有のものではなく、シングル・スレッド・プロセッサにおけるアプリケーションもある。例示的な一実施形態では、プロセッサ３０はインテル・アーキテクチャ（ＩＡ）のマイクロプロセッサを採用しており、インテル・アーキテクチャ命令セットを実行できる。このようなインテル・アーキテクチャ・マイクロプロセッサの例として、カリフォルニア州サンタクララを所在地とするＩｎｔｅｌ  Ｃｏｒｐｏｒａｔｉｏｎが製造するＰｅｎｔｉｕｍ  （登録商標）ＰｒｏまたはＰｅｎｔｉｕｍ  ＩＩＩマイクロプロセッサがある。
【００２１】
一実施形態では、プロセッサ３０は順序正しいフロントエンドと順序正しくないバック・エンドを備える。順序正しいフロントエンドは、プロセッサ３０とプロセッサ３０が採用されている可能性のあるコンピュータ・システムの他のコンポーネント（たとえば、メインメモリ）とをつなぐコンジットとして機能するバス・インタフェース・ユニット３２を備える。このために、バス・インタフェース・ユニット３２は、プロセッサ３０をプロセッサ・バス（図に示されていない）に結合し、このバスを介して、データおよび制御情報をプロセッサ３０で受信し、プロセッサ３０から伝播させることができる。バス・インタフェース・ユニット３２は、プロセッサ・バス上の通信を制御するＦＳＢ（Ｆｒｏｎｔ  Ｓｉｄｅ  Ｂｕｓ）ロジック３４を備える。バス・インタフェース・ユニット３２はさらに、プロセッサ・バス上での通信に関してバッファリング機能を提供するバス・キュー３６を備える。バス・インタフェース・ユニット３２は、プロセッサ３０内のローカル・メモリ機能を提供するメモリ実行ユニット４２からバス要求３８を受け取り、スヌープまたはバス・リターンをそのメモリ実行ユニット４２に送ることが図に示されている。メモリ実行ユニット４２は、統一データおよび命令キャッシュ４４、データＴＬＢ（Translation Lookaside Buffer）４６、およびメモリ順序付けバッファ４８を備える。メモリ実行ユニット４２は、受信したマクロ命令を対応するマイクロ命令セットに変換するマイクロ命令変換エンジン５４から命令フェッチ要求５０を受け取り、そのエンジンに生の命令５２（つまり、コード化されたマイクロ命令）を送出する。
【００２２】
マイクロ命令変換エンジン５４は、実際には、トレース・キャッシュ「ミス・ハンドラ」として動作し、トレース・キャッシュ・ミスが発生した場合にマイクロ命令をトレース・キャッシュ６２に送出する。このために、マイクロ命令変換エンジン５４は、トレース・キャッシュ・ミスが発生した場合にパイプ・フェッチおよびパイプ・デコード段１２および１４を提供するように機能する。マイクロ命令変換エンジン５４は、次命令ポインタ（ＮＩＰ）１００、命令ＴＬＢ（Translation Lookaside Buffer）１０２、分岐予測器１０４、命令ストリーミング・バッファ１０６、命令プレデコーダ１０８、命令ステアリング・ロジック１１０、命令デコーダ１１２、および分岐アドレス計算器１１４を備えることが示されている。次命令ポインタ１００、ＴＬＢ  １０２、分岐予測器１０４、および命令ストリーミング・バッファ１０６はあわせて、分岐予測ユニット（ＢＰＵ）９９を構成する。命令デコーダ１１２および分岐アドレス計算器１１４はあわせて、命令変換（ＩＸ）ユニット１１３を備える。
【００２３】
次命令ポインタ１００は、次命令要求を統一キャッシュ４４に発行する。プロセッサ３０が２つのスレッドを処理できるマルチスレッド・マイクロプロセッサを備える例示的な実施形態では、次命令ポインタ１００は、発行される次命令要求に含めるために、第１または第２のスレッドのいずれかと関連する命令ポインタを選択するマルチプレクサ（ＭＵＸ）（図に示されていない）を備えることができる。一実施形態では、次命令ポインタ１００は、サイクルごとに（「ピンポン方式」で）第１と第２のスレッドに対する次命令要求をインタリーブするが、ただし、両方のスレッドに対する命令が要求されており、両方のスレッドに対する命令ストリーミング・バッファ１０６リソースが尽きていないと仮定する。次命令ポインタ要求は、初期要求アドレスが３２バイトまたは６４バイト整合ラインの上半分にあるかどうかに応じて、１６、３２、または６４バイトに対応する。次命令ポインタ１００は、分岐予測器１０４、分岐アドレス計算器１１４、またはトレース・キャッシュ６２によりリダイレクトすることができ、しかも、トレース・キャッシュ・ミス要求は最高優先度のリダイレクト要求となる。
【００２４】
次命令ポインタ１００が統一キャッシュ４４への命令要求を行った場合に、命令要求と関連付けられた２ビットの「要求識別子」を生成し、関連命令要求の「タグ」として機能する。命令要求に応答するデータを戻すと、統一キャッシュ４４は以下のタグまたは識別子をデータとともに返す。
１．次命令ポインタ１００によって供給される「要求識別子」。
２．返されたチャンクを識別する３ビット「チャンク識別子」。
３．返されたデータが属すスレッドを識別する「スレッド識別子」。
【００２５】
次命令要求は、次命令ポインタ１００から命令ＴＬＢ  １０２へ伝播され、これにより、アドレス検索オペレーションが実行され、物理的アドレスが統一キャッシュ４４に送られる。統一キャッシュ４４は、対応するマクロ命令を命令ストリーミング・バッファ１０６に送る。それぞれの次命令要求はさらに、次命令ポインタ１００から直接命令ストリーミング・バッファ１０６に伝播され、命令ストリーミング・バッファ１０６で、統一キャッシュ４４から受け取ったマクロ命令が属すスレッドを識別できる。第１と第２のスレッドの両方からのマクロ命令が、命令ストリーミング・バッファ１０６から命令プレデコーダ１０８に発行され、これにより、（マクロ命令の）受け取った命令ストリームに関して多数の長さ計算およびバイト・マーキング・オペレーションを実行する。特に、命令プレデコーダ１０８は、とりわけ、命令ステアリング・ロジック１１０に伝播する命令ストリーム内のマクロ命令を区別するために使用される一連のバイト・マーキング・ベクトルを生成する。
【００２６】
その後、命令ステアリング・ロジック１１０は、バイト・マーキング・ベクトルを利用して、デコードを目的として命令デコーダ１１２への離散マクロ命令のステアリングを行う。マクロ命令はさらに、命令ステアリング・ロジック１１０から分岐アドレス計算器１１４に伝播され、分岐アドレスの計算が行われる。その後、マイクロ命令が命令デコーダ１１２からトレース送出エンジン６０に送られる。
【００２７】
デコード中、フロー・マーカがマクロ命令の変換先の各マイクロ命令と関連付けられる。フロー・マーカは、関連するマイクロ命令の特性を示し、たとえば、関連するマイクロ命令をマクロ命令を表すマイクロコード・シーケンス内の最初または最後のマイクロ命令であることを示す。フロー・マーカは、「マクロ命令の先頭」（ＢＯＭ）および「マクロ命令の終わり」（ＥＯＭ）というフロー・マーカを含む。本発明によれば、デコーダ１１２はさらに、マイクロ命令をデコードし、共有リソース（マルチプロセッサ）（ＳＨＲＭＰ）フロー・マーカおよび同期（ＳＹＮＣ）フロー・マーカがそれと関連付けられる。特に、共有リソース・フロー・マーカは、マイクロ命令を、スレッド内の別の場所ほど結果が否定的でない、スレッドが中断する（たとえば、再起動、または一時停止）特定のスレッド内の場所として識別する。デコーダ１１２は、本発明の例示的な実施形態では、共有リソース・フロー・マーカとともに長いマイクロコード・シーケンス内の間歇的なポイントを持つ親マクロ命令の末尾または先頭を備えるマイクロ命令にマーク付けするように構成されている。同期フロー・マーカは、マイクロ命令を、たとえば、スレッドを他のスレッド内の同期命令に応答する他のスレッドと同期化できる特定のスレッド内のある場所として識別する。本明細書の目的のために、「同期化する」という用語は、そのスレッドに関してプロセッサ状態を修正できる少なくとも１つのスレッドおよび／またはプロセッサへの中断が低減されているまたは低い少なくとも１つの他のスレッドを、そのスレッドまたは他のスレッド内の第２のポイントに関して識別することを意味するものとする。
【００２８】
デコーダ１１２は、本発明の例示的な実施形態では、同じプロセッサ内に共存するスレッド間で共有される状態を、一方のスレッドにより、他方のスレッドの実行に悪影響を及ぼすことなく変更できる選択されたマクロ命令境界に配置されているマイクロ命令をマークするように構成されている。
【００２９】
デコードされた命令（つまりマイクロ命令）がマイクロ命令変換エンジン５４からトレース送出エンジン６０に送られる。トレース送出エンジン６０は、トレース・キャッシュ６２、トレース分岐予測器（ＢＴＢ）６４、マイクロコード・シーケンサ６６、およびマイクロコード（ｕｏｐ）キュー６８を備える。トレース送出エンジン６０は、マイクロ命令キャッシュとして機能し、下流の実行ユニット７０のマイクロ命令の一次ソースとなっている。マクロ命令キャッシュ機能をプロセッサ・パイプライン内に備えることにより、トレース送出エンジン６０、および特にトレース・キャッシュ６２により、マイクロ命令変換エジン５４で行った変換作業を利用して、マイクロ命令帯域幅を拡大できる。例示的な一実施形態では、トレース・キャッシュ６２は、２５６セット、８ウェイ・セットの連想メモリを備えている。本例示的な実施形態の「トレース」という用語は、トレース・キャッシュ６２のエントリ内に格納されるマイクロ命令のシーケンスを意味し、それぞれのエントリはトレースを含む先行する、また続くマイクロ命令へのポインタを含む。このようにして、トレース・キャッシュ６２を使用することで、高性能シーケンシング機能を簡単に利用でき、後続のマイクロ命令を取得するためにアクセスする次のエントリのアドレスが現在のアクセスの完了前に知られている。トレースは、一実施形態では、トレース・ヘッドによりお互いに区別される命令の「ブロック」とみなされ、間接分岐に遭遇した後、または単一トレースに収められる条件付分岐の数やトレースを含むことができるマイクロ命令全体の最大数など多数のこのしきい値条件のうちの１つに到達することにより終了する。
【００３０】
トレース・キャッシュの分岐予測器６４は、トレース・キャッシュ６２内のトレースに関連するローカル分岐予測を行う。トレース・キャッシュ６２およびマイクロコード・シーケンサ６６は、マイクロ命令をマイクロコード・キュー６８に送り、そこからマイクロ命令を順序外れ実行クラスタに供給される。マイクロコード・シーケンサ６６は、さらに、例外や割り込みなどのイベントの発生に応じて、プロセッサ３０内に多数のオペレーションを実装するマイクロコード内に組み込まれている多数のイベント・ハンドラ６７を含むように示されている。イベント・ハンドラ６７は、以下で詳述するように、プロセッサ３０のバック・エンド内のレジスタ名前書き換え部７４内に含まれるイベント検出器１８８により呼び出される。
【００３１】
プロセッサ３０は、バス・インタフェース・ユニット３２、メモリ実行ユニット４２、マクロ命令変換エンジン５４、およびトレース送出エンジン６０を備える順序正しいフロントエンド、および後述の順序外れバック・エンドを備えているものとみなすことができる。
【００３２】
マイクロコード・キュー６８からディスパッチされたマイクロ命令は、スケジューラ７２、レジスタ名前書き換え部７４、アロケータ７６、リオーダ・バッファ７８、およびリプレイ・キュー８０を備える順序外れクラスタ７１に入る。スケジューラ７２は、１組の予約ステーションを備え、実行ユニット７０によって実行されるマイクロ命令をスケジュールし、ディスパッチする。レジスタ名前書き換え部７４は、整数および浮動小数点隠しレジスタに関してレジスタ名前書き換え機能を実行する（これを、プロセッサ３０がインテル・アーキテクチャ命例セットを実行する、８本の汎用レジスタのどれかまたは８本の浮動小数点レジスタのどれかの代わりに使用できる）。アロケータ７６は、使用可能かどうか、また必要かどうかに応じて、実行ユニット７０およびクラスタの７１のリソースをマイクロ命令に割り当てる動作をする。マイクロ命令を処理しようにもリソースが不十分な場合、アロケータ７６は停止信号８２をアサートする役割を持ち、図の５８に示されているように、これはトレース送出エンジン６０を介して、マイクロ命令変換エンジン５４に伝播される。マイクロ命令は、レジスタ名前書き換え部７４によって調整されるソース・フィールドを持っており、厳密なプログラム順序でリオーダ・バッファ７８に置かれる。リオーダ・バッファ７８内のマイクロ命令が実行を完了し、リタイヤの準備ができたら、リオーダ・バッファから取り出され、順序どおり取り出される（つまり、元のプログラム順序に応じて）。リプレイ・キュー８０は、リプレイされるマイクロ命令を実行ユニット７０に伝播する。
【００３３】
実行ユニット７０は、浮動小数点実行工エンジン８４、整数実行エンジン８６、およびレベル０データ・キャッシュ８８を備えることが示されている。プロセッサ３０である例示的な一実施形態では、インテル・アーキテクチャ命令セットが実行され、浮動小数点実行エンジン８４はさらに、ＭＭＸ（登録商標）命令およびストリーミングＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ、Ｍｕｌｔｉｐｌｅ  Ｄａｔａ）拡張（ＳＳＥ）を実行できる。
【００３４】
マルチスレッドの実装
図２に示されているプロセッサ３０の例示的な実施形態では、マルチスレッド機能をサポートするリソースの複製またはレプリケーションが限られている場合があり、したがってスレッド間である程度のリソース共有を実装する必要がある。採用しているリソース共有方式は、プロセッサが同時に処理できるスレッドの数に左右されることは理解されるであろう。プロセッサ内の機能ユニットは通常、ある程度のバッファリング（または格納）機能と伝播機能を備えており、リソース共有の問題は、（１）格納と（２）帯域幅共有コンポーネントの処理／伝播を含むものとみなすことができる。たとえば、２つのスレッドの同時処理をサポートするプロセッサでは、さまざまな機能ユニット内のバッファ・リソースは２つのスレッドに静的にまたは論理的に分割することができる。同様に、２つの機能ユニット間の情報の伝播の経路で与えられる帯域幅を２つのスレッドに分割し、割り当てることができる。これらのリソース共有問題は、プロセッサ・パイプライン内の多数の場所で発生することがあるため、異なるリソース共有方式を特定の場所の指示と特性に応じてさまざまな場所で使用できる。さまざまな機能および動作特性を鑑みて、異なるリソース共有方式は異なる場所に適していることは理解されるであろう。
【００３５】
図３は、図２に示されているプロセッサ３０の一実施形態の選択されたコンポーネントを示すブロック図であり、バッファリング機能を備えるさまざまな機能ユニットを２つのスレッド（つまり、スレッド０およびスレッド１）に対応して論理的に分割されたものとして示す。機能ユニットのバッファリング（または格納）機能および処理機能の２つのスレッドを論理的パーティション分割するには、バッファリング・リソース内のエントリの第１の所定の集まりを第１のスレッドに割り当て、バッファリング・リソース内のエントリの第２の所定の集まりを第２のスレッドに割り当てる。しかし、代替実施形態では、バッファリングは動的に共有することもできる。特に、これは、読み込みポインタと書き込みポインタの２つのペアを用意し、読み込みポインタと書き込みポインタの第１のペアを第１のスレッドに関連付け、読み込みポインタと書き込みポインタの第２のペアを第２のスレッドに関連付けるという方法で行う。読み込みポインタと書き込みポインタの第１のペアを、バッファリング・リソース内の第１の所定の数のエントリに制限し、読み込みポインタと書き込みポインタの第２のペアを、同じバッファリング・リソース内の第２の所定の数のエントリに制限することができる。図の実施形態では、命令ストリーミング・バッファ１０６、トレース・キャッシュ６２、および命令キュー１０３は、それぞれ、第１と第２のスレッド間に論理的に分割される記憶領域容量を備えることが示されている。
【００３６】
順序外れクラスタ（７１）
図４は、順序外れクラスタ７１の一実施形態の詳細を示すブロック図である。クラスタ７１は、プロセッサ３０内の予約ステーション、レジスタ名前変更、リプレイ、およびリタイヤ機能を備える。クラスタ７１は、トレース送出エンジン６０からマイクロ命令を受け取り、リソースをそれらのマイクロ命令に割り当て、マイクロ命令ごとにソース・レジスタとデスティネーション・レジスタの名前を書き換え、該当する実行ユニット７０にディスパッチするようにマイクロ命令をスケジュールし、データ推測のためリプレイされるマイクロ命令を処理し、そして最後に、マイクロ命令をリタイヤする（つまり、マイクロ命令を永続的アーキテクチャ状態にコミットする）。
【００３７】
クラスタ７１で受け取ったマイクロ命令は、同時にレジスタ・エイリアス・テーブル１２０および割り当ておよび空きリスト管理ロジック１２２に送られる。レジスタ・エイリアス・テーブル１２０は、論理レジスタ名を、スケジューラ７２と実行ユニット７０で使用する物理レジスタ・アドレスに変換する役割を持つ。より具体的には、図５を参照すると、レジスタ・エイリアス・テーブル１２０は、物理レジスタ・ファイル１２４内に保持されている整数、浮動小数点、およびセグメント・レジスタの名前を書き換える。レジスタ・ファイル１２４は、８本のアーキテクチャ・レジスタにエイリアスされる１２６本の物理レジスタを含むことが示されている。図の実施形態では、レジスタ・エイリアス・テーブル１２０は、プロセッサ３０のそれぞれのフロント・エンドとバック・エンドで利用するためフロントエンド・テーブル１２６とバック・エンド・テーブル１２８の両方を含むことが示されている。レジスタ・エイリアス・テーブル１２０内の各エントリは、アーキテクチャ・レジスタと関連付けられるか、またはアーキテクチャ・レジスタとみなされ、関連するアーキテクチャ・レジスタに帰されるデータが格納されるレジスタ・ファイル１２４内の場所を指すポインタ１３０を含む。このようにして、比較的少数のアーキテクチャ・レジスタを規定した従来のマイクロプロセッサ・アーキテクチャに内在する問題点に対処できるのである。
【００３８】
割り当ておよび空きリスト管理ロジック１２２は、クラスタ７１内のリソース割り当ておよび状態回復の役割を持つ。ロジック１２２は、以下のリソースを各マイクロ命令に割り当てる。
１．  マイクロ命令がクラスタ７１内で処理されるときにスレッド内の論理的順序を追跡するため各マイクロ命令に与えられる順序番号。各マイクロ命令に帰する順序番号は、マイクロ命令のステータス情報とともに、リオーダ・バッファ１６２内のテーブル１８０（図１０の下に示されている）に格納される。
２．マイクロ命令の履歴を追跡し、状態回復動作が生じた場合に復元できるようにする空きリスト管理エントリ。
３．  順序番号でインデックス作成されているリオーダ・バッファ（ＲＯＢ）エントリ。
４．  マイクロ命令が有用な結果を格納する物理レジスタ・ファイル１２４エントリ（「マーブル」と呼ばれる）。
５．  ロード・バッファ（図に示されていない）エントリ。
６．  停止バッファ（図に示されていない）エントリ。
７．  命令キュー・エントリ（たとえば、後述のように、メモリ命令キューまたは汎用命令アドレス・キューへ）。
【００３９】
ロジック１２２がマイクロ命令の受信済みシーケンスについて必要なリソースを取得できない場合、ロジック１２２は十分なリソースが利用できるようになるまでマイクロ命令の送出を追跡する送出エンジン６０を停止することを要求する。この要求は、図２に示されている停止信号８２をアサートすることで通知される。
【００４０】
レジスタ・ファイル１２４内のエントリをマイクロ命令に割り当てることに関して、図５には、アーキテクチャ・レジスタに割り当てられなかったレジスタ・ファイル１２４内のエントリの記録を保持するトラッシュ・ヒープ配列１３２が示されている（つまり、レジスタ・エイリアス・テーブル１２０内のポインタでない）。ロジック１２２は、トラッシュ・ヒープ配列１３２にアクセスし、受け取ったマイクロ命令への割り当てに使用できるレジスタ・ファイル１２４内のエントリを識別する。ロジック１２２はさらに、利用できるようになったレジスタ・ファイル１２４内のエントリを回収する役割も持つ。
【００４１】
ロジック１２２はさらに、空きリスト・マネージャ（ＦＬＭ）１３４を保持し、アーキテクチャ・レジスタの追跡を可能にする。特に、空きリスト・マネージャ１３４は、マイクロ命令が割り当てられるときのレジスタ・エイリアス・テーブル１２０への変更の履歴を保持する。空きリスト・マネージャ１３４は、レジスタ・エイリアス・テーブル１２０を「解放して」予測間違いまたはイベントを与える非推測状態を指すようにする機能を持つ。空きリスト・マネージャ１３４は、さらに、レジスタ・ファイル１２４のエントリ内のデータの格納「年齢を数え」、すべての状態情報が最新であることを保証する。最後に、リタイヤ時に、物理レジスタ識別子が空きリスト・マネージャ１３４からトラッシュ・ヒープ配列１３２に転送され、他のマクロ命令への割り当てが行われる。
【００４２】
命令キュー・ユニット１３６は、マイクロ命令をスケジューラとスコアボード・ユニット（ＳＳＵ）１３８に順次プログラム順序でマイクロ命令を送り、実行ユニット７０で必要なマイクロ命令情報を保持し、ディスパッチする。命令キュー・ユニット１３６は、２つの異なる構造、つまり命令キュー（ＩＱ）１４０と命令アドレス・キュー（ＩＡＱ）１４２を備えることができる。命令アドレス・キュー１４２は、小さな構造で、クリティカルな情報（たとえば、マイクロ命令ソース、デスティネーション、および待ち時間）を必要に応じてユニット１３８に送るように設計されている。命令アドレス・キュー１４２は、さらに、メモリ動作用の情報をキューに入れるメモリ命令アドレス・キュー（ＭＩＡＱ）と、非メモリ動作用の情報をキューに入れる汎用命令アドレス・キュー（ＧＩＡＱ）を備えることもできる。命令キュー１４０は、あまりクリティカルでない情報、たとえば、マイクロ命令のｏｐコードや即値データを格納する。マイクロ命令は、関連するマイクロ命令がスケジューラおよびスコアボード・ユニット１３８との間で読み書きされるときに命令キュー・ユニット１３６から割り当てを解放される。
【００４３】
スケジューラおよびスコアボード・ユニット１３８は、各マイクロ命令ソースの準備が整うとき、および適切な実行ユニットがディスパッチに利用できるようになるときを判別することによりマイクロ命令を実行用にスケジュールする役割を持つ。ユニット１３８は、レジスタ・ファイル・スコアボード１４４、メモリ・スケジューラ１４６、マトリックス・スケジューラ１４８、低速マイクロ命令スケジューラ１５０、および浮動小数点スケジューラ１５２を備えることが図４に示されている。
【００４４】
ユニット１３８は、レジスタ・ファイル・スコアボード１４４内に保持されている情報を調べることによりソース・レジスタがいつ使用可能状態になるかを判別する。この目的のために、一実施形態のレジスタ・ファイル・スコアボード１４４は、２５６ビットを持ち、これでレジスタ・ファイル１２４内の各レジスタに対応するデータ・リソースの利用可能性を追跡する。たとえば、データを関連エントリに割り当てたり、ユニット１３８に書き込み動作を行ったときに、レジスタ・ファイル１２４内の特定のエントリに対するスコアボード・ビットをクリアすることができる。
【００４５】
メモリ・スケジューラ１４６は、メモリ・クラスのマイクロ命令をバッファリングし、リソースが利用可能かどうかをチェックし、メモリ・クラスのマイクロ命令をスケジュールする。マトリックス・スケジューラ１４８は、依存するバックツーバックのマイクロ命令のスケジューリングを可能にする２つの密結合演算論理回路（ＡＬＵ）スケジューラを備える。浮動小数点スケジューラ１５２は、浮動小数点マイクロ命令をバッファリングし、スケジュールするが、低速マイクロ命令スケジューラ１５０は、上述のスケジューラでは取り扱われないマイクロ命令をスケジュールする。
【００４６】
チェッカ、リプレイ、およびリタイヤ・ユニット（ＣＲＵ）１６０は、リオーダ・バッファ１６２、チェッカ１６４、ステージング・キュー１６６、およびリタイヤ制御回路１６８を備えることが示されている。ユニット１６０は、３つの主要な機能、つまり、チェック機能、リプレイ機能、およびリタイヤ機能を備える。特に、チェッカおよびリプレイ機能は、不正に実行されたマイクロ命令の再実行機能を含む。リタイヤ機能は、アーキテクチャの順序正しい状態をプロセッサ３０にコミットする機能を備える。より具体的には、チェッカ１６４は、各マイクロ命令が正しいデータを適切に実行したことを保証する動作をする。マイクロ命令が正しいデータで実行されなかった場合（たとえば、予測誤り分岐により）、関連するマイクロ命令がリプレイされ、正しいデータで実行される。
【００４７】
リオーダ・バッファ１６２は、プログラム順序でマイクロ命令をリタイヤすることによりアーキテクチャ状態をプロセッサ３０にコミットする役割を持つ。リタイヤ・ポインタ１８２は、リタイヤ制御回路１６８により生成され、リタイヤされるリオーダ・バッファ１６２内のエントリを示す。リタイヤ・ポインタ１８２がエントリ内のマイクロ命令を過ぎると、空きリスト・マネージャ１３４内の対応するエントリが解放され、関連するレジスタ・ファイル・エントリが回収され、トラッシュ・ヒープ配列１３２に転送される。リタイヤ制御回路１６８はさらに、アクティブなスレッド・ステート・マシン１７１を実装することも示しているが、その目的と機能については後述する。リタイヤ制御回路１６８は、リオーダ・バッファ１６２に保持されている推測結果をレジスタ・ファイル１２４内の対応するアーキテクチャ状態にコミットする動作を制御する。
【００４８】
リオーダ・バッファ１６２は、さらに、後述するように、内部および外部のイベントを処理する役割も持つ。リオーダ・バッファ１６２でイベント発生を検出すると、「ヌーク」信号１７０がアサートされる。ヌーク信号１７０は、現在転送中のプロセッサ・パイプラインからすべてのマイクロ命令をフラッシュする効果を持つ。リオーダ・バッファ１６２は、さらに、トレース送出エンジン６０に、イベントを処理するためにマイクロ命令のシーケンス動作を開始するアドレスを供給する（つまり、マイクロコードで実現されるイベント・ハンドラ６７のディスパッチ元）。
【００４９】
リオーダ・バッファ（１６２）
図６Ａは、マルチスレッド・プロセッサ３０内の複数のスレッドを処理するように論理パーティションが設定されているリオーダ・バッファ１６２の例示的な実施形態に関する詳細を示すブロック図である。特に、リオーダ・バッファ１６２は、プロセッサ３０がマルチスレッド・モードで動作しているときに第１と第２のスレッドのエントリを入れられるように論理パーティション設定できるリオーダ・テーブル１８０を含むことが示されている。シングル・スレッド・モードで動作している場合、テーブル全体１８０を使用して、シングル・スレッドを処理できる。テーブル１８０は、一実施形態では、マルチスレッド・モードで動作するときに、テーブル１８０内の所定のまた異なるエントリのセットに限定される２つのリタイヤ・ポインタ１８２および１８３によって参照される単一のストレージ構造を備える。同様に、シングル・スレッド・モードで動作している場合、テーブル１８０は単一リタイヤ・ポインタ１８２によって参照される。テーブル１８０は、レジスタ・ファイル１２４の各エントリに対応するエントリを含み、シーケンス番号とステータス情報をフォルト情報、論理的デスティネーション・アドレス、およびレジスタ・ファイル１２４内のそれぞれのマイクロ命令データ・エントリに対する有効ビットの形で格納する。テーブル１８０内のエントリは、それぞれ、各マイクロ命令の一意的識別子をなすシーケンス番号によるインデックスが設定される。テーブル１８０内のエントリは、シーケンス番号に応じて、順番に順序正しく割り当てられ、また割り当てを解放される。他のフロー・マーカに加えて、テーブル１８０はさらに、マイクロ命令ごとに共有リソースのフロー・マーカ１８４および同期フロー・マーカ１８６を格納することが示されている。
【００５０】
リオーダ・バッファ１６２は、割り込み要求を割り込みベクトルの形で受け取り、さらにリタイヤ・ポインタ１８２および１８３によって参照されるテーブル１８０内のエントリにアクセスするために結合されているイベント検出器１８８を備える。イベント検出器１８８は、さらに、ヌーク信号１７０およびクリア信号１７２を出力することが示されている。
【００５１】
特定のスレッド（たとえば、スレッド０）に対する特定のマイクロ命令で、分岐予測誤り、例外または割り込みが生じないと仮定すると、特定の命令に対するテーブル１８０内のエントリに格納されている情報は、関連するエントリを扱えるようにリタイヤ・ポインタ１８２または１８３がインクリメントされたときにアーキテクチャ状態にリタイヤされる。この場合、命令ポインタ計算器１９０は、リタイヤ制御回路１６８の一部をなし、マクロまたはマイクロ命令ポインタをインクリメントして、（１）レジスタ・ファイル１２４内の対応するエントリ内で指定された分岐ターゲット・アドレスまたは（２）分岐がとられない場合に次のマクロ命令またはマイクロ命令を指すようにする。
【００５２】
分岐予測誤りが発生した場合、情報がフォルト情報フィールドを介して、リタイヤ制御回路１６８およびイベント検出器１８８に伝達される。フォルト情報を通じて示された分岐予測誤りを考慮すると、プロセッサ３０はプロセッサ・パイプラインを透過した少なくともいくつかの正しくない命令をフェッチしてる可能性がある。テーブル１８０内のエントリは順次割り当てられるので、予測誤りのあった分岐マイクロ命令の後のすべてのエントリは、分岐誤りのある分岐命令フローによって汚されたマイクロ命令である。予測誤り分岐がフォルト情報内に登録されているマイクロ命令のリタイヤを試みたことに対する応答として、イベント検出器１８８はクリア信号１７２をアサートし、これにより、すべての状態のプロセッサの順序外れバック・エンド全体をクリアし、その結果、命令から生じたすべての状態の順序外れバック・エンドがフラッシュされ、その後に予測誤りのマイクロ命令が続く。クリア信号１７２のアサートでも、プロセッサ３０の順序正しいフロントエンド内に置かれるその後フェッチされたマイクロ命令の発行がブロックされる。
【００５３】
リタイヤ制御回路１６８内で、リタイヤするマイクロ命令のフォルト情報を通じて予測誤りのある分岐の通知後、ＩＰ計算器１９０は、命令ポインタ１７９および／または１８１を更新し、正しい命令ポインタ値を表すようにする。その分岐を取るか取らないかに基づいて、ＩＰ計算器１９０は命令ポインタ１７９および／または１８１をテーブル１８０の関連エントリに対応するレジスタ・ファイル・エントリからの結果データで更新するか、または分岐が取られたときに命令ポインタ１７９および１８１をインクリメントする。
【００５４】
イベント検出器１８８はさらに、複数のスレッドのそれぞれについて検出されたイベントに関して情報を保持するために多数のレジスタ２００を備えている。レジスタ２００は、イベント情報レジスタ２０２、保留イベント・レジスタ２０４、イベント禁止レジスタ２０６、および解放レジスタ２０８およびピン状態レジスタ２１０を含む。レジスタ２０２〜２１０のそれぞれが、特定のスレッドについて生成されたイベントに関連する情報を格納できる。したがって、複数のスレッドに対するイベント情報をレジスタ２００で保持することができる。
【００５５】
図６Ｂは、第１のスレッド（たとえば、Ｔ０）に対する例示的な保留イベントレジスタ２０４および例示的なイベント禁止レジスタ２０６の概略図である。
【００５６】
保留イベントおよびイベント禁止レジスタ２０４および２０６は、マルチスレッド・プロセッサ３０内でサポートされているスレッドごとに用意される。異なるレジスタ２０４および２０６をスレッドごとに用意するか、またはそれとは別に、単一の物理レジスタを論理的に分割し、複数のスレッドをサポートすることができる。
【００５７】
例示的な保留イベント・レジスタ２０４は、イベント検出器１８８によって登録されるイベント・タイプ（たとえば、図８を参照して以下で説明するイベント）ごとに１ビット、またはその他のデータ項目を含む。これらのイベントは、プロセッサ３０の内部で生成される内部イベント、またはプロセッサ３０の外部で生成される外部イベント（たとえば、プロセッサ・バスから受け取ったピン・イベント）を構成できる。図の実施形態の各スレッドの保留イベント・レジスタ２０４は、書き戻しイベントに対する１ビットを含まず、このようなイベントはスレッド特有ではなく、そのため、保留イベント・レジスタで「キューには入ら」ない。このために、イベント検出器１８８は、書き戻しイベントの検出時に書き戻し信号をアサートする書き戻し検出ロジック２０５を含む。各スレッドの保留イベント・レジスタ２０４内のビットは、保留イベント・レジスタ２０４内の適切なビットをセットするラッチをトリガするイベント検出器１８８によってセットされる。例示的な実施形態では、保留イベント・レジスタ２０４内の所定のイベントと関連するセット・ビットは、後述のように、関連するタイプのイベントが保留であることを示す。
【００５８】
各スレッドのイベント禁止レジスタ２０６も同様に、イベント検出器１８８によって認識されるイベント・タイプごとに、１ビット、つまり他のデータ構造を含み、このビットはセットまたはリセット（つまり、クリア）され、イベントを特定のスレッドに関してブレーク・イベントであるとして記録する。イベント禁止レジスタ２０６内のそれぞれのビットは、制御レジスタ書き込みオペレーションでセットされ、このオペレーションでは、プロセッサ３０内の名前書き換えのない状態を修正する特別なマイクロ命令を利用する。イベント禁止レジスタ２０６内のビットも同様に、制御レジスタ書き込みオペレーションを利用してリセット（またはクリア）できる。
【００５９】
例示的なプロセッサでは、また、イベント禁止レジスタ２０６内のビットをセットしてそれぞれのモード内の選択イベントを禁止することができるモードがいくつかある。
【００６０】
特定のスレッドに対する保留イベントおよびイベント禁止レジスタ２０４および２０６のそれぞれに保持される特定のイベント・タイプのビットはＡＮＤゲート２０９に出力され、これはさらに、レジスタ２０４および２０６の内容が関連イベント・タイプが保留で禁止されていないことを示すときに各イベント・タイプのイベント検出信号２１１を出力する。たとえば、イベント・タイプが禁止されている場合、保留イベント・レジスタ２０４内のイベントの登録が行われると、関連イベント・タイプについてイベント検出信号２１１がアサートされて検出されるためイベントは即座に信号として出力される。他方、イベント・タイプがイベント禁止レジスタ２０６の内容によって禁止されている場合、イベント発生は保留イベント・レジスタ２０４内に記録されるが、イベント検出信号２１１は、イベント禁止レジスタ２０６内の該当するビットがクリアされた場合のみアサートされるが、イベントはそのまま保留としてレジスタ２０４内に記録される。したがって、イベントは、保留イベント・レジスタ２０４内に記録できるが、関連イベント発生に対するイベント検出信号２１１は、特定のスレッドの禁止が解除された以降にのみ信号として出力される。
【００６１】
各スレッドの各イベント・タイプのイベント検出信号２１１は、イベント処理ロジック（イベント優先順位付けおよび選択ロジック）に送られるが、これについては後述する。
【００６２】
特定のイベントのイベント・ハンドラは、イベントの処理が完了した後に、特定のスレッドについて保留イベント・レジスタ２０４内の適切なビットをクリアする役割を持つ。他の実施形態では、保留イベント・レジスタをハードウェアでクリアできる。
【００６３】
マルチスレッド・プロセッサ環境内のイベント発生およびイベント処理
マルチスレッド・プロセッサ３０内のイベントは、さまざまなソースから検出し信号を送出できる。たとえば、プロセッサ３０の順序正しいフロントエンドは、イベントの信号を送信し、実行ユニット７０は同様に、イベントの信号を送出できる。イベントは、割り込みと例外を含むことができる。割り込みは、プロセッサ３０の外部で発生するイベントであり、共通バス（図に示されていない）を介してデバイスからプロセッサ３０へと開始できる。割り込みにより、制御の流れはマイクロコード・イベント・ハンドラ６７に向かう。例外は、大まかに、フォルト、トラップ、およびアシストと特に分類できる。例外は、プロセッサ３０内で通常発生するイベントである。
【００６４】
イベントは、レコード・バッファ１６２内のイベント検出器１８８に直接伝達され、これに応答して、イベント検出器１８８はイベントが発生したスレッドに関する多数のオペレーションを実行する。高レベルでは、イベント検出器１８８は、イベントの検出に応答して、スレッドのマイクロ命令のリタイヤをサスペンドし、適切なフォルト情報をテーブル１８０に書き込み、ヌーク信号１７０をアサートし、イベント・ハンドラ６７を呼び出してイベントを処理し、リスタート・アドレスを決定して、マイクロ命令のフェッチを再開する。イベントは、リタイヤしている第１または第２のスレッドの命令について、割り込み要求（または割り込みセクタ）またはリオーダ・テーブル１８０内に記録されたフォルト情報を通じて、イベント検出器１８８に直接伝達できる。
【００６５】
ヌーク信号１７０のアサートが実行されると、状態のマルチスレッド・プロセッサ３０の順序正しいフロントエンドおよび順序外れのバック・エンドの両方がクリアされる。特に、多数の機能ユニットは、必ずしもすべてではないが、状態をクリアされ、マイクロ命令はヌーク信号１７０のアサートに応答する。メモリ順序バッファ４８およびインタフェース・ユニット３２の一部は、クリアされない（たとえば、リタイヤされるが、コミットされない格納、バス・スヌープなど）。ヌーク信号１７０のアサートで、さらに、フロントエンドにより命令フェッチが停止し、またマイクロコード・キュー６８へのマイクロ命令のシーケンス動作が停止する。複数のスレッドが残っており、マルチスレッド・プロセッサ３０内で処理される場合、このオペレーションはシングル・スレッド・マルチプロセッサ、つまりシングル・スレッドを実行しているマルチプロセッサ内で無事に実行できるが、他のスレッドが存在していることは、シングル・スレッドに関係するイベント発生を取り扱う際に無視できない。したがって、本発明では、シングル・スレッドのイベントが発生したときにマルチスレッド・プロセッサ３０内の複数のスレッドの処理および存在を認識するマルチスレッド・プロセッサ内のイベントを処理するための方法と装置を提案する。
【００６６】
図７Ａは、マルチスレッド・プロセッサ３０内のイベント発生を処理する本発明の例示的な実施形態による方法２２０を示す流れ図である。方法２２０は、第１のスレッドの第１のイベントのイベント検出器１８８による検出でブロック２２２から開始する。図８は、ブロック２２２でイベント検出器１８８によって検出できる多数のイベント例２２４の図式表現である。図８で表されているイベントは、イベント２２４への応答の特性に応じて大まかにグループ分けされている。イベントの第１のグループは、検出後即座に、後述の方法でＲＥＳＥＴイベント２２６と、マルチスレッド・プロセッサ３０内のマルチスレッドにイベント検出器１８８により信号送出されるＭＡＣＨＩＮＥ  ＣＨＥＣＫイベント２２８を含み、すべてのスレッドが同時に同じイベント・ハンドラ６７に入る。イベントの第２のグループは、それぞれ、イベントの信号が送出された特定のスレッドのマイクロ命令のリタイヤに関して報告されるＦＡＵＬＴイベント２３０、ＡＳＳＩＳＴイベント２３２、ＤＯＵＢＬＥ  ＦＡＵＬＴイベント２３４、ＳＨＵＴＤＯＷＮイベント２３６、およびＳＭＣ（自己修正コード）イベント２３８を含む。特に、イベント検出器１８８は、フォルト情報がフォルト条件を示すマイクロ命令のリタイヤの後、第２のグループのイベントを検出する。第２のグループのイベントの検出は、関連イベントが発生したスレッドに対してのみイベント検出器１８８によってその信号が送られる。
【００６７】
イベントの第３のグループは、ＩＮＩＴ（短いリセット）イベント２４０、ＩＮＴＲ（ローカル割り込み）イベント２４２、ＮＭＩ（マスク不可能割り込み）イベント２４４、ＤＡＴＡ  ＢＲＥＡＫＰＯＩＮＴイベント２４６、ＴＲＡＣＥ  ＭＥＳＳＡＧＥイベント２４８、およびＡ２０Ｍ（アドレス・ラップアラウンド）イベント２５０を含む。第３グループのイベントは、アクセプト割り込みまたはアクセプト・トラップ・フロー・マーカを持つマイクロ命令のリタイヤに関して報告される。第３のグループのイベントの検出は、関連イベントが発生したスレッドに対してのみイベント検出器１８８によってその信号が送られる。
【００６８】
イベントの第４グループは、ＳＭＩ（システム管理割り込み）イベント２５０、ＳＴＯＰ  ＣＬＯＣＫイベント２５２、およびＰＲＥＱ（プローブ要求）イベント２５４を含む。第４グループのイベントの信号が、マルチスレッド・プロセッサ３０内に残っているすべてのスレッドへ送られ、複数のスレッドのうちのいずれか１つにより適切な割り込みフロー・マーカを持つマイクロ命令がリタイヤするときに報告される。第４のグループのイベントのどれかに応答して複数のスレッド間に同期がとられない。
【００６９】
イベントの第５のグループは、例示的な実施形態に応じて、マルチスレッド・プロセッサ・アーキテクチャに固有のものであり、説明されている実施形態内で実施され、マルチスレッド・プロセッサ環境に特定の多数の考慮事項を扱う。イベントの第５のグループは、ＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０、ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２、およびＳＬＥＥＰイベント２６４を含む。
【００７０】
ＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０は、（１）マルチスレッド・プロセッサ３０内の第１のスレッドに保留イベントがあり（たとえば、上述のイベントのどれかが保留）、（２）第２のスレッドに保留イベントがなく（イベント２６０以外）、（３）共有リソース・フロー・マーカ１８４または同期フロー・マーカ１８６を持つマイクロ命令がリオーダ・バッファ１６２によってリタイヤされるときに第２のスレッドに関して登録されるイベントである。ＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０は、フロー・マーカ１８４または１８６を持つリタイヤしたマイクロ命令の後のマイクロ命令で第２スレッドの実行を再開する仮想ヌーク・イベント・ハンドラを呼び出す。
【００７１】
ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２の信号は、マルチスレッド・プロセッサ３０内の共有状態またはリソースを修正するために特定のスレッド（たとえば、第１のスレッド）が必要なときにマイクロコードによって送られる。この目的のために、マイクロコード・シーケンサ６６は、同期マイクロ命令を第１のスレッドのフロー内に挿入し、デッドロック状況を避けるために、共有リソース・フロー・マーカ１８４と同期フロー・マーカ１８６の両方で「同期マイクロ命令」にマークをつける。ＳＹＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２は、第１のスレッドの同期マイクロ命令のリタイヤ後と、関連する同期フロー・マーカ１８６を持つ第２のスレッドのマイクロ命令のリタイヤ後にのみ検出（または登録）される。ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２は、マイクロコード一時レジスタ内に格納された命令ポインタで第１のスレッドの実行を再開する同期イベント・ハンドラの同期イベントを呼び出す効果を持つ。ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２の処理に関する詳細を以下で取り上げる。第２のスレッドは、仮想ＮＵＫＥ  ２６０を実行する。
【００７２】
ＳＬＥＥＰイベント２６４は、関連スレッドをアクティブ状態からインアクティブ（またはスリープ）状態に遷移させるイベントである。インアクティブ・スレッドは、再び、適切なＢＲＥＡＫイベントによりインアクティブ状態からアクティブ状態に遷移させることができる。スレッドをアクティブ状態に遷移させて戻すＢＲＥＡＫイベントの性質は、スレッドをインアクティブ状態に遷移させたＳＬＥＥＰイベント２６４に依存する。スレッドによりアクティブ状態に入る動作およびそこから出る動作について以下で詳述する。
【００７３】
図９は、本発明の例示的な実施形態におけるイベントおよびクリア・ポイント（「ヌーク・ポイント」ともいう）検出を説明するために、後述のリオーダ・バッファ１６２内のリオーダ・テーブル１８０の例示的な内容を示すブロック図である。ブロック２２２のイベント検出器１８８による上記のイベントの１つを検出する動作が、マルチスレッド・プロセッサ３０内の内部ソースからまたはプロセッサ３０の外の外部ソースからイベント検出器１８８に伝達されるイベント２６６に応答して実行される。このようなイベント２６６の通信の例として、割り込みベクトルがある。それとは別に、イベントの発生を、リタイヤしその結果リタイヤ・ポインタ１８２によって識別される特定のスレッド（たとえば、スレッド１）のマイクロ命令に対するフォルト情報２６８によってイベント検出器１８８に伝達することができる。外部イベントについては、スレッドごとに１つの信号があることに注意されたい（たとえば、それぞれ信号２６６および２６７）。内部イベントについては、スレッドを含むリオーダ・バッファ１６２のエントリが、フォルトが位置によって関連付けられるスレッドを示す（たとえば、Ｔ０対Ｔ１）。イベントの検出後、イベント検出器１８８は、イベント情報レジスタ２０２内に特定のイベントに関するイベント情報（たとえば、イベント・タイプ、イベント・ソースなど）を格納し、さらに、保留イベント・レジスタ２０４内の関連スレッドの保留イベントを登録する。上述のように、関連するスレッドに対する保留イベント・レジスタ２０４内の保留イベントの登録では、レジスタ２０４内の、特定のイベントと関連するビットをセットする。さらに、関連するスレッドに対するイベント禁止レジスタ２０６内のビットのセットによりイベントが禁止されない場合に、適切なイベント検出信号２１１のアサートによりイベントが効果的に検出され、場合によっては、マイクロ命令は適切なフロー・マーカを含むことに注意されたい。
【００７４】
図７Ａに示されている流れ図に戻ると、ブロック２２２の第１のスレッドの第１のイベントの検出の後、イベント検出器１８８はブロック２７０で第１のスレッドのリタイヤを停止し、「ヌーク前」信号１６９をアサートする。ヌーク前信号１６９は、第１のスレッドが第２のスレッドの除外に対し命令パイプラインを支配するデッドロック状況を回避するためにアサートされる。特に、第２のスレッドを命令パイプラインへのアクセスから除外する場合、マルチスレッドのヌーク・オペレーションを開始するのに必要な第２のスレッドに関する条件は発生しない場合がある。ヌーク前信号１６９は、したがって、プロセッサのフロントエンドに伝播し、特に、メモリ実行ユニット４２に伝播するため、イベントが検出された第１のスレッドを構成するマイクロ命令のプロセッサ・パイプラインが枯渇する。プロセッサ・パイプラインの枯渇は、単に、たとえば、メモリ実行ユニット４２またはフロントエンドのその他のコンポーネントによって実行される命令のプリフェッチと自己修正コード（ＳＭＣ）オペレーションを無効にすることにより実行できる。つまり、第１のスレッドのマイクロ命令のリタイヤを停止し、かつ／またはプロセッサ・パイプラインへの第１のスレッドによるマイクロ命令の供給を停止、あるいは実質的に低減することにより、第２のスレッドに対しプロセッサの優先度を与えるため、デッドロック状況の発生確率は低くなる。
【００７５】
決定ボックス２７２で、第２のスレッドがマルチスレッド・プロセッサ３０内でアクティブかどうか、それに応じてリオーダ・バッファ１６２によってリタイヤされるかどうかに関する決定が下される。第２のスレッドがアクティブでない場合、方法２２０は、直接、ブロック２７４に進み、そこで、「ヌーク・オペレーション」という第１のタイプのクリア・オペレーションが実行される。特定のスレッドがアクティブかインアクティブかの決定は、リタイヤ制御回路１６８によって保持されるアクティブなスレッド・ステート・マシン１７１に関して実行できる。ヌーク・オペレーションは、上述のように、状態のマルチスレッド・プロセッサ３０の順序正しいフロントエンドおよび順序外れのバック・エンドの両方をクリアする効果を持つヌーク信号１７０のアサートから開始する。第１のスレッドのみがアクティブであるため、ヌーク・オペレーションの、マルチスレッド・プロセッサ３０内に存在し残っている可能性のある他のスレッドに対する影響を考慮する必要がない。
【００７６】
他方、第２のスレッドが決定ボックス２７２のマルチスレッド・プロセッサ３０内でアクティブであると判断された場合、方法２２０は進行し、第２のスレッドのネガティブな結果を低減し、ヌーク・オペレーションを実行できる第２のスレッドに対しクリア・ポイント（またはヌーク・ポイント）を検出する一連のオペレーションを実行する。クリア・ポイントの検出後に実行されるヌーク・オペレーションは、ブロック２７４で実行されるオペレーションと同じであり、したがって、状態のマルチスレッド・プロセッサ３０をクリアする（つまり、第１と第２の両方のスレッドの状態）。状態のクリア操作は、明細書の他のところで説明したマイクロ命令「ドレイン」オペレーションを含む。本出願で開示している例示的な実施形態では、クリア・ポイントの検出後に実行されるヌーク・オペレーションは、第１のスレッドに対し保持されている状態とマルチスレッド・プロセッサ３０内の第２のスレッドに対し保持されている状態とを区別しない。代替実施形態では、クリア・ポイントの検出後に実行されるヌーク・オペレーションは、シングル・スレッドのみの状態をクリアするが（つまり、イベントが検出されたスレッド）、ただし、マルチスレッド・プロセッサ３０内でリソース共有が著しい場合、またこのような共有されたリソースの動的な分割および分割解除により複数のスレッドを処理する場合であって、シングル・スレッドの状態のクリアは特に複雑である。ただし、この代替実施形態では、なおいっそう複雑なハードウェアが必要になる場合がある。
【００７７】
決定ボックス２７２の肯定的決定の後、決定ボックス２７８で、さらに、第２のスレッドでイベントが発生したかどうかを判別する。このようなイベントは、上述のイベントのどれかを含むが、ただし、ＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０は除く。この決定は再び、第２のスレッドのイベント信号２６６またはフォルト情報信号２６９に応答してイベント検出器１８８により行われる。第２のスレッドで生じたイベントに関する情報は、第２のスレッド専用のイベント情報レジスタ２０２の一部に格納され、イベント発生は保留イベント・レジスタ２０４内で登録される。
【００７８】
第２のスレッドで独立にイベントが発生した場合、この方法は直接ブロック２８０に進み、そこで、マルチスレッド・ヌーク・オペレーションが実行され、状態のマルチスレッド・プロセッサ３０をクリアする。それとは別に、第２のスレッドでイベントが発生しない場合、決定ボックス２８２で、第１のスレッドに対し発生した第１のイベントで、第１のイベントを処理するために共有状態、つまり共有リソースを修正する必要があるかどうかについて決定する。たとえば、上述のように第１のイベントがＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２を含む場合、これは、第１のスレッドが共有状態リソースへのアクセスを必要とすることを示している。ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２は、共有リソースと同期フロー・マーカ１８４および１８６の両方が関連付けられている第１のスレッドに対する同期マイクロ命令のリタイヤにより識別できる。図１０は、図９に示されているのと似たブロック図であり、リオーダ・テーブル１８０の例示的な内容を示している。第１のスレッド（たとえばスレッド０）に割り当てられたテーブル１８０の部分は、リタイヤ・ポインタ１８２で参照されている同期マイクロ命令を含むことが示されている。同期マイクロ命令は、さらに、共有リソース・フロー・マーカ１８４および関連する同期フロー・マーカ１８６を備えることも示されている。図に示されている同期マイクロ命令のリタイヤは、ＳＹＮＣＨＲＯＮＩＺＡＴＩＯＮイベント２６２の発生としてイベント検出器１８８によって登録される。
【００７９】
第１のスレッド（たとえばスレッド０）の第１のイベントが共有状態またはリソースを修正しないと判断された場合、方法２２０は決定ボックス２８４に進み、そこで、第２のスレッド（たとえば、スレッド１）が、共有リソースのフロー・マーカ１８４が関連付けられるマイクロ命令をリタイヤするかどうかを決定する。図９を参照すると、スレッド１のリタイヤ・ポインタ１８２は、共有リソースのフロー・マーカ１８４および同期フロー・マーカ１８６の両方を持つマイクロ命令を参照することが示されている。この状況で、決定ボックス２８４で示されている条件が満たされ、したがって方法２２０はブロック２８０に進み、そこで、マルチスレッド・ヌーク・オペレーションが実行される。それとは別に、第２のスレッド（たとえば、スレッド１）のリタイヤ・ポインタ１８２が、共有リソースのフロー・マーカ１８４または同期フロー・マーカ１８６のいずれかを持つマイクロ命令を参照していない場合、この方法はブロック２８６に進み、そこで、リタイヤ・ポインタ１８２を進めることにより第２のスレッドのリタイヤが続行する。ブロック２８６から、方法２２０は決定ボックス２７８にループ・バックし、そこで、第２のスレッドでイベントが発生したかどうかを判別する。
【００８０】
決定ボックス２８２で、第１のスレッド（たとえばスレッド０）の第１のイベントの処理で、共有リソースを修正が必要であるとと判断された場合、方法２２０は決定ボックス２８８に進み、そこで、第２のスレッド（たとえば、スレッド１）が、同期フロー・マーカ１８６が関連付けられるマイクロ命令をリタイヤしているかどうかが決定される。そうであれば、マルチスレッド・ヌーク・オペレーションがブロック２８０で実行される。実行されない場合、第２のスレッドに対するマイクロ命令のリタイヤはブロック２８６で、第２のスレッドに対してイベントが発生するか、第２のスレッドに対するリタイヤ・ポインタ１８２により同期フロー・マーカ１８６が関連付けられているマイクロ命令にインデックスを作成するまで続く。
【００８１】
ブロック２８０でヌーク・オペレーションが開始した後、ブロック２９０で、マイクロコードにより実施され、マイクロコード・シーケンサ６６から順序付けられる適切なイベント・ハンドラ６７が関連イベントの処理へ進む。
【００８２】
仮想ヌーク・イベント
上述のように、ＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０は他のイベントと少し異なる方法で処理される。この目的のために、図７ＢはＶＩＲＴＵＡＬ  ＮＵＫＥイベント２６０を検出し、処理する、例示的な実施形態による方法２９１を示す流れ図である。方法２９１では、第２のスレッドのイベントは現在保留されていないと仮定している（つまり、第２のスレッドの保留レジスタに記録されていない）。
【００８３】
方法２９１は、第１のスレッドの第１のイベントのイベント検出器１８８による検出でブロック２９２から開始する。このようなイベントは、図８を参照すると上述のイベントの１つとすることができる。
【００８４】
ブロック２９３で、イベント検出器１８８は第１のスレッドのリタイヤを停止する。ブロック２９４で、イベント検出器１８８は、共有リソース・フロー・マーカ１８４または同期フロー・マーカのいずれかでマイクロ命令のリタイヤを検出する。ブロック２９５で、「仮想ヌーク」ハンドラがマイクロコード・シーケンサ６６から呼び出される。「仮想ヌーク」イベント・ハンドラは、ブロック２９６で、ブロック２９４で上述のリタイヤしたマイクロ命令の後のマイクロ命令から第２のスレッドの実行を再開する。方法２９１は、ブロック２９７で終了する。
【００８５】
ヌーク・オペレーション
図１１Ａは、少なくとも第１と第２のスレッドをサポートするマルチスレッド・プロセッサ内でクリア（またはヌーク）動作を実行する例示的な実施形態による方法３００を示す流れ図である。方法３００は、イベントの発生および検出に応答して、イベント検出器１８８によりヌーク信号１７０のアサートでブロック３０２から開始する。ヌーク信号１７０は、マルチスレッド・プロセッサ３０内の多数の機能ユニットに伝達され、そのアサートおよびデアサートにより、状態のクリアと機能ユニットの構成の準備のための活動を実行するウィンドウが定義される。図１２は、クロック信号３０４の立ち上がりエッジと同期して発生するヌーク信号１７０のアサートを示すタイミング図である。
【００８６】
ブロック３０３で、アクティブなスレッド・ステート・マシンが評価される。
【００８７】
ブロック３０６で、第１のスレッドと第２のスレッドの両方に対して、イベントが発生したマイクロ命令がリタイヤしているかどうかを示す順序番号および最後のマクロ命令信号が割り当ておよび空きリスト管理ロジック１２２、およびプロセッサ３０の順序正しいフロントエンド内のマクロ命令とマイクロ命令のポインタ情報を追跡する追跡分岐予測ユニット（ＴＢＰＵ）内の構造である（したがって、ＴＤＥ６０の一部である）ＴＢＩＴに伝達される。ＴＢＩＴでは、この情報を使用して、イベントに関する情報をラッチする（たとえば、マイクロ命令およびマクロ命令のポインタ）。
【００８８】
ブロック３０８で、イベント検出器１８８は第１と第２のスレッドのそれぞれに対しイベント・ベクトルを構成し、マイクロコード・シーケンサ６６に伝播する。とりわけ、各イベント・ベクトルは、（１）ヌーク・ポインタ（またはクリア・ポイント）が特定されたときにリタイヤした物理リオーダ・バッファの位置（つまり、ヌーク・ポイントが識別されたときの各リタイヤ・ポインタ１８２の値）、（２）検出されたイベントを処理するためイベント・ハンドラ６７を構成するマイクロコードが配置されているマイクロコード・シーケンサ６６内の位置を識別するイベント・ハンドラ識別子、および（３）第１と第２のスレッドのいずれかを識別するスレッド識別子、および（４）他のスレッドについて呼び出されたイベント・ハンドラに関してイベント・ハンドラ６７の優先度を決定するスレッド優先度ビットを識別する情報を含む。
【００８９】
ブロック３１０で、割り当ておよび空きリスト管理ロジック１２２は、ブロック３０６で伝達された順序番号を利用して、シャドウ・エイリアス・テーブル（シャドウＲＡＴ）を、ヌーク・ポイントが検出された位置へ進め、ブロック３１２で、一次レジスタ・エイリアス・テーブル１２０の状態がシャドウ・レジスタ・エイリアス・テーブルから復元される。
【００９０】
ブロック３１４で、割り当ておよび空きリスト管理ロジック１２２は、レジスタ番号（または「マーブル」）を空きリスト・マネージャ１３４から回復し、回復されたレジスタ番号をトラッシュ・ヒープ配列１３２に割り当て、そこでレジスタ番号を再び割り当てることができる。さらに割り当ておよび空きリスト管理ロジック１２２は、すべての適切なレジスタ番号が空きリスト・マネージャ１３４から回復されたときに「回復」信号（図に示されていない）をアサートする。ヌーク信号１７０は、この「回復」信号が割り当ておよび空きリスト管理ロジック１２２から受け取るまで、アサート状態に保持される。
【００９１】
ブロック３１６で、第１および第２のスレッドの両方に対するすべての「シニア」ストア（つまり、リタイヤされたが、まだメモリを更新していないストア）が、ストア・コミット・ロジック（図に示されていない）を使用してメモリ順序バッファから排出される。
【００９２】
ブロック３２０で、イベント検出器１８８が、図１２に示されているように、クロック信号３０４の立ち上がりエッジでヌーク信号１７０をデアサートする。ヌーク信号１７０は、クロック信号３０４の最低限３クロック・サイクルの間アサート状態に保持されていたことに注意されたい。ただし、割り当ておよび空きリスト管理ロジック１２２からの「回復」信号がヌーク信号１７０のアサートに続いてクロック信号３０４の第１の２クロック・サイクル以内にアサートされない場合、イベント検出器１８８は図の３クロック・サイクルを超えてヌーク信号１７０のアサートを延長する。ヌーク信号１７０は、一実施形態では、十分に長い時時間保持され（たとえば、３クロック・サイクルの間）、上述のブロック３０３、３０６、および３０８を完了させる。ヌーク信号１７０は、ブロック３１０、３１２、３１４、および３１６を完了させるために追加サイクルの間保持する必要があることがある。この目的のために、メモリ順序バッファは、「排出されたストア・バッファ」信号をアサートし、ヌーク信号のアサートを延長する。
【００９３】
ブロック３２２で、マルチスレッド・プロセッサ３０内のマイクロコード・シーケンサ６６およびその他の機能ユニットはアクティブなスレッド・ステート・マシン１７１によって保持される「アクティブ・ビット」を調べて、第１および第２のスレッドがそれぞれ、イベント発生後、アクティブ状態にあるのかインアクティブ状態にあるのかを判別する。より具体的には、アクティブなスレッド・ステート・マシン１７１は、関連スレッドがアクティブ状態またはインアクティブ（スリープ）状態であるかを示すマルチスレッド・プロセッサ３０内に残っているスレッドごとにそれぞれのビット指標を保持する。イベントがイベント検出器１８８によって検出され、このイベントに応答してイベント検出器１８８がヌーク信号１７０をアサートしているが、このイベントは、ＳＬＥＥＰイベント２６４またはアクティブ状態とインアクティブ状態との間で第１または第２のスレッドを遷移するＢＲＥＡＫイベントのいずれかを含むことができる。図１２の３２４で示されているように、アクティブなスレッド・ステート・マシン１７１がヌーク信号１７０のアサートが行われている間に評価され、それに応じて「アクティブ・ビット」の状態がヌーク信号１７０のデアサート後有効とみなされる。
【００９４】
決定ボックス３２６で、アクティブなスレッド・ステート・マシン１７１のアクティブ・ビットを調べた機能ユニットのそれぞれが、第１および第２のスレッドがアクティブかどうかを判別する。両方のスレッドがアクティブ・ビットの状態に基づいてアクティブであると判別された場合、方法３００はブロック３２８に進み、そこで、それぞれの機能ユニットは第１と第２のアクティブ・スレッドの両方をサポートし、処理するように構成される。たとえば、さまざまな機能ユニット内に用意される格納およびバッファリング機能は、ストレージ配列内の特定のエントリ・セット（範囲）に限られた第２のポインタ、つまり第２のポインタ・セットをアクティブにすることにより論理的に分割することができる。さらに、２つのスレッドがアクティブな場合に、ＭＴ固有のサポートをアクティブにできる。たとえば、マクロコード・シーケンサと関連付けられたスレッド選択ロジックが、アクティブなスレッド・ステート・マシン１７１の出力に基づいて、「ピンポン」方式により第１のスレッド（たとえば、Ｔ０）から、第２のスレッド（たとえば、Ｔ１）から、または第１と第２のスレッド（たとえば、Ｔ０とＴ１）からスレッドを順序付けることができる。さらに、ローカライズされたクロック・ゲート機能を、アクティブなスレッド・ステート・マシンのビット出力に基づいて実行できる。他の実施形態では、プロセッサ内の任意の数のステート・マシンが、アクティブなスレッド・ステート・マシンの出力に基づいてその動作、または変化状態を修正できる。ブロック３３０で、マイクロコード・シーケンサ６６は、第１と第２のスレッドの両方のマイクロ命令の順序付けに進む。
【００９５】
それとは別に、決定ボックス３２６で、第１と第２のスレッドのうち１つだけアクティブであるか、または両方のスレッドがインアクティブであると判断された場合、機能ユニットのそれぞれが、ブロック３３２で単一のアクティブ・スレッドのみをサポートし処理するように構成され、何らかのＭＴ固有サポートをインアクティブにできる。アクティブなスレッドがない場合、機能ユニットはデフォルト設定として、単一のアクティブ・スレッドをサポートするように構成される。複数のスレッドをサポートするように機能ユニットがすでに構成されている（たとえば、論理パーティション分割されている）場合、他のスレッドをサポートするために利用されるポインタを無効にすることができ、残りのポインタによって参照されているデータ配列内のエントリ・セットを、無効にされたポインタによってすでに参照されているエントリを含むように拡張できる。このようにして、他のスレッドにすでに割り当てられているデータ・エントリを単一のアクティブ・スレッドで使用できるようにする。他のスレッドがインアクティブのときに単一のアクティブ・スレッドで利用できるリソースを増やすことにより、他のスレッドもマルチスレッド・プロセッサ３０内でサポートされている場合にそのパフォーマンスに関して単一の残りのスレッドのパフォーマンスを高めることができる。
【００９６】
ブロック３３４で、マイクロコード・シーケンサ６６は、インアクティブのスレッド、つまりインアクティブ・スレッドについてイベント・ベクトルを無視し、可能なアクティブ・スレッドに対してのみマイクロ命令を順序付ける。アクティブなスレッドがない場合、マイクロコード・シーケンサ６６は、すべてのスレッドに対するイベント・ベクトルを無視する。
【００９７】
ヌーク信号１７０のデアサート（ヌーク・オペレーションの終わりを示す）の後さまざまな機能ユニットにより調査できるアクティブなスレッド・ステート・マシン１７１で保持されるアクティブ・ビットを与えることにより、都合のよい一括集中の指標を用意し、これに従って、ヌーク・オペレーションの完了後にマルチスレッド・プロセッサ３０内の正しい個数のアクティブ・スレッドをサポートするように構成できる。
【００９８】
図１１Ｂは、例示的な構成ロジック３２９を示すブロック図で、機能ユニット３３１と関連付けられており、マルチスレッド・プロセッサ内の１つまたは複数のアクティブ・スレッドをサポートするように機能ユニット３３１を構成する動作をする。機能ユニット３３１は、上述の機能ユニットのいずれか１つ、または当業者であればプロセッサに含められることを理解できる機能ユニットとすることができる。機能ユニット３３１は、構成ロジック３２９によって構成される格納およびロジック・コンポーネントの両方を備えることが示されている。たとえば、格納コンポーネントはレジスタの集まりを備える。これらのレジスタはそれぞれ、複数スレッドがアクティブなときに（つまり、プロセッサがＭＴモードで動作しているときに）これらのスレッドの特定の１つについてマイクロ命令またはデータを格納するように割り当てることができる。したがって、図１１Ｂで示されているように格納コンポーネントは、第１および第２のスレッド（たとえば、Ｔ０およびＴ１）をサポートするように論理的に分割される。もちろん、格納コンポーネントは、任意の数のアクティブ・スレッドをサポートするように分割できる。
【００９９】
ロジック・コンポーネントは、プロセッサ内のマルチスレッド・オペレーションを特にサポートするＭＴロジックを含むことが示されている（つまり、ＭＴモード）。
【０１００】
構成ロジック３２９は、ポインタ値３３３を保持することが示されており、これは機能ユニット３３１の格納コンポーネントに出力される。例示的な一実施形態では、これらのポインタ値３３３を使用して、格納コンポーネントを論理的に分割する。たとえば、読み書きポインタ値の個別のペアをアクティブ・スレッドごとに生成することが可能である。各スレッドのポインタ値の上限および下限は、アクティブ・スレッドの個数に応じて、構成ロジック３２９によって決定される。たとえば、特定のスレッドに対するポインタ値の集合によって示すことができるレジスタの範囲を拡大し、その他のスレッドがインアクティブになった場合に、他のスレッドにすでに割り当てられているレジスタをカバーできる。
【０１０１】
構成ロジック３２９はさらに、ＭＴサポート有効化指標３３５も備え、これは、機能ユニットのロジック・コンポーネントに出力され、機能ロジック３３１のＭＴサポート・ロジックを有効または無効にする。
【０１０２】
アクティブ・ビット３２７は、アクティブなスレッド・ステート・マシン１７４によって出力され、入力を構成ロジックに送り、構成ロジック３２９では、アクティブ・ビット３２７を使用して、値の適切なポイント３３３を生成し、適切なＭＴサポート有効化出力を出す。
【０１０３】
イベント・ハンドラによる排他的アクセス
いくつかのイベント・ハンドラ（たとえば、ページングと同期イベントを処理するハンドラ）では、共有リソースを利用し、共有リソースを修正するために、マルチスレッド・プロセッサ３０への排他的アクセスが必要である。したがって、マイクロコード・シーケンサ６６は、排他的アクセス・ステート・マシン６９を実装し、さらにこれらのイベントハンドラのいずれかがこのような排他的アクセスを必要とする第１および第２のスレッドに対するイベント・ハンドラに対する排他的アクセスを可能にする。排他的アクセス・ステート・マシン６９は、複数のスレッドがマルチスレッド・プロセッサ３０内でアクティブなときにのみ参照できる。フロー・マーカは、排他的アクセス機能を持つイベント・ハンドラと関連付けられているが、スレッドのフロー内に挿入され、イベント・ハンドラを含む排他的コードの終わりをマーク付けする。すべてのスレッドについて排他的アクセスが完了すると、マイクロコード・シーケンサ６６はマイクロ命令の通常発行を再開する。
【０１０４】
図１３は、マルチスレッド・プロセッサ３０内のイベント・ハンドラ６７への排他的アクセスを可能にする例示的な実施形態による方法４００を示す流れ図である。方法４００は、イベント検出器１８８から第１および第２のそれぞれのスレッドについて第１および第２のイベント・ベクトルのマイクロコード・シーケンサ６６をマイクロコードで受け取ったことでブロック４０２から開始する。上述のように、第１および第２のイベント・ベクトルのそれぞれで、各イベント・ハンドラ６７を識別する。
【０１０５】
決定ボックス４０３で、複数のスレッドがアクティブかどうかを判別する。この判別は、アクティブなスレッド・ステート・マシン１７１に関して、マイクロ・コード・シーケンサにより行う。そうでなければ、方法４００はブロック４３４に進む。
【０１０６】
そうであれば、方法４００はブロック４０４に進む。決定ボックス４０４で、マイクロコード・シーケンサ６６は、第１または第２のイベント・ハンドラ６７のいずれかが共有リソースへの排他的アクセスを必要とするか、共有状態を修正するかに関する決定を行う。そうであれば、ブロック４０６で、マイクロコード・シーケンサ６６は、排他的アクセス・ステート・マシン６９を実装し、第１および第２のイベント・ハンドラ６７のそれぞれへの排他的アクセスを提供する。図１４は、排他的アクセス・ステート・マシン６９の実施形態による動作を示す状態図である。ステート・マシン６９は、５つの状態を含むことが示されている。第１の状態４０８で、第１および第２のスレッドに対するマイクロコードは、マイクロコード・シーケンサ６６によって両方とも発行される。排他的アクセス・イベント・ハンドラを必要とするイベントに応答してヌーク・オペレーション４１０が実行された後、ステート・マシン６９は第２の状態４１２に遷移し、第１のスレッドのイベントと関連する第１のイベント・ハンドラ６７（つまり、マイクロ命令）が発行される。第１のイベント・ハンドラ６７を構成するすべてのマイクロ命令の順序付けに続き、またこのようなマイクロ命令によって指示されたすべてのオペレーションの完了の後、マイクロコード・シーケンサ６６は、４１４で停止マイクロ命令（たとえば、関連する停止フロー・マーカを持つマイクロ命令）を発行して、ステート・マシン６９を第２の状態４１２から第１のスレッドのマイクロ命令の発行が停止している第３の状態４１６に遷移させる。４１８で、４１４で発行された停止マイクロ命令がリオーダ・バッファ１６２からリタイヤされ、それにより、ステート・マシン６９は第３の状態４１６から第２のスレッドのイベントと関連してマイクロコード・シーケンサ６６が第２のイベント・ハンドラ６７を発行する第４の状態４２０に遷移する。第２のイベント・ハンドラ６７を構成するすべてのマイクロ命令の順序付けに続き、またこのようなマイクロ命令によって指示されたすべてのオペレーションの完了の後、マイクロコード・シーケンサ６６は、さらに４２２で停止マイクロ命令を発行し、ステート・マシン６９を第４の状態から第２のイベント・ハンドラ６７が停止している第５の状態４２４に遷移する。４２６で、４２２で発行された停止マイクロ命令はリオーダ・バッファ１６２からリタイヤされ、それにより、ステート・マシン６９は第５の状態４２４から第１の状態４０８に戻る。
【０１０７】
ブロック４３２で、第１と第２の両方のスレッドに対するマイクロ命令の通常の順序付けおよび発行が、両スレッドともアクティブであると想定して再開される。
【０１０８】
それとは別に、決定ボックス４０４で、第１または第２のイベント・ハンドラのいずれもプロセッサ３０の共有リソースまたは状態への排他的アクセスを必要としないと判断された場合、この方法はブロック４３４に進み、そこで、マイクロコード・シーケンサ６６が第１と第２のイベント・ハンドラ６７を非排他的インタリーブ方式で構成するようにマイクロコードを順序付ける。
【０１０９】
アクティブなスレッド・ステート・マシン（１７１）
図１５は、アクティブなスレッド・ステート・マシン１７１によって占有される例示的な実施形態による状態を示し、さらに、アクティブなスレッド・ステート・マシン１７１にさまざまな状態間の遷移を行わせる例示的な実施形態による遷移イベントを示す状態図５００である。
【０１１０】
アクティブなスレッド・ステート・マシン１７１は、４つの状態のうちの１つ、つまり、シングル・スレッド０（ＳＴ０）状態５０２、シングル・スレッド１（ＳＴ１）状態５０４、マルチスレッド（ＭＴ）状態５０６、およびゼロ・スレッド（ＺＴ）状態５０８のうちの１つにあることが示されている。アクティブなスレッド・ステート・マシン１７１は、セットされたときに、関連するスレッドをアクティブであると識別し、リセットされたときに、関連するスレッドをインアクティブまたはスリープ状態であると識別する各スレッドに対する単一のアクティブ・ビットを保持する。
【０１１１】
４つの状態５０２〜５０８の間の遷移は、それぞれのイベントが第１または第２のスレッドに関連するイベントのペアによってトリガされる。状態図５００では、多数のイベント・タイプが、状態間の遷移にかかわるものとして示されている。特に、ＳＬＥＥＰイベントは、スレッドをインアクティブにするイベントである。ＢＲＥＡＫイベントは、特定のスレッドに対し発生した場合に、スレッドをインアクティブ状態からアクティブ状態に遷移させるイベントである。特定のイベントがＢＲＥＡＫイベントとして適格であるかどうかはスレッドをインアクティブにしたＳＬＥＥＰイベントによる。特に、特定のＳＬＥＥＰイベントの結果としてインアクティブになった後、いくつかのイベントのみが、スレッドをアクティブにできる。ＮＵＫＥイベントは、特定のスレッドに対し発生した場合に、上述のようにヌーク・オペレーションを実行するイベントである。図８を参照して上述したすべてのイベントは、ヌーク・イベントを含む可能性がある。最後に、状態図５００内には、特定のスレッドに関する「イベントなし」発生が、状態遷移を引き起こす他のスレッドに関するイベント発生と組合せて存在しうる条件であるとして示されている。
【０１１２】
一実施形態では、ＳＬＥＥＰイベントが特定のスレッドについて信号送出され、そのスレッドのＢＲＥＡＫイベントが保留になっている場合、ＢＲＥＡＫイベントは即座に処理される（たとえば、スレッドは、スリープ状態にならず、後で目覚めてＢＲＥＡＫイベントを処理する）。逆も真である場合があり、特定のイベントについてＢＲＥＡＫイベントの信号が送られ、ＳＬＥＥＰイベントが保留であり、それ以降、ＢＲＥＡＫイベントが処理される。
【０１１３】
イベント検出器１８８によってヌーク信号１７０がアサートされた後、図１２の３２４で示されているように、アクティブなスレッド・ステート・マシン１７１が評価される。ヌーク信号１７０のデアサート後、マルチスレッド・プロセッサ３０内のすべての機能ユニットが、アクティブなスレッド・ステート・マシン１７１によって保持されているアクティブ・ビットに基づき構成される。特に、チェッカ、リプレイ、およびリタイヤ・ユニット（ＣＲＵ）１６０はアクティブ・ビットに基づして生成された信号を影響のあるすべての機能ユニットに伝播し、マルチスレッド・プロセッサ内に残っているスレッドの数とそれらのスレッドのうちどれがアクティブかを機能ユニットに示す。ヌーク信号１７０のアサートに続いて、機能ユニットの構成（たとえば、パーティション分割または解放）は、通常、クロック信号３０４の１クロック・サイクルで完了する。
【０１１４】
スレッドの出入り
本発明では、マルチスレッド・プロセッサ３０内のスレッドが出入りする（たとえば、アクティブになったりインアクティブになったりするなど）例示的なメカニズムを提案するが、この提案によれば、そのような出入りのメカニズムが実行されているスレッドの数に関係なく一様な順序で実行され、マルチスレッド・プロセッサ３０内にアクティブなまたは実行中のスレッドがないときにさまざまな機能ユニットへのクロック信号を順序正しく停止できる。
【０１１５】
状態図５００を参照して上述したように、スレッドに入る（またはアクティブにする）動作は、現在インアクティブのスレッドに対しＢＲＥＡＫイベントを検出したことに応答して実行される。特定のインアクティブ・スレッドに対するＢＲＥＡＫイベント定義は、関連するスレッドがインアクティブである理由によって決まる。スレッドから出る動作は、現在アクティブなスレッドに対するＳＬＥＥＰイベントに応答して実行される。ＳＬＥＥＰイベントの例としては、アクティブ・スレッドに含まれる停止（ＨＬＴ）命令の実行、ＳＨＵＴＤＯＷＮまたはＥＲＲＯＲ  ＳＨＵＴＤＯＷＮ条件の検出、またはアクティブ・スレッドに関する「ＳＩＰＩ待機」（プロセッサ間割り込みの起動）がある。
【０１１６】
図１６Ａは、アクティブ・スレッドのＳＬＥＥＰイベントが検出された後アクティブ・スレッドを終了する本発明の例示的な実施形態による方法６００を示す流れ図である。方法６００は、ブロック６０２から開始し、アクティブ・スレッドに必要なすべての状態を保存し、アクティブ・スレッドに対してすでにマイクロ命令に割り当てられているレジスタ・ファイル１２４内のレジスタ・エントリを解放する。例にすぎないが、レジスタ・ファイル１２４内の１２８個のレジスタ・エントリのうち、アクティブ・スレッドのマイクロ命令にすでに割り当てられている２８個のエントリが解放される。アクティブ・スレッドに対する解放されたレジスタの内容は、「スクラッチ・パッド」に保存され、これは、レジスタ配列または、マルチスレッド・プロセッサ３０内の制御レジスタ・バスに結合されているランダム・アクセス・メモリ（ＲＡＭ）を含むことができる。
【０１１７】
レジスタ・ファイル１２４内のレジスタ・エントリの解放は、アクティブ・スレッドに対するＳＴＯＰＣＬＫ、ＨＡＬＴ（ＨＬＴ）、またはＳＨＵＴＤＯＷＮイベントを検出したことに応答してマイクロコード・シーケンサ６６によって発行される解放マイクロコード・シーケンスによって実行できる。解放マイクロコード・シーケンスは、空きリスト・マネージャ１３４内のレジスタ・ファイル・エントリの記録を削除（または無効化）し、トラッシュ・ヒープ配列１３２内のレジスタ・ファイル・エントリの記録を作成（または有効化）する動作をする。つまり、解放レジスタ・ファイル・エントリの記録は、解放されたマイクロコード・シーケンスにより空きリスト・マネージャ１３４からトラッシュ・ヒープ配列１３２に転送される。
【０１１８】
図１６Ｂは、ブロック６０２で実行できるオペレーションの例示的な実施形態の図式表現である。たとえば、第１のスレッド（たとえばＴ０）にすでに割り当てられているレジスタ・ファイル１２４内の第１のレジスタ・セットの内容は、スクラッチ・パッドに転送されることが示されている。さらに、状態の保存で実行できる追加オペレーションには、既存のスレッドのアーキテクチャ・レジスタの内容をスクラッチ・パッドに格納する動作および第１のスレッドを抜けたときに第１のスレッドに割り当てられたマイクロコード一時レジスタの内容をスクラッチ・パッドに格納する動作も含まれる。その後、スレッドを出て空になったレジスタは、他のスレッド（たとえばＴ１）への再割り当てに使用できる。
【０１１９】
特定のスレッド（たとえば、Ｔ０）に再度入った後、このスレッドに割り当てられたレジスタの内容は図１６Ｂの破線で示されているように、スクラッチ・パッドから復元できることは理解されるであろう。
【０１２０】
ブロック６０４で、出るスレッドに対するスレッド固有の「フェンス・マイクロ命令」が出るスレッドのマイクロ命令フロー内に挿入され、スレッドと関連する残りの保留メモリ・アクセスをメモリ順序バッファ４８、さまざまなキャッシュ、およびプロセッサ・バスから排出する。このオペレーションは、これらのブロックすべてが完了するまでリタイヤしない。
【０１２１】
これらの実行ユニット２０は、マイクロ命令を比較的高速に実行するので、実行ユニット入力に追加された新規のすべてのマイクロ命令は、ＳＬＥＥＰイベントの検出に応答してヌーク信号のアサートでクリアされる。上述のように、ヌーク信号１７０は、十分な期間保持され（たとえば、３クロック・サイクル）、ヌーク信号１７０のアサートの前に実行ユニット７０に入ったマイクロ命令がそこから現れる。これらのマイクロ命令は、実行ユニット７０から出てくるので、クリアされ、書き戻しが取り消される。
【０１２２】
ブロック６０６で、イベント検出器１８８内に保持されている解放レジスタ２０８がセットされ、マイクロコード・シーケンサ６６によって生成されて解放レジスタの状態を設定する値を書き戻すマイクロ命令により既存のスレッドがインアクティブ（またはスリープ）状態に入っていることを示す。
【０１２３】
ブロック６０８で、出るスレッドのイベント禁止レジスタ２０６がセットされ、マイクロコード・シーケンサ６６によって発行された制御レジスタ書き込みマイクロ命令によって出るスレッドの非ブレーク・イベントが禁止される。制御レジスタ・マイクロ命令として指示されている、出るスレッドに対するイベント禁止レジスタをセットする動作は、処理されるスリープ・イベントのタイプによって異なる。上述のように、インアクティブ状態への遷移をトリガしたＳＬＥＥＰイベントに応じて、いくつかのイベントのみがインアクティブ・スレッドに関してブレーク・イベントとして適格である。イベントが特定のインアクティブ・スレッドに対するブレーク・イベントとして適格かどうかを判別する操作は、インアクティブ・スレッドに対するイベント禁止レジスタ２０６の状態を特に参照して行われる。
【０１２４】
ブロック６１２で、出るスレッドのスリープ・イベントの信号は、特別なマイクロ命令の書き戻しフォルト情報フィールド内にスリープ・イベント・エンコーディングを置く特別マイクロ命令を使用して送出する。
【０１２５】
図１７は、インアクティブ・スレッドに対するＢＲＥＡＫイベントが検出された後インアクティブ・スレッドからアクティブ状態に入る例示的な実施形態による方法７００を示す流れ図である。方法７００は、インアクティブ・スレッドに関してＢＲＥＡＫイベントとして適格であるまたは適格でないイベントに対しイベント発生を検出したことで７０２から開始する。決定ボックス７０３で、関連するイベントについてイベント検出ロジック１８５により判別し、イベントがインアクティブ・スレッドのＢＲＥＡＫイベントとして適格であるかどうかを判別する。この目的のために、イベント検出ロジック１８５は、イベント検出器１８８のレジスタ２００内のイベント禁止レジスタ２０６を調べる。関連するイベント・タイプがインアクティブ・スレッドに関して禁止されているＢＲＥＡＫイベントとして示されていない場合に、方法７００はブロック７０４に進み、そこで、必要に応じてクロックをオンにし、イベントの信号を通常どおり送信し（他のスレッドのヌーク可能ポイントを待つ）、ハンドラは任意のイベントで呼び出される。イベント・ハンドラは、スレッドのスリープ状態をチェックし、もし設定されていれば、ブロック７０６のマイクロコード状態の復元に進む。イベント・ハンドラ６７では、解放レジスタ２０８にアクセスしてスレッドのインアクティブ状態を確認する。
【０１２６】
より具体的には、イベント・ハンドラ６７は、保存されているすべてのレジスタ状態、禁止レジスタ状態、および命令ポインタ情報を復元することにより、入るスレッドのマイクロコード状態の復元に進む。
【０１２７】
ブロック７０６のマイクロコード状態の復元の後、方法７００はブロック７０８に進み、そこで、入るスレッドについてアーキテクチャ状態が復元される。ブロック７１０で、入るスレッドのイベント禁止レジスタ２０６が、マイクロコード・シーケンサ６６から発行された適切なマイクロ命令によりリセットまたはクリアされる。ブロック７１２で、イベント・ハンドラ６７は、ＢＲＥＡＫイベントの処理に進む。このときに、イベント・ハンドラ６７を構成するマイクロコードがマルチスレッド・プロセッサ３０内で実行され、イベント発生に応答して一連のオペレーションを実行する。ブロック７１６で、入るスレッドについてプロセッサ３０内で命令フェッチ・オペレーションを再開する。方法７００は、ブロック７１８で終了する。
【０１２８】
クロック制御ロジック
マルチスレッド・プロセッサ３０内の消費電力と放熱を低減するために、ある条件のもとでは、プロセッサ３０内で少なくともいくつかのクロック信号を停止またはサスペンドすることが望ましい。図１８は、上述の例示的なプロセッサ３０などのマルチスレッド・プロセッサ内の選択されたクロック信号を停止または保留する例示的な実施形態による方法８００を示す流れ図である。本明細書の目的のために、プロセッサ内のクロック信号のサスペンドまたは停止する操作を引用した場合、プロセッサ３０内のクロック信号、または信号をサスペンドまたは停止する多数の手法があることを意味する。たとえば、プロセッサ３０内の位相ロック・ループ（ＰＬＬ）をサスペンドしたり、クロック・スパインにそったコア・クロック信号の分配を禁止したり、クロック・スパインを介したプロセッサ内の個別機能ユニットへのクロック信号の分配をゲートしたりその他の方法で禁止したりできる。一実施形態では、後者の状況を説明しており、機能ユニットごとに機能ユニット上でプロセッサ３０内の機能ユニットへの内部クロック信号の供給がサスペンドまたは停止される。したがって、他の機能ユニットに関してゲートしながら内部クロック信号をいくつかの機能ユニットに供給することができる。このような配置は、米国特許第５６５５１２７号のシングル・スレッド・マイクロプロセッサの背景で説明されている。
【０１２９】
図１８に示されている方法８００は、一実施形態では、プロセッサ３０のバス・インタフェース・ユニット３２に組み込まれているクロック制御ロジック３５で実行できる。代替実施形態では、クロック制御ロジック３５は、もちろん、プロセッサ３０と別のところに配置できる。図１９Ａおよび１９Ｂは、それぞれ、クロック制御ロジック例３５に関する詳細を示すブロック図および概略図である。
【０１３０】
まず図１９Ａを見ると、クロック制御ロジック３５が３つの一次入力、つまり（１）アクティブなスレッド・ステート・マシン１７４を介して出力されるアクティブ・ビット８２０（たとえば、Ｔ０＿ＡＣＴＩＶＥおよびＴ１＿ＡＣＴＩＶＥ）、（２）イベント検出器１８８によって出力されるイベント検出信号２１１、および（３）バス上のスヌープ可能アクセスを検出し、信号８８２をアサートするバス・インタフェース・ユニット３２によって出力されるスヌープ制御信号８２２を受け取るように示されている。クロック制御ロジック３５は、これらの入力を使用して、停止クロック信号８２６を発生し、この信号により、プロセッサ３０内のいくつかの機能ユニットのクロック動作を抑制または禁止する。
【０１３１】
図１９Ｂは、入力２１１、８２０、および８２２を利用して、クロック停止信号８２６を出力する例示的な組合せロジックを示す概略図である。特に、イベント検出器信号２１１が入力をＯＲゲート８２２に送り、これにより、入力をさらにＯＲゲート８２４に送る。アクティブ・ビット８２０およびスヌープ制御信号８２２は、ＮＯＲゲート８２４への入力となり、これらの入力のＯＲをとって、クロック停止信号８２６を出力する。
【０１３２】
特に図１８を参照すると、方法８００は、決定ボックス８０２から開始し、スレッド（たとえば、第１と第２のスレッド）がマルチスレッド・プロセッサ３０内でアクティブかどうかを判別する。この判別は、図１９Ｂでアクティブ・ビット８２０をＯＲゲート８２４に出力することにより反映される。例示的な実施形態では判別が２つのスレッドに関して満たされることを示しているが、この判別は、マルチスレッド・プロセッサ内でサポートされている任意の数のスレッドに関して行えることは容易に理解されるであろう。
【０１３３】
決定ボックス８０２での否定的な決定に続いて、方法８００は決定ボックス８０４に進み、そこで、禁止されていないイベントがマルチスレッド・プロセッサ内でサポートされている任意のスレッドについて保留されているかどうかを判別する。再び、例示的な実施形態では、これは、イベントが第１または第２のスレッドに対し保留になっているかどうかの判別を含む。この判別は、図１９Ｂに示されているように、イベント検出信号２１１をＯＲゲート８２２に入力することにより表される。
【０１３４】
決定ボックス８０４での否定的な決定に続いて、スヌープ（たとえば、バス・スヌープ、ＳＮＣスヌープ、またはその他のスヌープ）がプロセッサ・バスで処理されているかどうかの判別を決定ボックス８０６で行う。本発明の例示的な実施形態では、この判定は、スヌープ制御信号８２２をＯＲゲート８２４に入力することで実行される。
【０１３５】
決定ボックス８０６の否定的な決定に続いて、方法８００はブロック８０８に進み、そこで、選択された機能ユニットへの内部クロック信号が停止または抑制される。特に、バス保留ロジックおよびバス・アクセス・ロジックへのクロック信号は、サスペンドまたは停止されないが、それは、バス・インタフェース・ユニット３２でシステム・バス上で発せられるＢＲＥＡＫイベントまたはスヌープ（たとえば、ピン・イベント）を検出し、このようなＢＲＥＡＫイベントに応答して機能ユニットへのクロック供給を再開するからである。機能ユニットへの内部クロック信号の抑制は、クロック停止信号８２６のアサートにより実行され、所定の機能ユニットへのクロック信号のゲート動作が行われる。
【０１３６】
ブロック８０８の完了後、方法８００は決定ボックス８０２にループ・バックする。決定ボックス８０２での判別の後、８０４および８０６は、引き続きループすることができる。
【０１３７】
決定ボックス８０２、８０４、および８０６のいずれか１つで肯定的な決定を行った後、方法８００はブロック８１０に分岐し、そこで、いくつかの機能ユニットへのクロック信号がゲートされた場合に、これらの内部クロック信号が再びアクティブにされる。それとは別に、クロック信号がすでにアクティブであれば、これらのクロック信号がアクティブ状態に保持される。
【０１３８】
ブロック８１０がブレーク・イベントに応答して実行される場合（たとえば、決定ボックス８０４の肯定的決定の後）、ヌーク信号のアサート時に、アクティブ・スレッドの個数に基づいて、上述の方法によりマイクロプロセッサ内の機能ユニットをアクティブに分割することができる。たとえば、２つまたはそれ以上のスレッドを持つマルチスレッド・プロセッサ３０では、これらのスレッドのうちいくつかをインアクティブにできるが、その場合、機能ユニットはインアクティブ・スレッドに対応できるように分割されない。
【０１３９】
ブロック８１０で完了した後、方法８００は、再び、決定ボックス８０２にループ・バックし、決定ボックス８０２、８０４、および８０６で表される決定をさらに繰り返す動作を開始する。
【０１４０】
こうして、マルチスレッド・プロセッサ内の複数のスレッドに入り、出る方法と装置について説明した。本発明は、特定の例示的な実施形態を参照しながら説明したが、本発明の広い範囲と精神を逸脱することなく、これらの実施形態に各種の修正および変更を加えられることは明白であろう。したがって、明細書および図面は、制限のためではなく、説明するために用意されていると見なすべきである。
【図面の簡単な説明】
【図１】  マルチスレッド・サポートのあるプロセッサのパイプラインの一実施形態を示すブロック図である。
【図２】  汎用マルチスレッド・マイクロプロセッサの形式のプロセッサの例示的な実施形態を示すブロック図である。
【図３】  例示的なマルチスレッド・プロセッサの選択したコンポーネントを示すブロック図であり、特に、複数のスレッドに対応するように論理パーティションが設定されているバッファリング（または記憶領域）機能を提供するさまざまな機能ユニットを示す図である。
【図４】  一実施形態による順序の狂っているクラスタを示すブロック図である。
【図５】  レジスタ・エイリアス・テーブルおよびレジスタ・ファイルの図式表現であり、一実施形態内で使用される。
【図６Ａ】  一実施形態による、マルチスレッド・プロセッサ内の複数のスレッドを処理するように論理パーティションが設定されているリオーダ・バッファに関する詳細を示すブロック図である。
【図６Ｂ】  一実施形態による保留イベント・レジスタとイベント禁止レジスタの図式表現である。
【図７Ａ】  マルチスレッド・プロセッサ内のイベントを処理する一実施形態による方法を示す流れ図である。
【図７Ｂ】  マルチスレッド・プロセッサ内の「仮想ヌーク」イベントを処理する一実施形態による方法を示す流れ図である。
【図８】  マルチスレッド・プロセッサ内に実装された、一実施形態による、イベント検出装置により検出できる多数の例示的なイベントの図式表現である。
【図９および図１０】  図６Ａに示されているような、例示的なリオーダ・バッファ内のリオーダ・テーブルの例示的な内容を示すそれぞれのブロック図である。
【図１１Ａ】  少なくとも第１と第２のスレッドをサポートするマルチスレッド・プロセッサ内でクリア（またはヌーク）動作を実行する例示的な実施形態による方法を示す流れ図である。
【図１１Ｂ】  アクティブなスレッド・ステート・マシンの出力に応じて機能ユニットを構成するように動作する例示的な一実施形態による構成ロジックを示すブロック図である。
【図１２】  一実施形態による、ヌーク信号のアサートを示すタイミング図である。
【図１３】  マルチスレッド・プロセッサ内のイベント・ハンドラへの排他的アクセスを可能にする一実施形態による方法を示す流れ図である。
【図１４】  マルチスレッド・プロセッサ内に実装された排他的アクセス・ステート・マシンの一実施形態による動作を示す状態図である。
【図１５】  マルチスレッド・プロセッサ内に実装されたアクティブ・スレッド・ステート・マシンによって占有される一実施形態による状態を示す状態図である。
【図１６Ａ】  マルチスレッド・プロセッサ内のアクティブ・スレッドのスリープ・イベントが検出された後アクティブ・スレッドを抜ける一実施形態による方法を示す流れ図である。
【図１６Ｂ】  一実施形態により、状態の格納およびスレッドを抜けた後のレジスタの解放を表す図式表現である。
【図１７】  インアクティブ・スレッド内のブレーク・イベントが検出された後インアクティブ状態からアクティブ状態までスレッドが遷移する一実施形態による方法を示す流れ図である。
【図１８】  マルチスレッド・プロセッサ内の少なくとも１つの機能ユニットに合わせてクロック信号の有効化および無効化を管理する一実施形態による方法を示す流れ図である。
【図１９Ａ】  マルチスレッド・プロセッサ内のクロック信号を有効化および無効化する一実施形態によるクロック制御ロジックを示すブロック図である。
【図１９Ｂ】  図１９Ａに示されているクロック制御ロジックの一実施形態を示す概略図である。
【図１】
0004642305.tif 000002
【図２】
0004642305.tif 000003
【図３】
0004642305.tif 000004
【図４】
0004642305.tif 000005
【図５】
0004642305.tif 000006
【図６Ａ】
0004642305.tif 000007
【図６Ｂ】
0004642305.tif 000008
【図７Ａ】
0004642305.tif 000009
【図７Ｂ】
0004642305.tif 000010
【図８】
0004642305.tif 000011
【図９】
0004642305.tif 000012
【図１０】
0004642305.tif 000013
【図１１Ａ】
0004642305.tif 000014
【図１１Ｂ】
0004642305.tif 000015
【図１２】
0004642305.tif 000016
【図１３】
0004642305.tif 000017
【図１４】
0004642305.tif 000018
【図１５】
0004642305.tif 000019
【図１６Ａ】
0004642305.tif 000020
【図１６Ｂ】
0004642305.tif 000021
【図１７】
0004642305.tif 000022
【図１８】
0004642305.tif 000023
【図１９Ａ】
0004642305.tif 000024
【図１９Ｂ】
0004642305.tif 000025