(57)【要約】  処理ユニットのシーケンサが、ランタイムにおいて、グループスレッドのためのバリア動作のバリア幅を決定し、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さく、ここにおいて、スレッドのグループ中のスレッドは１つまたは複数の計算ユニット上でデータ並列コードを実行する。スレッドのグループのサブグループ中の各スレッドがバリア動作を実行したことに応答して、サブグループはバリア幅と同じ数のスレッドを含み、シーケンサは、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループが、バリア動作の後に１つまたは複数のプロセッサ上で実行することを可能にし得、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。【選択図】図１
2016525746.tif 000002
【特許請求の範囲】
【請求項１】
スレッドを同期させるための方法であって、前記方法は、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、方法。
【請求項２】
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項１に記載の方法。
【請求項３】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
請求項１に記載の方法。
【請求項４】
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
請求項１に記載の方法。
【請求項５】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項１に記載の方法。
【請求項６】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項１に記載の方法。
【請求項７】
前記バリア動作は、ループ中に含まれる、
請求項１に記載の方法。
【請求項８】
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
請求項７に記載の方法。
【請求項９】
スレッドを同期させるためのコンピューティングシステムであって、
ホストと、
前記ホストに動作可能に結合された処理ユニットと、
シーケンサモジュールと
を備え、前記シーケンサモジュールは、
前記処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を行うように構成される、コンピューティングシステム。
【請求項１０】
前記バリア幅を決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項９に記載のコンピューティングシステム。
【請求項１１】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
請求項９に記載のコンピューティングシステム。
【請求項１２】
前記シーケンサモジュールは、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することを行うようにさらに構成される、
請求項９に記載のコンピューティングシステム。
【請求項１３】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項９に記載のコンピューティングシステム。
【請求項１４】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項９に記載のコンピューティングシステム。
【請求項１５】
前記バリア動作は、ループ中に含まれる、
請求項９に記載のコンピューティングシステム。
【請求項１６】
前記シーケンサモジュールは、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することを行うようにさらに構成され、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
請求項１５に記載のコンピューティングシステム。
【請求項１７】
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にするための手段、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、並列処理装置。
【請求項１８】
前記決定するための手段は、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定するための手段をさらに備える、
請求項１７に記載の並列処理装置。
【請求項１９】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
請求項１７に記載の並列処理装置。
【請求項２０】
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定するための手段をさらに備える、
請求項１７に記載の並列処理装置。
【請求項２１】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項１７に記載の並列処理装置。
【請求項２２】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項１７に記載の並列処理装置。
【請求項２３】
前記バリア動作は、ループ中に含まれる、
請求項１７に記載の並列処理装置。
【請求項２４】
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定するための手段をさらに備え、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
請求項２３に記載の並列処理装置。
【請求項２５】
少なくとも１つのプロセッサによって実行されると、前記少なくとも１つのプロセッサに、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記スレッドのグループ中のスレッドは、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを実行する、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える動作を行わせる命令を含む、コンピュータ可読記憶媒体。
【請求項２６】
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項２７】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項２８】
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントよりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項２９】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項３０】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項３１】
前記バリア動作は、ループ中に含まれる、
請求項２５に記載のコンピュータ可読記憶媒体。
【請求項３２】
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅が前記ループの少なくとも２つの反復中で異なる、
請求項３１に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、計算命令の実行に関し、より詳細には、並列に実行する計算命令の同期に関する。
【背景技術】
【０００２】
[0002]旧来、コンピュータプログラムは、コンピュータプログラムのコードが単一の従来のプロセッサ上で連続的に実行する、連続プログラムとして書き込まれていた。しかしながら、複数の処理コアを含む、グラフィックス処理ユニット（ＧＰＵ：graphics processing unit）などの特殊なプロセッサの性能が急速に増大し続けるので、コンピュータプログラムは、そのような特殊なプロセッサを利用するためにますます書き込まれている。たとえば、コンピュータプログラムは、同じコードがデータのセット上で並列に動作するためにプロセッサの複数の処理コアにわたって実行し得るように、データ並列コードを含めるために書き込まれている。そのようなデータ並列コードは、連続的にではなく並列に実行されるので、コードがデータのセットを処理し終える順序に関する保証がないことがある。したがって、データの値がさらなる動作において使用される前に複数の処理コアがデータのセット上で動作し終えたことを保証するために、並列実行を同期させることが望ましいことがある。
【発明の概要】
【０００３】
[0003]概して、本開示では、動的バリア幅計算（dynamic barrier width calculation）を使用して並列に処理される計算命令を同期させるための技法について説明する。スレッドのブロックがデータのセット上で同じ命令のセットを各々実行し得、読み出し動作が不正確または無効なデータを読み出すのを防ぐために、スレッドがデータのセット上でそれぞれの書込み動作を実行した後、およびスレッドがデータのセット上でそれぞれの読み出し動作を実行する前に、スレッドのブロックを同期させるためにバリア動作が使用され得る。デフォルトでは、ブロック中のどのスレッドもそれぞれのバリア動作を実行していない限り、スレッドがバリア動作に続く読み出し動作を実行することができないように、バリア動作はスレッドのブロック中のスレッドのすべてを同期させ得る。対照的に、本明細書で開示する技法は、ブロック中の他のスレッドがそれらのバリア動作をなお実行しなければならない場合でも、ブロックのスレッドのサブセットがそれぞれのバリア動作を実行した後に続いて読み出し動作を実行することができるようにバリア動作の幅を動的に計算するための技法を含み得る。
【０００４】
[0004]一例では、スレッドを同期させるための方法は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することを含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さく、ここにおいて、スレッドのグループ中のスレッドは、処理ユニットの１つまたは複数の計算ユニット上でデータ並列コードを実行する。本方法は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることをさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
【０００５】
[0005]別の例では、コンピューティングシステムは、スレッドを同期させるためのコンピューティングシステムを含む。コンピューティングシステムはホストを含む。コンピューティングシステムは、ホストに動作可能に結合された処理ユニットをさらに含む。コンピューティングシステムは、処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、処理ユニットの１つまたは複数の計算ユニット上でデータ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することと、ここにおいて、バリア幅がスレッドのグループ中のスレッドの総数よりも小さい、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることと、ここにおいて、スレッドのグループのサブグループが、スレッドのグループ中のスレッドの総数よりも小さい、を行うように構成されたシーケンサモジュールをさらに含む。
【０００６】
[0006]別の例では、並列処理装置は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、処理ユニットの１つまたは複数の計算ユニット上でデータ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段を含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さい。並列処理装置は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作の後に１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にするための手段をさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
【０００７】
[0007]別の例では、コンピュータ可読記憶媒体は、少なくとも１つのプロセッサによって実行されたとき、少なくとも１つのプロセッサに動作を行わせる命令を含んでいることがある。動作は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することを含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さく、ここにおいて、スレッドのグループ中のスレッドは、処理ユニットの１つまたは複数の計算ユニット上でデータ並列コードを実行する。動作は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることをさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
【０００８】
[0008]１つまたは複数の例の詳細が以下の添付の図面および説明において記載されている。他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
【図面の簡単な説明】
【０００９】
【図１】本開示のいくつかの態様による、スレッドの同期を示す概念図。
【図２】本開示のいくつかの態様による、並列処理コンピューティングシステムを示すブロック図。
【図３】本開示のいくつかの態様による、動的バリア幅を使用するスレッドの同期を示す概念図。
【図４】本開示のいくつかの態様による、例示的な並列低減を示す概念図。
【図５】本開示のいくつかの態様による、動的バリアを使用してスレッドを同期させることの例示的なプロセスを示すフローチャート。
【図６】本開示の１つまたは複数の態様を実装するように構成され得るデバイスの一例を示すブロック図。
【発明を実施するための形態】
【００１０】
[0015]概して、本開示では、動的バリア幅計算を使用して並列に処理される計算命令を同期させるための技法について説明する。データ並列処理において、コンピュータプログラムはデータ並列コードを含み得る。データ並列コードは、複数の異なるデータポイント上で同じ動作を並列に行うために計算命令の同じセットが実行され得るように、複数の実行スレッドを介して複数の処理要素上でコンカレントに動作し得る計算命令のセットである。複数のデータポイントのうちの１つの上で動作すべき同じデータ並列コードの各個々の呼出しがスレッドであり、スレッドは、複数のデータポイント上で同じ命令を行うためにコンカレントに実行し得る。一般に、データ並列コードは、データのセットに書き込むための書込み動作と、書込み動作の後に、書込み動作によって書き込まれたデータのセットを読み出す読み出し動作とを含み得る。しかしながら、実行するあらゆるスレッドが、書込み動作の実行を同時に完了するとは限らない。各スレッドがデータのセットに書き込むための書込み動作を完了する前にデータのセットを読み出すための読み出し動作が実行された場合、読み出し動作は不正確または無効な結果を読み出し得る。読み出し動作が不正確または無効な結果を読み出さないことを保証するために、各スレッドは、データのセットに対してデータ並列書込み動作を実行した後、続いてデータのセット上で読み出し動作を実行する前に、バリア動作を実行するように要求され得、データ並列コードを実行するためのスレッドのいずれも、スレッドのすべてが同じくバリア動作を実行するまで、バリア動作を実行した後に続いて読み出し動作を実行することを可能にされ得ない。
【００１１】
[0016]図１は、本開示のいくつかの態様による、スレッドの同期を示す概念図である。図１に示されているように、スレッド１０２、１０４、１０６、および１０８は、データのセットに対する書込み動作を各々行い、その後データのセット上で読み出し動作を各々行うために、データ並列コードを並列に実行し得る。時間ｔ１において、スレッド１０６は、それの書込み動作を終了しており、バリア動作１１０に達する。バリア動作１１０は、スレッド１０６がそれの書込み動作の実行を完了したことを示す。しかしながら、あらゆるスレッドがバリア動作に達したとは限らない（すなわち、スレッド１０２、１０４、および１０８は、それぞれの書込み動作の実行を完了していない）ので、スレッド１０６は、続いてデータのセットを読み出すために読み出し動作を実行する前に、他のスレッド１０２、１０４、および１０８が同じくバリア動作に達するまで待たなければならない。時間ｔ２において、スレッド１０２がそれの書込み動作を実行し終えたので、スレッド１０２はバリア動作１１２に達する。スレッド１０６と同様に、スレッド１０４および１０８が同じく、まだバリア動作に達していないので、スレッド１０２は同じく、続いてデータのセットを読み出すために読み出し動作を実行する前に、スレッド１０４および１０８が同じくバリア動作に達するまで待たなければならない。時間ｔ３において、スレッド１０４はバリア動作１１４に達する。スレッド１０２および１０６と同様に、スレッド１０８が同じくバリア動作に達していないので、スレッド１０４は同じく、続いてデータのセットを読み出すために読み出し動作を実行する前に、スレッド１０８が同じくバリア動作に達するまで待たなければならない。時間ｔ４において、スレッド１０８はバリア動作１１６に達する。スレッドのグループ中のあらゆるスレッド１０２、１０４、１０６、および１０８がバリア動作に達したので、今度は、スレッド１０２、１０４、１０６、および１０８の各々は、データのセットを読み出すために読み出し動作を実行することを各々可能にされ得る。
【００１２】
[0017]しかしながら、スレッドのグループ中のスレッドが進むことを可能にする前に、スレッドのグループ中のあらゆるスレッドがバリア動作に達するのを待つようにグループ中のスレッドに要求するバリア動作は、非効率的であり得る。たとえば、書込みの実行の後に行われるべき読み出し動作は、スレッドのうちのいくつかのみ（ただし、すべてでない）が書込み動作のそれのそれぞれの実行を終了したことに依存し得る。したがって、追加の動作によって依存されるスレッドのすべてがバリア動作に達した場合でも、それらのスレッドは、グループ中のあらゆるスレッドがそれのそれぞれの書込み動作を実行し終え、バリア動作に達するまでそれのそれぞれの読み出し動作を実行することができない。
【００１３】
[0018]バリア動作のそのような使用を示す、Ｃ言語で書き込まれる例示的なコードフラグメントを以下に示す。  
local int * ptr;       // 共有メモリリソース  
// サイズ３２のグループ間  
// でリソースを共有する  
if (thread_id % 32) {  
ptr[thread_id%32] = value; // メモリに書き込む //  
}  
barrier();       // 全てのスレッドが  
// メモリ書き込みを行ったことを確認する //  
x = ptr[thread_id%32];      // メモリを読み出す
【００１４】
[0019]上記のコードフラグメントに示されているように、バリア動作は、後続のｘ＝ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］読み出し動作が行われる前に、ｉｆ（ｔｈｒｅａｄ＿ｉｄ％３２）｛ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］＝ｖａｌｕｅ；｝書込み動作を各々行うスレッドのグループのための同期ポイントであり、それにより、グループ中の各スレッドがｉｆ（ｔｈｒｅａｄ＿ｉｄ％３２）｛ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］＝ｖａｌｕｅ；｝動作を行い終え、同期ポイントに達した後のみ、ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］が読み出され、ｘ変数にはｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］の値が割り当てられることを保証する。しかしながら、ｔｈｒｅａｄ＿ｉｄ％３２が０〜３１のみの値を生成することになるので、グループが３２個よりも多いスレッドを含む場合に、ｘ＝ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］動作を行う前に各スレッドがバリア動作を行うまでスレッドのグループ中のあらゆるスレッドが待つことは、不要であり得る。そうではなく、３２個のスレッドのグループが、ｘ＝ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］動作が正しく動作することになることを保証するのを待つことのみが必要であり得る。したがって、スレッドのグループが３２個よりも多いスレッドを含む場合、バリア動作は、ｘ＝ｐｔｒ［ｔｈｒｅａｄ＿ｉｄ％３２］動作の完全性を保証するのに必要であるよりも多くのスレッドを待つことを必要とすることにおいて過剰包含的（over inclusive）であり得る。
【００１５】
[0020]バリア動作の非効率性を低減するための１つの手法は、バリア動作の幅を指定することを含み得る。バリア動作の幅は、スレッドがバリア動作の後に進むことを可能にする前にバリア動作に達するように要求されるスレッドの数であり得、幅は、一般に、スレッドのグループ中のスレッドの総数よりも少ないことが指定され得る。たとえば、バリア動作はパラメータとして幅を取り得る。別の例では、幅は定数として指定され得る。コンパイル時に、バリア動作のための幅は、バリア動作を呼ぶコンピュータプログラムにハードコーディングされ得る。上記の例示的なコードフラグメントの場合、３２の幅が、バリア動作のためのコンパイル時に指定され得る。
【００１６】
[0021]しかしながら、コンパイル時にバリア動作の幅をハードコーディングすることは、コンパイル時にバリア動作の所望の幅が知られていない状況の場合に有用でないことがあるので、バリア動作の有用性とフレキシビリティとを制限し得る。さらに、データ並列コードを書き込むプログラマーは、指定すべき適切な幅を知らないことがある。したがって、ランタイムにおいてバリア動作の幅を動的に計算することが望ましいことがある。
【００１７】
[0022]図２は、本開示のいくつかの態様による、データ並列コードを実行するための並列処理コンピューティングシステムを示すブロック図である。図２に示されているように、ホスト２２０は処理ユニット２０２に通信可能に結合され得る。処理ユニット２０２は計算ユニット２０４Ａ〜２０４Ｎ（「計算ユニット２０４」）を含み得、計算ユニット２０４の各々は処理要素２０６Ａ〜２０６Ｎ（「処理要素２０６」）を含み得る。
【００１８】
[0023]ホスト２２０は、いくつかの例では、並列処理コンピューティングシステム内の実行のためのコンピュータプログラムの命令を処理するように構成された、中央処理ユニット（ＣＰＵ）などのマイクロプロセッサであり得る。いくつかの例では、ホスト２２０は、コンピュータプログラムの実行中にデータ並列コードに遭遇すると、実行のための処理ユニット２０２にデータ並列コードを通信し得る。
【００１９】
[0024]処理ユニット２０２は、コンピュータプログラムの命令のうちの少なくともいくつかを処理するように構成されたグラフィックス処理ユニット（ＧＰＵ）または他の好適な処理ユニットであり得る。処理ユニット２０２は、ホスト２２０に動作可能に結合され得、ホスト２２０からコンピュータプログラムのデータ並列コードを受信し得る。処理ユニット２０２は、計算ユニット２０４など、１つまたは複数のプログラマブルプロセッサを含み得る。計算ユニット２０４は、処理要素２０６を各々含み得る。計算ユニット２０４は、ローカルメモリ（すなわち、キャッシュ）を各々含み得る。処理要素２０６は、それぞれの計算ユニット２０４の処理コアであり得る。たとえば、処理要素２０６は、算術および論理演算を行うように構成された１つまたは複数の算術論理ユニット（ＡＬＵ）または他の回路を各々含み得る。
【００２０】
[0025]複数のデータポイントのうちの１つの上で動作すべき同じデータ並列コードの各個々の呼出しがスレッドであり、スレッドは、複数のデータポイント上で同じ命令を行うためにコンカレントに実行し得る。いくつかの例では、スレッドは作業項目としても知られ得る。処理ユニット２０２はスレッドを一緒にブロックにグループ化し得る。一般に、処理ユニット２０２は、同じデータ並列コードによって生まれるスレッドのすべてを１つまたは複数のブロックにグループ化し得る。いくつかの例では、ブロックはワークグループとしても知られ得る。いくつかの例では、単一のブロック中のスレッドのすべては、計算ユニット２０４のうちの１つの上で行われることに限定され得る。いくつかの例では、スレッドのブロックは、バリア動作の幅が指定されないか、またはグループ中のスレッドの数よりも小さいことを決定されなかった場合にバリア動作がグループ中の各スレッドに適用され得るスレッドのグループであり得る。したがって、スレッドのグループ中のスレッドがそのようなバリアに達した場合、そのスレッドは、スレッドがバリアの後に進むことを可能にされる前に、グループ中の各スレッドが同じくバリアに達するのを待たなければならないことがある。
【００２１】
[0026]処理ユニット２０２はブロック内のスレッドを１つまたは複数のワープ（warp）またはウェーブフロント（wavefront）にグループ化することができる。ウェーブフロントは計算ユニット２０４のためのスケジューリングの基本ユニットであり、一般にブロック中のスレッドのサブセットを含み得る。たとえば、５１２個のスレッドのブロックを仮定すれば、ウェーブフロントは３２個のスレッドを含み得、ブロック中のスレッドは５１２／３２＝１６個のワープにグループ化され得る。ウェーブフロントは、一般に、単一の計算ユニット（すなわち、計算ユニット２０４Ａ）の処理要素２０６がウェーブフロント中のあらゆるスレッドを同時に処理することができるように、単一の計算ユニット中にある処理要素２０６と同数のスレッドを含み得る。
【００２２】
[0027]スレッドのウェーブフロントがデータの複数の要素に対して同じ命令を実行するので、ホスト２２０は、ウェーブフロントによって処理されるべきデータをデータのベクトルにベクトル化し得、そのベクトルを処理ユニット２０２に通信し得る。一般に、データは、単一のウェーブフロント中にあるスレッドと同数の要素を有するベクトルにグループ化される。言い換えれば、ウェーブフロント中のスレッドの数は、それがその上で動作するデータのベクトルの幅と同じである。したがって、ウェーブフロント中のスレッドの数は、ウェーブフロントのベクトル幅と呼ばれることがある。
【００２３】
[0028]上記で説明したように、ウェーブフロントは、単一の計算ユニット中にある処理要素２０６と同じ数またはそれよりも少ないスレッドを含んでいる。したがって、ウェーブフロントのスレッドのすべては、ウェーブフロント中のスレッドが、使用中の処理ユニットが同じウェーブフロント中の別のスレッドを処理し終えるのを待たなくてもよいので、同時に単一の計算ユニットの処理要素２０６によって並列に実行され得る。したがって、単一のウェーブフロントのスレッドは、単一のウェーブフロント内のスレッドを同期させるようにバリア動作が要求され得ないように実質的に並列に実行することを保証され得る。
【００２４】
[0029]計算ユニット２０４のうちの１つは、計算ユニット２０４の処理要素２０６を使用して並列に１つまたは複数のウェーブフロントを実行し得る。ブロックのスレッドが実行されるとき、ブロックのスレッドを同期させるためにバリア動作が使用され得る。上記で説明したように、バリア動作は、ブロックのすべてのスレッドがバリア動作を行われるまで待つようにブロックのスレッドが要求され得るように動作し得る。
【００２５】
[0030]シーケンサ２０８は、計算ユニット２０４の間のデータ並列コードの実行を管理およびスケジュールするように構成され得る。たとえば、シーケンサ２０８は、計算ユニット２０４上でスレッドのブロックとスレッドのウェーブフロントとの実行をスケジュールし得る。シーケンサ２０８はまた、スレッドのブロックを同期させるように構成され得る。たとえば、シーケンサ２０８は、それらのスレッドがバリア動作を行っており、実行するのを待っている他のスレッドが処理要素２０６によって処理されることを可能にするために、それのブロックの他のスレッドがそれらのそれぞれのバリア動作を行うのを待つ間アイドリングしている場合、処理要素２０６からスレッドをアンロードし得る。シーケンサ２０８はまた、ブロックのスレッドがすべてバリア動作を行ったと決定すると、アイドリングスレッドを処理要素２０６に再ロードし得る。
【００２６】
[0031]シーケンサ２０８は、決定された幅がグループ中のスレッドの総数よりも小さいグループ中のスレッドによって実行されるべきデータ並列コードに基づいて、多数のデータポイント上で同じデータ並列コードを実行しているスレッドのグループのためのバリア動作の幅を動的に決定し得る。グループは、いくつかの例では、スレッドのブロックであり得る。バリア動作の幅は、スレッドのいずれかがバリア動作に続く動作を実行することを可能にされる前にバリア動作に達しなければならないブロック中のスレッドの数であり得る。決定された幅がグループ中のスレッドの総数よりも小さいので、シーケンサ２０８は、バリア幅を決定することによって、グループ中のあらゆるスレッドがそれぞれのバリア動作に達しなかった場合でも、グループのスレッドがバリア動作に続く動作を実行することを可能にし得る。
【００２７】
[0032]シーケンサ２０８は、バリア動作より前および／またはバリア動作の後続の両方にグループ中のスレッドによって実行されるべきデータ並列コードに基づいて、スレッドのグループのためのバリア動作の幅を決定し得る。たとえば、上記のコードフラグメントに基づいて、シーケンサ２０８は、データ並列コードがバリア動作より前に３２ｐｔｒアレイロケーションに書き込むことになることと、データ並列コードがバリア動作に続く３２ｐｔｒアレイロケーションから読み出すことになることとを決定し得る。したがって、シーケンサは、特定のバリア動作のための３２のバリア幅を決定し得る。
【００２８】
[0033]一例では、シーケンサ２０８は、バリア動作の動的に決定されたバリア幅を１つまたは複数の幅レジスタに記憶し得る。スレッドが、幅レジスタに記憶されたそれのバリア幅を有するバリア動作に達したこと応答して、１つまたは複数の幅レジスタ中の数は減分される。１つまたは複数の幅レジスタ中の数が０に達したことに応答して、バリア動作に達した後に待っているブロック中のスレッドは、実行を続けることを可能にされ得る。別の例では、シーケンサ２０８は、バリア動作の幅を示す数を記憶する幅レジスタと、ブロック中の他のスレッドがバリアに達するのを待っているスレッドの数を記憶する待機レジスタの両方を含み得る。スレッドがバリア動作に達したことに応答して、待機レジスタ中の数は増分される。待機レジスタ中の数が幅レジスタ中の数に等しいことに応答して、バリア動作に達した後に待っているブロック中のスレッドは、実行を続けることを可能にされ得る。
【００２９】
[0034]いくつかの例では、バリア幅を動的に決定することは、データ並列コードを含んでいるコンピュータプログラムの開発者が、様々な並列コンピューティングシステムにわたって実行し得るクロスプラットフォームデータ並列コードをより容易に書き込むことを可能にし得る。たとえば、いくつかの並列コンピューティングシステムは、バリアの幅がウェーブフロントのベクトル幅よりも小さい場合にバリア動作が不要であるように、単一のウェーブフロント中のあらゆるスレッドが同時に実行することができることを保証し得る。たとえば、計算ユニットが１６個の処理要素を含んでいるなどの理由でウェーブフロントのためのベクトル幅が１６である場合、１６以下のバリア幅を有するバリア動作は不要であり得る。しかしながら、コンピュータプログラマーは、正確にその人のデータ並列コードがどの並列コンピューティングシステム上で動作するかを知らないことがあり、したがって、並列処理システムのための計算ユニットがいくつの処理要素を含んでいるかを知らないことがあるので、コンピュータプログラマーが、特定の並列コンピューティングシステムのためのウェーブフロントのベクトル幅よりも小さいバリア幅をハードコーディングする場合、そのデータ並列コードは、その特定の並列コンピューティングシステム上で動作するとき、外来バリア動作を行い得、データ並列コードの実行を減速し得る。対照的に、シーケンサ２０８は、バリア動作のためのバリア幅、ならびに特定の並列コンピューティングシステムのためのウェーブフロントのベクトル幅を決定し得、決定されたバリア幅が、データ並列コードがその上で実行する並列コンピューティングシステムのためのウェーブフロントのベクトル幅よりも小さい場合にそのバリア動作を行わないことを決定し得る。いくつかの例では、シーケンサ２０８は、ウェーブフロントのベクトル幅よりも大きいバリア幅を決定し得る。
【００３０】
[0035]バリア幅を動的に計算することはまた、動的制御フローの条件ステートメントがスレッドのグループ全体にわたって一様に評価しない条件ステートメント中でバリア動作の使用を可能にし得る。以下の擬似コードについて考える。  
if (x < y) {  
// 真ステートメント  
barrier();  
}  
else {  
// 偽ステートメント  
}
【００３１】
[0036]一般に、スレッドのグループについて、あらゆるスレッドにおいて、条件文ｘ＜ｙが真として評価されるとは限らない場合、条件文ｘ＜ｙが真に評価する場合のみそれが行われるようなバリア動作を含むことは、ｘ＜ｙが偽として評価されるスレッドがバリア動作を決して行わないことになるので、グループ中のスレッドのグループにデッドロックさせ得る。対照的に、本開示では、シーケンサ２０８は、値ｘおよびｙのセットについてｘ＜ｙを事前に評価することによってなど、ｘ＜ｙが真として評価する回数に等しくなるようにバリアの幅を動的に設定し得る。したがって、バリアの幅が４として設定された場合、４つのスレッドがバリア動作を実行すると、作業項目のグループ中のスレッドの残りがバリア動作を実行するのを待つ必要なしに、バリアされたスレッドはバリアの後に続き得る。
【００３２】
[0037]シーケンサ２０８はまた、スレッドのサブグループを一緒に同期させるためにバリア動作のバリア幅を決定し得、ただし、サブグループのスレッドは、ブロックの連続するスレッドである。たとえば、１６個のスレッドｔ0、ｔ1、．．．、ｔ15のブロックを仮定すれば、スレッドのバリア動作のためのバリア幅が４として指定された場合、ブロックの第１の４つのスレッドｔ0〜ｔ3は一緒に同期し得、ブロックの第２の４つのスレッドｔ4〜ｔ7は一緒に同期し得、４つのスレッドｔ8〜ｔ11の第３のグループは一緒に同期し得、４つのスレッドｔ12〜ｔ15の第４のグループは一緒に同期し得る。この例では、スレッドｔ0〜ｔ3のグループ中の各スレッドは、グループ中のスレッドｔ0〜ｔ3のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドｔ4〜ｔ7のグループ中の各スレッドは、グループ中のスレッドｔ4〜ｔ7のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドｔ8〜ｔ11のグループ中の各スレッドは、グループ中のスレッドｔ8〜ｔ11のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドｔ12〜ｔ15のグループ中の各スレッドは、グループ中のスレッドｔ12〜ｔ15のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得る。したがって、たとえば、スレッドｔ1、ｔ8、ｔ2、およびｔ3がバリア動作に達する第１の４つのスレッドである場合、スレッドｔ1、ｔ2、およびｔ3は、１６個のスレッドのブロックのうちの４つのスレッドがバリア動作に達したにもかかわらず、それらのスレッドｔ1、ｔ2およびｔ3がバリア動作の後に実行を続けることを可能にされる前にスレッドｔ4がバリア動作に達するのを待つように要求され得る。
【００３３】
[0038]図３は、本開示のいくつかの態様による、動的バリア幅を使用するスレッドの同期を示す概念図である。図３に示されているように、図２に示されたシーケンサ２０８などのシーケンサは、スレッド３０２および３０４が一緒に同期させられ得ることと、スレッド３０６および３０８が一緒に同期させられ得ることとを決定し得る。したがって、シーケンサは、データ並列コードを並列に実行し得るスレッド３０２、３０４、３０６、および３０８のために２のバリア幅を決定し得る。したがって、スレッド３０２および３０４はスレッドのあるサブグループにグループ化され、スレッド３０６および３０８はスレッドの別のサブグループにグループ化され得る。時間ｔ１において、スレッド３０６は、それの書込み動作を実行し終えており、バリア動作３１０に達する。しかしながら、それのサブグループ中のあらゆるスレッドが同じくそれのそれぞれの書込み動作を実行し終え、バリア動作に達したとは限らないので、スレッド３０６は、バリア動作３１０に後続の読み出し動作を実行する前に、サブグループ中の他のスレッド（すなわち、スレッド３０８）が同じく、それの書込み動作を実行し終え、バリア動作に達するまで待たなければならない。時間ｔ２において、スレッド３０２は書込み動作を実行し終え、バリア動作３１２に達する。同様に、スレッド３０２をもつサブグループの他のメンバーであるスレッド３０４が同じく、まだ書込み動作を実行し終えておらず、バリア動作に達していないので、スレッド３０２は同じく、バリア動作３１２に後続のコードを実行する前に待たなければならない。時間ｔ３において、スレッド３０４はバリア動作３１４に達する。スレッド３０２とスレッド３０４の両方がバリア動作３１２および３１４に達したので、スレッド３０２および３０４は、バリア動作３１４に続くそれぞれの読み出し動作を実行し得る。時間ｔ４において、スレッド３０８はバリア動作３１６に達する。スレッド３０６とスレッド３０８の両方がバリア動作に達したので、スレッド３０６および３０８は、次に、それのそれぞれのバリア動作に続くそれぞれの読み出し動作を実行することを可能にされる。図３に見られるように、スレッドのグループ中のスレッドの総数よりも小さいバリア幅を設定することによって、スレッドは、バリアの後にはるかに急速に実行を再開することが可能であり得る。たとえば、スレッドのグループ中のスレッドの総数よりも小さいバリア幅を設定しないことによって、スレッド３０２、３０４、および３０６は、時間ｔ１、ｔ２、およびｔ３よりも遅い時間ｔ４においてスレッド３０８がバリア動作３１６を実行するまで、それぞれのバリア動作３１０、３１２、および３１４を実行した後にアイドルのままになる。
【００３４】
[0039]バリア動作の幅を動的に決定することは、特に、低減されるべき数の集合のサイズがランタイムまで知られないとき、並列低減において有用であり得る。低減は、数の集合を加算する技法であり、並列低減は、データ並列コードが低減の要素を並列に加算するために実行することができる低減であり得る。図４は、本開示のいくつかの態様による、例示的な並列低減を示す概念図である。図４に示されているように、アレイ４０２は、一緒に加算されるべき８つの数の集合を含み得る。低減を行うべきデータ並列コードは、各作業項目がアレイ４０２の２つの連続する要素を一緒に加算するように実行し得る。したがって、並列低減の第１のパスでは、加算演算４０４Ａ〜４０４Ｄ（「加算演算４０４」）は、８つの要素アレイ４０２を、加算演算４０４の各々から生じる４つの得られた和を含んでいる４つの要素アレイ４０６まで低減するためにアレイ４０２の要素のうちの２つを各々加算するように４つの並列スレッドを介して並列に実行し得る。
【００３５】
[0040]しかしながら、集合のサイズがランタイムにおいて未知であり得るので、データ並列コード中のバリア動作が並列低減を行うのに必要な正確なバリア幅をプログラマーがコンパイル時に知ることは不可能であり得る。たとえば、集合のサイズは、ユーザが８つの数、２０個の数、または数の他のセットを入力し得るように、ユーザ入力に依存し得る。図４に示された特定の例では、図２に示されたシーケンサ２０８などのシーケンサは、アレイ４０２のサイズ（８）に基づいて、加算演算４０４を行うことに続く４つのスレッドによって行われるべきバリア動作のための４のバリア幅を決定し得る。
【００３６】
[0041]加算演算４０４を介した低減の第１のラウンドは、４つの得られた要素を含んでいるアレイ４０６を生成し得る。アレイ４０６の要素をさらに低減するために、加算演算４０８Ａおよび４０８Ｂ（「加算演算４０８」）をお行うために２つのスレッドのみが必要とされ得る。したがって、シーケンサは、アレイ４０６のサイズ（４）に基づいて、加算演算４０８を行うことに続く２つのスレッドによって行われるべきバリア動作のために２のバリア幅を決定し得る。
【００３７】
[0042]加算演算４０８を介した低減の第２のラウンドは、２つの得られた要素を含んでいるアレイ４１０を生成し得る。アレイ４１０の要素をさらに低減するために、加算演算４１２を行うために単一のスレッドのみが必要とされ得る。したがって、シーケンサは、バリア動作が行われる必要がないと決定し得る。したがって、シーケンサは、加算演算４１２を行った後にコードにおいて指定されたバリア動作を無視することを決定し得る。
【００３８】
[0043]加算低減を行うためのデータ並列コードは、一般に、バリア動作がループ内に含まれるようにループとして書き込まれる。したがって、バリア動作の幅がコンパイル時に設定されるべきである場合、プログラマーが低減すべき集合中の要素の初期数を知っていると仮定すると、プログラマーは、加算演算の各セットの後に特定の幅のバリア動作を手動で挿入するようにループを開かなければならないことがある。対照的に、本例では、シンセサイザは、バリア動作の各反復についてバリア幅を動的に決定し得る。
【００３９】
[0044]図５は、本開示のいくつかの態様による、動的バリアを使用してスレッドを同期させることの例示的なプロセスを示すフローチャートである。図５に示されているように、図２に示されたシーケンサ２０８などのシーケンサは、図２に示されたホスト２２０などのホスト上で実行する、ホストに動作可能に結合された、図２に示された処理ユニット２０２などの処理ユニットによって実行されるべきデータ並列コードを含むコンピュータアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を動的に決定し、ここにおいて、バリア幅は、スレッドのグループ中のスレッドの総数よりも小さい（５０２）。図５の例では、スレッドのグループは６４個のスレッドを含み得、シーケンサは３２のバリア幅を決定し得る。したがって、６４個のスレッドは、各々３２個のスレッドの２つのサブグループを含み得、ただし、サブグループのスレッドはその同じサブグループの他のスレッドと同期される。第１の時間において、スレッドのグループの第１のサブグループの第１のスレッドは、バリアに達し（５０４）、第１のサブグループのスレッドの残りが同じくバリアに達するのを待ち得る。第２の時間において、スレッドのグループの第２のサブグループの第１のスレッドは、バリアに達し（５０６）、第２のサブグループのスレッドの残りが同じくバリアに達するのを待ち得る。
【００４０】
[0045]第３の時間において、第１のサブグループのすべてのスレッドはバリアに達する（５０８）。シーケンサは、スレッドのグループの第１のサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、第１のサブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループの第１のサブグループがそれぞれのバリア動作に続く１つまたは複数の計算ユニット上で実行することを可能にし、ここにおいて、スレッドのグループの第１のサブグループは、スレッドのグループ中のスレッドの総数よりも小さい（５１０）。
【００４１】
[0046]第４の時間において、第２のサブグループのすべてのスレッドはバリアに達する（５１２）。シーケンサは、スレッドのグループの第２のサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、第２のサブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループの第２のサブグループがそれぞれのバリア動作に続く１つまたは複数の計算ユニット上で実行することを可能にし、ここにおいて、スレッドのグループの第２のサブグループは、スレッドのグループ中のスレッドの総数よりも小さい（５１４）。
【００４２】
[0047]いくつかの例では、バリア幅を決定することは、データ並列コードに少なくとも部分的に基づいてバリア動作のバリア幅を決定することを含み得る。いくつかの例では、バリア動作のバリア幅は、１つまたは複数のプロセッサのウェーブフロントのベクトル幅よりも大きい。いくつかの例では、シーケンサは、バリア動作のバリア幅が１つまたは複数のプロセッサのためのウェーブフロントのベクトル幅よりも小さい場合、バリア動作を行わないことをさらに決定し得る。いくつかの例では、バリア動作は条件ステートメント中に含まれ、条件ステートメントは、スレッドのグループ全体にわたって一様に評価しない。いくつかの例では、スレッドのグループのサブグループ中のスレッドは、スレッドのグループ中の連続するスレッドである。いくつかの例では、バリア動作はループ中に含まれる。いくつかの例では、シーケンサは、ループの各反復についてバリア動作のバリア幅を動的に決定し得、ここにおいて、決定されたバリア幅はループの少なくとも２つの反復中で異なる。
【００４３】
[0048]図６は、本開示の１つまたは複数の態様を実装するように構成され得るデバイスの一例を示すブロック図である。たとえば、図６にデバイス６０２を示す。デバイス６０２の例としては、限定はしないが、ビデオデバイス、メディアプレーヤ、セットトップボックス、携帯電話およびいわゆるスマートフォンなどのワイヤレスハンドセット、携帯情報端末（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどがある。
【００４４】
[0049]図６の例では、デバイス６０２は、ホスト６１０と、システムメモリ６１８と、処理ユニット６２０とを含み得る。ホスト６１０は、図２に示されたホスト２２０と同様であり得、処理ユニット６２０は、図２に示された処理ユニット２０２と同様であり得る。簡潔のために、ホスト６１０、システムメモリ６１８、および処理ユニット６２０は、図６に関してさらに説明しない。デバイス６２２はまた、ディスプレイプロセッサ６２４と、トランシーバモジュール６２６と、ユーザインターフェース６２８と、ディスプレイ６３０とを含み得る。トランシーバモジュール６２６とディスプレイプロセッサ６２４とは両方とも、ホスト６１０および／または処理ユニット６２０と同じ集積回路（ＩＣ）の一部であり得るか、両方ともホスト６１０および／または処理ユニット６２０を含む１つまたは複数のＩＣの外部にあり得るか、あるいはホスト６１０および／または処理ユニット６２０を含むＩＣの外部にあるＩＣ中に形成され得る。
【００４５】
[0050]デバイス６２２は、明快のために図６に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス６２２は、デバイス６２２がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図６に示されていないスピーカーおよびマイクロフォンを含み、またはデバイス６２２がメディアプレーヤである例においてスピーカーを含み得る。デバイス６２２はまた、ビデオカメラを含み得る。さらに、デバイス６２２に示された様々なモジュールおよびユニットは、デバイス６２２のあらゆる例において必要であるとは限らない。たとえば、ユーザインターフェース６２８およびディスプレイ６３０は、デバイス６２２が、デスクトップコンピュータ、あるいは外部ユーザインターフェースまたはディスプレイとインターフェースする能力がある他のデバイスである例において、デバイス６２２の外部にあり得る。
【００４６】
[0051]ユーザインターフェース６２８の例には、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース６２８はまた、タッチスクリーンであり得、ディスプレイ６３０の一部として組み込まれ得る。トランシーバモジュール６２６は、デバイス６２２と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール６２６は、ワイヤードまたはワイヤレス通信のための変調器、復調器、増幅器および他のそのような回路を含み得る。
【００４７】
[0052]いくつかの例では、処理ユニット６２０は、十分に形成された画像をシステムメモリ６１８に記憶し得るＧＰＵであり得る。ディスプレイプロセッサ６２４はシステムメモリ６１８から画像を検索し、ディスプレイ６３０のピクセルに画像を表示するために照明させる値を出力し得る。ディスプレイ６３０は、処理ユニット６２０によって生成された画像コンテンツを表示するデバイス６２２のディスプレイであり得る。ディスプレイ６３０は、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオードディスプレイ（ＯＬＥＤ）、陰極線管（ＣＲＴ）ディスプレイ、プラズマディスプレイ、または別のタイプのディスプレイデバイスであり得る。
【００４８】
[0053]１つまたは複数の例において、前述の機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装する場合、機能は、１つまたは複数の命令またはコードとして、コンピュータ可読媒体上に記憶されるか、またはコンピュータ可読媒体を介して送信され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび／またはデータ構造を取り出すために１つまたは複数のコンピュータあるいは１つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ（登録商標）、ＣＤ−ＲＯＭ、あるいは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気記憶デバイス、もしくは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータによってアクセスされ得る任意の他の媒体を備えることができる。データ記憶媒体に記憶されたソフトウェアは、同軸ケーブル、光ファイバーケーブル、ツイストペア、デジタル加入者回線（ＤＳＬ）、または赤外線、無線、およびマイクロ波などのワイヤレス技術を使用して、ウェブサイト、サーバ、または他のリモートソースから送信され得、その場合、同軸ケーブル、光ファイバーケーブル、ツイストペア、ＤＳＬ、または赤外線、無線、およびマイクロ波などのワイヤレス技術は、媒体の定義に含まれる。本明細書で使用するディスク（disk）およびディスク（disc）は、コンパクトディスク（disc）（ＣＤ）、レーザーディスク（登録商標）（disc）、光ディスク（disc）、デジタル多用途ディスク（disc）（ＤＶＤ）、フロッピー（登録商標）ディスク（disk）およびＢｌｕ−ｒａｙ（登録商標）ディスク（disc）を含み、ディスク（disk）は、通常、データを磁気的に再生し、ディスク（disc）は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含めるべきである。
【００４９】
[0054]コードは、１つまたは複数のデジタル信号プロセッサ（ＤＳＰ）などの１つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明した技法の実装に好適な任意の他の構造のいずれかを指し得る。さらに、いくつかの態様では、本明細書で説明した機能は、専用のハードウェアモジュールおよび／またはソフトウェアモジュール内に与えられ得る。また、本技法は、１つまたは複数の回路または論理要素中に十分に実装され得る。
【００５０】
[0055]本開示の技法は、ワイヤレスハンドセット、集積回路（ＩＣ）、またはＩＣのセット（たとえば、チップセット）を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を行うように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要があるとは限らない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび／またはファームウェアとともに、上記で説明した１つまたは複数のプロセッサを含めて、コーデックハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
【００５１】
[0056]様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
【図１】
2016525746.tif 000003
【図２】
2016525746.tif 000004
【図３】
2016525746.tif 000005
【図４】
2016525746.tif 000006
【図５】
2016525746.tif 000007
【図６】
2016525746.tif 000008
【手続補正書】
【提出日】平成28年4月15日(2016.4.15)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
スレッドを同期させるための方法であって、前記方法は、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上で、前記ループのそれぞれの反復において、それぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
を備える、方法。
【請求項２】
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項１に記載の方法。
【請求項３】
前記バリア動作が前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
請求項１に記載の方法。
【請求項４】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項１に記載の方法。
【請求項５】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項１に記載の方法。
【請求項６】
スレッドを同期させるためのコンピューティングシステムであって、
ホストと、
前記ホストに動作可能に結合された処理ユニット、ここにおいて、前記処理ユニットは、複数のプロセッサのうちの少なくとも１つを備える、と、
シーケンサモジュールと
を備え、前記シーケンサモジュールは、
前記処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上で、前記ループのそれぞれの反復において、それぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
を行うように構成される、コンピューティングシステム。
【請求項７】
前記バリア幅を決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項６に記載のコンピューティングシステム。
【請求項８】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
請求項６に記載のコンピューティングシステム。
【請求項９】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項６に記載のコンピューティングシステム。
【請求項１０】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項６に記載のコンピューティングシステム。
【請求項１１】
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定するための手段、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上で、前記ループのそれぞれの反復において、それぞれの動作を実行することを可能にするための手段、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定するための手段と
を備える、並列処理装置。
【請求項１２】
前記決定するための手段は、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定するための手段をさらに備える、
請求項１１に記載の並列処理装置。
【請求項１３】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定するための手段をさらに備える、
請求項１１に記載の並列処理装置。
【請求項１４】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項１１に記載の並列処理装置。
【請求項１５】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項１１に記載の並列処理装置。
【請求項１６】
少なくとも１つのプロセッサによって実行されると、前記少なくとも１つのプロセッサに、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記スレッドのグループ中のスレッドは、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを実行し、前記バリア動作は、ループ中に含まれる、と、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上で、前記ループのそれぞれの反復において、それぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
を備える動作を行わせる命令を含む、非一時的なコンピュータ可読記憶媒体。
【請求項１７】
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１８】
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
請求項１６に記載のコンピュータ可読記憶媒体。
【請求項１９】
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
請求項１６に記載のコンピュータ可読記憶媒体。
【請求項２０】
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
請求項１６に記載のコンピュータ可読記憶媒体。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００５１
【補正方法】変更
【補正の内容】
【００５１】
[0056]様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
スレッドを同期させるための方法であって、前記方法は、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、方法。
［Ｃ２］
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
Ｃ１に記載の方法。
［Ｃ３］
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
Ｃ１に記載の方法。
［Ｃ４］
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
Ｃ１に記載の方法。
［Ｃ５］
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
Ｃ１に記載の方法。
［Ｃ６］
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
Ｃ１に記載の方法。
［Ｃ７］
前記バリア動作は、ループ中に含まれる、
Ｃ１に記載の方法。
［Ｃ８］
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
Ｃ７に記載の方法。
［Ｃ９］
スレッドを同期させるためのコンピューティングシステムであって、
ホストと、
前記ホストに動作可能に結合された処理ユニットと、
シーケンサモジュールと
を備え、前記シーケンサモジュールは、
前記処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を行うように構成される、コンピューティングシステム。
［Ｃ１０］
前記バリア幅を決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１１］
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１２］
前記シーケンサモジュールは、
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することを行うようにさらに構成される、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１３］
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１４］
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１５］
前記バリア動作は、ループ中に含まれる、
Ｃ９に記載のコンピューティングシステム。
［Ｃ１６］
前記シーケンサモジュールは、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することを行うようにさらに構成され、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
Ｃ１５に記載のコンピューティングシステム。
［Ｃ１７］
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にするための手段、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、並列処理装置。
［Ｃ１８］
前記決定するための手段は、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定するための手段をさらに備える、
Ｃ１７に記載の並列処理装置。
［Ｃ１９］
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
Ｃ１７に記載の並列処理装置。
［Ｃ２０］
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定するための手段をさらに備える、
Ｃ１７に記載の並列処理装置。
［Ｃ２１］
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
Ｃ１７に記載の並列処理装置。
［Ｃ２２］
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
Ｃ１７に記載の並列処理装置。
［Ｃ２３］
前記バリア動作は、ループ中に含まれる、
Ｃ１７に記載の並列処理装置。
［Ｃ２４］
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定するための手段をさらに備え、前記決定されたバリア幅は、前記ループの少なくとも２つの反復中で異なる、
Ｃ２３に記載の並列処理装置。
［Ｃ２５］
少なくとも１つのプロセッサによって実行されると、前記少なくとも１つのプロセッサに、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記スレッドのグループ中のスレッドは、前記処理ユニットの１つまたは複数の計算ユニット上で前記データ並列コードを実行する、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記１つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える動作を行わせる命令を含む、コンピュータ可読記憶媒体。
［Ｃ２６］
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ２７］
前記バリア動作の前記バリア幅は、前記１つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ２８］
前記バリア動作の前記バリア幅が前記１つまたは複数の計算ユニットのためのウェーブフロントよりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ２９］
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ３０］
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ３１］
前記バリア動作は、ループ中に含まれる、
Ｃ２５に記載のコンピュータ可読記憶媒体。
［Ｃ３２］
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅が前記ループの少なくとも２つの反復中で異なる、
Ｃ３１に記載のコンピュータ可読記憶媒体。
【国際調査報告】
2016525746.tif 000009
2016525746.tif 000010
2016525746.tif 000011