(57)【要約】【課題】チップ面積の実質的な増加を必要としない、実行パイプライン内のバブルの発生を効果的かつ効率的に減らす実行コア・アーキテクチャを提供すること。【解決手段】グラフィックス・プロセッサなどのマルチスレッド式マイクロプロセッサの命令ディスパッチがスレッドの間の順序によって制限されない。命令は、スレッドのそれぞれからの命令を記憶する命令バッファにフェッチされる。ディスパッチ回路はバッファ内のどの命令が実行の準備ができているかどうかを判定し、準備ができた命令を実行のために発行する。あるスレッドからの命令を、別のスレッドからの命令の前に、どちらの命令が最初にバッファにフェッチされたかに無関係に発行する。特定のスレッドからの命令が発行されろと、フェッチ回路は、そのスレッドからの次の命令によって、使用可能なバッファ充てんする。【選択図】図１
2005182825.tif 000002
【特許請求の範囲】
【請求項１】
複数のスレッドの並列処理のために構成されたマイクロプロセッサであって、各スレッドが命令のシーケンスを含み、
前記複数のスレッドのすべてに関する命令を実行するように構成された実行モジュールと、
それぞれが前記複数のスレッドのそれぞれの１つに関連する複数のストレージ・ロケーションを含む命令バッファと、
前記命令バッファの前記関連するストレージ・ロケーションが使用可能であるかどうかに少なくとも部分的に基づいて前記複数のスレッドの１つを選択し、前記複数のスレッドの前記選択された１つの前記シーケンス内の次の命令を前記命令バッファにフェッチするように構成されたフェッチ回路と、
前記命令バッファの前記記憶された命令のうちのどれが、実行の準備ができているかを判定し、実行モジュールに発行される準備のできている命令の１つを選択するように構成されたディスパッチ回路と
を含むマイクロプロセッサ。
【請求項２】
前記フェッチ回路が、第１の順序で前記命令バッファに命令をフェッチし、前記ディスパッチ回路が、前記第１の順序と異なる第２の順序で準備ができている命令を選択する請求項１に記載のマイクロプロセッサ。
【請求項３】
命令を記憶するように構成された命令キャッシュをさらに含み、前記フェッチ回路が、さらに、プログラム・カウンタ値を含む要求を前記命令キャッシュに送ることによって次の命令をフェッチするように構成される請求項１に記載のマイクロプロセッサ。
【請求項４】
前記フェッチ回路が
前記複数のスレッドのそれぞれの候補プログラム・カウンタ値を生成するように構成されたプログラム・カウンタ・ロジックと、
前記命令バッファの前記ストレージ・ロケーションのどれが使用可能であるかの判定に少なくとも部分的に基づいて前記複数のスレッドの１つを選択するように構成された選択論理回路であって、さらに、対応する選択信号を供給するように構成される選択論理回路と、
前記選択信号を受け取り、前記選択されたスレッドに対応する前記候補プログラム・カウンタ値を前記命令キャッシュに送るアービトレーション回路と
を含む請求項３に記載のマイクロプロセッサ。
【請求項５】
前記選択論理回路が、
優先順位制御信号に基づいて決定される、前記スレッドの間の優先順位ランキングに従って、前記複数のスレッドのうちで、前記命令バッファ内に命令を有しない１つを選択するように構成された優先順位エンコーダと、
前記優先順位制御信号を生成するように構成されたフェーズ・カウンタと
を含み、異なる時間に、前記優先順位制御信号が、前記スレッドの異なる１つに異なる優先順位ランキングを与える請求項４に記載のマイクロプロセッサ。
【請求項６】
前記選択論理回路が、さらに、第１スレッドの選択の前の発生から最小時間が経過した後に限って、前記第１スレッドを選択するように構成される請求項４に記載のマイクロプロセッサ。
【請求項７】
前記複数のスレッドが、第１スレッド・タイプを有するスレッドの第１グループと、第２スレッド・タイプを有するスレッドの第２グループを有し、前記選択論理回路が、さらに、各前記複数のスレッドのそれぞれのスレッド・タイプに少なくとも部分的に基づいて、前記複数のスレッドの１つを選択するように構成される請求項４に記載のマイクロプロセッサ。
【請求項８】
前記選択論理回路が、さらに、前記第１スレッド・タイプを有する第１候補スレッドと前記第２スレッド・タイプを有する第２候補スレッドを選択し、前記それぞれのスレッド・タイプに基づいて前記第１候補スレッドと前記第２候補スレッドとの間で選択するように構成される請求項７に記載のマイクロプロセッサ。
【請求項９】
前記実行モジュールによって生成される結果データを含む、前記複数のスレッドのそれぞれのデータを保持するように構成されたレジスタ・ファイルをさらに含む請求項１に記載のマイクロプロセッサ。
【請求項１０】
前記ディスパッチ回路が、
前記命令バッファと前記レジスタ・ファイルに結合され、前記命令バッファ内の各命令のレディ信号を生成するように構成されたスコアボード回路であって、各命令のレディ信号が、前記命令のソース・オペランドが前記レジスタ・ファイルに存在するかどうかに少なくとも部分的に基づいてアサートされるか、またはアサートされない、スコアボード回路と、
前記スコアボード回路と前記命令バッファに結合されたスケジューラ回路であって、前記レディ信号がアサートされている前記命令バッファ内の前記命令の１つを、次に発行される命令として選択し、対応する許可信号を前記命令バッファに送るように構成されるスケジューラ回路と、
前記命令バッファに結合されたイシュア回路であって、前記命令バッファが、さらに、前記許可信号に応答して、前記スケジューラ回路によって選択された前記命令を前記イシュア回路に送るように構成され、前記イシュア回路が、前記選択された命令の前記ソース・オペランドを前記レジスタ・ファイルから収集し、前記選択された命令と前記ソース・オペランドを前記実行モジュールに転送するように構成される、イシュア回路と
を含む請求項９に記載のマイクロプロセッサ。
【請求項１１】
前記スケジューラ回路が、さらに、各命令が前記命令バッファに記憶されていた時間の長さに少なくとも部分的に基づいて、次に発行される命令を選択するように構成される請求項１０に記載のマイクロプロセッサ。
【請求項１２】
前記スケジューラ回路が、
前記レディ信号がアサートされている前記命令バッファ内の命令を有する、前記複数のスレッドのうちの１つを選択するように構成された優先順位エンコーダであって、前記スレッドの前記１つが、前記スレッドの間での優先順位ランキングに従って選択され、前記優先順位ランキングが優先順位制御信号に基づいて決定される、優先順位エンコーダと、
前記優先順位制御信号を生成するように構成されたフェーズ・カウンタと
を含み、異なる時間に、前記優先順位制御信号が、前記スレッドの異なる１つに異なる優先順位ランキングを与える請求項１０に記載のマイクロプロセッサ。
【請求項１３】
前記複数のスレッドが、第１スレッド・タイプを有するスレッドの第１グループと第２スレッド・タイプを有するスレッドの第２グループを含み、前記スケジューラ回路が、さらに、各前記複数のスレッドのそれぞれのスレッド・タイプに少なくとも部分的に基づいて前記複数のスレッドの１つを選択するように構成される請求項１０に記載のマイクロプロセッサ。
【請求項１４】
前記スケジューラ回路が、さらに、各前記スレッドの前記それぞれの命令に関連する動作の間の相対優先順位に少なくとも部分的に基づいて、前記複数のスレッドの１つを選択するように構成される請求項１０に記載のマイクロプロセッサ。
【請求項１５】
前記実行モジュールが複数の実行パイプを含み、前記スケジューラ回路が、さらに、前記複数の実行パイプのどれが使用中でないかの判定に少なくとも部分的に基づいて前記複数のスレッドの１つを選択するように構成される請求項１０に記載のマイクロプロセッサ。
【請求項１６】
それぞれが命令のシーケンスを含む複数のスレッドを並列処理するように構成されたマイクロプロセッサで命令を処理する方法であって、
前記複数のスレッドのそれぞれからの命令を記憶するように構成された命令バッファに、前記複数のスレッドの第１の１つからの第１命令をフェッチするステップと、
その後、前記命令バッファに、前記複数のスレッドの第２の１つからの第２命令をフェッチするステップと、
前記第１命令と前記第２命令のうちの１つまたは複数が実行の準備ができているかどうかを判定するステップと、
実行のために前記第１命令と前記第２命令の準備ができている１つを発行するステップと
を含み、前記第２命令が実行の準備ができており、前記第１命令が実行の準備ができていない場合に、前記第１命令を発行する前に、前記第２命令が発行される方法。
【請求項１７】
発行の前記動作の後に、前記発行された命令が前記第１スレッドまたは前記第２スレッドのどちらのためにフェッチされたかを判定する動作と、
前記発行された命令に対応する前記スレッド内の次の命令である第３命令を、前記命令バッファにフェッチする動作と
をさらに含む請求項１６に記載の方法。
【請求項１８】
前記第１命令をフェッチする前記動作が、
前記複数のスレッドのそれぞれから候補プログラム・カウンタ値を受け取る動作と、
前記複数のスレッドのそれぞれに優先順位ランキングを割り当てる動作であって、前記優先順位ランキングが、異なる時間に異なる動作と、
前記第１スレッドが、命令が前記命令バッファに記憶されていない最高優先順位のスレッドである場合に、前記複数のスレッドの中から前記第１スレッドを選択する動作と
を含み、前記第１命令が、前記第１スレッドの選択に応答してフェッチされる請求項１６に記載の方法。
【請求項１９】
前記第１スレッドの選択の前の発生からの経過時間が最小時間未満である場合に、前記第１スレッドの選択の前記動作を抑止する動作をさらに含む請求項１８に記載の方法。
【請求項２０】
前記複数のスレッドが、第１スレッド・タイプを有するスレッドの第１グループと第２スレッド・タイプを有するスレッドの第２グループを含み、前記第１スレッドが、スレッドの前記第１グループの１つであり、前記第１命令をフェッチする前記動作が、
前記複数のスレッドのそれぞれから候補プログラム・カウンタ値を受け取る動作と、
スレッドの前記第１グループのそれぞれに優先順位ランキングを割り当てる動作であって、前記優先順位ランキングが、異なる時間に異なる動作と、
前記第１スレッドが、命令が前記命令バッファに記憶されていない前記第１グループの最高優先順位のスレッドである場合に、スレッドの前記第１グループの中から前記第１スレッドを選択する動作と、
スレッドの前記第２グループの中から第３スレッドを選択する動作と、
前記第１スレッドと前記第３スレッドのそれぞれのスレッド・タイプに少なくとも部分的に基づいて、前記第１スレッドと前記第３スレッドの１つを選択する動作と
を含み、選択する前記動作が、前記第１スレッドを選択することになった場合に、前記第１命令がフェッチされる請求項１６に記載の方法。
【請求項２１】
判定する前記動作が、
前記第１命令のソース・オペランドが使用可能であるかどうかを判定する動作と、
前記第２命令のソース・オペランドが使用可能であるかどうかを判定する動作と
を含む請求項１６に記載の方法。
【請求項２２】
異なる時間に異なる優先順位ランキングを、前記複数のスレッドのそれぞれに割り当てること
をさらに含み、前記第１命令と前記第２命令の両方が、実行の準備ができている場合に、前記第１命令と前記第２命令の準備のできている１つを選択する前記動作が、前記第１スレッドと前記第２スレッドのどちらがより高い優先順位を有するかを判定する動作を含む請求項１６に記載の方法。
【請求項２３】
前記第１スレッドが、第１スレッド・タイプを有し、前記第２スレッドが、第２スレッド・タイプを有し、前記第１命令と前記第２命令の両方が実行の準備ができている場合に、前記第１命令の準備ができている１つを選択する前記動作が、それぞれのスレッド・タイプに少なくとも部分的に基づいて前記第１命令と前記第２命令との間で選択することを含む請求項１６に記載の方法。
【請求項２４】
複数の実行コアを含むグラフィックス・プロセッサと、
前記グラフィックス・プロセッサに結合されたグラフィックス・メモリと
を含むグラフィックス処理システムであって、
前記複数の実行コアのそれぞれが、
複数のスレッドのすべてに関する命令を実行するように構成された実行モジュールと、
前記複数のスレッドのそれぞれの１つに関連する複数のストレージ・ロケーションを含む命令バッファと、
前記命令バッファ内の前記関連するストレージ・ロケーションが使用可能であるかどうかに少なくとも部分的に基づいて前記複数のスレッドの１つを選択し、前記複数のスレッドの前記選択された１つのシーケンス内の次の命令を前記命令バッファにフェッチするように構成されたフェッチ回路と、
前記命令バッファ内の前記記憶された命令のどれが実行の準備ができているかを判定し、前記実行モジュールに発行される、前記準備のできている命令の１つを選択するように構成されたディスパッチ回路と
を含む、グラフィックス処理システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一般にマルチスレッド式マイクロプロセッサに関し、詳細には、スレッドの間の順序に無関係に、マルチスレッド式マイクロプロセッサで実行される命令のディスパッチに関する。
【背景技術】
【０００２】
ビデオ・ゲーム創作者、シミュレーション作成者、その他のプログラム設計者の必要を満たすために、洗練されたグラフィックス・コプロセッサが、さまざまなコンピュータ・システム用に開発されてきた。これらのプロセッサは、一般に、汎用中央処理装置または他のマスタ・プロセッサの制御の下で動作するが、通常は、標準的なラスタベースのディスプレイ・デバイスで表示できる画像の画素への、シーン・データの変換を実行するように最適化されている。一般的な構成で、グラフィックス・プロセッサは、「ジオメトリ・データ」を与えられ、このジオメトリ・データには、通常は、レンダリングされるシーン内のオブジェクトを表すプリミティブ（たとえば、線、三角形、または他の多角形）の組と、テクスチャ、ライティング・モデルなどの追加データが含まれる。グラフィックス・プロセッサは、ジオメトリ・データに対してモデリング変換、視点変換、透視変換、ライティング変換、その他の類似する変換を実行する（このステージを、しばしば「バーテックス」処理と称する）。これらの変換の後に、「画素」処理が開始される。画素処理中に、ジオメトリ・データがラスタ・データに変換され、このラスタ・データには、一般に、可視区域に対応するアレイ内の各サンプル位置のカラー値やその他の情報が含まれており、テクスチャ・ブレンディングやダウンフィルタリング（ディスプレイ・デバイスの画素の数に対応するようにサンプル位置の数を減らすこと）を含むさらなる変換を、ラスタ・データに適用する。最終的な結果が、ディスプレイ・デバイスに供給できるカラー値の組である。
【０００３】
滑らかなアニメーションとリアルタイム応答を提供するために、グラフィックス・プロセッサは、一般に、新しいフレームの画素データに関するオペレーションを約３０Ｈｚの最低速度で完了しなければならない。画像が、より現実的（より多くのプリミティブ、より詳細なテクスチャなど）になるにつれて、グラフィックス・プロセッサに対する性能の要求が高まる。
【０００４】
これらの要求を満たすために、一部の既存グラフィックス・プロセッサは、並列性を利用するマルチスレッド式アーキテクチャを実装している。一例として、バーテックス処理中に、同一のオペレーションが、通常はバーテックスごとに実行され、同様に、画素処理中に、同一のオペレーションが、サンプル位置または画素位置ごとに実行される。さまざまなバーテックス（または画素）に対するオペレーションは、他のバーテックス（画素）に対するオペレーションと独立になる傾向があり、したがって、各バーテックス（画素）を、共通のプログラムを実行する別々のスレッドとして処理することができる。共通のプログラムは、グラフィックス・プロセッサの実行コア内の実行ユニットに命令のシーケンスを供給し、所与の時に、異なるスレッドが、プログラム・シーケンスの異なる点にある可能性がある。命令の実行時間（本明細書ではレイテンシと称する）は、１クロック・サイクルより長い場合があるので、実行ユニットは、一般に、パイプライン化された形で実施され、その結果、第２の命令が、終了していない命令の実行から生じるデータを必要としない限り、第２の命令を、前のすべての命令が完了する前に発行できるようになる。
【０００５】
そのようなプロセッサでは、実行コアが、一般に、異なるアクティブ・スレッドについて実行される命令をラウンドロビン式にフェッチし（すなわち、第１スレッドからの１つの命令、次に第２スレッドからの命令、など）各フェッチされた命令を発行制御回路に順次提示するように設計されている。発行制御回路は、ソース・データが使用可能になり、実行ユニットの準備ができるまで、フェッチされた命令を保持し、その後、実行ユニットに発行する。スレッドは独立なので、ラウンドロビン発行によって、命令がまだ実行中の命令の結果に依存する可能性が減る。したがって、あるスレッドの命令のレイテンシを、別のスレッドからの命令のフェッチと発行によって隠蔽することができる。たとえば、通常の命令は、２０クロック・サイクルのレイテンシを有する可能性があるが、これは、コアが２０個のスレッドをサポートするならば、隠蔽することができる。
【０００６】
しかし、ラウンドロビン発行は必ずしもレイテンシを隠蔽しない。たとえば、画素処理プログラムに、システム・メモリからテクスチャ・データをフェッチする命令が含まれることが多い。そのような命令は、非常に長いレイテンシ（たとえば、１００クロック・サイクル以上）を有する場合がある。テクスチャ・フェッチ命令が、第１スレッドについて発行された後に、発行制御回路は、テクスチャ・データを要求する第１スレッドからの命令に来るまで、命令（テクスチャ・フェッチ命令に依存しない第１スレッドからの後続命令を含む）の発行を継続することができる。テクスチャ・データを要求する第１スレッドからの命令は、テクスチャ・フェッチ命令が完了するまで発行することができない。したがって、発行制御回路は、命令の発行を停止し、テクスチャ・フェッチ命令の完了を待ち、その後に命令の発行を再開する。したがって、実行パイプラインに「バブル」が生じる可能性があり、これは、実行ユニットのアイドル時間、さらにはプロセッサ内の非効率性につながる。
【０００７】
この非効率性を減らす１つの形が、コアによって並列に実行できるスレッドの数を増やすことによるものである。しかし、これは、各スレッドが追加の回路を必要とするので、高価な解決策である。たとえば、この並列設計で発生する頻繁なスレッド切替に対処するために、各スレッドに、一般に、それ自体の専用のデータ・レジスタの組を用意する。スレッドの数を増やすことによって、必要なレジスタの数が増え、これによって、プロセッサ・チップのコスト、設計の複雑さ、全体的なチップ面積が大幅に増える可能性がある。複数スレッドをサポートする他の回路や、各スレッドのプログラム・カウンタを維持するたとえばプログラム・カウンタ制御ロジックも、スレッドの数が増えるに連れて、より複雑になり、より多くの面積を消費する。
【発明の開示】
【発明が解決しようとする課題】
【０００８】
したがって、チップ面積の実質的な増加を必要としない、実行パイプライン内のバブルの発生を効果的かつ効率的に減らす実行コア・アーキテクチャを提供することが望ましい。
【課題を解決するための手段】
【０００９】
本発明の実施態様は、スレッドの間の順序によって制約されない形でマルチスレッド式マイクロプロセッサ（グラフィックス・プロセッサなど）で命令をディスパッチするシステムと方法を提供する。命令が、スレッドのそれぞれからの命令を記憶するように構成された命令バッファにフェッチされる。ディスパッチ回路が、命令バッファのどの命令が実行の準備ができているかを判定し、準備のできた命令を発行することができ、任意の１つのスレッドからの命令を、別のスレッドからの命令の前に、どちらの命令が先にバッファにフェッチされたかに無関係に、発行することができる。特定のスレッドからの命令が発行されたならば、フェッチ回路は、そのスレッドからの次の命令によって、使用可能なバッファ・ロケーションを充てんすることができる。
【００１０】
本発明の態様によれば、各スレッドに命令のシーケンスが含まれる、複数のスレッドの並列処理のために構成されたマイクロプロセッサが提供される。このマイクロプロセッサには、実行モジュール、命令バッファ、フェッチ回路、およびディスパッチ回路が含まれる。実行モジュールは、すべてのスレッドの命令を実行するように構成される。命令バッファには、スレッドのそれぞれの１つに関連する複数のストレージ・ロケーションが含まれている。フェッチ回路は、命令バッファ内の関連するストレージ・ロケーションが使用可能であるかどうかに少なくとも部分的に基づいてスレッドの１つを選択し、スレッドの選択された１つのシーケンス内の次の命令を、命令バッファにフェッチするように構成される。ディスパッチ回路は、命令バッファに記憶された命令のどれが実行の準備ができているかを判定し、実行ユニットに発行するために、準備のできている命令の１つを選択するように構成される。フェッチ回路は、第１の順序で命令バッファに命令をフェッチすることができ、ディスパッチ回路は、第１の順序と異なる第２の順序で準備のできた命令を選択することができる。
【００１１】
いくつかの実施態様で、マイクロプロセッサに、命令を記憶するように構成された命令キャッシュも含まれ、フェッチ回路を、さらに、プログラム・カウンタ値を含む要求を命令キャッシュに送ることによって次の命令をフェッチするように構成することができる。フェッチ回路に、プログラム・カウンタ・ロジック、選択論理回路、アービトレーション回路を含めることができる。プログラム・カウンタ・ロジックは、スレッドのそれぞれの候補プログラム・カウンタ値を生成するように構成される。選択論理回路は、命令バッファ内のストレージ・ロケーションのどれが使用可能であるかの判定に少なくとも部分的に基づいてスレッドの１つを選択するように構成され、選択論理回路は、さらに、対応する選択信号を供給するように構成される。アービトレーション回路は、選択信号を受け取り、選択されたスレッドに対応する候補プログラム・カウンタ値を命令キャッシュに送るように構成される。もう１つの実施態様では、スレッドに、第１スレッド・タイプを有するスレッドの第１グループと、第２スレッド・タイプを有するスレッドの第２グループを含めることができる。選択論理回路を、さらに、各スレッドのそれぞれのスレッド・タイプに少なくとも部分的に基づいてスレッドの１つを選択するように構成することができる。
【００１２】
他の実施態様で、マイクロプロセッサに、実行モジュールによって生成される結果データを含む、スレッドのそれぞれのデータを記憶するように構成されたレジスタ・ファイルも含めることができる。ディスパッチ回路に、スコアボード回路、スケジューラ回路、イシュア回路が含まれる。スコアボード回路は、命令バッファとレジスタ・ファイルに結合され、命令バッファ内の命令ごとにレディ信号を生成するように構成され、各命令のレディ信号は、命令のソース・オペランドがレジスタ・ファイルに存在するかどうかに少なくとも部分的に基づいてアサートされるかアサートされない。スケジューラ回路は、スコアボードと命令バッファに結合され、レディ信号がアサートされている命令バッファ内の命令の１つを次に発行される命令として選択し、対応する許可信号を命令バッファに送るように構成される。イシュア回路は、命令バッファに結合され、命令バッファは、さらに、許可信号に応答して、スケジューラ回路によって選択された命令をイシュア回路に送るように構成される。イシュア回路は、選択された命令のソース・オペランドをレジスタ・ファイルから収集し、選択された命令とソース・オペランドを実行モジュールに転送するように構成される。もう１つの実施態様では、スケジューラ回路が、さらに、各命令が命令バッファに記憶されていた時間の長さに少なくとも部分的に基づいて、次に発行される命令を選択するように構成される。
【００１３】
本発明のもう１つの態様によれば、複数スレッドの並列実行のために構成されたマイクロプロセッサ内で命令を処理する方法が提供される。スレッドの第１の１つからの第１命令が、スレッドのそれぞれからの命令を記憶するように構成された命令バッファにフェッチされる。その後、複数のスレッドの第２の１つからの第２命令が、命令バッファにフェッチされる。第１命令と第２命令の１つまたは複数が、実行の準備ができているかどうかが判定され、第１命令と第２命令のうちの準備のできた１つが実行のために発行される。第２命令は、第２命令が実行の準備ができており、第１命令が実行の準備ができていない場合に、第１命令を選択する前に選択される。
【発明を実施するための最良の形態】
【００１４】
以下の詳細な説明は、添付図面と共に、本発明の性質および長所のよりよい理解を提供する。
【００１５】
本発明の実施形態は、マルチスレッド式マイクロプロセッサ（たとえばグラフィックス・プロセッサ）でスレッド順序に依存しない命令ディスパッチを可能にするシステムと方法を提供する。命令は、スレッドのそれぞれからの命令を記憶するように構成された命令バッファにフェッチされる。ディスパッチ回路が、命令バッファ内のどの命令が実行の準備ができているかを判定し、準備ができている命令をどれでも発行することができ、あるスレッドからの命令を、別のスレッドからの命令の前に、どちらの命令がバッファに先にフェッチされたかに無関係に発行することができる。特定のスレッドからの命令が発行されたならば、フェッチ回路が、そのスレッドからの次の命令によって使用可能なバッファ・ロケーションを充てんする。その結果、ブロックされたスレッドに起因する実行パイプラインのアイドル時間を減らすことができる。たとえば、スレッドの１つがブロックされる（次の命令が、完了していない命令に依存するので）場合に、プロセッサは、その時間中に、他のスレッドのいずれかからの任意の個数の命令の発行を継続することができる。
【００１６】
図１は、本発明の実施形態によるコンピュータ・システム１００のブロック図である。コンピュータ・システム１００には、バス１０６を介して通信する中央処理装置（ＣＰＵ）１０２とシステム・メモリ１０４が含まれる。ユーザ入力が、バス１０６に結合された１つまたは複数のユーザ入力デバイス１０８（たとえば、キーボード、マウス）から受け取られる。視覚出力が、システム・バス１０６に結合されたグラフィックス処理サブシステム１１２の制御下で動作する画素ベースのディスプレイ・デバイス１１０（たとえば、普通のＣＲＴまたはＬＣＤベースのモニタ）に供給される。システム・ディスク１２８および、１つまたは複数の取外し可能ストレージ・デバイス１２９（たとえば、フロッピ・ディスク・ドライブ、コンパクト・ディスク（ＣＤ）ドライブ、および／またはＤＶＤドライブ）などの他のコンポーネントも、システム・バス１０６に結合させることができる。システム・バス１０６は、ＰＣＩ（Peripheral Component Interconnect）、ＡＧＰ（Accelerated Graphics Port）および／またはＰＣＩ−Ｅｘｐｒｅｓｓ（ＰＣＩ−Ｅ）を含むさまざまなバス・プロトコルの１つまたは複数を使用して実装することができ、普通のノース・ブリッジとサウス・ブリッジ（図示せず）などの適切な「ブリッジ」チップを設けて、さまざまなコンポーネントおよび／またはバスを相互接続することができる。
【００１７】
グラフィックス処理サブシステム１１２には、グラフィックス処理ユニット（ＧＰＵ）１１４、グラフィックス・メモリ１１６、スキャンアウト制御ロジック１２０が含まれ、スキャンアウト制御ロジック１２０を、たとえばプログラマブル・プロセッサおよび／または特定用途向け集積回路（ＡＳＩＣ）などの１つまたは複数の集積回路デバイスを使用して実装することができる。ＧＰＵ  １１４を、システム・バス１０６を介して供給されるグラフィックス・データからの画素データの生成、画素データの記憶や更新のためのグラフィックス・メモリ１１６との相互作用など、さまざまなタスクを実行するように構成することができる。ＧＰＵ  １１４の関連する特徴を、下でさらに説明する。
【００１８】
スキャンアウト制御ロジック１２０は、グラフィックス・メモリ１１６（または、いくつかの実施形態で、システム・メモリ１０４）からデータを読み取り、表示されるデータをディスプレイ・デバイス１１０に転送する。一実施形態で、スキャンアウトは、一定のリフレッシュ・レート（たとえば８０Ｈｚ）で行われる。そのリフレッシュ・レートは、ユーザ選択可能パラメータとすることができる。スキャンアウト制御ロジック１２０は、特定のディスプレイ・ハードウェアに関するカラー値の調整、画素データを、たとえばグラフィックス・メモリ１１６、システム・メモリ１０４、または別のデータ・ソース（図示せず）から得られるビデオ画像、カーソル・オーバーレイ画像または類似物と組み合わせることによるコンポジット・スクリーン画像の生成、ディジタル画素データのディスプレイ・デバイス用のアナログ信号への変換など、他のオペレーションを実行することもできる。グラフィックス処理サブシステム１１２の特定の構成が、本発明にクリティカルでないことを理解されたい。
【００１９】
システム１００のオペレーション中に、ＣＰＵ  １０２は、オペレーティング・システム（ＯＳ）プログラム、アプリケーション・プログラム、グラフィックス処理サブシステム１１２のドライバ・プログラムなど、さまざまなプログラムを実行する。これらのプログラムは、一般に従来の設計を有するものでよい。たとえば、グラフィックス・ドライバ・プログラムは、グラフィックス処理サブシステム１１２との通信に、ＯｐｅｎＧＬ、Ｍｉｃｒｏｓｏｆｔ  ＤｉｒｅｃｔＸ、またはＤ３Ｄなどの１つまたは複数の標準的なアプリケーション・プログラム・インターフェース（ＡＰＩ）を実現することができ、任意の数または組合せのＡＰＩをサポートすることができ、いくつかの実施形態で、別々のドライバ・プログラムを提供して、異なるＡＰＩを実現することができる。適切なＡＰＩ機能呼出しを呼び出すことによって、オペレーティング・システム・プログラムおよび／またはアプリケーション・プログラムが、システム・バス１０６を介してグラフィックス処理サブシステム１１２にグラフィックス・データまたは画素データを転送し、ＧＰＵ  １１４のさまざまなレンダリング機能を呼び出すようにグラフィックス・ドライバ・プログラムに指示する。ＡＰＩ機能呼出しに応答してグラフィックス・ドライバ・プログラムによってグラフィックス処理サブシステム１１２に送られる特定のコマンドおよび／またはデータは、ＧＰＵ  １１４の実施形態に応じて変わる可能性があり、グラフィックス・ドライバ・プログラムは、オペレーティング・システムまたはアプリケーション・プログラムによって制御されない追加機能性（たとえば、特殊なビジュアル・エフェクト）を実現するコマンドおよび／またはデータを送ることもできる。
【００２０】
本発明の実施形態によれば、ＧＰＵ  １１４は、多数のスレッドの並列処理用に構成され、各スレッドは、処理命令の独立のシーケンスに対応する。ＧＰＵ  １１４は、任意の所与の時に、スレッドの任意の１つからの次の命令を実行することができる。
【００２１】
たとえば、画像の各バーテックスを別々のスレッドを使用して処理することができ、並列スレッドが、画像の異なるデータに対して同一の処理プログラムを実行し、所与の時に、スレッドの異なる１つがプログラムの異なる点にいることができる。いくつかの実施形態で、複数のスレッド・タイプがある場合があり、１タイプのすべてのスレッドが同一の処理プログラムを実行し、異なるタイプのスレッドが異なる処理プログラムを実行する。たとえば、その処理プログラムにジオメトリ変換とライティング変換が含まれる「バーテックス」スレッド・タイプと、その処理プログラムにテクスチャ・ブレンディングとオーバーサンプリングされたデータのダウンフィルタリングが含まれる「画素」スレッド・タイプがあってもよい。
【００２２】
図１の実施形態では、ＧＰＵ  １１４に、複数の独立の実行コア１１８が含まれ、実行コア１１８のそれぞれは、複数のスレッド（図示せず）から受け取る命令を処理するように構成される。ＧＰＵ  １１４によってサポートされる並列スレッドの最大個数は、コア１１８の個数に、１コアあたりのスレッドの数をかけたものであり、たとえば、一実施形態で、８つのコア１１８があり、各コアが１６個までのスレッドをサポートし、合計１２８個の並列に実行されるスレッドがある。コアの数とスレッドの数は変更することができ、たとえば、それぞれが２４個のスレッドをサポートする８つのコア（合計１９２個のスレッド）を設けることができ、それぞれが２４個のスレッドをサポートする１０個のコア（合計２４０個のスレッド）を設けることもできる。
【００２３】
各実行コア１１８に、命令キャッシュ１３２、命令フェッチ回路１３６、バッファ１３８、ディスパッチ回路１４０、実行ユニットの組（図示せず）を含む実行モジュール１４２、レジスタ・ファイル１４４が含まれる。命令キャッシュ（Ｉｃａｃｈｅ）１３２は、一般に普通の設計とすることができ、たとえばグラフィックス・メモリ１１６から入手される実行可能命令を記憶する。Ｉｃａｃｈｅ  １３２内の各命令は、プログラム・カウンタ（ＰＣ）値を使用して識別することができる。フェッチ回路１３６は、実行コア１１８によって処理されるすべてのスレッドに関する命令をＩｃａｃｈｅ  １３２からフェッチし、各スレッド内のシーケンシャル・プログラムの順序を維持し、フェッチされた命令をバッファ１３８に供給する。各クロック・サイクルに、ディスパッチ回路１４０は、実行モジュール１４２に発行される命令をバッファ１３８から選択する。
【００２４】
一実施形態で、バッファ１３８は、スレッドごとに少なくとも１つの命令を記憶し、各スレッドのシーケンシャル・プログラム順序を維持するように構成される。各クロック・サイクルに、ディスパッチ回路１４０は、実行のためにバッファ１３８から命令の１つを選択し、ソース・オペランドをレジスタ・ファイル１４４から入手し、命令とオペランドを、実行のために実行モジュール１４２に転送する。ディスパッチ回路１４０は、有利なことに、バッファ１３８内のどの命令が、レジスタ・ファイル１４４で使用可能なソース・オペランドを有するかに基づいて、次に実行される命令を選択し、どのスレッドが選択された命令のソースであるかに無関係に命令を選択することができる。フェッチ回路１３６は、バッファ１３８を監視し、特定のスレッドの命令がバッファ１３８から発行された後に、そのスレッドの次の命令をフェッチする。その結果、所与のクロック・サイクルに、アクティブ・スレッドのほとんどまたはすべてからの命令を、バッファ１３８内で使用可能にすることができ、ディスパッチ回路１４０が、どのスレッドが最後に選択されたか無関係に、任意のスレッドからの命令を選択することができる。フェッチ回路１３６、バッファ１３８、ディスパッチ回路１４０の具体的な実施形態を下で説明する。
【００２５】
実行モジュール１４２は、一般に、普通の設計とすることができ、実行モジュール１４２に、任意の個数の個々の実行ユニットを含めることができる。実行ユニットの一部またはすべてを、当技術分野で既知のように、単一命令複数データ（ＳＩＭＤ）動作用に構成することができる。実行モジュール１４２は、命令とそのソース・オペランドをディスパッチ回路１４０から受け取り、命令に従ってソース・オペランドを処理し、結果データをレジスタ・ファイル１４４に記憶する。レジスタ・ファイル１４４には、実行コア１１８によって処理されるスレッドごとに別々のレジスタの組が含まれるのが望ましく、これによって、あるスレッドから別のスレッドに切り替える時に、レジスタとの間でデータをスワップする必要がなくなる。レジスタ・ファイル１４４に書き込まれるデータは、後続命令のソース・オペランドとして使用可能になる。命令は、性質において異なる可能性があり、命令には、任意の個数のソース・オペランドと任意の量および／または種類の結果データを含めることができる。
【００２６】
各命令は、一般に、それに関連するあるレイテンシを有する。すなわち、実行モジュール１４２の実行ユニットは、命令を処理し、結果データをレジスタ・ファイル１４４に書き込むのに、ある数のクロック・サイクル（１つまたは複数になる場合がある）を必要とする。異なる命令は異なるレイテンシを有する。たとえば、単純なベクトル加算演算は、１つまたは２つのクロック・サイクルだけで完了するが、テクスチャ・フェッチオペレーションは、多数のサイクル（たとえば１００以上）を必要とする。実行モジュール１４２の実行ユニットは、レイテンシにかかわらずに各クロック・サイクルに命令をディスパッチできるようにするパイプライン式アーキテクチャで実装されるのが望ましく、そのようなアーキテクチャは、当技術分野で既知である。実行ユニットの異なる１つ（またはグループ）を、当技術分野で既知のように特定の命令の処理に特に適合させることができ、ディスパッチ回路１４０は、特定の命令を処理するために、実行モジュール１４２内の実行ユニットの適切な１つ（またはグループ）を選択することができる。
【００２７】
スレッドの命令は、そのスレッドの他の命令に対するデータ依存性を有する場合がある。すなわち、ある命令が、そのソース・オペランドとして前の命令の結果データを使用する場合がある。データ依存性を有する命令は、それが依存する命令からの結果データがレジスタ・ファイル１４４で使用可能になるまで実行することができない。そのようなデータ依存性を有する命令が、特定のスレッドの次の命令である場合に、そのスレッドはブロックされる。本発明の実施形態によれば、ディスパッチ回路１４０は、ブロックされたスレッドのブロックが解除されるのを待つのではなく、ブロックされたスレッドを検出し、異なるスレッド（ブロックされていなければどのスレッドにもすることができる）の次の命令を、次に発行するためにバッファ１３８から選択する。この形で、１スレッド内のレイテンシを、別のスレッドを実行することによって隠蔽することができ、その結果、ＧＰＵ  １１４の効率が改善される。
【００２８】
実行コア１１８の他に、ＧＰＵ  １１４に、システム・バス１０６を介して受け取られるコマンドを受け取り、これに応答する回路など、図１に示されていない他の特徴も含めることができ、そのような回路を、適宜、実行コア１１８内でスレッドを開始し、かつ／または終了するように構成することができる。さまざまな制御レジスタ、状況レジスタ、データ・キャッシュ、それらの類似物を、グローバルに、コアごとに、またはスレッドごとの基礎で設けることができる。そのような特徴は、当技術分野で既知であり、詳細な説明は、本発明の理解に重要ではないので省略する。
【００２９】
本明細書に記載のシステムが、例示的であり、変形形態や修正形態が可能であることを理解されたい。グラフィックス・プロセッサを、適切な技術、たとえば１つまたは複数の集積回路デバイスを使用して実装することができる。グラフィックス・プロセッサを、拡張カード（１つまたは複数のそのようなプロセッサを含めることができる）に取り付けるか、システム・チップセット（たとえばノース・ブリッジ・チップ）に統合することができる。グラフィックス処理サブシステムに、任意の量の専用グラフィックス・メモリを含めることができ（一部の実施形態は、専用グラフィックス・メモリを有しないことができる）、システム・メモリや専用グラフィックス・メモリを任意の組合せで使用することができる。
【００３０】
グラフィックス・プロセッサ内の実行コアの数は実装依存であり、最適の選択は、一般に、性能とコストの間のトレードオフに依存する。各実行コアは、１つまたは複数のスレッド・タイプの並列オペレーションをサポートすることができ、複数のコアが設けられる場合に、同一プロセッサ内の異なるコアを同一にまたは異なって構成することができる。コアは、実行ユニットを共用しない独立サブプロセッサとして実装されるのが有利であり、所与のスレッドが１つのコア内で実行される。
【００３１】
所与のコア内のスレッドの数も、特定の実施形態と隠蔽されるレイテンシの量に従って変更することができる。これに関して、いくつかの実施形態で、命令順序付けも使用して、あるレイテンシを隠蔽できることに留意されたい。たとえば、当技術分野で既知のように、グラフィックス・プロセッサ・コード用のコンパイラは、データを作成する第１命令と、そのデータを消費する第２命令がある場合に、第１命令によって作成されるデータを消費しない１つまたは複数の他の命令を、第１命令と第２命令の間に配置するように、プログラムの命令を配置するように最適化することができる。これによって、第１命令が実行されつつある間にスレッドの実行を継続できる。当技術分野では、長いレイテンシを有する命令について、通常、そのレイテンシを隠蔽するのに十分な独立の命令を、作成側と消費側の間に配置することが実用的でないことも既知である。コアごとのスレッドの数を判定する際に、そのような最適化の可用性（またはその欠如）を考慮することができ、たとえば、１つのコアによってサポートされるスレッドの数は、命令の最大レイテンシと、最大レイテンシの命令とその第１の依存命令との間にコンパイラが供給することを期待できる命令の平均（あるいは最小または最大）個数とに基づいて判断することができる。
【００３２】
実行コアの命令キャッシュは、スレッドの間で共用することができ、あるいは、スレッドの間で物理的にまたは論理的に分割することができる。さらに、コアが複数のスレッド・タイプをサポートする場合に、命令キャッシュに、各スレッド・タイプに対応する物理的および／または論理的分割を含めることができ、各分割を、さらに、望みに応じて、そのタイプの個々のスレッドの間で副分割する（またはしない）ことができる。
【００３３】
実行コアのレジスタ・ファイルに、スレッドごとのレジスタの組を含のが有利であり、実行コアのレジスタ・ファイルは、任意の個数の読取ポートおよび／または書込ポートを有することができる。さらに、物理的におよび／または論理的に別々のレジスタ・ファイルを異なるスレッドのために用意することができる。
【００３４】
フェッチ回路１３６、バッファ１３８、ディスパッチ回路１４０の構成も変更することができ、具体的な例を以下説明する。図２は、本発明の実施形態による実行コア１１８のフェッチ回路１３６とバッファ１３８の単純化されたブロック図である。この実施形態では、実行コア１１８が、スレッドの最大個数（Ｎ）までを並列に処理するように構成されるが、任意の所与の時に、Ｎ個のスレッドの一部またはすべてが、アイドルまたはインアクティブである可能性があることを理解されたい。
【００３５】
フェッチ回路１３６に、複数（Ｎ）のプログラム・カウンタ・ロジック・ブロック２０２と、選択論理回路２０６によって制御されるアービトレーション・ユニット２０４が含まれる（本明細書では、類似する物体の複数のインスタンスが、物体を識別する符号と、必要な場合にインスタンスを識別する括弧の中の番号によって示される）。
【００３６】
各プログラム・カウンタ・ロジック・ブロック２０２は、Ｎ個のスレッドのそれぞれの１つの次のシーケンシャル命令のプログラム・カウンタ（ＰＣ）値を生成する。プログラム・カウンタ・ロジック・ブロック２０２は、プログラム・カウンタを更新する一般的な普通の設計とすることができ、増分カウンタ、分岐検出ロジック、本発明にクリティカルでない他の特徴を含めることができる。
【００３７】
ＰＣロジック・ブロック２０２によって生成されるＰＣ値は、アービトレーション・ユニット２０４に提示され、アービトレーション・ユニット２０４は、選択論理回路２０６（下で説明する）によって供給される選択信号ＳＥＬｉに応答して、スレッドの１つ（本明細書では参照のためにスレッドｉと示す）からのＰＣ信号ＰＣｉ（０≦ｉ≦ｎ−１）を選択する。選択された信号ＰＣｉは、Ｉｃａｃｈｅ  １３２に送られ、Ｉｃａｃｈｅ  １３２は、対応する命令をバッファ１３８に返し、対応するスレッドの識別子（ｉ）がバッファ１３８に送られる。
【００３８】
バッファ１３８には、Ｎ個のストレージ・ロケーション２０８（たとえばレジスタを使用して実施することができる）が含まれ、その１つが、Ｎ個のスレッドのそれぞれに対応し、バッファ１３８には、Ｎ個の有効ビット（レジスタごとに１つ）を記憶するように構成されたアレイ２１０が含まれる。バッファ１３８は、Ｉｃａｃｈｅ  １３２から命令（ＩＮＳＴ）を受け取り、かつアービトレーション・ユニット２０４から対応するスレッドのスレッド識別子（ｉ）を受け取り、命令ＩＮＳＴをスレッドｉに対応するロケーション２０８の１つに向ける。命令が記憶される時に、アレイ２１０内の対応する有効ビットに、論理真（たとえば「１」）がセットされる。
【００３９】
バッファ１３８は、ディスパッチ回路１４０が、ストレージ・ロケーション２０８の１つから、発行される命令を選択でき、その結果、異なるスレッドからの命令を任意の順序で発行できるように構成されることが望ましい。ディスパッチ回路１４０は、下で説明する。ここでは、特定のスレッドの命令が発行される時に、アレイ２１０の対応する有効ビットに、論理偽（たとえば「０」）がセットされることに留意されたい。本明細書で使用する「有効なスレッド」は、ストレージ・ロケーション２０８に有効な命令を有するスレッドであり、「無効なスレッド」は、そうでないスレッドである。
【００４０】
図２からわかるように、選択論理回路２０６は、バッファ１３８からアレイ２１０の有効ビットを受け取る。命令がフェッチされるスレッドｉを選択する際に、選択論理回路２０６が各スレッドの有効性または無効性を使用する。たとえば、選択論理回路２０６を、有効なスレッドだけを選択するように構成することができ、複数のスレッドが無効である場合に、選択論理回路２０６は最も長く無効であったスレッドを選択することができ、あるいは、スレッドの間の優先順位ランキングに基づいてスレッドを選択することができ、この優先順位ランキングは、あるクロック・サイクルと次のクロック・サイクルの間で変化する。
【００４１】
選択論理回路２０６に、たとえば１つのスレッドが不釣り合いにリソースを消費しないようにするために、特定のスレッドを選択できる頻度を制限するルールも含めることができる。たとえば、あるルールによって、所与のスレッドが、最後に選択されてから少なくともＭクロック・サイクルが経過しなければ再選択の資格がないものとすることができ、このＭは、ある固定された数である（たとえば、プロセッサの構成可能なパラメータとして確立することができる）。そのようなルールが実装されると、どのスレッドも選択ルールを満足しないクロック・サイクルが生じる可能性がある（たとえば、唯一の無効なスレッドが、Ｍサイクル前以内に選択された）。その場合に、アービトレーション・ユニット２０４は、そのクロック・サイクルについてＰＣｉ値をＩｃａｃｈｅ  １３２に送らないことができ、次のＰＣｉ値は、満足なスレッドが見つかった時の後続サイクル中に送られる。そのような実施形態の１つで、クロック・サイクルごとに１つのスレッドが選択されると、Ｍに、所与の時にアクティブであると期待されるスレッドの最小個数を超えない値がセットされ、これによって、スレッドが選択されないクロック・サイクルの可能性が減る。
【００４２】
図３は、本発明の実施形態による、スレッド選択ルールを実現する選択論理回路３００の単純化されたブロック図である。選択論理回路３００には、優先順位エンコーダ３０２とフェーズ（またはトークン）カウンタ３０４が含まれる。各スレッドの有効（ｖａｌｉｄ）信号は、それぞれのインバータ３０６によって反転させられ、結果の／ｖａｌｉｄ信号が、優先順位エンコーダ３０２に供給される。優先順位エンコーダ３０２は、普通のディジタル論理回路を使用して実装することができるが、／ｖａｌｉｄ信号がアサートされている最高優先順位のスレッド（すなわち、最高優先順位の無効なスレッド）を選択する。スレッドの間の優先順位ランキングは、フェーズ・カウンタ３０４によって供給される制御信号（ＣＴＬ）に基づいて決定される。フェーズ・カウンタ３０４は、各クロック・サイクルに増分されるｍｏｄｕｌｏ  Ｎカウンタであり、制御信号ＣＴＬは、フェーズ・カウンタ３０４の現在の値に対応する。この実施形態では、制御信号ＣＴＬによって、最高優先順位スレッドのスレッド番号が決定され、優先順位エンコーダ３０２は、残りのスレッドを、スレッド番号のＮを法とする剰余の昇順（または降順）でランキングする。
【００４３】
フェーズ・カウンタ３０４は、各クロック・サイクルに増分されるので、スレッドの優先順位ランキングは、異なるクロック・サイクルについて異なる。たとえば、最初のクロック・サイクル中に、現在スレッド・カウンタ３０４は値０を有し、優先順位エンコーダ３０２はスレッド０に最高の優先順位を与える。言い換えると、最初のクロック・サイクル中に、スレッド０が無効である場合に、優先順位エンコーダ３０２は、スレッド０を選択するＳＥＬｉ信号の状態を生成する。スレッド０が有効である場合に、スレッド１が次に検討される。無効なスレッドが見つかるか、スレッドの最大個数（Ｎ以下とすることができる）が検討されるまで、これが行われる。次のクロック・サイクル中に、現在スレッド・カウンタ３０４は、値１を有し、優先順位エンコーダ３０２は、スレッド１に最高の優先順位を与え、スレッド１が有効である場合にスレッド２に最高の優先順位を与え、以下同様である。
【００４４】
スレッドが無効になったならば、そのスレッドは、次の命令がフェッチされるまで無効のままになる。したがって、選択論理回路３００は、所与のクロック・サイクルに、最も長い間無効であったスレッドが選択されることを保証しないが、無効になったスレッドのすべてが、無効になってからＮクロック・サイクル以内に選択されることを理解されたい。いくつかの実施形態で、優先順位エンコーダ３０２がクロック・サイクル中に検討するスレッドの最大個数Ｃをスレッドの総数Ｎより小さい数に制限することができる。これによって、あるスレッドが、連続するクロック・サイクルに選択されなくなり、スレッドを再選択できるようになる前のクロック・サイクルの最小数をＣの値を調整することによって制御することができる（いくつかの実施形態で、Ｃを、システムの構成可能なパラメータとすることができる）。
【００４５】
本明細書に記載の選択論理回路と選択ルールは例示的であり、変形形態や修正形態が可能であることを理解されたい。本明細書に記載のさまざまな回路コンポーネントは、普通のディジタル論理回路の設計と技術を使用して実現することができる。異なる論理回路を実装して、異なる選択ルールをサポートすることもできる。たとえば、クロック・サイクルごとに複数の命令をフェッチできる実施形態では、優先順位エンコーダを、クロック・サイクルごとに複数のスレッドを選択するように構成することができる。さらに、優先順位エンコーダ以外のデバイスを、選択される無効なスレッドの判定に使用することができる。たとえば、選択論理回路が、有効ビットの１つの論理真状態と論理偽状態の間の推移が検出される時に更新される、「最も以前に有効であった」ビット・フィールドを維持することができる。もう１つの実施形態では、カウンタまたは類似する回路を使用して、スレッドが無効になってからの経過時間および／またはスレッドが最後に選択されてからの経過時間を判定することができ、このカウンタ値に作用する比較ロジックを設けて、最も以前に有効であったスレッドを識別することができる。
【００４６】
さらに、選択ロジックに、選択時と対応する命令がバッファ１３８に現れた時の間にスレッドの選択を抑止する追加回路を含めることができる。たとえば、Ｉｃａｃｈｅミスの場合に、主命令ストア（または２次キャッシュ）から命令を取り出し、バッファ１３８に供給するのに複数のサイクルを要する場合がある。いくつかの実施形態で、たとえば、スレッド内の命令がバッファ１３８に供給されないようにし、かつ／またはプログラム順から外れて発行されないようにするために、この期間中のそのスレッドの再選択を抑止することが望ましい場合がある。フェッチ回路１３６が、ラウンド・ロビン式にスレッドを選択しないので、Ｉｃａｃｈｅミスに出会ったスレッドの命令のフェッチが抑止されている間に、他のスレッドからの命令をバッファ１３８にフェッチし続け、発行し続けることができることに留意されたい。したがって、本明細書に記載のいくつかの実施形態では、Ｉｃａｃｈｅミスの場合のパイプライン・バブルおよび非効率性が回避される。
【００４７】
複数のスレッド・タイプがサポートされる場合に、選択ロジックは、望みに応じてスレッド・タイプを考慮に入れるかそうしないことができる。たとえば、図２に示された実施形態では、スレッド・タイプに関する情報が選択論理回路２０６に供給されない。図４は、スレッド・タイプを考慮に入れる、本発明の代替実施形態によるフェッチ回路４００のブロック図である。この実施形態では、実行コアが、第１タイプ（「Ａ」）のＫ個までのスレッドと、第２タイプ（「Ｂ」）のＮ−Ｋ個までのスレッドを含めることができるＮ個のスレッドもサポートする。
【００４８】
タイプＡアービトレーション・ユニット４０２は、アクティブなタイプＡスレッド（参照のために０からＫ−１までの番号を付す）からのプログラム・カウンタ信号を受け取り、タイプＢアービトレーション・ユニット４０４は、アクティブなタイプＢスレッド（参照のためにＫ〜Ｎ−１までの番号を付す）からのプログラム・カウンタ信号を受け取る。タイプＡアービトレーション・ユニット４０２は、選択論理回路４０６からの選択信号に応答してタイプＡスレッドの１つを選択し、タイプＢアービトレーション・ユニット４０４は、選択論理回路４０８からの選択信号に応答してタイプＢスレッドの１つを選択する。一実施形態で、選択論理回路４０６、４０８のそれぞれの構成は、一般に、図３に関して上で説明したものに類似し、その結果、各選択論理回路４０６、４０８が、最も長い間無効であったそれぞれのタイプのスレッドを選択するが、他の構成と選択ルールも使用できることを理解されたい。上で説明したように、選択ルールに応じて、アービトレーション・ユニット４０２、４０４の１つ（または両方）がスレッドを選択しないクロック・サイクルが存在する場合がある。
【００４９】
選択論理回路４０６、４０８からの選択信号に応答して、タイプＡアービトレーション・ユニット４０２とタイプＢアービトレーション・ユニット４０４は、それぞれの選択されたプログラム・カウンタ値（ＰＣａ、ＰＣｂ）をグローバル・アービトレーション・ユニット４１０に供給する。アービトレーション・ユニット４０２、４０４は、選択されたそれぞれのスレッド（ａ、ｂ）も識別する。グローバル・アービトレーション・ユニット４１０は、スレッド・タイプ優先順位回路４１２によって生成されるタイプ選択信号（Ａ／Ｂ）に応答して、ＰＣａとＰＣｂの間で選択する。
【００５０】
スレッド・タイプ優先順位回路４１２は、スレッド・タイプＡとＢの間の所望の相対優先順位を定義するために、さまざまな形で構成することができる。一実施形態で、スレッド・タイプ優先順位回路４１２を、交番するクロック・サイクルにＰＣａとＰＣｂを選択することによって、両方に等しい優先順位を与えるように構成することができる。もう１つの実施形態で、スレッド・タイプ優先順位回路４１２が、２つの候補スレッドのうちで最も以前に有効であったものを選択することができる。
【００５１】
もう１つの実施形態で、スレッド・タイプ優先順位回路４１２は、静的または動的な「重要性」判断基準に基づいて、一方または他方のスレッド・タイプに優先順位を与える。さまざまな判断基準を使用することができる。たとえば、スレッド・タイプが、画素スレッドとバーテックス・スレッドに対応する場合に、バーテックス・スレッドに優先順位を与えることが望ましいことがある（たとえば、関連するバーテックス・スレッドの処理が完了するまで、ある画素スレッドを開始できない場合があるので）。したがって、１つの選択ルールを、必ず画素スレッドよりもバーテックス・スレッドを選択することとすることができる。もう１つの選択ルールは、ある数のバーテックスとその後のある数の画素の反復シーケンスとして定義することができる（たとえば、２バーテックスと１画素、３バーテックスと２画素、または、より一般的に、任意の整数νおよびρについて、νバーテックスとその後のρ画素）。重要性は、動的に定義することもでき、たとえば、現在アクティブであるか現在処理を待っているバーテックス・スレッドおよび／または画素スレッドの数に依存することができる。スレッド・タイプ優先順位回路４１２の選択ルールは、特定のシステム実施形態に関する最適化をサポートするように、構成可能にすることができる。
【００５２】
グローバル・アービトレーション・ユニット４１０は、実質的に上で説明したように、タイプ選択信号Ａ／Ｂに基づいてＰＣａとＰＣｂの間で選択し、選択されたプログラム・カウンタ値（ＰＣｉ）をＩｃａｃｈｅ  １３２に供給する。いくつかの実施形態で、タイプ選択信号Ａ／Ｂは、時々、タイプ固有アービタ４０２（４０４）によってスレッド・タイプＡ（Ｂ）が選択されないクロック・サイクル中にスレッド・タイプＡ（またはＢ）を指定することができる。グローバル・アービトレーション・ユニット１１０を、この場合にＰＣｂ（ＰＣａ）を選択するか、スレッドを選択しない（すなわち、ＰＣｉをＩｃａｃｈｅ  １３２に送らない）ように構成することができる。
【００５３】
本明細書に記載のフェッチ回路とバッファは例示的であり、変形形態や修正形態が可能であることを理解されたい。異なるスレッド（または異なるスレッド・タイプ）が、物理的にまたは論理的に別々の命令キャッシュを有する場合に、フェッチ回路を、選択されたＰＣ値を適切なキャッシュに向けるように構成することができ、あるいは、適切なキャッシュを選択するのに使用できるスレッド（またはスレッド・タイプ）識別子を供給するように構成することができる。バッファは、たとえばスレッドごとにＦＩＦＯレジスタを設けることによってスレッドごとに複数の命令のストレージを提供することができ、フェッチ回路は、ＦＩＦＯのそれぞれの無効なまたは未使用のエントリの数に基づいて、次にフェッチされるスレッドを選択することができる。
【００５４】
いくつかの実施形態で、フェッチ回路は、命令発行の前に、特定のレベルまでバッファを事前に充てんする必要がない。その代わりに、バッファは、データ依存性や同様のものに起因して命令発行がクロック・サイクルをスキップする時に、自然に充てんされるようにすることができる。フェッチ回路のスレッド選択ロジックは、スレッドの命令を記憶する空間がバッファ内に存在する時に限ってスレッドを選択するように構成され、これによって、バッファ・オーバーフローが回避される。
【００５５】
図５は、本発明の実施形態によるディスパッチ回路１４０の単純化されたブロック図である。ディスパッチ回路１４０に、スコアボード回路５０２、スケジューラ５０４、発行回路（またはイシュア）５０６が含まれる。スコアボード回路５０２は、一般に普通の設計とすることができ、バッファ１３８内の（有効な）命令のそれぞれを読み取る。命令ごとに、スコアボード回路５０２は、レジスタ・ファイル１４４を検査して、ソース・オペランドが使用可能であるかどうかを判定する。スコアボード回路５０２は、バッファ１３８内のどの命令が実行の準備ができているかどうか、すなわち、ソース・オペランドがレジスタ・ファイル１４４で使用可能であるかどうかを示すレディ信号の組（スレッドごとに１ビット）を生成する。スケジューラ５０４は、スコアボード回路５０２からレディ（ｒｅａｄｙ）信号を受け取り、かつバッファ１３８から有効（ｖａｌｉｄ）信号を受け取り、次にディスパッチされる命令を選択する。選択された命令がイシュア５０６にディスパッチされ、イシュア５０６は、実行モジュール１４２に転送することによって命令を発行する。たとえば、ソース・オペランドと結果データの適切なレジスタの選択をするために、選択された命令が属するスレッドのスレッド識別子も、イシュア５０６および／または実行モジュール１４２に転送することができる。
【００５６】
スケジューラ５０４は、スレッドの間の順序に基づく制約が少しだけまたはない状態で、バッファ１３８内の準備ができた命令の間で選択するように構成される。たとえば、スケジューラ５０４は、スレッドがいつ最後に選択されたかに無関係に、最も長い間待っている（有効な）、バッファ１３８内の準備ができた命令を選択することができる。
【００５７】
図６は、バッファ１３８からディスパッチされるスレッドを選択する、スケジューラ５０４に含めることができる選択論理回路６００の単純化されたブロック図である。選択論理回路６００には、優先順位エンコーダ６０２とフェーズ（またはトークン）カウンタ６０４が含まれる。各スレッドの有効（ｖａｌｉｄ）信号およびレディ（ｒｅａｄｙ）信号が、それぞれのＡＮＤ回路６０６への入力として供給される。優先順位エンコーダ６０２は、ＡＮＤ回路６０６からの出力信号すなわち、バッファ１３８内のスレッドの命令が有効であり、実行の準備ができている時にアサートされる、スレッドごとの信号を受け取る（いくつかの実施形態で、スレッドのレディ信号は、スレッドが無効である時にアサートされず、したがって、ＡＮＤ回路６０６を省略することができる）。優先順位エンコーダ６０２は、普通のディジタル論理回路を使用して実装することができるが、レディ信号および有効信号の両方がアサートされている最高優先順位のスレッド（すなわち、最高優先順位の準備ができているスレッド）を選択する。ここで、スレッドの間の優先順位ランキングは、フェーズ・カウンタ６０４によって供給される制御信号（ＣＴＬ２）に基づいて決定される。フェーズ・カウンタ６０４は、クロック・サイクルごとに増分されるｍｏｄｕｌｏ  Ｎカウンタであり、制御信号ＣＴＬ２はカウンタ６０４の現在の値に対応する。この実施形態では、制御信号ＣＴＬ２によって、最高優先順位のスレッドのスレッド番号が決定され、優先順位エンコーダ６０２は、残りのスレッドを、スレッド番号のＮを法とする剰余の昇順（または降順）でランキングする。フェーズ・カウンタ６０４は、図３の現在スレッド・カウンタ３０４と同一のフェーズを有することができ（両方のカウンタを、望まれる場合に同一のカウンタとして実施することができる）、あるいは、異なるフェーズを有することができる。
【００５８】
優先順位エンコーダ６０２のオペレーションは、図３の優先順位エンコーダ３０２について上で説明したものに類似し、フェーズ・カウンタ６０４が、各クロック・サイクルに増分されるので、スレッドの優先順位ランキングは異なるクロック・サイクルについて異なる。たとえば、最初のクロック・サイクル中に、現在スレッド・カウンタ６０４は値０を有し、優先順位エンコーダ６０２はスレッド０に最高の優先順位を与え（すなわち、スレッド０の準備ができている場合にスレッド０を選択する）、スレッド０の準備ができていない場合にはスレッド１に与え、以下、準備ができているスレッドが見つかるか、スレッドの最大個数を検討するまで継続する。次のクロック・サイクル中に、現在スレッド・カウンタ６０４は値１を有し、優先順位エンコーダ６０２は、スレッド１に最高優先順位を与え、スレッド１の準備ができていない場合にはスレッド２に、以下同様である。
【００５９】
スレッドの準備ができたならば、そのスレッドは、その命令がディスパッチされるまで準備ができたままになる。したがって、選択論理回路６００は、所与のクロック・サイクルに、最も長い間準備ができていたスレッドが選択されることを保証しないが、準備のできた（かつ有効な）スレッドが、準備ができてからＮクロック以内に選択されることを理解されたい。いくつかの実施形態で、連続するクロック・サイクル中に同一のスレッドが選択されないようにすることが望ましい場合がある。したがって、優先順位エンコーダ６０２があるクロック・サイクル中に検討するスレッドの最大個数を、スレッドの総数Ｎより小さい数に制限することができる（この最大個数は、システムの構成可能パラメータとすることができる）。
【００６０】
本明細書に記載の選択論理回路と選択ルールが例示的であり、変形形態や修正形態が可能であることを理解されたい。本明細書に記載のさまざまな回路コンポーネントは、普通のディジタル論理回路の設計と技術を使用して実現することができる。異なる論理回路を実装して、異なる選択ルールをサポートすることもできる。たとえば、スーパースカラ実施形態（クロック・サイクルごとに複数の命令をフェッチできる）では、クロック・サイクルごとに複数の命令を選択するように選択ロジックを構成することができる。さらに、優先順位エンコーダ以外のデバイスを、選択される準備のできているスレッドの判定に使用することができる。たとえば、選択論理回路が、有効ビットの１つの論理真状態と論理偽状態の間の推移が検出される時に更新される、「最も以前に有効であった」ビット・フィールドを維持することができる。このビット・フィールドは、最も長い間有効であった準備ができている命令を選択するのに使用することができる。もう１つの実施形態では、カウンタを使用して、スレッドが有効になって（または準備ができて）からの経過時間および／またはスレッドが最後に選択されてからの経過時間を判定することができ、このカウンタ値に作用する比較ロジックを設けて、最も長い間有効であったスレッドを識別することができる。
【００６１】
もう１つの実施形態では、他の種類の選択ルールを実施することができる。たとえば、選択を、部分的にスレッド・タイプに基づくものとすることができる（たとえば、図４に示した上のものに類似する選択回路を使用して）。選択を、実行されるオペレーションのタイプに部分的に基づくものとすることもできる（たとえば、ＭＵＬＴＩＰＬＹ演算、ＣＡＬＬオペレーション、ＡＤＤ演算などに異なる優先順位を与える）。さらに、選択で、実行モジュールの状態を考慮に入れることができる。そのような実施形態の１つで、実行モジュール１４２に、特殊化された実行ユニット（または実行パイプラン）が含まれ、異なるオペレーションが異なる実行ユニットに向けられ、たとえば、浮動小数点算術を実行する実行ユニットと、整数算術を実行する別の実行ユニットを設けることができる。あるスレッドの準備ができている命令が必要とする実行ユニットが使用中である場合に、異なるスレッドからの命令を選択することができる。たとえば、所与の時に、浮動小数点パイプラインが使用中であり、整数パイプラインが空いていると仮定する。準備ができている整数算術命令を有するスレッドに、浮動小数点命令を有するスレッドより高い優先順位を与えることができる。
【００６２】
もう一度図５を参照すると、スケジューラ５０４からの許可（ｇｒａｎｔ）信号に応答して、バッファ１３８内の要求された命令がイシュア５０６にディスパッチされる。一実施形態では、イシュア５０６に、オペランド・コレクタ５０８とバッファ５１０が含まれる。バッファ５１０は、ディスパッチされた命令を受け取り、オペランド・コレクタ５０８は、バッファ５１０内の命令のソース・オペランドをレジスタ・ファイル１４４から収集する。レジスタ・ファイル１４４の構成に応じて、ソース・オペランドの収集が、複数のクロック・サイクルを必要とする場合があり、オペランド・コレクタ５０８が、特定のレジスタ・ファイル構成に対する効率的なオペランド収集のためにレジスタ・ファイル・アクセスを最適化するさまざまな技法を実装することができ、そのような技法の例は、当技術分野で既知である。
バッファ５１０は、命令の他のオペランドを収集している間に、収集されたオペランドを、その命令と一緒に記憶するように構成される。いくつかの実施形態では、イシュア５０６は、オペランドが収集されるや否や、実行モジュール１４２に命令を発行するように構成される。イシュア５０６は、ディスパッチされた順序で命令を発行する必要がない。たとえば、バッファ５１０内の命令を、ディスパッチされた順序に対応するシーケンスで記憶することができ、各クロック・サイクルに、イシュア５０６が、すべてのオペランドを有する命令が見つかるまでシーケンスをステップする（最も以前にディスパッチされた命令から始めて）ことによって、オペランドを有する最も古い命令を選択することができる。この命令が発行され、シーケンスでその後ろの命令が前にシフトされる。新たにディスパッチされた命令はシーケンスの末尾に追加される。このシーケンスを、たとえば、バッファ５１０内の物理的ストレージ・ロケーションの順序付きの組によって維持することができ、この場合に、前の命令が除去される時に、命令が異なる位置にシフトされる。
【００６３】
一実施形態で、イシュア５０６にディスパッチされた命令は、実行モジュール１４２に発行されるまでバッファ１３８に留まる。ディスパッチの後に、命令が、有効だが準備ができていない状態で維持される（たとえば、ディスパッチされた命令の有効ビット２１０を、命令が発行されるまで論理真状態にとどめることができる）。イシュア５０６がディスパッチ順と異なる順序で命令を発行できる実施形態では、その構成が、同一スレッドからの複数の命令がバッファ５１０に同時に存在することを回避するのに役立つ可能性があり、これによって、スレッド内の命令の順序が維持されることを理解されたい。
【００６４】
他の実施形態で、イシュア５０６がオペランド収集を実行しない。たとえば、イシュア５０６は、命令が受け取られる時に実行モジュール１４２（またはその特定の実行ユニット）に命令を発行し、適切なソース・オペランドを実行モジュール１４２（またはその特定の実行ユニット）に供給するようにレジスタ・ファイル１４４に知らせることができる。この実施形態では、オペランド・コレクタ５０８とバッファ５１０を省略することができる。イシュア５０６の特定の構成が、本発明の理解にクリティカルでないことを理解されたい。
【００６５】
本明細書に記載のディスパッチ回路が例示的であり、変形形態や修正形態が可能であることを理解されたい。スケジューラ回路に関して本明細書に記載のさまざまな論理回路を、普通のディジタル論理回路の設計と技術を使用して実現することができる。異なる論理回路を実装して、異なる選択ルールをサポートすることもできる。スケジューラに、たとえばスレッドを発行のために再選択できる前の最小サイクル数などの追加の選択ルールおよび／またはあるスレッド・タイプに別のスレッド・タイプに対する優先順位を与えるなどの異なる選択ルールを実施するさまざまな種類の論理回路も含めることができる。そのようなルールは、フェッチ回路のスレッド選択に関して上で説明したものに類似する論理回路および技法を使用して実施することができる。
【００６６】
本発明を、特定の実施形態に関して説明したが、当業者は、多数の修正が可能であることを理解するであろう。たとえば、本明細書に記載の実施形態は、スカラ（すなわち、クロック・サイクルごとに１つ）命令発行用に構成されているが、代替実施形態では、スーパースカラ（すなわち、クロック・サイクルごとに複数）命令発行をサポートすることができる。スーパースカラ実施形態では、所与のクロック・サイクルに発行される命令を、所望の組合せでさまざまなスレッドから引き出すことができる（たとえば、いくつかの実施形態で、クロック・サイクルごとにスレッドあたり１命令に発行を制限することができ、他の実施形態で、同一クロック・サイクルに同一のスレッドから複数の命令を発行可能にすることができる）。スーパースカラ（またはスカラ）実施形態では、フェッチ回路を修正して、クロック・サイクルごとに複数の命令をフェッチすることもできる。したがって、本発明に、各サイクルに、任意の数（Ｆ）の命令をフェッチし、任意の数の命令（Ｐ）を発行する実施形態が含まれる。ここで、数Ｆ、Ｐを、望みの形で複数のスレッドの間に割り振ることができることを理解されたい。本発明の実施形態は、非同期式プロセッサでの使用に適合することもできる。
【００６７】
さらに、望まれる場合に、たとえば「アクティブ・ウィンドウ」内の準備ができた命令の発行を可能にする汎用プロセッサからのアウトオブオーダー技法を適合させることによって、スレッド内のアウトオブオーダー命令発行を実施することができる。
【００６８】
本明細書に記載の実行コアは、実行ユニットの特定の個数または構成に制限されない。たとえば、複数の実行ユニットが、所与の命令の処理のために協力することができ、異なる実行ユニットが、異なる命令（または異なるデータを有する同一の命令）を並列に受け取ることができる。実行ユニットは、固定のまたは可変のレイテンシを有する命令を処理することができ、すべてのクロック・サイクルに、より一般的にはある固定された個数のクロック・サイクルからなるインターバルに、新しい命令を受け入れるためにパイプライン化することができる。
【００６９】
上で注記したように、任意の個数のスレッドと任意の個数のスレッド・タイプをサポートすることができ、各スレッド・タイプは、実行される命令のプログラムされたシーケンスに対応する。プログラム命令は、グラフィックス・プロセッサまたは他のグラフィックス処理サブシステム・コンポーネントの不揮発性メモリに記憶された組み込み命令、システム初期化時および／またはランタイムにグラフィックス・ドライバ・プログラムによって供給される命令、および／またはアプリケーション供給のプログラム・コード（たとえば、プログラマブル・シェーダの場合）を含むさまざまな形で供給することができる。プログラムは、適切な高水準言語（たとえば、Ｃ、Ｃｇ、または類似物）で作成し、そのプログラミング言語と、プログラムが実行されるグラフィックス・プロセッサとのための適切なコンパイラを使用してコンパイルすることができる。入力命令の、実行ユニットとの互換性を有する異なるフォーマット（または異なる命令セット）への変換は、実行コア内、グラフィックス・プロセッサの他のコンポーネント内、またはコンピュータ・システム内の他の場所で提供することができる。
【００７０】
本明細書に記載のグラフィックス・プロセッサは、汎用デスクトップ・コンピュータ、ラップトップ・コンピュータ、および／またはタブレット・コンピュータ、携帯情報端末（ＰＤＡ）、携帯電話などのさまざまなハンドヘルド・デバイス、ビデオ・ゲーム機などの専用コンピュータ・システム、および類似物を含むさまざまなコンピューティング・デバイスでコプロセッサとして実装することができる。
【００７１】
本発明を、グラフィックス・プロセッサに関して説明したが、本明細書に記載のシステムと方法を、他のマルチスレッド式マイクロプロセッサでも実現できることを理解されたい。
【００７２】
したがって、本発明を、特定の実施形態に関して説明したが、本発明が、請求項の範囲に含まれるすべての修正形態および同等物を含むことが意図されていることを理解されたい。
【図面の簡単な説明】
【００７３】
【図１】本発明の実施形態によるコンピュータ・システムを示す単純化された高水準ブロック図である。
【図２】本発明の実施形態による命令フェッチ回路および命令バッファを示す単純化されたブロック図である。
【図３】本発明の実施形態による、フェッチされる命令を選択する選択論理回路を示す単純化されたブロック図である。
【図４】本発明の代替実施形態による命令フェッチ回路を示す単純化されたブロック図である。
【図５】本発明の実施形態による命令ディスパッチ回路を示す単純化されたブロック図である。
【図６】本発明の実施形態による、発行される命令を選択する選択ロジックを示す単純化されたブロック図である。
【符号の説明】
【００７４】
１３２  命令キャッシュ、  １３６  命令フェッチ回路、１３８  バッファ、１４０  ディスパッチ回路、２０２  プログラム・カウンタ・ロジック・ブロック、２０４  アービトレーション・ユニット、２０６  選択論理回路、２０８  ストレージ・ロケーション、２１０  アレイ
【図１】
2005182825.tif 000003
【図２】
2005182825.tif 000004
【図３】
2005182825.tif 000005
【図４】
2005182825.tif 000006
【図５】
2005182825.tif 000007
【図６】
2005182825.tif 000008