(57)【特許請求の範囲】
【請求項１】
共有メモリに対するアトミックな更新を行う方法において、
あるアドレスに対応する前記共有メモリのエントリーにアクセスするためのメモリ要求を受け取るステップと、
前記アドレスを使用してロックフラグを記憶するロックエントリーのロックアドレスを決定するステップと、
前記アドレスに対応する前記共有メモリのエントリーに対してロックが取得されたかどうか指示する前記ロックアドレスに対するロック結果を計算するステップと、
前記メモリ要求により前記エントリーがロックされたことを指示して、別のメモリ要求が、前記アドレスに対応する前記共有メモリのエントリーを書き込むのを防止するために、前記ロックフラグをセットするステップと、
前記アドレスに対応する前記共有メモリのエントリーに記憶されたデータ及び前記ロック結果を同時に読み取るステップと、
前記データを使用して変更データを発生するオペレーションを遂行するステップと、
前記ロック結果が、前記エントリーに対してロックが取得されたことを指示するときには、前記エントリーが前記メモリ要求によってアンロックされることを指示するために、
前記ロックフラグをクリアするステップと、
前記アドレスに対応する前記共有メモリのエントリーに前記変更データを書き込むステップと、
を備える、
方法。
【請求項２】
前記ロック結果が、前記エントリーに対してロックが取得されなかったことを指示するときには、前記ロック結果を計算するステップ、前記ロックフラグをセットするステップ及び、前記データ及び前記ロック結果を同時に読み取るステップを繰り返すステップを更に備える、請求項１に記載の方法。
【請求項３】
前記決定するステップ、前記計算するステップ、前記セットするステップ及び前記読み取るステップは、プログラムの複数の実行スレッドに対して並列に遂行される、請求項１に記載の方法。
【請求項４】
共有メモリに対するアトミックな更新を行うシステムにおいて、
複数のエントリーにデータを記憶するための共有記憶リソースであって、あるアドレスに対応する該共有記憶リソースのエントリーにアクセスするためのメモリ要求を受け取ると共に、前記アドレスに対応する前記エントリーに記憶されたデータを出力する、ように構成された共有記憶リソースと、
前記共有記憶リソースに結合されたメモリロックユニットであって、前記メモリ要求で指定されるロック要求を受け取り、前記アドレスを使用してロックフラグを記憶するロックエントリーのロックアドレスを決定し、前記アドレスに対応する前記共有記憶リソースのエントリーに対してロックが取得されたかどうか指示する前記ロックアドレスに対するロック結果を計算し、前記メモリ要求により前記エントリーがロックされたことを指示して、別のメモリ要求が、前記アドレスに対応する前記共有記憶リソースのエントリーを書き込むのを防止するために、前記ロックフラグをセットし、前記アドレスに対応する前記共有記憶リソースのエントリーにアクセスするための第２のメモリ要求で指定されたアンロック要求を受け取り、前記ロック結果が、前記エントリーに対してロックが取得されたことを指示するときには、前記エントリーが前記第２のメモリ要求によってアンロックされることを指示するために、前記ロックフラグをクリアし、前記アドレスに対応する前記共有記憶リソースのエントリーにアクセスするための前記第２のメモリ要求を受け取り、前記アドレスに対応する前記共有記憶リソースのエントリーに変更データを書き込む、
ように構成されたメモリロックユニットと、
を備え、
前記共有記憶リソースが前記データを出力すると同時に、前記メモリロックユニットは、前記ロック結果を出力する、
システム。
【請求項５】
前記ロックフラグは、前記共有記憶リソースにおけるエントリーの２つ以上のアドレスにより共有される、請求項４に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本発明は、一般に、共有メモリの読み取り及び書き込みに係り、より詳細には、アトミックな更新のための共有メモリへのアクセスをロック及びアンロックするシステム及び方法に係る。
【背景技術】
【０００２】
[0002]アトミックなメモリオペレーションを実施するために多くのプロセッサに使用される従来のロードリンク及び記憶条件インストラクションのような、共有メモリへのメモリアクセスをロック及びアンロックするための現在のメカニズムは、各記憶（書き込み）オペレーションの前にアクセスされる各エントリーに対してロック状態をチェックする。更に、要求元は、典型的に、ロックが得られたかどうかに関わらず記憶オペレーションが試みられた後までフィードバックを受け取らない。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
[0003]従って、この技術で要求されているのは、アトミックなメモリオペレーションを遂行するために共有メモリにアクセスする改良されたロックメカニズムである。
【課題を解決するための手段】
【０００４】
[0004]アトミックなオペレーションのための共有メモリへのアクセスをロック及びアンロックするシステム及び方法は、ロックが首尾良く行われたかどうか指示する即時フィードバックを与える。読み取りデータがロック状態と共に要求元へ返送される。ロック状態は、読み取り中にロックされるときまたは書き込み中にアンロックするときに同時に変更される。それ故、ロック状態を、読み取り−変更−書き込みオペレーションの前にまたはその間に、個別のトランザクションとしてチェックする必要はない。更に、各アトミックなメモリオペレーションに対してロックまたはアンロックを明確に指定することができる。それ故、メモリ位置のコンテンツを変更しないオペレーションの場合は、ロックオペレーションが遂行されない。ロック状態を指示するロックビットは、必ずしも、共有メモリ内の各メモリ位置に必要とされない。というのは、メモリアドレスエイリアシングを許すことにより多数の位置の中に各ロックビットを共有できるからである。メモリアドレスエイリアシングから生じる偽のメモリ位置の数を減少するために、明確なロックオペレーションを使用することができる。
【０００５】
[0005]共有メモリへのアトミックな更新を遂行するための本発明の方法の種々の実施形態は、あるアドレスに対応する共有メモリのエントリーにアクセスするためのメモリ要求を受け取ることを含む。ロックフラグを記憶するロックエントリーのロックアドレスは、そのアドレスを使用して決定される。そのアドレスに対応する共有メモリのエントリーに対してロックが得られたかどうかを指示するロック結果が、ロックアドレスに対して計算される。メモリ要求によりエントリーがロックされたことを指示すると共に、別のメモリ要求がそのアドレスに対応する共有メモリのエントリーを書き込むのを防止するために、ロックフラグがセットされる。そのアドレスに対応する共有メモリのエントリーに記憶されたデータが読み取られる。
【０００６】
[0006]本発明の種々の実施形態は、共有メモリにアクセスするためのシステムを含む。このシステムは、多数のエントリーにおけるデータを記憶するための共有記憶リソースを備え、これは、メモリロックユニットに結合される。共有記憶リソースは、あるアドレスに対応する共有記憶リソースのエントリーにアクセスするためのメモリ要求を受けると共に、そのアドレスに対応してそのエントリーに記憶されたデータを出力するように構成される。メモリロックユニットは、メモリ要求で指定されたロック要求の受け取り、前記アドレスを使用してロックフラグを記憶するロックエントリーのロックアドレスの決定、及び、メモリ要求によりエントリーがロックされたことを指示して、別のメモリ要求が前記アドレスに対応する共有記憶リソースのエントリーを書き込むのを防止するためにロックフラグのセット、をするように構成される。
【０００７】
[0007]上述した本発明の特徴を詳細に理解できるように、前記で簡単に要約した本発明について、幾つかを添付図面に例示した実施形態を参照して、より特定して説明する。しかしながら、添付図面は、本発明の典型的な実施形態のみを例示するもので、それ故、本発明の範囲をそれに限定するものではなく、本発明は、同等の効果を発揮できる他の実施形態も包含できるものであることに注意されたい。
【図面の簡単な説明】
【０００８】
【図１】本発明の１つ以上の態様を実施するように構成されたコンピュータシステムを示すブロック図である。
【図２】本発明の１つ以上の態様に基づく図１のコンピュータシステムのための並列処理サブシステムのブロック図である。
【図３】本発明の１つ以上の態様に基づく図２の並列処理サブシステムのための並列処理ユニットのブロック図である。
【図４Ａ】本発明の１つ以上の態様に基づく図３の並列処理ユニットのためのインストラクションユニットのブロック図である。
【図４Ｂ】本発明の１つ以上の態様に基づく図３に示す共有メモリユニットのブロック図である。
【図５Ａ】本発明の１つ以上の態様に基づき共有メモリにおいてロックオペレーションを遂行するための方法ステップのフローチャートである。
【図５Ｂ】本発明の１つ以上の態様に基づき共有メモリにおいてアンロックオペレーションを遂行するための方法ステップのフローチャートである。
【図５Ｃ】本発明の１つ以上の態様に基づきロック及びアンロックコマンドを使用して共有メモリにアクセスするための方法ステップのフローチャートである。
【発明を実施するための形態】
【０００９】
[0016]以下の説明では、本発明をより完全に理解するために多数の特定の細部について説明する。しかしながら、当業者であれば、これらの特定の細部の１つ以上がなくても、本発明を実施できることが明らかであろう。他の点について、本発明を不明瞭にしないために、良く知られた特徴は、説明しない。
【００１０】
システムの概略
[0017]図１は、本発明の１つ以上の態様を実施するように構成されたコンピュータシステム１００を示すブロック図である。このコンピュータシステム１００は、メモリブリッジ１０５を含むバス経路を経て通信する中央処理ユニット（ＣＰＵ）１０２及びシステムメモリ１０４を備えている。例えば、ノースブリッジ(Northbridge)チップでよいメモリブリッジ１０５は、バスまたは他の通信経路１０６（例えば、ハイパートランスポートリンク）を経てＩ／Ｏ（入力／出力）ブリッジ１０７に接続される。例えば、サウスブリッジ(Southbridge)チップでよいＩ／Ｏブリッジ１０７は、１つ以上のユーザ入力装置１０８（例えば、キーボード、マウス）からユーザ入力を受け取り、そしてその入力を、経路１０６及びメモリブリッジ１０５を経てＣＰＵ１０２へ転送する。メモリブリッジ１０５には、バスまたは他の通信経路１１３（例えば、ＰＣＩエクスプレス、アクセラレーテッドグラフィックポートまたはハイパートランスポートリンク）を経て並列処理サブシステム１１２が結合され、一実施形態では、この並列処理サブシステム１１２は、ディスプレイ装置１１０（例えば、従来のＣＲＴまたはＬＣＤベースのモニタ）へピクセルを配送するグラフィックサブシステムである。Ｉ／Ｏブリッジ１０７には、システムディスク１１４も接続される。スイッチ１１６は、Ｉ／Ｏブリッジ１０７と、他のコンポーネント、例えば、ネットワークアダプタ１１８及び種々のアドイン(add-in)カード１２０及び１２１との間の接続をなす。また、Ｉ／Ｏブリッジ１０７には、ＵＳＢまたは他のポート接続部、ＣＤドライブ、ＤＶＤドライブ、フィルムレコーディング装置、等を含む他のコンポーネント（明確に示さず）を接続することもできる。図１における種々のコンポーネントを相互接続する通信経路は、適当なプロトコル、例えば、ＰＣＩ（周辺コンポーネント相互接続）、ＰＣＩ−エクスプレス（ＰＣＩ−Ｅ）、ＡＧＰ（アクセラレーテッドグラフィックポート）、ハイパートランスポート、或いは他のバスまたはポイント・ツー・ポイント通信プロトコルを使用して実施することができ、そして異なる装置間の接続は、この技術で知られたように異なるプロトコルを使用することができる。
【００１１】
[0018]一実施形態では、並列処理サブシステム１１２は、例えば、ビデオ出力回路を含めて、グラフィック及びビデオ処理に最適な回路を組み込んでおり、そしてグラフィック処理ユニット（ＧＰＵ）を構成する。別の実施形態では、並列処理サブシステム１１２は、以下に詳細に述べるように、基礎となる計算アーキテクチャーを保存しながら、汎用の処理に最適な回路を組み込んでいる。更に別の実施形態では、並列処理サブシステム１１２は、１つ以上の他のシステム要素、例えば、メモリブリッジ１０５、ＣＰＵ１０２、及びＩ／Ｏブリッジ１０７と一体化されて、システムオンチップ（ＳｏＣ）を形成することができる。
【００１２】
[0019]図２は、本発明の一実施形態に基づく並列処理サブシステム１１２を示す。この並列処理サブシステム１１２は、１つ以上の並列処理ユニット（ＰＰＵ）２０２を備え、その各々は、ローカル並列処理（ＰＰ）メモリ２０４に結合される。一般的に、並列処理サブシステムは、Ｕ個のＰＰＵを含む。但し、Ｕ≧１である。（ここで、同じオブジェクトの複数のインスタンスは、オブジェクトを識別する参照番号と、必要に応じてインスタンスを識別するカッコ内の数字とで示される。）ＰＰＵ２０２及びＰＰメモリ２０４は、例えば、プログラム可能なプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、及びメモリ装置のような１つ以上の集積回路装置を使用して実施することができる。
【００１３】
[0020]ＰＰＵ２０２（０）について詳細に示すように、各ＰＰＵ２０２は、メモリブリッジ１０５へ接続される（または別の実施形態では、ＣＰＵ１０２へ直結される）通信経路１１３を経てシステム１００の残り部分と通信するホストインターフェイス２０６を備えている。一実施形態では、通信経路１１３は、この技術で知られたように、各ＰＰＵ２０２に専用レーンが割り当てられるＰＣＩ−Ｅリンクである。また、他の通信経路が使用されてもよい。ホストインターフェイス２０６は、通信経路１１３で送信するためのパケット（または他の信号）を発生し、また、通信経路１１３から全ての到来パケット（または他の信号）も受信して、それをＰＰＵ２０２の適当なコンポーネントへ向ける。例えば、処理タスクに関連したコマンドをフロントエンドユニット２１２に向ける一方、メモリオペレーション（例えば、ＰＰメモリ２０４からの読み取りまたはそこへの書き込み）に関連したコマンドをメモリインターフェイス２１４に向けることができる。ホストインターフェイス２０６、フロントエンドユニット２１２、及びメモリインターフェイス２１４は、一般的に従来設計のものでよく、本発明にとって重要でないので、詳細な説明は省く。
【００１４】
[0021]各ＰＰＵ２０２は、高度な並列プロセッサを実施するのが好都合である。ＰＰＵ２０２（０）について詳細に示すように、ＰＰＵ２０２は、Ｃ個のコア２０８を含む。但し、Ｃ≧１である。各処理コア２０８は、非常に多数（例えば、数十または数百）のスレッドを同時に実行することができ、各スレッドは、プログラムのインスタンスであり、マルチスレッド型処理コア２０８の一実施形態を以下に説明する。コア２０８は、フロントエンドユニット２１２から処理タスクを定義するコマンドを受け取るワーク配布ユニット２１０を経て、実行されるべき処理タスクを受け取る。このワーク配布ユニット２１０は、配布ワークのための種々のアルゴリズムを実施することができる。例えば、一実施形態では、ワーク配布ユニット２１０は、各コア２０８から、そのコアが新たな処理タスクを受け入れるに充分なリソースを有するかどうか指示する「レディ」信号を受け取る。新たな処理タスクが到着すると、ワーク配布ユニット２１０は、レディ信号をアサートしているコア２０８にタスクを指定し、レディ信号をアサートしているコア２０８がない場合には、ワーク配布ユニット２１０は、コア２０８によりレディ信号がアサートされるまで、新たな処理タスクを保持する。当業者であれば、他のアルゴリズムも使用できると共に、ワーク配布ユニット２１０が到来する処理タスクを配布する特定のやり方は、本発明にとって重要ではないことが明らかであろう。
【００１５】
[0022]コア２０８は、種々の外部メモリ装置から読み取ったりそこに書き込んだりするためにメモリインターフェイス２１４と通信する。一実施形態では、メモリインターフェイス２１４は、ローカルＰＰメモリ２０４と通信するためのインターフェイスと、ホストインターフェイスへの接続とを含み、これにより、コアは、システムメモリ１０４、或いはＰＰＵ２０２に対してローカルではない他のメモリと通信することができる。メモリインターフェイス２１４は、一般的に従来設計のものでよく、詳細な説明は、省く。
【００１６】
[0023]コア２０８は、これに限定されないが、線形的及び非線形的なデータ変換、ビデオ及び／またはオーディオデータのフィルタリング、モデリングオペレーション（例えば、物理の法則を適用して、オブジェクトの位置、速度及び他の属性を決定する）、映像レンダリングオペレーション（例えば、頂点シェーダー、幾何学的シェーダー及び／またはピクセルシェーダープログラム）、等を含む種々様々なアプリケーションに関する処理タスクを実行するようにプログラムすることができる。ＰＰＵ２０２は、システムメモリ１０４及び／またはローカルＰＰメモリ２０４からのデータを内部（オンチップ）メモリへ転送し、そのデータを処理し、そしてその結果データをシステムメモリ１０４及び／またはローカルＰＰメモリ２０４へ書き戻すことができ、このようなデータは、例えば、ＣＰＵ１０２または別の並列処理サブシステム１１２を含む他のシステムコンポーネントによりアクセスすることができる。
【００１７】
[0024]再び、図１を参照すれば、ある実施形態において、並列処理サブシステム１１２内のＰＰＵ２０２は、その幾つかまたは全部が、レンダリングパイプラインを伴うグラフィックプロセッサであって、ＣＰＵ１０２及び／またはシステムメモリ１０４によりメモリブリッジ１０５及びバス１１３を経て供給されたグラフィックデータからピクセルデータを発生し、（例えば、従来のフレームバッファを含むグラフィックメモリとして使用できる）ローカルＰＰメモリ２０４と相互作用してピクセルデータを記憶及び更新し、そのピクセルデータをディスプレイ装置１１０へ配送し、等々に関連した種々のタスクを遂行するように構成することができる。ある実施形態では、ＰＰサブシステム１１２は、グラフィックプロセッサとして動作する１つ以上のＰＰＵ２０２、及び汎用の計算に使用される１つ以上の他のＰＰＵ２０２を含むことができる。ＰＰＵは、同じものでも異なるものでもよく、そして各ＰＰＵは、それ自身の専用のＰＰメモリ装置（１つまたは複数）を有してもよいし、専用のＰＰメモリ装置を有していなくてもよい。
【００１８】
[0025]動作に際して、ＣＰＵ１０２は、システム１００のマスタープロセッサであり、他のシステムコンポーネントのオペレーションを制御し整合させる。特に、ＣＰＵ１０２は、ＰＰＵ２０２のオペレーションを制御するコマンドを発行する。ある実施形態では、ＣＰＵ１０２は、各ＰＰＵ２０２のためのコマンドのストリームをプッシュバッファ（図１には明確に示さず）に書き込み、このプッシュバッファは、ＣＰＵ１０２及びＰＰＵ２０２の両方に対してアクセス可能なシステムメモリ１０４、ＰＰメモリ２０４、または別の記憶位置に配置することができる。ＰＰＵ２０２は、プッシュバッファからコマンドストリームを読み取り、そしてＣＰＵ１０２のオペレーションとは非同期でそれらコマンドを実行する。
【００１９】
[0026]ここに示すシステムは、例示に過ぎず、変更や修正がなされ得ることが明らかであろう。ブリッジの数及び配列を含む接続形態は、必要に応じて変更することができる。例えば、ある実施形態では、システムメモリ１０４は、ブリッジを経ずに、ＣＰＵ１０２へ直結され、他の装置は、メモリブリッジ１０５及びＣＰＵ１０２を経てシステムメモリ１０４と通信する。他の別の形態では、並列処理サブシステム１１２は、Ｉ／Ｏブリッジ１０７へ接続され、またはメモリブリッジ１０５ではなく、ＣＰＵ１０２へ直結される。更に別の実施形態では、Ｉ／Ｏブリッジ１０７及びメモリブリッジ１０５が１つのチップへ一体化されてもよい。ここに示す特定のコンポーネントは、任意のものであり、例えば、いかなる数のアドインカードまたは周辺装置がサポートされてもよい。ある実施形態では、スイッチ１１６が除去され、ネットワークアダプタ１１８及びアドインカード１２０、１２１がＩ／Ｏブリッジ１０７に直結される。
【００２０】
[0027]ＰＰＵ２０２とシステム１００の残り部分との接続を変更することもできる。ある実施形態では、ＰＰシステム１１２は、システム１００の拡張スロットに挿入できるアドインカードとして実施される。他の実施形態では、ＰＰＵ２０２は、単一チップ上で、メモリブリッジ１０５またはＩ／Ｏブリッジ１０７のようなバスブリッジと一体化することができる。更に別の実施形態では、ＰＰＵ２０２の幾つかのまたは全部の要素を単一チップ上でＣＰＵ１０２と一体化することができる。
【００２１】
[0028]ＰＰＵには、ローカルメモリを含まずに、任意の量のローカルＰＰメモリを設けることができ、そしてローカルメモリ及びシステムメモリを任意の組合せで使用することができる。例えば、ＰＰＵ２０２は、一体化メモリアーキテクチャー（ＵＭＡ）実施形態ではグラフィックプロセッサであり、このような実施形態では、専用のグラフィック（ＰＰ）メモリがほとんどまたは全く設けられず、また、ＰＰＵ２０２は、システムメモリを排他的またはほぼ排他的に使用する。ＵＭＡ実施形態では、ＰＰＵは、ブリッジチップまたはプロセッサチップに一体化されてもよく、或いは例えば、ブリッジチップを経てＰＰＵをシステムメモリに接続する高速リンク（例えば、ＰＣＩ−Ｅ）を伴う個別のチップとして設けられてもよい。
【００２２】
[0029]上述したように、並列処理サブシステムには、任意の数のＰＰＵを含ませることもできる。例えば、複数のＰＰＵを単一のアドインカードに設けることもできるし、または複数のアドインカードを通信経路１１３に接続することもできるし、或いは１つ以上のＰＰＵをブリッジチップに一体化することもできる。マルチＰＰＵシステムのＰＰＵは、互いに同じものでもよいし異なるものでもよく、例えば、異なるＰＰＵは、異なる数のコア、異なる量のローカルＰＰメモリ、等を有してもよい。複数のＰＰＵが存在する場合には、それらを並列に動作させて、単一のＰＰＵで可能なものより高いスループットでデータを処理することができる。
【００２３】
[0030]１つ以上のＰＰＵを含むシステムは、デスクトップ、ラップトップまたはハンドヘルドパーソナルコンピュータ、サーバー、ワークステーション、ゲームコンソール、埋め込まれたシステム、等々を含む種々の構成及びフォームファクタで実施することができる。
【００２４】
コアの概略
[0031]図３は、本発明の１つ以上の態様に基づく図２の並列処理サブシステム１１２のための並列処理ユニット２２０を示すブロック図である。このＰＰＵ２０２は、非常に多数のスレッドを並列に実行するように構成されたコア２０８（または複数コア２０８）を備える。ここで、「スレッド(thread)」という語は、入力データの特定セットに対して実行される特定プログラムのインスタンスを指す。ある実施形態では、単一インストラクション複数データ（ＳＩＭＤ）のインストラクション発行技術を使用して、複数の独立したインストラクションユニットを設けずに、非常に多数のスレッドの並列実行がサポートされる。ある実施形態では、単一インストラクションマルチスレッド（ＳＩＭＴ）技術を使用し、処理エンジンのセットへインストラクションを発行するように構成された共通のインストラクションユニットを使用して、非常に多数の一般的に同期されたスレッドの並列実行がサポートされる。全ての処理エンジンが典型的に同じインストラクションを実行するＳＩＭＤ実行形態とは異なり、ＳＩＭＴの実行は、異なるスレッドが、所与のスレッドプログラムを通して、発散する実行経路を容易にたどれるようにする。当業者であれば、ＳＩＭＤ処理形態は、ＳＩＭＴ処理形態の機能的サブセットを表すことが理解されよう。
【００２５】
[0032]ＳＩＭＤマシンと同様に、ＳＩＭＴ並列処理コア２０８は、このコア２０８に含まれた複数の並列処理エンジン３０２にわたって異なるデータに対して単一の並列プログラムのインスタンスを実行する。従って、例えば、コア２０８は、該コア２０８内の並列処理エンジン３０２において一連の共通のインストラクションを実行するように構成できる。単一の並列処理エンジン３０２への一連のインストラクションは、前記で定義されたスレッドを構成する。コア２０８内の並列処理エンジン３０２間のある数の現在実行中のスレッドの集合を、ここでは「ワープ(warp)」または「スレッドグループ」と称する。更に、複数の関連スレッドグループは、コア２０８において同時にアクティブとなり得る（実行の異なる段階で）。スレッドグループのこの集合を、ここでは「協働スレッドアレー」（ＣＴＡ）と称する。
【００２６】
[0033]特定のＣＴＡのサイズは、ｍ＊ｋに等しい。但し、ｋは、スレッドグループ内の同時に実行されるスレッドの数で、典型的に、コア２０８における並列処理エンジン３０２の数の整数倍であり、そしてｍは、コア２０８において同時にアクティブなスレッドグループの数である。ＣＴＡのサイズは、一般的に、プログラマーと、ＣＴＡに利用可能なメモリまたはレジスタのようなハードウェアリソースの数とによって決定される。
【００２７】
[0034]一実施形態では、各コア２０８は、単一インストラクションユニット３１２からＳＩＭＴインストラクションを受け取るように構成されたＰ個（例えば、８個、１６個、等）の並列処理エンジン３０２のアレイを含む。各処理エンジン３０２は、機能的ユニット（例えば、演算論理ユニット、等）の同じセットを含むのが好都合である。機能的ユニットは、この技術で知られたように、先のインストラクションが終了する前に新たなインストラクションを発行できるようなパイプライン型のものでよい。機能的ユニットの任意の組合せを設けることもできる。ある実施形態では、機能的ユニットは、整数及び浮動小数点演算（例えば、加算及び乗算）、比較演算、ブール演算（ＡＮＤ、ＯＲ、ＸＯＲ）、ビットシフト、及び種々の代数関数（例えば、平面補間、三角法、指数関数、及び対数関数、等）の計算、を含む種々のオペレーションをサポートし、そして同じ機能的ユニットハードウェアをレバレッジして、異なるオペレーションを遂行することができる。
【００２８】
[0035]各処理エンジン３０２は、ローカル入力データ、中間結果、等を記憶するためにローカルレジスタファイル（ＬＲＦ）３０４のスペースを使用する。一実施形態では、ローカルレジスタファイル３０４は、ある数のエントリーを各々有するＰ個のレーンに物理的または論理的に分割される（各エントリーは、例えば、３２ビットワードを記憶する）。各処理エンジン３０２に１つのレーンが指定されると共に、異なるレーンの対応エントリーに、同じプログラムを実行する異なるスレッドに対するデータをポピュレートさせて、同期した並列実行を容易にすることができる。ある実施形態では、各処理エンジン３０２は、それに指定されたレーンのＬＲＦエントリーにしかアクセスできない。ローカルレジスタファイル３０４におけるエントリーの全数は、処理エンジン３０２当たり複数の同時スレッドをサポートするに充分なほど大きいのが好都合である。
【００２９】
[0036]また、各処理エンジン３０２は、コア２０８内の全処理エンジン３０２間で共有されて異なるスレッド間でデータを転送するのに使用できるオンチップ共有メモリ３０６にアクセスすることができる。この共有メモリ３０６は、希望の大きさのものでよく、ある実施形態では、いずれの処理エンジン３０２も、等しく低い待ち時間（例えば、ローカルレジスタファイル３０４へのアクセスに匹敵する）で、共有メモリ３０６内の任意の位置から読み取りまたはそこに書き込むことができる。ある実施形態では、共有メモリ３０６は、共有レジスタファイルとして実施され、他の実施形態では、共有メモリ３０６は、共有キャッシュメモリを使用して実施することができる。
【００３０】
[0037]共有メモリ３０６に加えて、ある実施形態では、付加的なオンチップパラメータメモリ及び／またはキャッシュ（１つまたは複数）３０８も設けられ、これは、例えば、従来のＲＡＭまたはキャッシュとして実施されてもよい。パラメータメモリ／キャッシュ３０８は、例えば、複数のスレッドにより必要となることのある状態パラメータ及び／または他のデータ（例えば、種々の定数）を保持するのに使用できる。また、処理エンジン３０２は、メモリインターフェイス２１４を経てオフチップ「グローバル」メモリ３２０にアクセスすることができ、これは、例えば、ＰＰメモリ２０４及び／またはシステムメモリ１０４を含むことができ、システムメモリ１０４は、上述したように、メモリインターフェイス２１４によりホストインターフェイス２０６を経てアクセスすることができる。ＰＰＵ２０２の外部の任意のメモリをグローバルメモリ３２０として使用してもよいことを理解されたい。複数の処理エンジン３０２は、どの処理エンジン３０２でもグローバルメモリ３２０にアクセスするのを許す相互接続部（明確に図示せず）を経てメモリインターフェイス２１４へ結合することができる。
【００３１】
[0038]一実施形態では、各処理エンジン３０２は、マルチスレッド型であり、例えば、ローカルレジスタファイル３０４の指定レーンの異なる部分における各スレッドに関連した現在状態情報を維持することにより、ある数Ｇ（例えば、２４）までのスレッドを同時に実行することができる。処理エンジン３０２は、異なるスレッドからのインストラクションを効率のロスなく任意のシーケンスで発行できるように、あるスレッドから別のスレッドへ急速にスイッチするように設計されるのが好都合である。
【００３２】
[0039]インストラクションユニット３１２は、所与の処理サイクルに対して、同じインストラクション（ＩＮＳＴＲ）をＰ個の全処理エンジン３０２へ発行できるように構成される。従って、単一クロックサイクルのレベルにおいて、コア２０８は、Ｐ重(P-way)ＳＩＭＴまたはＳＩＭＤ設計を実質的に表わすマイクロアーキテクチャーを実施する。また、各処理エンジン３０２がマルチスレッド型で、Ｇ個までのスレッドを同時にサポートするので、この実施形態のコア２０８は、同時に実行するＰ＊Ｇ個までのスレッドを有することができる。例えば、Ｐ＝１６及びＧ＝２４の場合には、コア２０８が３８４個までの同時スレッドをサポートする。
【００３３】
[0040]インストラクションユニット３１２は、同じインストラクションをＰ個の全処理エンジン３０２へ並列に発行するので、コア２０８は、複数のスレッドグループにおいて複数のスレッドを処理するのに使用されるのが好都合である。ここで使用する「スレッドグループ」とは、グループの１つのスレッドが各処理エンジン３０２に指定されるようにして、異なる入力データに対して同じプログラムを実行するＰ個までのスレッドのグループを指す。スレッドグループは、Ｐ個より少ないスレッドを含んでもよく、この場合は、そのスレッドグループが処理されるときのサイクル中には処理エンジン３０２の幾つかがアイドル状態になる。また、スレッドグループは、Ｐ個より多くのスレッドを含んでもよく、この場合は、連続するクロックサイクルにわたり処理が行われる。各処理エンジン３０２は、Ｇ個までのスレッドを同時にサポートできるので、コア２０８において所与の時間にＧ個のスレッドまでのグループを実行できることになる。
【００３４】
[0041]各クロックサイクルに、Ｇスレッドグループの選択された１つを形成しているＰ個の全スレッドに１つのインストラクションが発行される。どのスレッドが現在アクティブであるか指示するために、関連スレッドに対する「アクティブマスク」をインストラクションと共に含ませることができる。処理エンジン３０２は、アクティブマスクをコンテクスト識別子として使用して、例えば、インストラクションを実行するときに、ローカルレジスタファイル３０４の指定レーンのどの部分を使用すべきか決定する。従って、所与のサイクルに、コア２０８の全ての処理エンジン３０２が、同じスレッドグループ内の異なるスレッドに対して同じインストラクションを同期状態で実行することができる。当業者であれば、スレッドグループ内の各スレッドのこのような同期並列実行がＳＩＭＤアーキテクチャーの特徴であることが明らかであろう。あるスレッドグループ内の複数のスレッドが同期状態で実行するときには、処理エンジン３０２は、ＳＩＭＤ形態でインストラクションを実行するように構成される。しかしながら、あるインスタンスでは、あるスレッドグループ内の幾つかのスレッドが、例えば、以下に述べるように、条件付きまたは述語型インストラクション、プログラムの分岐点での発散、等のために、一時的にアイドル状態になることがある。処理エンジン３０２は、ＳＩＭＤまたはＳＩＭＴエンジンとして機能するように構成されてもよい。
【００３５】
[0042]コア２０８のオペレーションは、コアインターフェイス３０３を経て制御されるのが好都合である。ある実施形態では、コアインターフェイス３０３は、処理されるべきデータ（例えば、原始データ、頂点データ、及び／またはピクセルデータ）、状態パラメータ、及び、データをどのように処理すべきか定義するコマンド（例えば、どんなプログラムを実行すべきか）をワーク配布ユニット２１０から受け取る。コアインターフェイス３０３は、処理されるべきデータを共有メモリ３０６にロードすることができ、また、パラメータをパラメータメモリ３０８にロードすることができる。また、コアインターフェイス３０３は、インストラクションユニット３１２において各々の新たなスレッドまたはスレッドグループを初期化し、次いで、スレッドの実行を開始するようにインストラクションユニット３１２に信号を送る。スレッドまたはスレッドグループの実行が完了すると、コア２０８は、コアインターフェイス３０３に通知するのが好都合である。次いで、コアインターフェイス３０３は、他のプロセスを開始し、例えば、共有メモリ３０６から出力データを検索し、及び／または付加的なスレッドまたはスレッドグループの実行のためにコア２０８を準備することができる。
【００３６】
[0043]ここに述べるコアアーキテクチャーは、例示に過ぎず、変更や修正が考えられることが明らかである。いかなる数の処理エンジンが含まれてもよい。ある実施形態では、各処理エンジンは、それ自身のローカルレジスタファイルを有し、スレッド当たりのローカルレジスタファイルエントリーの割り当ては、固定でもよいし、または希望の通りに構成できてもよい。更に、１つのコア２０８しか示されていないが、ＰＰＵ２０２は、いかなる数のコア２０８を含んでもよく、それらコアは、互いに同じ設計のものであって、実行の振舞いが、どのコア２０８が特定の処理タスクを受け取るかに依存しないようにするのが好都合である。各コア２０８は、他のコア２０８とは独立して動作すると共に、それ自身の処理エンジン、共有メモリ、等を有するのが好都合である。
【００３７】
[0044]当業者であれば、図１、２及び３に示すアーキテクチャーは、本発明の範囲を何ら限定するものではなく、且つここに教示する技術は、本発明の範囲から逸脱せずに、これに限定されないが、１つ以上のＣＰＵ、１つ以上のマルチコアＣＰＵ、１つ以上のＧＰＵ、１つ以上のマルチコアＧＰＵ、等を含む任意の適切に構成された処理ユニットにおいて実施できることが理解されよう。
【００３８】
スレッドアレー及び協働スレッドアレー
[0045]ある実施形態では、図３のマルチスレッド処理コア２０８は、スレッドブロックまたはスレッドアレーを使用して汎用計算を実行することができる。スレッドアレーは、入力データセットに対して同じプログラムを同時に実行して出力データセットを発生する多数（ｎ０）のスレッドより成る。スレッドアレーの各スレッドには、実行中にスレッドにアクセスできる、固有のスレッド識別子（スレッドＩＤ）が指定される。このスレッドＩＤは、スレッドの処理振舞いについての種々の態様を制御する。例えば、スレッドＩＤを使用して、入力データセットのどの部分をスレッドが処理すべきか決定し、及び／または出力データセットのどの部分をスレッドが発生しまたは書き込むべきか決定することができる。
【００３９】
[0046]ある実施形態では、スレッドアレーは、「協働」スレッドアレー即ちＣＴＡとして配列される。各ＣＴＡは、入力データセットに対して同じプログラム（ここでは「ＣＴＡプログラム」と称される）を同時に実行して、出力データセットを発生するスレッドのグループである。ＣＴＡでは、スレッドは、スレッドＩＤに基づくやり方でデータを互いに共有することにより協働することができる。例えば、ＣＴＡでは、データをあるスレッドによって発生し、別のスレッドによって消費することができる。ある実施形態では、データを共有すべきポイントにおいてＣＴＡプログラムコードに同期インストラクションを挿入して、消費側スレッドがデータへのアクセスを試みる前に発生側スレッドによりデータが実際に発生されるよう確保することができる。ＣＴＡのスレッド間でのデータ共有がもしあれば、その程度は、ＣＴＡプログラムによって決定され、従って、ＣＴＡを使用する特定のアプリケーションにおいて、ＣＴＡのスレッドは、ＣＴＡプログラムに基づいて実際にデータを互いに共有してもよいし、しなくてもよいことを理解されたい。
【００４０】
[0047]ある実施形態では、ＣＴＡのスレッドは、図３の共有メモリ３０６を使用して、入力データ及び／または中間結果を同じＣＴＡの他のスレッドと共有する。例えば、ＣＴＡプログラムは、特定のデータを書き込むべき共有メモリ３０６内のアドレスを計算するためのインストラクションを含み、このアドレスは、スレッドＩＤの関数である。各スレッドは、それ自身のスレッドＩＤを使用して関数を計算し、そして対応する位置に書き込みを行う。アドレス関数は、異なるスレッドが異なる位置に書き込みを行い、関数が決定論的である限り、スレッドによって書き込まれる位置を予想できるように、定義されるのが好都合である。また、ＣＴＡプログラムは、データを読み取るべき共有メモリ３０６内のアドレスを計算するためのインストラクションを含むこともでき、そのアドレスは、スレッドＩＤの関数である。適当な関数を定義して、同期技術を与えることにより、予想可能なやり方で、ＣＴＡの１つのスレッドによって共有メモリ３０６内の所与の位置にデータを書き込み、そして同じＣＴＡの異なるスレッドによりその位置からデータを読み取ることができる。その結果、スレッド間での希望のデータ共有パターンをサポートすることができ、ＣＴＡのいずれのスレッドも、同じＣＴＡの他のスレッドとでデータを共有することができる。
【００４１】
[0048]共有メモリ３０６を使用してスレッド間で通信を行うとき、特に、スレッドがＣＴＡ内の他のスレッドに対してメモリ位置で読み取り−変更−書き込みオペレーションをアトミックに遂行するときには、読み取り及び書き込みオペレーションが正しい結果を生成することを確保するためにメモリロック及びアンロックオペレーションを使用しなければならない。共有メモリ３０６へのアトミック更新のサポートを要求するアプリケーションは、例えば、マルチスレッドヒストグラムである。各スレッドは、入力を読み取り、次いで、適当なヒストグラムのビンを増加する。ここで、ビンは、高速アクセス及びスレッドにわたる共有を許すために共有メモリ３０６に論理的に記憶される。マルチスレッドが同じビンを増加する必要がある場合には、１つのスレッドによる読み取り−変更−書き込みのオペレーションシーケンスが、別のスレッドからの書き込みにより中断されてはならず、さもなければ、共有メモリ３０６に記憶される最終結果が誤ったものになり得る。図４Ｂを参照して説明するように、共有メモリ３０６のアトミック更新のサポートを与えるためにメモリロックユニットが共有メモリ３０６内のメモリ位置をロックしたり、アンロックしたりする。
【００４２】
[0049]ＣＴＡ（または他の形式のスレッドアレー）は、データ並列分解に適した計算を遂行するのに使用されるのが好都合である。ここで使用する「データ並列分解」は、入力データに対して同じアルゴリズムを複数回並列に実行して出力データを発生することにより計算上の問題を解決する状態を含み、例えば、データ並列分解の１つの共通のインスタンスは、出力データセットの異なる部分を発生するために、入力データセットの異なる部分に同じ処理アルゴリズムを適用することを含む。データ並列分解の影響を受け易い問題は、例えば、マトリクス代数、任意の次元数における線型及び／または非線型変換（例えば、高速フーリエ変換）、及び種々のフィルタリングアルゴリズムを含み、また、フィルタリングアルゴリズムは、任意の次元数のコンボリューションフィルタ、複数次元の分離可能なフィルタ、等を含む。入力データセットの各部分に適用されるべき処理アルゴリズムは、ＣＴＡプログラムにおいて指定され、そしてＣＴＡ内の各スレッドは、入力データセットの一部分に対して同じＣＴＡプログラムを実行するか、または出力データセットの一部分を発生する。ＣＴＡプログラムは、広範囲の数学的及び論理的オペレーションを使用してアルゴリズムを実施することができ、また、プログラムは、条件付きまたは分岐実行経路と、直接的及び／または間接的メモリアクセスとを含むことができる。
【００４３】
[0050]一実施形態では、図１のＣＰＵ１０２で実行されるドライバプログラムは、ＣＴＡを定義するコマンドをメモリ（例えば、システムメモリ１０４）内のプッシュバッファ（明確に図示せず）へ書き込み、これは、ＰＰＵ２０２によりコマンドが読み取られるところである。これらコマンドは、ＣＴＡ内のスレッドの数、ＣＴＡを使用して処理されるべき入力データセットのグローバルメモリ３２０内の位置、実行されるべきＣＴＡプログラムのグローバルメモリ３２０内の位置、及び出力データを書き込むべきグローバルメモリ３２０内の位置のような状態パラメータに関連付けられるのが好都合である。この状態パラメータは、コマンドと一緒にプッシュバッファに書き込まれてもよい。コマンドに応答して、コアインターフェイス３０３は、状態パラメータをコア２０８（例えば、パラメータメモリ３０８）へロードし、次いで、ＣＴＡパラメータで指定されたスレッドの数が起動されるまでスレッドの起動を開始する。一実施形態では、コアインターフェイス３０３は、起動されたスレッドにスレッドＩＤを順次に指定する。より一般的には、ＣＴＡの全スレッドが同じコア２０８において同じプログラムを実行するので、有効スレッドＩＤの各々が１つのスレッドのみに指定される限り、どのスレッドにどのようなスレッドＩＤが指定されてもよい。固有の識別子（数字識別子を含むが、これに限定されない）をスレッドＩＤとして使用することができる。一実施形態では、ＣＴＡが、ある数（ｎ０）のスレッドを含む場合には、スレッドＩＤは、０からｎ０−１までの単なる順次（一次元）インデックス値である。他の実施形態では、多次元インデックス機構を使用することができる。スレッドＩＤを参照することによってデータの共有が制御される限り、処理エンジンにスレッドを特定に指定しても、ＣＴＡの実行結果に影響が及ぶことはない。従って、ＣＴＡプログラムは、それを実行すべき特定のハードウェアとは独立したものでよい。
【００４４】
マルチスレッドインストラクション処理
[0051]図４Ａは、本発明の１つ以上の態様に基づく、図３の並列処理ユニット２０２のためのインストラクションユニット３１２を示すブロック図である。このインストラクションユニット３１２は、インストラクションフェッチユニット４００と、インストラクションキャッシュ４３０と、ディスパッチャー４３５と、条件コードユニット４５０とを含む。インストラクションフェッチユニット４００は、処理されるべきデータと、データを処理するのに使用すべきプログラムに対応するプログラム識別子とを受け取る。
【００４５】
[0052]プログラムカウンタ記憶装置４０５は、各スレッドグループに対して実行されるべき次のプログラムインストラクション（ＩＮＳＴＲ）を指示するアクティブなプログラムカウンタを記憶する。Ｇ＝２４のときには、プログラムカウンタ記憶装置４０５は、２４個のアクティブなプログラムカウンタを記憶する。同様に、スレッド状態記憶装置４２０は、各スレッドグループに対するアクティブなマスクを記憶し、アクティブなマスクの各ビットは、Ｐ個の処理エンジン３０２の整数に対応する。それ故、アクティブなマスクにおけるビット数は、スレッドグループにおけるスレッドの数である。また、スレッド状態記憶装置４２０は、各スレッドグループに対するディセーブルマスクも記憶する。ディセーブルマスクは、スレッドグループ内の各スレッドに対してフラグを含む。このフラグは、スレッドがイネーブルされたか、条件付きリターンインストラクションの処理のためにディセーブルされたか、条件付きブレークインストラクションの処理のためにディセーブルされたか、またはスレッドがプログラムを退出したか、指示する。これらインストラクションの処理、及びディセーブルマスクの決定は、図５Ａ、５Ｂ及び７を参照して説明する。
【００４６】
[0053]ＣＲＳ（コール(call)、リターン(return)、同期(synchronization)）スタック４２５は、図４に実行スタック（０）〜（Ｇ−１）として示された各スレッドグループのための実行スタックを含む。実行スタックは、例えば、トークンタイプ、トークンプログラムカウンタ及びトークンマスクのような状態情報を含むトークンをプッシュ及びポップするために制御インストラクションの処理中に使用される。本発明のある実施形態では、ＣＲＳスタック４２５は、実行スタック４５５に対してグローバルメモリ３２０へのエントリーをこぼし、実行スタック４５５は、オーバーフローし、ＣＲＳスタック４２５にスペースが得られたときにこぼれたエントリーを回復させることができる。コントローラ４１５は、制御インストラクションが実行されるときにＣＲＳスタック４２５からエントリーをプッシュ及びポップする。一実施形態では、６つのタイプの制御インストラクションがある。即ち、条件付き分岐インストラクションと、コールインストラクションと、プレブレーク(PreBreak)インストラクションと、プレリターン(PreReturn)インストラクションと、条件付きリターンインストラクションと、同期インストラクションと、条件付きブレークインストラクションである。別の実施形態は、それより多数または少数のタイプの制御インストラクション、並びに異なるタイプの制御インストラクションを含んでもよい。
【００４７】
[0054]コントローラ４１５は、スレッドグループに対するアクティブなプログラムカウンタ及びアクティブなマスクをインストラクションキャッシュ４３０に与える。このインストラクションキャッシュ４３０は、アクティブなプログラムカウンタに対応するインストラクションを得、そしてそのインストラクション及びアクティブなマスクをディスパッチャー４３５へ出力する。インストラクションキャッシュ４３０は、当業者に知られたキャッシュ技術を使用して、グローバルメモリ３２０からインストラクションを必要に応じて読み取る。コントローラ４１５は、制御インストラクションが実行されるときに条件コードユニット４５０から制御情報４４０を経て制御情報を受け取る。この制御情報は、制御インストラクションのタイプを示すトークンタイプと、スタックアンワインド(unwind)信号と、トークンをＣＲＳスタック４２５にプッシュすると共に、スレッドグループに対するアクティブマスク及びディセーブルマスクを更新するのに必要な他のデータとを含む。
【００４８】
[0055]ディスパッチャー４３５は、インストラクションをデコードし、条件付き制御インストラクション（条件付き分岐、条件付きブレーク、及び条件付きリターン）に対する条件付きデータを条件コードユニット４５０へ出力する。条件付きデータは、（制御インストラクションにより指定される）条件テスト及び比較値を含み、これらに対して条件コードが適用される。従来、条件コードは、インストラクションにより指定された条件テストを比較値に対して評価し、真または偽の結果を発生するのに使用される。整数値に対する８つの条件テストのうちの６つは、従来の条件テスト、例えば、より小さい(lessthan)（ＬＴ）、等しい(equal)（ＥＱ）、より大きい(greater than)（ＧＴ）、以下(less than or equal)（ＬＥ）、以上(greaterthan or equal)（ＧＥ）、及び不等(not equal)（ＮＥ）である。条件テストは、比較値が正であるか、ゼロであるかまたは負であるか決定するのに使用される。
【００４９】
[0056]浮動小数点フォーマット値が使用されるときには、条件テストは、ＮａＮ（非数(not-a-number)）値のような非順序値に対する振舞いを定義する条件テストも含むことができる。ＮａＮは、数値に対して順序をもたず、それ故、比較値を発生するのに使用されたときまたは従来の条件テストのための入力として使用されたときには、予期せぬ結果を生じさせる。８つの新たな条件テスト、例えば、ＬＥＧ、Ｕ、ＬＴＵ、ＥＱＵ、ＬＥＵ、ＧＴＵ、ＮＥＵ及びＧＥＵは、ＮａＮ値の明確なハンドリングを与える。ＬＥＧ（より小さい、等しい、またはより大きい）は、比較値がゼロ、正または負であり、即ち順序付けされるときしか真とならない。Ｕ（非順序）は、比較値が非順序付けされ、即ちＮａＮであるときしか真とならない。ＬＴＵ（ゼロ未満または非順序）は、比較値が負またはＮａＮであるときに真となる。ＥＱＵ（ゼロに等しいまたは非順序）は、比較値がゼロまたはＮａＮであるときしか真とならない。ＬＥＵ（ゼロ以下または非順序）は、比較値が負、ゼロまたはＮａＮのときしか真とならない。ＧＴＵ（ゼロより大きいまたは非順序）は、比較値が正またはＮａＮであるときしか真とならない。ＮＥＵ(ゼロに等しくなくまたは非順序）は、比較値が正、負またはＮａＮであるときしか真とならない。ＧＥＵ(ゼロ以上または非順序)は、比較値が正、ゼロまたはＮａＮであるときしか真とならない。
【００５０】
[0057]他の２つの従来の条件テスト(整数及び浮動小数点値に対する)は、常に(ＴＲ)であって、決して（ＦＬ）ではない。オーバーフロー及び桁上げのような付加的な条件テストも使用でき、従って、条件テストの数が増加される。比較値は、プログラムの実行中に計算することができ、スレッドグループ内の各スレッドは、比較値を有してもよい。それ故、条件テストが評価されるときには、あるスレッドは、真の結果を発生し、一方、他のスレッドは、偽の結果を発生することがある。１つ以上のアクティブなスレッドが、他のアクティブなスレッドとは異なる条件テスト結果を生じるときには、スレッドが発散し、ＣＲＳスタックを使用して、分岐の第１の側が実行を完了した後に実行される分岐の側に対してアクティブなマスク及びプログラムカウンタを含むトークンを記憶する。
【００５１】
[0058]また、条件付きデータに加えて、ディスパッチャーは、制御インストラクション(コール、ブレーク、リターン、分岐、等)、インストラクションにより指定されるターゲットプログラムカウンタ(アドレス)、及びアクティブなマスクを条件コードユニット４５０へ出力する。制御インストラクションは、ディスパッチャー４３５によって処理エンジン２０３へ出力されない。むしろ、条件コードユニット４５０は、この条件コードユニット４５０によりコントローラへ出力された制御情報に含まれたアクティブなマスクに基づいて「テークン(taken)」マスクを決定する。より詳細には、条件コードユニット４５０は、条件テスト結果を使用して、インストラクションにより指定されたテスト条件に対して「真」と評価するアクティブなスレッドを指示する「テークンマスク」を決定する。真の比較テスト結果を指示するスレッドグループ内のスレッドに対するこのテークンマスクのビットがクリアされる。アクティブなマスク及びテークンマスクは、ディセーブルマスクを更新するように、コントローラ４１５によって使用することができる。異なるファンクションポインタを有する２つ以上のスレッドでファンクションコールが遂行されるときには、ファンクションコールが直列化されて、各固有のファンクションポインタを指定するスレッドを実行すると共に、テークンマスクを使用して、各固有のファンクションポインタに対するアクティブなスレッドを指示する。
【００５２】
[0059]条件コードユニット４５０は、テークンマスク及びトークンタイプを、制御情報４４０を経てコントローラ４１５へ出力する。ターゲットプログラムカウンタがコール又は分岐制御インストラクションにより指定されるときには、テークンプログラムカウンタが条件コードユニット４５０により制御情報４４０を経てコントローラ４１５へ出力される。トークンタイプは、ディセーブルマスクを発生するために実行された制御インストラクションのタイプを指示する。トークンタイプは、同期、コール、発散、及びブレークを含む。スレッドに対する制御インストラクションが、フライト中(in-flight)であり、即ちコントローラ４１５により出力されたが制御情報４４０を経てコントローラ４１５によりまだ受け取られていないときには、同じスレッドに対する別のインストラクションがコントローラ４１５により出力されてはならないことに注意されたい。
【００５３】
[0060]ディスパッチャー４３５によって受け取られる他のインストラクション（非制御インストラクション）は、処理エンジン３０２へ出力するために待ち行列に入れられる。ディスパッチャー４３５は、インストラクションを処理するのに必要な（計算又は記憶）リソースの利用性に基づきインストラクションを出力するように構成されてもよい。ディスパッチャー４３５のある実施形態では、スコアボード機構を使用して、リソースの利用性を追跡すると共に、どのインストラクションを処理エンジン３０２へ出力できるか決定する。処理エンジン３０２がインストラクションを受け取ると、そのインストラクションを実行するのに必要なオペランドを得るために読み取り要求が発生されて、その読み取り要求がＬＲＦ３０４又は共有メモリ３０６へ出力される。次いで、インストラクションは、オペランドが得られたときに処理エンジン３０２によって処理される。
【００５４】
共有メモリにアクセスするためのロック及びアンロックコマンド
[0061]図４Ｂは、本発明の１つ以上の態様に基づく、図３に示す共有メモリ３０６のブロック図である。共有メモリ３０６内の位置にアクセスするアトミックオペレーションのサポートを与えるために、処理エンジン３０２からのメモリ読み取り及び書き込み要求がメモリロックユニット４１０へ入力される。記憶リソース４０６内の位置に対するロック状態を記憶するロックビット４７４のセットが設けられる。本発明のある実施形態では、ロックビットは、記憶リソース４０６内の各アドレス位置に対して専用のものでよい。本発明の他の実施形態では、各ロックビットは、記憶リソース４０６内の多数のアドレス位置間で共有されてもよい。更に、ロックビット４７４又は他のロックビットを使用して、グローバルメモリ３２０のような他のアドレススペースをカバーし、また、記憶リソース４０６及びグローバルメモリ３２０内のアドレス可能な位置間で各ロックビットを共有してもよい。
【００５５】
[0062]記憶リソース４０６内の物理的メモリは、複数のＣＴＡが同時に実行されるのを許すように動的に細分化される。ロックビット４７４に必要な記憶量を減少するために、記憶リソース４０６内のエントリーの複数アドレスがロックビット４７４内の同じロックビットに対してエイリアシングされる。処理エンジン３０２から受け取られた要求メモリアドレスをロックビットアドレス、例えば、ロックアドレスへマップするために、メモリロックユニット４１０によりハッシュ関数が実施されてもよい。本発明の好ましい実施形態では、ハッシュ関数は、ワードアドレスＮ及びＮ＋１が異なるロックビットへとマップされ、且つ少なくとも２５６個の独立したロックが設けられることを保証する。本発明のある実施形態では、ハッシュ関数は、要求に対して受け取られたアドレスの下位ビットを単純に使用する。
【００５６】
[0063]メモリロックユニット４１０は、重要な経路にパイプライン段または判断ロジックを追加することを要求せずに、既存の共有メモリ読み取り／書き込みロジックに追加することができる。更に、ロックビット４７４は、記憶リソース４０６と同じアクセス要件を有するバンク型単一ポート付きＲＡＭ(ランダムアクセスメモリ)またはラッチアレーとして実施されてもよい。より詳細には、記憶リソース４０６へのアクセスを制御するのに使用されるものに対する既存のバンク競合及びアドレス直列化ロジックが、ロックビット４７４に対してメモリロックユニット４１０により設けられる。
【００５７】
[0064]共有メモリ３０６へのアトミック更新に対するサポートを与えるために、共有メモリ読み取り及び書き込みインストラクションが、ロック取得及びロック解除サフィックスで増強される。共有メモリ読み取りインストラクションＧ２Ｒは、読み取られるアドレスに対するロックを取得するよう試みるために、ロックコマンドサフィックス.ＬＣＫを指定する。Ｇ２Ｒ.ＬＣＫは、図５Ａを参照して説明するように、指示されたアドレスに記憶されるデータと、ロックが首尾良く得られたかどうか指示するフラグと、の両方をリターンする。ロックビットは、メモリ読み取り及び書き込みアクセスと並列にアクセスされ、ロックを取得及び解除するのに付加的なパイプライン段またはロックサイクルが必要とされないようにする。
【００５８】
[0065]ロックが首尾良く取得された場合には、プログラムは、データを変更し、新たな値を、指示されたアドレスにより指定される位置に記憶し、そして（.ＵＮＬサフィックスを使用して）ロックを解除して、他のスレッドが、その位置、または解除されたロックアドレスと同じロックアドレスへアドレスがエイリアシングする別の位置、にアクセスするのを許す。Ｇ２Ｒ.ＬＣＫインストラクションによりロックが首尾良く取得されない場合には、プログラムは、図５Ｃを参照して述べるように、再びロックを取得するように試みなければならない。ロックビットを授けるのはプログラムの役割であることに注意されたい。というのは、メモリロックユニット４１０は、ロック所有権を追跡するように構成されておらず、従って、ロックを取得していないスレッドが記憶リソース４０６内のロックされた位置を変更するのを防止できないからである。
【００５９】
[0066]テーブル１は、インストラクションサフィックスを使用して指定されるロックコマンド(ＬＣＫ)の機能を示すプログラムインストラクションのセットである。プログラムインストラクションは、説明を容易にするためにＣ擬似コードで表わされる。Ｇ２Ｒ.ＬＣＫインストラクションの実行は、図５Ａを参照して説明する。
【００６０】
【表１】
0005035277.tif 000002
[0067]図５Ａは、本発明の１つ以上の実施形態に基づき共有メモリ３０６に対するテーブル１に示されたロックオペレーションを遂行するための方法ステップを示すフローチャートである。ステップ５００において、メモリロックユニット４１０は、Ｇ２Ｒ.ＬＣＫインストラクションに対して指定されたアドレスを受け取り、そしてハッシュアドレス(hash_addr)を決定する。本発明のある実施形態では、ロックアドレスは、アドレスの下位８ビットである。バイトアドレスを使用するときには、４バイトの粒度を使用してロックが行われ、アドレスの下位８ビットは、ビット９：２である。ステップ５０５では、メモリロックユニット４１０は、ロックアドレスを使用してロックビット４７４を読み取ることによりロックアドレスに対するロック結果を計算し、return_lockを得る。スレッドグループ内で、あるスレッドは、ロックを取得でき、他のスレッドは、ロックを取得できない。スレッドグループ内の複数スレッドが同じアドレスをロックするように同時に試みる場合には、１つのスレッドしかロックが許可されない。
【００６１】
[0068]ステップ５１０では、メモリロックユニット４１０は、ロックアドレスに対応するロックビット４７４においてロックフラグをセットする。return_lockは、以前のロックフラグの単なる逆型であり、そしてロックフラグは、無条件にセットされることに注意されたい。このインストラクションの前にロックアドレスがロックされたかどうかに関わらず、ロックフラグが読み取られた後にそれがロックされる。ステップ５１５では、アドレスに対応する記憶リソース４０６のエントリーが読み取られて、データを得る。重要なことに、ロックフラグの更新は、記憶リソース４０６へのアクセスと同時に行うことができる。というのは、記憶リソース４０６のエントリーの読み取りが、ロックフラグの値に依存しないからである。それ故、ロックオペレーションを遂行するのに、付加的なロックサイクルもパイプライン段も必要とされない。
【００６２】
[0069]テーブル２は、インストラクションサフィックスを使用して指定されたアンロックコマンド(ＵＮＬ)の機能を示すプログラムインストラクションのセットである。プログラムインストラクションは、説明を容易にするためにＣ擬似コードで表わされ、ここで、hash_addrは、ロックアドレスである。Ｒ２Ｇ.ＵＮＬインストラクションの実行は、図５Ｂを参照して説明する。
【００６３】
【表２】
0005035277.tif 000003
[0070]図５Ｂは、本発明の１つ以上の実施形態に基づき共有メモリ３０６に対するテーブル２に示されたアンロックオペレーションを遂行するための方法ステップを示すフローチャートである。ステップ５２０において、メモリロックユニット４１０は、Ｒ２Ｇ.ＵＮＬインストラクションに対して指定されたアドレスを受け取り、そしてハッシュアドレス(hash_addr)を決定する。ステップ５２５では、メモリロックユニット４１０は、ロックアドレスに対応するロックビット４７４のロックフラグをクリアする。ステップ５３０では、アドレスに対応する記憶リソース４０６のエントリーが、Ｒ２Ｇ.ＵＮＬインストラクションで与えられたデータと共に書き込まれる。重要なことに、ロックフラグをセットするのは、無条件であり、記憶リソース４０６のエントリーに対する更新と同時に行われる。それ故、アンロックオペレーションを遂行するのに、付加的なロックサイクルもパイプライン段も必要とされない。
【００６４】
[0071]テーブル３は、ロック及びアンロックコマンドの使用を示すプログラムインストラクションのセットである。プログラムインストラクションは、説明を容易にするために、アッセンブリ擬似コードで表わされる。テーブル３に示すコードの実行は、図５Ｃを参照して説明する。ＳＩＭＴプロセッサの環境で説明するが、テーブル１、２及び３に示すプログラムインストラクションは、単一スレッドまたはマルチスレッドのいずれの形式のプロセッサで実行されてもよい。
【００６５】
【表３】
0005035277.tif 000004
図５Ｃは、本発明の１つ以上の態様に基づきロック及びアンロックコマンドを使用して共有メモリ３０６に対するアトミック更新を許すための方法ステップのフローチャートである。コントローラ４１５は、アクティブなプログラムカウンタをインストラクションキャッシュ４３０に出力することによりスレッドに対するアクティブなプログラムカウンタ(ＰＣ)の現在設定に対応するプログラムインストラクションをフェッチする。ディスパッチャー４３５は、プレブレークインストラクション(ＰＢＫ)が制御インストラクションであることを決定し、そしてＰＢＫインストラクションを条件コードユニット４５０へ出力する。ステップ５５０において、プレブレークインストラクションを実行して、ループ後アドレス(afterloop address)ＬＯＣＫＤＯＮＥをＣＲＳスタック４２５にプッシュし、共有メモリ３０６のアトミック更新に続くプログラムの実行を継続する。スレッドは、それらのロックされたオペレーションを完了すると(例えば、ロックを首尾良く取得すると)、スレッドグループの全てのスレッドがロックの取得に成功するまでそれらをディセーブルさせるブレークインストラクション(ＢＲＫ)を実行する。最後のスレッド(１つまたは複数)がブレークインストラクションを実行すると、ＰＢＫトークンが最終的にスタックからポップされ、そしてＰＢＫインストラクションのときに有効であった元のアクティブなマスクを使用してＬＯＣＫＤＯＮＥアドレスへ制御が移行される。スレッドグループのスレッドは、ブレークインストラクションが最後に実行されるときに発散せず、それ故、スレッドをループから退出させる条件を満足する。プレブレークインストラクションを実行した後に、コントローラ４１５は、プログラムカウンタ記憶装置４０５にスレッドに対して記憶されたアクティブなプログラムカウンタを増加し、スレッドに対する次のインストラクションを指すようにする。
【００６６】
[0072]ステップ５５５では、Ｇ２Ｒ.ＬＣＫインストラクションは、ディスパッチャー４３５により処理エンジン３０２へ出力される。ロックコマンドがアドレスＡ１に対して実行され、Ａ１により指定されたアドレスから読み取られたデータがＬＲＦ３０４のレジスタＲ２に記憶される。ステップ５６０では、スレッドグループの各スレッドに対するロックフラグの値がメモリロックユニット４１０により出力されて、条件レジスタＣ１（図示せず）に記憶される。Ｃ１の値は、処理エンジン３０２により条件コードユニット４５０へ入力として与えられ、アクティブなプログラムカウンタが増加される。
【００６７】
[0073]ステップ５６５では、ＡＤＤインストラクションがディスパッチャー４３５により処理エンジン３０２へ出力され、共有メモリ３０６から読み取られた値に対してオペレーションを遂行する。処理エンジン３０２は、Ｒ２に記憶された値をレジスタＲ２及びＲ７の値の和として更新し、アクティブなプログラムカウンタが増加される。ステップ５７０では、ディスパッチャー４３５は、Ｃ１.ＮＥによって指定された条件を評価し、どのロック結果が、ロックが成功であったことを指示するか決定する。ステップ５７０においてロック結果が、ロックが成功であったことを指示するスレッドに対して、ステップ５７５においてアンロックコマンドが実行され、各ロックフラグをクリアすると共に、Ｒ２に記憶された変更されたデータを、共有メモリ３０６のアドレスＡ１に対応する位置に書き込む。アクティブなプログラムカウンタが増加され、方法はステップ５８０へ進む。ステップ５７０では、ロックを取得し損なったスレッドは、ステップ５７５をバイパスして、ステップ５８０へ直接進む一方、アクティブなプログラムカウンタを増加する。
【００６８】
[0074]ステップ５８０では、コントローラ４１５は、Ｃ１.ＮＥ条件が条件付きブレークインストラクションに対して評価されたときに条件コードユニット４５０により与えられるテークンマスクに基づいてアクティブなスレッドのいずれかが発散するかどうか決定する。条件コードユニット４５０は、テークンマスク、トークンタイプ、及びターゲットプログラムカウンタを含む制御情報をコントローラ４１５へ出力する。コントローラ４１５は、少なくとも１つのアクティブなスレッドがスレッドグループ内の他のアクティブなスレッドから発散することを決定した場合に、条件Ｃ１.ＮＥが真であるスレッドをディセーブルし、減らされたアクティブマスクでの実行を継続する。トークンプログラムカウンタは、スレッド内の次のインストラクションを指定するように増加されたアクティブなプログラムカウンタに等しい。
【００６９】
[0075]コントローラ４１５は、アクティブなマスクを、試みられたロックが不首尾であったために条件テストに対して「真」と評価したアクティブなスレッドを指示するテークンマスクとして決定する。コントローラ４１５は、アクティブなプログラムカウンタを、分岐インストラクションＬＯＯＰにより指定されるターゲットプログラムカウンタ（アドレス）にセットし、そしてスレッドグループ内の全てのアクティブなスレッドが首尾良くロックを取得するまで、ステップ５５５、５６０、５６５及び５７０が繰り返される。この方法は、アドレスのエイリアシングにより複数のスレッドが同じロックビットへのアクセスを試みたときでも、ロックを取得したスレッドがデータを書き込んでロックを解除するので、前方に進行できるようにすることに注意されたい。
【００７０】
[0076]ステップ５７５を完了したスレッドは、ステップ５７５を完了するために、共有メモリ３０６の各エントリーを首尾良くロックしていないスレッドを待機する。全てのアクティブなスレッドがアンロックコマンド及びその関連インストラクションを実行すると、スレッドは発散せず、そして全てのアクティブなスレッドは、ブレークインストラクションに対する条件テストに合格する。従って、ステップ５８５において、発散トークンがＣＲＳスタック４２５からポップされ、ＬＯＣＫＤＯＮＥにおいて第１のインストラクションが実行される。当業者であれば、図５Ａ、５Ｂ及び５Ｃに示す方法ステップをいずれの順序で遂行するように構成されたいずれのシステムも本発明の範囲内に包含されることが理解されよう。
【００７１】
[0077]このシステム及び方法は、アトミックなメモリオペレーションを遂行するために共有メモリにアクセスする改良されたロックメカニズムを提供する。より詳細には、ロックが首尾良くなされたかどうか指示する即時フィードバックが与えられる。読み取られたデータは、ロック結果と共に要求元へ返送され、要求元がデータを処理できるようにする。ロック状態は、読み取り中にロックするかまたは書き込み中にアンロックするときに同時に変更でき、読み取り−変更−書き込みオペレーション中に個別のトランザクションとしてロック状態をチェックするための待ち時間に関して付加的なオーバーヘッドが生じないようにする。更に、各アトミックなメモリオペレーションに対してロックまたはアンロックが明確に指定され、アドレスのエイリアシングによる競合が、データを変更し得るオペレーションにしか影響を及ぼさないようにする。
【００７２】
[0078]本発明の一実施形態は、コンピュータシステムに使用するためのプログラム製品として実施することができる。プログラム製品のプログラム（１つまたは複数）は、（ここに述べる方法を含む）実施形態の機能を定義し、そして種々のコンピュータ読み取り可能な記憶媒体に含ませることができる。ここに例示するコンピュータ読み取り可能な記憶媒体は、（ｉ）情報が永久的に記憶される書き込み不能の記憶媒体（例えば、コンピュータ内のリードオンリメモリ装置、例えば、ＣＤ−ＲＯＭドライブにより読み取り可能なＣＤ−ＲＯＭディスク、フラッシュメモリ、ＲＯＭチップ、または任意の形式のソリッドステート不揮発性半導体メモリ）、及び（ii）変更可能な情報が記憶される書き込み可能な記憶媒体（例えば、ディスケットドライブまたはハードディスクドライブ内のフロッピーディスク、または任意の形式のソリッドステートランダムアクセス半導体メモリ）を含むが、これらに限定されない。
【００７３】
[0079]本発明は、特定の実施形態を参照して以上に説明した。しかしながら、当業者であれば、特許請求の範囲に述べる本発明の広い精神及び範囲から逸脱せずに種々の変更や修正がなされ得ることが理解されよう。従って、以上の説明及び添付図面は、例示のためのものであって、それに限定されるものではない。
【符号の説明】
【００７４】
１００・・・システム、１０２・・・ＣＰＵ、１０４・・・システムメモリ、１０５・・・メモリブリッジ、１０６・・・通信経路、１０７・・・Ｉ／Ｏブリッジ、１０８・・・入力装置、１１０・・・ディスプレイ装置、１１２・・・並列処理サブシステム、１１３・・・通信経路、１１４・・・システムディスク、１１６・・・スイッチ、１１８・・・ネットワークアダプタ、１２０・・・アドインカード、１２１・・・アドインカード、２０２・・・ＰＰＵ、２０４・・・ＰＰメモリ、２０６・・・ホストインターフェイス、２０８・・・コア、２１０・・・ワーク配布ユニット、２１２・・・フロントエンド、２１４・・・メモリインターフェイス、３０２・・・処理エンジン、３０３・・・コアインターフェイス、３０４・・・ローカルレジスタファイル、３０６・・・共有メモリ、３０８・・・パラメータメモリ、３１２・・・インストラクションユニット、３２０・・・グローバルメモリ、４００・・・インストラクションフェッチユニット、４０５・・・プログラムカウンタ記憶装置、４０６・・・記憶リソース、４１０・・・メモリロックユニット、４１５・・・コントローラ、４２０・・・スレッド状態記憶装置、４２５・・・ＣＲＳスタック、４３０・・・インストラクションキャッシュ、４３５・・・ディスパッチャー、４４０・・・制御情報、４５０・・・条件コードユニット、４５５・・・実行スタック、４７４・・・ロックビット。
【図１】
0005035277.tif 000005
【図２】
0005035277.tif 000006
【図３】
0005035277.tif 000007
【図４Ａ】
0005035277.tif 000008
【図４Ｂ】
0005035277.tif 000009
【図５Ａ】
0005035277.tif 000010
【図５Ｂ】
0005035277.tif 000011
【図５Ｃ】
0005035277.tif 000012