JP6411477B2 - Gpu発散バリア - Google Patents

Gpu発散バリア Download PDF

Info

Publication number
JP6411477B2
JP6411477B2 JP2016518666A JP2016518666A JP6411477B2 JP 6411477 B2 JP6411477 B2 JP 6411477B2 JP 2016518666 A JP2016518666 A JP 2016518666A JP 2016518666 A JP2016518666 A JP 2016518666A JP 6411477 B2 JP6411477 B2 JP 6411477B2
Authority
JP
Japan
Prior art keywords
warp
warps
thread
gpu
threads
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
JP2016518666A
Other languages
English (en)
Other versions
JP2016532180A (ja
JP2016532180A5 (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 JP2016532180A publication Critical patent/JP2016532180A/ja
Publication of JP2016532180A5 publication Critical patent/JP2016532180A5/ja
Application granted granted Critical
Publication of JP6411477B2 publication Critical patent/JP6411477B2/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/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • 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]
    • 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/3888Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel
    • 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/3888Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple threads [SIMT] in parallel
    • G06F9/38885Divergence aspects
    • 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
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)
  • Image Processing (AREA)

Description

[0001]本開示は、グラフィックス処理に関し、より詳細には、グラフィックス処理ユニット(GPU)上のスレッドの実行を管理するための技法に関する。
[0002]最近、いわゆる汎用GPU(GPGPU)への動きがあった。グラフィックスレンダリングを実施する従来のGPUとは異なり、GPGPUは、「カーネル」と呼ばれることが多い汎用タスクまたはプログラムを実行するように構成され得る。いくつかのタイプのタスクは、中央処理(CPU)またはGPUなどのプロセッサの特別なタイプにより好適な場合がある。CPUは、より多くの分岐、ジャンプ、および条件付きロジックを有するタスクにより好適な場合があり、一方GPUは、高度な並列タスクおよび/または多くの浮動小数点計算を有するタスクに好適な場合がある。多くのGPUがSIMDハードウェアアーキテクチャを有するので、GPUは、SIMD(単一命令多重データ)命令を実行する機能も含む場合がある。GPUがSIMD命令を実行するとき、GPUは、複数のデータ値に、命令により示される同じ演算を実行することができる。典型的には、GPUは、SIMD命令により示される演算を並列に実行することが可能な、複数の実行ユニットを有する。
[0003]本開示の技法は、グラフィックス処理ユニット(GPU)上で実行するスレッド間の発散を減少させるための技法を提供する。GPUは、「発散バリア」命令と呼ばれる命令へのサポートを含むことができる。発散バリア命令は、スレッドが同じ命令を実行しており、そのことによって、GPU性能を改善するように、発散したスレッドを、複数のワープから新しいワープへとグループ化することを試みる。
[0004]一例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、式が真である対応するスレッドを有する各ワープの実行を休止することと、式が真である複数のワープの各々について、アクティブなスレッドの数を決定することと、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることと、複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップすることと、式が真である複数のワープのうちの少なくとも1つの実行を再開することとを備える方法を記載する。
[0005]別の例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定し、式が真である対応するスレッドを有する各ワープの実行を休止し、式が真である複数のワープの各々について、アクティブなスレッドの数を決定し、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートし、複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップし、式が真である複数のワープのうちの少なくとも1つの実行を再開するように構成される、メモリと少なくとも1つのプログラム可能なプロセッサとを含むデバイスを記載する。
[0006]別の例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、式が真である対応するスレッドを有する各ワープの実行を休止するための手段と、式が真である複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートするための手段と、複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、式が真である複数のワープのうちの少なくとも1つの実行を再開するための手段とを含む装置を記載する。
[0007]別の例では、本開示は、実行されると、少なくとも1つのプログラム可能なプロセッサに、式が真である複数のワープのうちの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定させ、複数のワープのうちの各ワープを、各ワープの関連する発散バリアに基づいて複数の圧縮プールへとグループ化させる命令を記憶する、非一時的コンピュータ可読記憶媒体を記載する、ここにおいて、少なくとも1つのプロセッサに複数のワープをソートさせる命令が、少なくとも1つのプロセッサに、複数の圧縮プールのうちの同じものに属する複数のワープをソートさせる命令を備え、ここにおいて、第1のワープおよび第2のワープが、複数の圧縮プールのうちの同じものに属するワープを備える、ここにおいて、少なくとも1つのプロセッサに、条件が真である複数のワープのうちの少なくとも1つの実行を再開させる命令が、同じ1つの圧縮プールの少なくとも1つのワープの実行を再開することを備える。
[0008]本開示の1つまたは複数の例の詳細は、添付図面および下の説明の中に記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに請求項から明らかであろう。
[0009]本開示の技法にしたがうGPU発散バリア命令の実行をサポートできる例示のコンピューティングデバイスを図示するブロック図。 [0010]本開示の技法にしたがう複数の処理要素上で実行するワープを図示するブロック図。 [0011]本開示の技法にしたがう各ワープ内のアクティブなスレッドの数に基づいて、ワープをソートすることを図示する概念図。 [0012]1つのワープからのアクティブなスレッドを別のワープからの非アクティブなスレッドとスワップするための技法を図示する概念図。 [0013]本開示の技法にしたがう複数の発散バリア命令を取り扱うための技法を図示する概念図。 [0014]本開示の技法にしたがう発散バリア命令を実行するための技法を図示する流れ図。
[0015]本開示は、グラフィックス処理ユニット(GPU)上で実行するスレッドの発散を減少させるための技法に向けられる。GPUは、処理要素(PE)と呼ばれる複数の実行ユニットを含むことができる。「カーネル」と呼ばれるプログラムは、GPUの1つまたは複数のPE上で実行することができる。アプリケーションは、カーネルを、GPUの仕事の基本ユニットを構成する複数のスレッドに分割することができる。GPUスケジューラは、スレッドを一緒に、「ワープ」と呼ばれるスレッドグループへとさらにグループ化することができる。ワープは、あるグラフィックスアーキテクチャ上で、たとえば32スレッドといった、一定の数のスレッドを含むことができる。
[0016]GPUのためのドライバまたはスケジューラが、GPU上でカーネルを実行するスレッドを作り出す。スレッドは、GPU上で処理されるデータの基本ユニットであり、CPUスレッドと混同されるべきでない。スケジューラは、各スレッドをGPUの実行ユニットに割り当てることができる。処理要素(「PE」)またはシェーダとも呼ばれる実行ユニットは、複数のデータ値上の同じ命令の並列実行が可能なSIMDユニットである。
[0017]一般的に、ワープの各スレッドは、同じ命令を実行する。プログラムカウンタ(PC)は、各スレッドが実行するべき命令のメモリアドレスを記憶する。一般的に、ワープのスレッドの各々について、単一のPCが存在することができる。各ワープについて単一のPCを有することが、スレッドの各々が異なる命令を実行する必要がない限り、スレッドの各々を同時に実行することを可能にする。
[0018]今や多くのGPUが、たとえば、分岐、ジャンプ、goto、および他のフロー制御命令を実行するといった、フロー制御命令を実行する機能を含む。フロー制御命令は、多くの方法で、プログラム実行のフローを変えることができる。フロー制御命令なしのプログラムまたはカーネル中では、PEは、カーネルの命令を始めから終わりまで実行することができる。PEが命令を実行することを終えた後、GPUは、PCの値をメモリ中の次の命令のアドレスに(典型的には、PC値を1だけ増分することにより)設定し、PEが次の命令を実行する。プログラムが、その点で実行が終了する出口点に達するまで、プログラムを実行するプロセスは、この方式でフロー制御命令なしのプログラムを継続する。
[0019]フロー制御命令を実行することが、PEに、増分したPC値以外のアドレスで、後続の命令を実行させることができる。増分したPC値のアドレスで後続の命令を実行する代わりに、フロー制御命令を実行するPEは、サブルーチンのアドレスなど、異なるPCアドレスを有する後続の命令を実行することができる。したがって、フロー制御命令は、プログラムの実行「フロー」を変えるといわれる。
[0020]フロー制御命令の例は、サブルーチン呼出し、分岐、戻り、ジャンプなどを含む。様々な例では、PEが「ジャンプ」する命令アドレス、すなわち、PCに割り当てられるアドレスは、ランタイムにおけるスレッド間で変わるデータの値に基づくことができる。フロー制御命令は、各PEが別個に評価するブール式にやはり関連され得る。ブール式は、真または偽のいずれかに評価するブール値を生成する式である。ブール式は、「and」、「or」、「not」、「排他的or(XOR)」などのブール演算子を含むことができる。ブール式は、「よりも大きい」、「未満」、「よりも」、「等しい」、「等しくない」、「以上」、「以下」などの算術的検査をやはり含むことができる。ブール式の真偽は、1つのスレッドから別のスレッドで変わるデータまたは値に依存することができる。
[0021]したがって、1つのスレッドが、同じワープ内の別のスレッドと異なる命令にジャンプして実行することが可能となることができる。しかし、上に述べたように、ワープごとにただ1つのPCしかない。ワープのうちの2つ以上のスレッドが異なる命令を実行する状態は、「発散」と呼ばれる。発散が発生すると、いくつかの組のスレッドは、同じ命令を実行し続ける場合がある。しかし、同様に、異なる命令を実行する複数の組のスレッドが存在する場合がある。
[0022]スレッド発散の例として、ワープの第1のスレッドおよび第2のスレッドが、「if−else」文またはループ文などのフロー制御命令を実行する場合がある。第1のスレッドが実行する後続の命令は、第1のスレッドのレジスタに記憶されるデータの値に基づく場合がある。同様に、第2のスレッドの後続の命令は、第2のスレッドのレジスタに記憶されるデータの値に基づく場合がある。第1のスレッドと第2のスレッドが異なるレジスタデータを有する場合、第1のスレッドと第2のスレッドは、異なる命令アドレスに関連する、異なる後続の命令にジャンプする可能性がある。
[0023]ワープのスレッドが発散である場合、スレッドは、「if−else」文などの、制御フローブロックの異なる分岐をとる可能性がある。ループ文の場合、ワープのスレッドは、たとえばループの異なる数の繰返しを実行した後、異なるときにループ文を抜け出る可能性もある。
[0024]たとえば、if−else文の異なる分岐をとること、またはループの異なる数の繰返しを実施することに起因して、ワープのスレッドが発散になると、GPUは、発散により引き起こされる異なる実行経路の各々を直列化する。すなわち、GPUは、「アクティブ」であるスレッドを決定して、同じ命令を実行する。スレッドが実行を終えるまで、または下でより詳細に議論される、発散バリア命令などのバリアに達するまで、アクティブなスレッドは、各スレッドに関連するPE上で実行し続ける。
[0025]直列化中に、GPUは、やはり、現在は実行していないスレッドを決定し、それらの非アクティブなスレッドおよびそれらに関連するPEをアイドルに設定する。PEがアイドルに設定されると、非アクティブなスレッドは実行を留意し、このことがGPUの性能に害を与える。いくつかの場合、発散したスレッドがさらに発散する、すなわち、複数の「レベル」または「ネストした発散」が存在する可能性がある。ネストした発散に対処するために、GPUは、ネストした分岐およびループを追跡するために、集束スタックを使用する。GPUは、発散の最も深いまたは最も内側の層を最初に取り扱い、実行が完了または休止するまで、発散の最も深いレベルを有するスレッドを実行する。GPUは、次いで、集束スタックから発散のそのレベルを取り除き、集束スタック上の最も内側の残りのスレッドを実行して、集束素テックから完了したスレッドを取り除くプロセスを繰り返す。一度スレッドが分岐またはループを実行することを終了すると、GPUは、もはや発散でないワープを形成するために、スレッドを一緒に戻して再結合または集束することができる。
[0026]本開示の技法は、「発散バリア」命令と呼ばれる、GPUがサポートする命令を導入する。様々な例では、アプリケーションプログラミングインターフェース(API)が、発散バリア命令についてのサポートを含むことができる。そのようなAPIは、オープンコンピュート言語(OpenCL)、オープングラフィックス言語(OpenGL)、およびマイクロソフトDirectX APIを含むことができる。GPUを特定のAPIでプログラムするとき、プログラマは、発散が著しく性能に影響を及ぼす可能性のあるコードポイントにおいて、GPUに発散バリア命令を実行させる、発散バリア機能呼出しを挿入することができる。GPUドライバまたはコンパイラが、発散が著しく性能に影響を及ぼす可能性のあるコードポイントを自動的に検出することもでき、それらのコードポイントに発散バリア命令を挿入することができる。
[0027]CPUは、次いで、実行のために、GPUに発散バリア命令を含むカーネルのコードを送信する。GPUは、次いで、それが発散バリア命令に遭遇するまで、カーネルコードを実行する。各発散バリア命令は、GPUにブール式を評価させる。GPUがブール式を真と評価する場合、GPUは、ワープの実行を休止する。GPUは、別のワープにスイッチして、別のワープの実行を開始する。GPUは、(たとえば、発散バリア命令を実行することに起因して)カーネルのすべてのワープを実行することを終了する、または休止されるのいずれかとなるまで、ワープを実行するプロセスを継続する。一度、すべてのワープが実行を終了する、または休止されると、GPUは、発散バリア命令を実行することの結果として現在休止されるワープ間の発散を解消しようと試みる。
[0028]GPUが発散バリア命令を実行してワープの実行を休止すると、GPUは、発散バリア命令を実行したことに起因して現在休止されるワープの待ち行列の中にワープを挿入する。待ち行列の中に配置される際に、GPUは、挿入ソート法を使用して各ワープの中のアクティブなスレッドの数に基づいて待ち行列の中のワープをソートし、挿入ソート法を使用して待ち行列の中の休止ワープの各々をソートする。すべてのワープしたが休止されて待ち行列の中でソートされた(または、終了された)後、GPUは、次いで、カーネルを実行するワープのスレッド間の発散を解消しようと試みる。ワープのスレッド間の発散を解消するプロセスは、「スレッド圧縮」と呼ばれる。
[0029]スレッド圧縮中、GPUは、より多くの非アクティブなスレッドを有する現在アクティブなワープを、より多くのアクティブなスレッドを有するワープからの非アクティブなスレッドとスワップすることにより、発散がない、または発散がより少ないスレッドを有するワープを形成するように試みる。GPUは、異なるワープからのスレッドをスワップするときに交換されるデータ量を最小化するために、ワープソート待ち行列を使用する。新しいワープの形成をもたらすGPUスレッド圧縮中に、GPUは、すべてのアクティブなスレッドを有するワープが形成されるとすぐに、各新しいワープの実行を継続することができる。この様式では、発散バリア命令をサポートするように構成されるGPUは、ワープスレッド発散を減少させ、GPU性能を改善することができる。
[0030]図1は、本開示の技法にしたがうGPU発散バリア命令の実行をサポートできる例示のコンピューティングデバイスを図示するブロック図である。図1は、コンピューティングデバイス2を含む。コンピューティングデバイス2は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームもしくはコンソール、(たとえば、モバイル電話、セルラー電話、衛星電話、および/もしくはモバイル電話ハンドセットなど)ワイヤレス通信デバイス、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末(PDA)などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および/もしくは表示する任意の他のタイプのデバイスを備えることができる。
[0031]図1の例に図示されるように、コンピューティングデバイス2は、CPU16、システムメモリ14、グラフィックス処理ユニット(GPU)12、およびコンパイラ/ドライバ18を含む。CPU16は、様々なタイプのアプリケーションを実行することができる。アプリケーションの例として、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、または表示用の閲覧可能オブジェクトを生成する他のアプリケーションが挙げられる。1つまたは複数のアプリケーションの実行のための命令は、システムメモリ14内に記憶され得る。
[0032]CPU16が、コンパイラ/ドライバ18を実行することもできる。コンパイラ/ドライバ18は、GPU12の相互作用を制御するコンパイラおよび/またはドライバを備えることができる。コンパイラ/ドライバ18は、特定のグラフィックスアプリケーションプログラミングインターフェース(API)で書かれたコードなどのプログラムコードをとり、コードをカーネル20へと変換することができる。カーネル20は、GPU12が実行することができる、たとえば2進数命令といった固有コードからなる。コンパイラ/ドライバ18は、GPU12のランタイム実行を管理することもできる。下でより詳細に議論されるように、コンパイラ/ドライバ18は、本開示の技法にしたがって、ランタイムにおいてカーネル20の中に、発散バリア命令を挿入することができる。CPU16は、さらなる処理のために、カーネル20をGPU12へ送信することができる。
[0033]GPU12は、グラフィックスデータを処理するのに好適である、超並列処理を可能にする専用ハードウェアであってよい。この方法で、CPU16は、GPU12によってより適切に取り扱われるグラフィックス処理をオフロードする。CPU16は、特定のアプリケーションプロセッシングインターフェース(API)にしたがってGPU12と通信することができる。そのようなAPIの例としては、マイクロソフト(登録商標)によるDirectX(登録商標)API、およびKhronos GroupによるOpenGL(登録商標)があるが、本開示の態様は、DirectX APIおよびOpenGL APIに限定されず、開発されたか、現在開発されているか、または将来開発される他のタイプのAPIに拡張され得る。
[0034]GPU12がCPU16からグラフィックスデータを受け取ることになる様式を規定することに加えて、APIは、GPU12が実装することになる特定のグラフィックス処理パイプラインを規定することができる。GPU12は、図1において、Direct3D 11 APIによって規定されたグラフィックス処理パイプラインを示す。より詳しく説明すると、図2は、OpenGL 4.x APIのグラフィックス処理パイプラインを示している。
[0035]CPU16およびGPU12の例としては、限定はしないが、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の等価な集積回路もしくはディスクリート論理回路がある。いくつかの例では、GPU12は、グラフィックス処理に好適な超並列処理能力をGPU12に与える集積回路および/またはディスクリート論理回路を含む専用ハードウェアであり得る。いくつかの事例では、GPU12は、汎用処理をも含み得、汎用GPU(GPGPU)と呼ばれることがある。本開示で説明する技法は、GPU12がGPGPUである例にも適用可能であり得る。
[0036]システムメモリ14は1つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ14の例としては、限定はしないが、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、電気消去可能プログラマブル読取り専用メモリ(EEPROM(登録商標))、フラッシュメモリ、または命令および/またはデータ構造の形態で所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る任意の他の媒体がある。
[0037]いくつかの態様では、システムメモリ14は、CPU16および/またはGPU12に、本開示におけるCPU16とGPU12とに帰される機能を実行させる命令を含み得る。したがって、システムメモリ14は、1つまたは複数のプロセッサ、たとえば、CPU16およびGPU12に様々な機能を実行させる命令を備えるコンピュータ可読記憶媒体であり得る。
[0038]システムメモリ14は、いくつかの例で、非一時的記憶媒体と考えることができる。「非一時的」という用語は、記憶媒体が、搬送波または伝搬される信号で具現化されないことを示し得る。しかしながら、「非一時的」という用語は、システムメモリ14が非可動であることを意味するものと解釈されるべきでない。一例として、システムメモリ14は、デバイス10から取り外され、別のデバイスに移され得る。別の例として、システムメモリ14に実質的に類似する、システムメモリは、デバイス10内に挿入され得る。いくつかの実施形態において、非一時的記憶媒体は、時間の経過とともに変化し得るデータを格納することができる(たとえば、RAM内)。
[0039]CPU16は、たとえば、レイトレーシングアプリケーションのためのコマンドおよびシーンデータ、物理シミュレーション、または任意の他のタイプのGPGPUカーネルのためのデータといった、GPGPUアプリケーションのためのコマンドおよびデータを生成することもできる。たとえばカーネル20といったGPGPUアプリケーションは、やはり、DirectXもしくはOpenGLなどのグラフィックスAPIを使用して、またはオープンコンピュート言語(OpenCL)、もしくはOpenCompute、もしくはDirectComputeなどのより汎用なコンピュートAPIを使用してコンパイルされ得る。CPU16は、処理するため、カーネル20のためのデータをコマンドバッファに送信することができる。様々な例で、コマンドバッファは、システムメモリ14の部分、またはGPU12の部分であってよい。いくつかの例では、CPU16は、PCI−Expressバスまたは別の汎用シリアルもしくはパラレルバスなどの専用バスを介して処理するため、カーネル20のコマンドおよびデータをGPU12に送信することができる。
[0040]コマンドバッファ中のカーネル20の記憶された動作を実施するために、GPU12は、グラフィックス処理パイプラインを実装することができる。グラフィックス処理パイプラインは、GPU12上で実行するソフトウェアまたはファームウェアにより規定されるように実施すること、および非常に特殊な機能を実施するために配線接続される固定機能ユニットにより機能を実施することを含む。GPU12上で実行するソフトウェアまたはファームウェアは、たとえばシェーダ22といった、シェーダと呼ばれ得る。シェーダ22は、GPU12の(「シェーダコア」または「PE」とも呼ばれる)1つまたは複数の処理要素上で実行することができる。ユーザは、任意の他のプロセッサでのように、任意の想到できる様式で所望のタスクを実行するようにシェーダをプログラムできるので、シェーダ22は、ユーザに、機能的フレキシビリティを提供する。固定機能ユニットは、しかしながら、固定機能ユニットがタスクを実行する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを提供できない。本開示の技法は、GPUシェーダ22上の、カーネル20などのカーネルの実行に向けられる。
[0041]一度CPU16が、グラフィカルなシーンをレンダリングすることまたはカーネルを実行することに関連するデータおよび/またはコマンドをコマンドバッファに送信すると、GPU12は、GPU12のグラフィックスパイプラインを通してコマンドの実行を開始する。GPU12のスケジューラ24は、カーネルに関連する仕事の基本ユニットを実施するスレッドを作り出す。スケジューラ24は、スレッドをシェーダ22の特定の処理要素に割り当てる。スケジューラ24は、やはり、実行するために、スレッドをワープへとグループ化し、ワープの実行を開始する。
[0042]上に議論されたように、フロー制御命令を実行した結果として異なるスレッドが異なる命令にジャンプする場合、ワープのスレッドは発散する。発散ワープの場合、スケジューラは、各組のスレッドを、直列に実行する。すなわち、GPU12は、もはやワープスレッドのすべてを並列に実行せず、グループ中で直列に実行し、このことがGPU性能に害を与える。
[0043]ワープが発散であるときにGPU性能を改善するため、プログラマまたはコンパイラ/ドライバ18は、カーネル20の中に、発散バリア命令を挿入することができる。発散バリアは、GPU12がランタイムにおいて評価するブール式に関連する。ブール式は、真または偽のいずれかと評価する式である。ブール式は、算術演算子、ビット単位の論理演算子、および/または様々な例における論理演算子を含むことができる。ブール式に基づいて発散バリア命令を実行するかどうかを決定することにより、ブール式は、GPUが発散バリアを実行するべきときの制御にフレキシビリティを提供する。ブール式の評価は、発散バリア命令が従来型のバリア命令から異なる1つの方法である。すなわち、バリア命令を実行するときGPUが常にワープの実行を停止する従来型の発散バリア命令を実行するのとは異なり、発散バリアがブール条件に関連し、発散バリアがブール式にやはり関連する制御フローブロック中に配置されることが多いので、ワープは各発散バリアにおいて停止する必要がない。発散バリア命令についての疑似コードの例は、以下である。
divergence_barrier(ブール式);
[0044]発散バリア命令は、GPUに、発散バリア命令に関連するブール式が、発散バリア命令に達するワープの各々における少なくとも1つのスレッドについて真であるかどうかを決定させる。条件が少なくとも1つのスレッドについて真である場合、GPU12は、複数のワープの各々の実行を休止し、アクティブなスレッドの数に基づいて、ワープをソートし、次いで、新しいアクティブな/非アクティブなワープを形成するために、非アクティブなスレッドをアクティブなスレッドとスワップする。GPU12は、すべて非アクティブなスレッドを有する非アクティブなワープが生成され得なくなるまで、非アクティブなスレッドをアクティブなスレッドとスワップし続ける。一度非アクティブなワープが生成され得なくなると、GPU12は、ワープの実行を再開する。GPU12がすべてアクティブなスレッドを有するワープを形成する場合、GPU12は、やはり、待ち行列から直ちに開放し、そのワープの実行を開始することができる。
[0045]本開示の技法に関連する一例として、コンピューティングデバイス2のGPU12は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、式が真である対応するスレッドを有する各ワープの実行を休止することと、式が真である複数のワープの各々について、アクティブなスレッドの数を決定することとを備える方法を実施するように構成され得る。方法は、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることと、複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップすることと、式が真である複数のワープのうちの少なくとも1つの実行を再開することとをさらに備えることができる。
[0046]図2は、本開示の技法にしたがう複数の処理要素上で実行するワープを図示するブロック図である。図2は、複数の処理要素42A〜42N(PE42)上で実行するスレッドワープ40を図示する。PE42は、1つまたは複数のシェーダ22の部分であってよい(図1)。ワープ40などのスレッドワープは、実行するために、GPUスケジューラ24がたとえばPE42などの複数の処理要素に割り当てることができる、スレッドのグループを備えることができる。図2の各PEは、特定の時間に、複数のデータ値にベクトル命令などの単一の演算を実行することができる、単一命令複数データ(SIMD)ユニットを備えることができる。PE42は、単一の浮動小数点値上の単一の演算など、単一データ値上の単一命令の実行をサポートすることもできる。
[0047]ワープ40は、実行するために、GPU12のスケジューラがPE42を割り当てる命令44も含む。いくつかの例では、命令44は、コマンドバッファ中に記憶され得る。命令44は、各PEが実行するように構成されるカーネルの命令の組を含むことができる。プログラムカウンタ(PC)50は、PE42のうちの1つまたは複数が実行することになる現在の命令を示す。命令がPE42上の実行を終了した後、PC50の値は、カーネル20の次の命令のアドレスに増分され得る。ワープ40は、レジスタ46をやはり含む。レジスタ46A〜46N(レジスタ46)は、複数のデータ値または単一の値を保持することができる汎用レジスタであってよい。レジスタ46は、「バンク化」され得る、すなわち、特定のPEのためデータをロードおよび記憶することができる。例として、レジスタ46Aは、PE42Aのためデータを記憶することに限定され得、他のPEのためデータをロードまたは記憶することができない。レジスタ46の46の各々は、PE42のうちの1つとの間でデータを供給することができ、そのPE42は、次いで処理することができる。ワープ40は、ワープコンテキストデータ48を含むこともできる。ワープコンテキストデータ48は、ワープ40の異なるスレッド間で共通である、または共有されるデータを含むことができる。例として、コンテキストデータ48は、ワープ40のPE42上で実行する各スレッドについてのデータを含むことができる、プレディケーションレジスタのデータを含むことができる。
[0048]ワープ40、PE42、命令44、レジスタ46、コンテキスト48、およびPC50は、GPU12のシェーダ22のコアまたはコアの部分を備えることができる。様々な例では、ワープ40は、GPU12のグラフィックスパイプラインの部分であってよい、幾何学シェーダ、ピクセルシェーダ、および/または頂点シェーダなどのシェーダの部分を備えることができる。いくつかの例では、GPU12は、追加処理のために、ワープにより生成された結果を、グラフィックスパイプラインの別のステージに送ることができる。
[0049]ワープ40上のカーネルの実行中に、PE42のうちの1つまたは複数が、PC50により示されるアドレスに配置される命令44のうちの1つを実行する。命令の実行中に、PE42は、レジスタ46から1つまたは複数のデータ値を読み取ることができる。PE42は、データ値上に1つまたは複数の演算を実施し、新しい値をレジスタ46に戻して記憶することができる。PE42は、分岐、ジャンプ、gotoなどのフロー制御命令を実行することができる。フロー制御命令は、たとえばPE42Aといった1つのPEに、PE42B以外の、命令44のうちの異なる1つにジャンプさせる場合がある、すなわち、PE上で実行するスレッドは、フロー制御の異なる評価に起因して発散となる場合がある。しかし、単一のPC50があるので、PE42は、所与の時間における1つの項目において、PC50により示される命令44のうちの1つを実行することだけができる。
[0050]一度ワープのスレッドが発散すると、PE42は、依然として、特定の時間において、PC50の値により示される1つの命令を実行することだけができる。発散の実行をサポートするために、ワープ40は、PC50のアドレスにおいてPE42のどれが命令を実行するべきかを示す、ビットマスクなどの状態を維持する。例として、PE42Aおよび42Bが、「if−else」文の異なる分岐をとることの結果として生じる異なる命令を実行するようにスケジュールされ得る。この例では、PE42Aが命令44のうちの第1の命令を実行し、PE42Bが、後の時間に、命令44のうちの第2の異なる命令を実行する。PE42Aが第1の命令を実行すると、ワープ40は、命令の実行中にPE42Aがアクティブであり、一方PE42Bが非アクティブなことを示すビットマスクを設定する。PE42Aは、次いで、PE42Aのスレッドが実行を終了する、または発散バリア命令を休止し実行し、スレッドの実行を休止するまで、命令44を実行し続ける。一度PE42Aが実行を終了すると、ワープ40は、PE42Bのみがアクティブであることを示すビットマスクを変化させ、PC50の値をPE42Bが実行するべき命令のアドレスに変化させ、次いで、PE42Bは、スレッドが休止するまたは実行を終了するまで、PC50により指定される命令を実行する。
[0051]上に述べられたように、本開示の技法は、実行されると、ワープ40など複数のワープのスレッドが発散するとき、GPU12の性能を改善することができる発散バリア命令を含む。発散バリア命令は、DirectX 11 API、OpenGL API、OpenCL、および/または DirectComputeなどのアプリケーションプログラミングインターフェース(API)の部分を備えることができる。そのようなAPIで書かれたプログラムは、GPU12に発散バリア命令を実行させるカーネル20の中に、発散バリア機能への呼出しを挿入することができる。
[0052]コンパイラ/ドライバ18、またはオペレーティングシステムは、カーネル20のコードの中に、発散バリア命令への呼出しを挿入することもできる。様々な例では、ユーザが、コンパイラ/ドライバ18を使用してカーネル20をコンパイルすることができる。コンパイル中に、コンパイラ/ドライバ18は、カーネル20を分析し、発散が発生する可能性があるプログラム、位置および性能に著しく影響を及ぼすことになる位置の少なくとも1つを決定することができ、それらの位置の少なくとも1つに発散バリア命令を挿入することができる。コンパイラ/ドライバ18は、スレッド発散が発生する可能性がある位置および性能に著しく影響を及ぼすことになる位置のうちの少なくとも1つに、(「バインドタイム」とも呼ばれる)ランタイムにおいて、カーネル20の命令の中に発散バリア命令を挿入することができる。
[0053]発散する可能性がある場合があるコードの一例は、下に含まれる、レイトレーシングアプリケーションのコードである場合がある。この例では、発散バリア命令は、たとえば(コンパイラまたはユーザによって)下のレイトレーシング疑似コードを実行するとき発散を減少させるため、挿入される。
Figure 0006411477
[0054]上の疑似コードは、GPU12の複数のスレッドおよびワープが実行する可能性があるループの例である。各スレッドは、たとえば、レイトレーシングのシーンで光線が起こす反射の数に基づいて、異なる回数、ループを実行する可能性がある。したがって、いくつかのスレッドは、ループの少数の繰返しを実施した後で終わる場合があり、一方他のスレッドは、ループの30回にもおよぶ繰返しの間、ループの実行を続ける場合がある。
[0055]この例では、GPU12は、各ループの繰返しの間に、発散バリア命令を実行する。発散バリア命令は、GPUがループの各繰返しで評価するブール式を含む。GPU12は、ブール式がワープの少なくとも1つのスレッドについて真に評価する場合、たとえば、ワープのソートおよびスレッド圧縮といった、発散バリア命令に関連する動作のみを実行する。この例では、ブール式 i%10==0は、ループの10回の繰返しごとの間に真に評価する。ブール式がワープの1つのスレッドについて真であるとき、GPU12は、「スレッド圧縮」と呼ばれるプロセスである、よりアクティブなスレッドを有する新しいワープを形成するために、異なるワープからスレッドをスワップすることができる。
[0056]1つのワープスレッドの発散バリアに関連するブール式が真に評価するときはいつでも、GPU12が、たとえばワープ40といった、そのスレッドに関連するワープを、待ち行列またはバッファの中に入れる。一度ワープが待ち行列の中に配置されると、GPU12は、ワープ40を実行から停止し、待ち行列の中のワープをソートする。
[0057]各ワープのアクティブなスレッドの数に基づいてワープをソートすることが、図3に非常に詳細に図示される GPU12は、挿入ソート法を使用して、各ワープ中のアクティブなスレッドの数に基づいてワープの各々をソートすることができる。GPU12は、より多くのアクティブなスレッドを有するワープが待ち行列の前にソートされ、より少ないアクティブなスレッドを有するワープが待ち行列の後にソートされるようにワープをソートする。
[0058]すべてのワープが、待ち行列の中に追加されたか、またはバリアにおいて休止されることなく完了した後、GPU12は、次いで、待ち行列中のワープ上にスレッド圧縮を実施する、すなわち、より多い数のアクティブなスレッドを有するワークからの非アクティブなスレッドを、より少ない数のより多い数のスレッドを有するワープとスワップする。GPU12は、GPU12が「非アクティブな」ワープを作り出すことができなくなるまで、より多い数のアクティブなスレッドを有するワープからのスレッドをより少ない数のアクティブなスレッドを有するワープとスワップし続ける。非アクティブなワープは、すべて非アクティブなスレッドを有するワープである。GPU12は、非アクティブなスレッドデータをアクティブなスレッドとスワップするとき、もしあれば、スレッド単位コンテキストデータ48をスワップすることもできる。一度すべてアクティブなスレッドを有する「完全にアクティブなワープ」がスレッドをスワップすることにより作り出されると、GPU12は、完全にアクティブなワープを待ち行列から取り除き、その状態をアクティブに設定し、現在の命令から完全にアクティブなワープの実行を再開する。GPU12がスレッド圧縮を終了した後、部分的にアクティブなワープおよび完全に非アクティブなワープを含むすべてのワープは、準備完了またはアクティブな状態に設定される。部分的にアクティブなワープは、やはり、現在の命令から再開される。完全に非アクティブなスレッドは、現在の制御フローブロックの終わりに速く転送することができ、現在の制御ブロックを命令が流れない場合、完全に非アクティブなワープは、直ちに実行を終了することができる。ワープ間でスレッドをスワップするプロセスは、図4に関してより詳細に説明される。
[0059]いくつかの例では、アクティブなスレッドを非アクティブなスレッドとスワップするため、GPU12は、レジスタスワップバッファ52中の非アクティブなスレッドおよびアクティブなスレッドの、記憶されたレジスタデータを記憶することができる。GPU12は、次いで、以前のアクティブなスレッドの対応するレジスタ中に、以前の非アクティブなスレッドのレジスタデータを記憶する。GPU12は、マルチプレクサ54(「MUX54」)を使用して、以前の非アクティブなスレッドの対応するレジスタ中に、以前のアクティブなスレッドのレジスタデータをやはり記憶する。より詳細には、各スレッドに関連する各レジスタについて、マルチプレクサ54(「MUX54」)が、非アクティブな、およびアクティブなスレッドの記憶されたレジスタ値間で多重化し、スワップされるべきワープのレジスタファイルに値を戻して記憶する。スワッププロセス中に、DBS50が、第1および第2のワープから、スレッド単位コンテキストデータ48をスワップすることもできる。いくつかの例では、GPU12は、レジスタデータをスワップするためにレジスタスワップバッファ52を利用しない場合がある。むしろ、GPU12は、値をバッファ中に記憶するのではなく、レジスタ値を並列にスワップする場合がある。
[0060]いくつかの例では、各ワープは、レジスタポインタを使用して、「バンク」と呼ばれる、特定のスレッドに関連するレジスタ46の組を参照することができる。GPU12は、ポインタのマッピング表を記憶することができる。表の各行または列は、特定のワープに対応することができ、ワープに対応する行または列内の各エントリは(表のレイアウトに依存して)、特定のスレッドをレジスタ46内のレジスタバンクにマッピングするポインタ値を記憶することができる。GPU12は、コンテキストデータ48中のワープのスレッドについて、レジスタバンクにポインタのマッピングを記憶することができる。いくつかの例では、レジスタ46がスレッド単位レジスタバンクポインタにより参照される場合、GPU12は、レジスタスワップバッファ52およびmux54を使用して2つのスレッドの対応するレジスタ値の各々をスワップするのではなく、2つのスレッドのスレッド単位レジスタバンクポインタ値を単純にスワップすることにより、スレッド単位レジスタデータをスワップすることができる。
[0061]いくつかの例では、カーネルを実行することは、たとえばGPU12のグローバルメモリおよび/もしくはシステムメモリ14に頻繁にアクセスする、または大量のアクセス時間またはレイテンシーを有する他の動作を実施する場合がある。この場合に、発散バリア動作を含むバリア動作は、あまりに多くのワープで休止するためにこれらの長いレイテンシー動作を隠すことができず、実行性能が悪くなる可能性がある。長いレイテンシー動作を有するカーネルの実行を速めるために、GPU12は、一度アクティブなワープの数(アクティブなワーププール)が一定の閾値に達すると直ちにスレッド圧縮を実施することができる。
[0062]いくつかのカーネルは、「従来型」バリア動作と発散バリア動作の混合体を含むことができる。従来型バリア動作は、バリアに達したすべてのワープに休止させ、発散バリアと異なり、GPU12がランタイムにおいて評価するブール条件に関連しない。従来型発散バリア動作は、やはり、GPU12にスレッドソートおよびスレッド圧縮を実施させない。従来型バリアと発散バリアの混合を含むカーネルでは、発散バリア命令は、従来型バリア動作に屈しなければならない。従来型と発散バリアとの両方の混合体を有するカーネルでは、GPU12は、従来型バリア動作を実行することに起因して、休止するために、ワープのため待機することなくスレッド圧縮を実施することができる。
[0063]いくつかのカーネルは、サブルーチン呼出しを含むこともできる。サブルーチン呼出し中に、GPUは、スワップデータを、呼び出されるサブルーチンに関連する異なる呼出しスタックを有するワープとスワップすることができる。サブルーチン呼出しは、発散バリア動作がそのような呼出し内に含まれるときに問題がある場合がある。たとえば、第1のワープのスレッドが、カーネルのたとえばライン10といった第1のラインにおいてサブルーチンを呼び出すことができる。第2のワープが、カーネルのたとえばライン20といったより後の実行ポイントにおいて同じサブルーチンを呼び出すことができる。サブルーチンは、発散バリア命令を含む。
[0064]第1および第2のワープがサブルーチン内部で発散バリア命令を実行するとき、実行介在命令および/または他の要因に起因して、第1のワープと第2のワープのスタックは互いに異なる場合がある。サブルーチン内部で発散バリアを有することの問題に対する1つの例示の解決策では、GPU12が、サブルーチン内部で発散バリアを有することを完全に禁止する場合がある。別の例示の解決策では、サブルーチン内部で発散バリア命令を実行するとき、発散バリア命令を有するサブルーチンを実行するワープが同じスタックを有することを確かにするロジックを、GPU12が実装する場合がある。
[0065]図3は、本開示の技法にしたがう各ワープ内のアクティブなスレッドの数に基づいて、ワープをソートすることを図示する概念図である。図3の例は、ソートされないワープ80の数を図示する。上に記載されたように、GPU12は、発散バリア命令に関連するブール式を真と等しいと評価することに応答して、ソートされないワープ80をソートする。図3の例では、ソートされないワープ80は、ワープ82、84、86、88、90、92、94、96、および98を含む。ソートされないワープ80では、アクティブなワープは、斜線ハッシングで図示される。非アクティブなワープスレッドは、ハッシングなしで図示される。
[0066]GPU12は、各ワープ中のアクティブなスレッドの数に基づいてソートされないワープ82をソートする。結果として得られるソートされたワープは、図3に、ソートされたワープ100として図示される。ソートされないワープ80について、ワープ82は、ワープ90、ワープ88、ワープ94、ワープ84、ワープ98、ワープ92、ワープ86、およびワープ96(すべて非アクティブな)により順に後続される、最もアクティブなスレッドを有する(すべてアクティブ)。図3に図示されるように、GPU12は、挿入ソート法を使用して、ソートされないワープ80をソートする。各ワープ中のアクティブなスレッドの数に基づく挿入ソート法の結果は、図3に、ソートされたワープ100として図示される。様々な例では、GPU12は、待ち行列の中にソートされないワープ80を記憶し、次いで、ソートされたワープ100が待ち行列であることをもたらす、待ち行列の中でワープを所定の位置にソートすることができる。様々な例では、待ち行列は、ポインタのリンクされたリストとして実装され得る。各ポインタは、特定のワープを指すことができる。リンクされたリストをソートするために、GPU12は、リンクされたリスト中のワープに関連するポインタをスワップすることができる。
[0067]図4は、1つのワープからのアクティブなスレッドを別のワープからの非アクティブなスレッドとスワップするための技法を図示する概念図である。図4の例では、GPU12は、ソートされないワープ80をソートされたワープ100へと前もってソートした。GPU12は、非アクティブなスレッドを、ソートされたワープ100のアクティブなスレッドとスワップする。GPU12は、「非アクティブなワープ」、すなわちすべて非アクティブなスレッドを有するワープがこれ以上作り出され得なくなるまで、非アクティブなスレッドをアクティブなスレッドとスワップする。非アクティブなスレッドをアクティブなスレッドとスワップするプロセスは、「スレッド圧縮」と呼ばれる。非アクティブなスレッドをソートされたワープ100のアクティブなスレッドとスワップすることの結果が、圧縮されたワープ120として図示される。
[0068]GPU12は、2つのワープ中のアクティブおよび非アクティブなスレッドの数に基づいて、非アクティブなスレッドをアクティブなスレッドとスワップする。図4の例では、GPU12は、より多くのアクティブなスレッドを有するワープからのスレッドを、より少ないアクティブなスレッドを有するワープからのスレッドとスワップする。図4では、GPU12は、非アクティブなスレッドを有する最も左のワープのスレッドを、アクティブなスレッドを有する最も右のワープとスワップする。GPU12は、非アクティブなスレッドがこれ以上作り出され得なくなるまで、外側からの異なるワープからのスレッドを中にスワップする、すなわち、より多くのアクティブなスレッドを有するワープからの非アクティブなスレッドを、より多くの非アクティブなスレッドを有するワープからのアクティブなスレッドとスワップすることを続ける。スケジューラ24は、そのときに待ち行列中に依然として残る、あらゆるすべてのワープの実行を再開する。加えて、待ち行列の先頭のワープがすべてアクティブなスレッドを含有するときはいつでも、スケジューラ24は、待ち行列の先頭に配置されたすべてアクティブなスレッドを有するワープを解放し、そのワープの実行を開始する。
[0069]非アクティブなスレッドをアクティブなスレッドとスワップすることにより、本開示の技法は、より多い数のアクティブなスレッドを有するワープ、ならびにすべて非アクティブなスレッドを有するワープを形成する。より多い数のアクティブなスレッドを有するワープは、GPU12の利用率およびスループットを増加する。命令が現在の制御ブロックに続かない場合、非アクティブなワープは現在の制御フローブロックの最後に「速く転送する」または実行を終了することができるので、すべて非アクティブなスレッドを有するワープは、やはりGPU12のスループットを増加させることができる。したがって、すべて非アクティブなスレッドを有するワープは、いくつかの場合に直ちに実行を終了することができる。したがって、GPU12は、スケジューラ24が決定するそれらのPE上で実行できる異なるワープを実行するために、そのような非アクティブなワープの実行時間を減少する、または実行を停止して、非アクティブなワープに関連するPEを利用することができる。
[0070]図5は、本開示の技法にしたがう複数の発散バリア命令を取り扱うための技法を図示する概念図である。発散バリアはしばしば、やはりブール条件に関連した制御フローブロック中に配置されるので、そのワープの任意のスレッドについてブール条件が真であるとGPUが評価する場合に発散バリアが配置される制御フロー分岐にワープが入ってもよく、または発散バリアが配置される制御フローブロックをワープが通過して実行を継続することをGPUが許可してもよい。ワープは、バリアが配置される制御フロー分岐にワープが入らない場合、または発散バリアのブール条件がワープ中のすべてのスレッドについて偽である場合に、発散バリアを通過することができる。図5の例では、GPU12は、「DB1」、「DB2」、および「DB3」と呼ばれる複数の発散バリアを含むカーネル20を実行する。一例として、カーネルは、レイトレーシングアプリケーションであってよい。図5は、カーネルを通る、8つのスレッド、すなわちスレッド140、142、144、146、148、150、152、および154の進行を図示する。スレッド140〜154のバーの長さは、各スレッドが、発散バリアDB1〜DB3のうちの1つに達したか、またはカーネルの実行を完全に終了したか(「終了」)を示す。
[0071]図5の例では、DB1、DB2、およびDB3の各々は、カーネル中の異なるポイントに配置される。DB1、DB2、およびDB3に対応する3つの発散バリアを含有するサンプルの、一例の疑似コードが下に含まれる。
Figure 0006411477
[0072]カーネル疑似コードは、複数の発散バリア命令、DB1、DB2、およびDB3を含む。発散バリア命令の各々は、分岐文またはループ文中に生じる。カーネル20を実行するワープは、それらがどの制御ブローブロックに入るのか、およびたとえば発散バリア命令に関連するバリア条件といったブール条件の評価に依存して、異なる発散バリアに達する場合がある。カーネル20を実行するスレッドは、カーネル20の実行中、最初にDB1、その後に続くDB2またはDB3に遭遇する場合がある。
[0073]GPU12は、単一の発散バリア命令ではなく、複数の発散バリア命令がカーネル中に存在するとき、ワープをソートしてスレッド圧縮を同様に実施するプロセスを取り扱うことができる。特に、スケジューラ24は、同じ発散バリアに達するワープを一緒に、「圧縮プール」と呼ばれるものへとグループ化することができる。GPU12は、同じ発散バリア命令に達した、圧縮プール中のワープのスレッドを圧縮することができる。
[0074]より詳細には、GPU12は、ワープが達した発散バリアに関連するプレフィックスを各ワープと関連付ける。例として、第1の発散バリアに達するワープは、プレフィックス「1」を有してよく、第2の発散バリアに達するワープは、プレフィックス「2」を有してよく、などである。各ワープは、そのワープ中のアクティブなスレッドの数を示す、たとえばサフィックスといった第2の数をやはり割り当てられる。例として、ワープが3つのアクティブなワープを有する場合、ワープは、サフィックス「3」(3)を割り当てられる。
[0075]プレフィックスとサフィックスの組合せは、ワープ待ち行列中のワープをソートするためGPU12が使用する数を形成する。例として、GPU12がソートする、ワープ待ち行列中の3つのスレッドが存在する場合がある。第1のワープは、発散バリア「2」に達し、4つの(4)アクティブなスレッドを有する。GPU12は、ソート目的で、第1のワープに数「24」を割り当てることができる。第2のワープは、発散バリア「1」に達し、1つの(1)アクティブなスレッドを有する。GPU12は、第2のワープに値「11」を割り当てることができる。第3のワープは、発散バリア「1」に達し、3つの(3)アクティブなスレッドを有する。GPU12は、ワープにソート値として13を割り当てることができる。GPU12は、待ち行列中のワープを各ワープの値でソートする。ソートの結果は、第3のワープ(ソート値11を有する)が待ち行列の先頭にあり、第2のワープ(ソート値13を有する)が待ち行列の2番目であり、第1のワープ(ソート値24を有する)が待ち行列の末尾にあるようなものであってよい。ソート値11および13を有するワープは同じプレフィックス「1」を有するので、GPU12は、圧縮グループを形成することができる。
[0076]GPU12がすべてのワープを休止させ、ワープを待ち行列中に挿入した(または、ワープがバリア上で休止されない場合に実行を終了した)後、GPU12は、アクティブなスレッドを非アクティブなスレッドとスワップすることにより第1のワープグループ中のワープ上にスレッド圧縮を実施する。言い換えれば、GPU12は、後続の発散バリア上の発散を解消する前に、第1の発散バリア上のすべての発散を解消する、すなわち、GPU12は、発散バリアDB2、DB3などへと動く前に、発散バリアDB1上の発散を解消する。
[0077]特定の発散バリアに関連する発散を解消するため、GPU12は、待ち行列から第1のワープグループを切り離し、圧縮プールを形成し、プール中のワープ上に圧縮を実施する。GPU12が圧縮を実行するとき、GPU12は、圧縮プールからワープを解放し、任意の後続の発散バリアに達する際にGPU12が解放されたワープを再び休止することができるように、ワープを実行へと再開する。一方、残りのワープを含有する待ち行列は、任意の発散バリア上に休止した追加ワープを受け取り続ける。GPU12は、再開されたワープを、それらがバリアDB2、DB3に、またはループの場合には再びDB1にさえ達した場合に、休止する場合がある。GPU12は、上に記載されたように、ワープを待ち行列に追加し、ワープを待ち行列中の他のワープとソートする。
[0078]すべてのそれらのワープが休止されて待ち行列に挿入される、すなわち、待ち行列が再び一杯になると、GPU12は、たとえばDB2についてであり得る、待ち行列中の現在の第1のグループ上に同じ圧縮プロセスを繰り返す。GPU12が以前の圧縮を完了し、以前の圧縮プールからすべてのワープを解放する前には、GPU12は、待ち行列中にすべてのワープを有し、圧縮の別の回を開始することができないことに留意されたい。したがって、連続する圧縮プロセス間に競合はない。一度すべてのワープが、待ち行列中でただ1つのグループを形成する同じバリア上で休止されると、GPU12は、待ち行列から休止されたワープのすべてを切り離し、待ち行列を空にすることができる。
[0079]待ち行列の前のバリア、たとえばDB1上で休止したワープが、後で後続のバリア、たとえばDB2/DB3に当たる可能性があるので、GPU12は、後続のバリア(たとえば、DB2、DB3など)について圧縮を実施するとき、できるだけ多くの発散ワープを一緒に圧縮プールにグループ化することを可能にするために、第1のワープグループだけを圧縮する技法を利用することができる。一度に1つのバリアを圧縮することによって、この技法は、後続の発散バリアの圧縮期間に、圧縮プール中のより多くの数のワープの圧縮を可能にすることにより、スレッド圧縮の効率を改善することができる。
[0080]複数のバリアの場合、GPU12は、より早く、すなわち、待ち行列が一杯でないとき、上に記載された同じ方式で、同じ条件下で、発散バリア上に圧縮を実施することを開始できる。それらの条件は、たとえば、カーネルプログラムが従来型バリアを含有する、または頻繁な長いレイテンシー動作を招くことを含む場合がある。
[0081]複数の発散バリアがカーネル中に存在し、ワープに関連するブール式が少なくとも1つのワープスレッドについて真に評価するとき、GPU12は、ワープを待ち行列の中に置き、プレフィックスをワープに関連付ける。プレフィックスは、ワープが達した特定の発散バリアを示す。一例として、スケジューラ24は、それらのワープが発散バリアDB1に達したことを示すため、ワープ140、146、148、152、および154の各々に関連する識別子に、「1」などのプレフィックスを添付することができる。スケジューラ24は、ワープ144および150に、それぞれ、それらのワープが発散バリアDB3およびDB2に達したことを示すため、同様のプレフィックス(たとえば、「2」、「3」)を追加することができる。
[0082]DBM52は、待ち行列中に、ワープ140、142、144、146、148、150、152、および154の各々を記憶する。ワープ140〜154は、最初は未ソートであり、どの発散バリアにワープが達したのかに基づくプレフィックスに関連付けられる。DBM52は、最初に、スレッドの各々に関連するプレフィックスに基づいて、ワープ140、142、144、146、148、150、152、および154をソートし、プレフィックス数に基づいて、ワープを一緒に圧縮グループへとグループ化する。
[0083]たとえばDB1といった最も早い発散バリアに対応するプレフィックスを有するワープのグループは、「圧縮プール」と呼ばれる。図1の例では、圧縮プール156は、そのすべてが発散バリアDB1に達し、したがって同じプレフィックスを含む、ワープ140、146、148、152、および154を含む。
[0084]上に記載されたように、GPU12は、達した発散バリア数に基づいて導出されるプレフィックス、および各ワープ中のアクティブなスレッドの数に関するサフィックスに基づいて圧縮プール156のワープをソートする。GPU12が、(実行を終了したものを除く)すべてのワープをバリア上で休止させ、休止したワープを待ち行列の中に挿入し、待ち行列の中でワープをソートした後、GPU12は、待ち行列の中の最も前のバリアを表す、第1のワープグループを待ち行列から切り離し、このグループで圧縮プールを形成する。GPU12は、次いで、圧縮プールのワープからこれ以上非アクティブなワープが作り出され得なくなるまで、より大きい数のアクティブなスレッドを有する圧縮プール中のワープの非アクティブなスレッドを、より大きい数の非アクティブなスレッドを有する圧縮プール中のワープのアクティブなスレッドとスワップすることによりスレッド圧縮を実施する。一度GPU12が任意の新しいワープのスレッド圧縮を終了すると、DBM52は、実行のために、ワープを圧縮プール156から解放する。
[0085]同時に、待ち行列は、それらが上に述べたように実行を再開した後に、任意のバリア上で休止されたワープを受け取り続けることができる。GPU12は、新たに受け取ったワープをソートして、上に記載されたように、挿入ソート法を使用して、待ち行列中に存在するワープとともに待ち行列の中でそれらをソートすることができる。一度すべてのワープが発散バリア上で休止して待ち行列へと移動する、または実行を終了し次いで抜け出るのいずれかを行うと、GPU12は、圧縮プールを形成するために、待ち行列から現在の第1のワープグループを切り離し、圧縮プール上で圧縮を実施する。
[0086]いくつかのカーネルアプリケーションは、カーネルを実行するスレッドの、一様なペース配分を必要とする場合がある。スレッドが実行するペースに影響を受けやすいカーネルが、発散バリアの使用を複雑にする場合もある。たとえば、発散バリアが追加されたそのようなペースに影響を受けやすいカーネルを実行するとき、いくつかのワープは、発散バリアに達して休止する可能性があり、一方他のワープは、カーネルの命令シーケンス中ではるかに後まで、発散バリアで休止されない場合がある。したがって、発散バリアは、一様でないスレッドおよびワープのペース配分をもたらす可能性がある。第1の関連するブール条件を有する第1の発散バリアのあたりのスレッドのペース配分を一様にするため、プログラマは、第1のブール条件のブール補数である第2の関連するブール式を有する第2の発散バリア命令を挿入することができる。
[0087]次の疑似コードは、この技法を説明する。
Figure 0006411477
[0088]上の疑似コードでは、GPU12は、第1のブール条件に関連する第1の発散バリア命令を含むループを実行する。コードは、第1のブール条件の補数である第2のブール条件を有するループの外側の、第2の発散バリア命令を含む。第2のブール条件は第1の補数であるので、GPU12は、第1または第2の発散バリア命令のいずれかで各ワープを休止することになり、このことにより一定なスレッドのペース配分を確保する。
[0089]図6は、本開示の技法にしたがう発散バリア命令を実行するための技法を図示する流れ図である。GPU12は、図6に図示される方法を実施するように構成され得る。いくつかの例では、GPU12は、各ワープの対応するスレッドについてブール式が真であるかどうかを、複数のワープの各ワープについて決定することができる(200)。GPU12は、式が真である対応するスレッドを有する各ワープの実行を休止することができ(202)、式が真である複数のワープの各々について、アクティブなスレッドの数を決定する(204)。GPU12は、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることができる(206)。GPU12は、次いで、複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップし(208)、式が真である複数のワープのうちの少なくとも1つの実行を再開する(210)ことができる。
[0090]様々な例では、図6の方法は、複数のワープのうちの少なくとも1つの実行を再開する前に、式が真である複数のスレッドについて、スレッド単位コンテキストデータ48をスワップすることをさらに備えることができる。アクティブなスレッドのスレッドデータは、アクティブなスレッドのレジスタデータを備えることができ、非アクティブなスレッドのスレッドデータは、非アクティブなスレッドのレジスタデータを備えることができる。いくつかの例では、複数のワープをソートすることが、挿入ソート法を使用して、複数のワープをソートすることを備えることができる。
[0091]いくつかの例では、GPU12は、式が真である複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定し、各ワープの関連する発散バリアに基づいて、複数のワープの各ワープを複数の圧縮プールへとグループ化することができる。複数のワープをソートするために、GPU12は、複数のワープをソートするようにさらに構成され得るが、複数の圧縮プールのうちの同じものに属する複数のワープをソートすることを備える。様々な例では、第1のワープおよび第2のワープは、複数の圧縮プールのうちの同じものに属するワープを備え、条件が真である複数のワープのうちの少なくとも1つの実行を再開するために、GPU12は、同じ1つの圧縮プールの少なくとも1つのワープの実行を再開するように構成され得る。
[0092]いくつかの例では、GPU12は、複数のワープの各々に関連する発散バリアに基づいて、複数のワープの各々にプレフィックスをさらに割り当てることができ、複数のワープを少なくとも1つの圧縮プールへとグループ化するために、GPU12は、割り当てられたプレフィックスに基づいて、複数のワープを少なくとも1つの圧縮プールへとグループ化することができる。
[0093]さらに他の例では、GPU12は、複数のワープがすべてアクティブなスレッドを有するワープを含むことをさらに決定することができ、すべてアクティブなスレッドを有するワープの実行を再開する。さらに別の例では、式が真である複数のワープをソートするため、GPU12は、待ち行列中の複数のワープを記憶し、アクティブなスレッドの数に基づいて式が真である複数のワープをソートし、待ち行列中のソートされた複数のワープを記憶するように構成され得る。
[0094]さらに別の例では、コンパイラ/ドライバ18は、発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル20内で著しく性能に影響を及ぼす位置のうちの少なくとも1つを決定するようにさらに構成され得る。コンパイラ/ドライバ18は、少なくとも1つの位置において、発散バリア命令をカーネルへと挿入することができる。図6の方法のブール式は、この例の中の発散バリア命令に関連され得る。
[0095]本開示に記載された技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明される技法の様々な態様は、1つまたは複数のプロマイクロプロセッサ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、または任意の同等の集積回路もしくはディスクリート論理回路網を含む1つまたは複数のプロセッサならびにそのようなコンポーネントの任意の組合せ内で実施され得る。「プロセッサ」または「処理回路網」という用語は、一般に、単独でもしくは他の論理回路網と組み合わされた前述の論理回路網のいずれか、あるいは処理を実行するディスクリートハードウェアなどの任意の他の同等の回路網を指すことができる。
[0096]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明される様々な動作と機能とをサポートするために、同一のデバイス内または別々のデバイス内で実施され得る。さらに、説明されるユニット、モジュール、またはコンポーネントのいずれもが、一緒にまたは別個ではあるがインターオペラブルな論理デバイスとして別々に実施され得る。モジュールまたはユニットとしての異なる特徴の描写は、異なる機能的態様を強調することを意図されたものであって、必ずしも、そのようなモジュールまたはユニットが別々のハードウェアコンポーネントまたはソフトウェアコンポーネントによって実現されなければならないことを暗示するものではない。そうではなく、1つまたは複数のモジュールまたはユニットに関連する機能性は、別々のハードウェア、ファームウェア、および/もしくはソフトウェアコンポーネントによって実行され、または共通のもしくは別々のハードウェアもしくはソフトウェアコンポーネント内で一体化され得る。
[0097]本開示で説明される技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体内に記憶され、実施され、または符号化されることも可能である。コンピュータ可読媒体内に組み込まれまたは符号化された命令は、たとえば命令が1つまたは複数のプロセッサによって実行されるときに、その1つまたは複数のプロセッサに、本明細書で説明される技法を実行させることができる。コンピュータ可読記憶媒体は、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、プログラマブル読取り専用メモリ(PROM)、消去可能プログラマブル読取り専用メモリ(EPROM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM)、フラッシュメモリ、ハードディスク、CD−ROM、フロッピー(登録商標)ディスク、カセット、磁気媒体、光学媒体、または他の有形のコンピュータ可読記憶媒体を含み得る。
[0098]コンピュータ可読媒体は、上にリスト化されたもののような有形の記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルにしたがって、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。この様式で、「コンピュータ可読媒体」という語句は、一般的に、(1)非一時的である有形のコンピュータ可読記憶媒体、および(2)一時的な信号または搬送波などの無形のコンピュータ可読通信媒体に対応し得る。
[0099]様々な態様および例が説明されてきた。しかしながら、以下の特許請求の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[C1]
少なくとも1つのプログラム可能なプロセッサによって実施される方法であって、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、
前記式が真である対応するスレッドを有する各ワープの実行を休止することと、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定することと、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートすることと、
前記複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップすることと、
前記式が真である前記複数のワープのうちの少なくとも1つの実行を再開することとを備える方法。
[C2]
前記複数のワープのうちの前記少なくとも1つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップすることをさらに備える、C1に記載の方法。
[C3]
前記少なくとも1つのプログラム可能なプロセッサがグラフィックス処理ユニット(GPU)を備える、C1に記載の方法。
[C4]
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備え、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、C1に記載の方法。
[C5]
前記複数のワープをソートすることが、挿入ソート法を使用して、前記複数のワープをソートすることを備える、C1に記載の方法。
[C6]
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定することと、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化することと、をさらに備える、
ここにおいて、前記複数のワープをソートすることが、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備える、
ここにおいて、前記第1のワープおよび前記第2のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも1つの実行を再開させることが、前記同じ1つの圧縮プールの少なくとも1つのワープの実行を再開することを備える、C1に記載の方法。
[C7]
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスをさらに割り当てることをさらに備える、
ここにおいて、前記複数のワープを前記少なくとも1つの圧縮プールへとグループ化することが、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも1つの圧縮プールへとグループ化することを備える、C6に記載の方法。
[C8]
アクティブなスレッドの前記スレッドデータを、非アクティブなスレッドのスレッド前記データと前記スワップすることが、非アクティブなワープが形成され得なくなるまで継続する、C1に記載の方法。
[C9]
前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定することと、すべてアクティブなスレッドを有する前記ワープの実行を再開することとをさらに備える、C1に記載の方法。
[C10]
前記式が真である前記複数のワープをソートすることが、
前記複数のワープを待ち行列の中でソートすることと、
前記式が真である前記複数のワープを、アクティブなスレッドの前記数に基づいてソートすることと、
前記ソートされた複数のワープを前記待ち行列の中でソートすることと、を備える、C1に記載の方法。
[C11]
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも1つを決定することと、
前記少なくとも1つの位置において、発散バリア命令を前記カーネルへと挿入することとをさらに備える、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、C1に記載の方法。
[C12]
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、
前記式が真である対応するスレッドを有する各ワープの実行を休止するための手段と、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートするための手段と、
前記複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、
前記式が真である前記複数のワープのうちの少なくとも1つの実行を再開するための手段とを備える装置。
[C13]
前記複数のワープのうちの前記少なくとも1つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップするための手段をさらに備える、C12に記載の装置。
[C14]
グラフィックス処理ユニット(GPU)を備える、C12に記載の装置。
[C15]
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備える、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、C12に記載の装置。
[C16]
前記複数のワープをソートするための前記手段が、挿入ソート法を使用して、前記複数のワープをソートするための手段を備える、C12に記載の装置。
[C17]
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定するための手段と、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化するための手段とをさらに備える、
ここにおいて、前記複数のワープをソートするための前記手段が、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートするための手段を備える、
ここにおいて、前記第1のワープおよび前記第2のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも1つの実行を再開させるための前記手段が、前記同じ1つの圧縮プールの少なくとも1つのワープの実行を再開するための手段を備える、C12に記載の装置。
[C18]
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスをさらに割り当てるための手段をさらに備える、
ここにおいて、前記複数のワープを少なくとも1つの圧縮プールへとグループ化するための前記手段が、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも1つの圧縮プールへとグループ化するための手段を備える、C17に記載の装置。
[C19]
アクティブなスレッドの前記スレッドデータを、非アクティブなスレッドのスレッド前記データとスワップするための前記手段が、非アクティブなワープが形成され得なくなるまで継続する、C12に記載の装置。
[C20]
前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定するための手段と、
すべてアクティブなスレッドを有する前記ワープの実行を再開するための手段とをさらに備える、C12に記載の装置。
[C21]
前記式が真である前記複数のワープをソートするための前記手段が、
前記複数のワープを待ち行列の中でソートするための手段と、
前記式が真である前記複数のワープを、アクティブなスレッドの前記数に基づいてソートするための手段と、
前記ソートされた複数のワープを前記待ち行列の中でソートするための手段と、を備える、C12に記載の装置。
[C22]
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも1つを決定するための手段と、
前記少なくとも1つの位置において、発散バリア命令を前記カーネルへと挿入するための手段とをさらに備え、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、C12に記載の装置。
[C23]
実行されると、少なくとも1つのプログラム可能なプロセッサに、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定させ、
前記式が真である対応するスレッドを有する各ワープの実行を休止させ、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定させ、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートさせ、
前記複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップさせ、
前記式が真である前記複数のワープのうちの少なくとも1つの実行を再開させる命令を備える、非一時的コンピュータ可読記憶媒体。
[C24]
メモリと、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定し、
前記式が真である対応するスレッドを有する各ワープの実行を休止し、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定し、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートし、
前記複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップし、
前記式が真である前記複数のワープのうちの少なくとも1つの実行を再開する、ように構成される、少なくとも1つのプログラム可能なプロセッサとを備える、装置。
[C25]
前記少なくとも1つのプログラム可能なプロセッサが、
前記複数のワープのうちの前記少なくとも1つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップするようにさらに続けられる、C24に記載の装置。
[C26]
グラフィックス処理ユニット(GPU)を備える、C24に記載の装置。
[C27]
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備える、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、C24に記載の装置。
[C28]
前記少なくとも1つのプログラム可能なプロセッサが、
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定し、
前記複数のワープのうちの各ワープを、各ワープの前記関連する発散バリアに基づいて複数の圧縮プールへとグループ化するようにさらに構成される、
ここにおいて、前記複数のワープをソートするために、前記少なくとも1つのプログラム可能なプロセッサが、前記複数のワープをソートするようにさらに構成される、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備える
ここにおいて、前記第1のワープおよび前記第2のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも1つの実行を再開させるために、前記少なくとも1つのプログラム可能なプロセッサが、前記同じ1つの圧縮プールの少なくとも1つのワープの実行を再開するように構成される、C24に記載の装置。
[C29]
前記少なくとも1つのプログラム可能なプロセッサが、
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスを割り当てるようにさらに構成される、
ここにおいて、前記少なくとも1つのプログラム可能なプロセッサに複数のワープを前記少なくとも1つの圧縮プールへとグループ化させる命令が、前記少なくとも1つのプログラム可能なプロセッサに、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも1つの圧縮プールへとグループ化させる命令を備える、C28に記載の装置。
[C30]
前記式が真である前記複数のワープをソートするために、前記少なくとも1つのプログラム可能なプロセッサが、
前記複数のワープを待ち行列の中に記憶し、
アクティブなスレッドの前記数に基づいて前記式が真である前記複数のワープを記憶し、
前記待ち行列中に前記ソートされた複数のワープを記憶するように構成される、C24に記載の装置。

Claims (15)

  1. 少なくとも1つのプログラム可能なマルチスレッドSIMDプロセッサによって実施される方法であって、
    複数のワープの各ワープについて、発散バリア命令のブール式のアーギュメントが各ワープの対応するスレッドについて真であるかどうかを決定することと、
    前記ブール式のアーギュメントが真である前記対応するスレッドを有する各ワープの実行を休止することと、
    前記ブール式のアーギュメントが真である前記複数のワープの各々について、アクティブなスレッドの数を決定することと、ここにおいて、前記アクティブなスレッドが、同じ分岐をとっている、
    複数のソートされたワープを生成するために、前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記ブール式のアーギュメントが真である前記複数のワープをソートすることと、
    より少ないアクティブなスレッドを有する前記複数のワープの第1のワープのアクティブなスレッドのデータを、より多い数のアクティブなスレッドを有する前記複数のワープの第2のワープの非アクティブなスレッドのデータとスワップすることと、
    より多い数のアクティブなスレッドを有する、前記ブール式のアーギュメントが真である前記複数のスレッドのうちの1つを有する前記複数のソートされたワープのうちの1つの実行を再開することとを備える方法。
  2. 前記方法が、
    前記複数のソートされたワープのうちの少なくとも1つの実行を再開する前に、前記ブール式のアーギュメントが真である前記複数のスレッドの各スレッドについて、コンテキストデータをスワップすることをさらに備える、請求項1に記載の方法。
  3. 前記複数のワープをソートすることが、挿入ソート法を使用して、前記複数のワープをソートすることを備える、請求項1に記載の方法。
  4. 前記ブール式のアーギュメントが真である前記複数のワープの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定することと、
    各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化することと、をさらに備え、
    ここにおいて、前記複数のワープをソートすることが、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備え、
    ここにおいて、前記第1のワープおよび前記第2のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備え、
    ここにおいて、前記ブール式のアーギュメントが真である前記複数のワープのうちの前記少なくとも1つの実行を再開ることが、前記同じ1つの圧縮プールの少なくとも1つのワープの実行を再開することを備える、請求項1に記載の方法。
  5. 前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスを割り当てることをさらに備え、
    ここにおいて、前記複数のワープを前記少なくとも1つの圧縮プールへとグループ化することが、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも1つの圧縮プールへとグループ化することを備える、請求項4に記載の方法。
  6. アクティブなスレッドのスレッドデータを、非アクティブなスレッドのスレッドデータと前記スワップすることが、休止されたワープが形成され得なくなるまで継続する、請求項1に記載の方法。
  7. 前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定することと、すべてアクティブなスレッドを有する前記ワープの実行を再開することとをさらに備える、請求項1に記載の方法。
  8. 前記ブール式のアーギュメントが真である前記複数のワープをソートすることが、
    前記複数のワープを待ち行列の中に記憶することと、
    前記ブール式のアーギュメントが真である前記待ち行列の中の前記複数のワープを、アクティブなスレッドの前記数に基づいてソートすることと、
    前記ソートされた複数のワープを前記待ち行列の中に記憶することとを備える、請求項1に記載の方法。
  9. 発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも1つを決定することと、
    前記少なくとも1つの位置において、発散バリア命令を前記カーネルへと挿入することとをさらに備え、
    ここにおいて、前記ブール式が前記発散バリア命令に関連する、請求項1に記載の方法。
  10. プログラム可能なマルチスレッドSIMDプロセッサを備える装置であって、
    複数のワープの各ワープについて、発散バリア命令のブール式のアーギュメントが各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、
    前記ブール式のアーギュメントが真である前記対応するスレッドを有する各ワープの実行を休止するための手段と、
    前記ブール式のアーギュメントが真である前記複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、ここにおいて、前記アクティブなスレッドが、同じ分岐をとっている、
    複数のソートされたワープを生成するために、前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記ブール式のアーギュメントが真である前記複数のワープをソートするための手段と、
    より少ないアクティブなスレッドを有する前記複数のワープの第1のワープのアクティブなスレッドのスレッドデータを、より多い数のアクティブなスレッドを有する前記複数のワープの第2のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、
    より多い数のアクティブなスレッドを有する、前記ブール式のアーギュメントが真である前記複数のスレッドのうちの1つを有する前記複数のソートされたワープのうちの1つの実行を再開するための手段とを備える装置。
  11. 前記装置が、グラフィックス処理ユニット(GPU)を備える、請求項10に記載の装置。
  12. 前記ブール式のアーギュメントが真である前記複数のワープの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定するための手段と、
    各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化するための手段とをさらに備え、
    ここにおいて、前記複数のワープをソートするための前記手段が、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートするための手段を備え、
    ここにおいて、前記第1のワープおよび前記第2のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備え、
    ここにおいて、前記ブール式のアーギュメントが真である前記複数のワープのうちの少なくとも1つの実行を再開るための前記手段が、前記同じ1つの圧縮プールの少なくとも1つのワープの実行を再開するための手段を備える、請求項10に記載の装置。
  13. 前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定するための手段と、
    すべてアクティブなスレッドを有する前記ワープの実行を再開するための手段とをさらに備える、請求項10に記載の装置。
  14. 発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも1つを決定するための手段と、
    前記少なくとも1つの位置において、発散バリア命令を前記カーネルへと挿入するための手段とをさらに備え、
    ここにおいて、前記ブール式が前記発散バリア命令に関連する、請求項10に記載の装置。
  15. 実行されると、少なくとも1つのプログラム可能なプロセッサに、請求項1乃至9のうちのいずれか一項に記載の方法を実施する命令を備える、非一時的コンピュータ可読記憶媒体。
JP2016518666A 2013-10-01 2014-09-10 Gpu発散バリア Active JP6411477B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/043,562 US9652284B2 (en) 2013-10-01 2013-10-01 GPU divergence barrier
US14/043,562 2013-10-01
PCT/US2014/054966 WO2015050681A1 (en) 2013-10-01 2014-09-10 Gpu divergence barrier

Publications (3)

Publication Number Publication Date
JP2016532180A JP2016532180A (ja) 2016-10-13
JP2016532180A5 JP2016532180A5 (ja) 2017-09-21
JP6411477B2 true JP6411477B2 (ja) 2018-10-24

Family

ID=51619301

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016518666A Active JP6411477B2 (ja) 2013-10-01 2014-09-10 Gpu発散バリア

Country Status (6)

Country Link
US (1) US9652284B2 (ja)
EP (1) EP3053038B1 (ja)
JP (1) JP6411477B2 (ja)
KR (1) KR102253426B1 (ja)
CN (1) CN105579967B (ja)
WO (1) WO2015050681A1 (ja)

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20150019349A (ko) * 2013-08-13 2015-02-25 삼성전자주식회사 다중 쓰레드 실행 프로세서 및 이의 동작 방법
US10133572B2 (en) * 2014-05-02 2018-11-20 Qualcomm Incorporated Techniques for serialized execution in a SIMD processing system
GB2540937B (en) 2015-07-30 2019-04-03 Advanced Risc Mach Ltd Graphics processing systems
US9921838B2 (en) * 2015-10-02 2018-03-20 Mediatek Inc. System and method for managing static divergence in a SIMD computing architecture
US10409610B2 (en) * 2016-01-29 2019-09-10 Advanced Micro Devices, Inc. Method and apparatus for inter-lane thread migration
US10115175B2 (en) 2016-02-19 2018-10-30 Qualcomm Incorporated Uniform predicates in shaders for graphics processing units
KR20180038793A (ko) * 2016-10-07 2018-04-17 삼성전자주식회사 영상 데이터 처리 방법 및 장치
US10649770B2 (en) * 2017-01-31 2020-05-12 Facebook, Inc. κ-selection using parallel processing
US10474468B2 (en) * 2017-02-22 2019-11-12 Advanced Micro Devices, Inc. Indicating instruction scheduling mode for processing wavefront portions
US10496448B2 (en) * 2017-04-01 2019-12-03 Intel Corporation De-centralized load-balancing at processors
US10310861B2 (en) 2017-04-01 2019-06-04 Intel Corporation Mechanism for scheduling threads on a multiprocessor
US10325341B2 (en) 2017-04-21 2019-06-18 Intel Corporation Handling pipeline submissions across many compute units
US10620994B2 (en) 2017-05-30 2020-04-14 Advanced Micro Devices, Inc. Continuation analysis tasks for GPU task scheduling
US10866806B2 (en) * 2017-11-14 2020-12-15 Nvidia Corporation Uniform register file for improved resource utilization
WO2019157743A1 (zh) * 2018-02-14 2019-08-22 华为技术有限公司 线程处理方法和图形处理器
WO2020186631A1 (en) * 2019-03-21 2020-09-24 Huawei Technologies Co., Ltd. Compute shader warps without ramp up
US20200409695A1 (en) 2019-06-28 2020-12-31 Advanced Micro Devices, Inc. Compute unit sorting for reduced divergence
US20210132985A1 (en) * 2019-10-30 2021-05-06 Advanced Micro Devices, Inc. Shadow latches in a shadow-latch configured register file for thread storage
KR102346601B1 (ko) * 2020-02-26 2022-01-03 성균관대학교산학협력단 운영체제 내 쓰기 순서 보장이 필요한 여러 쓰기 입출력의 처리 속도 향상 방법
US11288765B2 (en) * 2020-04-28 2022-03-29 Sony Interactive Entertainment LLC System and method for efficient multi-GPU execution of kernels by region based dependencies
US11204774B1 (en) * 2020-08-31 2021-12-21 Apple Inc. Thread-group-scoped gate instruction
US11640647B2 (en) * 2021-03-03 2023-05-02 Qualcomm Incorporated Methods and apparatus for intra-wave texture looping

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS59180668A (ja) * 1983-03-31 1984-10-13 Fujitsu Ltd 条件付命令の実行時命令選択方式
US6212544B1 (en) * 1997-10-23 2001-04-03 International Business Machines Corporation Altering thread priorities in a multithreaded processor
JP2004220070A (ja) 2003-01-09 2004-08-05 Japan Science & Technology Agency コンテキスト切り替え方法及び装置、中央演算装置、コンテキスト切り替えプログラム及びそれを記憶したコンピュータ読み取り可能な記憶媒体
US7746347B1 (en) 2004-07-02 2010-06-29 Nvidia Corporation Methods and systems for processing a geometry shader program developed in a high-level shading language
US7639252B2 (en) 2004-08-11 2009-12-29 Ati Technologies Ulc Unified tessellation circuit and method therefor
US7480840B2 (en) 2004-10-12 2009-01-20 International Business Machines Corporation Apparatus, system, and method for facilitating port testing of a multi-port host adapter
US7522167B1 (en) 2004-12-16 2009-04-21 Nvidia Corporation Coherence of displayed images for split-frame rendering in multi-processor graphics system
US8171461B1 (en) 2006-02-24 2012-05-01 Nvidia Coporation Primitive program compilation for flat attributes with provoking vertex independence
US7696993B2 (en) 2007-02-08 2010-04-13 Via Technologies, Inc. Geometry primitive type conversion in a GPU pipeline
US8072460B2 (en) 2007-10-17 2011-12-06 Nvidia Corporation System, method, and computer program product for generating a ray tracing data structure utilizing a parallel processor architecture
US8661226B2 (en) * 2007-11-15 2014-02-25 Nvidia Corporation System, method, and computer program product for performing a scan operation on a sequence of single-bit values using a parallel processor architecture
US20100064291A1 (en) 2008-09-05 2010-03-11 Nvidia Corporation System and Method for Reducing Execution Divergence in Parallel Processing Architectures
US8677106B2 (en) * 2009-09-24 2014-03-18 Nvidia Corporation Unanimous branch instructions in a parallel thread processor
US20110219221A1 (en) 2010-03-03 2011-09-08 Kevin Skadron Dynamic warp subdivision for integrated branch and memory latency divergence tolerance
US8732711B2 (en) 2010-09-24 2014-05-20 Nvidia Corporation Two-level scheduler for multi-threaded processing
US8595701B2 (en) 2011-02-04 2013-11-26 Fujitsu Limited Symbolic execution and test generation for GPU programs
US9153193B2 (en) 2011-09-09 2015-10-06 Microsoft Technology Licensing, Llc Primitive rendering using a single primitive type
US9606808B2 (en) * 2012-01-11 2017-03-28 Nvidia Corporation Method and system for resolving thread divergences

Also Published As

Publication number Publication date
JP2016532180A (ja) 2016-10-13
US20150095914A1 (en) 2015-04-02
CN105579967A (zh) 2016-05-11
CN105579967B (zh) 2019-09-03
EP3053038A1 (en) 2016-08-10
EP3053038B1 (en) 2020-10-21
US9652284B2 (en) 2017-05-16
WO2015050681A1 (en) 2015-04-09
KR102253426B1 (ko) 2021-05-17
KR20160065121A (ko) 2016-06-08

Similar Documents

Publication Publication Date Title
JP6411477B2 (ja) Gpu発散バリア
US11237876B2 (en) Data parallel computing on multiple processors
JP6329274B2 (ja) コンパイラ最適化のためのメモリ参照メタデータ
US11544075B2 (en) Parallel runtime execution on multiple processors
US9858122B2 (en) Data parallel computing on multiple processors
US10067797B2 (en) Application programming interfaces for data parallel computing on multiple processors
US9250956B2 (en) Application interface on multiple processors
US8108633B2 (en) Shared stream memory on multiple processors
US20120320071A1 (en) Multi-dimensional thread grouping for multiple processors
CN101551761A (zh) 一种异构多处理器中共享流内存的方法
JP2014521167A (ja) グラフィックス処理ユニットでの命令カリング
CN114895965A (zh) 实现工作负载的静态映射的乱序流水线执行的方法和装置
TWI428833B (zh) 多執行緒處理器及其指令執行及同步方法及其電腦程式產品
US11836506B2 (en) Parallel runtime execution on multiple processors
AU2018226440B2 (en) Data parallel computing on multiple processors
US20240303113A1 (en) Compiler-directed graph-based command dispatch for accelerators

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160613

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170814

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170814

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180409

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180522

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180822

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: 20180828

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20180926

R150 Certificate of patent or registration of utility model

Ref document number: 6411477

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