(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公表特許公報(A)
(11)【公表番号】特表2017-537393(P2017-537393A)
(43)【公表日】2017年12月14日
(54)【発明の名称】ワークスティーリングサポートを有する効率的同期バリア技術[関連米国特許出願への相互参照] 本願は、2014年12月12日出願の米国特許出願第14/568,831号(発明の名称「TECHNOLOGIES FOR EFFICIENT SYNCHRONIZATION BARRIERS WITH WORK STEALING SUPPORT」)の優先権を主張するものである。
(51)【国際特許分類】
G06F 9/52 20060101AFI20171117BHJP
【FI】
G06F9/46 475A
【審査請求】未請求
【予備審査請求】未請求
【全頁数】23
(21)【出願番号】特願2017-526531(P2017-526531)
(86)(22)【出願日】2015年11月11日
(85)【翻訳文提出日】2017年5月16日
(86)【国際出願番号】US2015060149
(87)【国際公開番号】WO2016094016
(87)【国際公開日】20160616
(31)【優先権主張番号】14/568,831
(32)【優先日】2014年12月12日
(33)【優先権主張国】US
(81)【指定国】
AP(BW,GH,GM,KE,LR,LS,MW,MZ,NA,RW,SD,SL,ST,SZ,TZ,UG,ZM,ZW),EA(AM,AZ,BY,KG,KZ,RU,TJ,TM),EP(AL,AT,BE,BG,CH,CY,CZ,DE,DK,EE,ES,FI,FR,GB,GR,HR,HU,IE,IS,IT,LT,LU,LV,MC,MK,MT,NL,NO,PL,PT,RO,RS,SE,SI,SK,SM,TR),OA(BF,BJ,CF,CG,CI,CM,GA,GN,GQ,GW,KM,ML,MR,NE,SN,TD,TG),AE,AG,AL,AM,AO,AT,AU,AZ,BA,BB,BG,BH,BN,BR,BW,BY,BZ,CA,CH,CL,CN,CO,CR,CU,CZ,DE,DK,DM,DO,DZ,EC,EE,EG,ES,FI,GB,GD,GE,GH,GM,GT,HN,HR,HU,ID,IL,IN,IR,IS,JP,KE,KG,KN,KP,KR,KZ,LA,LC,LK,LR,LS,LU,LY,MA,MD,ME,MG,MK,MN,MW,MX,MY,MZ,NA,NG,NI,NO,NZ,OM,PA,PE,PG,PH,PL,PT,QA,RO,RS,RU,RW,SA,SC,SD,SE,SG,SK,SL,SM,ST,SV,SY,TH,TJ,TM,TN,TR,TT,TZ,UA,UG,US
(71)【出願人】
【識別番号】593096712
【氏名又は名称】インテル コーポレイション
(74)【代理人】
【識別番号】100107766
【弁理士】
【氏名又は名称】伊東 忠重
(74)【代理人】
【識別番号】100070150
【弁理士】
【氏名又は名称】伊東 忠彦
(74)【代理人】
【識別番号】100091214
【弁理士】
【氏名又は名称】大貫 進介
(72)【発明者】
【氏名】ロビンソン,アーキ ディー.
(72)【発明者】
【氏名】ゴンザレス,アレハンドロ デュラン
(57)【要約】
マルチスレッド同期およびワークスティーリングの技術には、スレッドチームの2つ以上のスレッドを実行する計算デバイスが含まれる。スレッドはタスクキュー内のすべてのタスクを実行し、関連するタスクストールンフラグ値を偽に交換し、その値を一時フラグに格納する。その後、スレッドは基本同期バリアに入る。計算デバイスは、スレッドチームの一時フラグに対して論理和リダクションを実行して、リダクション値を生成する。スレッドチームの他のスレッドがバリアに入るのを待つ間、スレッドはビクティムスレッドからタスクをスティールし、ビクティムスレッドのタスクストールンフラグを真に設定してもよい。基本同期バリアを出た後、リダクション値が真である場合、スレッドはタスクストールンフラグ値の交換と基本同期バリアに入ることを繰り返す。他の実施形態は説明し請求項に記載した。
【特許請求の範囲】
【請求項1】
マルチスレッド実行のための計算デバイスであって、
トランザクションバリアモジュールであって、
前記計算デバイスによって実行されるスレッドチームの第1のスレッドによって、前記第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第1のスレッドの一時フラグに格納し、前記一時フラグは第1のスレッドに対してローカルであり、
第1のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るトランザクションバリアモジュールと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第1のスレッドにより決定するリダクションモジュールであって、スレッドチームは第1のスレッドを含む複数のスレッドを含む、リダクションモジュールと、を有し、
前記トランザクションバリアモジュールはさらに、
複数の一時フラグのどれかが真であるとの決定に応じて、第1のスレッドにより、タスクストールンフラグの値の交換を繰り返す、
計算デバイス。
【請求項2】
スレッドチームの複数の一時フラグのどれかが真であるかの決定は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値の提供とを含む、
請求項1に記載の計算デバイス。
【請求項3】
第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納することは、第1のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納することを含む、
請求項1に記載の計算デバイス。
【請求項4】
タスク実行モジュールであって、
前記第1のスレッドによって、前記第1のスレッドのタスクキューから第1のタスクを実行し、
前記タスクキューが空であるかどうかを前記第1のスレッドによって判定するタスク実行モジュールをさらに有し、
タスクストールンフラグの値を交換することは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換することを含む、
請求項1に記載の計算デバイス。
【請求項5】
複数の一時フラグの各々はスレッドチームのスレッドに対応する、
請求項1に記載の計算デバイス。
【請求項6】
トランザクションバリアモジュールは、さらに、同期バリアに入るのに応じて、第1のスレッドによる、スレッドチームの他のスレッドが同期バリアに入るのを待つ、
請求項1ないし5いずれか一項に記載の計算デバイス。
【請求項7】
タスクスティーリングモジュールであって、
第1のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第2のスレッドからタスクをスティールし、
第1のスレッドが、タスクのスティーリングに応じて、第2のスレッドのタスクストールンフラグを真に設定するタスクスティーリングモジュールをさらに有する、
請求項6に記載の計算デバイス。
【請求項8】
タスクをスティールし、第2のスレッドのタスクストールンフラグを設定することは、原子的にタスクをスティールし、第2のスレッドのタスクストールンフラグを設定することを含む、
請求項7に記載の計算デバイス。
【請求項9】
タスクをスティールすることは、
スレッドチームの第2のスレッドを識別し、
第2のスレッドのタスクキューからタスクをポップすることを含み、
タスクをポップし、第2のスレッドのタスクストールンフラグを設定することは、原子的にタスクをポップし、第2のスレッドのタスクストールンフラグを設定することを含む、
請求項7に記載の計算デバイス。
【請求項10】
第2のスレッドを識別することは、スレッドチームからランダムに第2のスレッドを選択することを含む、
請求項9に記載の計算デバイス。
【請求項11】
第2のスレッドを識別することはさらに、
第2のスレッドのタスクキューが空であるか決定することと、
タスクキューがからであるとの決定に応じてランダムに第2のスレッドの選択を繰り返すこととを含む、
請求項10に記載の計算デバイス。
【請求項12】
タスクをスティールすることはさらに、
第1のスレッドが、タスクのポップに応じて、タスクを実行して完了することと、
第1のスレッドが、タスクを実行して完了することに応じて、第1のスレッドのタスクキューが空であるか決定することと、
第1のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第2のタスクをポップすることと、
第1のスレッドが、第2のタスクのポップに応じて、第2のタスクを実行して完了することとを含む、
請求項7に記載の計算デバイス。
【請求項13】
前記タスクスティーリングモジュールはさらに、
第1のスレッドが、第2のスレッドからのタスクのスティーリングに応じて、第1のスレッドの一時フラグが偽であるか決定し、
第2のスレッドのタスクストールンフラグを真に設定することはさらに、一時フラグが偽であるとの決定に応じて、第2のスレッドのタスクストールンフラグを真に設定することを含む、
請求項7に記載の計算デバイス。
【請求項14】
マルチスレッド実行の方法であって、
計算デバイスによって実行されるスレッドチームの第1のスレッドが、前記第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第1のスレッドの一時フラグに格納するステップであって、前記一時フラグは第1のスレッドに対してローカルであるステップと、
第1のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るステップと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第1のスレッドにより決定するステップであって、スレッドチームは第1のスレッドを含む複数のスレッドを含む、ステップと、
第1のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返すステップとを含む、
方法。
【請求項15】
スレッドチームの複数の一時フラグのどれかが真であるか決定するステップは、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供するステップを含む、
請求項14に記載の方法。
【請求項16】
第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納するステップは、第1のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納するステップを含む、
請求項14に記載の方法。
【請求項17】
第1のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つステップをさらに含む、請求項14に記載の方法。
【請求項18】
第1のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第2のスレッドからタスクをスティールするステップと、
第1のスレッドが、タスクのスティーリングに応じて、第2のスレッドのタスクストールンフラグを真に設定するステップとをさらに含む、
請求項17に記載の方法。
【請求項19】
タスクをスティールし、第2のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをスティールし、第2のスレッドのタスクストールンフラグを設定するステップを含む、
請求項18に記載の方法。
【請求項20】
タスクをスティールするステップは、
スレッドチームの第2のスレッドを識別するステップと、
第2のスレッドのタスクキューからタスクをポップするステップとを含み、
タスクをポップし、第2のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをポップし、第2のスレッドのタスクストールンフラグを設定するステップを含む、
請求項18に記載の方法。
【請求項21】
タスクをスティールするステップはさらに、
第1のスレッドが、タスクのポップに応じて、タスクを実行して完了するステップと、
第1のスレッドが、タスクを実行して完了することに応じて、第1のスレッドのタスクキューが空であるか決定するステップと、
第1のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第2のタスクをポップするステップと、
第1のスレッドが、第2のタスクのポップに応じて、第2のタスクを実行して完了するステップとを含む、
請求項18に記載の方法。
【請求項22】
第1のスレッドが、第2のスレッドからのタスクのスティーリングに応じて、第1のスレッドの一時フラグが偽であるか決定するステップをさらに含み、
第2のスレッドのタスクストールンフラグを真に設定するステップはさらに、一時フラグが偽であるとの決定に応じて、第2のスレッドのタスクストールンフラグを真に設定するステップを含む、
請求項18に記載の方法。
【請求項23】
計算デバイスであって、
プロセッサと、
前記プロセッサにより実行されたとき、前記プロセッサに、請求項14ないし22いずれか一項に記載の方法を実行させる複数の命令を格納したメモリとを有する、
計算デバイス。
【請求項24】
実行されると、計算デバイスに請求項14ないし22いずれか一項に記載の方法を実行させるコンピュータプログラム。
【請求項25】
請求項14ないし22いずれか一項に記載の方法を実行する手段を有する計算デバイス。
【請求項26】
請求項24に記載のコンピュータプログラムを格納した一以上の機械読み取り可能記憶媒体。
【発明の詳細な説明】
【背景技術】
【0001】
現在の計算デバイスおよびアプリケーションでは、効率的なマルチスレッドパフォーマンスがますます重要になってきている。OpenMPは、共有メモリ並列プログラミング用の一般的なアプリケーションプログラミングインタフェース(API)である。OpenMPは同期バリア機能を指定する。これは、スレッドチームで実行される複数のスレッドを調整するために使用される。一般に、スレッドチームのすべてのスレッドは、プログラムの実行が進む前にバリアに到達する必要がある。また、OpenMPは、スレッドがタスクを作成して実行するタスクシステムを指定する。スレッドが同期バリアを出る前に、すべてのタスクが完了する必要がある。したがって、スレッドは同期バリアで待機している間にタスクが実行されることがよくある。
【0002】
多くのOpenMP実装は、スレッドが別のスレッドから実行するタスクを「スティールする(steal)」「ワークスティーリング(work−stealing)」を使用する。つまり、あるスレッドが別のスレッドにタスクを要求し、そのタスクを実行して完了することができる。タスキング要件(tasking requirements)と互換性を持たせるために、OpenMP同期バリアは通常、ツリーバリアまたは線形バリアとして実装される。しかし、ツリーバリア(tree barriers)は、伝播バリア(dissemination barriers)のような非ツリーバリアと比較して、比較的長いクリティカルパスを有する。
【図面の簡単な説明】
【0003】
ここで説明するコンセプトを、添付した図面において、限定ではなく実施例により説明する。説明を単純かつ明確にするため、図に示した要素は必ずしもスケール通りには描いていない。適当であれば、対応または類似する要素を示すため、複数の図面で同じ参照レベルを用いた。
【0004】
【図1】ワークスティーリングを伴う効率的な同期バリアのための計算デバイスの少なくとも1つの実施形態を示す簡略化したブロック図である。
【0005】
【図2】図1の計算デバイスの環境の少なくとも一実施形態を示す簡略化したブロック図である。
【0006】
【図3】図1および図2の計算デバイスによって実行され得る並列タスク実行およびワークスティーリングの方法の少なくとも1つの実施形態を示す簡略化されたフロー図である。
【0007】
【図4】図1及び図2の計算デバイスにより実行され得る同期バリアを実行する方法の少なくとも一実施形態を示す簡略化したフロー図である。
【0008】
【図5】図1及び図2の計算デバイスにより実行され得る同期バリアの実行中にワークスティーリングをする方法の少なくとも一実施形態を示す簡略化したフロー図である。
【0009】
本開示のコンセプトはいろいろな修正を施したり代替的形式を取ったりすることもできるが、その具体的な実施形態を図面において実施例で示し、ここに詳細に説明する。しかし、言うまでもなく、開示した具体的な形式に本開示を限定する意図ではなく、逆に、本発明は本開示と添付した特許請求の範囲に沿ったすべての修正、等価物及び代替物をカバーするものである。
【0010】
本明細書において「one embodiment」、「an embodiment」、「an illustrative embodiment」などと言う場合、記載した実施形態が、ある機能、構造、または特徴を含むが、かならずしもすべての実施形態がその機能、構造、または特徴を含んでも含まなくてもよい。さらに、かかる文言は必ずしも同じ実施形態を参照しているとは限らない。さらに、ある機能、構造、または特徴をある実施形態について説明した場合、明示的に記載していようがいまいが、他の実施形態に関するそれらの機能、構造、または特徴に影響が及ぶことは、当業者には自明である。また、言うまでもなく、「少なくとも1つのA、B及びC」は、(A)、(B)、(C)、(A及びB)、(A及びC)、(B及びC)又は(A、B、及びC)を意味し得る。同様に、「A、B又はCのうちの少なくとも1つ」との形式のリストに含まれるアイテムは、(A)、(B)、(C)、(A及びB)、(A及びC)、(B及びC)又は(A、B、及びC)を意味し得る。
【0011】
開示した幾つかの場合には、ハードウェア、ファームウェア、ソフトウェア、またはそれらの任意の組み合わせで実装できる。開示の一時的又は非一時的な機械読み取り可能(例えば、コンピュータ読み取り可能)記憶媒体により担われ、又はそれに格納された(一以上のプロセッサにより読み取られ実行され得る)命令として実装することもできる。機械読み取り可能記憶媒体は、機械により読み取り可能な形式で情報を格納又は送信する任意のストレージデバイス、メカニズム、又はその他の物理的構造(例えば、揮発性又は不揮発性メモリ、メディアディスク、又はその他のメディアデバイス)として実施できる。
【0012】
図中、幾つかの構造的又は方法フィーチャを具体的な構成及び/又は順序で示すかも知れない。しかし、言うまでもなく、かかる具体的な構成及び/又は順序は必須ではない場合がある。むしろ、幾つかの場合には、かかるフィーチャは、例示した図面に示したのとは異なる方法及び/又は順序で構成することもできる。また、ある図面に構造的又は方法フィーチャを含めることは、かかるフィーチャがすべての実施形態において必要であることを意味するのではなく、幾つかの実施形態では、含まれなくてもよいし、他のフィーチャと組み合わされてもよい。
【0013】
ここで図1を参照する。ワークスティーリング(work stealing)を伴う効率的な同期バリアのための例示的な計算デバイス100は、プロセッサ120、I/Oサブシステム122、メモリ124、およびデータ記憶デバイス126を含む。使用中、以下に説明するように、計算デバイス100は、スレッドチームに編成されたスレッドのグループによって複数のタスクを実行するように構成される。各スレッドは、対応するタスクキューおよびブーリアンフラグに関連付けられている。すべての保留中のタスクを完了した後、スレッドは同期バリアに入ることができる。バリアに入る前に、スレッドはフラグ値を偽に原子的に交換し、元のフラグ値をスレッドローカルの一時フラグ変数に格納する。他のスレッドがバリアに入るのを待つ間、アクティブなスレッドは別のスレッド(「victim」スレッド)からタスクをスティール(steal)し、ビクティムタスク((「victim」タスク)すなわち、ビクティムスレッドからスティールされたタスク)を実行して完了させる。ビクティムタスクを実行すると、アクティブスレッドのキューに多くのタスクが追加される可能性がある。計算デバイス100は、各スレッドの一時フラグ変数に対して論理和リダクション演算を行い、リダクション値(reduction value)を生成する。リダクション値は、バリアチームに入る前に、スレッドチーム内のいずれかのスレッドが、対応するフラグをtrueに設定したかどうかを示す。言い換えれば、リダクション値は、バリアに入る前に、スレッドのどれかがタスクをスティールされたか(すなわち、ビクティムスレッドであった)どうかを示す。リダクション値が真である場合、計算デバイス100は、すべてのスレッドに同期化バリアを再試行させる。リダクション値が偽である場合、計算デバイス100は、すべてのスレッドが実行を継続できるようにする。
【0014】
計算デバイス100は、ディセミネーションバリア(dissemination barrier)などの非ツリーバリア(non−tree barrier)をOpenMPタスクセマンティクスと互換性を持って使用できるようにすることができる。非ツリーバリアは、ツリーバリアに比べて性能を向上させる可能性がある。例示的には、インテル(登録商標)Xeon Phi(商標)コプロセッサを含む本明細書に記載の計算デバイス100は、従来のツリーバリアの約2倍の同期バリア(synchronization barrier)性能を達成することができる。さらに、共有メモリマルチスレッドのための同期障壁として説明されているが、本明細書で開示される技術は、分散計算環境を含む任意の同時実行環境に使用され得る。
【0015】
計算デバイス100は、ワークスティーリング(work stealing)を伴う同期バリアの効率的な実行ができる、そうでなければここに説明の機能を実行できるいかなる種類のデバイスとして実施してもよい。例えば、計算デバイス100は、コンピュータ、デスクトップコンピュータ、ワークステーション、サーバコンピュータ、分散計算システム、マルチプロセッサシステム、ラップトップコンピュータ、ノートブックコンピュータ、タブレットコンピュータ、スマートフォン、モバイル計算デバイス、ウェアラブル計算デバイス、コンシューマエレクトロニクスデバイス、スマート機器、及び/又はその他の計算デバイスであって同期バリア(synchronization barriers)を効率的に実行できるものとして実施してもよいが、これらに限定されない。図1に示したように、例示の計算デバイス100は、プロセッサ120、I/Oサブシステム122、メモリ124、及びデータストレージデバイス126を含む。もちろん、計算デバイス100は、他の実施形態では、コンピュータに一般的に見られるようなその他の又は付加的なコンポーネント(例えば、様々な入出力デバイスなど)を含み得る。また、幾つかの実施形態では、例示したコンポーネントのうち一以上は、他のコンポーネントに組み込まれていても良く、又はその一部を構成していても良い。例えば、メモリ124又はその部分は、幾つかの実施形態では、プロセッサ120に組み込まれていても良い。
【0016】
プロセッサ120は、ここに説明する機能を実行できる任意のタイプのプロセッサとして実施できる。例えば、このプロセッサ120は、シングル又はマルチコアプロセッサ、コプロセッサ、デジタルシグナルプロセッサ、マイクロコントローラ、又はその他のプロセッサ又は処理/制御回路として実施できる。同様に、メモリ124は、ここに説明する機能を実行できる、任意のタイプの揮発性又は不揮発性メモリ又はデータストレージとして実施できる。動作中、メモリ124は、オペレーティングシステム、アプリケーション、プログラム、ライブラリ、及びドライバなど、計算デバイス100の動作中に用いられる様々なデータとソフトウェアを記憶できる。メモリ124は、I/Oサブシステム122を介してプロセッサ120に通信可能に結合している。I/Oサブシステム112は、プロセッサ120、メモリ124、及び計算デバイス100のその他のコンポーネントとの入出力動作を容易にする回路及び/又はコンポーネントとして実施できる。例えば、I/Oサブシステム122は、メモリコントローラハブ、入出力制御ハブ、ファームウェアデバイス、通信リンク(すなわち、ポイント・ツー・ポイントリンク、バスリンク、ワイヤ、ケーブル、光ガイド、プリント回路板トレースなど)及び/又は入出力動作を容易にするその他のコンポーネント及びサブシステムとして、又はこれらを含むものとして実施できる。幾つかの実施形態では、I/Oサブシステム122は、システム・オン・チップ(SoC)の一部を形成でき、単一の集積回路チップ上にプロセッサ120、メモリ124、及び計算デバイス100のその他のコンポーネントとともに、組み込むことができる。
【0017】
データストレージデバイス126は、例えば、メモリデバイスと回路、メモリカード、ハードディスクドライブ、固体ドライブ、その他の記憶デバイスなどの、データを短期又は長期にわたり格納するように構成された任意のタイプのデバイスとして実施できる。
【0018】
計算デバイス100は通信サブシステム128も含んでいてもよい。これは、コンピュータネットワーク(図示せず)を介した計算デバイス100とその他のリモートデバイスとの間の通信を可能にし得る、任意の通信回路、デバイスまたはそれらの集まりとして実施されてもよい。通信サブシステム128は、一以上の任意の通信技術(例えば、無線または有線通信)と、かかる通信を行う関連プロトコル(例えば、イーサネット(登録商標)、Bluetooth(登録商標)、Wi−Fi(登録商標)、WiMAXなど)とを用いるように構成されていてもよい。
【0019】
ここで図2を参照して、例示の実施形態では、計算デバイス100は、動作中に環境200を確立する。例示的な実施形態200は、トランザクションバリアモジュール202、基本バリアモジュール204、リダクションモジュール(reduction module)206、タスク実行モジュール208、タスクスティーリング(task stealing)モジュール210、およびスレッドモジュール212を含む。環境200の様々なモジュールは、ハードウェア、ファームウェア、ソフトウェア、またはこれらの組み合わせとして実施されてもよい。例えば、環境200の様々なモジュール、ロジック、その他のコンポーネントは、計算デバイス100のプロセッサ120又はその他のハードウェアコンポーネントの一部を構成しても、またはそれらにより確立されてもよい。例えば、いくつかの実施形態では、環境200の1つ又は複数のモジュールは、回路(例えば、同期バリア回路、リダクション回路など)として実施することができる。
【0020】
スレッドモジュール212は、スレッドチーム214および1つまたは複数のスレッド216を生成、実行および管理するように構成されている。スレッドチーム214は、タスク・グループまたは他の計算問題を実行するために使用できるスレッド216の集まりとして、実施してもよい。各スレッド216は、オペレーティングシステムスレッド、管理された実行可能スレッド、アプリケーションスレッド、ワーカースレッド(worker thread)、軽量スレッド、または他の実行可能プログラムとして実施することができる。スレッド216は、共通のメモリ空間を共有してもよいが、スレッドローカルストレージ、プライベート変数、または複数のスレッド216によって共有されない他のデータにアクセスすることもできる。各スレッド216は、タスクキュー218およびフラグ220を維持する。タスクキュー218は、スレッド216により実行される実行可能タスクのリストを含む。以下でさらに説明するように、各スレッド216は、それ自体のタスクキュー218からのタスクを実行してもよく、または別のスレッド216のタスクキュー218からタスクをスティールして(steal)、スティールされたタスクを実行してもよい。フラグ220は、別のスレッド216がタスクキュー218からタスクをスティールした場合に設定されるブール値(例えば、真または偽)を含む。別個のタスクキュー218および/またはフラグ220は、例えば、スレッド制御構造内またはスレッドローカルストレージ内の各スレッド216に対して記憶されてもよい。さらに、例示的な実施形態200は2つのスレッド216a、216bを有する単一のスレッドチーム214を含むが、言うまでもなく、いくつかの実施形態では、環境200は、複数のスレッドチーム214を含み、各スレッドチーム214は複数のスレッド216を含むことができる。
【0021】
トランザクションバリアモジュール202は、スレッド216のフラグ220を偽(false)に原子的に交換し、フラグ220の元の値をスレッドローカル一時フラグ変数に格納するように構成される。トランザクションバリアモジュール202は、基本バリアモジュール204を使用して、フラグ220を交換し一時フラグ変数を格納した後に、基本同期バリアに入るように構成される。以下でさらに説明するように、リダクション(reduction)モジュール206は、スレッドチーム214のすべてのスレッド216の一時フラグ変数に対するリダクション値(reduction value)を生成する。トランザクションバリア(transaction barrier)モジュール202はさらに、リダクション値(reduction value)が真であるかどうかを判定し、真であれば、スレッド216にフラグ220の交換を再試行させ、基本同期バリアを再入力させるように構成されている。すなわち、リダクション値が真である場合、トランザクションバリアモジュール202は、スレッド216のフラグ220を偽に原子的に交換し、フラグ220の元の値をスレッドローカル一時フラグ変数に格納するように構成される。
【0022】
リダクションモジュール206は、基本同期バリア(basic synchronization barrier)の実行中に、スレッドチーム214の各スレッド216の一時フラグ変数に対して論理「OR」リダクションを実行するように構成される。言い換えれば、リダクションモジュール206は、各スレッド216のためにローカルに格納されたすべてのフラグ値に対して論理和演算を実行し、その結果得られたリダクション値を各スレッド216に分配するように構成される。リダクションモジュール206は、例えば、ディセミネーションバリア(dissemination barrier)アルゴリズムまたはK−基数バリア(K−radix barrier)アルゴリズムなどの非ツリーベースのアルゴリズムを実行することを含む、リダクション(reduction)を実行する任意のアルゴリズムを用いることができる。
【0023】
タスク実行モジュール208は、スレッド216のタスクキュー218からタスクをポップし、これらのタスクを完了まで実行するように構成される。タスク実行モジュール208は、タスクキュー218から第1のタスクをポップするか、タスクキュー218からのタスクをスケジューリングすることもできる。タスク実行モジュール208は、同期バリアに入る前に、タスクキュー218が空であるかどうかを判定し、タスクキュー218が空であると判定したことに応じて同期バリアに入るように構成される。タスク実行モジュール208は、リダクション値が偽である場合(すなわち、スレッドチーム214の任意のスレッド216からさらなるタスクがスティールされない場合)、基本同期バリアを出た後に、トランザクションバリアを離れるように構成される。
【0024】
タスクスティーリングモジュール210は、スレッド216が同期バリアで待機している場合に、ビクティムスレッド216からタスクを原子的にスティールする(atomically steal)、タスクのスティールに応じてビクティムスレッド(victim thread)216のフラグ220を真に設定するように構成される。いくつかの実施形態では、最適化として、タスクスティーリングモジュール210は、アクティブスレッド216のフラグ220が真でない(例えば、偽)場合にのみ、ビクティムスレッド216のフラグ220を真に設定してもよい。タスクスティーリングモジュール210は、ビクティムスレッド216をランダムに識別し、ビクティムスレッド216のタスクキュー218が空であるかどうかを判定し、空でなければ、ビクティムスレッド216のタスクキュー218からタスクをポップすることができる。タスクスティーリングモジュール210は、ビクティムタスクを完了まで実行することができ、ビクティムタスクを完了した後、アクティブスレッド216のタスクキュー218に追加されたタスクを実行してもよい。
【0025】
ここで図3を参照する。図3に示すように、使用中、計算デバイス100は、並列タスク実行およびワークスティーリング(work stealing)のための方法300を実行することができる。方法300は、ブロック302で始まり、計算デバイス100は、スレッドチーム214によるタスクのグループの実行を開始する。タスクの実行は、例えば、計算デバイス100のマスタスレッドまたは他の制御エンティティによって開始することができる。タスクの実行を開始した後、方法300はブロック304まで並行して進む。
【0026】
ブロック304において、計算デバイス100は、スレッド216を使用して並列にタスクを実行し、ワークスティールを実行する。例えば、スレッド216の各々は、他のスレッド216と並列にタスクキュー218からタスクを実行することができる。例示的な方法300は、3つのスレッド216によって並列に実行される3つのブロック304を示す。もちろん、他の対応するスレッド216により実行されるブロック304がより少なくても、より多くてもよい。方法300に示されるように、タスク306は、ブロック304の実行中にスレッド216の間で転送されてもよい。例えば、スレッド216aは、別のスレッド216bのタスクキュー218からタスクをスティールし(steal)、そのスティールしたタスクを実行してもよい。
【0027】
ブロック304においてタスク306を実行した後、方法300はトランザクション同期バリア308に入る。例えば、各スレッド216は、タスクキュー218内のすべてのタスクの実行を完了した後、同期バリア308に入ることができる。スレッド216は、スレッドチーム214によって実行されるすべてのタスクが実行され完了するまで、トランザクション同期バリア308内で待機する。以下でさらに説明するように、同期バリア308で待機しているスレッド216は、ブロック306内でまだ実行中のスレッド216からタスク306をスティールしてもよい。全てのタスクが完了した後、方法300は、ブロック304にループバックして、並列にタスクを実行し続け、ワークスティーリング(work stealing)を実行する。
【0028】
ここで図4を参照する。図4に示すように、使用中、計算デバイス100は、同期バリアを実行する方法400を実行することができる。方法400のインスタンスは、例えば図3の方法300の実行中に、スレッドチーム214のスレッド216の各々によって実行されてもよい。方法400はブロック402で始まり、計算デバイス100は、スレッド216aにおいて、スレッド216aのタスクキュー218からタスクをポップする。タスクキュー218は、スレッド216aによって実行されるタスクを格納するために使用される任意のキュー、ダブルエンド(doubly−ended)キュー、リスト、アレイ、バッファ、または他のデータ構造として実施されてもよい。タスクキュー218は、スレッドローカル記憶装置またはスレッド216aに関連する他の記憶装置に格納することができる。いくつかの実施形態では、タスクキュー218は、他のスレッド216にアクセス可能であってもよい。
【0029】
ブロック404において、計算デバイス100は、スレッド216aを使用してタスクを実行して完了する。タスクを完了した後、ブロック406において、計算デバイス100は、スレッド216aのタスクキュー218が空であるかどうかを判定する。空でなければ、方法400はブロック402にループバックして、タスクキュー218からのタスクの実行を継続する。タスクキュー218が空である場合、方法400はブロック408に進む。
【0030】
ブロック408において、計算デバイス100は、スレッド216aを使用して、フラグ220をブール「偽」値と交換し、フラグ220の前の値をローカルに記憶する。例えば、フラグ220の前の値は、スレッド216aのプライベート変数に格納されてもよく、そうでなければスレッド216aのスレッドローカルストレージに格納されてもよい。計算デバイス100は、1つまたは複数の原子的演算(atomic operations)を使用してフラグ値を交換し、ローカルに格納することができる。いくつかの実施形態では、計算デバイス100は、タスクキュー218または他の同期メカニズム上のロックによって保護される非原子的演算(non−atomic operations)を代わりに使用することができる。
【0031】
ブロック410において、計算デバイス100は、スレッド216aを使用して、基本同期バリア(basic synchronization barrier)に入る。基本同期バリアは、ツリーバリア、線形バリア、またはディセミネーションバリア(dissemination barrier)などの非ツリーバリアを含む、任意のタイプの同期バリアとして実施することができる。いくつかの実施形態では、基本同期バリアは、同時係属中の米国特許出願第XX/XXX,XXX号(発明の名称「Technologies for Fast Synchronization Barriers for Many−Core Processing」)に記載されているバリアなどのK−基数同期バリア(K−radix synchronization barrier)として実施することができる。
【0032】
ブロック412において、計算デバイス100は、ローカルに格納されたフラグ値に対して論理「OR」リダクション演算を実行する。言い換えれば、計算デバイス100は、各スレッド216のためにローカルに格納されたフラグ値のすべてに対して論理和演算を実行し、結果として生じるリダクション値を各スレッド216に分配する。以下でさらに説明するように、リダクション値は、同期バリアに入る前にスレッド216のいずれかがタスクをスティールされたかどうかを示す。言い換えれば、対応するスレッド216が同期バリアに入る前に、いずれかのスレッド216のフラグ220が真であった場合に、リダクション値は真である。
【0033】
ブロック414において、スレッド216aが他のスレッド216の同期バリア内で待機している場合、計算デバイス100は、別のスレッド216b(「ビクティム」スレッド216b)から1つ以上のタスクをスティールし(steal)、ビクティムスレッドのフラグ220を真(true)にセットする。ワークスティーリングプロセスの1つの潜在的な図5に関連して以下でさらに説明される。
【0034】
ブロック416において、スレッド216a内の計算デバイス100は、基本同期バリアを出る。スレッド216aは、スレッドチーム214の他のすべてのスレッド216が同期バリアに入るのに応じて、同期バリアを出ることができる。したがって、同期バリアを出る時に、リダクション値を決定することができる。
【0035】
ブロック418において、スレッド216aの計算デバイス100は、ブロック412に関連して上述したreduce−all論理OR演算の結果であるリダクション値を決定する。上述したように、真であれば、1つまたは複数のタスクは、スレッド216が同期化バリアに入る前に、そのスレッド216からスティールされたものであり、それらのタスクはまだ実行中(in flight)である可能性がある。ブロック420において、計算デバイス100は、リダクション値が真であるか偽(false)であるかを判定する。真の場合、方法400はブロック408にループバックして、フラグ220の交換を再試行し、バリアに入ることを再試行する。リダクション値が偽である場合、方法400は完了する。言い換えれば、計算デバイス100は、タスクがスレッド216からスティールされていない状態で同期バリアが完了したかどうかを判定し、そうでなければ同期バリアを再試行する。したがって、方法400の実行中に、計算デバイス100によって実行される同期バリア動作は、トランザクション同期バリアまたはトランザクションバリアとして知られてもよい。
【0036】
ここで図5を参照する。図5に示すように、使用中、計算デバイス100は、ワークスティーリングの方法500を実行することができる。方法500は、図4のブロック414に関連して上述したように、スレッド216aが同期バリア内で待機している間に、スレッド216aを用いて計算デバイス100によって実行されてもよい。方法500はブロック502で開始し、スレッド216aにおいて、計算デバイス100は、基本同期バリアを出るかどうかを決定する。図4のブロック416に関連して上述したように、スレッド216aは、スレッドチーム214の他のすべてのスレッド216が同期バリアに入ること応じて、同期バリアを出てもよい。計算デバイス100が同期バリアを出ると決定した場合、方法500は完了する。計算デバイス100が同期化バリアを出ないと決定した場合(すなわち、スレッド216aが同期バリアで待機している場合)、方法500はブロック504に進む。
【0037】
ブロック504において、計算デバイス100は、スレッド216aにおいて、ランダムビクティムスレッド216bを決定する。例えば、計算デバイス100は、ランダムにスレッド識別子を選択してもよく、そうでなければ、スレッドチーム214のスレッド216から被害スレッド216bをランダムに選択してもよい。ブロック506において、スレッド216aを用いる計算デバイス100は、ビクティムスレッド216bのタスクキュー218が空か決定する。空である場合、方法500はブロック504にループバックして別のビクティムスレッド216bを選択する。ビクティムスレッド216bのタスクキュー218が空でない場合、方法500はブロック508に進む。
【0038】
ブロック508において、計算デバイス100は、スレッド216aにおいて原子的に動作を実行する。特に、計算デバイス100は、ブロック510−512に関連して以下に説明する動作を原子的に実行する。計算デバイス100は、例えば、1つ以上の原子的命令または他の原子的動作(atomic operations)を実行することができる。いくつかの実施形態では、計算デバイス100は、ビクティムスレッド216bのタスクキュー218または他の同期メカニズム上のロックによって保護される非原子的演算(non−atomic operations)を代わりに使用することができる。
【0039】
ブロック510において、スレッド216a内の計算デバイス100は、ビクティムスレッド216bのタスクキュー218からタスクをポップ(pop)する。いくつかの実施形態では、タスクをポップした後、方法500はブロック512に進んでもよい。ブロック512を含まない実施形態では、方法500は、以下で説明するブロック514に直接進むことができる。ブロック512において、スレッド216a内の計算デバイス100は、スレッド216aのフラグ220が真であるかどうかを判定する。真の場合、方法500は、ブロック508の原子的操作(atomic operation)を終了し、以下で説明するブロック516に進む。フラグ220が偽である場合、方法500はブロック514に進み、スレッド216a内の計算デバイス100は、ビクティムスレッド216bのフラグ220を真に設定する。ブロック512においてフラグ220が真であるかどうかをチェックすることにより、ブロック514が必要でないときにブロック514をスキップすることによって性能が向上する。フラグ220が既に真である場合、スレッド216aは、別のスレッド216bのフラグ220にアクセスすることなく、論理ORリダクション(logical−OR reduction)が真を返すと判定することができる。
【0040】
ブロック516において、スレッド216aの計算デバイス100は、ビクティムタスクを実行して完了する。すなわち、計算デバイス100は、犠牲スレッド216bのタスクキュー218からポップされたタスクを実行して完了する。ブロック518において、スレッド216a内の計算デバイス100は、スレッド216aのタスクキュー218が空であるかどうかを判定する。図4のブロック406に関連して上述したように、各スレッド216は、同期バリアに入る前に、そのタスクキュー218が空であると判定する。しかしながら、ブロック516と関連してビクティムタスクの実行中に、1つまたは複数の新しいタスクが生成され、スレッド216aのタスクキュー218に追加されてもよい。したがって、スレッド216aは、それ自身のタスクキュー218をチェックして、タスクが追加されたかどうかを判定する。タスクキュー218が空である場合、方法500は、ブロック504にループバックして、ワークスティーリングを実行し続ける。タスクキュー218が空でない場合、方法500はブロック520に進む。
【0041】
ブロック520において、スレッド216a内の計算デバイス100は、そのタスクキュー218からタスクをポップする。ブロック522において、スレッド216aの計算デバイス100は、ビクティムタスクを実行して完了する。タスクを完了した後、方法500はブロック518にループバックして、スレッド216aのタスクキュー218内の任意のタスクの実行を継続する。
【0043】
本明細書に開示の技術の例を以下に記載する。本技術の以下に記載の一以上の例、及びそれらの組み合わせを含み得る。
【0044】
例1が含む計算デバイスは、
マルチスレッド実行のための計算デバイスであって、
トランザクションバリアモジュールであって、
前記計算デバイスによって実行されるスレッドチームの第1のスレッドが、前記第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第1のスレッドの一時フラグに格納し、前記一時フラグは第1のスレッドに対してローカルであり、
第1のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るトランザクションバリアモジュールと、
第1のスレッドが、スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、決定するリダクションモジュールであって、スレッドチームは第1のスレッドを含む複数のスレッドを含む、リダクションモジュールとを有し、
前記トランザクションバリアモジュールはさらに、
第1のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返す。
【0045】
例2は例1の主題を含み、
スレッドチームの複数の一時フラグのどれかが真であるかの決定は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値の提供とを含む。
【0046】
例3は例1及び2のいずれかの主題を含み、
第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納することは、第1のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納することを含む。
【0047】
例4は例1−3のいずれかの主題を含み、
タスク実行モジュールをさらに含み、該タスク実行モジュールは、
前記第1のスレッドによって、前記第1のスレッドのタスクキューから第1のタスクを実行し、
前記タスクキューが空であるかどうかを前記第1のスレッドによって判定するタスク実行モジュールをさらに有し、
タスクストールンフラグの値を交換することは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換することを含む。
【0048】
例5は例1−4のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【0049】
実施例6は実施例1−5のいずれかの主題を含み、トランザクションバリアモジュールは、さらに、同期バリアに入るのに応じて、第1のスレッドによる、スレッドチームの他のスレッドが同期バリアに入るのを待つ。
【0050】
例7は例1−6のいずれかの主題を含み、
タスク実行モジュールをさらに含み、該タスクスティーリングモジュールは、
第1のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第2のスレッドからタスクをスティールし、
第1のスレッドが、タスクのスティーリングに応じて、第2のスレッドのタスクストールンフラグを真に設定する。
【0051】
例8は例1−7のいずれかの主題を含み、タスクをスティールし、第2のスレッドのタスクストールンフラグを設定することは、原子的にタスクをスティールし、第2のスレッドのタスクストールンフラグを設定することを含む。
【0052】
例9は例1−8のいずれかの主題を含み、
タスクをスティールすることは、
スレッドチームの第2のスレッドを識別することと、
第2のスレッドのタスクキューからタスクをポップすることとを含み、
タスクをポップし、第2のスレッドのタスクストールンフラグを設定することは、原子的にタスクをポップし、第2のスレッドのタスクストールンフラグを設定することを含む。
【0053】
例10は例1−9のいずれかの主題を含み、第2のスレッドを識別することは、スレッドチームからランダムに第2のスレッドを選択することを含む。
【0054】
例11は例1−10のいずれかの主題を含み、
第2のスレッドを識別することはさらに、
第2のスレッドのタスクキューが空か決定することと、
タスクキューが空であるとの決定に応じて第2のスレッドを第2のスレッドの選択をランダムに繰り返すこととを含む。
【0055】
実施例12は実施例1−11のいずれかの主題を含み、
タスクをスティールすることはさらに、
第1のスレッドが、タスクのポップに応じて、タスクを実行して完了することと、
第1のスレッドが、タスクを実行して完了することに応じて、第1のスレッドのタスクキューが空であるか決定することと、
第1のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第2のタスクをポップすることと、
第1のスレッドが、第2のタスクのポップに応じて、第2のタスクを実行して完了することとを含む。
【0056】
実施例13は実施例1−12のいずれかの主題を含み、
前記タスクスティーリングモジュールはさらに、
第1のスレッドが、第2のスレッドからのタスクのスティーリングに応じて、第1のスレッドの一時フラグが偽であるか決定し、
第2のスレッドのタスクストールンフラグを真に設定することはさらに、一時フラグが偽であるとの決定に応じて、第2のスレッドのタスクストールンフラグを真に設定することを含む。
【0057】
例14が含む計算デバイスは、
マルチスレッド実行の方法であって、該方法は、
前記計算デバイスによって実行されるスレッドチームの第1のスレッドが、前記第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第1のスレッドの一時フラグに格納するステップであって、前記一時フラグは第1のスレッドに対してローカルであるステップと、
第1のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るステップと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第1のスレッドにより決定するステップであって、スレッドチームは第1のスレッドを含む複数のスレッドを含む、ステップと、
第1のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返すステップとを含む。
【0058】
例15は例14の主題を含み、スレッドチームの複数の一時フラグのどれかが真であるか決定するステップは、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供するステップを含む。
【0059】
例16は例14及び15のいずれかの主題を含み、第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納するステップは、第1のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納するステップを含む。
【0060】
例17は例14−16のいずれかの主題を含み、
前記第1のスレッドが、前記第1のスレッドのタスクキューから第1のタスクを実行するステップと、
前記第1のスレッドが、前記タスクキューが空であるかどうかを判定するステップとをさらに含み、
タスクストールンフラグの値を交換するステップは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換するステップを含む。
【0061】
例18は例14−17のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【0062】
例19は例14−18のいずれかの主題を含み、第1のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つステップをさらに含む。
【0063】
例20は例14−19のいずれかの主題を含み、
第1のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第2のスレッドからタスクをスティールするステップと、
第1のスレッドが、タスクのスティーリングに応じて、第2のスレッドのタスクストールンフラグを真に設定するステップとをさらに含む。
【0064】
実施例21は実施例14−20のいずれかの主題を含み、タスクをスティールし、第2のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをスティールし、第2のスレッドのタスクストールンフラグを設定するステップを含む。
【0065】
例22は例14−21のいずれかの主題を含み、
タスクをスティールするステップは、
スレッドチームの第2のスレッドを識別するステップと、
第2のスレッドのタスクキューからタスクをポップするステップとを含み、
タスクをポップし、第2のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをポップし、第2のスレッドのタスクストールンフラグを設定するステップを含む。
【0066】
実施例23は実施例14−22のいずれかの主題を含み、第2のスレッドを識別するステップは、スレッドチームからランダムに第2のスレッドを選択するステップを含む。
【0067】
実施例24は実施例14−23のいずれかの主題を含み、
第2のスレッドを識別するステップはさらに、
第2のスレッドのタスクキューが空か決定するステップと、
タスクキューが空であるとの決定に応じて第2のスレッドの選択をランダムに繰り返すステップとを含む。
【0068】
実施例25は実施例14−24のいずれかの主題を含み、
タスクをスティールするステップはさらに、
第1のスレッドが、タスクのポップに応じて、タスクを実行して完了するステップと、
第1のスレッドが、タスクを実行して完了することに応じて、第1のスレッドのタスクキューが空であるか決定するステップと、
第1のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第2のタスクをポップするステップと、
第1のスレッドが、第2のタスクのポップに応じて、第2のタスクを実行して完了するステップとを含む。
【0069】
例26は例14−25のいずれかの主題を含み、
第1のスレッドが、第2のスレッドからのタスクのスティーリングに応じて、第1のスレッドの一時フラグが偽であるか決定するステップをさらに含み、
第2のスレッドのタスクストールンフラグを真に設定するステップはさらに、一時フラグが偽であるとの決定に応じて、第2のスレッドのタスクストールンフラグを真に設定するステップを含む。
【0070】
例27が含む計算デバイスは、
計算デバイスであって、
プロセッサと、
前記プロセッサにより実行されたとき、前記プロセッサに、実施例14−26いずれかに記載の方法を実行させる複数の命令を格納したメモリとを有する。
【0071】
実施例28は、実行されると、計算デバイスに実施例14乃至26いずれかに記載の方法を実行させる複数の命令を記憶した一以上の機械読み取り可能記憶媒体を含む。
【0072】
実施例29は、実施例14−26のいずれかに記載の方法を実行する手段を有する計算デバイスを含む。
【0073】
例30が含む計算デバイスは、
マルチスレッド実行のための計算デバイスであって、
前記計算デバイスによって実行されるスレッドチームの第1のスレッドが、前記第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第1のスレッドの一時フラグに格納する手段であって、前記一時フラグは第1のスレッドに対してローカルである手段と、
第1のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入る手段と、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第1のスレッドにより決定する手段であって、スレッドチームは第1のスレッドを含む複数のスレッドを含む、手段と、
第1のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返す手段とを含む。
【0074】
例31は例30の主題を含み、
スレッドチームの複数の一時フラグのどれかが真であるか決定する手段は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供する手段を含む。
【0075】
例32は例30及び31のいずれかの主題を含み、
第1のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納する手段は、第1のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納する手段を含む。
【0076】
実施例33は実施例30−32のいずれかの主題を含み、
前記第1のスレッドが、前記第1のスレッドのタスクキューから第1のタスクを実行する手段と、
前記第1のスレッドが、前記タスクキューが空であるかどうかを判定する手段とをさらに含み、
タスクストールンフラグの値を交換する手段は、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換する手段を含む。
【0077】
例34は例30−33のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【0078】
例35は例30−34のいずれかの主題を含み、第1のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つ手段をさらに含む。
【0079】
実施例36は実施例30−35のいずれかの主題を含み、
第1のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第2のスレッドからタスクをスティールする手段と、
第1のスレッドが、タスクのスティーリングに応じて、第2のスレッドのタスクストールンフラグを真に設定する手段とをさらに含む。
【0080】
実施例37は実施例30−36のいずれかの主題を含み、タスクをスティールする手段と、第2のスレッドのタスクストールンフラグを設定する手段は、原子的にタスクをスティールし、第2のスレッドのタスクストールンフラグを設定する手段を含む。
【0081】
実施例38は実施例30−37のいずれかの主題を含み、
タスクをスティールする手段は、
スレッドチームの第2のスレッドを識別する手段と、
第2のスレッドのタスクキューからタスクをポップする手段とを含み、
タスクをポップする手段と、第2のスレッドのタスクストールンフラグを設定する手段は、原子的にタスクをポップし、第2のスレッドのタスクストールンフラグを設定する手段を含む。
【0082】
実施例39は実施例30−38のいずれかの主題を含み、第2のスレッドを識別する手段は、スレッドチームからランダムに第2のスレッドを選択する手段を含む。
【0083】
実施例40は実施例30−39のいずれかの主題を含み、
第2のスレッドを識別する手段はさらに、
第2のスレッドのタスクキューが空か決定する手段と、
タスクキューが空であるとの決定に応じて第2のスレッドの選択をランダムに繰り返す手段とを含む。
【0084】
実施例41は実施例30−40のいずれかの主題を含み、
タスクをスティールする手段はさらに、
第1のスレッドが、タスクのポップに応じて、タスクを実行して完了する手段と、
第1のスレッドが、タスクを実行して完了することに応じて、第1のスレッドのタスクキューが空であるか決定する手段と、
第1のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第2のタスクをポップする手段と、
第1のスレッドが、第2のタスクのポップに応じて、第2のタスクを実行して完了する手段とを含む。
【0085】
実施例42は実施例30−41のいずれかの主題を含み、
第1のスレッドが、第2のスレッドからのタスクのスティーリングに応じて、第1のスレッドの一時フラグが偽であるか決定する手段をさらに含み、
第2のスレッドのタスクストールンフラグを真に設定する手段はさらに、一時フラグが偽であるとの決定に応じて、第2のスレッドのタスクストールンフラグを真に設定する手段を含む。
【国際調査報告】