【文献】
立川尚久ほか,動的バリア同期管理機構をもった並列計算機MDBM/FMM,情報処理学会研究報告,日本,社団法人情報処理学会,1996年 8月29日,Vol.96 No.80,185−190ページ
(58)【調査した分野】(Int.Cl.,DB名)
前記複数の点の第1及び第2の点で他の作業項目を同期させるステップを更に含み、前記第1の作業項目は、前記第1及び第2の点で前記バリアに到達しない、請求項1に記載の方法。
【背景技術】
【0002】
グラフィックス処理装置(GPU)は、一般に、単一命令複数データ(SIMD)デバイスの場合等の並列データストリーム上で、又は、データ並列処理において、同一命令を実行するのに好適な複数の処理要素を備える。多くの計算モデルでは、中央処理装置(CPU)は、ホスト又は制御プロセッサとして、及び、GPU等の他のプロセッサへのグラフィックス処理などのハンドオフ専用機能として機能する。
【0003】
各CPUが多重処理コアを有するマルチコアCPUは、GPU上で利用可能な専用機能に類似する専用機能(例えば、グラフィックス処理)のための処理能力を提供する。マルチコアCPU又はGPUの1つ以上の計算コアは、同じダイ(例えば、AMD Fusion(登録商標))の一部とすることができ、或いは、異なるダイ(例えば、NVIDIA GPUを有するIntel Xeon(登録商標))に存在し得る。近年、CPU及びGPUの両方の特性を有するハイブリッドコア(例えば、CellSPE(登録商標)、Intel Larrabee(登録商標))が、汎用GPU(GPGPU)型の計算のために提案されている。GPGPU型の計算は、制御コードを主に実行するように、及び、GPUに性能限界データ並列コードをオフロードするように、CPUを使用することを推奨する。GPUは、アクセラレータとして主に使用されている。マルチコアCPUとGPGPU計算モデルとの組み合わせは、アクセラレータ対象としてCPUコア及びGPUコアの両方を包含する。マルチコアCPUコアの多くは、多くの領域におけるGPUに匹敵する性能を有する。
【0004】
いくつかのフレームワークが、CPU及びGPUを有する異種計算プラットフォームのために開発されている。これらのフレームワークは、スタンフォード大学によるBrookGPUと、NVIDIAによる計算統一デバイスアーキテクチャ(CUDA:compute unified device architecture)と、Khronos Groupという名の産業連合によるOpenCLとを含む。OpenCLフレームワークは、ユーザがGPUのためのアプリケーションを作り出すことができるC言語等の開発環境を提供する。OpenCLは、ユーザが、例えば、データ並列計算等のいくつかの計算をGPUにオフロードするための命令を指定することを可能にする。また、OpenCLは、異種の又は他の計算システム内でコードがコンパイルされ、実行されることが可能なコンパイラ及び実行時環境を提供する。
【0005】
OpenCL、CUDA及び多くの低レベルのGPU中間言語により具体化される計算モデルは、場合によっては、単一命令複数スレッド(「SIMT」)として知られる。SIMTモデルが頻繁に使用される実施態様では、ベクトル上でハードウェアマスクセットを使用するSIMDの実行は、ハードウェアにおいて利用可能であるものよりも微細までスレッディングをシミュレーションするために使用される。
【0006】
CPU及びGPUの両方が多くの種類のコードの実行のために使用され得る計算モデルを効率的に利用するために、より柔軟なスレッド同期モデルが必要とされる。OpenCLにおいて利用可能な従来の作業項目の同期は、例えば、伝統的なグラフィックス処理タスクではない作業項目と共に使用される場合に、効率的ではない可能性がある。例えば、グラフィックス処理タスクにおいてそれぞれの並列の作業項目は分岐し得ないことが多い可能性があるのに対して、CPU関連アプリケーションでは、実行の分岐が比較的高い可能性がある。OpenCLでそれ自体によって提供された同期モデルは、作業項目のそのような動的挙動を扱うには不十分である。
【0007】
OpenCLでは、作業グループ内の作業項目が同期され得る。作業グループ内では、バリア命令は、何れかがバリアを過ぎて進み得る前に作業グループ内の全ての作業項目が当該バリアに到達する必要があるというセマンティックを用いて、発行され得る。「バリア」は、上述したセマンティックが満たされるまでバリアに到達する全てのプロセスをブロックする。そして、バリアは、ブロックしたプロセスを解除し、それぞれのプロセスを再開する。しかしながら、OpenCLや他の類似の従来のフレームワークでは、制御フローにおけるバリアの使用が強く制限される。
【0008】
図1Aは、グループで共有されるメモリ空間に値をロードするための(
図1Aにおいてカーネルと呼ばれる)単一の作業項目の使用を例示した図であり、他の作業項目は、当該メモリ空間からロードされた値を得ることができる。作業グループ内の他の作業項目は、その値をロードする作業項目のみならず、グループ内の全ての作業項目がバリアに到達するまで、バリアを越えて進むことがブロックされる。
【0009】
また、グループで共有されたメモリ内にその値をロードする上記動作は、カーネルコードから呼ばれるライブラリ関数内から行われ得る。
図1Bは、バリア命令を含むライブラリ関数を例示する図である。
図1Cは、ライブラリ関数を呼ぶカーネルを例示する図である。
図1Cにおけるコードは、指定された作業項目が共有領域にデータをロードするまで、対応するライブラリを呼ぶ全ての作業項目をブロックする動作を例示する。
【0010】
図1Dは、ライブラリ内にバリアへの呼び出しを置くことによって不正確な動作を導き得る例を示す図である。例えば、条件の1つが関数への呼び出しを有しないという条件を有するカーネルからのバリア命令を含むライブラリ関数の呼び出しは、デッドロックを導く可能性がある。これは、グループの全ての作業項目がバリアに到達したときにだけ当該バリアが解除することになる一方で、条件が満たされない1つ以上の作業項目は、全くバリアに到達しないことになるからである。
【0011】
その上、OpenCLの作業項目の同期のフレームワークでは、カーネルを実行する作業グループ内の作業項目は、何れも実行を継続することを許可される前に、バリア命令を実行しなければならない。バリア命令は、カーネルを実行する作業グループ内の全ての作業項目によって遭遇し(すなわち、命令ストリームに到達され)なければならない。バリア命令が条件文内にある場合には、全ての作業項目は、任意の作業項目が条件文に入ってバリアを実行するときには、必ず条件に入る。バリア命令がループ内にある場合には、全ての作業項目は、何れもバリアを超えて実行を継続することが許可される前に、ループの繰り返しごとにバリア命令を実行する必要がある。これらの制限は、処理リソースを最適に利用するシステムやプログラマの能力を制限し得る。
【0012】
従って、作業項目の同期をより柔軟に効率的に使用することの可能な方法及びシステムが必要とされる。
【発明を実施するための形態】
【0018】
本発明は、特定の用途について例示的な実施形態を用いて本明細書にて説明されるが、発明はこれに限定されないことが理解されるべきである。本明細書に提供される教示を入手可能な当業者は、この発明の範囲内における追加的な修正、用途及び実施形態並びに発明が著しく有用となり得る追加的な分野を認識するであろう。
【0019】
本発明の実施形態は、任意のコンピュータシステム、計算デバイス、エンタテインメントシステム、メディアシステム、ゲームシステム、通信デバイス、パーソナルデジタルアシスタント、又は、1つ以上のプロセッサを使用する任意のシステムにおいて使用され得る。本発明は、異種計算システムを備えるシステムに特に役立ち得る。「異種計算システム」は、その用語が本明細書において使用される場合には、多種類のプロセッサが利用可能な計算システムをいう。
【0020】
GPUでは、処理要素に割り当てられた作業項目は「作業グループ(workgroup)」と呼ばれる。並列に実行するために発行される2つ以上の作業項目を「ウェーブフロント(wavefront)」という。作業グループは、1つ以上のウェーブフロントを備え得る。本実施形態では、作業グループの作業項目の同期に関連して主に説明されているが、この開示における教示は、共有メモリにアクセスできる任意の1つ以上のプロセッサ及び/又はプロセスのグループにわたって作業項目を同期させるために適用され得る。本明細書に使用される際、用語「カーネル」とは、同じコードベースを有する1つ以上の作業項目として並列に実行されるプログラム及び/又は処理ロジックのことをいう。いくつかの実施形態では、用語「作業項目」と「スレッド」とは、交換可能であることが留意されるべきである。この開示において、「作業項目」と「スレッド」との交換可能性は、例えば、実施形態におけるモデルに具体化される作業項目の実行の柔軟なシミュレーションされた例示又は真の独立性の例示となる。
【0021】
本発明の実施形態は、同時作業項目間のより効率的で、より柔軟な同期を可能にすることによって、システムの性能を大幅に向上させることができる。例えばSIMD又はSIMTフレームワークを使用して、非常に大きな数の同時作業項目を実行するGPU、マルチコアCPU又は他のプロセッサでは、実施形態は、いくつかの作業項目が、命令フローにおけるいくつかの点において、それらの実行を同期させる作業項目のグループを離れること及び/又は再び加わることを可能にすることによって、効率を改善する。例えば、特定の作業項目が、同期グループの残りと更なる同期を必要としない場合には、同期グループから当該作業項目自体を永続的に取り除くためのバリアスキップ命令が発行され得る。
【0022】
バリア再設定命令は、特定作業項目が同期グループに再び含まれるべきである場合に、後に発行され得る。スキップ命令は、事実上、対応する作業項目が、バリアが再設定される前のどの点でもバリアに到達しないことを宣言する。再設定命令は、同じバリアが再使用されることを可能にする。
【0023】
作業項目がバリアを永続的にスキップさせることを可能にすることにより、種々の性能改善が実現されることになる。例えば、プログラムの柔軟性が(
図2A〜
図2Bに例示されるように)大幅に改善され、より効率的なコードの生成が可能になる。また、(特に、多数の同時作業項目を用いるシステムにおける)ループ挙動も改善される。
【0024】
例えば、(バリア上の到着及び待機動作を含むシステムを含む)従来のシステムでは、全ての作業項目は、最も長く繰り返す作業項目がその繰り返しを完了するまで、バリアを含むループによって引き止められる。一方、本発明の実施形態では、グループとの更なる同期を必要としない作業項目は、システムにおけるデッドロックを生じさせることなくループを出ることが可能である。
【0025】
処理速度の向上は、電力効率の向上と共に実現される。
【0026】
図2は、本発明の実施形態によるバリアスキップ命令(例えば、b.skip())が使用される(疑似コードにおける)関数を例示する図である。bと名付けられたバリアが宣言され、条件ループを出た後にスキップ命令が発行される。ループ内では、作業項目は、指定条件が満たされるまでbを待つ。
【0027】
(
図2Aに例示された)「カーネル」関数に対応する全ての作業項目は、ループ内にある間に同じ又は類似の数の繰り返しを行わなくてもよい。各作業項目がループを出る際、スキップ命令が発行される。出て行く作業項目によるスキップ命令の発行は、ループをまだ離れていない他の作業項目に、出て行く作業項目がバリアに再び到達しないことを示す。それ故、バリアは、少なくとも「バリア再設定」と呼ばれる別の命令が発行されるまで、現在及び後のインスタンス化において出て行く作業項目を待つことを回避するように再構成され得る。例えば、バリアは、バリアに到達するために要求される作業項目の数が、出て行く作業項目を考慮するために低減され得るように、再構成され得る。
【0028】
従来のシステムでは、ループ内にバリア関数(例えば、barrier()又はbarrier().wait)を含む作業項目を効率的に扱うことができなかった。例えば、デッドロックを防止するために、各繰り返しにおいて、バリアが、全ての作業項目によって到達される(または訪問される)ように、同じ数の時間を繰り返すようにグループ内の全ての作業項目を強要する必要があった。そのようなアプローチは、作業項目が異なる実行経路を有し得る環境では、明らかに無駄であろう。
【0029】
別の従来の同期命令は、バリアの到着である。しかしながら、到着命令は、現在のバリアから呼び出し元だけを解除する。例えば、
図2Aにおいて、スキップ命令が到着命令と交換される場合には、バリアは、出て行く作業項目が、その後のバリアインスタンスにおいてバリアに到達することを依然として要求することになる。それ故、到着命令は、作業項目が、同期グループからそれ自体を永続的に取り除くことができる機構を提供しない。
【0030】
図2Bは、選択された作業項目が、本発明に係る他の作業項目との共有空間にデータをコピーすることを可能にする、疑似コードにおけるライブラリ関数「loadFunction」の実例を示す図である。ライブラリ関数は、バリア待機命令(例えばb.wait())の2つの呼び出しを含む。2つのバリア待機命令は、ライブラリ関数を呼び出す任意の作業項目によって発行されることになる。
【0031】
図2Bにおいて、カーネル関数「theKernel」は、指定条件が満たされたときにロード関数を呼び出す。指定条件が満たされない場合には、スキップ命令が発行される。
【0032】
(
図2Bにおいて)条件のその他の部分におけるスキップ命令は、条件を満たさない全ての作業項目が、スキップ命令を呼び出すことを確実にする。それ故、条件を満たすことができない全ての作業項目は、バリアの後のインスタンスの両方から除外されることになり、バリアインスタンスは、これらの作業項目を待たないことになる。命令フローにおけるバリアのインスタンスは、同期点と呼ばれ得る。2つの同期点は、ライブラリ関数におけるバリア待機(b.wait())の2つの呼び出しに対応する。各作業項目は、loadFunctionを呼び出し、それによって、2つの同期点でバリアに到達するので、又は、バリアの後の任意のインスタンスに到達させることによって自身を除外するスキップ命令を呼び出すので、デッドロックが発生しないことになる。
【0033】
対照的に、スキップ命令に代えて従来の到着命令が
図2Bにおいて使用された場合には、デッドロックが生じることになる。例えば、条件を満たさない各作業項目は、到着命令を実行するが、到着命令は、すぐ次のバリアから作業項目の発行を単に除外する。作業項目を発行することは、第2の同期点でバリアに到達することが予想され、従って、デッドロックが生じることになる。
【0034】
図3は、実施形態に係るバリア再設定命令(例えば、b.reset)を使用する疑似コードの実例を示す図である。カーネル関数「theKernel」は、
図2Bに例示されるように、指定条件が満たされる場合にロード関数を呼び出す。指定条件が満たされ場合には、再設定命令が後に続いているスキップ命令を発行する。
【0035】
スキップ命令の発行は、
図2Bに関連して上述したように、条件を満たすことができない全ての作業項目が、後の同期点の両方から除外されることになることを確実にする。同期点において、バリアは、これらの作業項目を待たないことになる。バリア再設定命令は、バリアを元の構成に再設定する。例えば、スキップ命令は、事実上、バリアのための同期グループのサイズを低減したが、再設定命令は、グループ内の作業項目によって発行される任意の先行するスキップ命令の効果を逆にする。再設定命令の実施態様は、再設定が完了する前に、任意の先行するバリアが同期されることを要求する。いくつかの実施形態によれば、バリア再設定は、再設定が適用されるバリアインスタンスへの関与を持つ全ての作業項目にわたって同期点をもたらす自己同期命令として実装される。他の実施形態では、ユーザは、再設定命令で同期を確実にするための1つ以上の同期点を含み得る。
図4Aは、実施形態に係るバリアのグループサイズと独立して定義されたサイズを有するバリアを使用する疑似コードの実例を示す図である。例えば、バリアbは、バリアが呼び出されるグループにいくつの作業項目が存在するかにかかわらず、16という元の同期グループのサイズで生成され得る。16という定義されたサイズでバリアbを生成することは、バリアb上で待機命令を呼び出す任意のプロセスが、バリアb上で同期するグループ内の任意の15個の作業項目と同期することを可能にする。
【0036】
定義されたサイズを有するバリアは、アプリケーションのために生成されることができ、そのアプリケーションにおいて、特定数の作業項目のみが、定義された条件を満たすことが知られている。このようにして、
図4Aに示されるように、条件を満たす作業項目は、バリアb上で同期することができる一方で、その他の作業項目は、「他の」経路を取る。バリアは、条件にかなう定義された数の作業項目だけを待つので、デッドロック状態が発生しないことになり、条件を満たさない作業項目は、スキップ命令を発行することを要求されない。
【0037】
図4Bの例示的な図では、バリアは、2つのグループの作業項目の同期に使用される。一方のグループは、指定条件を満たす。他方のグループは、その条件を満たさず、バリアb1及びb2を使用して別個に同期され得る。作業項目は、b1同期グループ又はb2同期グループに属しており、作業項目が属していないグループに対してスキップ命令を発行することができる。
【0038】
図4Cの例示的な図では、疑似コードにおける階層バリアが使用される。第1の指定条件を満たす作業項目は、バリアb1についての待機命令上で同期し、他の作業項目はバリアb1をスキップする。第1の指定条件を満たす作業項目は、別のバリアb2に遭遇する。第2のバリアb2に遭遇する作業項目のうち第2の条件を満たす作業項目は、b2を待ち、他の作業項目はb2をスキップする。疑似コードに示されるように、バリアb2は、バリアb1の現在の状態に基づいて生成される。
【0039】
より詳細には、バリアb2のサイズ(すなわち、b2が同期を実施する作業項目の数)は、b1についてスキップ命令を発行していない作業項目の数によって表される。
図4Cにおいて、この数は、第1の条件を満たす作業項目の数である。他の実施形態では、b1がスキップされるときに、バリアb2の更新の基本的な実施態様を要求し得る。その上、b2の更新においていくつかの状況で生じ得る競合条件を回避するために、b1のスキップ動作は、b1のスキップ動作の前に同期点を有することによって保護され得る。
【0040】
図5は、本発明の実施形態に係るいくつかの作業項目T1、T2、T3及びT4の経時的な例示フロー500の実例を示す図である。図示されるように、T1、T2、T3及びT4は、同時に又は実質的に同時に開始する。各作業項目における第1のバリア待機命令は、各作業項目を同期点501で同期させることをもたらす。同期点501における同期は、各作業項目のうち最後の作業項目が501に到着するまで待機し、次いで、同時に又はほぼ同時に実行を再開する作業項目T1、T2、T3及びT4を包含する。
【0041】
点502では、作業項目T4は、バリア到着命令を発行する。バリア到着命令は、T4を待たないようにバリアの次のインスタンスに通知し、T4は、バリアの第2のインスタンスで同期させることなく進む。
【0042】
同期点503では、作業項目T1、T2及びT3は、命令ストリームにおける第2のバリア待機命令に基づいて、バリアの第2のインスタンス上で同期する。全ての作業項目T1、T2及びT3が同期点503に到着すると、各作業項目は、同時に又はほぼ同時に実行を再開する。
【0043】
点504では、T1は、バリアスキップ命令を発行する。バリアスキップ命令は、T1を待たないようにバリアの後の任意のインスタンスに通知し、T1は、バリアの後のインスタンスで同期させることなく進む。
【0044】
同期点505では、作業項目T2、T3及びT4が同期する。T4は、(502で)バリア到着命令を前もって発行しているが、この前もった発行は、次に(すなわち、同期点503で)発生するバリアからT4だけを除外していることに留意する。同期点505における同期の後に、T2、T3及びT4は、同期点506で再び同期するように進む。同期点506で同期されると、T2及びT3は、各々の命令ストリームにおけるバリア待機命令の4つのインスタンスにそれぞれ遭遇していることになる。このとき、T4は、3つのインスタンスだけに遭遇していることになる。同期点505及び506におけるバリアは、T1が同期点505及び506の前に504でバリアスキップ命令を発行しているので、T1についてブロックしない。
【0045】
やがて点507では、506の発生後、T1が、バリア再設定命令を発行する。これは、バリアを元の構成に再設定する。元のバリアは、全ての4つの作業項目T1、T2、T3及びT4について同期させるように構成される。再設定は、T1を、同期点507にてT2、T3及びT4と同期させる。点507における同期は、自己同期命令として再設定を実装することによって、又は、再設定と関連付けられたユーザ指定の同期命令によって、実現され得る。
【0046】
点507における同期に次いで、T1〜T4は、各作業項目における待機命令に基づいて、同期点508で同期するように進む。
【0047】
図6は、実施形態に係る作業項目の同期のための例示的な方法600の実例を示す図である。
【0048】
動作602では、作業項目のグループが開始される。作業項目は、同一コードの複数の作業項目であってもよい。同一コードのそれぞれの作業項目において実行される実際の命令シーケンスは、条件評価などに応じて、同じであってもよいし、異なってもよい。別の実施形態によれば、作業項目は、全てが同一コードではなく、1つ以上の同期点を互いに共有している任意の作業項目によって構成されてもよい。
【0049】
複数の作業項目は、同時に又は非同時に開始され得る。作業項目は、CPU上、GPU上、2つ以上のGPU上、CPUの2つ以上のコア上、又は、1つ以上のGPUと1つ以上のCPUコアとの任意の組み合わせによって、実行され得る。実施形態によれば、複数の作業項目は、GPUの1つの処理要素上で実行する作業グループである。
【0050】
動作604では、バリアbが生成される。バリアbは、バリアbを宣言する作業項目上の命令を実行することによって生成されてもよいし、インスタンス化されてもよい。実施形態によれば、システムが、バリアbの宣言の第1のインスタンスに遭遇すると、バリアのインスタンスがメモリ内に生成される。続いてバリアbを宣言する作業項目は、既に生成されたバリアbへの参照を受信する。バリアの基本的な実施態様は、それぞれのフレームワーク及び/又はシステムにおいて異なり得る。計数セマフォは、例示的な機構であり、その機構によって、上記セマンティックを備えるバリアが実施され得る。
【0051】
メモリ内のバリアbオブジェクトの生成は、1つ以上のメモリ位置並びに/又はダイナミックメモリ及び/若しくはハードウェア内のレジスタの初期化を含む。例えば、バリアbに関連して、いくつかのカウントが、以下に説明されるように維持されることが必要とされる。バリア対象及び全てのカウントは、それらのメモリ位置への書き込みや読み出しにおける適切な同時制御機構を用いて、動的メモリ内に維持され得る。別の実施形態によれば、バリアbに対応するオブジェクトは、ダイナミックメモリ内でインスタンス化されるのに対して、対応するカウントは、特定のハードウエアレジスタ内に維持される。
【0052】
動作606では、バリアbを初期化するために必要とされる様々なカウントが決定され、それらの初期値が設定される。作業項目の訪問数(「訪問カウント」)は、バリアbに到達した作業項目の数を定義する。作業項目は、バリア待機命令又は等価物を発行する場合には、バリアに「到達」している。訪問カウントは、0に初期化され得る。バリアbについてバリアスキップ命令を実行している作業項目の数は、スキップされたカウント(「スキップカウント」)において追跡され得る。バリア解除閾値(「解除閾値」)は、バリアが待っている作業項目の数である。実施形態によれば、バリアbは、動作602で開始されたグループ内の作業項目の数に等しい解除閾値で初期化される。別の実施形態によれば、バリアbは、動作602で開始されたグループのサイズにかかわらずに定義されたサイズで(動作604で)生成される。従って、解除閾値は、定義されたサイズに初期化される。
【0053】
動作608では、命令フローからの任意の数の他の命令を実行した後に、作業項目xが、同期命令に到着する。同期命令は、限定されるものではないが、バリア待機、バリア到着、バリアスキップ及びバリア再設定のうち何れか1つであってよい。
【0054】
動作610では、同期命令がバリア待機命令であるか否かの判定がなされ、バリア待機命令である場合には、方法600は、動作612に進む。
【0055】
動作612では、訪問カウントが更新される。実施形態によれば、訪問カウントは、1だけインクリメントされ、作業項目xがバリアに到達したことを示す。
【0056】
動作614では、更新された訪問カウントとスキップカウントとの和が、解除閾値と比較される。和が解除閾値以上である場合には、作業項目xは、バリアに到着する最後の作業項目であり、バリアは、動作618で解除される。本実施形態によれば、バリアを解除することは、1つ以上のカウント値を再設定させ、ブロックされた作業項目に実行を再開させることである。
【0057】
バリアの解除は、動作620における訪問カウントの再設定と、動作622におけるバリアについてブロックされた全ての作業項目の再開とをもたらす。本実施形態によれば、動作620では、訪問カウントが0に再設定される。訪問カウントの再設定は、先に発生したバリア到着命令のいかなる影響も消す。しかしながら、訪問カウントの再設定は、先に発生した任意のバリアスキップ命令の影響を消さない。ブロックからのバリア解除の場合に行われるような訪問カウントだけの再設定が、バリア上の「一部再設定」動作として想定され得る。本明細書において使用される際、用語「一部再設定」とは、スキップ命令を発行していない作業項目に適用されるバリアの一部が再設定されることを意味する。
【0058】
動作622では、全てのブロックされた作業項目が実行を再開する。実施形態によれば、ブロックされた作業項目は、セマフォを待ってもよく、セマフォは、ブロックされた作業項目が実行を再開することができるように再設定される。例えば、ハードウェア又はソフトウェアに実装される計数セマフォは、作業項目をブロックするために使用され得る。動作622を完了した後に、方法600は、動作608に進む。
【0059】
動作614で、訪問カウントとスキップカウントとの和が解除閾値に等しくないと判断された場合には、動作616で、作業項目xがブロックされる。実施形態によれば、作業項目xのブロックは、作業項目にセマフォを待たせることによって行われ得る。作業項目xは、動作618〜622がバリアについて発生する場合に、後に解除されることになる。動作619は、例えば動作618〜622による、バリアの解除についての作業項目xの実行の継続を表す。
【0060】
動作610で、命令がバリア待機命令ではないことが判別された場合には、動作624で、命令がバリア到着であるか否かが判別される。バリア到着である場合には、動作626で訪問カウントが更新される。実施形態によれば、訪問カウントは、1だけインクリメントされ、作業項目xがバリアに到着したことを示す。訪問カウントを更新した後に、動作628で、作業項目xは、命令ストリームの作業項目実行を継続する。続いて、次の同期命令に直面する場合には、処理は動作608に進む。
【0061】
動作624で、命令がバリア到着命令ではないことが判別された場合には、動作630で、命令がバリアスキップであるか否かが判別される。バリアスキップである場合には、動作632で、スキップカウントが更新される。実施形態によれば、スキップカウントは、1だけインクリメントされる。次いで、動作636で、作業項目xは、実行を継続し、次の同期命令に遭遇する場合には動作608に進む。
【0062】
動作630で、命令がバリアスキップ命令ではないことが判別された場合には、動作638で、命令がバリア再設定であるか否かが判別される。バリア再設定である場合には、動作640で、バリアbが再設定される。実施形態によれば、バリア再設定命令に応じてバリアを再設定することは、訪問カウント及びスキップカウントを0に設定することを含む。それ故、バリア再設定がバリアb上で実行された後に、バリアbは、元の状態に再設定される。いくつかの状況では、競合条件は、グループ内の全ての作業項目がバリアで同期されない場合に生じ得る。従って、いくつかの実施形態では、バリア再設定命令は、自己同期命令として実装されてもよく、全ての作業項目にわたる同期点をもたらし得る。他の実施形態では、ユーザは、再設定命令で同期を確実にするために1つ以上の同期点を含み得る。動作640に次いで、処理は、次の同期命令に命令ストリームにおいて遭遇する場合には、動作608まで続き得る。
【0063】
命令がバリア再設定命令ではないことが、ステップ638で判別された場合には、動作639で、作業項目xは、実行を継続し得る。動作639に次いで、処理は、命令ストリームにおいて次の同期命令に遭遇する場合には、動作608まで続き得る。
【0064】
別の実施形態によれば、別個のスキップカウント及びバリアのための解除閾値を維持する代わりに、解除閾値だけが維持され得る。例えば、解除閾値は、作業項目がバリアスキップ命令を実行したことを反映するようにデクリメントされ得る。次いで、バリア再設定命令が発行された場合には、カウントを再設定することは、解除閾値を元の大きさに再設定することを含むことになる。事実上、このアプローチによれば、バリアスキップを実行する作業項目の数は、同期グループを離れるものとして考えられ得る。
【0065】
図7は、実施形態に係る作業項目の同期のためのシステムのブロック図の実例を示す図である。
図7では、異種計算システム例700は、CPU701などの1つ以上のCPUと、GPU702などの1つ以上のGPUとを含むことができる。また、異種計算システム700は、システムメモリ703と、永続ストレージデバイス704と、システムバス705と、入出力デバイス706と、バリア同期装置709とを含むこともできる。
【0066】
CPU701は、市販されている制御プロセッサ又はカスタム制御プロセッサを含むことができる。CPU701は、例えば、異種計算システム700の動作を制御する制御ロジックを実行する。CPU701は、2つのCPUコア741,742を備えるマルチコアCPUなどのマルチコアCPUとすることができる。CPU701は、任意の制御回路に加えて、CPUコア741,742のCPUキャッシュメモリ743,744を含む。CPUキャッシュメモリ743,744は、CPUコア741,742上のアプリケーションの実行中に命令及び/又はパラメータ値を一時的に記憶するために使用され得る。
【0067】
例えば、CPUキャッシュメモリ743は、CPUコア741上の制御ロジック命令の実行中に、システムメモリ703から1つ以上の制御ロジック命令、変数の値又は一定パラメータの値を一時的に記憶するために使用され得る。また、CPU701は、専用ベクトル命令処理部を含むこともできる。例えば、CPUコア742は、ベクトル化命令を効率的に処理することができるストリーミングSIMD拡張(SSE)ユニットを含むことができる。当業者は、CPU701が、選択された例において、CPUコアよりも多くの又は少ないものを含むことができること、及び、キャッシュメモリを有さないか、より複雑なキャッシュメモリ階層を有することができることを理解するであろう。
【0068】
GPU702は、市販のグラフィックスプロセッサ又はカスタム設計されたグラフィックスプロセッサを含むことができる。GPU702は、例えば、選択された機能のための専用コードを実行することができる。一般に、GPU702は、グラフィックスパイプライン計算やディスプレイ上の画像のレンダリングなどのグラフィックス機能を実行するために使用され得る。
【0069】
GPU702は、GPUグローバルキャッシュメモリ710と、1つ以上の計算部712,713とを含む。グラフィックスメモリ707は、GPU702に含まれてもよいし、GPU702に結合されてもよい。各計算部712,713は、GPUローカルメモリ714,715の各々と関連付けられている。各計算部は、1つ以上のGPU処理要素(PE)を含む。例えば、計算部712は、GPU処理要素721,722を含み、計算部713は、GPU PE723,724を含む。
【0070】
各GPU処理要素721,722,723,724は、少なくとも1つのプライベートメモリ(PM)731,732,733,734と関連付けられている。各GPU PEは、スカラー及びベクトル浮動小数点ユニットのうち1つ以上を含むことができる。また、GPU PEは、逆平方根ユニット及び正弦/余弦ユニットなどの専用目的ユニットを含むことができる。GPUグローバルキャッシュメモリ710は、例えばシステムメモリ703などのシステムメモリ及び/又は例えばグラフィックスメモリ707などのグラフィックスメモリに結合され得る。
【0071】
システムメモリ703は、ダイナミックランダムアクセスメモリ(DRAM)などの少なくとも1つの非永続(揮発性)メモリを含むことができる。システムメモリ703は、アプリケーション又は他の処理ロジックの部分の実行中に、処理ロジック命令、一定値及び可変値を記憶することができる。例えば、バリア同期装置709の制御ロジック及び/又は他の処理ロジックは、CPU701によるバリア同期装置709の実行中に、システムメモリ703内に存在することができる。本明細書において使用される際、用語「処理ロジック」は、制御フロー命令、計算を行うための命令、及び、リソースへの関連付けられたアクセスのための命令のことを言う。
【0072】
永続メモリ704は、磁気ディスク、光ディスク又はフラッシュメモリなどのようにデジタルデータを記憶することが可能な1つ以上の記憶デバイスを含む。永続メモリ704は、例えば、バリア同期装置709の命令ロジックの少なくとも一部を記憶することができる。異種計算システム700の起動によって、オペレーティングシステムや他のアプリケーションソフトウェアは、永続記憶装置704からシステムメモリ703内にロードされ得る。
【0073】
システムバス705は、周辺構成要素相互接続(PCI)バス、業界標準アーキテクチャ(ISA)バス、又は、これらのようなデバイスを含むことができる。また、システムバス705は、異種計算システム700の構成要素を含む構成要素に結合する機能とともに、ローカルエリアネットワーク(LAN)などのネットワークを含むこともできる。
【0074】
入出力インタフェース706は、キーボード、マウス、ディスプレイ及び/又はタッチスクリーンなどのユーザ入出力デバイスを接続する1つ以上のインタフェースを含む。例えば、ユーザ入力は、キーボードやマウスで接続されたユーザインタフェース706を通して、異種計算システム700に提供され得る。異種計算システム700の出力は、ユーザインタフェース706を通してディスプレイに出力され得る。
【0075】
グラフィックスメモリ707は、システムバス705及びGPU702に結合されている。グラフィックスメモリ707は、一般に、GPUによる高速アクセスのために、システムメモリ703から転送されるデータを記憶するために使用される。例えば、GPU702とグラフィックスメモリ707との間のインタフェースは、システムバスインタフェース705よりも数倍速くすることができる。
【0076】
バリア同期装置709は、同期機能についてのロジックと、GPU702及びCPU701の何れか一方又は両方についての処理ロジックとを含む。バリア同期装置709は、コンピュータにおけるプロセッサのグループ全体にわたって、個々のプロセッサにおいて、及び/又はプロセッサの各処理要素内で、作業項目を同期するように構成されてもよい。バリア同期装置709は、
図8に関連して以下に更に説明される。当業者は、バリア同期装置が、ソフトウェア、ファームウェア、ハードウェア又はそれらの任意の組み合わせを使用して実装され得ることを理解するであろう。ソフトウェアに実装される場合には、例えば、バリア同期装置709は、コンパイルされるときや実行されるときにシステムメモリ703に存在する、C言語又はOpenCLで書かれたコンピュータプログラムとすることができる。ソースコード形式及び/又はコンパイルされた実行可能形式では、バリア同期装置709は、永続メモリ704に記憶され得る。一実施形態では、バリア同期装置709の機能性のいくつか又は全ては、Verilog、RTL、ネットリストなどのハードウェア記述言語で指定され、本明細書において説明された発明の態様を具体化するハードウェアデバイスを生成するためのマスクワーク/フォトマスクの生成を通した製造工程の最終構成を可能にする。
【0077】
当業者は、異種計算システム700が、
図7に示されるものよりも多い又は少ない構成要素を含むことができることを理解するであろう。例えば、異種計算システム700は、1つ以上のネットワークインタフェース及び/又は例えばOpenCLフレームワークなどのソフトウェアアプリケーションを含むことができる。
【0078】
図8は、実施形態に係るバリア同期装置800の実例を示す図である。バリア同期装置800は、作業項目ブロックモジュール802と、バリア解除モジュール804と、バリア作業項目グループモジュール806と、バリアスキップモジュール808と、バリア再設定モジュール810とを含む。さらに、バリア同期装置800は、バリアレジスタ812を含むことができる。実施形態によれば、バリア同期装置800は、バリア同期装置709に含まれる。
【0079】
作業項目ブロックモジュール802は、バリア上で1つ以上の作業項目をブロックするように動作する。バリアは、セマフォ(例えば計数セマフォ)及びレジスタを使用して実装され得る。作業項目のブロック化は、ブロックされる作業項目にセマフォを待たせることによって実施され得る。セマフォは、ハードウェア又はソフトウェアで実装され得る。作業項目は、バリア待機命令に直面する場合にブロックされ得る。作業項目ブロックモジュールは、例えば、方法600の動作616を含む動作を実施するための処理ロジックを含むことができる。
【0080】
バリア解除モジュール804は、充分な数の作業項目がバリアに到達したときにバリアを解除するように動作する。上述したように、バリアは、セマフォを使用して実装されてもよく、バリアを解除することは、セマフォを解除することを含み得る。作業項目は、バリア待機命令に直面する場合に解除されてもよく、この作業項目は、結局、バリアに到達する作業項目の数についての要求を完了するための最後の作業項目になる。バリア解除モジュールは、例えば、方法600の動作618〜622を含む動作を実施するための処理ロジックを含むことができる。
【0081】
バリア作業項目グループモジュール806は、種々の実行作業項目にわたって同期グループを追跡し続けるよう動作する。また、バリア作業項目グループモジュール806は、グループ構成に従ってバリアを生成し初期化するように動作し得る。実施形態によれば、バリア解除モジュール806は、例えば、方法600の動作602〜606を含む動作を実施するための処理ロジックを含むことができる。
【0082】
バリアスキップモジュール808は、バリアスキップ命令を実施するように動作する。例えば、バリアスキップ命令は、対応するバリアについてのスキップカウントを更新させることになる。実施形態によれば、バリアスキップモジュール808は、方法600の動作630〜636を含む動作を実施するための処理ロジックを含むことができる。
【0083】
バリア再設定モジュール810は、バリア再設定命令を実施するように動作する。例えば、バリア再設定命令は、バリアに関連する訪問カウントやスキップカウントを、再設定、及び/又は解除閾値に調整させる。バリア再設定モジュール810は、例えば、方法600の動作638〜640を含む動作を実施するための処理ロジックを含むことができる。
【0084】
バリアレジスタ812は、バリアに関連するハードウェア及び/又はソフトウェアレジスタを含む。バリアレジスタ812は、複数のレジスタ及び/又はメモリ位置を備えるバリアレコード814を含むことができる。例示的なバリアレコード814は、バリア識別子822と、ロック824と、ブロックされた作業項目カウント826と、到着した作業項目カウント828と、スキップされた作業項目カウント830と、閾値832とを含む。バリア識別子822は、バリアのメモリ位置若しくはレジスタを一意的に識別するためのポインタ、インデックス又は他の識別子とすることができる。
【0085】
ロック824は、セマフォ、若しくは、プロセスがブロックされる他のエンティティへのポインタ又は参照であってもよい。ブロックされた作業項目カウント826は、バリアについてブロックされた作業項目の数である。到着した作業項目カウント828は、バリア到着命令を発行した作業項目の数である。スキップされた作業項目カウント830は、バリアスキップ命令を発行した作業項目の数である。閾値832は、解除閾値又は同期グループのグループサイズである。
【0086】
(結論)
概要や要約の欄は、発明者によって熟考されるような本発明の1つ以上の例示的な実施形態ではあるが、全てではない例示的な実施形態を説明している。それ故、決して本発明及び添付の特許請求の範囲を限定することを意図するものではない。
【0087】
本発明は、特定の機能及びそれらの関係の実施態様を例示する、機能的に作られたブロックを用いて上述されている。これらの機能的に作られたブロックの境界は、本明細書において説明の便宜のために適宜定義されている。特定の機能及びそれらの関係が適切に果たされる限りにおいて、代替の境界が定義され得る。
【0088】
特定の実施形態の上記の説明は、過度の実験を行うことなく、本発明の全体の概念を逸脱することなく、当該技術の範囲内の知識を適用することにより、かかる特定の実施形態の種々の用途のために当業者が容易に修正及び/又は適合を行うことができるように、本発明の全体の内容を完全に明らかにするものである。従って、かかる適合及び修正は、本明細書に例示された教示及び指導に基づき、開示された実施形態の均等物の意味や範囲内であることが意図される。本明細書の表現又は専門用語が、教示及び指導に照らして当業者によって解釈されるように、本明細書の表現又は専門用語は、説明を目的とするものであって、限定のためではないということが理解されることになる。
【0089】
本発明の広さや範囲は、上記の例示的な実施形態の何れによっても限定されるべきではないが、以下の特許請求の範囲やそれらの均等物に従ってのみ定義されるべきである。