ここで図1を参照すると、本発明によるパイプライン化されたマルチスレッディングマイクロプロセッサ100を示すブロック図が表されている。マイクロプロセッサ100は複数のスレッドを同時に実行するように構成されている。本明細書で実行スレッドまたは命令ストリームとも呼ばれるスレッドは、プログラム命令のシーケンスまたはストリームを含む。スレッドは、マイクロプロセッサ100で実行する異なるプログラムからか、またはマイクロプロセッサ100で実行する同一のプログラムの異なる部分からの命令ストリームであるか、またはそれらの組合せであってもよい。
各スレッドは関連したスレッドコンテキスト(TC)を有する。スレッドコンテキストはレジスタまたはラッチ、および/またはスレッドの実行状態を説明するマイクロプロセッサ100のストレージ要素の中のビットなどのストレージ要素の集合を含む。すなわちスレッドコンテキストは、マイクロプロセッサ100で同時に実行する別の実行スレッドと共有される状態ではなく、スレッドに固有の各々のスレッドの状態を説明する。スレッドコンテキストの中の各スレッドの状態をストアすることによって、マイクロプロセッサ100は、命令をフェッチして発行するためにスレッド間で迅速に切り替えを行うように構成されている。1つの実施形態で、各スレッドコンテキストは、マイクロプロセッサ100のレジスタファイル112に含まれているプログラムカウンタ(PC)と汎用レジスタセットとスレッド制御レジスタとを含む。
マイクロプロセッサ100は、様々なスレッドの命令のフェッチおよび発行を命じるスケジューリングポリシーによってスレッドを同時に実行する。本明細書では、複数のスレッドからの命令ディスパッチをスケジューリングするための様々な実施形態が説明される。命令の「発行」および「ディスパッチ」という用語は、本明細書では交換可能に使用される。マルチスレッド型マイクロプロセッサ100は、同時に行われる方法で、複数のスレッドがマイクロプロセッサ100の機能ユニット(例えば命令のフェッチおよびデコードユニット、キャッシュ、分岐予測ユニット、およびロード/ストア、整数、浮動小数点、SIMD等の実行ユニットならびにその他の実行ユニット)を共有することを可能にする。
マイクロプロセッサ100は、マイクロプロセッサ100を含むシステムのシステムメモリからフェッチされたプログラム命令、特に様々なスレッドの命令をキャッシュするための命令キャッシュ102を含む。マイクロプロセッサ100はまた、命令フェッチャ104か、あるいは命令キャッシュ102および/またはシステムメモリから複数のスレッドの命令を、命令フェッチャ104に結合された命令/スキッドバッファ106に同時にフェッチするために結合された命令フェッチパイプライン104も含む。1つの実施形態で、命令フェッチパイプライン104は4段階のパイプラインを含む。命令/スキッドバッファ106は、命令スケジューラ108またはスレッドスケジューラ108に命令を与える。1つの実施形態で、各スレッドはそれ自体の命令/スキッドバッファ106を有する。各クロックサイクルで、スケジューラ108はマイクロプロセッサ100のパイプラインの実行段階による実行のために、スレッドのうちの1つから命令を選択し、命令を発行する。レジスタファイル112はスケジューラ108に結合されており、命令を実行する実行ユニット114に命令オペランドを与える。マイクロプロセッサ100は、実行ユニット114に結合されたデータキャッシュ118も含む。実行ユニット114は整数実行ユニット、浮動小数点実行ユニット、SIMD実行ユニット、ロード/ストアユニットおよび分岐実行ユニットを含んでもよいが、それらに限定されるわけではない。1つの実施形態で、整数実行ユニットのパイプラインは、レジスタファイル112がアクセスされるレジスタファイル(RF)アクセス段階、アドレス生成(AG)段階、実行(EX)段階およびメモリセコンド(MS)段階の4つの段階を含む。EX段階では、(加算、引算、桁移動等の)単純なALU動作が実行される。さらにデータキャッシュ118は、EX段階の第1クロックサイクルの間にアクセスされ、MS段階の第2クロックサイクルの間にアクセスされる2サイクルのキャッシュである。各スレッドコンテキストはそれ自体のレジスタファイル112を含み、各レジスタファイルはそれ自体のプログラムカウンタと汎用レジスタセットとスレッド制御レジスタとを含む。命令フェッチャ104は、各スレッドコンテキストのプログラムカウンタの値に基づいて、スレッドの命令をフェッチする。実行ユニット114の一部は、かなり大規模にパイプライン化されてもよいことに留意されたい。マイクロプロセッサ100のパイプラインは、命令の結果をレジスタファイル112にライトバックするライトバック段階116も含む。1つの実施形態で、マイクロプロセッサ100のパイプラインはまた、実行ユニット114とライトバック段階116との間で結合された除外項目分解(exception resolution)段階も含む。
実行ユニット114は、実行のために特定のスレッドの命令がコミットされたことを示すために、各スレッドコンテキストに関連したTC_instr_Committed信号124を生成する。命令がマイクロプロセッサ100のパイプラインによってフラッシュされておらず、代わりに最終的に命令を完了することが保証されている場合、実行のために命令はコミットされており、このことが結果を生成し、マイクロプロセッサ100のアーキテクチャ状態を更新する。1つの実施形態で、複数の命令はクロックサイクル毎にコミットされてもよく、TC_instr_Committed信号124は、サイクルを計測するスレッドコンテキストのためにコミットされた命令の数を示す。TC_instr_Committed信号124はスケジューラ108に与えられる。TC_instr_Committed信号124に応答して、スケジューラ108は、図9および図10に関して以下で説明されるように、必要とされるサービス品質を達成するために、スケジューラ108のスレッドスケジューリングポリシーによって使用されるスレッドのための仮想水位指標を更新する。
TC_instr_Committed信号124はまた、各々の命令/スキッドバッファ106にも与えられる。TC_instr_Committed信号124に応答して、命令/スキッドバッファ106は、バッファ106から命令を効果的に取り除くためにポインタを更新する。従来のマイクロプロセッサでは、命令は従来の命令バッファから取り除かれ、実行のために発行される。しかしながら、本明細書で説明される命令/スキッドバッファ106は、好都合にも、命令が実行のために発行された後も命令をストアし続ける。図3および4に関して以下で詳細に説明されるように、実行ユニット114が各々のTC_instr_Committed信号124を介して命令が実行のためにコミットされたことを示すまで、命令は命令/スキッドバッファ106から取り除かれることはない。
スケジューラ108は、実行ユニット114にラン可能TC信号132を与える。ラン可能TC信号132はスレッドコンテキストのうちのどれがラン可能であるか、すなわちスケジューラ108が現在命令を発行してもよいのはどのスレッドコンテキストからなのかを特定する。1つの実施形態で、図7に関して以下で説明されるように、スレッドコンテキストがアクティブであり、(例えば停止、待機、一時停止または放棄などの)その他の状態によってブロックされていなければ、スレッドコンテキストはラン可能である。特に図5に関して以下で詳細に説明されるように、ストールされたスレッドコンテキストの命令をフラッシュするかどうかを決めるために、実行ユニット114はラン可能TC信号132を使用して、ストールされたスレッドコンテキストが唯一のラン可能なスレッドコンテキストであるかどうかを判定する。
実行ユニット114は、スケジューラ108にストール中イベント信号126を与える。ストール中イベント信号126は、特定のストール中イベント信号126によって特定された理由のために、実行ユニット114の中で命令がストールしたか、またはストールしてしまうことを示す。さらに、ストール中イベント信号126はストールされた命令のスレッドコンテキストを識別する識別子を含む。実行ユニット114はまた、スケジューラ108に非ストール中イベント信号128を与える。ストール中イベント信号126に応答して、スケジューラ108は、図5に関して以下でより詳細に説明されるように、適切な非ストール中イベント128が送られるまで、ストールされたスレッドコンテキストのために命令を発行することを停止する。
命令に応答して実行ユニット114をストールさせるイベントの例は以下のものを含むが、それらに限定されるわけではない。第1に、データキャッシュ118の中でミスしたロード命令からのデータなどの利用不可能なデータに、命令が依存している場合がある。例えば、データキャッシュ118の中でミスされた先行するロード命令とオペランドとは、システムメモリからまだフェッチされていないので、加算命令は利用不可能なオペランドを特定する場合がある。第2に、割算もしくはその他の長い演算命令、または例えばコプロセッサレジスタから値を動かす命令などの長期ラン命令からのデータに、命令が依存している場合がある。第3に、制限されたハードウェア資源のために、命令はコンフリクトを持ち込む場合がある。例えば1つの実施形態で、マイクロプロセッサ100は単一のデバイダ回路を含む。割算命令がデバイダによって既に実行されている場合、そのとき第2の割算命令は、第1の割算命令が完了するのを待ちながらストールしなければならない。別の例として、1つの実施形態でマイクロプロセッサ100の命令セットは、命令キャッシュ102の低レベルの管理動作を実行するための命令のグループを含む。命令キャッシュ管理命令が既に実行されている場合、そのとき第2の命令キャッシュ管理命令は、第1のものが完了するのを待ちながらストールしなければならない。別の例として、1つの実施形態で、マイクロプロセッサ100は進行中のデータキャッシュ118のリフィルをストアするための比較的少数のスロットを含むロードキューを含む。ロード命令がデータキャッシュ118の中でミスする場合、紛失しているデータをシステムメモリから得るために、ロードキューエントリが割り当てられ、プロセッサバストランザクションが開始される。データはバスに戻される場合、ロードキューにストアされ、その後データキャッシュ118に書き込まれる。バストランザクションが完了し、すべてのデータがデータキャッシュ118に書き込まれると、ロードキューエントリは解放される。しかしながら、ロードキューが満杯の場合、ロードミスがパイプラインストールを生じさせる。第4に、命令はEHB命令に従う場合がある。1つの実施形態で、マイクロプロセッサ100の命令セットは、すべての実行ハザードがクリアされるまで命令の実行を停止するためにソフトウェアによって使用されるEHB(実行ハザードバリア)命令を含む。典型的に、EHB命令に従う命令は、EHB命令が使われなくなるまでパイプラインの中でストールする。第5に命令は、その同一のスレッドコンテキストの中でスレッド間通信(ITC)スペースにアドレスしたロードまたはストア命令に従う場合がある。1つの実施形態で、マイクロプロセッサ100は、ITCロードまたはストアに従う同一のスレッドコンテキスト内の命令をストールさせる任意の長い時間ブロックすることができる、同期されたストレージを含むITCスペースへのロードおよびストアを支援する。
反対に、非ストール中イベント128の例は、データキャッシュ118の中でミスされたロードデータが戻される場合、デバイダ回路、命令キャッシュ102またはロードキュースロットなどの制限されたハードウェア資源が解放される場合、EHB命令、長期ラン命令、またはスレッド間通信(ITC)スペースに対するロード/ストア命令が完了する場合を含むが、これらに限定されるわけではない。
実行ユニット114はまた、パイプラインの実行部分(すなわちスケジューラ108の下のパイプライン部分)の中の特定されたスレッドの命令がフラッシュされているか、または無効にされていることを示すために、各スレッドコンテキストに関連したTC_flush信号122を生成する。1つの実施形態で、命令をフラッシュすること、または無効にすることは、パイプラインの中の命令に関連した有効ビットをクリアすることを含み、これは、命令の結果に応答してパイプラインがマイクロプロセッサ100のアーキテクチャ状態を更新することを回避する。実行ユニット114がTC_flush信号122を生成してもよい1つの理由は、上述のように、スレッドの命令が実行ユニット114の中でストールする場合である。命令を無効にすること、またはフラッシュすることは、命令のために生成された結果が無視されることになり、したがって正しいものである必要がないので、命令がストールされる理由を取り除く。以下でより詳細に説明されるように、好都合にも、ストール中の命令をフラッシュすることによって、別のスレッドの命令は実行パイプラインの実行帯域幅を実行し、利用し続けることが可能であり、それによってマイクロプロセッサ100の全体の性能を潜在的に高める。1つの実施形態で、ストール中スレッドの命令だけがフラッシュされ、このことがフラッシュによって持ち込まれるパイプラインバブルの数を都合よく減らすことができ、一部の場合では、実行ユニット114のパイプラインの中に存在する様々なスレッドからの命令の構成に応じて、ストール中の命令に関連した1つだけのバブルを生じさせることができる。1つの実施形態で、TC_flush信号122の信号は、スレッドコンテキストのすべてのコミットされていない命令がフラッシュされたことを示す。別の実施形態で、実行ユニット114は実行ユニット114の中に存在するコミットされていない命令の数よりも少数のもの、すなわちストール中の命令およびストール中のスレッドコンテキストの任意のより新しい命令をフラッシュすることができるが、ストール中の命令よりも古いスレッドコンテキストのコミットされていない命令をフラッシュすることはできない。この実施形態で、TC_flush信号122の信号はまた、実行ユニット114によってフラッシュされた命令の数も示す。
TC_flush信号122は、実行ユニット114によって、それらの各々の命令/スキッドバッファ106に与えられる。命令/スキッドバッファ106は、図3および4に関して以下で説明されるように、バッファ106の中の命令の状態をロールバックするためにTC_flush信号122を使用する。命令/スキッドバッファ106は、それらがフラッシュされずにコミットされるまで、命令をストアし続けるので、フラッシュされる任意の命令はその後、命令キャッシュ102から再フェッチされることを必要とせずに、命令スキッド/バッファ106から再発行されてもよい。これには、別のスレッドからの命令が実行されることを可能にする、実行パイプラインからのフラッシュ中のストール命令に関連したペナルティを潜在的に減らすという利点がある。命令を再フェッチしなければならない可能性を減らすことは、命令のフェッチの回数が増加しているように思われることから、ますます重要になっている。これは、とりわけ、主としてプロセッサのクロック期間の減少のせいで、命令キャッシュが旧型のマイクロプロセッサの設計のときと比べて、より多くのクロックサイクルをアクセスのために必要とすることがより一般的になっているためである。したがって、命令の再フェッチに関連したペナルティは、以前の設計のときと比べて1つ、2つ、またはそれ以上のクロックサイクルとなる場合がある。
ここで図2を参照すると、図1のマイクロプロセッサ100の部分を示すブロック図であり、特に本発明の1つの実施形態による命令/スキッドバッファ106が示されている。図2は、図1の命令フェッチャ104が命令をフェッチする、複数の各々のスレッドコンテキストのための複数の命令/スキッドバッファ106を示す。1つの実施形態による命令/スキッドバッファ106の構造および動作は、図3および4に関して以下でより詳細に示される。各命令/スキッドバッファ106は、命令206を命令選択ロジック202に与える。各クロックサイクルで、命令選択ロジック202は、実行されるべき実行ユニット114への供給のために、命令206のうちの1つを選択命令204として選択する。命令選択ロジック202は、各スレッドコンテキストのために、図1のスケジューラ108によって与えられるDS_TC_priority信号208に応答して、選択命令204を選択する。DS_TC_priority信号208の動作は、図7および8に関して以下でより詳細に説明される。
マイクロプロセッサ100が、実行のためにクロックサイクル毎に1つの命令だけを発行するスカラプロセッサである実施形態が説明されているが、命令選択ロジック202は、クロックサイクル毎に複数の命令を発行するスーパースカラプロセッサ内で動作するように構成されてもよい。さらに命令選択ロジック202は、一般に同時マルチスレッディングと呼ばれる、クロックサイクル毎の複数の異なるスレッドコンテキストからの発行のために、命令を選択するように構成されてもよい。
ここで図3を参照すると、本発明による図2の命令/スキッドバッファ106のうちの1つを例示する命令/スキッドバッファ106と、関連した制御ロジック302とを示すブロック図が表されている。図2の命令/スキッドバッファ106の各々は、図3に表されている命令/スキッドバッファ106に類似している。すなわち、図3には1つだけの命令/スキッドバッファ106と関連した制御ロジック302とが表されているが、1つの実施形態では、各スレッドコンテキストのために1つの命令/スキッドバッファ106と関連した制御ロジック302とが存在する。命令/スキッドバッファ106は、各々が命令をストアするための複数のエントリ332と、関連した命令が有効であるかどうかを示すための関連した有効ビット334とを含む。図3は、0から5で示された6つのエントリを備えた命令/スキッドバッファ106を示す。図3の1つの実施形態で、命令/スキッドバッファ106はエントリの循環キューとして構成されている。
図1の命令フェッチャ104は、命令を命令/スキッドバッファ106に書き込む度に、命令/スキッドバッファ106に対して書き込み信号314を生成する。書き込み信号314はまた、制御ロジック302に与えられる。制御ロジック302は、命令/スキッドバッファ106が満杯になっているので、命令フェッチャ104は命令/スキッドバッファ106が満杯ではなくなるまで、命令/スキッドバッファ106にそれ以上命令を書き込まないことを示すために、命令フェッチャ104に対してフル信号312を生成する。
図1のスケジューラ108は、命令/スキッドバッファ106から命令を読み取る度に、読み取り信号316を生成する。読み取り信号316はまた、制御ロジック302に与えられる。制御ロジック302は、命令/スキッドバッファ106が空であるので、スケジューラ108は命令/スキッドバッファ106が空でなくなるまで、命令/スキッドバッファ106から別の命令を読み取ることを試みないことを示すために、スケジューラ108に対して空信号318を生成する。
制御ロジック302は、命令/スキッドバッファ106の有効ビット334を更新する有効生成ロジック342を含む。有効生成ロジック342は、各々のスレッドコンテキストのために、図1のTC_instr_committed信号124を受け取る。実行ユニット114がTC_instr_committed信号124を生成する度に、有効生成ロジック342は命令/スキッドバッファ106の中の最も古い有効命令を無効にする。有効生成ロジック342はまた、命令フェッチャ104から書き込み信号314を受け取る。命令フェッチャ104が書き込み信号314を生成する度に、有効生成ロジック342は、命令が書き込まれる命令/スキッドバッファ106の中でエントリに有効の印を付ける。
制御ロジック302はまた、命令/スキッドバッファ106の中に存在する有効な命令の数をストアするfull_countカウンタ306も含む。full_countカウンタ306は、命令フェッチャ104からの書き込み信号314によって増分され、TC_instr_committed信号124によって減分される。制御ロジック302はまた、full_count306が命令/スキッドバッファ106の命令の最大数に等しい場合に、フル信号312での真の値を生成するために、full_count306を命令/スキッドバッファ106の中にストアされてもよい命令の最大数(すなわち命令/スキッドバッファ106の中のエントリ332の総数)と比較するコンパレータ304も含む。
制御ロジック302はまた、現時点で発行するのに好適な、命令/スキッドバッファ106の中に存在する有効命令の数をストアするempty_countカウンタ346も含む。empty_count346は、(まだコミットされてはいないが)既に実行パイプラインに発行されおり、したがって現時点では発行するのに好適ではない、いくつかの有効命令が命令/スキッドバッファ106の中に存在してもよいので、full_count306よりも特定の回数少なくてよい。empty_countカウンタ346は命令フェッチャ104からの書き込み信号314によって増分され、スケジューラ108からの読み取り信号316によって減分される。制御ロジック302はまた、empty_count346がゼロに等しい場合に、空信号318での真の値を生成するために、empty_count346をゼロと比較するコンパレータ344も含む。さらに、empty_countカウンタ346は、図1のTC_flush信号122での真の値に応答して、full_countカウンタ306の値で書き込まれる。
制御ロジック302はまた、各々が命令/スキッドバッファ106のエントリ0で初期化されるカウンタである、書き込みポインタ322とコミットポインタ324と読み取りポインタ326とを含む。カウンタの各々は、命令/スキッドバッファ106の中のエントリ数よりも少ない最大値を超えて増分される場合、ゼロに戻る。書き込みポインタ322は、命令フェッチャ104が命令を書き込む命令/スキッドバッファ106の中の次のエントリを特定し、命令が書き込まれた後、書き込み信号314によって増分される。コミットポインタ324は、コミットされるべき命令/スキッドバッファ106の中の次の命令を特定し、TC_instr_committed信号124によって増分される。読み取りポインタ326は、スケジューラ108が命令を読み取り、命令が読み取られた後、読み取り信号316によって増分される命令/スキッドバッファ106の中の次のエントリを特定する。さらに読み取りポインタ326は、TC_flush信号122の真の値に応答して、コミットポインタ324の値で書き込まれる。図3に表されているように、スキッドウィンドウは、それを含んではいないが、読み取りポインタ326によって示されるエントリまで、コミットポインタ324で開始する命令/スキッドバッファ106のエントリを含む。スキッドウィンドウは、実行のために既に発行されているが、まだコミットされていない有効命令を含む。
ここで図4を参照すると、本発明による図3の命令/スキッドバッファ106の動作を示す4つのフローチャートが表されている。フローチャートの各々は、異なるイベントに応答して命令/スキッドバッファ106によって実行される動作(action)を示す。第1フローチャートのフローは、ブロック402で開始する。
ブロック402で、図1の命令フェッチャ104は、各々の命令/スキッドバッファ106のために図3の書き込み信号314をアサートし、命令を命令/スキッドバッファ106に書き込む。フローはブロック404へ進む。
ブロック404で有効生成ロジック342は、書き込み信号314に応答して、書き込みポインタ322によって特定されたエントリに有効の印を付ける。フローはブロック406へ進む。
ブロック406で、図3の書き込みポインタ322は、書き込み信号314に応答して増分される。フローはブロック408へ進む。
ブロック408で、図3のfull_countカウンタ306は、書き込み信号314に応答して増分される。フローはブロック412へ進む。
ブロック412で、図3のempty_countカウンタ346は、書き込み信号314に応答して増分される。第1フローチャートのフローは、ブロック412で終了する。
第2フローチャートのフローは、ブロック422で開始する。
ブロック422で図1の実行ユニット114は、命令/スキッドバッファ106に関連したスレッドコンテキストのために、図1のTC_instr_Committed信号124をアサートする。フローはブロック424へ進む。
ブロック424で有効生成ロジック342は、TC_instr_committed信号124に応答して、コミットポインタ324によって特定されたエントリに無効の印を付け、それによってバッファから命令を効果的に取り除く。フローはブロック426へ進む。
ブロック426で、コミットポインタ324はTC_instr_committed信号124に応答して増分される。フローはブロック428へ進む。
ブロック428で、full_countカウンタ306はTC_instr_committed信号124に応答して減分される。第2フローチャートのフローは、ブロック428で終了する。
1つの実施形態で、制御ロジック302は、TC_instr_committed信号124を受信するのではなく、命令が再ディスパッチングを必要としないことをまだ保証されていない場合であっても、命令が命令/スキッドバッファ106から取り除かれるべきであることを単に示す実行ユニット114からの別の信号を受信する。1つの実施形態で、信号は命令が所定の再ディスパッチパイプライン段階に達したことを示す。制御ロジック302は、命令が所定の段階に達したことを検出する場合、命令/スキッドバッファ106から命令を取り除く。別の実施形態で、信号は各クロックサイクルで、命令がランしていた、すなわちストールしておらず、その代わりに次のパイプライン段階に進んだのかどうかを示す。制御ロジック302は、命令が所定のクロックサイクルの数ランしていたことを検出する場合、制御ロジック302は命令/スキッドバッファ106からその命令を取り除く。これらの実施形態では、命令が一旦実行パイプライン114の中の特定の段階に達してから再ディスパッチングを必要とする可能性は、たとえ命令が再ディスパッチングを必要としないことをまだ保証されていなくても、命令/スキッドバッファ106に別の命令が書き込まれるための場所を作るために、命令を命令/スキッドバッファ106から取り除くことを正当化するのに十分に低いものである。この実施形態で、実行ユニット114がその後、命令が実行の完了前にフラッシュされたことを示す場合、スレッド命令が正しい順序で発行されることを保証するために、命令フェッチパイプライン104の全体とともに、スレッドコンテキストのための命令/スキッドバッファ106の全体がフラッシュされなければならない。
第3フローチャートのフローはブロック442で開始する。
ブロック442で、図1のスケジューラ108は、各々の命令/スキッドバッファ106のために図3の読み取り信号316をアサートし、実行パイプラインに発行するために命令/スキッドバッファ106から命令を読み取る。フローはブロック444へ進む。
ブロック444で、図3の読み取りポインタ326は読み取り信号316に応答して増分される。フローはブロック446へ進む。
ブロック446で、empty_countカウンタ346は読み取り信号316に応答して減分される。第3フローチャートのフローはブロック446で終了する。
第4フローチャートのフローはブロック462で開始する。
ブロック462で、命令/スキッドバッファ106に関連したスレッドコンテキストのために、TC_flush信号122をアサートする。フローはブロック464へ進む。
ブロック464で、読み取りポインタ326はTC_flush信号122に応答して、コミットポインタ324とともにロードされる。フローはブロック466へ進む。
ブロック466で、empty_countカウンタ346はTC_flush信号122に応答して、full_count306とともにロードされる。第4フローチャートのフローはブロック466で終了する。
前述のように、1つの実施形態で、TC_flush信号122の信号は、実行ユニット114がスレッドコンテキストのすべてのコミットされていない命令をフラッシュしたことを示す。図4の第4フローチャートは、この実施形態のための命令/スキッドバッファ106の動作を説明している。しかしながら別の実施形態では、実行ユニット114は実行ユニット114の中に存在するコミットされていない命令の数よりも少数のもの、すなわちストール中の命令およびストール中のスレッドコンテキストの任意の新たな命令をフラッシュすることができるが、ストール中の命令よりも古いスレッドコンテキストのコミットされていない命令をフラッシュすることはできない。この実施形態で、TC_flush信号122の信号はまた、実行ユニット114によってフラッシュされた命令の数も示す。この実施形態ではブロック464で、読み取りポインタ326をコミットポインタ324とともに更新するのではなく、フラッシュされた命令の数は読み取りポインタ326から差し引かれる。さらにブロック466で、empty_count346をfull_countカウンタ306とともに更新するのではなく、フラッシュされた命令の数はempty_count346に付加される。
ここで図5を参照すると、本発明による、実行帯域幅の利用を向上させるためにストールされたスレッドコンテキストをフラッシュするための図1のマイクロプロセッサ100の動作を示すフローチャートが表されている。フローはブロック502で開始する。
ブロック502で、図1の実行ユニット114は、命令すなわちストール中の命令に応答して、図1のストール中イベント信号126に関して先に説明されたもののうちの1つなどのストール中イベントを検出する。実行ユニット114はまた、ストール中命令が関連しているのはどのスレッドコンテキストなのかを、すなわちどれがストール中スレッドコンテキストなのかを判定する。1つの実施形態で、各命令には、パイプラインを進むときに実行ユニット114がストール中スレッドコンテキストを識別するために使用する固有のスレッドコンテキスト識別子が付随する。1つの実施形態で、実行ユニット114はストール中イベント126に応答して命令をストールすることはせず、代わりにストール中イベント126が検出される同じクロックサイクルのブロック512によって命令をフラッシュし、それによって実行ユニット114をストールする必要性を軽減する。別の実施形態で、タイミング考慮事項によって必要とされる場合、実行ユニット114は以下のブロック512によってストールされた命令がフラッシュされることができるまで、ストール中イベント126に応答して実際に1クロックサイクルの間ストールしてもよい。フローはブロック504へ進む。
判定ブロック504で、実行ユニット114は図1のラン可能TC信号132を調べることによって、ストール中スレッドコンテキストが唯一のラン可能スレッドコンテキストであるのかどうかを判定する。ストール中スレッドコンテキストが唯一のラン可能スレッドコンテキストである場合、フローはブロック526へ進み、そうでなければブロック506へ進む。
ブロック506で、実行ユニット114はストール中イベント信号126を介してストール中イベントを送り、またストール中スレッドコンテキストの識別子を提供する。フローはブロック508へ進む。
ブロック508で、スケジューラ108はストールされたストール中スレッドコンテキストに印を付け、そのスレッドコンテキストのために命令を発行することを停止し、ストール中イベントの原因に関する状態を保存する。図7の実施形態で、発行可能命令ロジック708は、ストール指標704をストールされたスレッドコンテキストに印を付けるための真の値に設定し、それによって発行可能命令ロジック708は、発行可能な746信号で偽の値を生成する。フローはブロック512へ進む。
ブロック512で、実行ユニット114は実行ユニット114の中のストール中スレッドコンテキストのすべての命令を無効化、すなわちフラッシュし、ストール中スレッドコンテキスト、すなわちフラッシュされたスレッドコンテキストに関連する図1のTC_flush信号122で真の値を生成する。実行ユニット114はストール中命令およびその後の命令だけをフラッシュするが、ストール中命令に先行する命令をフラッシュすることはなく、そうしなければストール中の状態は決して終わることはないということを理解されたい。1つの実施形態で、実行ユニット114は、ストール中スレッドコンテキストだけではなく、すべてのスレッドコンテキストの命令をフラッシュする。しかしながら、ストール中スレッドコンテキストだけをフラッシュする実施形態には、別のスレッドコンテキストの命令が実行のために実行ユニット114の中にまだ残っていてもよいために、持ち込まれるパイプラインバブルは潜在的により少なくなり、それによってマイクロプロセッサ100は潜在的に、すべてのスレッドコンテキストをフラッシュする実施形態よりも、より効率的になるという利点がある。フローはブロック514へ進む。
ブロック514で、図1の命令/スキッドバッファ106は、図3および4、または図13および14、または図15に関して説明されるように、TC_flush信号122に応答してフラッシュされた命令をロールバックする。フローはブロック516へ進む。
ブロック516で、スケジューラ108はそのスレッドスケジューリングポリシーに従って、ストールされたという印を付けられていないスレッドコンテキストのために命令を発行し続ける。図7の実施形態で、ストール指標704は、命令がストールされているか、ストールされていないのかを示す。さらに実行ユニット114は、ブロック512でのフラッシュの後に実行ユニット114の中にある別のスレッドコンテキストの命令を実行し続け、その後ディスパッチされた命令を実行し続ける。フローは判定ブロック518へ進む。
判定ブロック518で、スケジューラ108はストール中イベントが終了したかどうかを判定する。スケジューラ108は図1の非ストール中イベント信号128を介して非ストール中イベントを送る実行ユニット114に応答して、またさらにブロック508で保存されたストール中イベントの原因に関する状態に基づいて、ストール中スレッドコンテキストのためのストール中イベントが終了したかどうかを判定する。ストール中スレッドコンテキストのためのストール中イベントが終了した場合、フローはブロック522に進み、そうでなければフローはブロック516に戻る。
ブロック522で、スケジューラ108はストール中スレッドコンテキストにストール解除されたと印を付け、別のストールされていないスレッドコンテキストとともに、(もはや)ストール中ではないスレッドコンテキストのための命令を再び発行し始める。図7の実施形態で、発行可能命令ロジック708は、スレッドコンテキストにストール解除されたと印を付けるために、ストール指標704を偽の値に設定する。
ブロック524で、ストール中のスレッドコンテキストが唯一のラン可能なスレッドコンテキストであることから、実行ユニット114は正しいプログラムの実行を保証するために、ストール中命令でストールする。フローは判定ブロック526へ進む。
判定ブロック526で、スケジューラ108はストール中イベントが終了したかどうかを判定する。もし終了していれば、フローはブロック534へ進み、そうでなければフローは判定ブロック528へ進む。
判定ブロック528で、実行ユニット114は図1のラン可能TC信号132を調べることによって、ストールされたスレッドコンテキストが唯一のラン可能スレッドコンテキストであるのかどうかを判定する。ストールされたスレッドコンテキストが唯一のラン可能スレッドコンテキストである場合、フローはブロック526へ進み、そうでなければフローは判定ブロック528へ進む。
判定ブロック528で、実行ユニット114はストール中のスレッドコンテキストが依然として唯一のラン可能スレッドコンテキストであるのかどうかを判定する。ストール中スレッドコンテキストが依然として唯一のラン可能スレッドコンテキストである場合、フローは判定ブロック526へ戻り、そうでなければフローはブロック506へ進む。
ブロック532で、実行ユニット114は、(もはや)ストール中ではない命令およびその他の命令をストール解除し、実行し続ける。ストール中イベントが終了する場合、有利にも、ストールされた命令およびその後の命令は、ブロック512によってそれらがフラッシュされている場合に必要とされる、再発行されることを必要とせずに、直ちに実行を開始してもよい。したがってストール中のスレッドコンテキストが唯一のラン可能なスレッドコンテキストである場合には、それをフラッシュしないことによって、有利にもマイクロプロセッサ100は潜在的に性能を向上させる。フローはブロック532で終了する。
図5からわかるように、別のスレッドの命令が実行ユニット114にディスパッチされ、そこで実行されることを可能にするために、実行ユニット114の中でストール中イベント126を検出し、実行ユニット114から命令をフラッシュすることは、実行パイプラインバブルのために無駄にされるクロックサイクルを回避することによって、有利にも実行ユニット114の使用をより効率的にする。命令がストールする実際の状態に応答して命令をフラッシュすることによって、マイクロプロセッサ100は潜在的により高い性能を達成する。
ここで図6を参照すると、本発明の1つの実施形態による図1のマイクロプロセッサ100の中の分岐されているスケジューラ108を示すブロック図が表されている。分岐型スケジューラ108はディスパッチスケジューラ(DS)602の部分と、ポリシーマネージャ(PM)604の部分とを含む。ディスパッチスケジューラ602の部分はマイクロプロセッサ100のプロセッサコア606内に含まれている一方で、ポリシーマネージャ604部分はプロセッサコア606の外部に含まれている。プロセッサコア606はカスタマによってカスタマイズすることができないマイクロプロセッサ100の部分である一方で、ポリシーマネージャ604はカスタマによってカスタマイズ可能である。1つの実施形態で、プロセッサコア606はソフトコアとも呼ばれる合成可能なコアである。合成可能なコアの設計は、迅速に製造可能な表現に変えられることが可能であり、一般に合成ツールと呼ばれる自動ツールを簡単に使用することが可能である。
プロセッサコア606は、複数の信号を含むポリシーマネージャ604にインタフェース628を与える。1つの実施形態で、コアではないポリシーマネージャ604ロジックが、分岐型スケジューラによって別途持ち込まれるかもしれない特定のタイミング問題を軽減する方法で、プロセッサコア606とインタフェースすることを都合よく可能とするために、ディスパッチスケジューラ602への入力とディスパッチスケジューラ602からの出力信号とが登録される。さらにインタフェース628は、カスタマにとって理解することが簡単であり、ポリシーマネージャ604のスケジューリングポリシーの設計を容易にする。
以下の表2には、1つの実施形態によるポリシーマネージャインタフェース628を含む様々な信号が表されている。表2は信号名、ポリシーマネージャ604に関する信号の方向、および各信号の簡単な説明を明記している。表2は、マイクロプロセッサ100が9つまでの実行スレッドに関連した状態をストアするための9つのスレッドコンテキストを含む実施形態を説明する。さらにこの実施形態は、マイクロプロセッサ100が2つまでの仮想処理要素(VPE)として構成されることを可能にする。1つの実施形態で、マイクロプロセッサ100は実質的にMIPS32またはMIPS64命令セットアーキテクチャ(ISA)に適合しており、実質的にMIPS特権リソースアーキテクチャ(Privileged Resource Architecture)(PRA)およびMIPSマルチスレッディング特定用途向け拡張機能(MT ASE)の中で特定されるコプロセッサ0に適合しているスレッド制御レジスタを含む、表2でCP0とされる制御コプロセッサ0を含む。表2で説明される信号の複数は、CP0レジスタにアクセスするために使用される。
表2に明記されたポリシーマネージャインタフェース628の特定の信号のうちの一部は、ここでより詳細に説明される。ポリシーマネージャ604はディスパッチスケジューラ602に対して、PM_TC_priority652の出力を介して各々のスレッドコンテキストのプライオリティを特定する。1つの実施形態で、PM_TC_priority652は2つのビットを含み、ディスパッチスケジューラ602は、ポリシーマネージャ604がスレッドコンテキストのための4つの異なるプライオリティのうちの1つを特定できるようにする。ポリシーマネージャ604は、各々のPM_TC_block654の出力で真の値を生成することによって、スレッドコンテキストのために命令を発行することを停止するようディスパッチスケジューラ602に命令する。したがって、ポリシーマネージャ604は、以下で、特には以下の図7から11に関してより詳細に説明されるように、PM_TC_priority652およびPM_TC_block654を介して、ディスパッチスケジューラ602が様々なスレッドコンテキストのためにどのように命令を発行するのかに影響を及ぼしてもよい。
図9に関して以下で説明されるように、プロセッサコア606はポリシーマネージャ604にPM_gclk658を与え、これによりポリシーマネージャ604は、PM_gclk658に基づいて周期的にPM_TC_priority652を調整することができる。ディスパッチスケジューラ602は、各々のPM_TC_state642の入力を介して、各スレッドコンテキストのために状態を伝える。表2に表されているように、スレッドコンテキストは以下の8つの状態のうちの1つの中にあってもよい。非アクティブ:スレッドコンテキストが現在実行スレッドに関連していないので、ディスパッチスケジューラ602はスレッドコンテキストの命令を発行しなくてもよい。アクティブ:スレッドコンテキストは現在実行スレッドコンテキストに関連しているので、ディスパッチスケジューラ602は、別のブロック中状態が存在しなければ、実行のためにスレッドコンテキストの命令を発行してもよい。放棄:スレッドは放棄命令を実行しており、これによってスレッドコンテキストは特定のイベントについてブロックされるので、ディスパッチスケジューラ602は実行のためにスレッドコンテキストの命令を発行しなくてもよい。停止:スレッドコンテキストはそれ自体によってか、または別のスレッドによって停止されているので、ディスパッチスケジューラは実行のためにスレッドコンテキストの命令を発行しなくてもよい。一時停止:スレッドがDMTまたはDVPE命令を実行したため、またはマイクロプロセッサ100もしくはVPEが現在除外項目を処理しているため、ディスパッチスケジューラ602は実行のためにスレッドコンテキストの命令を発行しなくてもよい。DMT命令はVPEのためのマルチスレッディング動作を一時停止する。DVPE命令はマイクロプロセッサ100全体のためのマルチスレッディング動作を一時停止する。ITCでの待機:スレッドコンテキストは、スレッドにより実行されるロード/ストア命令によって特定される、スレッド間通信(ITC)スペースの中の位置への/からのロード/ストアデータを待機してブロックされているので、ディスパッチスケジューラ602は実行のためにスレッドコンテキストの命令を発行しなくてもよい。待機による待機:スレッドは待機命令を実行しており、これによってスレッドコンテキストは割り込みが生じるまでブロックされるので、ディスパッチスケジューラ602は実行のためにスレッドコンテキストの命令を発行しなくてもよい。SRSとして使用:スレッドコンテキストレジスタセットがシャドウレジスタセットの動作のために使用されていることから、スレッドコンテキストは実行スレッドに関連しておらず、それに関連することも不可能なので、ディスパッチスケジューラ602はスレッドコンテキストの命令を発行しなくてもよい。
ディスパッチスケジューラ602は、各々のPM_TC_inst_issued646の入力を介して、スレッドコンテキストのために命令を発行したことをポリシーマネージャ604に伝える。実行ユニット114は、各々のPM_TC_instr_committed644の入力を介して、スレッドコンテキストの命令をコミットしたことをポリシーマネージャ604に伝える。1つの実施形態で、PM_TC_instr_committed644信号は、命令の実行が完了されたことを示す。別の実施形態で、PM_TC_instr_committed644信号は、命令がフラッシュされないことを保証されること、すなわち命令が最終的には実行を完了するが、まだ完了されていなくてもよいことを示す。顕著な点は、一部の命令が推測でディスパッチされ、決して完了しなくてもよいことから、異なっていてもよい、(PM_TC_inst_issued入力646によって伝えられた)単にディスパッチされた命令とは対照的な実行された命令についての情報を、PM_TC_instr_committed644入力がポリシーマネージャ604に与えるということである。図9に関して以下で説明されるように、アプリケーションの中の一部のスレッドは特定のサービス品質を必要とすることがあることから、これはポリシーマネージャ604に対する重要な区別となりうる。1つの実施形態で、PM_TC_instr_committed信号644は、TC_instr_committed信号124の登録されたバージョンである。したがって、特に以下の図7から図11に関して以下でより詳細に説明されるように、プロセッサコア606はPM_TC_inst_issued646、PM_TC_instr_committed644、およびPM_TC_state642の入力を介して、様々なスレッドコンテキスト、およびスレッドコンテキストの状態に対する命令の発行および実行についてのフィードバックを与える。
1つの実施形態で、ディスパッチスケジューラ602はまた、ポリシーマネージャ604にリラックス機能も与え、その目的は、アプリケーションのスレッドコンテキストが全部のプロセッサ帯域幅を必要としない場合に、マイクロプロセッサ100が実際にスリープに入ることなく、電力を節約することを可能にすることである。リラックス機能は、あたかもスケジュールされるべき、さらなるスレッドコンテキストがあるかのように動作する。しかしながら、リラックススレッドコンテキストが発行のために選択される場合、ディスパッチスケジューラ602は命令を発行することはない。ポリシーマネージャ604は、(図9に関して以下で説明される)TC_LEVEL918カウンタと同様に動作する(VPE当たりの)RELAX_LEVELカウンタを、それが増分のためにRELAX_RATEを使用し、リラックス命令スロットが完了されるときに減分される場合を除いて、維持する。1つの実施形態で、マイクロプロセッサ100は、ソフトウェアがRELAX_RATEを特定することを可能にする、TCスケジュールレジスタ902に類似したVPE当たりのVPEスケジュールレジスタを含む。リラックス機能は、表2に明記されたPM_vpe_relax_enable信号を介して使用可能または使用不可にされ、リラックススレッドコンテキストプライオリティは、PM_vpe_relax_priority信号を介して特定される。
1つの実施形態で、ディスパッチスケジューラ602はまた、ポリシーマネージャ604に除外機能も与え、その目的は、除外スレッドコンテキストがそれ自体の、通常のスレッドコンテキストから独立したプライオリティを持つことを可能にすることである。ポリシーマネージャは、(図9に関して以下で説明される)TC_LEVEL918カウンタと同様に動作する(VPE当たりの)EXC_LEVELカウンタを、それが増分のためにEXC_RATEを使用し、除外命令スロットが完了されるときに減分される場合を除いて、維持する。除外モードが使用可能にされ、VPEのために除外が受け入れられる場合、そのときVPEのスレッドコンテキストはすべて除外プライオリティに設定される。1つの実施形態で、ソフトウェアはVPEスケジュールレジスタを介してEXC_RATEを特定する。除外機能は表2に明記されたPM_vpe_exc_enable信号を介して使用可能または使用不可にされ、除外スレッドコンテキストプライオリティは、PM_vpe_exc_priority信号を介して特定される。
ここで図7を参照すると、本発明による図6のディスパッチスケジューラ602と図2の命令選択ロジック202とをより詳細に示すブロック図が表されている。命令選択ロジック202はコンパレータ714によって制御されるマルチプレクサ(muxes)724のツリーを含む。各マルチプレクサ724は、2つの異なるスレッドコンテキストから図2の命令206を受け取る。各マルチプレクサ724はまた、図2のDS_TC_priority208に関連した命令206も受け取る。各マルチプレクサ724に関連したコンパレータ714も、2つのスレッドコンテキストのための一組のDS_TC_priority信号を受け取り、それに関連したマルチプレクサ724を命令206、および最も高いDS_TC_priority208の値を備えたDS_TC_priority208を選択するために制御する。選択された命令206およびDS_TC_priority208は、実行パイプラインへの供給のために、最後のマルチプレクサ724が最も高いDS_TC_priority208を備えた図2の選択命令204を選択するまで、ツリーを下ってゆく。
図7は、ディスパッチスケジューラ602のロジック、すなわちストール指標704、発行可能命令ロジック708およびラウンドロビン(round−robin)ロジック712を示す。1つの実施形態で、ストール指標704と発行可能命令ロジック708とは、各スレッドコンテキストのためのDS_TC_priority208を生成するために、各スレッドコンテキストのためにディスパッチスケジューラ602の中で繰り返される。対照的に、ラウンドロビンロジック712は各々の可能なPM_TC_priority652のために一度インスタンス化されて、各PM_TC_priority652のためのラウンドロビン指標を生成する。例えば、図7はポリシーマネージャ604が4つの可能なPM_TC_priority652のうちの1つを特定してもよい実施形態を示しており、したがってラウンドロビンロジック712はディスパッチスケジューラ602の中で4度インスタンス化され、4つの各々のラウンドロビン指標を生成する。
1つの実施形態で、ラウンドロビン指標はマイクロプロセッサ100のスレッドコンテキスト当たり1ビットを含む。その各々のスレッドコンテキストに関連したラウンドロビン指標のビットは、図7に示されるようにラウンドロビンビット748として与えられる。ラウンドロビンビット748が真である場合、現時点で同じPM_TC_priority652であるその他のスレッドコンテキストの中で発行されるべき、ラウンドロビン方式におけるそのスレッドコンテキストの番となる。
発行可能命令ロジック708は、図1の実行ユニット114からの非ストール中イベント信号128およびストール中イベント信号126、図6のポリシーマネージャ604からのPM_TC_block654信号、命令/スキッドバッファ106からの図3の空信号318、およびTC状態742信号を受け取る。1つの実施形態で、TC状態742信号は、図6のPM_TC_state642信号に類似した情報を伝える。発行可能命令ロジック708は、スレッドコンテキストを識別するストール中イベント信号126に応答して、ストールされたスレッドコンテキストに印を付けるために、ストール指標704を設定する。発行可能命令ロジック708はまた、ストールの理由を記憶するために、ストール中イベント126に応答して状態をストアする。反対に、発行可能命令ロジック708は、非ストール中イベント128がストールの原因に関連している場合、非ストール中イベント信号128に応答してストール指標704をクリアする。発行可能命令ロジック708は、その入力に応答して発行可能746信号を生成する。スレッドコンテキストのために命令/スキッドバッファ106の読み取りポインタ326によって示された命令206が発行可能であれば、発行可能746信号は真である。1つの実施形態で、スレッドコンテキストがアクティブ状態にあって、(例えば停止、待機、一時停止、または放棄などの)別の状態によってブロックされておらず、ストール指標704が偽で、PM_TC_block654および空318信号が偽であることをTC_状態信号742が示す場合、命令は発行可能である。
発行可能746ビットとPM_TC_priority652ビットとラウンドロビンビット748とは、DS_TC_priority208を作り出すために結合される。図7の実施形態で、発行可能746ビットは最も有効なビットであり、ラウンドロビンビット748は最も有効度の低いビットであり、PM_TC_priority652は2つの中間の有効度のビットである。認められるように、発行可能ビット746はDS_TC_priority652の最も有効なビットであるので、発行可能ではない命令は、すべての発行可能命令よりも低いプライオリティになる。反対にラウンドロビンビット748は、2つ以上のスレッドコンテキストが発行可能命令を有し、同じ高さのPM_TC_priority652を有する場合に、スレッドを選択するためだけに使用される。
ここで図8を参照すると、本発明による図7のディスパッチスケジューラ602の動作を示すフローチャートが表されている。フローはブロック802で開始する。
ブロック802で、ディスパッチスケジューラ602は各PM_TC_priority652のために各ラウンドロビン指標を初期化する。フローはブロック804へ進む。
ブロック804で、ディスパッチスケジューラ602は各スレッドコンテキストのために、スレッドコンテキストが発行可能命令206を有するかどうかを判定する。すなわち、各スレッドコンテキストのための発行可能命令ロジック708は、発行可能746信号上で値を生成する。1つの実施形態で、発行可能命令ロジック708は、スレッドコンテキストがアクティブ状態であり、(停止、待機、一時停止または放棄などの)別の状態によってブロックされておらず、ストール指標704が偽であり、PM_TC_block654および空318信号が偽であることをTC_状態信号742が示す場合にだけ、発行可能746信号上で真の信号を生成する。フローは判定ブロック806へ進む。
判定ブロック806で、ディスパッチスケジューラ602はスレッドコンテキストの各々のための発行可能746信号を調べることによって、発行可能命令206を有する任意のスレッドコンテキストが存在するかどうかを判定する。そのようなスレッドコンテキストが存在しないのであれば、フローは少なくとも1つのスレッドコンテキストが発行可能命令206を有するまでブロック804に戻り、そうでなければフローはブロック808へ進む。
ブロック808で、ディスパッチスケジューラ602は、スレッドコンテキストの発行可能746ビット、スレッドコンテキストのPM_TC_priority652、およびスレッドコンテキストのPM_TC_priority652のラウンドロビンビット748に基づいて、各スレッドコンテキストの命令206のためのDS_TC_priority208を生成する。フローはブロック812へ進む。
ブロック812で、ディスパッチスケジューラ602は最も高いDS_TC_priority208を備えた命令206を発行する。すなわちディスパッチスケジューラ602は、発行可能命令を有し、かつ最も高いPM_TC_priority652を有するスレッドコンテキストから命令を発行する。複数のスレッドコンテキストがその基準を満たす場合、ディスパッチスケジューラ602は、スレッドコンテキストのPM_TC_priority652のためのラウンドロビンビット748によって、発行する番であることが示されるスレッドコンテキストから命令を発行する。フローはブロック814へ進む。
ブロック814で、ラウンドロビンロジック712は、その命令を発行させるためにスレッドコンテキストのうちのどれが選択されたのかということに基づいて、PM_TC_priority652のためにラウンドロビン指標を更新する。フローはブロック804に戻る。
ここで図9を参照すると、本発明による図6のポリシーマネージャとTCスケジュールレジスタ902とを示すブロック図が示されている。
マイクロプロセッサ100は、各スレッドコンテキストのためにTCスケジュールレジスタ902を含む。TCスケジュールレジスタ902はソフトウェアプログラム可能であり、ソフトウェアがポリシーマネージャ604にスレッドスケジューリングのヒントを与えるための手段を与える。1つの実施形態で、TCスケジュールレジスタ902は図6および表2に関して上で述べられたコプロセッサ0レジスタ内に含まれ、特にはポリシーマネージャ604内に含まれる。TCスケジュールレジスタ902はTC_LEVEL_PARAM1 908、TC_LEVEL_PARAM2 906、TC_LEVEL_PARAM3 904、TC_RATE912、OV914およびPRIO916の6つのフィールドを含む。図9の実施形態で、TC_LEVEL_PARAM1 908、TC_LEVEL_PARAM2 906、TC_LEVEL_PARAM3、904およびTC_RATE912フィールドは4ビットを含み、PRIO916フィールドは2ビットを含み、OV914フィ0ルドは単一のビットである。
図9に表されているポリシーマネージャ604ロジックは、制御ロジック924と、出力を制御ロジック924に与えるために結合されたコンパレータ922と、出力をコンパレータ924への入力として与えるために結合されたTC_LEVEL918レジスタと、出力をTC_LEVEL918レジスタへの入力として与えるために結合された3つの入力マルチプレクサ(mux)926とを含む。マルチプレクサ926はその第1の入力で、正しい値を保持しておくために、TC_LEVEL918レジスタの出力を受け取る。マルチプレクサ926はその第2の入力で、入力がTC_LEVEL918レジスタの出力であるデクリメンタ932の出力を受け取る。マルチプレクサ926はその第3の入力で、入力がTC_LEVEL918レジスタの出力を加算するアダー936の出力と、TC_RATE912に2を乗算するマルチプライヤ938の出力である、インクリメンタ934の出力を受け取る。TC_RATE912は、スレッドコンテキストの所望の実行速度、すなわちユニット時間当たりの完了されるべき命令の数を表す指標である。図9の実施形態で、TC_RATE912は、16クロックサイクル毎に完了されなければならないスレッドの命令の数を示す。図9の中では、実際に一覧にされるロジックは一度だけ表されているが、ロジックは各スレッドコンテキストのためにPM_TC_block654およびPM_TC_priority652信号を生成し、PM_TC_state642、PM_TC_inst_Committed644、PM_TC_inst_issued646、およびPM_gclk658信号を受け取るために、ポリシーマネージャ604内で各スレッドコンテキストのために繰り返されてもよい。
ポリシーマネージャ604は、スケジューラ108の高レベルのスレッドスケジューリングポリシーを達成するために、修正されたリーキーバケットアルゴリズムを用いる。TC_LEVEL918レジスタは、バケットの水位に類似している。TC_LEVEL918は本質的に、スレッドコンテキストによって行われなければならない作業量の尺度である。1つの実施形態で、TC_LEVEL918レジスタはゼロに初期化された12ビットのレジスタを含む。制御ロジック924は、マルチプレクサ926がどの入力を選択するかを制御するための制御信号928を生成する。32クロックサイクル毎に、マルチプレクサ926は、数量(TC_RATE×2+1)によってTC_LEVEL918を増やすTC_LEVEL918レジスタへのストアのために、インクリメンタ936の出力を選択する。1つの実施形態では、TC_RATE912に基づいたTC_LEVEL918の更新の間のクロックサイクルの数もまた、プログラム可能である。別のクロックサイクルで、PM_TC_instr_Committed信号644が、スレッドコンテキストのために命令が実行のためにコミットされたことを示す場合、マルチプレクサ926はTC_LEVEL918を減分するためにデクリメンタ932の出力を選択する。したがってソフトウェアは、スレッドのTCスケジュールレジスタ902のTC_RATE912の値を調整することによって、スレッドコンテキストのバケットの仮想水位に影響を及ぼすことができる。図9の実施形態で、TC_RATE912の値は、スレッドコンテキストのためにマイクロプロセッサ100が実行することを望まれる、16クロックサイクル毎の命令の数を示す。
水圧によって水漏れするバケツの水位が増えると、水は高い確率で漏れ出すようになる。同様にTC_LEVEL_PARAM領域904/906/908は、仮想水圧の範囲を定義する値を単調に増やすことでプログラムされる。コンパレータ922はTC_LEVEL918をTC_LEVEL_PARAM904/906/908と比較し、それらの結果を制御ロジック924に与え、それによって、TC_LEVEL918がどの仮想水圧の範囲に入るかに基づいて、PM_TC_priority652を生成する。図9のリーキーバケットによって示されているように、TC_LEVEL918の最も有効なニブルがTC_LEVEL_PARAM3 904の値を上回る場合、制御ロジック924は3のPM_TC_priority652の値(最も高いプライオリティ)を生成し、TC_LEVEL918の最も有効なニブルがTC_LEVEL_PARAM3 904の値とTC_LEVEL_PARAM2 906との値の間にある場合、制御ロジック924は2のPM_TC_priority652の値を生成し、TC_LEVEL918の最も有効なニブルがTC_LEVEL_PARAM2 906の値とTC_LEVEL_PARAM1 908との値の間にある場合、制御ロジック924は1のPM_TC_priority652の値を生成し、TC_LEVEL918の最も有効なニブルがTC_LEVEL_PARAM1 908の値を下回る場合、制御ロジック924は0のPM_TC_priority652の値(最も低いプライオリティ)を生成する。同様に、PM_TC_priority652のレベルを増やすことは、スレッドコンテキストに対して命令を発行するためのディスパッチスケジューラ602への圧力を増やし、一方でPM_TC_priority652のレベルを下げることは、スレッドコンテキストに対して命令を発行するためのディスパッチスケジューラ602への圧力を減らす。
上述のように、マイクロプロセッサ100を使用する一部のアプリケーションでは、異なるスレッドは、TC_RATE912フィールドを使用してプログラム可能な異なる命令実行速度を必要としてもよい。さらに異なるスレッドは異なる分解能(resolution)、すなわち命令の実行速度が測定される期間を必要としてもよい。すなわち、おそらくは高い実行速度を必要するわけではないが、一部のスレッドには最小限の期間を超えて命令の実行が欠けていてはならない。すなわち、スレッドは特定のサービス品質を必要とする。図9およびその説明から認められるように、各スレッドのために必要とされる分解能を達成するために、TC_LEVEL_PARAM904/906/908が用いられてもよい。互いに比較的近いTC_LEVEL_PARAM904/906/908を割り当てることによって、より高い分解能が達成されることができ、その一方で、比較的遠くに離れているTC_LEVEL_PARAM904/906/908を割り当てることは、より低い分解能を作り出す。したがってソフトウェアは、命令実行速度で必要とされる分解能を達成するために、TC_LEVEL_PARAM904/906/908を各スレッドコンテキストのために調整することによって、ポリシーマネージャ604を介して所望のサービス品質目標を達成してもよい。
OVビット914が設定される場合、制御ロジック924はTC_LEVEL_PARAM904/906/908、TC_RATE912およびTC_LEVEL918の値を無視し、代わりにPRIOフィールド916で特定される値に等しいPM_TC_priority652信号の値を生成する。これによって、ソフトウェアはリーキーバケットポリシーを迂回し、必要に応じて1つまたは複数のスレッドコンテキストのプライオリティを直接制御することができる。
1つの実施形態で、TC_LEVEL918が所定の数のクロックサイクルに対して、その最大値まで飽和する場合、そのときマイクロプロセッサ100は、特に1つまたは複数のTCスケジュールレジスタ902の中の値を変更することによって、ソフトウェアがより高いレベルでスレッドスケジューリング調整を行うことができるようにするために割り込みを送る。1つの実施形態で、割り込みはソフトウェアによってマスクされてもよい。
1つの実施形態で、マイクロプロセッサ100の命令セットは、特定されたイベントが生じるまで、スケジューラ108にスレッドコンテキストのために命令を発行することを止めるように命令するためにスレッドコンテキストが実行してもよい放棄命令を含む。1つの実施形態で、スレッドが放棄されている場合、ポリシーマネージャ604は一時的にスレッドのTC_LEVEL918の更新を使用不可にするので、スレッドのPM_TC_priorityはスレッドが放棄解除になるまで保存される。別の実施形態で、ポリシーマネージャ604はスレッドのTC_LEVEL918を更新し続け、おそらくスレッドのPM_TC_priorityを増やすことになるので、スレッドが放棄解除になった場合、基本的には呼び水でスレッドを援助するために、一時的に高いプライオリティを有する。1つの実施形態で、ポリシーマネージャ604の放棄されたスレッドに対する動作は、ソフトウェアによってプログラム可能である。
PM_TC_priority652、TC_LEVEL_PARAM904/906/908、TC_RATE912、TC_LEVEL918等を特定するために、特定の数のビットが使用される実施形態が説明されているが、スケジューラ108は任意の方法で、この実施形態で使用される値に限定されるわけではなく、むしろスケジューラ108は、マイクロプロセッサ100が使用されるべき特定のアプリケーションによって必要とされるような様々な異なる数のビット、プライオリティ、レベル、速度等を使用するように構成されてよいことを理解されたい。さらに、変更されたリーキーバケットスレッドスケジューリングポリシーを用いるポリシーマネージャ604が説明されてきたが、ポリシーマネージャ604は、依然として分岐型スケジューラ108の利点を享受しながら、任意の様々なスレッドスケジューリングポリシーを用いるように構成されてもよいことを理解されたい。例えば1つの実施形態では、ポリシーマネージャ604は、すべてのスレッドコンテキストのためのPM_TC_priority652の出力が同一の値に結び付けられている単純なラウンドロビンスレッドスケジューリングポリシーを用いる。別の実施形態では、ポリシーマネージャ604は、PM_TC_priority652の出力がスレッドコンテキストのTCスケジュールレジスタ902の中で特定された、いくつかの連続したクロックサイクルの間、1つのスレッドコンテキストのために最も高いプライオリティにまで高められ、次いでPM_TC_priority652の出力がスレッドコンテキストのTCスケジュールレジスタ902の中で特定された、おそらく異なった数の連続したクロックサイクルの間、別のスレッドコンテキストのために最も高いプライオリティにまで高められ、タイムスライス式の方法で各スレッドコンテキストのためにそのようにされる、タイムスライス式スレッドスケジューリングポリシーを用いる。
1つの実施形態で、マイクロプロセッサ100の命令セットは、利用可能なスレッドコンテキストを割当て、新たに割り当てられたスレッドコンテキストの中で新たなスレッドの実行をスケジューリングするための分岐命令を含む。1つの実施形態で、スレッドコンテキストが新たなスレッドコンテキストを分岐する場合、親スレッドコンテキストのためのTC_RATE912はそれ自体の間で分割され、子スレッドコンテキスト、すなわち新たなTC_RATE912は均一に2で割られた古いTC_RATE912である。これには、スレッドコンテキストが元々割り当てられたよりも多くの処理帯域幅を要求することを防ぐという利点がある。
上述のものから認められるように、スケジューラ108を分岐することによって、プロセッサコア606に含まれるディスパッチスケジューラ602を比較的簡単にすることができ、それによってディスパッチスケジューラ602をエリアおよび電力の点で比較的小型のものにし、スレッドスケジューリングポリシーのアプリケーション特定の複雑性を、プロセッサコア606の外部にあるポリシーマネージャ604に配置することができる。一部のアプリケーションは複雑なポリシーマネージャ604を必要としなくてもよく、したがって、本明細書で説明されるように、スケジューラ108が分岐されていなかった場合にすべてのアプリケーションに課せられる、さらなるエリアおよび電力要件の負担をかけられないでも済むため、これは好都合なことである。
ここで図10を参照すると、本発明による図9のポリシーマネージャ604の動作を示すフローチャートが表されている。図10では単一のスレッドコンテキストのためだけに動作が表されているが、図10に明記された動作はポリシーマネージャ604の中で、各スレッドコンテキストのために生じる。フローはブロック1002で開始する。
ブロック1002で、ポリシーマネージャ604はTC_LEVEL918をゼロに初期化する。フローはブロック1004へ進む。
ブロック1004で、ポリシーマネージャ604はPM_gclk658の1チックを待つ。フローは判定ブロック1006へ進む。
判定ブロック1006で、ポリシーマネージャ604は、フローが判定ブロック1006に最後に達したときから、32チックのPM_gclk658が過ぎたかどうかを判定する。32のPM_gclk658が過ぎていなければ、フローは判定ブロック1012へ進み、過ぎていればフローはブロック1008へ進む。
ブロック1008で、TC_LEVEL918はTC_RATE912+1の値の2倍だけ増やされる。フローは判定ブロック1012へ進む。
判定ブロック1012で、ポリシーマネージャ604はPM_TC_instr_committed644が真であるかどうかを判定する。PM_TC_instr_committed644が真でなければフローは判定ブロック1016へ進み、真であればフローはブロック1014へ進む。
ブロック1014で、TC_LEVEL918は減分される。フローは判定ブロック1016へ進む。
判定ブロック1016で、ポリシーマネージャ604はOVビット914が設定されるかどうかを判定する。OVビット914が設定されなければフローは判定ブロック1022へ進み、設定されるのであればフローはブロック1018へ進む。
ブロック1018で、ポリシーマネージャ604はPRIO916フィールドと等しいPM_TC_priority652の値を生成する。フローはブロック1004へ戻る。
判定ブロック1022で、ポリシーマネージャ604はTC_LEVEL918がTC_LEVEL_PRAM3 904の値よりも大きいかどうかを判定する。TC_LEVEL918がTC_LEVEL_PARAM3 904の値よりも大きくなければフローは判定ブロック1026へ進み、大きければフローはブロック1024へ進む。
ブロック1024で、ポリシーマネージャ604はPM_TC_priority652上で3の値(最も高いプライオリティ)を生成する。フローはブロック1004へ戻る。
判定ブロック1026で、ポリシーマネージャ604はTC_LEVEL918がTC_LEVEL_PARAM2 906の値よりも大きいかどうかを判定する。TC_LEVEL918がTC_LEVEL_PARAM2 906の値よりも大きくなければ、フローは判定ブロック1032へ進み、大きければフローはブロック1028へ進む。
ブロック1028で、ポリシーマネージャ604はPM_TC_priority652上で2の値を生成する。フローはブロック1004へ戻る。
判定ブロック1032で、ポリシーマネージャ604はTC_LEVEL918がTC_LEVEL_PARAM1 908の値よりも大きいかどうかを判定する。TC_LEVEL918がTC_LEVEL_PARAM1 908の値よりも大きくなければフローはブロック1036へ進み、大きければフローはブロック1034へ進む。
ブロック1034で、ポリシーマネージャ604はPM_TC_priority652上で1の値を生成する。フローはブロック1004へ戻る。
ブロック1036で、ポリシーマネージャ604はPM_TC_priority652上で0の値を(最も低いプライオリティ)生成する。フローはブロック1004へ戻る。
ここで図11を参照すると、本発明の代替の実施形態による図6のディスパッチスケジューラ602と図2の命令選択ロジック202とをより詳細に示すブロック図が表されている。図11の実施形態は図7の実施形態に類似しているが、図11の実施形態のディスパッチスケジューラ602は命令プレデコーダ1108とストール可能性プライオリティジェネレータ1104も含む。プレデコーダ1108は命令1114についてのレジスタ使用情報1106を生成するために、命令1114をプレデコードする。1つの実施形態で、レジスタ使用情報1106は、命令のソースレジスタとしてレジスタファイル112のどのレジスタが使用されているのかということと、ソースレジスタに必要とされるのは実行パイプライン114のどの段階であるのかということを特定する。さらにレジスタ使用情報1106は、命令の宛先レジスタはレジスタファイル112のどのレジスタであるのかということと、命令の結果が宛先レジスタにストアされる準備ができているのは実行パイプライン114のどの段階であるのかということを特定する。
ストール可能性プライオリティジェネレータ1104は、レジスタ使用情報と、マイクロプロセッサ100のパイプラインから受け取られたプロセッサ状態情報1112とに基づいて、命令1114のためのストール可能性プライオリティ1102を生成する。プロセッサ状態情報1112はロードがデータキャッシュ118の中でミスされたかどうかということと、ミスしているロードが既にフェッチされたかどうかということと、実行パイプラインの中で現在実行されている別の命令の、特には宛先レジスタである(命令プレデコーダ1108によって生成されたレジスタ使用情報1106を含んでもよい)レジスタの使用法と、実行パイプラインの中のEHB命令の存在と、ALUが別のALU命令を実行して現在ビジーであるかどうかということと、プレデコードされている命令と実行パイプライン中の別の命令との間にある現在のパイプライン段階の数等を含んでもよいが、それらに限定されるわけではない。図11の実施形態で、ストール可能性プライオリティ1102は、図2の選択命令204を選択するのに命令選択ロジック202によって使用されるために、図2の6ビットのDC_TC_priority208を形成するための発行可能ビット746とPM_TC_priorityビット652との間に含まれる2つのビットを含む。代替の実施形態で、ストール可能性プライオリティ1102の2つのビットは、PM_TC_priority652の2つのビットとインタリーブされる。1つの実施形態で、このビットは、ストール可能性プライオリティ1102のMSB、PM_TC_priority652のMSB、ストール可能性プライオリティ1102のLSB、LSBまたはPM_TC_priority652の最も有効なものから最も有効でないものまでの順序でインタリーブされる。この実施形態は、実行パイプライン114による高い全体の処理能力を維持することの助けとなるインタリーブ型の実施形態である。
ストール可能性プライオリティ1102は、そのレジスタの使用法に基づいて命令がストールすることなく実行される可能性を示す。1つの実施形態で、ストール可能性プライオリティ1102は以下のように4つのプライオリティレベルを作り出し、ストール可能性プライオリティジェネレータ1104によって生成される2つのビットを含む。命令はストールしないことを保証される場合、最も高いストール可能性プライオリティ1102に割り当てられる。例えば、命令がレジスタへの依存性を有していない場合、または命令がそれ自体と依存性を有する命令との間で十分なパイプライン段階の間隔を有している場合、または例えばミスしているロードデータが戻されているため、または前の命令の結果が現在利用可能であるために、依存性はもはや存在せず、命令によって必要とされるデータが利用可能である場合である。命令はストールすることが保証される場合、最も低いストール可能性プライオリティ1102に割り当てられる。例えば、命令が現在実行中のEHB命令に続く場合、命令がキャッシュ不可能なメモリ領域からのロードである場合、命令がスレッド間通信(ITC)スペース内の場所から/へのロード/ストアである場合、または命令がレジスタ依存性などの依存性のせいで、その前にある別の命令とバックトゥバックで実行されることができない場合である。キャッシュ可能ロード命令は、最も低いプライオリティに次ぐ値に割り当てられる。命令がストールしないことを保証される場合、最も高いプライオリティに次ぐ値に割り当てられるが、例えば1つの実施形態の中での乗算、除算または浮動小数点命令の結果に依存する命令など、ストールしない高い可能性を有する。
1つの実施形態で、命令1114は、スレッドコンテキストのための命令/スキッドバッファ106の読み取りポインタ326における図2の命令206、すなわち発行に適した次の命令であるスレッドコンテキストの命令206である。別の実施形態で、タイミング考慮事項を改善するために、命令プレデコーダ1108は命令1114が図1の命令/スキッドバッファ106にストアされるときに、命令1114のためにレジスタ使用情報1106を生成し、レジスタ使用情報1106を命令1114とともに命令/スキッドバッファ106の中にストアする。命令1114/206が命令/スキッドバッファ106から読み取られると、プレデコードされたレジスタ使用情報1106は、その時点でストール可能性プライオリティジェネレータ1104に与えられる。すなわち、この実施形態では、命令/スキッドバッファ106は命令プレデコーダ1108とストール可能性プライオリティジェネレータ1104との間で結合される。
ここで図12を参照すると、本発明による図11のディスパッチスケジューラ602の動作を示すフローチャートが表されている。図12のフローチャートは図8のフローチャートに類似しており、同じ番号を付けられたブロックは同じものである。しかしながら図12のフローチャートでは、ブロック808はブロック1208と置き換えられている。さらに図12のフローチャートは、さらなるブロック1205を含む。フローはブロック804からブロック1205へ進む。
ブロック1205で、各スレッドコンテキストのために、ストール可能性プライオリティジェネレータ1104は、図11のプロセッサ状態1112および命令1114のレジスタ使用情報1106に基づいて、命令1114のためのストール可能性プライオリティ1102を生成する。フローはブロック1205から判定ブロック806へ進む。
判定ブロック806で、ディスパッチスケジューラ602は、各スレッドコンテキストのための発行可能746信号を調べることによって、発行可能命令206を有する任意のスレッドコンテキストが存在するかどうかを判定し、そうしたスレッドコンテキストが存在しなければ、少なくとも1つのスレッドコンテキストが発行可能命令206を有するまでフローはブロック804へ戻り、そうでなければフローはブロック1208へ進む。
ブロック1208で、ディスパッチスケジューラ602は、スレッドコンテキストの発行可能746ビット、スレッドコンテキストのためにディスパッチするための次の命令206のストール可能性プライオリティ1102、スレッドコンテキストのPM_TC_priority652、およびスレッドコンテキストのPM_TC_priority652のラウンドロビンビット748に基づいて、各スレッドコンテキストの命令206のためのDS_TC_priority208を生成する。フローはブロック1208からブロック812へ進む。
ここで図13を参照すると、本発明の代替実施形態による図1のマイクロプロセッサ100の共有型の動的割当可能なスキッドバッファを示すブロック図が表されている。マイクロプロセッサ100は、図1の命令フェッチャ104とスケジューラ108とを含む。マイクロプロセッサ100は、図2のDC_TC_priority信号208に応答して選択命令204を出力する命令選択ロジック202も含む。マイクロプロセッサ100はまた、図1の命令フェッチャ104が命令をフェッチする、複数の各々のスレッドコンテキストのための複数の命令バッファ1306も含む。マイクロプロセッサ100はまた、複数のスキッドバッファ1312も含む。1つの実施形態で、命令バッファ1306およびスキッドバッファ1312の各々は、図3の命令/スキッドバッファ106の構造に類似した循環FIFOを含む。スキッドバッファ1312はスレッドコンテキストによって共有され、動的に割り当てられるので、スキッドバッファ1312の数は、好都合にもスレッドコンテキストの数よりも少なくてよい。図13はスキッドバッファA、スキッドバッファB、スキッドバッファCと記載されている3つのスキッドバッファ1312を有する実施形態を示す。さらに、各スキッドバッファ1312は関連した割当レジスタ1314とロックレジスタ1316とを有する。割当レジスタ1314は、関連したスキッドバッファ1312がスレッドコンテキストによる使用のために割り当てられているかどうかということと、もしそうであれば、どのスレッドコンテキストにスキッドバッファ1312が割り当てられるのかということを示す。同様に、ロックレジスタ1316は、関連したスキッドバッファ1312がスレッドコンテキストによる使用のためにロックされているのかどうかということと、もしそうであれば、どのスレッドコンテキストに対してスキッドバッファ1312がロックされるのかということを示す。スレッドコンテキストのためにスキッドバッファ1312を割り当てること、およびロックすることは、図14に関して以下でより詳細に述べられる。
マイクロプロセッサ100は、スキッドバッファ1312の各々に関連した複数のマルチプレクサ1322も含む。各マルチプレクサ1322はそれに関連したスキッドバッファ1312の入力に結合された各マルチプレクサ1322の出力を有する。各マルチプレクサ1322は命令バッファ1306の各々の出力を、各マルチプレクサ1322の入力として受け取る。マイクロプロセッサ100はまた、命令バッファ1306の各々に関連した複数のマルチプレクサ1324も含む。各マルチプレクサ1324は、その各々のスレッドコンテキストの図2の命令206を、命令選択ロジック202に出力する。各マルチプレクサ1324は、その各々の命令バッファ1306の出力を1つの入力の上で受け取る。各マルチプレクサ1324は、スキッドバッファ1312の各々の出力を、その残りの入力の上で受け取る。
図2の命令/スキッドバッファ106とは異なり、図13のスキッドバッファ1312は命令バッファ1306とは別のものであり、必要に応じた基準で、スレッドコンテキストによって共有され、動的に割り当てられる。このことは、より効率的な命令バッファリングの解決法を潜在的に提供し、特にはスペースと電力の量が同じである場合のより高性能の解決法か、または性能のレベルが類似している場合のスペースと電力の低減を提供する。マイクロプロセッサ100はまた命令バッファ1306、スキッドバッファ1312、マルチプレクサ1322および1324、割当レジスタ1314ならびにロックレジスタ1316の動作を制御するためのバッファ制御ロジック1332も含む。図13の命令バッファ1306およびスキッドバッファ1312の動作は、図14に関してここで説明される。
ここで図14を参照すると、本発明による図13のスキッドバッファの動作を示す3つのフローチャートが表されている。フローチャートの各々は、異なるイベントまたはイベントのセットに応答して、図13の命令バッファ1306およびスキッドバッファ1312によって行われる動作を示す。第1フローチャートのフローはブロック1404で開始する。
ブロック1404で、図6のディスパッチスケジューラ602は命令バッファ1306から命令を発行する。命令フェッチャ104はスレッドコンテキストに関連した命令バッファ1306に命令を書き込み続けており、特にはブロック1404で発行される命令を命令バッファ1306に書き込んでいることに留意されたい。フローは判定ブロック1406へ進む。
判定ブロック1406で、バッファ制御ロジック1332は、図13の割当レジスタ1314を読み取ることによって、スキッドバッファ1312が既にスレッドコンテキストのために割り当てられているかどうかを判定する。スキッドバッファ1312が既にスレッドコンテキストのために割り当てられているのであればフローはブロック1412へ進み、そうでなければ、フローはスキッドバッファ1312がスレッドコンテキストのために割り当てられてもよいかどうかを判定するために、判定ブロック1408へ進む。
判定ブロック1408で、バッファ制御ロジック1322は、図13のロックレジスタ1316を読み取ることによって、すべてのスキッドバッファがロックされているかどうかを判定する。すべてのスキッドバッファがロックされていないのであればフローはブロック1414へ進み、そうでなければ、スレッドコンテキストのために割り当てられてもよいスキッドバッファ1312は存在せず、このことはスレッドコンテキストがその後実行パイプラインによってフラッシュされる場合、フラッシュされた命令が再フェッチされなければならないことを意味するので、フローは終了する。
ブロック1412で、ブロック1404でディスパッチされた命令は、前にスレッドコンテキストのために割り当てられたスキッドバッファ1312に書き込まれ、命令は命令バッファ1306から取り除かれる。フローはブロック1412で終了する。
ブロック1414で、バッファ制御ロジック1332はスレッドコンテキストのためにスキッドバッファ1312を割り当てる。1つの実施形態で、バッファ制御ロジック1332は、割り当てられたスキッドバッファ1312に関連した割当レジスタ1314にスレッドコンテキスト識別子を書き込むことによって、スレッドコンテキストのためにスキッドバッファ1312を割り当てる。1つの実施形態で、バッファ制御ロジック1332は最も中身のないスキッドバッファ1312を割り当てる。別の実施形態で、バッファ制御ロジック1332は、最近で最も使用されていないものという基準でスキッドバッファ1312を割り当てる。別の実施形態で、バッファ制御ロジック1332は、最近で最もロックされていないものという基準でスキッドバッファ1312を割り当てる。別の実施形態で、バッファ制御ロジック1332は、スレッドコンテキストが現在最も低いプライオリティを有するスキッドバッファ1312を割り当てる。フローは、命令を割り当てられたスキッドバッファ1312に書き込むために、ブロック1414からブロック1412へ進む。
第2フローチャートのフローはブロック1442で開始する。
ブロック1442で、図1の実行ユニット114はスレッドコンテキストのためにストール中イベント126を送る。フローはブロック1444へ進む。
ブロック1444で、実行ユニット114はスレッドコンテキストのためにTC_flush122を送る。フローは判定ブロック1446へ進む。
判定ブロック1446で、バッファ制御ロジック1332は、図13の割当レジスタ1314を読み取ることによって、スキッドバッファ1312がスレッドコンテキストのために割り当てられたかどうかを判定する。スキッドバッファ1312がスレッドコンテキストのために割り当てられていなければフローはブロック1452へ進み、そうでなければフローはブロック1448へ進む。
ブロック1448で、バッファ制御ロジック1332はスレッドコンテキストのために割り当てられたスキッドバッファ1312をロックする。1つの実施形態で、バッファ制御ロジック1332は、スキッドバッファ1312に関連したロックレジスタ1316へスレッドコンテキスト識別子を書き込むことによって、スキッドバッファ1312をスレッドコンテキストのためにロックする。フローはブロック1448で終了する。
ブロック1452で、バッファ制御ロジック1332は、実行ユニット114によってフラッシュされたスレッドコンテキストの命令バッファ1306をフラッシュする。フローはブロック1452で終了する。
第3フローチャートのフローはブロック1482で開始する。
ブロック1482で、実行ユニット114はスレッドコンテキストのために適切な非ストール中イベント128を送る。フローは判定ブロック1484へ進む。
判定ブロック1484で、バッファ制御ロジック1332は、ロックレジスタ1316を読み取ることによって、スキッドバッファ1312がスレッドコンテキストのためにロックされているかどうかを判定する。スキッドバッファ1312がスレッドコンテキストのためにロックされているのであればフローはブロック1488へ進み、そうでなければフローはブロック1486へ進む。
ブロック1486で、スケジューラ108は、スレッドコンテキストに関連した命令バッファ1306から、スレッドコンテキストのために命令を発行する。スレッドコンテキストのためにロックされているスキッドバッファ1312はなかったため、これらの命令は命令バッファ1306の中に再フェッチされなければならなかったことに留意されたい。フローはブロック1486で終了する。
ブロック1488で、スケジューラ108は、例えば除外または妨害または分岐予測誤りの修正に応答して、スキッドバッファ1312が空になるまで、またはスキッドバッファ1312がフラッシュされるまで、第2フローチャートのブロック1448でスレッドコンテキストのためにロックされたスキッドバッファ1312から、スキッドコンテキストのために命令を発行する。好都合にも、これらの命令は再フェッチされる必要がなかったことに留意されたい。フローはブロック1492へ進む。
ブロック1492で、バッファ制御ロジック1332は、第2フローチャートのブロック1448でスレッドコンテキストのためにロックされていたスキッドバッファ1312をロック解除する。フローはブロック1492で終了する。
ここで図15を参照すると、本発明の代替の実施形態による、すべてのスレッドコンテキストによって共有される図1のマイクロプロセッサ100の単一の命令/スキッドバッファを示すブロック図が表されている。図15のマイクロプロセッサ100は、図1の命令フェッチャ104とスケジューラ108とを含む。マイクロプロセッサ100は、命令フェッチャ104がすべてのスレッドコンテキストのために命令をフェッチする単一の命令/スキッドバッファ1506も含む。マイクロプロセッサ100はまた、スケジューラ108から図2のDS_TC_priority信号208を受け取るバッファ制御ロジック1502も含む。バッファ制御ロジック1502は、実行ユニット114への供給のために、図2の選択命令204を出力するために命令/スキッドバッファ1506を制御する。
図15の単一の命令/スキッドバッファ1506はすべてのスレッドコンテキストからの命令をストアするためのランダムアクセスメモリ(RAM)である。したがってバッファ制御ロジック1502は、図3に関して上で説明されたものと同様に機能するすべてのスレッドコンテキストの中で、単一の書き込みポインタ(WP)およびfull_countを維持する。特に、書き込みポインタは命令のスレッドコンテキストに関わりなく、書き込まれるべきRAM1506中の次の場所のアドレスを特定する。同様にfull_countは、命令のスレッドコンテキストに関わりなく、RAM1506に命令が書き込まれる度に増分され、実行のために命令がコミットされる度に減分される。
対照的にバッファ制御ロジック1502は、図3に関して上で説明されたものと同様の、各スレッドコンテキストのための別個の読み取りポインタ(RP)とコミットポインタ(CP)とempty_countとを維持する。特には、読み取りポインタは各々のスレッドコンテキストのために読み取られるべきRAM1506中の次の場所のアドレスを特定し、コミットポインタは各スレッドコンテキストのためにコミットされるべき次の命令のRAM1506中の場所のアドレスを示し、empty_countは、各々のスレッドコンテキストのために命令がRAM1506に書き込まれる度に増分され、スケジューラ108が各々のスレッドコンテキストのためにRAM1506から命令を読み取る度に減分される。
1つの実施形態で、バッファ制御ロジック1502は、命令がRAM1506にフェッチされた順序で、スレッドコンテキストのための有効命令のRAM1506内の場所を特定する各スレッドコンテキストのためのリンクリストを維持する。リンクリストは、命令がRAM1506に書き込まれる度に更新され、各スレッドコンテキストのために読み取りポインタおよびコミットポインタを更新するために使用される。
バッファ制御ロジック1502は、スケジューラ108が命令を要求する場合にスケジューラ108からDS_TC_priority信号208を受け取り、バッファ制御ロジック1502は、それに反応して命令ディスパッチのためにスレッドコンテキストのうちの1つを選択し、DS_TC_priority信号208によって示される最も高いプライオリティを備えたスレッドコンテキストの命令204をRAM1506に出力させるために、RAM1506対して適切なアドレスを生成する。
本発明ならびにその目的、機能および利点が詳細に説明されてきたが、その他の実施形態は本発明によって包含される。例えば、スケジューラ108が分岐され、パラメータ化されたリーキーバケットスケジューリングポリシーがプロセッサコア606の外部、すなわちプロセッサ100のカスタマが変更することができる部分の外部にあるスケジューラ108の部分に含まれる実施形態が説明されてきたが、パラメータ化されたリーキーバケットスケジューラの使用は分岐型スケジューラに限定されるわけではなく、任意の様々な方法で分割されたスケジューラとともに、分岐型ではないスケジューラにも適合されてよいことを理解されたい。さらに、ポリシーマネージャ604がリーキーバケットスケジューリングポリシーを実施する分岐型スケジューラが説明されてきたが、分岐型スケジューラ108はリーキーバケットのスレッドスケジューリングポリシーに限定されるわけではなく、分岐型スケジューラのポリシーマネージャによって実施されるスレッドスケジューリングポリシーは、任意のスレッドスケジューリングアルゴリズムに従うものであってもよい。またさらに、ポリシーマネージャ604が、実行のために命令がコミットされたという指標に基づいて、スレッドコンテキストのプライオリティを更新する実施形態が説明されてきたが、別の実施形態では、ポリシーマネージャ604は、例えば(PM_TC_inst_発行信号646によって示されるような)命令が発行されたという指標、命令が完了されたか、またはマイクロプロセッサ100から廃棄されたという指標、または何らかのその他の命令の実行に関連した指標などの、プロセッサコア606からの別の情報に基づいてスレッドコンテキストのプライオリティを更新してもよい。さらに、TC_RATE912を用いてTC_LEVEL918を更新するために特定の計算が説明されてきたが、TC_LEVEL918は、TC_RATE912を使用する別の方法によって更新されてもよい。
上で本発明の様々な実施形態が説明されてきたが、それらは制限ではなく、例として示されたものであることを理解されたい。本発明の精神および範囲から逸脱することなく、本発明の中で形式および細部の様々な変更が行われることができることは、関連のコンピュータ技術の当業者であれば明らかであろう。
一例として、(例えば中央処理ユニット(「CPU」)、マイクロプロセッサ、マイクロコントローラ、デジタル信号プロセッサ、プロセッサコア、チップ上システム(「SOC」)、または任意のその他のプログラム可能なデバイスの内部にあるか、またはそれらに結合された)ハードウェアを使用することに加えて、実施態様は、例えばソフトウェアをストアするように構成されたコンピュータ使用可能(例えば可読)媒体の中で処理される(例えばコンピュータ可読コード、プログラムコード、ソース、オブジェクト、またはマシン言語などの任意の形式で処理される命令および/またはデータなどの)ソフトウェアで具体化されてもよい。そのようなソフトウェアは、例えば本明細書で説明された装置および方法の機能、製造、モデル化、シミュレーション、記述および/またはテストを可能にすることができる。例えばこれは、一般的なプログラミング言語(例えばC、C++)、GDSIIデータベース、Verilog HDL、VHDL等を含めたハードウェア記述言語(HDL)、またはその他の利用可能なプログラム、データベース、および/もしくは回路(すなわち回路図面)取り込みツールの使用を通じて達成されることができる。そのようなソフトウェアは、半導体、磁気ディスク、光ディスク(例えばCD−ROM、DVD−ROM等)を含む任意の知られているコンピュータ使用可能媒体の中で、コンピュータ使用可能(例えば可読)伝送媒体(例えば搬送波、またはデジタル、光もしくはアナログベースの媒体を含む任意のその他の媒体)中で具体化されるコンピュータデータ信号として処理されることができる。そのようにして、ソフトウェアは、インターネットまたはイントラネットを含む通信ネットワーク上で伝送されることができる。
本明細書で説明される装置および方法は、(例えばHDLで具体化される)マイクロプロセッサコアなどの半導体知的所有権コアの中に含まれ、集積回路の製造中にハードウェアに変形されてもよいことを理解されたい。さらに、本明細書で説明される装置および方法は、ハードウェアとソフトウェアの組合せとして具体化されてもよい。したがって、本発明は上述の例示的な実施形態のいかなるものによっても限定されるべきではなく、特許請求の範囲およびその均等物によってのみ定義されるべきである。