(57)【特許請求の範囲】
【請求項１】
１つ以上のプロセッサ上で作業項目のグループを同期させる方法であって、
前記プロセッサは、
前記グループからの第１の作業項目によってバリアスキップ命令を実行するステップと、
前記実行されたバリアスキップ命令に応じて、シーケンスにおける複数の点の何れかにおいてバリアに到達することを前記第１の作業項目に要求せずに、及び、前記第１の作業項目を進めつつ前記複数の点の何れかにおいて前記バリアで同期させることなく、前記複数の点において前記グループからの他の作業項目を同期させるように前記バリアを再構成するステップと、の各ステップを実行する、方法。
【請求項２】
同期点のシーケンスで前記グループを同期させるように前記バリアを構成するステップを更に含み、前記シーケンスは前記複数の点を含む、請求項１に記載の方法。
【請求項３】
他の作業項目を同期させるように前記バリアを再構成するステップは、
前記バリアと関連付けられたスキップカウントをインクリメントするステップを含み、前記スキップカウントは、前記グループからの全ての作業項目が前記バリアに到達したかどうかを判断するときに使用される、請求項１に記載の方法。
【請求項４】
前記複数の点の第１及び第２の点で他の作業項目を同期させるステップを更に含み、前記第１の作業項目は、前記第１及び第２の点で前記バリアに到達しない、請求項１に記載の方法。
【請求項５】
前記他の作業項目を同期させるステップは、
前記バリアに到達する前記他の作業項目ごとに、前記他の作業項目のうち最後のものであるかを判断するステップを含み、
前記他の作業項目のうち前記最後のものが前記バリアに到達すると、処理を再開するように前記他の作業項目の全てを非ブロック化する、請求項４に記載の方法。
【請求項６】
前記他の作業項目のうち最後のものであるかを判断するステップは、
スキップカウントと訪問カウントとの和を、解除閾値と比較するステップを含み、スキップ命令が実行される場合に前記スキップカウントがインクリメントされ、作業項目が前記バリアに到達する場合に前記訪問カウントがインクリメントされ、前記解除閾値は、前記グループ内の作業項目の数に対応する、請求項５に記載の方法。
【請求項７】
前記他の作業項目を同期させるステップは、
前記第１の点で前記他の作業項目を同期させるステップと、
前記他の作業項目のみを同期させるために前記バリアを一部再設定するステップと、
前記作業項目のみを同期させるために前記バリアを前記一部再設定するステップに続いて、前記第２の点で前記他の作業項目を同期させるステップと、を含む、請求項４に記載の方法。
【請求項８】
前記他の作業項目のみを同期させるために前記バリアを一部再設定するステップは、
前記バリアと関連付けられた訪問カウントであって、前記バリアに到達する作業項目の数を表す訪問カウントを、どの作業項目も前記バリアに到達していないことを示す初期値に設定するステップと、
作業項目がバリアスキップ命令を発行する場合にインクリメントされるスキップカウントの値を持続するステップと、を含む、請求項７に記載の方法。
【請求項９】
前記グループからの何れかの作業項目によってバリア再設定命令を実行するステップと、
前記バリア再設定命令に応じて、前記グループを同期させるために前記バリアに到達させることを、前記グループからの全ての作業項目に要求するように、前記バリアを更に再構成するステップと、を更に含む、請求項１に記載の方法。
【請求項１０】
全ての作業項目に要求するように、前記バリアを更に再構成するステップは、
前記バリアと関連付けられた訪問カウントを、どの作業項目も前記バリアに到達していないことを示す初期値に設定するステップと、
前記バリアと関連付けられたスキップカウントを、前記バリアと関連付けられたバリアスキップ命令を発行した作業項目がないことを示す初期値に設定するステップと、を含む、請求項９に記載の方法。
【請求項１１】
前記作業項目のグループは作業グループであり、前記作業グループは、グラフィックス処理部の処理要素において実行する、請求項１に記載の方法。
【請求項１２】
前記グループは、グラフィックス処理部において実行するウェーブフロントの２つ以上の作業グループからの作業項目を含む、請求項１に記載の方法。
【請求項１３】
前記グループは、ＣＰＵ上で実行する作業項目を含む、請求項１に記載の方法。
【請求項１４】
同期点のシーケンスで前記グループを同期させるように前記バリアを構成するステップは、ライブラリ関数に含まれる命令に応じて行われる、請求項１に記載の方法。
【請求項１５】
システムであって、
１つ以上のプロセッサと、
前記１つ以上のプロセッサ上で実行する作業項目のグループと、
バリア同期モジュールであって、前記１つ以上のプロセッサによって実行される場合に、前記１つ以上のプロセッサに、
前記グループからの第１の作業項目によってバリアスキップ命令を実行させ、
前記実行されたスキップ命令に応じて、シーケンスにおける複数の点の何れかにおいてバリアに到達することを前記第１の作業項目に要求せずに、及び、前記第１の作業項目を進めつつ前記複数の点の何れかにおいて前記バリアで同期させることなく、前記複数の点において前記グループからの他の作業項目を同期させるように前記バリアを再構成させるように構成されている、バリア同期モジュールと、を備える、システム。
【請求項１６】
前記バリア同期モジュールは、前記１つ以上のプロセッサによって実行される場合に、前記１つ以上のプロセッサに、
前記複数の点を含む同期点のシーケンスで前記グループを同期するためにバリアを構成させるように、更に構成されている、請求項１５に記載のシステム。
【請求項１７】
前記１つ以上のプロセッサは、異種計算システムの一部である、請求項１５に記載のシステム。
【請求項１８】
前記バリア同期モジュールは、前記１つ以上のプロセッサによって実行される場合に、前記１つ以上のプロセッサに、
前記グループからの何れかの作業項目によってバリア再設定命令を実行させ、
前記バリア再設定命令に応じて、前記グループを同期させるために、前記グループからの全ての作業項目に前記バリアに到達することを要求するように、前記バリアを更に再構成させるように構成されている、請求項１５に記載のシステム。
【請求項１９】
コマンドを記憶するコンピュータ可読記憶媒体であって、前記コマンドは、プロセッサによって実行されると、
グループからの第１の作業項目によってバリアスキップ命令を実行するステップと、
前記実行されたバリアスキップ命令に応じて、シーケンスにおける複数の点の何れかにおいてバリアに到達することを前記第１の作業項目に要求せずに、及び、前記第１の作業項目を進めつつ前記複数の点の何れかにおいて前記バリアで同期させることなく、前記複数の点において前記グループからの他の作業項目を同期させるように前記バリアを再構成するステップと、を含む、方法を前記プロセッサに行わせる、コンピュータ可読記憶媒体。
【請求項２０】
前記コマンドは、前記プロセッサによって実行されると、
同期点のシーケンスで前記グループを同期させるようにバリアを構成することを更に含む方法を前記プロセッサに行わせ、前記シーケンスは前記複数の点を含む、請求項１９に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、概して、作業項目（ｗｏｒｋｉｔｅｍ）の同期に関するものである。
【背景技術】
【０００２】
グラフィックス処理装置（ＧＰＵ）は、一般に、単一命令複数データ（ＳＩＭＤ）デバイスの場合等の並列データストリーム上で、又は、データ並列処理において、同一命令を実行するのに好適な複数の処理要素を備える。多くの計算モデルでは、中央処理装置（ＣＰＵ）は、ホスト又は制御プロセッサとして、及び、ＧＰＵ等の他のプロセッサへのグラフィックス処理などのハンドオフ専用機能として機能する。
【０００３】
各ＣＰＵが多重処理コアを有するマルチコアＣＰＵは、ＧＰＵ上で利用可能な専用機能に類似する専用機能（例えば、グラフィックス処理）のための処理能力を提供する。マルチコアＣＰＵ又はＧＰＵの１つ以上の計算コアは、同じダイ（例えば、ＡＭＤ  Ｆｕｓｉｏｎ（登録商標））の一部とすることができ、或いは、異なるダイ（例えば、ＮＶＩＤＩＡ  ＧＰＵを有するＩｎｔｅｌ  Ｘｅｏｎ（登録商標））に存在し得る。近年、ＣＰＵ及びＧＰＵの両方の特性を有するハイブリッドコア（例えば、ＣｅｌｌＳＰＥ（登録商標）、Ｉｎｔｅｌ  Ｌａｒｒａｂｅｅ（登録商標））が、汎用ＧＰＵ（ＧＰＧＰＵ）型の計算のために提案されている。ＧＰＧＰＵ型の計算は、制御コードを主に実行するように、及び、ＧＰＵに性能限界データ並列コードをオフロードするように、ＣＰＵを使用することを推奨する。ＧＰＵは、アクセラレータとして主に使用されている。マルチコアＣＰＵとＧＰＧＰＵ計算モデルとの組み合わせは、アクセラレータ対象としてＣＰＵコア及びＧＰＵコアの両方を包含する。マルチコアＣＰＵコアの多くは、多くの領域におけるＧＰＵに匹敵する性能を有する。
【０００４】
いくつかのフレームワークが、ＣＰＵ及びＧＰＵを有する異種計算プラットフォームのために開発されている。これらのフレームワークは、スタンフォード大学によるＢｒｏｏｋＧＰＵと、ＮＶＩＤＩＡによる計算統一デバイスアーキテクチャ（ＣＵＤＡ：ｃｏｍｐｕｔｅ  ｕｎｉｆｉｅｄ  ｄｅｖｉｃｅ  ａｒｃｈｉｔｅｃｔｕｒｅ）と、Ｋｈｒｏｎｏｓ  Ｇｒｏｕｐという名の産業連合によるＯｐｅｎＣＬとを含む。ＯｐｅｎＣＬフレームワークは、ユーザがＧＰＵのためのアプリケーションを作り出すことができるＣ言語等の開発環境を提供する。ＯｐｅｎＣＬは、ユーザが、例えば、データ並列計算等のいくつかの計算をＧＰＵにオフロードするための命令を指定することを可能にする。また、ＯｐｅｎＣＬは、異種の又は他の計算システム内でコードがコンパイルされ、実行されることが可能なコンパイラ及び実行時環境を提供する。
【０００５】
ＯｐｅｎＣＬ、ＣＵＤＡ及び多くの低レベルのＧＰＵ中間言語により具体化される計算モデルは、場合によっては、単一命令複数スレッド（「ＳＩＭＴ」）として知られる。ＳＩＭＴモデルが頻繁に使用される実施態様では、ベクトル上でハードウェアマスクセットを使用するＳＩＭＤの実行は、ハードウェアにおいて利用可能であるものよりも微細までスレッディングをシミュレーションするために使用される。
【０００６】
ＣＰＵ及びＧＰＵの両方が多くの種類のコードの実行のために使用され得る計算モデルを効率的に利用するために、より柔軟なスレッド同期モデルが必要とされる。ＯｐｅｎＣＬにおいて利用可能な従来の作業項目の同期は、例えば、伝統的なグラフィックス処理タスクではない作業項目と共に使用される場合に、効率的ではない可能性がある。例えば、グラフィックス処理タスクにおいてそれぞれの並列の作業項目は分岐し得ないことが多い可能性があるのに対して、ＣＰＵ関連アプリケーションでは、実行の分岐が比較的高い可能性がある。ＯｐｅｎＣＬでそれ自体によって提供された同期モデルは、作業項目のそのような動的挙動を扱うには不十分である。
【０００７】
ＯｐｅｎＣＬでは、作業グループ内の作業項目が同期され得る。作業グループ内では、バリア命令は、何れかがバリアを過ぎて進み得る前に作業グループ内の全ての作業項目が当該バリアに到達する必要があるというセマンティックを用いて、発行され得る。「バリア」は、上述したセマンティックが満たされるまでバリアに到達する全てのプロセスをブロックする。そして、バリアは、ブロックしたプロセスを解除し、それぞれのプロセスを再開する。しかしながら、ＯｐｅｎＣＬや他の類似の従来のフレームワークでは、制御フローにおけるバリアの使用が強く制限される。
【０００８】
図１Ａは、グループで共有されるメモリ空間に値をロードするための（図１Ａにおいてカーネルと呼ばれる）単一の作業項目の使用を例示した図であり、他の作業項目は、当該メモリ空間からロードされた値を得ることができる。作業グループ内の他の作業項目は、その値をロードする作業項目のみならず、グループ内の全ての作業項目がバリアに到達するまで、バリアを越えて進むことがブロックされる。
【０００９】
また、グループで共有されたメモリ内にその値をロードする上記動作は、カーネルコードから呼ばれるライブラリ関数内から行われ得る。図１Ｂは、バリア命令を含むライブラリ関数を例示する図である。図１Ｃは、ライブラリ関数を呼ぶカーネルを例示する図である。図１Ｃにおけるコードは、指定された作業項目が共有領域にデータをロードするまで、対応するライブラリを呼ぶ全ての作業項目をブロックする動作を例示する。
【００１０】
図１Ｄは、ライブラリ内にバリアへの呼び出しを置くことによって不正確な動作を導き得る例を示す図である。例えば、条件の１つが関数への呼び出しを有しないという条件を有するカーネルからのバリア命令を含むライブラリ関数の呼び出しは、デッドロックを導く可能性がある。これは、グループの全ての作業項目がバリアに到達したときにだけ当該バリアが解除することになる一方で、条件が満たされない１つ以上の作業項目は、全くバリアに到達しないことになるからである。
【００１１】
その上、ＯｐｅｎＣＬの作業項目の同期のフレームワークでは、カーネルを実行する作業グループ内の作業項目は、何れも実行を継続することを許可される前に、バリア命令を実行しなければならない。バリア命令は、カーネルを実行する作業グループ内の全ての作業項目によって遭遇し（すなわち、命令ストリームに到達され）なければならない。バリア命令が条件文内にある場合には、全ての作業項目は、任意の作業項目が条件文に入ってバリアを実行するときには、必ず条件に入る。バリア命令がループ内にある場合には、全ての作業項目は、何れもバリアを超えて実行を継続することが許可される前に、ループの繰り返しごとにバリア命令を実行する必要がある。これらの制限は、処理リソースを最適に利用するシステムやプログラマの能力を制限し得る。
【００１２】
従って、作業項目の同期をより柔軟に効率的に使用することの可能な方法及びシステムが必要とされる。
【発明の概要】
【課題を解決するための手段】
【００１３】
作業項目をより効率的に柔軟にスケジューリングするための方法及びシステムが開示される。同期グループ内の作業項目の実行において発生する後のバリアが、グループからの離脱をアナウンスした作業項目を待たないように、その同期グループを永続的に離れていることを示す作業項目についての技法が開示される。更なる技法が開示されており、その技法によって、作業項目は、そのグループの他の作業項目と同期し続けるために同期グループに再び加わることができる。開示された技法は、様々な状況におけるプログラミングの処理効率や柔軟性の向上について実質的な利点をもたらし得る。
【００１４】
開示された方法、システム、計算プログラム製品の実施形態は、グループからの第１の作業項目によってバリアスキップ命令を実行するステップと、実行されたバリアスキップ命令に応じて、シーケンスにおける複数の点の何れかにおいてバリアに到達することを第１の作業項目に要求せずに、複数の点においてグループから他の作業項目を同期させるようにバリアを再構成するステップと、を含む。
【００１５】
本発明の更なる実施形態、特徴及び利点並びに本発明の種々の実施形態の構造や動作は、添付の図面を参照にして以下に詳細に説明される。
【００１６】
明細書に組み込まれ、明細書の一部を構成する添付図面は、発明の実施形態を例示し、上記で与えられた一般的な説明及び以下に与えられる実施形態の詳細な説明と共に、本発明の原理を説明するのに役立つ。
【図面の簡単な説明】
【００１７】
【図１Ａ】疑似コードにおける従来のバリアの同期例を例示する図である。
【図１Ｂ】疑似コードにおける従来のバリアの同期例を例示する図である。
【図１Ｃ】疑似コードにおける従来のバリアの同期例を例示する図である。
【図１Ｄ】疑似コードにおける従来のバリアの同期例を例示する図である。
【図２Ａ】本発明の実施形態に係る（疑似コードにおける）バリアスキップ命令を例示する図である。
【図２Ｂ】実施形態に係る（疑似コードにおける）ライブラリ呼び出しを使用するバリアスキップ命令を用いたカーネルを例示する図である。
【図３】実施形態に係る（疑似コードにおける）バリア再設定命令を例示する図である。
【図４Ａ】実施形態に係るバリアの同期のための例示的な使用の場合の疑似コードサンプルを例示する図である。
【図４Ｂ】実施形態に係るバリアの同期のための例示的な使用の場合の疑似コードサンプルを例示する図である。
【図４Ｃ】実施形態に係るバリアの同期のための例示的な使用の場合の疑似コードサンプルを例示する図である。
【図４Ｄ】実施形態に係るバリアの同期のための例示的な使用の場合の疑似コードサンプルを例示する図である。
【図５】実施形態に係るいくつかの作業項目の経時的な例示フローを例示する図である。
【図６】実施形態に係る作業項目の同期のための方法を例示する図である。
【図７】実施形態に係る作業項目の同期のためのシステムのブロック図を例示する図である。
【図８】実施形態に係る作業項目の同期モジュールのブロック図を例示する図である。
【発明を実施するための形態】
【００１８】
本発明は、特定の用途について例示的な実施形態を用いて本明細書にて説明されるが、発明はこれに限定されないことが理解されるべきである。本明細書に提供される教示を入手可能な当業者は、この発明の範囲内における追加的な修正、用途及び実施形態並びに発明が著しく有用となり得る追加的な分野を認識するであろう。
【００１９】
本発明の実施形態は、任意のコンピュータシステム、計算デバイス、エンタテインメントシステム、メディアシステム、ゲームシステム、通信デバイス、パーソナルデジタルアシスタント、又は、１つ以上のプロセッサを使用する任意のシステムにおいて使用され得る。本発明は、異種計算システムを備えるシステムに特に役立ち得る。「異種計算システム」は、その用語が本明細書において使用される場合には、多種類のプロセッサが利用可能な計算システムをいう。
【００２０】
ＧＰＵでは、処理要素に割り当てられた作業項目は「作業グループ（ｗｏｒｋｇｒｏｕｐ）」と呼ばれる。並列に実行するために発行される２つ以上の作業項目を「ウェーブフロント（ｗａｖｅｆｒｏｎｔ）」という。作業グループは、１つ以上のウェーブフロントを備え得る。本実施形態では、作業グループの作業項目の同期に関連して主に説明されているが、この開示における教示は、共有メモリにアクセスできる任意の１つ以上のプロセッサ及び／又はプロセスのグループにわたって作業項目を同期させるために適用され得る。本明細書に使用される際、用語「カーネル」とは、同じコードベースを有する１つ以上の作業項目として並列に実行されるプログラム及び／又は処理ロジックのことをいう。いくつかの実施形態では、用語「作業項目」と「スレッド」とは、交換可能であることが留意されるべきである。この開示において、「作業項目」と「スレッド」との交換可能性は、例えば、実施形態におけるモデルに具体化される作業項目の実行の柔軟なシミュレーションされた例示又は真の独立性の例示となる。
【００２１】
本発明の実施形態は、同時作業項目間のより効率的で、より柔軟な同期を可能にすることによって、システムの性能を大幅に向上させることができる。例えばＳＩＭＤ又はＳＩＭＴフレームワークを使用して、非常に大きな数の同時作業項目を実行するＧＰＵ、マルチコアＣＰＵ又は他のプロセッサでは、実施形態は、いくつかの作業項目が、命令フローにおけるいくつかの点において、それらの実行を同期させる作業項目のグループを離れること及び／又は再び加わることを可能にすることによって、効率を改善する。例えば、特定の作業項目が、同期グループの残りと更なる同期を必要としない場合には、同期グループから当該作業項目自体を永続的に取り除くためのバリアスキップ命令が発行され得る。
【００２２】
バリア再設定命令は、特定作業項目が同期グループに再び含まれるべきである場合に、後に発行され得る。スキップ命令は、事実上、対応する作業項目が、バリアが再設定される前のどの点でもバリアに到達しないことを宣言する。再設定命令は、同じバリアが再使用されることを可能にする。
【００２３】
作業項目がバリアを永続的にスキップさせることを可能にすることにより、種々の性能改善が実現されることになる。例えば、プログラムの柔軟性が（図２Ａ〜図２Ｂに例示されるように）大幅に改善され、より効率的なコードの生成が可能になる。また、（特に、多数の同時作業項目を用いるシステムにおける）ループ挙動も改善される。
【００２４】
例えば、（バリア上の到着及び待機動作を含むシステムを含む）従来のシステムでは、全ての作業項目は、最も長く繰り返す作業項目がその繰り返しを完了するまで、バリアを含むループによって引き止められる。一方、本発明の実施形態では、グループとの更なる同期を必要としない作業項目は、システムにおけるデッドロックを生じさせることなくループを出ることが可能である。
【００２５】
処理速度の向上は、電力効率の向上と共に実現される。
【００２６】
図２は、本発明の実施形態によるバリアスキップ命令（例えば、ｂ．ｓｋｉｐ（））が使用される（疑似コードにおける）関数を例示する図である。ｂと名付けられたバリアが宣言され、条件ループを出た後にスキップ命令が発行される。ループ内では、作業項目は、指定条件が満たされるまでｂを待つ。
【００２７】
（図２Ａに例示された）「カーネル」関数に対応する全ての作業項目は、ループ内にある間に同じ又は類似の数の繰り返しを行わなくてもよい。各作業項目がループを出る際、スキップ命令が発行される。出て行く作業項目によるスキップ命令の発行は、ループをまだ離れていない他の作業項目に、出て行く作業項目がバリアに再び到達しないことを示す。それ故、バリアは、少なくとも「バリア再設定」と呼ばれる別の命令が発行されるまで、現在及び後のインスタンス化において出て行く作業項目を待つことを回避するように再構成され得る。例えば、バリアは、バリアに到達するために要求される作業項目の数が、出て行く作業項目を考慮するために低減され得るように、再構成され得る。
【００２８】
従来のシステムでは、ループ内にバリア関数（例えば、ｂａｒｒｉｅｒ（）又はｂａｒｒｉｅｒ（）．ｗａｉｔ）を含む作業項目を効率的に扱うことができなかった。例えば、デッドロックを防止するために、各繰り返しにおいて、バリアが、全ての作業項目によって到達される（または訪問される）ように、同じ数の時間を繰り返すようにグループ内の全ての作業項目を強要する必要があった。そのようなアプローチは、作業項目が異なる実行経路を有し得る環境では、明らかに無駄であろう。
【００２９】
別の従来の同期命令は、バリアの到着である。しかしながら、到着命令は、現在のバリアから呼び出し元だけを解除する。例えば、図２Ａにおいて、スキップ命令が到着命令と交換される場合には、バリアは、出て行く作業項目が、その後のバリアインスタンスにおいてバリアに到達することを依然として要求することになる。それ故、到着命令は、作業項目が、同期グループからそれ自体を永続的に取り除くことができる機構を提供しない。
【００３０】
図２Ｂは、選択された作業項目が、本発明に係る他の作業項目との共有空間にデータをコピーすることを可能にする、疑似コードにおけるライブラリ関数「ｌｏａｄＦｕｎｃｔｉｏｎ」の実例を示す図である。ライブラリ関数は、バリア待機命令（例えばｂ．ｗａｉｔ（））の２つの呼び出しを含む。２つのバリア待機命令は、ライブラリ関数を呼び出す任意の作業項目によって発行されることになる。
【００３１】
図２Ｂにおいて、カーネル関数「ｔｈｅＫｅｒｎｅｌ」は、指定条件が満たされたときにロード関数を呼び出す。指定条件が満たされない場合には、スキップ命令が発行される。
【００３２】
（図２Ｂにおいて）条件のその他の部分におけるスキップ命令は、条件を満たさない全ての作業項目が、スキップ命令を呼び出すことを確実にする。それ故、条件を満たすことができない全ての作業項目は、バリアの後のインスタンスの両方から除外されることになり、バリアインスタンスは、これらの作業項目を待たないことになる。命令フローにおけるバリアのインスタンスは、同期点と呼ばれ得る。２つの同期点は、ライブラリ関数におけるバリア待機（ｂ．ｗａｉｔ（））の２つの呼び出しに対応する。各作業項目は、ｌｏａｄＦｕｎｃｔｉｏｎを呼び出し、それによって、２つの同期点でバリアに到達するので、又は、バリアの後の任意のインスタンスに到達させることによって自身を除外するスキップ命令を呼び出すので、デッドロックが発生しないことになる。
【００３３】
対照的に、スキップ命令に代えて従来の到着命令が図２Ｂにおいて使用された場合には、デッドロックが生じることになる。例えば、条件を満たさない各作業項目は、到着命令を実行するが、到着命令は、すぐ次のバリアから作業項目の発行を単に除外する。作業項目を発行することは、第２の同期点でバリアに到達することが予想され、従って、デッドロックが生じることになる。
【００３４】
図３は、実施形態に係るバリア再設定命令（例えば、ｂ．ｒｅｓｅｔ）を使用する疑似コードの実例を示す図である。カーネル関数「ｔｈｅＫｅｒｎｅｌ」は、図２Ｂに例示されるように、指定条件が満たされる場合にロード関数を呼び出す。指定条件が満たされ場合には、再設定命令が後に続いているスキップ命令を発行する。
【００３５】
スキップ命令の発行は、図２Ｂに関連して上述したように、条件を満たすことができない全ての作業項目が、後の同期点の両方から除外されることになることを確実にする。同期点において、バリアは、これらの作業項目を待たないことになる。バリア再設定命令は、バリアを元の構成に再設定する。例えば、スキップ命令は、事実上、バリアのための同期グループのサイズを低減したが、再設定命令は、グループ内の作業項目によって発行される任意の先行するスキップ命令の効果を逆にする。再設定命令の実施態様は、再設定が完了する前に、任意の先行するバリアが同期されることを要求する。いくつかの実施形態によれば、バリア再設定は、再設定が適用されるバリアインスタンスへの関与を持つ全ての作業項目にわたって同期点をもたらす自己同期命令として実装される。他の実施形態では、ユーザは、再設定命令で同期を確実にするための１つ以上の同期点を含み得る。図４Ａは、実施形態に係るバリアのグループサイズと独立して定義されたサイズを有するバリアを使用する疑似コードの実例を示す図である。例えば、バリアｂは、バリアが呼び出されるグループにいくつの作業項目が存在するかにかかわらず、１６という元の同期グループのサイズで生成され得る。１６という定義されたサイズでバリアｂを生成することは、バリアｂ上で待機命令を呼び出す任意のプロセスが、バリアｂ上で同期するグループ内の任意の１５個の作業項目と同期することを可能にする。
【００３６】
定義されたサイズを有するバリアは、アプリケーションのために生成されることができ、そのアプリケーションにおいて、特定数の作業項目のみが、定義された条件を満たすことが知られている。このようにして、図４Ａに示されるように、条件を満たす作業項目は、バリアｂ上で同期することができる一方で、その他の作業項目は、「他の」経路を取る。バリアは、条件にかなう定義された数の作業項目だけを待つので、デッドロック状態が発生しないことになり、条件を満たさない作業項目は、スキップ命令を発行することを要求されない。
【００３７】
図４Ｂの例示的な図では、バリアは、２つのグループの作業項目の同期に使用される。一方のグループは、指定条件を満たす。他方のグループは、その条件を満たさず、バリアｂ１及びｂ２を使用して別個に同期され得る。作業項目は、ｂ１同期グループ又はｂ２同期グループに属しており、作業項目が属していないグループに対してスキップ命令を発行することができる。
【００３８】
図４Ｃの例示的な図では、疑似コードにおける階層バリアが使用される。第１の指定条件を満たす作業項目は、バリアｂ１についての待機命令上で同期し、他の作業項目はバリアｂ１をスキップする。第１の指定条件を満たす作業項目は、別のバリアｂ２に遭遇する。第２のバリアｂ２に遭遇する作業項目のうち第２の条件を満たす作業項目は、ｂ２を待ち、他の作業項目はｂ２をスキップする。疑似コードに示されるように、バリアｂ２は、バリアｂ１の現在の状態に基づいて生成される。
【００３９】
より詳細には、バリアｂ２のサイズ（すなわち、ｂ２が同期を実施する作業項目の数）は、ｂ１についてスキップ命令を発行していない作業項目の数によって表される。図４Ｃにおいて、この数は、第１の条件を満たす作業項目の数である。他の実施形態では、ｂ１がスキップされるときに、バリアｂ２の更新の基本的な実施態様を要求し得る。その上、ｂ２の更新においていくつかの状況で生じ得る競合条件を回避するために、ｂ１のスキップ動作は、ｂ１のスキップ動作の前に同期点を有することによって保護され得る。
【００４０】
図５は、本発明の実施形態に係るいくつかの作業項目Ｔ１、Ｔ２、Ｔ３及びＴ４の経時的な例示フロー５００の実例を示す図である。図示されるように、Ｔ１、Ｔ２、Ｔ３及びＴ４は、同時に又は実質的に同時に開始する。各作業項目における第１のバリア待機命令は、各作業項目を同期点５０１で同期させることをもたらす。同期点５０１における同期は、各作業項目のうち最後の作業項目が５０１に到着するまで待機し、次いで、同時に又はほぼ同時に実行を再開する作業項目Ｔ１、Ｔ２、Ｔ３及びＴ４を包含する。
【００４１】
点５０２では、作業項目Ｔ４は、バリア到着命令を発行する。バリア到着命令は、Ｔ４を待たないようにバリアの次のインスタンスに通知し、Ｔ４は、バリアの第２のインスタンスで同期させることなく進む。
【００４２】
同期点５０３では、作業項目Ｔ１、Ｔ２及びＴ３は、命令ストリームにおける第２のバリア待機命令に基づいて、バリアの第２のインスタンス上で同期する。全ての作業項目Ｔ１、Ｔ２及びＴ３が同期点５０３に到着すると、各作業項目は、同時に又はほぼ同時に実行を再開する。
【００４３】
点５０４では、Ｔ１は、バリアスキップ命令を発行する。バリアスキップ命令は、Ｔ１を待たないようにバリアの後の任意のインスタンスに通知し、Ｔ１は、バリアの後のインスタンスで同期させることなく進む。
【００４４】
同期点５０５では、作業項目Ｔ２、Ｔ３及びＴ４が同期する。Ｔ４は、（５０２で）バリア到着命令を前もって発行しているが、この前もった発行は、次に（すなわち、同期点５０３で）発生するバリアからＴ４だけを除外していることに留意する。同期点５０５における同期の後に、Ｔ２、Ｔ３及びＴ４は、同期点５０６で再び同期するように進む。同期点５０６で同期されると、Ｔ２及びＴ３は、各々の命令ストリームにおけるバリア待機命令の４つのインスタンスにそれぞれ遭遇していることになる。このとき、Ｔ４は、３つのインスタンスだけに遭遇していることになる。同期点５０５及び５０６におけるバリアは、Ｔ１が同期点５０５及び５０６の前に５０４でバリアスキップ命令を発行しているので、Ｔ１についてブロックしない。
【００４５】
やがて点５０７では、５０６の発生後、Ｔ１が、バリア再設定命令を発行する。これは、バリアを元の構成に再設定する。元のバリアは、全ての４つの作業項目Ｔ１、Ｔ２、Ｔ３及びＴ４について同期させるように構成される。再設定は、Ｔ１を、同期点５０７にてＴ２、Ｔ３及びＴ４と同期させる。点５０７における同期は、自己同期命令として再設定を実装することによって、又は、再設定と関連付けられたユーザ指定の同期命令によって、実現され得る。
【００４６】
点５０７における同期に次いで、Ｔ１〜Ｔ４は、各作業項目における待機命令に基づいて、同期点５０８で同期するように進む。
【００４７】
図６は、実施形態に係る作業項目の同期のための例示的な方法６００の実例を示す図である。
【００４８】
動作６０２では、作業項目のグループが開始される。作業項目は、同一コードの複数の作業項目であってもよい。同一コードのそれぞれの作業項目において実行される実際の命令シーケンスは、条件評価などに応じて、同じであってもよいし、異なってもよい。別の実施形態によれば、作業項目は、全てが同一コードではなく、１つ以上の同期点を互いに共有している任意の作業項目によって構成されてもよい。
【００４９】
複数の作業項目は、同時に又は非同時に開始され得る。作業項目は、ＣＰＵ上、ＧＰＵ上、２つ以上のＧＰＵ上、ＣＰＵの２つ以上のコア上、又は、１つ以上のＧＰＵと１つ以上のＣＰＵコアとの任意の組み合わせによって、実行され得る。実施形態によれば、複数の作業項目は、ＧＰＵの１つの処理要素上で実行する作業グループである。
【００５０】
動作６０４では、バリアｂが生成される。バリアｂは、バリアｂを宣言する作業項目上の命令を実行することによって生成されてもよいし、インスタンス化されてもよい。実施形態によれば、システムが、バリアｂの宣言の第１のインスタンスに遭遇すると、バリアのインスタンスがメモリ内に生成される。続いてバリアｂを宣言する作業項目は、既に生成されたバリアｂへの参照を受信する。バリアの基本的な実施態様は、それぞれのフレームワーク及び／又はシステムにおいて異なり得る。計数セマフォは、例示的な機構であり、その機構によって、上記セマンティックを備えるバリアが実施され得る。
【００５１】
メモリ内のバリアｂオブジェクトの生成は、１つ以上のメモリ位置並びに／又はダイナミックメモリ及び／若しくはハードウェア内のレジスタの初期化を含む。例えば、バリアｂに関連して、いくつかのカウントが、以下に説明されるように維持されることが必要とされる。バリア対象及び全てのカウントは、それらのメモリ位置への書き込みや読み出しにおける適切な同時制御機構を用いて、動的メモリ内に維持され得る。別の実施形態によれば、バリアｂに対応するオブジェクトは、ダイナミックメモリ内でインスタンス化されるのに対して、対応するカウントは、特定のハードウエアレジスタ内に維持される。
【００５２】
動作６０６では、バリアｂを初期化するために必要とされる様々なカウントが決定され、それらの初期値が設定される。作業項目の訪問数（「訪問カウント」）は、バリアｂに到達した作業項目の数を定義する。作業項目は、バリア待機命令又は等価物を発行する場合には、バリアに「到達」している。訪問カウントは、０に初期化され得る。バリアｂについてバリアスキップ命令を実行している作業項目の数は、スキップされたカウント（「スキップカウント」）において追跡され得る。バリア解除閾値（「解除閾値」）は、バリアが待っている作業項目の数である。実施形態によれば、バリアｂは、動作６０２で開始されたグループ内の作業項目の数に等しい解除閾値で初期化される。別の実施形態によれば、バリアｂは、動作６０２で開始されたグループのサイズにかかわらずに定義されたサイズで（動作６０４で）生成される。従って、解除閾値は、定義されたサイズに初期化される。
【００５３】
動作６０８では、命令フローからの任意の数の他の命令を実行した後に、作業項目ｘが、同期命令に到着する。同期命令は、限定されるものではないが、バリア待機、バリア到着、バリアスキップ及びバリア再設定のうち何れか１つであってよい。
【００５４】
動作６１０では、同期命令がバリア待機命令であるか否かの判定がなされ、バリア待機命令である場合には、方法６００は、動作６１２に進む。
【００５５】
動作６１２では、訪問カウントが更新される。実施形態によれば、訪問カウントは、１だけインクリメントされ、作業項目ｘがバリアに到達したことを示す。
【００５６】
動作６１４では、更新された訪問カウントとスキップカウントとの和が、解除閾値と比較される。和が解除閾値以上である場合には、作業項目ｘは、バリアに到着する最後の作業項目であり、バリアは、動作６１８で解除される。本実施形態によれば、バリアを解除することは、１つ以上のカウント値を再設定させ、ブロックされた作業項目に実行を再開させることである。
【００５７】
バリアの解除は、動作６２０における訪問カウントの再設定と、動作６２２におけるバリアについてブロックされた全ての作業項目の再開とをもたらす。本実施形態によれば、動作６２０では、訪問カウントが０に再設定される。訪問カウントの再設定は、先に発生したバリア到着命令のいかなる影響も消す。しかしながら、訪問カウントの再設定は、先に発生した任意のバリアスキップ命令の影響を消さない。ブロックからのバリア解除の場合に行われるような訪問カウントだけの再設定が、バリア上の「一部再設定」動作として想定され得る。本明細書において使用される際、用語「一部再設定」とは、スキップ命令を発行していない作業項目に適用されるバリアの一部が再設定されることを意味する。
【００５８】
動作６２２では、全てのブロックされた作業項目が実行を再開する。実施形態によれば、ブロックされた作業項目は、セマフォを待ってもよく、セマフォは、ブロックされた作業項目が実行を再開することができるように再設定される。例えば、ハードウェア又はソフトウェアに実装される計数セマフォは、作業項目をブロックするために使用され得る。動作６２２を完了した後に、方法６００は、動作６０８に進む。
【００５９】
動作６１４で、訪問カウントとスキップカウントとの和が解除閾値に等しくないと判断された場合には、動作６１６で、作業項目ｘがブロックされる。実施形態によれば、作業項目ｘのブロックは、作業項目にセマフォを待たせることによって行われ得る。作業項目ｘは、動作６１８〜６２２がバリアについて発生する場合に、後に解除されることになる。動作６１９は、例えば動作６１８〜６２２による、バリアの解除についての作業項目ｘの実行の継続を表す。
【００６０】
動作６１０で、命令がバリア待機命令ではないことが判別された場合には、動作６２４で、命令がバリア到着であるか否かが判別される。バリア到着である場合には、動作６２６で訪問カウントが更新される。実施形態によれば、訪問カウントは、１だけインクリメントされ、作業項目ｘがバリアに到着したことを示す。訪問カウントを更新した後に、動作６２８で、作業項目ｘは、命令ストリームの作業項目実行を継続する。続いて、次の同期命令に直面する場合には、処理は動作６０８に進む。
【００６１】
動作６２４で、命令がバリア到着命令ではないことが判別された場合には、動作６３０で、命令がバリアスキップであるか否かが判別される。バリアスキップである場合には、動作６３２で、スキップカウントが更新される。実施形態によれば、スキップカウントは、１だけインクリメントされる。次いで、動作６３６で、作業項目ｘは、実行を継続し、次の同期命令に遭遇する場合には動作６０８に進む。
【００６２】
動作６３０で、命令がバリアスキップ命令ではないことが判別された場合には、動作６３８で、命令がバリア再設定であるか否かが判別される。バリア再設定である場合には、動作６４０で、バリアｂが再設定される。実施形態によれば、バリア再設定命令に応じてバリアを再設定することは、訪問カウント及びスキップカウントを０に設定することを含む。それ故、バリア再設定がバリアｂ上で実行された後に、バリアｂは、元の状態に再設定される。いくつかの状況では、競合条件は、グループ内の全ての作業項目がバリアで同期されない場合に生じ得る。従って、いくつかの実施形態では、バリア再設定命令は、自己同期命令として実装されてもよく、全ての作業項目にわたる同期点をもたらし得る。他の実施形態では、ユーザは、再設定命令で同期を確実にするために１つ以上の同期点を含み得る。動作６４０に次いで、処理は、次の同期命令に命令ストリームにおいて遭遇する場合には、動作６０８まで続き得る。
【００６３】
命令がバリア再設定命令ではないことが、ステップ６３８で判別された場合には、動作６３９で、作業項目ｘは、実行を継続し得る。動作６３９に次いで、処理は、命令ストリームにおいて次の同期命令に遭遇する場合には、動作６０８まで続き得る。
【００６４】
別の実施形態によれば、別個のスキップカウント及びバリアのための解除閾値を維持する代わりに、解除閾値だけが維持され得る。例えば、解除閾値は、作業項目がバリアスキップ命令を実行したことを反映するようにデクリメントされ得る。次いで、バリア再設定命令が発行された場合には、カウントを再設定することは、解除閾値を元の大きさに再設定することを含むことになる。事実上、このアプローチによれば、バリアスキップを実行する作業項目の数は、同期グループを離れるものとして考えられ得る。
【００６５】
図７は、実施形態に係る作業項目の同期のためのシステムのブロック図の実例を示す図である。図７では、異種計算システム例７００は、ＣＰＵ７０１などの１つ以上のＣＰＵと、ＧＰＵ７０２などの１つ以上のＧＰＵとを含むことができる。また、異種計算システム７００は、システムメモリ７０３と、永続ストレージデバイス７０４と、システムバス７０５と、入出力デバイス７０６と、バリア同期装置７０９とを含むこともできる。
【００６６】
ＣＰＵ７０１は、市販されている制御プロセッサ又はカスタム制御プロセッサを含むことができる。ＣＰＵ７０１は、例えば、異種計算システム７００の動作を制御する制御ロジックを実行する。ＣＰＵ７０１は、２つのＣＰＵコア７４１，７４２を備えるマルチコアＣＰＵなどのマルチコアＣＰＵとすることができる。ＣＰＵ７０１は、任意の制御回路に加えて、ＣＰＵコア７４１，７４２のＣＰＵキャッシュメモリ７４３，７４４を含む。ＣＰＵキャッシュメモリ７４３，７４４は、ＣＰＵコア７４１，７４２上のアプリケーションの実行中に命令及び／又はパラメータ値を一時的に記憶するために使用され得る。
【００６７】
例えば、ＣＰＵキャッシュメモリ７４３は、ＣＰＵコア７４１上の制御ロジック命令の実行中に、システムメモリ７０３から１つ以上の制御ロジック命令、変数の値又は一定パラメータの値を一時的に記憶するために使用され得る。また、ＣＰＵ７０１は、専用ベクトル命令処理部を含むこともできる。例えば、ＣＰＵコア７４２は、ベクトル化命令を効率的に処理することができるストリーミングＳＩＭＤ拡張（ＳＳＥ）ユニットを含むことができる。当業者は、ＣＰＵ７０１が、選択された例において、ＣＰＵコアよりも多くの又は少ないものを含むことができること、及び、キャッシュメモリを有さないか、より複雑なキャッシュメモリ階層を有することができることを理解するであろう。
【００６８】
ＧＰＵ７０２は、市販のグラフィックスプロセッサ又はカスタム設計されたグラフィックスプロセッサを含むことができる。ＧＰＵ７０２は、例えば、選択された機能のための専用コードを実行することができる。一般に、ＧＰＵ７０２は、グラフィックスパイプライン計算やディスプレイ上の画像のレンダリングなどのグラフィックス機能を実行するために使用され得る。
【００６９】
ＧＰＵ７０２は、ＧＰＵグローバルキャッシュメモリ７１０と、１つ以上の計算部７１２，７１３とを含む。グラフィックスメモリ７０７は、ＧＰＵ７０２に含まれてもよいし、ＧＰＵ７０２に結合されてもよい。各計算部７１２，７１３は、ＧＰＵローカルメモリ７１４，７１５の各々と関連付けられている。各計算部は、１つ以上のＧＰＵ処理要素（ＰＥ）を含む。例えば、計算部７１２は、ＧＰＵ処理要素７２１，７２２を含み、計算部７１３は、ＧＰＵ  ＰＥ７２３，７２４を含む。
【００７０】
各ＧＰＵ処理要素７２１，７２２，７２３，７２４は、少なくとも１つのプライベートメモリ（ＰＭ）７３１，７３２，７３３，７３４と関連付けられている。各ＧＰＵ  ＰＥは、スカラー及びベクトル浮動小数点ユニットのうち１つ以上を含むことができる。また、ＧＰＵ  ＰＥは、逆平方根ユニット及び正弦／余弦ユニットなどの専用目的ユニットを含むことができる。ＧＰＵグローバルキャッシュメモリ７１０は、例えばシステムメモリ７０３などのシステムメモリ及び／又は例えばグラフィックスメモリ７０７などのグラフィックスメモリに結合され得る。
【００７１】
システムメモリ７０３は、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）などの少なくとも１つの非永続（揮発性）メモリを含むことができる。システムメモリ７０３は、アプリケーション又は他の処理ロジックの部分の実行中に、処理ロジック命令、一定値及び可変値を記憶することができる。例えば、バリア同期装置７０９の制御ロジック及び／又は他の処理ロジックは、ＣＰＵ７０１によるバリア同期装置７０９の実行中に、システムメモリ７０３内に存在することができる。本明細書において使用される際、用語「処理ロジック」は、制御フロー命令、計算を行うための命令、及び、リソースへの関連付けられたアクセスのための命令のことを言う。
【００７２】
永続メモリ７０４は、磁気ディスク、光ディスク又はフラッシュメモリなどのようにデジタルデータを記憶することが可能な１つ以上の記憶デバイスを含む。永続メモリ７０４は、例えば、バリア同期装置７０９の命令ロジックの少なくとも一部を記憶することができる。異種計算システム７００の起動によって、オペレーティングシステムや他のアプリケーションソフトウェアは、永続記憶装置７０４からシステムメモリ７０３内にロードされ得る。
【００７３】
システムバス７０５は、周辺構成要素相互接続（ＰＣＩ）バス、業界標準アーキテクチャ（ＩＳＡ）バス、又は、これらのようなデバイスを含むことができる。また、システムバス７０５は、異種計算システム７００の構成要素を含む構成要素に結合する機能とともに、ローカルエリアネットワーク（ＬＡＮ）などのネットワークを含むこともできる。
【００７４】
入出力インタフェース７０６は、キーボード、マウス、ディスプレイ及び／又はタッチスクリーンなどのユーザ入出力デバイスを接続する１つ以上のインタフェースを含む。例えば、ユーザ入力は、キーボードやマウスで接続されたユーザインタフェース７０６を通して、異種計算システム７００に提供され得る。異種計算システム７００の出力は、ユーザインタフェース７０６を通してディスプレイに出力され得る。
【００７５】
グラフィックスメモリ７０７は、システムバス７０５及びＧＰＵ７０２に結合されている。グラフィックスメモリ７０７は、一般に、ＧＰＵによる高速アクセスのために、システムメモリ７０３から転送されるデータを記憶するために使用される。例えば、ＧＰＵ７０２とグラフィックスメモリ７０７との間のインタフェースは、システムバスインタフェース７０５よりも数倍速くすることができる。
【００７６】
バリア同期装置７０９は、同期機能についてのロジックと、ＧＰＵ７０２及びＣＰＵ７０１の何れか一方又は両方についての処理ロジックとを含む。バリア同期装置７０９は、コンピュータにおけるプロセッサのグループ全体にわたって、個々のプロセッサにおいて、及び／又はプロセッサの各処理要素内で、作業項目を同期するように構成されてもよい。バリア同期装置７０９は、図８に関連して以下に更に説明される。当業者は、バリア同期装置が、ソフトウェア、ファームウェア、ハードウェア又はそれらの任意の組み合わせを使用して実装され得ることを理解するであろう。ソフトウェアに実装される場合には、例えば、バリア同期装置７０９は、コンパイルされるときや実行されるときにシステムメモリ７０３に存在する、Ｃ言語又はＯｐｅｎＣＬで書かれたコンピュータプログラムとすることができる。ソースコード形式及び／又はコンパイルされた実行可能形式では、バリア同期装置７０９は、永続メモリ７０４に記憶され得る。一実施形態では、バリア同期装置７０９の機能性のいくつか又は全ては、Ｖｅｒｉｌｏｇ、ＲＴＬ、ネットリストなどのハードウェア記述言語で指定され、本明細書において説明された発明の態様を具体化するハードウェアデバイスを生成するためのマスクワーク／フォトマスクの生成を通した製造工程の最終構成を可能にする。
【００７７】
当業者は、異種計算システム７００が、図７に示されるものよりも多い又は少ない構成要素を含むことができることを理解するであろう。例えば、異種計算システム７００は、１つ以上のネットワークインタフェース及び／又は例えばＯｐｅｎＣＬフレームワークなどのソフトウェアアプリケーションを含むことができる。
【００７８】
図８は、実施形態に係るバリア同期装置８００の実例を示す図である。バリア同期装置８００は、作業項目ブロックモジュール８０２と、バリア解除モジュール８０４と、バリア作業項目グループモジュール８０６と、バリアスキップモジュール８０８と、バリア再設定モジュール８１０とを含む。さらに、バリア同期装置８００は、バリアレジスタ８１２を含むことができる。実施形態によれば、バリア同期装置８００は、バリア同期装置７０９に含まれる。
【００７９】
作業項目ブロックモジュール８０２は、バリア上で１つ以上の作業項目をブロックするように動作する。バリアは、セマフォ（例えば計数セマフォ）及びレジスタを使用して実装され得る。作業項目のブロック化は、ブロックされる作業項目にセマフォを待たせることによって実施され得る。セマフォは、ハードウェア又はソフトウェアで実装され得る。作業項目は、バリア待機命令に直面する場合にブロックされ得る。作業項目ブロックモジュールは、例えば、方法６００の動作６１６を含む動作を実施するための処理ロジックを含むことができる。
【００８０】
バリア解除モジュール８０４は、充分な数の作業項目がバリアに到達したときにバリアを解除するように動作する。上述したように、バリアは、セマフォを使用して実装されてもよく、バリアを解除することは、セマフォを解除することを含み得る。作業項目は、バリア待機命令に直面する場合に解除されてもよく、この作業項目は、結局、バリアに到達する作業項目の数についての要求を完了するための最後の作業項目になる。バリア解除モジュールは、例えば、方法６００の動作６１８〜６２２を含む動作を実施するための処理ロジックを含むことができる。
【００８１】
バリア作業項目グループモジュール８０６は、種々の実行作業項目にわたって同期グループを追跡し続けるよう動作する。また、バリア作業項目グループモジュール８０６は、グループ構成に従ってバリアを生成し初期化するように動作し得る。実施形態によれば、バリア解除モジュール８０６は、例えば、方法６００の動作６０２〜６０６を含む動作を実施するための処理ロジックを含むことができる。
【００８２】
バリアスキップモジュール８０８は、バリアスキップ命令を実施するように動作する。例えば、バリアスキップ命令は、対応するバリアについてのスキップカウントを更新させることになる。実施形態によれば、バリアスキップモジュール８０８は、方法６００の動作６３０〜６３６を含む動作を実施するための処理ロジックを含むことができる。
【００８３】
バリア再設定モジュール８１０は、バリア再設定命令を実施するように動作する。例えば、バリア再設定命令は、バリアに関連する訪問カウントやスキップカウントを、再設定、及び／又は解除閾値に調整させる。バリア再設定モジュール８１０は、例えば、方法６００の動作６３８〜６４０を含む動作を実施するための処理ロジックを含むことができる。
【００８４】
バリアレジスタ８１２は、バリアに関連するハードウェア及び／又はソフトウェアレジスタを含む。バリアレジスタ８１２は、複数のレジスタ及び／又はメモリ位置を備えるバリアレコード８１４を含むことができる。例示的なバリアレコード８１４は、バリア識別子８２２と、ロック８２４と、ブロックされた作業項目カウント８２６と、到着した作業項目カウント８２８と、スキップされた作業項目カウント８３０と、閾値８３２とを含む。バリア識別子８２２は、バリアのメモリ位置若しくはレジスタを一意的に識別するためのポインタ、インデックス又は他の識別子とすることができる。
【００８５】
ロック８２４は、セマフォ、若しくは、プロセスがブロックされる他のエンティティへのポインタ又は参照であってもよい。ブロックされた作業項目カウント８２６は、バリアについてブロックされた作業項目の数である。到着した作業項目カウント８２８は、バリア到着命令を発行した作業項目の数である。スキップされた作業項目カウント８３０は、バリアスキップ命令を発行した作業項目の数である。閾値８３２は、解除閾値又は同期グループのグループサイズである。
【００８６】
（結論）
概要や要約の欄は、発明者によって熟考されるような本発明の１つ以上の例示的な実施形態ではあるが、全てではない例示的な実施形態を説明している。それ故、決して本発明及び添付の特許請求の範囲を限定することを意図するものではない。
【００８７】
本発明は、特定の機能及びそれらの関係の実施態様を例示する、機能的に作られたブロックを用いて上述されている。これらの機能的に作られたブロックの境界は、本明細書において説明の便宜のために適宜定義されている。特定の機能及びそれらの関係が適切に果たされる限りにおいて、代替の境界が定義され得る。
【００８８】
特定の実施形態の上記の説明は、過度の実験を行うことなく、本発明の全体の概念を逸脱することなく、当該技術の範囲内の知識を適用することにより、かかる特定の実施形態の種々の用途のために当業者が容易に修正及び／又は適合を行うことができるように、本発明の全体の内容を完全に明らかにするものである。従って、かかる適合及び修正は、本明細書に例示された教示及び指導に基づき、開示された実施形態の均等物の意味や範囲内であることが意図される。本明細書の表現又は専門用語が、教示及び指導に照らして当業者によって解釈されるように、本明細書の表現又は専門用語は、説明を目的とするものであって、限定のためではないということが理解されることになる。
【００８９】
本発明の広さや範囲は、上記の例示的な実施形態の何れによっても限定されるべきではないが、以下の特許請求の範囲やそれらの均等物に従ってのみ定義されるべきである。
【図１Ａ】
0005984952.tif 000002
【図１Ｂ】
0005984952.tif 000003
【図１Ｃ】
0005984952.tif 000004
【図１Ｄ】
0005984952.tif 000005
【図２Ａ】
0005984952.tif 000006
【図２Ｂ】
0005984952.tif 000007
【図３】
0005984952.tif 000008
【図４Ａ】
0005984952.tif 000009
【図４Ｂ】
0005984952.tif 000010
【図４Ｃ】
0005984952.tif 000011
【図５】
0005984952.tif 000012
【図６】
0005984952.tif 000013
【図７】
0005984952.tif 000014
【図８】
0005984952.tif 000015