(57)【要約】  マルチスレッド同期およびワークスティーリングの技術には、スレッドチームの２つ以上のスレッドを実行する計算デバイスが含まれる。スレッドはタスクキュー内のすべてのタスクを実行し、関連するタスクストールンフラグ値を偽に交換し、その値を一時フラグに格納する。その後、スレッドは基本同期バリアに入る。計算デバイスは、スレッドチームの一時フラグに対して論理和リダクションを実行して、リダクション値を生成する。スレッドチームの他のスレッドがバリアに入るのを待つ間、スレッドはビクティムスレッドからタスクをスティールし、ビクティムスレッドのタスクストールンフラグを真に設定してもよい。基本同期バリアを出た後、リダクション値が真である場合、スレッドはタスクストールンフラグ値の交換と基本同期バリアに入ることを繰り返す。他の実施形態は説明し請求項に記載した。
2017537393.tif 000002
【特許請求の範囲】
【請求項１】
マルチスレッド実行のための計算デバイスであって、
トランザクションバリアモジュールであって、
前記計算デバイスによって実行されるスレッドチームの第１のスレッドによって、前記第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第１のスレッドの一時フラグに格納し、前記一時フラグは第１のスレッドに対してローカルであり、
第１のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るトランザクションバリアモジュールと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第１のスレッドにより決定するリダクションモジュールであって、スレッドチームは第１のスレッドを含む複数のスレッドを含む、リダクションモジュールと、を有し、
前記トランザクションバリアモジュールはさらに、
複数の一時フラグのどれかが真であるとの決定に応じて、第１のスレッドにより、タスクストールンフラグの値の交換を繰り返す、
計算デバイス。
【請求項２】
スレッドチームの複数の一時フラグのどれかが真であるかの決定は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値の提供とを含む、
請求項１に記載の計算デバイス。
【請求項３】
第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納することは、第１のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納することを含む、
請求項１に記載の計算デバイス。
【請求項４】
タスク実行モジュールであって、
前記第１のスレッドによって、前記第１のスレッドのタスクキューから第１のタスクを実行し、
前記タスクキューが空であるかどうかを前記第１のスレッドによって判定するタスク実行モジュールをさらに有し、
タスクストールンフラグの値を交換することは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換することを含む、
請求項１に記載の計算デバイス。
【請求項５】
複数の一時フラグの各々はスレッドチームのスレッドに対応する、
請求項１に記載の計算デバイス。
【請求項６】
トランザクションバリアモジュールは、さらに、同期バリアに入るのに応じて、第１のスレッドによる、スレッドチームの他のスレッドが同期バリアに入るのを待つ、
請求項１ないし５いずれか一項に記載の計算デバイス。
【請求項７】
タスクスティーリングモジュールであって、
第１のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第２のスレッドからタスクをスティールし、
第１のスレッドが、タスクのスティーリングに応じて、第２のスレッドのタスクストールンフラグを真に設定するタスクスティーリングモジュールをさらに有する、
請求項６に記載の計算デバイス。
【請求項８】
タスクをスティールし、第２のスレッドのタスクストールンフラグを設定することは、原子的にタスクをスティールし、第２のスレッドのタスクストールンフラグを設定することを含む、
請求項７に記載の計算デバイス。
【請求項９】
タスクをスティールすることは、
スレッドチームの第２のスレッドを識別し、
第２のスレッドのタスクキューからタスクをポップすることを含み、
タスクをポップし、第２のスレッドのタスクストールンフラグを設定することは、原子的にタスクをポップし、第２のスレッドのタスクストールンフラグを設定することを含む、
請求項７に記載の計算デバイス。
【請求項１０】
第２のスレッドを識別することは、スレッドチームからランダムに第２のスレッドを選択することを含む、
請求項９に記載の計算デバイス。
【請求項１１】
第２のスレッドを識別することはさらに、
第２のスレッドのタスクキューが空であるか決定することと、
タスクキューがからであるとの決定に応じてランダムに第２のスレッドの選択を繰り返すこととを含む、
請求項１０に記載の計算デバイス。
【請求項１２】
タスクをスティールすることはさらに、
第１のスレッドが、タスクのポップに応じて、タスクを実行して完了することと、
第１のスレッドが、タスクを実行して完了することに応じて、第１のスレッドのタスクキューが空であるか決定することと、
第１のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第２のタスクをポップすることと、
第１のスレッドが、第２のタスクのポップに応じて、第２のタスクを実行して完了することとを含む、
請求項７に記載の計算デバイス。
【請求項１３】
前記タスクスティーリングモジュールはさらに、
第１のスレッドが、第２のスレッドからのタスクのスティーリングに応じて、第１のスレッドの一時フラグが偽であるか決定し、
第２のスレッドのタスクストールンフラグを真に設定することはさらに、一時フラグが偽であるとの決定に応じて、第２のスレッドのタスクストールンフラグを真に設定することを含む、
請求項７に記載の計算デバイス。
【請求項１４】
マルチスレッド実行の方法であって、
計算デバイスによって実行されるスレッドチームの第１のスレッドが、前記第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第１のスレッドの一時フラグに格納するステップであって、前記一時フラグは第１のスレッドに対してローカルであるステップと、
第１のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るステップと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第１のスレッドにより決定するステップであって、スレッドチームは第１のスレッドを含む複数のスレッドを含む、ステップと、
第１のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返すステップとを含む、
方法。
【請求項１５】
スレッドチームの複数の一時フラグのどれかが真であるか決定するステップは、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供するステップを含む、
請求項１４に記載の方法。
【請求項１６】
第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納するステップは、第１のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納するステップを含む、
請求項１４に記載の方法。
【請求項１７】
第１のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つステップをさらに含む、請求項１４に記載の方法。
【請求項１８】
第１のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第２のスレッドからタスクをスティールするステップと、
第１のスレッドが、タスクのスティーリングに応じて、第２のスレッドのタスクストールンフラグを真に設定するステップとをさらに含む、
請求項１７に記載の方法。
【請求項１９】
タスクをスティールし、第２のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをスティールし、第２のスレッドのタスクストールンフラグを設定するステップを含む、
請求項１８に記載の方法。
【請求項２０】
タスクをスティールするステップは、
スレッドチームの第２のスレッドを識別するステップと、
第２のスレッドのタスクキューからタスクをポップするステップとを含み、
タスクをポップし、第２のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをポップし、第２のスレッドのタスクストールンフラグを設定するステップを含む、
請求項１８に記載の方法。
【請求項２１】
タスクをスティールするステップはさらに、
第１のスレッドが、タスクのポップに応じて、タスクを実行して完了するステップと、
第１のスレッドが、タスクを実行して完了することに応じて、第１のスレッドのタスクキューが空であるか決定するステップと、
第１のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第２のタスクをポップするステップと、
第１のスレッドが、第２のタスクのポップに応じて、第２のタスクを実行して完了するステップとを含む、
請求項１８に記載の方法。
【請求項２２】
第１のスレッドが、第２のスレッドからのタスクのスティーリングに応じて、第１のスレッドの一時フラグが偽であるか決定するステップをさらに含み、
第２のスレッドのタスクストールンフラグを真に設定するステップはさらに、一時フラグが偽であるとの決定に応じて、第２のスレッドのタスクストールンフラグを真に設定するステップを含む、
請求項１８に記載の方法。
【請求項２３】
計算デバイスであって、
プロセッサと、
前記プロセッサにより実行されたとき、前記プロセッサに、請求項１４ないし２２いずれか一項に記載の方法を実行させる複数の命令を格納したメモリとを有する、
計算デバイス。
【請求項２４】
実行されると、計算デバイスに請求項１４ないし２２いずれか一項に記載の方法を実行させるコンピュータプログラム。
【請求項２５】
請求項１４ないし２２いずれか一項に記載の方法を実行する手段を有する計算デバイス。
【請求項２６】
請求項２４に記載のコンピュータプログラムを格納した一以上の機械読み取り可能記憶媒体。
【発明の詳細な説明】
【背景技術】
【０００１】
現在の計算デバイスおよびアプリケーションでは、効率的なマルチスレッドパフォーマンスがますます重要になってきている。ＯｐｅｎＭＰは、共有メモリ並列プログラミング用の一般的なアプリケーションプログラミングインタフェース（ＡＰＩ）である。ＯｐｅｎＭＰは同期バリア機能を指定する。これは、スレッドチームで実行される複数のスレッドを調整するために使用される。一般に、スレッドチームのすべてのスレッドは、プログラムの実行が進む前にバリアに到達する必要がある。また、ＯｐｅｎＭＰは、スレッドがタスクを作成して実行するタスクシステムを指定する。スレッドが同期バリアを出る前に、すべてのタスクが完了する必要がある。したがって、スレッドは同期バリアで待機している間にタスクが実行されることがよくある。
【０００２】
多くのＯｐｅｎＭＰ実装は、スレッドが別のスレッドから実行するタスクを「スティールする（ｓｔｅａｌ）」「ワークスティーリング（ｗｏｒｋ−ｓｔｅａｌｉｎｇ）」を使用する。つまり、あるスレッドが別のスレッドにタスクを要求し、そのタスクを実行して完了することができる。タスキング要件（ｔａｓｋｉｎｇ  ｒｅｑｕｉｒｅｍｅｎｔｓ）と互換性を持たせるために、ＯｐｅｎＭＰ同期バリアは通常、ツリーバリアまたは線形バリアとして実装される。しかし、ツリーバリア（ｔｒｅｅ  ｂａｒｒｉｅｒｓ）は、伝播バリア（ｄｉｓｓｅｍｉｎａｔｉｏｎ  ｂａｒｒｉｅｒｓ）のような非ツリーバリアと比較して、比較的長いクリティカルパスを有する。
【図面の簡単な説明】
【０００３】
ここで説明するコンセプトを、添付した図面において、限定ではなく実施例により説明する。説明を単純かつ明確にするため、図に示した要素は必ずしもスケール通りには描いていない。適当であれば、対応または類似する要素を示すため、複数の図面で同じ参照レベルを用いた。
【０００４】
【図１】ワークスティーリングを伴う効率的な同期バリアのための計算デバイスの少なくとも１つの実施形態を示す簡略化したブロック図である。
【０００５】
【図２】図１の計算デバイスの環境の少なくとも一実施形態を示す簡略化したブロック図である。
【０００６】
【図３】図１および図２の計算デバイスによって実行され得る並列タスク実行およびワークスティーリングの方法の少なくとも１つの実施形態を示す簡略化されたフロー図である。
【０００７】
【図４】図１及び図２の計算デバイスにより実行され得る同期バリアを実行する方法の少なくとも一実施形態を示す簡略化したフロー図である。
【０００８】
【図５】図１及び図２の計算デバイスにより実行され得る同期バリアの実行中にワークスティーリングをする方法の少なくとも一実施形態を示す簡略化したフロー図である。
【図面の詳細な説明】
【０００９】
本開示のコンセプトはいろいろな修正を施したり代替的形式を取ったりすることもできるが、その具体的な実施形態を図面において実施例で示し、ここに詳細に説明する。しかし、言うまでもなく、開示した具体的な形式に本開示を限定する意図ではなく、逆に、本発明は本開示と添付した特許請求の範囲に沿ったすべての修正、等価物及び代替物をカバーするものである。
【００１０】
本明細書において「ｏｎｅ  ｅｍｂｏｄｉｍｅｎｔ」、「ａｎ  ｅｍｂｏｄｉｍｅｎｔ」、「ａｎ  ｉｌｌｕｓｔｒａｔｉｖｅ  ｅｍｂｏｄｉｍｅｎｔ」などと言う場合、記載した実施形態が、ある機能、構造、または特徴を含むが、かならずしもすべての実施形態がその機能、構造、または特徴を含んでも含まなくてもよい。さらに、かかる文言は必ずしも同じ実施形態を参照しているとは限らない。さらに、ある機能、構造、または特徴をある実施形態について説明した場合、明示的に記載していようがいまいが、他の実施形態に関するそれらの機能、構造、または特徴に影響が及ぶことは、当業者には自明である。また、言うまでもなく、「少なくとも１つのＡ、Ｂ及びＣ」は、（Ａ）、（Ｂ）、（Ｃ）、（Ａ及びＢ）、（Ａ及びＣ）、（Ｂ及びＣ）又は（Ａ、Ｂ、及びＣ）を意味し得る。同様に、「Ａ、Ｂ又はＣのうちの少なくとも１つ」との形式のリストに含まれるアイテムは、（Ａ）、（Ｂ）、（Ｃ）、（Ａ及びＢ）、（Ａ及びＣ）、（Ｂ及びＣ）又は（Ａ、Ｂ、及びＣ）を意味し得る。
【００１１】
開示した実施形態は、幾つかの場合には、ハードウェア、ファームウェア、ソフトウェア、またはそれらの任意の組み合わせで実装できる。開示の実施形態は、一時的又は非一時的な機械読み取り可能（例えば、コンピュータ読み取り可能）記憶媒体により担われ、又はそれに格納された（一以上のプロセッサにより読み取られ実行され得る）命令として実装することもできる。機械読み取り可能記憶媒体は、機械により読み取り可能な形式で情報を格納又は送信する任意のストレージデバイス、メカニズム、又はその他の物理的構造（例えば、揮発性又は不揮発性メモリ、メディアディスク、又はその他のメディアデバイス）として実施できる。
【００１２】
図中、幾つかの構造的又は方法フィーチャを具体的な構成及び／又は順序で示すかも知れない。しかし、言うまでもなく、かかる具体的な構成及び／又は順序は必須ではない場合がある。むしろ、幾つかの場合には、かかるフィーチャは、例示した図面に示したのとは異なる方法及び／又は順序で構成することもできる。また、ある図面に構造的又は方法フィーチャを含めることは、かかるフィーチャがすべての実施形態において必要であることを意味するのではなく、幾つかの実施形態では、含まれなくてもよいし、他のフィーチャと組み合わされてもよい。
【００１３】
ここで図１を参照する。ワークスティーリング（ｗｏｒｋ  ｓｔｅａｌｉｎｇ）を伴う効率的な同期バリアのための例示的な計算デバイス１００は、プロセッサ１２０、Ｉ／Ｏサブシステム１２２、メモリ１２４、およびデータ記憶デバイス１２６を含む。使用中、以下に説明するように、計算デバイス１００は、スレッドチームに編成されたスレッドのグループによって複数のタスクを実行するように構成される。各スレッドは、対応するタスクキューおよびブーリアンフラグに関連付けられている。すべての保留中のタスクを完了した後、スレッドは同期バリアに入ることができる。バリアに入る前に、スレッドはフラグ値を偽に原子的に交換し、元のフラグ値をスレッドローカルの一時フラグ変数に格納する。他のスレッドがバリアに入るのを待つ間、アクティブなスレッドは別のスレッド（「ｖｉｃｔｉｍ」スレッド）からタスクをスティール（ｓｔｅａｌ）し、ビクティムタスク（（「ｖｉｃｔｉｍ」タスク）すなわち、ビクティムスレッドからスティールされたタスク）を実行して完了させる。ビクティムタスクを実行すると、アクティブスレッドのキューに多くのタスクが追加される可能性がある。計算デバイス１００は、各スレッドの一時フラグ変数に対して論理和リダクション演算を行い、リダクション値（ｒｅｄｕｃｔｉｏｎ  ｖａｌｕｅ）を生成する。リダクション値は、バリアチームに入る前に、スレッドチーム内のいずれかのスレッドが、対応するフラグをｔｒｕｅに設定したかどうかを示す。言い換えれば、リダクション値は、バリアに入る前に、スレッドのどれかがタスクをスティールされたか（すなわち、ビクティムスレッドであった）どうかを示す。リダクション値が真である場合、計算デバイス１００は、すべてのスレッドに同期化バリアを再試行させる。リダクション値が偽である場合、計算デバイス１００は、すべてのスレッドが実行を継続できるようにする。
【００１４】
計算デバイス１００は、ディセミネーションバリア（ｄｉｓｓｅｍｉｎａｔｉｏｎ  ｂａｒｒｉｅｒ）などの非ツリーバリア（ｎｏｎ−ｔｒｅｅ  ｂａｒｒｉｅｒ）をＯｐｅｎＭＰタスクセマンティクスと互換性を持って使用できるようにすることができる。非ツリーバリアは、ツリーバリアに比べて性能を向上させる可能性がある。例示的には、インテル（登録商標）Ｘｅｏｎ  Ｐｈｉ（商標）コプロセッサを含む本明細書に記載の計算デバイス１００は、従来のツリーバリアの約２倍の同期バリア（ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  ｂａｒｒｉｅｒ）性能を達成することができる。さらに、共有メモリマルチスレッドのための同期障壁として説明されているが、本明細書で開示される技術は、分散計算環境を含む任意の同時実行環境に使用され得る。
【００１５】
計算デバイス１００は、ワークスティーリング（ｗｏｒｋ  ｓｔｅａｌｉｎｇ）を伴う同期バリアの効率的な実行ができる、そうでなければここに説明の機能を実行できるいかなる種類のデバイスとして実施してもよい。例えば、計算デバイス１００は、コンピュータ、デスクトップコンピュータ、ワークステーション、サーバコンピュータ、分散計算システム、マルチプロセッサシステム、ラップトップコンピュータ、ノートブックコンピュータ、タブレットコンピュータ、スマートフォン、モバイル計算デバイス、ウェアラブル計算デバイス、コンシューマエレクトロニクスデバイス、スマート機器、及び／又はその他の計算デバイスであって同期バリア（ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  ｂａｒｒｉｅｒｓ）を効率的に実行できるものとして実施してもよいが、これらに限定されない。図１に示したように、例示の計算デバイス１００は、プロセッサ１２０、Ｉ／Ｏサブシステム１２２、メモリ１２４、及びデータストレージデバイス１２６を含む。もちろん、計算デバイス１００は、他の実施形態では、コンピュータに一般的に見られるようなその他の又は付加的なコンポーネント（例えば、様々な入出力デバイスなど）を含み得る。また、幾つかの実施形態では、例示したコンポーネントのうち一以上は、他のコンポーネントに組み込まれていても良く、又はその一部を構成していても良い。例えば、メモリ１２４又はその部分は、幾つかの実施形態では、プロセッサ１２０に組み込まれていても良い。
【００１６】
プロセッサ１２０は、ここに説明する機能を実行できる任意のタイプのプロセッサとして実施できる。例えば、このプロセッサ１２０は、シングル又はマルチコアプロセッサ、コプロセッサ、デジタルシグナルプロセッサ、マイクロコントローラ、又はその他のプロセッサ又は処理／制御回路として実施できる。同様に、メモリ１２４は、ここに説明する機能を実行できる、任意のタイプの揮発性又は不揮発性メモリ又はデータストレージとして実施できる。動作中、メモリ１２４は、オペレーティングシステム、アプリケーション、プログラム、ライブラリ、及びドライバなど、計算デバイス１００の動作中に用いられる様々なデータとソフトウェアを記憶できる。メモリ１２４は、Ｉ／Ｏサブシステム１２２を介してプロセッサ１２０に通信可能に結合している。Ｉ／Ｏサブシステム１１２は、プロセッサ１２０、メモリ１２４、及び計算デバイス１００のその他のコンポーネントとの入出力動作を容易にする回路及び／又はコンポーネントとして実施できる。例えば、Ｉ／Ｏサブシステム１２２は、メモリコントローラハブ、入出力制御ハブ、ファームウェアデバイス、通信リンク（すなわち、ポイント・ツー・ポイントリンク、バスリンク、ワイヤ、ケーブル、光ガイド、プリント回路板トレースなど）及び／又は入出力動作を容易にするその他のコンポーネント及びサブシステムとして、又はこれらを含むものとして実施できる。幾つかの実施形態では、Ｉ／Ｏサブシステム１２２は、システム・オン・チップ（ＳｏＣ）の一部を形成でき、単一の集積回路チップ上にプロセッサ１２０、メモリ１２４、及び計算デバイス１００のその他のコンポーネントとともに、組み込むことができる。
【００１７】
データストレージデバイス１２６は、例えば、メモリデバイスと回路、メモリカード、ハードディスクドライブ、固体ドライブ、その他の記憶デバイスなどの、データを短期又は長期にわたり格納するように構成された任意のタイプのデバイスとして実施できる。
【００１８】
計算デバイス１００は通信サブシステム１２８も含んでいてもよい。これは、コンピュータネットワーク（図示せず）を介した計算デバイス１００とその他のリモートデバイスとの間の通信を可能にし得る、任意の通信回路、デバイスまたはそれらの集まりとして実施されてもよい。通信サブシステム１２８は、一以上の任意の通信技術（例えば、無線または有線通信）と、かかる通信を行う関連プロトコル（例えば、イーサネット（登録商標）、Ｂｌｕｅｔｏｏｔｈ（登録商標）、Ｗｉ−Ｆｉ（登録商標）、ＷｉＭＡＸなど）とを用いるように構成されていてもよい。
【００１９】
ここで図２を参照して、例示の実施形態では、計算デバイス１００は、動作中に環境２００を確立する。例示的な実施形態２００は、トランザクションバリアモジュール２０２、基本バリアモジュール２０４、リダクションモジュール（ｒｅｄｕｃｔｉｏｎ  ｍｏｄｕｌｅ）２０６、タスク実行モジュール２０８、タスクスティーリング（ｔａｓｋ  ｓｔｅａｌｉｎｇ）モジュール２１０、およびスレッドモジュール２１２を含む。環境２００の様々なモジュールは、ハードウェア、ファームウェア、ソフトウェア、またはこれらの組み合わせとして実施されてもよい。例えば、環境２００の様々なモジュール、ロジック、その他のコンポーネントは、計算デバイス１００のプロセッサ１２０又はその他のハードウェアコンポーネントの一部を構成しても、またはそれらにより確立されてもよい。例えば、いくつかの実施形態では、環境２００の１つ又は複数のモジュールは、回路（例えば、同期バリア回路、リダクション回路など）として実施することができる。
【００２０】
スレッドモジュール２１２は、スレッドチーム２１４および１つまたは複数のスレッド２１６を生成、実行および管理するように構成されている。スレッドチーム２１４は、タスク・グループまたは他の計算問題を実行するために使用できるスレッド２１６の集まりとして、実施してもよい。各スレッド２１６は、オペレーティングシステムスレッド、管理された実行可能スレッド、アプリケーションスレッド、ワーカースレッド（ｗｏｒｋｅｒ  ｔｈｒｅａｄ）、軽量スレッド、または他の実行可能プログラムとして実施することができる。スレッド２１６は、共通のメモリ空間を共有してもよいが、スレッドローカルストレージ、プライベート変数、または複数のスレッド２１６によって共有されない他のデータにアクセスすることもできる。各スレッド２１６は、タスクキュー２１８およびフラグ２２０を維持する。タスクキュー２１８は、スレッド２１６により実行される実行可能タスクのリストを含む。以下でさらに説明するように、各スレッド２１６は、それ自体のタスクキュー２１８からのタスクを実行してもよく、または別のスレッド２１６のタスクキュー２１８からタスクをスティールして（ｓｔｅａｌ）、スティールされたタスクを実行してもよい。フラグ２２０は、別のスレッド２１６がタスクキュー２１８からタスクをスティールした場合に設定されるブール値（例えば、真または偽）を含む。別個のタスクキュー２１８および／またはフラグ２２０は、例えば、スレッド制御構造内またはスレッドローカルストレージ内の各スレッド２１６に対して記憶されてもよい。さらに、例示的な実施形態２００は２つのスレッド２１６ａ、２１６ｂを有する単一のスレッドチーム２１４を含むが、言うまでもなく、いくつかの実施形態では、環境２００は、複数のスレッドチーム２１４を含み、各スレッドチーム２１４は複数のスレッド２１６を含むことができる。
【００２１】
トランザクションバリアモジュール２０２は、スレッド２１６のフラグ２２０を偽（ｆａｌｓｅ）に原子的に交換し、フラグ２２０の元の値をスレッドローカル一時フラグ変数に格納するように構成される。トランザクションバリアモジュール２０２は、基本バリアモジュール２０４を使用して、フラグ２２０を交換し一時フラグ変数を格納した後に、基本同期バリアに入るように構成される。以下でさらに説明するように、リダクション（ｒｅｄｕｃｔｉｏｎ）モジュール２０６は、スレッドチーム２１４のすべてのスレッド２１６の一時フラグ変数に対するリダクション値（ｒｅｄｕｃｔｉｏｎ  ｖａｌｕｅ）を生成する。トランザクションバリア（ｔｒａｎｓａｃｔｉｏｎ  ｂａｒｒｉｅｒ）モジュール２０２はさらに、リダクション値（ｒｅｄｕｃｔｉｏｎ  ｖａｌｕｅ）が真であるかどうかを判定し、真であれば、スレッド２１６にフラグ２２０の交換を再試行させ、基本同期バリアを再入力させるように構成されている。すなわち、リダクション値が真である場合、トランザクションバリアモジュール２０２は、スレッド２１６のフラグ２２０を偽に原子的に交換し、フラグ２２０の元の値をスレッドローカル一時フラグ変数に格納するように構成される。
【００２２】
リダクションモジュール２０６は、基本同期バリア（ｂａｓｉｃ  ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  ｂａｒｒｉｅｒ）の実行中に、スレッドチーム２１４の各スレッド２１６の一時フラグ変数に対して論理「ＯＲ」リダクションを実行するように構成される。言い換えれば、リダクションモジュール２０６は、各スレッド２１６のためにローカルに格納されたすべてのフラグ値に対して論理和演算を実行し、その結果得られたリダクション値を各スレッド２１６に分配するように構成される。リダクションモジュール２０６は、例えば、ディセミネーションバリア（ｄｉｓｓｅｍｉｎａｔｉｏｎ  ｂａｒｒｉｅｒ）アルゴリズムまたはＫ−基数バリア（Ｋ−ｒａｄｉｘ  ｂａｒｒｉｅｒ）アルゴリズムなどの非ツリーベースのアルゴリズムを実行することを含む、リダクション（ｒｅｄｕｃｔｉｏｎ）を実行する任意のアルゴリズムを用いることができる。
【００２３】
タスク実行モジュール２０８は、スレッド２１６のタスクキュー２１８からタスクをポップし、これらのタスクを完了まで実行するように構成される。タスク実行モジュール２０８は、タスクキュー２１８から第１のタスクをポップするか、タスクキュー２１８からのタスクをスケジューリングすることもできる。タスク実行モジュール２０８は、同期バリアに入る前に、タスクキュー２１８が空であるかどうかを判定し、タスクキュー２１８が空であると判定したことに応じて同期バリアに入るように構成される。タスク実行モジュール２０８は、リダクション値が偽である場合（すなわち、スレッドチーム２１４の任意のスレッド２１６からさらなるタスクがスティールされない場合）、基本同期バリアを出た後に、トランザクションバリアを離れるように構成される。
【００２４】
タスクスティーリングモジュール２１０は、スレッド２１６が同期バリアで待機している場合に、ビクティムスレッド２１６からタスクを原子的にスティールする（ａｔｏｍｉｃａｌｌｙ  ｓｔｅａｌ）、タスクのスティールに応じてビクティムスレッド（ｖｉｃｔｉｍ  ｔｈｒｅａｄ）２１６のフラグ２２０を真に設定するように構成される。いくつかの実施形態では、最適化として、タスクスティーリングモジュール２１０は、アクティブスレッド２１６のフラグ２２０が真でない（例えば、偽）場合にのみ、ビクティムスレッド２１６のフラグ２２０を真に設定してもよい。タスクスティーリングモジュール２１０は、ビクティムスレッド２１６をランダムに識別し、ビクティムスレッド２１６のタスクキュー２１８が空であるかどうかを判定し、空でなければ、ビクティムスレッド２１６のタスクキュー２１８からタスクをポップすることができる。タスクスティーリングモジュール２１０は、ビクティムタスクを完了まで実行することができ、ビクティムタスクを完了した後、アクティブスレッド２１６のタスクキュー２１８に追加されたタスクを実行してもよい。
【００２５】
ここで図３を参照する。図３に示すように、使用中、計算デバイス１００は、並列タスク実行およびワークスティーリング（ｗｏｒｋ  ｓｔｅａｌｉｎｇ）のための方法３００を実行することができる。方法３００は、ブロック３０２で始まり、計算デバイス１００は、スレッドチーム２１４によるタスクのグループの実行を開始する。タスクの実行は、例えば、計算デバイス１００のマスタスレッドまたは他の制御エンティティによって開始することができる。タスクの実行を開始した後、方法３００はブロック３０４まで並行して進む。
【００２６】
ブロック３０４において、計算デバイス１００は、スレッド２１６を使用して並列にタスクを実行し、ワークスティールを実行する。例えば、スレッド２１６の各々は、他のスレッド２１６と並列にタスクキュー２１８からタスクを実行することができる。例示的な方法３００は、３つのスレッド２１６によって並列に実行される３つのブロック３０４を示す。もちろん、他の実施形態は、対応するスレッド２１６により実行されるブロック３０４がより少なくても、より多くてもよい。方法３００に示されるように、タスク３０６は、ブロック３０４の実行中にスレッド２１６の間で転送されてもよい。例えば、スレッド２１６ａは、別のスレッド２１６ｂのタスクキュー２１８からタスクをスティールし（ｓｔｅａｌ）、そのスティールしたタスクを実行してもよい。
【００２７】
ブロック３０４においてタスク３０６を実行した後、方法３００はトランザクション同期バリア３０８に入る。例えば、各スレッド２１６は、タスクキュー２１８内のすべてのタスクの実行を完了した後、同期バリア３０８に入ることができる。スレッド２１６は、スレッドチーム２１４によって実行されるすべてのタスクが実行され完了するまで、トランザクション同期バリア３０８内で待機する。以下でさらに説明するように、同期バリア３０８で待機しているスレッド２１６は、ブロック３０６内でまだ実行中のスレッド２１６からタスク３０６をスティールしてもよい。全てのタスクが完了した後、方法３００は、ブロック３０４にループバックして、並列にタスクを実行し続け、ワークスティーリング（ｗｏｒｋ  ｓｔｅａｌｉｎｇ）を実行する。
【００２８】
ここで図４を参照する。図４に示すように、使用中、計算デバイス１００は、同期バリアを実行する方法４００を実行することができる。方法４００のインスタンスは、例えば図３の方法３００の実行中に、スレッドチーム２１４のスレッド２１６の各々によって実行されてもよい。方法４００はブロック４０２で始まり、計算デバイス１００は、スレッド２１６ａにおいて、スレッド２１６ａのタスクキュー２１８からタスクをポップする。タスクキュー２１８は、スレッド２１６ａによって実行されるタスクを格納するために使用される任意のキュー、ダブルエンド（ｄｏｕｂｌｙ−ｅｎｄｅｄ）キュー、リスト、アレイ、バッファ、または他のデータ構造として実施されてもよい。タスクキュー２１８は、スレッドローカル記憶装置またはスレッド２１６ａに関連する他の記憶装置に格納することができる。いくつかの実施形態では、タスクキュー２１８は、他のスレッド２１６にアクセス可能であってもよい。
【００２９】
ブロック４０４において、計算デバイス１００は、スレッド２１６ａを使用してタスクを実行して完了する。タスクを完了した後、ブロック４０６において、計算デバイス１００は、スレッド２１６ａのタスクキュー２１８が空であるかどうかを判定する。空でなければ、方法４００はブロック４０２にループバックして、タスクキュー２１８からのタスクの実行を継続する。タスクキュー２１８が空である場合、方法４００はブロック４０８に進む。
【００３０】
ブロック４０８において、計算デバイス１００は、スレッド２１６ａを使用して、フラグ２２０をブール「偽」値と交換し、フラグ２２０の前の値をローカルに記憶する。例えば、フラグ２２０の前の値は、スレッド２１６ａのプライベート変数に格納されてもよく、そうでなければスレッド２１６ａのスレッドローカルストレージに格納されてもよい。計算デバイス１００は、１つまたは複数の原子的演算（ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎｓ）を使用してフラグ値を交換し、ローカルに格納することができる。いくつかの実施形態では、計算デバイス１００は、タスクキュー２１８または他の同期メカニズム上のロックによって保護される非原子的演算（ｎｏｎ−ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎｓ）を代わりに使用することができる。
【００３１】
ブロック４１０において、計算デバイス１００は、スレッド２１６ａを使用して、基本同期バリア（ｂａｓｉｃ  ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  ｂａｒｒｉｅｒ）に入る。基本同期バリアは、ツリーバリア、線形バリア、またはディセミネーションバリア（ｄｉｓｓｅｍｉｎａｔｉｏｎ  ｂａｒｒｉｅｒ）などの非ツリーバリアを含む、任意のタイプの同期バリアとして実施することができる。いくつかの実施形態では、基本同期バリアは、同時係属中の米国特許出願第ＸＸ／ＸＸＸ，ＸＸＸ号（発明の名称「Ｔｅｃｈｎｏｌｏｇｉｅｓ  ｆｏｒ  Ｆａｓｔ  Ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  Ｂａｒｒｉｅｒｓ  ｆｏｒ  Ｍａｎｙ−Ｃｏｒｅ  Ｐｒｏｃｅｓｓｉｎｇ」）に記載されているバリアなどのＫ−基数同期バリア（Ｋ−ｒａｄｉｘ  ｓｙｎｃｈｒｏｎｉｚａｔｉｏｎ  ｂａｒｒｉｅｒ）として実施することができる。
【００３２】
ブロック４１２において、計算デバイス１００は、ローカルに格納されたフラグ値に対して論理「ＯＲ」リダクション演算を実行する。言い換えれば、計算デバイス１００は、各スレッド２１６のためにローカルに格納されたフラグ値のすべてに対して論理和演算を実行し、結果として生じるリダクション値を各スレッド２１６に分配する。以下でさらに説明するように、リダクション値は、同期バリアに入る前にスレッド２１６のいずれかがタスクをスティールされたかどうかを示す。言い換えれば、対応するスレッド２１６が同期バリアに入る前に、いずれかのスレッド２１６のフラグ２２０が真であった場合に、リダクション値は真である。
【００３３】
ブロック４１４において、スレッド２１６ａが他のスレッド２１６の同期バリア内で待機している場合、計算デバイス１００は、別のスレッド２１６ｂ（「ビクティム」スレッド２１６ｂ）から１つ以上のタスクをスティールし（ｓｔｅａｌ）、ビクティムスレッドのフラグ２２０を真（ｔｒｕｅ）にセットする。ワークスティーリングプロセスの１つの潜在的な実施形態は、図５に関連して以下でさらに説明される。
【００３４】
ブロック４１６において、スレッド２１６ａ内の計算デバイス１００は、基本同期バリアを出る。スレッド２１６ａは、スレッドチーム２１４の他のすべてのスレッド２１６が同期バリアに入るのに応じて、同期バリアを出ることができる。したがって、同期バリアを出る時に、リダクション値を決定することができる。
【００３５】
ブロック４１８において、スレッド２１６ａの計算デバイス１００は、ブロック４１２に関連して上述したｒｅｄｕｃｅ−ａｌｌ論理ＯＲ演算の結果であるリダクション値を決定する。上述したように、真であれば、１つまたは複数のタスクは、スレッド２１６が同期化バリアに入る前に、そのスレッド２１６からスティールされたものであり、それらのタスクはまだ実行中（ｉｎ  ｆｌｉｇｈｔ）である可能性がある。ブロック４２０において、計算デバイス１００は、リダクション値が真であるか偽（ｆａｌｓｅ）であるかを判定する。真の場合、方法４００はブロック４０８にループバックして、フラグ２２０の交換を再試行し、バリアに入ることを再試行する。リダクション値が偽である場合、方法４００は完了する。言い換えれば、計算デバイス１００は、タスクがスレッド２１６からスティールされていない状態で同期バリアが完了したかどうかを判定し、そうでなければ同期バリアを再試行する。したがって、方法４００の実行中に、計算デバイス１００によって実行される同期バリア動作は、トランザクション同期バリアまたはトランザクションバリアとして知られてもよい。
【００３６】
ここで図５を参照する。図５に示すように、使用中、計算デバイス１００は、ワークスティーリングの方法５００を実行することができる。方法５００は、図４のブロック４１４に関連して上述したように、スレッド２１６ａが同期バリア内で待機している間に、スレッド２１６ａを用いて計算デバイス１００によって実行されてもよい。方法５００はブロック５０２で開始し、スレッド２１６ａにおいて、計算デバイス１００は、基本同期バリアを出るかどうかを決定する。図４のブロック４１６に関連して上述したように、スレッド２１６ａは、スレッドチーム２１４の他のすべてのスレッド２１６が同期バリアに入ること応じて、同期バリアを出てもよい。計算デバイス１００が同期バリアを出ると決定した場合、方法５００は完了する。計算デバイス１００が同期化バリアを出ないと決定した場合（すなわち、スレッド２１６ａが同期バリアで待機している場合）、方法５００はブロック５０４に進む。
【００３７】
ブロック５０４において、計算デバイス１００は、スレッド２１６ａにおいて、ランダムビクティムスレッド２１６ｂを決定する。例えば、計算デバイス１００は、ランダムにスレッド識別子を選択してもよく、そうでなければ、スレッドチーム２１４のスレッド２１６から被害スレッド２１６ｂをランダムに選択してもよい。ブロック５０６において、スレッド２１６ａを用いる計算デバイス１００は、ビクティムスレッド２１６ｂのタスクキュー２１８が空か決定する。空である場合、方法５００はブロック５０４にループバックして別のビクティムスレッド２１６ｂを選択する。ビクティムスレッド２１６ｂのタスクキュー２１８が空でない場合、方法５００はブロック５０８に進む。
【００３８】
ブロック５０８において、計算デバイス１００は、スレッド２１６ａにおいて原子的に動作を実行する。特に、計算デバイス１００は、ブロック５１０−５１２に関連して以下に説明する動作を原子的に実行する。計算デバイス１００は、例えば、１つ以上の原子的命令または他の原子的動作（ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎｓ）を実行することができる。いくつかの実施形態では、計算デバイス１００は、ビクティムスレッド２１６ｂのタスクキュー２１８または他の同期メカニズム上のロックによって保護される非原子的演算（ｎｏｎ−ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎｓ）を代わりに使用することができる。
【００３９】
ブロック５１０において、スレッド２１６ａ内の計算デバイス１００は、ビクティムスレッド２１６ｂのタスクキュー２１８からタスクをポップ（ｐｏｐ）する。いくつかの実施形態では、タスクをポップした後、方法５００はブロック５１２に進んでもよい。ブロック５１２を含まない実施形態では、方法５００は、以下で説明するブロック５１４に直接進むことができる。ブロック５１２において、スレッド２１６ａ内の計算デバイス１００は、スレッド２１６ａのフラグ２２０が真であるかどうかを判定する。真の場合、方法５００は、ブロック５０８の原子的操作（ａｔｏｍｉｃ  ｏｐｅｒａｔｉｏｎ）を終了し、以下で説明するブロック５１６に進む。フラグ２２０が偽である場合、方法５００はブロック５１４に進み、スレッド２１６ａ内の計算デバイス１００は、ビクティムスレッド２１６ｂのフラグ２２０を真に設定する。ブロック５１２においてフラグ２２０が真であるかどうかをチェックすることにより、ブロック５１４が必要でないときにブロック５１４をスキップすることによって性能が向上する。フラグ２２０が既に真である場合、スレッド２１６ａは、別のスレッド２１６ｂのフラグ２２０にアクセスすることなく、論理ＯＲリダクション（ｌｏｇｉｃａｌ−ＯＲ  ｒｅｄｕｃｔｉｏｎ）が真を返すと判定することができる。
【００４０】
ブロック５１６において、スレッド２１６ａの計算デバイス１００は、ビクティムタスクを実行して完了する。すなわち、計算デバイス１００は、犠牲スレッド２１６ｂのタスクキュー２１８からポップされたタスクを実行して完了する。ブロック５１８において、スレッド２１６ａ内の計算デバイス１００は、スレッド２１６ａのタスクキュー２１８が空であるかどうかを判定する。図４のブロック４０６に関連して上述したように、各スレッド２１６は、同期バリアに入る前に、そのタスクキュー２１８が空であると判定する。しかしながら、ブロック５１６と関連してビクティムタスクの実行中に、１つまたは複数の新しいタスクが生成され、スレッド２１６ａのタスクキュー２１８に追加されてもよい。したがって、スレッド２１６ａは、それ自身のタスクキュー２１８をチェックして、タスクが追加されたかどうかを判定する。タスクキュー２１８が空である場合、方法５００は、ブロック５０４にループバックして、ワークスティーリングを実行し続ける。タスクキュー２１８が空でない場合、方法５００はブロック５２０に進む。
【００４１】
ブロック５２０において、スレッド２１６ａ内の計算デバイス１００は、そのタスクキュー２１８からタスクをポップする。ブロック５２２において、スレッド２１６ａの計算デバイス１００は、ビクティムタスクを実行して完了する。タスクを完了した後、方法５００はブロック５１８にループバックして、スレッド２１６ａのタスクキュー２１８内の任意のタスクの実行を継続する。
【００４２】
例示
【００４３】
本明細書に開示の技術の例を以下に記載する。本技術の実施形態は、以下に記載の一以上の例、及びそれらの組み合わせを含み得る。
【００４４】
例１が含む計算デバイスは、
マルチスレッド実行のための計算デバイスであって、
トランザクションバリアモジュールであって、
前記計算デバイスによって実行されるスレッドチームの第１のスレッドが、前記第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第１のスレッドの一時フラグに格納し、前記一時フラグは第１のスレッドに対してローカルであり、
第１のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るトランザクションバリアモジュールと、
第１のスレッドが、スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、決定するリダクションモジュールであって、スレッドチームは第１のスレッドを含む複数のスレッドを含む、リダクションモジュールとを有し、
前記トランザクションバリアモジュールはさらに、
第１のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返す。
【００４５】
例２は例１の主題を含み、
スレッドチームの複数の一時フラグのどれかが真であるかの決定は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値の提供とを含む。
【００４６】
例３は例１及び２のいずれかの主題を含み、
第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納することは、第１のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納することを含む。
【００４７】
例４は例１−３のいずれかの主題を含み、
タスク実行モジュールをさらに含み、該タスク実行モジュールは、
前記第１のスレッドによって、前記第１のスレッドのタスクキューから第１のタスクを実行し、
前記タスクキューが空であるかどうかを前記第１のスレッドによって判定するタスク実行モジュールをさらに有し、
タスクストールンフラグの値を交換することは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換することを含む。
【００４８】
例５は例１−４のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【００４９】
実施例６は実施例１−５のいずれかの主題を含み、トランザクションバリアモジュールは、さらに、同期バリアに入るのに応じて、第１のスレッドによる、スレッドチームの他のスレッドが同期バリアに入るのを待つ。
【００５０】
例７は例１−６のいずれかの主題を含み、
タスク実行モジュールをさらに含み、該タスクスティーリングモジュールは、
第１のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第２のスレッドからタスクをスティールし、
第１のスレッドが、タスクのスティーリングに応じて、第２のスレッドのタスクストールンフラグを真に設定する。
【００５１】
例８は例１−７のいずれかの主題を含み、タスクをスティールし、第２のスレッドのタスクストールンフラグを設定することは、原子的にタスクをスティールし、第２のスレッドのタスクストールンフラグを設定することを含む。
【００５２】
例９は例１−８のいずれかの主題を含み、
タスクをスティールすることは、
スレッドチームの第２のスレッドを識別することと、
第２のスレッドのタスクキューからタスクをポップすることとを含み、
タスクをポップし、第２のスレッドのタスクストールンフラグを設定することは、原子的にタスクをポップし、第２のスレッドのタスクストールンフラグを設定することを含む。
【００５３】
例１０は例１−９のいずれかの主題を含み、第２のスレッドを識別することは、スレッドチームからランダムに第２のスレッドを選択することを含む。
【００５４】
例１１は例１−１０のいずれかの主題を含み、
第２のスレッドを識別することはさらに、
第２のスレッドのタスクキューが空か決定することと、
タスクキューが空であるとの決定に応じて第２のスレッドを第２のスレッドの選択をランダムに繰り返すこととを含む。
【００５５】
実施例１２は実施例１−１１のいずれかの主題を含み、
タスクをスティールすることはさらに、
第１のスレッドが、タスクのポップに応じて、タスクを実行して完了することと、
第１のスレッドが、タスクを実行して完了することに応じて、第１のスレッドのタスクキューが空であるか決定することと、
第１のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第２のタスクをポップすることと、
第１のスレッドが、第２のタスクのポップに応じて、第２のタスクを実行して完了することとを含む。
【００５６】
実施例１３は実施例１−１２のいずれかの主題を含み、
前記タスクスティーリングモジュールはさらに、
第１のスレッドが、第２のスレッドからのタスクのスティーリングに応じて、第１のスレッドの一時フラグが偽であるか決定し、
第２のスレッドのタスクストールンフラグを真に設定することはさらに、一時フラグが偽であるとの決定に応じて、第２のスレッドのタスクストールンフラグを真に設定することを含む。
【００５７】
例１４が含む計算デバイスは、
マルチスレッド実行の方法であって、該方法は、
前記計算デバイスによって実行されるスレッドチームの第１のスレッドが、前記第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第１のスレッドの一時フラグに格納するステップであって、前記一時フラグは第１のスレッドに対してローカルであるステップと、
第１のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入るステップと、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第１のスレッドにより決定するステップであって、スレッドチームは第１のスレッドを含む複数のスレッドを含む、ステップと、
第１のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返すステップとを含む。
【００５８】
例１５は例１４の主題を含み、スレッドチームの複数の一時フラグのどれかが真であるか決定するステップは、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供するステップを含む。
【００５９】
例１６は例１４及び１５のいずれかの主題を含み、第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納するステップは、第１のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納するステップを含む。
【００６０】
例１７は例１４−１６のいずれかの主題を含み、
前記第１のスレッドが、前記第１のスレッドのタスクキューから第１のタスクを実行するステップと、
前記第１のスレッドが、前記タスクキューが空であるかどうかを判定するステップとをさらに含み、
タスクストールンフラグの値を交換するステップは、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換するステップを含む。
【００６１】
例１８は例１４−１７のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【００６２】
例１９は例１４−１８のいずれかの主題を含み、第１のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つステップをさらに含む。
【００６３】
例２０は例１４−１９のいずれかの主題を含み、
第１のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第２のスレッドからタスクをスティールするステップと、
第１のスレッドが、タスクのスティーリングに応じて、第２のスレッドのタスクストールンフラグを真に設定するステップとをさらに含む。
【００６４】
実施例２１は実施例１４−２０のいずれかの主題を含み、タスクをスティールし、第２のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをスティールし、第２のスレッドのタスクストールンフラグを設定するステップを含む。
【００６５】
例２２は例１４−２１のいずれかの主題を含み、
タスクをスティールするステップは、
スレッドチームの第２のスレッドを識別するステップと、
第２のスレッドのタスクキューからタスクをポップするステップとを含み、
タスクをポップし、第２のスレッドのタスクストールンフラグを設定するステップは、原子的にタスクをポップし、第２のスレッドのタスクストールンフラグを設定するステップを含む。
【００６６】
実施例２３は実施例１４−２２のいずれかの主題を含み、第２のスレッドを識別するステップは、スレッドチームからランダムに第２のスレッドを選択するステップを含む。
【００６７】
実施例２４は実施例１４−２３のいずれかの主題を含み、
第２のスレッドを識別するステップはさらに、
第２のスレッドのタスクキューが空か決定するステップと、
タスクキューが空であるとの決定に応じて第２のスレッドの選択をランダムに繰り返すステップとを含む。
【００６８】
実施例２５は実施例１４−２４のいずれかの主題を含み、
タスクをスティールするステップはさらに、
第１のスレッドが、タスクのポップに応じて、タスクを実行して完了するステップと、
第１のスレッドが、タスクを実行して完了することに応じて、第１のスレッドのタスクキューが空であるか決定するステップと、
第１のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第２のタスクをポップするステップと、
第１のスレッドが、第２のタスクのポップに応じて、第２のタスクを実行して完了するステップとを含む。
【００６９】
例２６は例１４−２５のいずれかの主題を含み、
第１のスレッドが、第２のスレッドからのタスクのスティーリングに応じて、第１のスレッドの一時フラグが偽であるか決定するステップをさらに含み、
第２のスレッドのタスクストールンフラグを真に設定するステップはさらに、一時フラグが偽であるとの決定に応じて、第２のスレッドのタスクストールンフラグを真に設定するステップを含む。
【００７０】
例２７が含む計算デバイスは、
計算デバイスであって、
プロセッサと、
前記プロセッサにより実行されたとき、前記プロセッサに、実施例１４−２６いずれかに記載の方法を実行させる複数の命令を格納したメモリとを有する。
【００７１】
実施例２８は、実行されると、計算デバイスに実施例１４乃至２６いずれかに記載の方法を実行させる複数の命令を記憶した一以上の機械読み取り可能記憶媒体を含む。
【００７２】
実施例２９は、実施例１４−２６のいずれかに記載の方法を実行する手段を有する計算デバイスを含む。
【００７３】
例３０が含む計算デバイスは、
マルチスレッド実行のための計算デバイスであって、
前記計算デバイスによって実行されるスレッドチームの第１のスレッドが、前記第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を第１のスレッドの一時フラグに格納する手段であって、前記一時フラグは第１のスレッドに対してローカルである手段と、
第１のスレッドが、タスクストールンフラグの値を交換した後に、同期バリアに入る手段と、
スレッドチームの複数の一時フラグのどれかが、同期バリアに入る時に真であるか、第１のスレッドにより決定する手段であって、スレッドチームは第１のスレッドを含む複数のスレッドを含む、手段と、
第１のスレッドが、複数の一時フラグのどれかが真であるとの決定に応じて、タスクストールンフラグの値の交換を繰り返す手段とを含む。
【００７４】
例３１は例３０の主題を含み、
スレッドチームの複数の一時フラグのどれかが真であるか決定する手段は、同期バリアに入るのに応じて、スレッドチームの複数の一時フラグに対する論理和リダクションの実行と、スレッドチームの各スレッドに対するリダクション値を提供する手段を含む。
【００７５】
例３２は例３０及び３１のいずれかの主題を含み、
第１のスレッドのタスクストールンフラグの値を偽と交換し、タスクストールンフラグの値を一時フラグに格納する手段は、第１のスレッドのタスクストールンフラグの値を偽に原子的に交換し、タスクストールンフラグの値を一時フラグに格納する手段を含む。
【００７６】
実施例３３は実施例３０−３２のいずれかの主題を含み、
前記第１のスレッドが、前記第１のスレッドのタスクキューから第１のタスクを実行する手段と、
前記第１のスレッドが、前記タスクキューが空であるかどうかを判定する手段とをさらに含み、
タスクストールンフラグの値を交換する手段は、タスクキューが空であるという決定に応じて、タスクストールンフラグの値を交換する手段を含む。
【００７７】
例３４は例３０−３３のいずれかの主題を含み、複数の一時フラグの各々はスレッドチームのスレッドに対応する。
【００７８】
例３５は例３０−３４のいずれかの主題を含み、第１のスレッドが、同期バリアに入るのに応じて、スレッドチームの他のスレッドが同期バリアに入るのを待つ手段をさらに含む。
【００７９】
実施例３６は実施例３０−３５のいずれかの主題を含み、
第１のスレッドが、スレッドチームの他のスレッドが同期バリアに入るのを待つことに応じて、スレッドチームの第２のスレッドからタスクをスティールする手段と、
第１のスレッドが、タスクのスティーリングに応じて、第２のスレッドのタスクストールンフラグを真に設定する手段とをさらに含む。
【００８０】
実施例３７は実施例３０−３６のいずれかの主題を含み、タスクをスティールする手段と、第２のスレッドのタスクストールンフラグを設定する手段は、原子的にタスクをスティールし、第２のスレッドのタスクストールンフラグを設定する手段を含む。
【００８１】
実施例３８は実施例３０−３７のいずれかの主題を含み、
タスクをスティールする手段は、
スレッドチームの第２のスレッドを識別する手段と、
第２のスレッドのタスクキューからタスクをポップする手段とを含み、
タスクをポップする手段と、第２のスレッドのタスクストールンフラグを設定する手段は、原子的にタスクをポップし、第２のスレッドのタスクストールンフラグを設定する手段を含む。
【００８２】
実施例３９は実施例３０−３８のいずれかの主題を含み、第２のスレッドを識別する手段は、スレッドチームからランダムに第２のスレッドを選択する手段を含む。
【００８３】
実施例４０は実施例３０−３９のいずれかの主題を含み、
第２のスレッドを識別する手段はさらに、
第２のスレッドのタスクキューが空か決定する手段と、
タスクキューが空であるとの決定に応じて第２のスレッドの選択をランダムに繰り返す手段とを含む。
【００８４】
実施例４１は実施例３０−４０のいずれかの主題を含み、
タスクをスティールする手段はさらに、
第１のスレッドが、タスクのポップに応じて、タスクを実行して完了する手段と、
第１のスレッドが、タスクを実行して完了することに応じて、第１のスレッドのタスクキューが空であるか決定する手段と、
第１のスレッドが、タスクキューが空でないとの決定に応じて、タスクキューから第２のタスクをポップする手段と、
第１のスレッドが、第２のタスクのポップに応じて、第２のタスクを実行して完了する手段とを含む。
【００８５】
実施例４２は実施例３０−４１のいずれかの主題を含み、
第１のスレッドが、第２のスレッドからのタスクのスティーリングに応じて、第１のスレッドの一時フラグが偽であるか決定する手段をさらに含み、
第２のスレッドのタスクストールンフラグを真に設定する手段はさらに、一時フラグが偽であるとの決定に応じて、第２のスレッドのタスクストールンフラグを真に設定する手段を含む。
【図１】
2017537393.tif 000003
【図２】
2017537393.tif 000004
【図３】
2017537393.tif 000005
【図４】
2017537393.tif 000006
【図５】
2017537393.tif 000007
【国際調査報告】
2017537393.tif 000008
2017537393.tif 000009