JP6130065B2 - 動的幅計算を用いたバリア同期 - Google Patents

動的幅計算を用いたバリア同期 Download PDF

Info

Publication number
JP6130065B2
JP6130065B2 JP2016524424A JP2016524424A JP6130065B2 JP 6130065 B2 JP6130065 B2 JP 6130065B2 JP 2016524424 A JP2016524424 A JP 2016524424A JP 2016524424 A JP2016524424 A JP 2016524424A JP 6130065 B2 JP6130065 B2 JP 6130065B2
Authority
JP
Japan
Prior art keywords
barrier
threads
width
group
subgroup
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2016524424A
Other languages
English (en)
Other versions
JP2016525746A (ja
Inventor
ガスター、ベネディクト・ルベン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qualcomm Inc
Original Assignee
Qualcomm Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Qualcomm Inc filed Critical Qualcomm Inc
Publication of JP2016525746A publication Critical patent/JP2016525746A/ja
Application granted granted Critical
Publication of JP6130065B2 publication Critical patent/JP6130065B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/522Barrier synchronisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Advance Control (AREA)
  • Multi Processors (AREA)
  • Devices For Executing Special Programs (AREA)

Description

[0001]本開示は、計算命令の実行に関し、より詳細には、並列に実行する計算命令の同期に関する。
[0002]旧来、コンピュータプログラムは、コンピュータプログラムのコードが単一の従来のプロセッサ上で連続的に実行する、連続プログラムとして書き込まれていた。しかしながら、複数の処理コアを含む、グラフィックス処理ユニット(GPU:graphics processing unit)などの特殊なプロセッサの性能が急速に増大し続けるので、コンピュータプログラムは、そのような特殊なプロセッサを利用するためにますます書き込まれている。たとえば、コンピュータプログラムは、同じコードがデータのセット上で並列に動作するためにプロセッサの複数の処理コアにわたって実行し得るように、データ並列コードを含めるために書き込まれている。そのようなデータ並列コードは、連続的にではなく並列に実行されるので、コードがデータのセットを処理し終える順序に関する保証がないことがある。したがって、データの値がさらなる動作において使用される前に複数の処理コアがデータのセット上で動作し終えたことを保証するために、並列実行を同期させることが望ましいことがある。
[0003]概して、本開示では、動的バリア幅計算(dynamic barrier width calculation)を使用して並列に処理される計算命令を同期させるための技法について説明する。スレッドのブロックがデータのセット上で同じ命令のセットを各々実行し得、読み出し動作が不正確または無効なデータを読み出すのを防ぐために、スレッドがデータのセット上でそれぞれの書込み動作を実行した後、およびスレッドがデータのセット上でそれぞれの読み出し動作を実行する前に、スレッドのブロックを同期させるためにバリア動作が使用され得る。デフォルトでは、ブロック中のどのスレッドもそれぞれのバリア動作を実行していない限り、スレッドがバリア動作に続く読み出し動作を実行することができないように、バリア動作はスレッドのブロック中のスレッドのすべてを同期させ得る。対照的に、本明細書で開示する技法は、ブロック中の他のスレッドがそれらのバリア動作をなお実行しなければならない場合でも、ブロックのスレッドのサブセットがそれぞれのバリア動作を実行した後に続いて読み出し動作を実行することができるようにバリア動作の幅を動的に計算するための技法を含み得る。
[0004]一例では、スレッドを同期させるための方法は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することを含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さく、ここにおいて、スレッドのグループ中のスレッドは、処理ユニットの1つまたは複数の計算ユニット上でデータ並列コードを実行する。本方法は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることをさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
[0005]別の例では、コンピューティングシステムは、スレッドを同期させるためのコンピューティングシステムを含む。コンピューティングシステムはホストを含む。コンピューティングシステムは、ホストに動作可能に結合された処理ユニットをさらに含む。コンピューティングシステムは、処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、処理ユニットの1つまたは複数の計算ユニット上でデータ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することと、ここにおいて、バリア幅がスレッドのグループ中のスレッドの総数よりも小さい、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることと、ここにおいて、スレッドのグループのサブグループが、スレッドのグループ中のスレッドの総数よりも小さい、を行うように構成されたシーケンサモジュールをさらに含む。
[0006]別の例では、並列処理装置は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、処理ユニットの1つまたは複数の計算ユニット上でデータ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段を含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さい。並列処理装置は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作の後に1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にするための手段をさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
[0007]別の例では、コンピュータ可読記憶媒体は、少なくとも1つのプロセッサによって実行されたとき、少なくとも1つのプロセッサに動作を行わせる命令を含んでいることがある。動作は、ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、ホスト上で実行するアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定することを含み、ここにおいて、バリア幅はスレッドのグループ中のスレッドの総数よりも小さく、ここにおいて、スレッドのグループ中のスレッドは、処理ユニットの1つまたは複数の計算ユニット上でデータ並列コードを実行する。動作は、スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、サブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループのサブグループがそれぞれのバリア動作に続く1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすることをさらに含み、ここにおいて、スレッドのグループのサブグループは、スレッドのグループ中のスレッドの総数よりも小さい。
[0008]1つまたは複数の例の詳細が以下の添付の図面および説明において記載されている。他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明らかになろう。
本開示のいくつかの態様による、スレッドの同期を示す概念図。 本開示のいくつかの態様による、並列処理コンピューティングシステムを示すブロック図。 本開示のいくつかの態様による、動的バリア幅を使用するスレッドの同期を示す概念図。 本開示のいくつかの態様による、例示的な並列低減を示す概念図。 本開示のいくつかの態様による、動的バリアを使用してスレッドを同期させることの例示的なプロセスを示すフローチャート。 本開示の1つまたは複数の態様を実装するように構成され得るデバイスの一例を示すブロック図。
[0015]概して、本開示では、動的バリア幅計算を使用して並列に処理される計算命令を同期させるための技法について説明する。データ並列処理において、コンピュータプログラムはデータ並列コードを含み得る。データ並列コードは、複数の異なるデータポイント上で同じ動作を並列に行うために計算命令の同じセットが実行され得るように、複数の実行スレッドを介して複数の処理要素上でコンカレントに動作し得る計算命令のセットである。複数のデータポイントのうちの1つの上で動作すべき同じデータ並列コードの各個々の呼出しがスレッドであり、スレッドは、複数のデータポイント上で同じ命令を行うためにコンカレントに実行し得る。一般に、データ並列コードは、データのセットに書き込むための書込み動作と、書込み動作の後に、書込み動作によって書き込まれたデータのセットを読み出す読み出し動作とを含み得る。しかしながら、実行するあらゆるスレッドが、書込み動作の実行を同時に完了するとは限らない。各スレッドがデータのセットに書き込むための書込み動作を完了する前にデータのセットを読み出すための読み出し動作が実行された場合、読み出し動作は不正確または無効な結果を読み出し得る。読み出し動作が不正確または無効な結果を読み出さないことを保証するために、各スレッドは、データのセットに対してデータ並列書込み動作を実行した後、続いてデータのセット上で読み出し動作を実行する前に、バリア動作を実行するように要求され得、データ並列コードを実行するためのスレッドのいずれも、スレッドのすべてが同じくバリア動作を実行するまで、バリア動作を実行した後に続いて読み出し動作を実行することを可能にされ得ない。
[0016]図1は、本開示のいくつかの態様による、スレッドの同期を示す概念図である。図1に示されているように、スレッド102、104、106、および108は、データのセットに対する書込み動作を各々行い、その後データのセット上で読み出し動作を各々行うために、データ並列コードを並列に実行し得る。時間t1において、スレッド106は、それの書込み動作を終了しており、バリア動作110に達する。バリア動作110は、スレッド106がそれの書込み動作の実行を完了したことを示す。しかしながら、あらゆるスレッドがバリア動作に達したとは限らない(すなわち、スレッド102、104、および108は、それぞれの書込み動作の実行を完了していない)ので、スレッド106は、続いてデータのセットを読み出すために読み出し動作を実行する前に、他のスレッド102、104、および108が同じくバリア動作に達するまで待たなければならない。時間t2において、スレッド102がそれの書込み動作を実行し終えたので、スレッド102はバリア動作112に達する。スレッド106と同様に、スレッド104および108が同じく、まだバリア動作に達していないので、スレッド102は同じく、続いてデータのセットを読み出すために読み出し動作を実行する前に、スレッド104および108が同じくバリア動作に達するまで待たなければならない。時間t3において、スレッド104はバリア動作114に達する。スレッド102および106と同様に、スレッド108が同じくバリア動作に達していないので、スレッド104は同じく、続いてデータのセットを読み出すために読み出し動作を実行する前に、スレッド108が同じくバリア動作に達するまで待たなければならない。時間t4において、スレッド108はバリア動作116に達する。スレッドのグループ中のあらゆるスレッド102、104、106、および108がバリア動作に達したので、今度は、スレッド102、104、106、および108の各々は、データのセットを読み出すために読み出し動作を実行することを各々可能にされ得る。
[0017]しかしながら、スレッドのグループ中のスレッドが進むことを可能にする前に、スレッドのグループ中のあらゆるスレッドがバリア動作に達するのを待つようにグループ中のスレッドに要求するバリア動作は、非効率的であり得る。たとえば、書込みの実行の後に行われるべき読み出し動作は、スレッドのうちのいくつかのみ(ただし、すべてでない)が書込み動作のそれのそれぞれの実行を終了したことに依存し得る。したがって、追加の動作によって依存されるスレッドのすべてがバリア動作に達した場合でも、それらのスレッドは、グループ中のあらゆるスレッドがそれのそれぞれの書込み動作を実行し終え、バリア動作に達するまでそれのそれぞれの読み出し動作を実行することができない。
[0018]バリア動作のそのような使用を示す、C言語で書き込まれる例示的なコードフラグメントを以下に示す。
local int * ptr; // 共有メモリリソース
// サイズ32のグループ間
// でリソースを共有する
if (thread_id % 32) {
ptr[thread_id%32] = value; // メモリに書き込む //
}
barrier(); // 全てのスレッドが
// メモリ書き込みを行ったことを確認する //
x = ptr[thread_id%32]; // メモリを読み出す
[0019]上記のコードフラグメントに示されているように、バリア動作は、後続のx=ptr[thread_id%32]読み出し動作が行われる前に、if(thread_id%32){ptr[thread_id%32]=value;}書込み動作を各々行うスレッドのグループのための同期ポイントであり、それにより、グループ中の各スレッドがif(thread_id%32){ptr[thread_id%32]=value;}動作を行い終え、同期ポイントに達した後のみ、ptr[thread_id%32]が読み出され、x変数にはptr[thread_id%32]の値が割り当てられることを保証する。しかしながら、thread_id%32が0〜31のみの値を生成することになるので、グループが32個よりも多いスレッドを含む場合に、x=ptr[thread_id%32]動作を行う前に各スレッドがバリア動作を行うまでスレッドのグループ中のあらゆるスレッドが待つことは、不要であり得る。そうではなく、32個のスレッドのグループが、x=ptr[thread_id%32]動作が正しく動作することになることを保証するのを待つことのみが必要であり得る。したがって、スレッドのグループが32個よりも多いスレッドを含む場合、バリア動作は、x=ptr[thread_id%32]動作の完全性を保証するのに必要であるよりも多くのスレッドを待つことを必要とすることにおいて過剰包含的(over inclusive)であり得る。
[0020]バリア動作の非効率性を低減するための1つの手法は、バリア動作の幅を指定することを含み得る。バリア動作の幅は、スレッドがバリア動作の後に進むことを可能にする前にバリア動作に達するように要求されるスレッドの数であり得、幅は、一般に、スレッドのグループ中のスレッドの総数よりも少ないことが指定され得る。たとえば、バリア動作はパラメータとして幅を取り得る。別の例では、幅は定数として指定され得る。コンパイル時に、バリア動作のための幅は、バリア動作を呼ぶコンピュータプログラムにハードコーディングされ得る。上記の例示的なコードフラグメントの場合、32の幅が、バリア動作のためのコンパイル時に指定され得る。
[0021]しかしながら、コンパイル時にバリア動作の幅をハードコーディングすることは、コンパイル時にバリア動作の所望の幅が知られていない状況の場合に有用でないことがあるので、バリア動作の有用性とフレキシビリティとを制限し得る。さらに、データ並列コードを書き込むプログラマーは、指定すべき適切な幅を知らないことがある。したがって、ランタイムにおいてバリア動作の幅を動的に計算することが望ましいことがある。
[0022]図2は、本開示のいくつかの態様による、データ並列コードを実行するための並列処理コンピューティングシステムを示すブロック図である。図2に示されているように、ホスト220は処理ユニット202に通信可能に結合され得る。処理ユニット202は計算ユニット204A〜204N(「計算ユニット204」)を含み得、計算ユニット204の各々は処理要素206A〜206N(「処理要素206」)を含み得る。
[0023]ホスト220は、いくつかの例では、並列処理コンピューティングシステム内の実行のためのコンピュータプログラムの命令を処理するように構成された、中央処理ユニット(CPU)などのマイクロプロセッサであり得る。いくつかの例では、ホスト220は、コンピュータプログラムの実行中にデータ並列コードに遭遇すると、実行のための処理ユニット202にデータ並列コードを通信し得る。
[0024]処理ユニット202は、コンピュータプログラムの命令のうちの少なくともいくつかを処理するように構成されたグラフィックス処理ユニット(GPU)または他の好適な処理ユニットであり得る。処理ユニット202は、ホスト220に動作可能に結合され得、ホスト220からコンピュータプログラムのデータ並列コードを受信し得る。処理ユニット202は、計算ユニット204など、1つまたは複数のプログラマブルプロセッサを含み得る。計算ユニット204は、処理要素206を各々含み得る。計算ユニット204は、ローカルメモリ(すなわち、キャッシュ)を各々含み得る。処理要素206は、それぞれの計算ユニット204の処理コアであり得る。たとえば、処理要素206は、算術および論理演算を行うように構成された1つまたは複数の算術論理ユニット(ALU)または他の回路を各々含み得る。
[0025]複数のデータポイントのうちの1つの上で動作すべき同じデータ並列コードの各個々の呼出しがスレッドであり、スレッドは、複数のデータポイント上で同じ命令を行うためにコンカレントに実行し得る。いくつかの例では、スレッドは作業項目としても知られ得る。処理ユニット202はスレッドを一緒にブロックにグループ化し得る。一般に、処理ユニット202は、同じデータ並列コードによって生まれるスレッドのすべてを1つまたは複数のブロックにグループ化し得る。いくつかの例では、ブロックはワークグループとしても知られ得る。いくつかの例では、単一のブロック中のスレッドのすべては、計算ユニット204のうちの1つの上で行われることに限定され得る。いくつかの例では、スレッドのブロックは、バリア動作の幅が指定されないか、またはグループ中のスレッドの数よりも小さいことを決定されなかった場合にバリア動作がグループ中の各スレッドに適用され得るスレッドのグループであり得る。したがって、スレッドのグループ中のスレッドがそのようなバリアに達した場合、そのスレッドは、スレッドがバリアの後に進むことを可能にされる前に、グループ中の各スレッドが同じくバリアに達するのを待たなければならないことがある。
[0026]処理ユニット202はブロック内のスレッドを1つまたは複数のワープ(warp)またはウェーブフロント(wavefront)にグループ化することができる。ウェーブフロントは計算ユニット204のためのスケジューリングの基本ユニットであり、一般にブロック中のスレッドのサブセットを含み得る。たとえば、512個のスレッドのブロックを仮定すれば、ウェーブフロントは32個のスレッドを含み得、ブロック中のスレッドは512/32=16個のワープにグループ化され得る。ウェーブフロントは、一般に、単一の計算ユニット(すなわち、計算ユニット204A)の処理要素206がウェーブフロント中のあらゆるスレッドを同時に処理することができるように、単一の計算ユニット中にある処理要素206と同数のスレッドを含み得る。
[0027]スレッドのウェーブフロントがデータの複数の要素に対して同じ命令を実行するので、ホスト220は、ウェーブフロントによって処理されるべきデータをデータのベクトルにベクトル化し得、そのベクトルを処理ユニット202に通信し得る。一般に、データは、単一のウェーブフロント中にあるスレッドと同数の要素を有するベクトルにグループ化される。言い換えれば、ウェーブフロント中のスレッドの数は、それがその上で動作するデータのベクトルの幅と同じである。したがって、ウェーブフロント中のスレッドの数は、ウェーブフロントのベクトル幅と呼ばれることがある。
[0028]上記で説明したように、ウェーブフロントは、単一の計算ユニット中にある処理要素206と同じ数またはそれよりも少ないスレッドを含んでいる。したがって、ウェーブフロントのスレッドのすべては、ウェーブフロント中のスレッドが、使用中の処理ユニットが同じウェーブフロント中の別のスレッドを処理し終えるのを待たなくてもよいので、同時に単一の計算ユニットの処理要素206によって並列に実行され得る。したがって、単一のウェーブフロントのスレッドは、単一のウェーブフロント内のスレッドを同期させるようにバリア動作が要求され得ないように実質的に並列に実行することを保証され得る。
[0029]計算ユニット204のうちの1つは、計算ユニット204の処理要素206を使用して並列に1つまたは複数のウェーブフロントを実行し得る。ブロックのスレッドが実行されるとき、ブロックのスレッドを同期させるためにバリア動作が使用され得る。上記で説明したように、バリア動作は、ブロックのすべてのスレッドがバリア動作を行われるまで待つようにブロックのスレッドが要求され得るように動作し得る。
[0030]シーケンサ208は、計算ユニット204の間のデータ並列コードの実行を管理およびスケジュールするように構成され得る。たとえば、シーケンサ208は、計算ユニット204上でスレッドのブロックとスレッドのウェーブフロントとの実行をスケジュールし得る。シーケンサ208はまた、スレッドのブロックを同期させるように構成され得る。たとえば、シーケンサ208は、それらのスレッドがバリア動作を行っており、実行するのを待っている他のスレッドが処理要素206によって処理されることを可能にするために、それのブロックの他のスレッドがそれらのそれぞれのバリア動作を行うのを待つ間アイドリングしている場合、処理要素206からスレッドをアンロードし得る。シーケンサ208はまた、ブロックのスレッドがすべてバリア動作を行ったと決定すると、アイドリングスレッドを処理要素206に再ロードし得る。
[0031]シーケンサ208は、決定された幅がグループ中のスレッドの総数よりも小さいグループ中のスレッドによって実行されるべきデータ並列コードに基づいて、多数のデータポイント上で同じデータ並列コードを実行しているスレッドのグループのためのバリア動作の幅を動的に決定し得る。グループは、いくつかの例では、スレッドのブロックであり得る。バリア動作の幅は、スレッドのいずれかがバリア動作に続く動作を実行することを可能にされる前にバリア動作に達しなければならないブロック中のスレッドの数であり得る。決定された幅がグループ中のスレッドの総数よりも小さいので、シーケンサ208は、バリア幅を決定することによって、グループ中のあらゆるスレッドがそれぞれのバリア動作に達しなかった場合でも、グループのスレッドがバリア動作に続く動作を実行することを可能にし得る。
[0032]シーケンサ208は、バリア動作より前および/またはバリア動作の後続の両方にグループ中のスレッドによって実行されるべきデータ並列コードに基づいて、スレッドのグループのためのバリア動作の幅を決定し得る。たとえば、上記のコードフラグメントに基づいて、シーケンサ208は、データ並列コードがバリア動作より前に32ptrアレイロケーションに書き込むことになることと、データ並列コードがバリア動作に続く32ptrアレイロケーションから読み出すことになることとを決定し得る。したがって、シーケンサは、特定のバリア動作のための32のバリア幅を決定し得る。
[0033]一例では、シーケンサ208は、バリア動作の動的に決定されたバリア幅を1つまたは複数の幅レジスタに記憶し得る。スレッドが、幅レジスタに記憶されたそれのバリア幅を有するバリア動作に達したこと応答して、1つまたは複数の幅レジスタ中の数は減分される。1つまたは複数の幅レジスタ中の数が0に達したことに応答して、バリア動作に達した後に待っているブロック中のスレッドは、実行を続けることを可能にされ得る。別の例では、シーケンサ208は、バリア動作の幅を示す数を記憶する幅レジスタと、ブロック中の他のスレッドがバリアに達するのを待っているスレッドの数を記憶する待機レジスタの両方を含み得る。スレッドがバリア動作に達したことに応答して、待機レジスタ中の数は増分される。待機レジスタ中の数が幅レジスタ中の数に等しいことに応答して、バリア動作に達した後に待っているブロック中のスレッドは、実行を続けることを可能にされ得る。
[0034]いくつかの例では、バリア幅を動的に決定することは、データ並列コードを含んでいるコンピュータプログラムの開発者が、様々な並列コンピューティングシステムにわたって実行し得るクロスプラットフォームデータ並列コードをより容易に書き込むことを可能にし得る。たとえば、いくつかの並列コンピューティングシステムは、バリアの幅がウェーブフロントのベクトル幅よりも小さい場合にバリア動作が不要であるように、単一のウェーブフロント中のあらゆるスレッドが同時に実行することができることを保証し得る。たとえば、計算ユニットが16個の処理要素を含んでいるなどの理由でウェーブフロントのためのベクトル幅が16である場合、16以下のバリア幅を有するバリア動作は不要であり得る。しかしながら、コンピュータプログラマーは、正確にその人のデータ並列コードがどの並列コンピューティングシステム上で動作するかを知らないことがあり、したがって、並列処理システムのための計算ユニットがいくつの処理要素を含んでいるかを知らないことがあるので、コンピュータプログラマーが、特定の並列コンピューティングシステムのためのウェーブフロントのベクトル幅よりも小さいバリア幅をハードコーディングする場合、そのデータ並列コードは、その特定の並列コンピューティングシステム上で動作するとき、外来バリア動作を行い得、データ並列コードの実行を減速し得る。対照的に、シーケンサ208は、バリア動作のためのバリア幅、ならびに特定の並列コンピューティングシステムのためのウェーブフロントのベクトル幅を決定し得、決定されたバリア幅が、データ並列コードがその上で実行する並列コンピューティングシステムのためのウェーブフロントのベクトル幅よりも小さい場合にそのバリア動作を行わないことを決定し得る。いくつかの例では、シーケンサ208は、ウェーブフロントのベクトル幅よりも大きいバリア幅を決定し得る。
[0035]バリア幅を動的に計算することはまた、動的制御フローの条件ステートメントがスレッドのグループ全体にわたって一様に評価しない条件ステートメント中でバリア動作の使用を可能にし得る。以下の擬似コードについて考える。
if (x < y) {
// 真ステートメント
barrier();
}
else {
// 偽ステートメント
}
[0036]一般に、スレッドのグループについて、あらゆるスレッドにおいて、条件文x<yが真として評価されるとは限らない場合、条件文x<yが真に評価する場合のみそれが行われるようなバリア動作を含むことは、x<yが偽として評価されるスレッドがバリア動作を決して行わないことになるので、グループ中のスレッドのグループにデッドロックさせ得る。対照的に、本開示では、シーケンサ208は、値xおよびyのセットについてx<yを事前に評価することによってなど、x<yが真として評価する回数に等しくなるようにバリアの幅を動的に設定し得る。したがって、バリアの幅が4として設定された場合、4つのスレッドがバリア動作を実行すると、作業項目のグループ中のスレッドの残りがバリア動作を実行するのを待つ必要なしに、バリアされたスレッドはバリアの後に続き得る。
[0037]シーケンサ208はまた、スレッドのサブグループを一緒に同期させるためにバリア動作のバリア幅を決定し得、ただし、サブグループのスレッドは、ブロックの連続するスレッドである。たとえば、16個のスレッドt0、t1、...、t15のブロックを仮定すれば、スレッドのバリア動作のためのバリア幅が4として指定された場合、ブロックの第1の4つのスレッドt0〜t3は一緒に同期し得、ブロックの第2の4つのスレッドt4〜t7は一緒に同期し得、4つのスレッドt8〜t11の第3のグループは一緒に同期し得、4つのスレッドt12〜t15の第4のグループは一緒に同期し得る。この例では、スレッドt0〜t3のグループ中の各スレッドは、グループ中のスレッドt0〜t3のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドt4〜t7のグループ中の各スレッドは、グループ中のスレッドt4〜t7のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドt8〜t11のグループ中の各スレッドは、グループ中のスレッドt8〜t11のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得、スレッドt12〜t15のグループ中の各スレッドは、グループ中のスレッドt12〜t15のすべてが、それの実行を進めることが可能になる前にバリア動作を実行するのを待つことのみを要求され得る。したがって、たとえば、スレッドt1、t8、t2、およびt3がバリア動作に達する第1の4つのスレッドである場合、スレッドt1、t2、およびt3は、16個のスレッドのブロックのうちの4つのスレッドがバリア動作に達したにもかかわらず、それらのスレッドt1、t2およびt3がバリア動作の後に実行を続けることを可能にされる前にスレッドt4がバリア動作に達するのを待つように要求され得る。
[0038]図3は、本開示のいくつかの態様による、動的バリア幅を使用するスレッドの同期を示す概念図である。図3に示されているように、図2に示されたシーケンサ208などのシーケンサは、スレッド302および304が一緒に同期させられ得ることと、スレッド306および308が一緒に同期させられ得ることとを決定し得る。したがって、シーケンサは、データ並列コードを並列に実行し得るスレッド302、304、306、および308のために2のバリア幅を決定し得る。したがって、スレッド302および304はスレッドのあるサブグループにグループ化され、スレッド306および308はスレッドの別のサブグループにグループ化され得る。時間t1において、スレッド306は、それの書込み動作を実行し終えており、バリア動作310に達する。しかしながら、それのサブグループ中のあらゆるスレッドが同じくそれのそれぞれの書込み動作を実行し終え、バリア動作に達したとは限らないので、スレッド306は、バリア動作310に後続の読み出し動作を実行する前に、サブグループ中の他のスレッド(すなわち、スレッド308)が同じく、それの書込み動作を実行し終え、バリア動作に達するまで待たなければならない。時間t2において、スレッド302は書込み動作を実行し終え、バリア動作312に達する。同様に、スレッド302をもつサブグループの他のメンバーであるスレッド304が同じく、まだ書込み動作を実行し終えておらず、バリア動作に達していないので、スレッド302は同じく、バリア動作312に後続のコードを実行する前に待たなければならない。時間t3において、スレッド304はバリア動作314に達する。スレッド302とスレッド304の両方がバリア動作312および314に達したので、スレッド302および304は、バリア動作314に続くそれぞれの読み出し動作を実行し得る。時間t4において、スレッド308はバリア動作316に達する。スレッド306とスレッド308の両方がバリア動作に達したので、スレッド306および308は、次に、それのそれぞれのバリア動作に続くそれぞれの読み出し動作を実行することを可能にされる。図3に見られるように、スレッドのグループ中のスレッドの総数よりも小さいバリア幅を設定することによって、スレッドは、バリアの後にはるかに急速に実行を再開することが可能であり得る。たとえば、スレッドのグループ中のスレッドの総数よりも小さいバリア幅を設定しないことによって、スレッド302、304、および306は、時間t1、t2、およびt3よりも遅い時間t4においてスレッド308がバリア動作316を実行するまで、それぞれのバリア動作310、312、および314を実行した後にアイドルのままになる。
[0039]バリア動作の幅を動的に決定することは、特に、低減されるべき数の集合のサイズがランタイムまで知られないとき、並列低減において有用であり得る。低減は、数の集合を加算する技法であり、並列低減は、データ並列コードが低減の要素を並列に加算するために実行することができる低減であり得る。図4は、本開示のいくつかの態様による、例示的な並列低減を示す概念図である。図4に示されているように、アレイ402は、一緒に加算されるべき8つの数の集合を含み得る。低減を行うべきデータ並列コードは、各作業項目がアレイ402の2つの連続する要素を一緒に加算するように実行し得る。したがって、並列低減の第1のパスでは、加算演算404A〜404D(「加算演算404」)は、8つの要素アレイ402を、加算演算404の各々から生じる4つの得られた和を含んでいる4つの要素アレイ406まで低減するためにアレイ402の要素のうちの2つを各々加算するように4つの並列スレッドを介して並列に実行し得る。
[0040]しかしながら、集合のサイズがランタイムにおいて未知であり得るので、データ並列コード中のバリア動作が並列低減を行うのに必要な正確なバリア幅をプログラマーがコンパイル時に知ることは不可能であり得る。たとえば、集合のサイズは、ユーザが8つの数、20個の数、または数の他のセットを入力し得るように、ユーザ入力に依存し得る。図4に示された特定の例では、図2に示されたシーケンサ208などのシーケンサは、アレイ402のサイズ(8)に基づいて、加算演算404を行うことに続く4つのスレッドによって行われるべきバリア動作のための4のバリア幅を決定し得る。
[0041]加算演算404を介した低減の第1のラウンドは、4つの得られた要素を含んでいるアレイ406を生成し得る。アレイ406の要素をさらに低減するために、加算演算408Aおよび408B(「加算演算408」)をお行うために2つのスレッドのみが必要とされ得る。したがって、シーケンサは、アレイ406のサイズ(4)に基づいて、加算演算408を行うことに続く2つのスレッドによって行われるべきバリア動作のために2のバリア幅を決定し得る。
[0042]加算演算408を介した低減の第2のラウンドは、2つの得られた要素を含んでいるアレイ410を生成し得る。アレイ410の要素をさらに低減するために、加算演算412を行うために単一のスレッドのみが必要とされ得る。したがって、シーケンサは、バリア動作が行われる必要がないと決定し得る。したがって、シーケンサは、加算演算412を行った後にコードにおいて指定されたバリア動作を無視することを決定し得る。
[0043]加算低減を行うためのデータ並列コードは、一般に、バリア動作がループ内に含まれるようにループとして書き込まれる。したがって、バリア動作の幅がコンパイル時に設定されるべきである場合、プログラマーが低減すべき集合中の要素の初期数を知っていると仮定すると、プログラマーは、加算演算の各セットの後に特定の幅のバリア動作を手動で挿入するようにループを開かなければならないことがある。対照的に、本例では、シンセサイザは、バリア動作の各反復についてバリア幅を動的に決定し得る。
[0044]図5は、本開示のいくつかの態様による、動的バリアを使用してスレッドを同期させることの例示的なプロセスを示すフローチャートである。図5に示されているように、図2に示されたシーケンサ208などのシーケンサは、図2に示されたホスト220などのホスト上で実行する、ホストに動作可能に結合された、図2に示された処理ユニット202などの処理ユニットによって実行されるべきデータ並列コードを含むコンピュータアプリケーションのランタイムにおいて、データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を動的に決定し、ここにおいて、バリア幅は、スレッドのグループ中のスレッドの総数よりも小さい(502)。図5の例では、スレッドのグループは64個のスレッドを含み得、シーケンサは32のバリア幅を決定し得る。したがって、64個のスレッドは、各々32個のスレッドの2つのサブグループを含み得、ただし、サブグループのスレッドはその同じサブグループの他のスレッドと同期される。第1の時間において、スレッドのグループの第1のサブグループの第1のスレッドは、バリアに達し(504)、第1のサブグループのスレッドの残りが同じくバリアに達するのを待ち得る。第2の時間において、スレッドのグループの第2のサブグループの第1のスレッドは、バリアに達し(506)、第2のサブグループのスレッドの残りが同じくバリアに達するのを待ち得る。
[0045]第3の時間において、第1のサブグループのすべてのスレッドはバリアに達する(508)。シーケンサは、スレッドのグループの第1のサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、第1のサブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループの第1のサブグループがそれぞれのバリア動作に続く1つまたは複数の計算ユニット上で実行することを可能にし、ここにおいて、スレッドのグループの第1のサブグループは、スレッドのグループ中のスレッドの総数よりも小さい(510)。
[0046]第4の時間において、第2のサブグループのすべてのスレッドはバリアに達する(512)。シーケンサは、スレッドのグループの第2のサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、第2のサブグループが、決定されたバリア幅と同じ数のスレッドを含み、スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、スレッドのグループの第2のサブグループがそれぞれのバリア動作に続く1つまたは複数の計算ユニット上で実行することを可能にし、ここにおいて、スレッドのグループの第2のサブグループは、スレッドのグループ中のスレッドの総数よりも小さい(514)。
[0047]いくつかの例では、バリア幅を決定することは、データ並列コードに少なくとも部分的に基づいてバリア動作のバリア幅を決定することを含み得る。いくつかの例では、バリア動作のバリア幅は、1つまたは複数のプロセッサのウェーブフロントのベクトル幅よりも大きい。いくつかの例では、シーケンサは、バリア動作のバリア幅が1つまたは複数のプロセッサのためのウェーブフロントのベクトル幅よりも小さい場合、バリア動作を行わないことをさらに決定し得る。いくつかの例では、バリア動作は条件ステートメント中に含まれ、条件ステートメントは、スレッドのグループ全体にわたって一様に評価しない。いくつかの例では、スレッドのグループのサブグループ中のスレッドは、スレッドのグループ中の連続するスレッドである。いくつかの例では、バリア動作はループ中に含まれる。いくつかの例では、シーケンサは、ループの各反復についてバリア動作のバリア幅を動的に決定し得、ここにおいて、決定されたバリア幅はループの少なくとも2つの反復中で異なる。
[0048]図6は、本開示の1つまたは複数の態様を実装するように構成され得るデバイスの一例を示すブロック図である。たとえば、図6にデバイス602を示す。デバイス602の例としては、限定はしないが、ビデオデバイス、メディアプレーヤ、セットトップボックス、携帯電話およびいわゆるスマートフォンなどのワイヤレスハンドセット、携帯情報端末(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどがある。
[0049]図6の例では、デバイス602は、ホスト610と、システムメモリ618と、処理ユニット620とを含み得る。ホスト610は、図2に示されたホスト220と同様であり得、処理ユニット620は、図2に示された処理ユニット202と同様であり得る。簡潔のために、ホスト610、システムメモリ618、および処理ユニット620は、図6に関してさらに説明しない。デバイス622はまた、ディスプレイプロセッサ624と、トランシーバモジュール626と、ユーザインターフェース628と、ディスプレイ630とを含み得る。トランシーバモジュール626とディスプレイプロセッサ624とは両方とも、ホスト610および/または処理ユニット620と同じ集積回路(IC)の一部であり得るか、両方ともホスト610および/または処理ユニット620を含む1つまたは複数のICの外部にあり得るか、あるいはホスト610および/または処理ユニット620を含むICの外部にあるIC中に形成され得る。
[0050]デバイス622は、明快のために図6に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス622は、デバイス622がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも図6に示されていないスピーカーおよびマイクロフォンを含み、またはデバイス622がメディアプレーヤである例においてスピーカーを含み得る。デバイス622はまた、ビデオカメラを含み得る。さらに、デバイス622に示された様々なモジュールおよびユニットは、デバイス622のあらゆる例において必要であるとは限らない。たとえば、ユーザインターフェース628およびディスプレイ630は、デバイス622が、デスクトップコンピュータ、あるいは外部ユーザインターフェースまたはディスプレイとインターフェースする能力がある他のデバイスである例において、デバイス622の外部にあり得る。
[0051]ユーザインターフェース628の例には、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース628はまた、タッチスクリーンであり得、ディスプレイ630の一部として組み込まれ得る。トランシーバモジュール626は、デバイス622と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール626は、ワイヤードまたはワイヤレス通信のための変調器、復調器、増幅器および他のそのような回路を含み得る。
[0052]いくつかの例では、処理ユニット620は、十分に形成された画像をシステムメモリ618に記憶し得るGPUであり得る。ディスプレイプロセッサ624はシステムメモリ618から画像を検索し、ディスプレイ630のピクセルに画像を表示するために照明させる値を出力し得る。ディスプレイ630は、処理ユニット620によって生成された画像コンテンツを表示するデバイス622のディスプレイであり得る。ディスプレイ630は、液晶ディスプレイ(LCD)、有機発光ダイオードディスプレイ(OLED)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、または別のタイプのディスプレイデバイスであり得る。
[0053]1つまたは複数の例において、前述の機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装する場合、機能は、1つまたは複数の命令またはコードとして、コンピュータ可読媒体上に記憶されるか、またはコンピュータ可読媒体を介して送信され得る。コンピュータ可読媒体はコンピュータデータ記憶媒体を含み得る。データ記憶媒体は、本開示で説明した技法の実装のための命令、コードおよび/またはデータ構造を取り出すために1つまたは複数のコンピュータあるいは1つまたは複数のプロセッサによってアクセスされ得る任意の利用可能な媒体であり得る。限定ではなく例として、そのようなコンピュータ可読媒体は、RAM、ROM、EEPROM(登録商標)、CD−ROM、あるいは他の光ディスクストレージ、磁気ディスクストレージまたは他の磁気記憶デバイス、もしくは命令またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータによってアクセスされ得る任意の他の媒体を備えることができる。データ記憶媒体に記憶されたソフトウェアは、同軸ケーブル、光ファイバーケーブル、ツイストペア、デジタル加入者回線(DSL)、または赤外線、無線、およびマイクロ波などのワイヤレス技術を使用して、ウェブサイト、サーバ、または他のリモートソースから送信され得、その場合、同軸ケーブル、光ファイバーケーブル、ツイストペア、DSL、または赤外線、無線、およびマイクロ波などのワイヤレス技術は、媒体の定義に含まれる。本明細書で使用するディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピー(登録商標)ディスク(disk)およびBlu−ray(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含めるべきである。
[0054]コードは、1つまたは複数のデジタル信号プロセッサ(DSP)などの1つまたは複数のプロセッサ、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路によって実行され得る。したがって、本明細書で使用する「プロセッサ」という用語は、前述の構造、または本明細書で説明した技法の実装に好適な任意の他の構造のいずれかを指し得る。さらに、いくつかの態様では、本明細書で説明した機能は、専用のハードウェアモジュールおよび/またはソフトウェアモジュール内に与えられ得る。また、本技法は、1つまたは複数の回路または論理要素中に十分に実装され得る。
[0055]本開示の技法は、ワイヤレスハンドセット、集積回路(IC)、またはICのセット(たとえば、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示する技法を行うように構成されたデバイスの機能的態様を強調するために様々な構成要素、モジュール、またはユニットについて説明したが、それらの構成要素、モジュール、またはユニットを、必ずしも異なるハードウェアユニットによって実現する必要があるとは限らない。むしろ、上記で説明したように、様々なユニットが、好適なソフトウェアおよび/またはファームウェアとともに、上記で説明した1つまたは複数のプロセッサを含めて、コーデックハードウェアユニットにおいて組み合わせられるか、または相互動作ハードウェアユニットの集合によって与えられ得る。
[0056]様々な例について説明した。これらおよび他の例は以下の特許請求の範囲内に入る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[C1]
スレッドを同期させるための方法であって、前記方法は、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、方法。
[C2]
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
C1に記載の方法。
[C3]
前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
C1に記載の方法。
[C4]
前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
C1に記載の方法。
[C5]
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
C1に記載の方法。
[C6]
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
C1に記載の方法。
[C7]
前記バリア動作は、ループ中に含まれる、
C1に記載の方法。
[C8]
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、
C7に記載の方法。
[C9]
スレッドを同期させるためのコンピューティングシステムであって、
ホストと、
前記ホストに動作可能に結合された処理ユニットと、
シーケンサモジュールと
を備え、前記シーケンサモジュールは、
前記処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を行うように構成される、コンピューティングシステム。
[C10]
前記バリア幅を決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
C9に記載のコンピューティングシステム。
[C11]
前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
C9に記載のコンピューティングシステム。
[C12]
前記シーケンサモジュールは、
前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することを行うようにさらに構成される、
C9に記載のコンピューティングシステム。
[C13]
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
C9に記載のコンピューティングシステム。
[C14]
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
C9に記載のコンピューティングシステム。
[C15]
前記バリア動作は、ループ中に含まれる、
C9に記載のコンピューティングシステム。
[C16]
前記シーケンサモジュールは、
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することを行うようにさらに構成され、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、
C15に記載のコンピューティングシステム。
[C17]
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段、ここにおいて、前記バリア幅が前記スレッドのグループ中のスレッドの総数よりも小さい、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にするための手段、ここにおいて、前記スレッドのグループの前記サブグループが、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える、並列処理装置。
[C18]
前記決定するための手段は、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定するための手段をさらに備える、
C17に記載の並列処理装置。
[C19]
前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
C17に記載の並列処理装置。
[C20]
前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定するための手段をさらに備える、
C17に記載の並列処理装置。
[C21]
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
C17に記載の並列処理装置。
[C22]
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
C17に記載の並列処理装置。
[C23]
前記バリア動作は、ループ中に含まれる、
C17に記載の並列処理装置。
[C24]
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定するための手段をさらに備え、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、
C23に記載の並列処理装置。
[C25]
少なくとも1つのプロセッサによって実行されると、前記少なくとも1つのプロセッサに、
ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記スレッドのグループ中のスレッドは、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを実行する、と、
前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く前記1つまたは複数の計算ユニット上でそれぞれの動作を実行することを可能にすること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と
を備える動作を行わせる命令を含む、コンピュータ可読記憶媒体。
[C26]
前記決定することは、
前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
C25に記載のコンピュータ可読記憶媒体。
[C27]
前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい、
C25に記載のコンピュータ可読記憶媒体。
[C28]
前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントよりも小さい場合、前記バリア動作を行わないことを決定することをさらに備える、
C25に記載のコンピュータ可読記憶媒体。
[C29]
前記バリア動作は、条件ステートメント中に含まれ、前記条件ステートメントは、前記スレッドのグループ全体にわたって一様に評価しない、
C25に記載のコンピュータ可読記憶媒体。
[C30]
前記スレッドのグループの前記サブグループ中のスレッドは、前記スレッドのグループ中の連続するスレッドである、
C25に記載のコンピュータ可読記憶媒体。
[C31]
前記バリア動作は、ループ中に含まれる、
C25に記載のコンピュータ可読記憶媒体。
[C32]
前記ループの各反復について前記バリア動作の前記バリア幅を動的に決定することをさらに備え、前記決定されたバリア幅が前記ループの少なくとも2つの反復中で異なる、
C31に記載のコンピュータ可読記憶媒体。

Claims (16)

  1. スレッドを同期させるための方法であって、前記方法は、
    ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
    前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、と、
    前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く、前記ループのそれぞれの反復において、それぞれの動作を実行すること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
    前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
    を備える、方法。
  2. 前記バリア幅を決定することは、
    前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
    請求項1に記載の方法。
  3. 前記バリア動作のバリア幅が前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
    請求項1に記載の方法。
  4. 前記スレッドのグループの前記サブグループ中のスレッドは、並列に実行される
    請求項1に記載の方法。
  5. スレッドを同期させるためのコンピューティングシステムであって、
    ホストと、
    前記ホストに動作可能に結合された処理ユニット、ここにおいて、前記処理ユニットは、複数のプロセッサのうちの少なくとも1つを備える、と、
    シーケンサモジュールと
    を備え、前記シーケンサモジュールは、
    前記処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
    前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、と、
    前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く、前記ループのそれぞれの反復において、それぞれの動作を実行すること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
    前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
    を行うように構成される、コンピューティングシステム。
  6. 前記バリア幅を決定することは、
    前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
    請求項に記載のコンピューティングシステム。
  7. 前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
    請求項に記載のコンピューティングシステム。
  8. 前記スレッドのグループの前記サブグループ中のスレッドは、並列に実行される
    請求項に記載のコンピューティングシステム。
  9. ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定するための手段、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記バリア動作は、ループ中に含まれる、と、
    前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定するための手段、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、と、
    前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く、前記ループのそれぞれの反復において、それぞれの動作を実行するための手段、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
    前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定するための手段と
    を備える、並列処理装置。
  10. 前記バリア幅を決定するための手段は、
    前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定するための手段をさらに備える、
    請求項に記載の並列処理装置。
  11. 前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定するための手段をさらに備える、
    請求項に記載の並列処理装置。
  12. 前記スレッドのグループの前記サブグループ中のスレッドは、並列に実行される
    請求項に記載の並列処理装置。
  13. 少なくとも1つのプロセッサによって実行されると、前記少なくとも1つのプロセッサに、
    ホストに動作可能に結合された処理ユニットによって実行されるべきデータ並列コードを含む、前記ホスト上で実行するアプリケーションのランタイムにおいて、前記データ並列コードを各々実行するグループスレッドのためのバリア動作のバリア幅を決定すること、ここにおいて、前記バリア幅は、前記スレッドのグループ中のスレッドの総数よりも小さく、前記スレッドのグループ中のスレッドは、前記処理ユニットの1つまたは複数の計算ユニット上で前記データ並列コードを実行し、前記バリア動作は、ループ中に含まれる、と、
    前記ループの各反復について前記バリア動作の前記バリア幅を動的に再決定すること、ここにおいて、前記決定されたバリア幅は、前記ループの少なくとも2つの反復中で異なる、と、
    前記スレッドのグループのサブグループ中の各スレッドがそれぞれのバリア動作を実行したことに応答して、前記サブグループが、前記決定されたバリア幅と同じ数のスレッドを含み、前記スレッドのグループ中の他のスレッドがバリア動作を実行するのを待つことなしに、前記スレッドのグループの前記サブグループが前記それぞれのバリア動作に続く、前記ループのそれぞれの反復において、それぞれの動作を実行すること、ここにおいて、前記スレッドのグループの前記サブグループは、前記スレッドのグループ中のスレッドの前記総数よりも小さい、と、
    前記バリア動作の前記バリア幅が前記1つまたは複数の計算ユニットのためのウェーブフロントのベクトル幅よりも小さい場合、前記バリア動作を行わないことを決定することと
    を備える動作を行わせる命令を含む、非一時的なコンピュータ可読記憶媒体。
  14. 前記バリア幅を決定することは、
    前記データ並列コードに少なくとも部分的に基づいて前記バリア動作の前記バリア幅を決定することを備える、
    請求項13に記載のコンピュータ可読記憶媒体。
  15. 前記バリア動作の前記バリア幅は、前記1つまたは複数の計算ユニットのウェーブフロントのベクトル幅よりも大きい場合、前記バリア動作を行うことを決定することをさらに備える、
    請求項13に記載のコンピュータ可読記憶媒体。
  16. 前記スレッドのグループの前記サブグループ中のスレッドは、並列に実行される
    請求項13に記載のコンピュータ可読記憶媒体。
JP2016524424A 2013-08-13 2014-08-07 動的幅計算を用いたバリア同期 Active JP6130065B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US13/965,818 2013-08-13
US13/965,818 US9218223B2 (en) 2013-08-13 2013-08-13 Barrier synchronization with dynamic width calculation
PCT/US2014/050143 WO2015023509A1 (en) 2013-08-13 2014-08-07 Barrier synchronization with dynamic width calculation

Publications (2)

Publication Number Publication Date
JP2016525746A JP2016525746A (ja) 2016-08-25
JP6130065B2 true JP6130065B2 (ja) 2017-05-17

Family

ID=51422147

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016524424A Active JP6130065B2 (ja) 2013-08-13 2014-08-07 動的幅計算を用いたバリア同期

Country Status (8)

Country Link
US (1) US9218223B2 (ja)
EP (2) EP3033679A1 (ja)
JP (1) JP6130065B2 (ja)
KR (1) KR101724247B1 (ja)
CN (1) CN105453045B (ja)
BR (1) BR112016002637B1 (ja)
CA (1) CA2917609C (ja)
WO (1) WO2015023509A1 (ja)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9916162B2 (en) * 2013-12-26 2018-03-13 Intel Corporation Using a global barrier to synchronize across local thread groups in general purpose programming on GPU
DE102016203965A1 (de) * 2016-03-10 2017-09-14 Robert Bosch Gmbh Überwachung eines Rechensystems
US10324730B2 (en) * 2016-03-24 2019-06-18 Mediatek, Inc. Memory shuffle engine for efficient work execution in a parallel computing system
US10223436B2 (en) * 2016-04-27 2019-03-05 Qualcomm Incorporated Inter-subgroup data sharing
US20170357705A1 (en) * 2016-06-08 2017-12-14 Knuedge Incorporated Performing a synchronization operation on an electronic device
US10318355B2 (en) * 2017-01-24 2019-06-11 Oracle International Corporation Distributed graph processing system featuring interactive remote control mechanism including task cancellation
US11353868B2 (en) * 2017-04-24 2022-06-07 Intel Corporation Barriers and synchronization for machine learning at autonomous machines
US10990453B2 (en) * 2018-04-12 2021-04-27 Advanced Micro Devices, Inc. Improving latency by performing early synchronization operations in between sets of program operations of a thread
GB2574817B (en) * 2018-06-18 2021-01-06 Advanced Risc Mach Ltd Data processing systems
JP7159696B2 (ja) * 2018-08-28 2022-10-25 富士通株式会社 情報処理装置,並列計算機システムおよび制御方法
US11449339B2 (en) * 2019-09-27 2022-09-20 Red Hat, Inc. Memory barrier elision for multi-threaded workloads
US11409579B2 (en) * 2020-02-24 2022-08-09 Intel Corporation Multiple independent synchonization named barrier within a thread group
KR102501187B1 (ko) * 2020-04-03 2023-02-17 서울대학교산학협력단 배리어 구현 방법 및 시스템
US11461130B2 (en) 2020-05-26 2022-10-04 Oracle International Corporation Methodology for fast and seamless task cancelation and error handling in distributed processing of large graph data
US11204774B1 (en) * 2020-08-31 2021-12-21 Apple Inc. Thread-group-scoped gate instruction
GB2604150B (en) * 2021-02-26 2023-06-14 Advanced Risc Mach Ltd Data processing systems
US20220342721A1 (en) * 2021-04-22 2022-10-27 EMC IP Holding Company, LLC System and Method for Efficient Snapshots Barrier Mechanism for System With Presorted Container-Based Log

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6574725B1 (en) 1999-11-01 2003-06-03 Advanced Micro Devices, Inc. Method and mechanism for speculatively executing threads of instructions
JP3571976B2 (ja) 1999-11-08 2004-09-29 富士通株式会社 デバッグ装置及び方法並びにプログラム記録媒体
US7512950B1 (en) 2003-08-14 2009-03-31 Sun Microsystems, Inc. Barrier synchronization object for multi-threaded applications
JP4276028B2 (ja) * 2003-08-25 2009-06-10 株式会社日立製作所 マルチプロセッサシステムの同期方法
US7937709B2 (en) * 2004-12-29 2011-05-03 Intel Corporation Synchronizing multiple threads efficiently
US7865911B2 (en) * 2005-11-08 2011-01-04 Microsoft Corporation Hybrid programming
US7555607B2 (en) 2005-11-10 2009-06-30 Hewlett-Packard Development Company, L.P. Program thread syncronization for instruction cachelines
US8484516B2 (en) * 2007-04-11 2013-07-09 Qualcomm Incorporated Inter-thread trace alignment method and system for a multi-threaded processor
US8966488B2 (en) 2007-07-06 2015-02-24 XMOS Ltd. Synchronising groups of threads with dedicated hardware logic
US8866827B2 (en) * 2008-06-26 2014-10-21 Microsoft Corporation Bulk-synchronous graphics processing unit programming
JP5239751B2 (ja) * 2008-10-31 2013-07-17 富士通株式会社 ノード間同期装置、ノード間同期方法およびノード間同期プログラム
JP5447807B2 (ja) * 2009-08-07 2014-03-19 株式会社日立製作所 バリア同期方法及び計算機
US8539204B2 (en) 2009-09-25 2013-09-17 Nvidia Corporation Cooperative thread array reduction and scan operations

Also Published As

Publication number Publication date
CA2917609A1 (en) 2015-02-19
US9218223B2 (en) 2015-12-22
CN105453045B (zh) 2017-04-12
CN105453045A (zh) 2016-03-30
JP2016525746A (ja) 2016-08-25
KR101724247B1 (ko) 2017-04-06
CA2917609C (en) 2017-10-24
EP3033679A1 (en) 2016-06-22
KR20160036067A (ko) 2016-04-01
BR112016002637A2 (pt) 2017-08-01
WO2015023509A1 (en) 2015-02-19
BR112016002637B1 (pt) 2023-03-14
EP3964951A1 (en) 2022-03-09
BR112016002637A8 (pt) 2022-08-23
US20150052537A1 (en) 2015-02-19

Similar Documents

Publication Publication Date Title
JP6130065B2 (ja) 動的幅計算を用いたバリア同期
EP2820540B1 (en) Execution model for heterogeneous cpu-gpu computing
JP6329274B2 (ja) コンパイラ最適化のためのメモリ参照メタデータ
KR101707289B1 (ko) 그래픽 병렬 처리 유닛에 대한 버퍼 관리
US9996394B2 (en) Scheduling accelerator tasks on accelerators using graphs
JP5792402B2 (ja) グラフィックス処理ユニット上でのグラフィックスアプリケーションおよび非グラフィックスアプリケーションの実行
JP6062506B2 (ja) 汎用グラフィクス処理装置における計算リソースパイプライン化
JP2018517986A (ja) 階層的サブルーチン情報を含む中間コードからのオブジェクトコードの生成
KR101941832B1 (ko) 그래픽스 프로세싱 유닛들에 대한 셰이더들에서의 균일한 프레디케이트들
CN111930428B (zh) 一种条件分支指令的融合方法、装置及计算机存储介质
US20140173564A1 (en) Test scope determination based on code change(s)
JP6952138B2 (ja) チップに基づく計算機能を生成する方法、装置、デバイス、および記憶媒体
US20160055029A1 (en) Programmatic Decoupling of Task Execution from Task Finish in Parallel Programs
US20190220257A1 (en) Method and apparatus for detecting inter-instruction data dependency
US10996960B1 (en) Iterating single instruction, multiple-data (SIMD) instructions
WO2021037124A1 (zh) 一种任务处理的方法以及任务处理装置
US10877926B2 (en) Method and system for partial wavefront merger
US9489246B2 (en) Method and device for determining parallelism of tasks of a program
JP2017527014A (ja) 算術論理ユニットにおいて使用するためのベクトルスケーリング命令
US11593114B1 (en) Iterating group sum of multiple accumulate operations
Mytkowicz et al. Waiting for Godot? the right language abstractions for parallel programming should be here soon: the multicore transformation (Ubiquity symposium)
Mytkowicz The Multicore Transformation

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160415

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160415

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20160415

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20160622

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20160712

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161011

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20161206

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170306

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20170314

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20170412

R150 Certificate of patent or registration of utility model

Ref document number: 6130065

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250