(57)【特許請求の範囲】
【請求項１】
少なくとも１つのプログラム可能なマルチスレッドＳＩＭＤプロセッサによって実施される方法であって、
複数のワープの各ワープについて、発散バリア命令のブール式のアーギュメントが各ワープの対応するスレッドについて真であるかどうかを決定することと、
前記ブール式のアーギュメントが真である前記対応するスレッドを有する各ワープの実行を休止することと、
前記ブール式のアーギュメントが真である前記複数のワープの各々について、アクティブなスレッドの数を決定することと、ここにおいて、前記アクティブなスレッドが、同じ分岐をとっている、
複数のソートされたワープを生成するために、前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記ブール式のアーギュメントが真である前記複数のワープをソートすることと、
より少ないアクティブなスレッドを有する前記複数のワープの第１のワープのアクティブなスレッドのデータを、より多い数のアクティブなスレッドを有する前記複数のワープの第２のワープの非アクティブなスレッドのデータとスワップすることと、
より多い数のアクティブなスレッドを有する、前記ブール式のアーギュメントが真である前記複数のスレッドのうちの１つを有する前記複数のソートされたワープのうちの１つの実行を再開することとを備える方法。
【請求項２】
前記方法が、
前記複数のソートされたワープのうちの少なくとも１つの実行を再開する前に、前記ブール式のアーギュメントが真である前記複数のスレッドの各スレッドについて、コンテキストデータをスワップすることをさらに備える、請求項１に記載の方法。
【請求項３】
前記複数のワープをソートすることが、挿入ソート法を使用して、前記複数のワープをソートすることを備える、請求項１に記載の方法。
【請求項４】
前記ブール式のアーギュメントが真である前記複数のワープの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定することと、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化することと、をさらに備え、
ここにおいて、前記複数のワープをソートすることが、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備え、
ここにおいて、前記第１のワープおよび前記第２のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備え、
ここにおいて、前記ブール式のアーギュメントが真である前記複数のワープのうちの前記少なくとも１つの実行を再開することが、前記同じ１つの圧縮プールの少なくとも１つのワープの実行を再開することを備える、請求項１に記載の方法。
【請求項５】
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスを割り当てることをさらに備え、
ここにおいて、前記複数のワープを前記少なくとも１つの圧縮プールへとグループ化することが、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも１つの圧縮プールへとグループ化することを備える、請求項４に記載の方法。
【請求項６】
アクティブなスレッドのスレッドデータを、非アクティブなスレッドのスレッドデータと前記スワップすることが、休止されたワープが形成され得なくなるまで継続する、請求項１に記載の方法。
【請求項７】
前記複数のワープがすべてのアクティブなスレッドを有するワープを含むことを決定することと、すべてのアクティブなスレッドを有する前記ワープの実行を再開することとをさらに備える、請求項１に記載の方法。
【請求項８】
前記ブール式のアーギュメントが真である前記複数のワープをソートすることが、
前記複数のワープを待ち行列の中に記憶することと、
前記ブール式のアーギュメントが真である前記待ち行列の中の前記複数のワープを、アクティブなスレッドの前記数に基づいてソートすることと、
前記ソートされた複数のワープを前記待ち行列の中に記憶することとを備える、請求項１に記載の方法。
【請求項９】
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも１つを決定することと、
前記少なくとも１つの位置において、発散バリア命令を前記カーネルへと挿入することとをさらに備え、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、請求項１に記載の方法。
【請求項１０】
プログラム可能なマルチスレッドＳＩＭＤプロセッサを備える装置であって、
複数のワープの各ワープについて、発散バリア命令のブール式のアーギュメントが各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、
前記ブール式のアーギュメントが真である前記対応するスレッドを有する各ワープの実行を休止するための手段と、
前記ブール式のアーギュメントが真である前記複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、ここにおいて、前記アクティブなスレッドが、同じ分岐をとっている、
複数のソートされたワープを生成するために、前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記ブール式のアーギュメントが真である前記複数のワープをソートするための手段と、
より少ないアクティブなスレッドを有する前記複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、より多い数のアクティブなスレッドを有する前記複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、
より多い数のアクティブなスレッドを有する、前記ブール式のアーギュメントが真である前記複数のスレッドのうちの１つを有する前記複数のソートされたワープのうちの１つの実行を再開するための手段とを備える装置。
【請求項１１】
前記装置が、グラフィックス処理ユニット（ＧＰＵ）を備える、請求項１０に記載の装置。
【請求項１２】
前記ブール式のアーギュメントが真である前記複数のワープの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定するための手段と、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化するための手段とをさらに備え、
ここにおいて、前記複数のワープをソートするための前記手段が、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートするための手段を備え、
ここにおいて、前記第１のワープおよび前記第２のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備え、
ここにおいて、前記ブール式のアーギュメントが真である前記複数のワープのうちの少なくとも１つの実行を再開するための前記手段が、前記同じ１つの圧縮プールの少なくとも１つのワープの実行を再開するための手段を備える、請求項１０に記載の装置。
【請求項１３】
前記複数のワープがすべてのアクティブなスレッドを有するワープを含むことを決定するための手段と、
すべてのアクティブなスレッドを有する前記ワープの実行を再開するための手段とをさらに備える、請求項１０に記載の装置。
【請求項１４】
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも１つを決定するための手段と、
前記少なくとも１つの位置において、発散バリア命令を前記カーネルへと挿入するための手段とをさらに備え、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、請求項１０に記載の装置。
【請求項１５】
実行されると、少なくとも１つのプログラム可能なプロセッサに、請求項１乃至９のうちのいずれか一項に記載の方法を実施する命令を備える、非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]本開示は、グラフィックス処理に関し、より詳細には、グラフィックス処理ユニット（ＧＰＵ）上のスレッドの実行を管理するための技法に関する。
【背景技術】
【０００２】
[0002]最近、いわゆる汎用ＧＰＵ（ＧＰＧＰＵ）への動きがあった。グラフィックスレンダリングを実施する従来のＧＰＵとは異なり、ＧＰＧＰＵは、「カーネル」と呼ばれることが多い汎用タスクまたはプログラムを実行するように構成され得る。いくつかのタイプのタスクは、中央処理（ＣＰＵ）またはＧＰＵなどのプロセッサの特別なタイプにより好適な場合がある。ＣＰＵは、より多くの分岐、ジャンプ、および条件付きロジックを有するタスクにより好適な場合があり、一方ＧＰＵは、高度な並列タスクおよび／または多くの浮動小数点計算を有するタスクに好適な場合がある。多くのＧＰＵがＳＩＭＤハードウェアアーキテクチャを有するので、ＧＰＵは、ＳＩＭＤ（単一命令多重データ）命令を実行する機能も含む場合がある。ＧＰＵがＳＩＭＤ命令を実行するとき、ＧＰＵは、複数のデータ値に、命令により示される同じ演算を実行することができる。典型的には、ＧＰＵは、ＳＩＭＤ命令により示される演算を並列に実行することが可能な、複数の実行ユニットを有する。
【発明の概要】
【０００３】
[0003]本開示の技法は、グラフィックス処理ユニット（ＧＰＵ）上で実行するスレッド間の発散を減少させるための技法を提供する。ＧＰＵは、「発散バリア」命令と呼ばれる命令へのサポートを含むことができる。発散バリア命令は、スレッドが同じ命令を実行しており、そのことによって、ＧＰＵ性能を改善するように、発散したスレッドを、複数のワープから新しいワープへとグループ化することを試みる。
【０００４】
[0004]一例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、式が真である対応するスレッドを有する各ワープの実行を休止することと、式が真である複数のワープの各々について、アクティブなスレッドの数を決定することと、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることと、複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップすることと、式が真である複数のワープのうちの少なくとも１つの実行を再開することとを備える方法を記載する。
【０００５】
[0005]別の例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定し、式が真である対応するスレッドを有する各ワープの実行を休止し、式が真である複数のワープの各々について、アクティブなスレッドの数を決定し、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートし、複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップし、式が真である複数のワープのうちの少なくとも１つの実行を再開するように構成される、メモリと少なくとも１つのプログラム可能なプロセッサとを含むデバイスを記載する。
【０００６】
[0006]別の例では、本開示は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、式が真である対応するスレッドを有する各ワープの実行を休止するための手段と、式が真である複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートするための手段と、複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、式が真である複数のワープのうちの少なくとも１つの実行を再開するための手段とを含む装置を記載する。
【０００７】
[0007]別の例では、本開示は、実行されると、少なくとも１つのプログラム可能なプロセッサに、式が真である複数のワープのうちの各ワープについて、複数の発散バリアのうちの関連する発散バリアを決定させ、複数のワープのうちの各ワープを、各ワープの関連する発散バリアに基づいて複数の圧縮プールへとグループ化させる命令を記憶する、非一時的コンピュータ可読記憶媒体を記載する、ここにおいて、少なくとも１つのプロセッサに複数のワープをソートさせる命令が、少なくとも１つのプロセッサに、複数の圧縮プールのうちの同じものに属する複数のワープをソートさせる命令を備え、ここにおいて、第１のワープおよび第２のワープが、複数の圧縮プールのうちの同じものに属するワープを備える、ここにおいて、少なくとも１つのプロセッサに、条件が真である複数のワープのうちの少なくとも１つの実行を再開させる命令が、同じ１つの圧縮プールの少なくとも１つのワープの実行を再開することを備える。
【０００８】
[0008]本開示の１つまたは複数の例の詳細は、添付図面および下の説明の中に記載される。本開示の他の特徴、目的、および利点は、説明および図面、ならびに請求項から明らかであろう。
【図面の簡単な説明】
【０００９】
【図１】[0009]本開示の技法にしたがうＧＰＵ発散バリア命令の実行をサポートできる例示のコンピューティングデバイスを図示するブロック図。
【図２】[0010]本開示の技法にしたがう複数の処理要素上で実行するワープを図示するブロック図。
【図３】[0011]本開示の技法にしたがう各ワープ内のアクティブなスレッドの数に基づいて、ワープをソートすることを図示する概念図。
【図４】[0012]１つのワープからのアクティブなスレッドを別のワープからの非アクティブなスレッドとスワップするための技法を図示する概念図。
【図５】[0013]本開示の技法にしたがう複数の発散バリア命令を取り扱うための技法を図示する概念図。
【図６】[0014]本開示の技法にしたがう発散バリア命令を実行するための技法を図示する流れ図。
【発明を実施するための形態】
【００１０】
[0015]本開示は、グラフィックス処理ユニット（ＧＰＵ）上で実行するスレッドの発散を減少させるための技法に向けられる。ＧＰＵは、処理要素（ＰＥ）と呼ばれる複数の実行ユニットを含むことができる。「カーネル」と呼ばれるプログラムは、ＧＰＵの１つまたは複数のＰＥ上で実行することができる。アプリケーションは、カーネルを、ＧＰＵの仕事の基本ユニットを構成する複数のスレッドに分割することができる。ＧＰＵスケジューラは、スレッドを一緒に、「ワープ」と呼ばれるスレッドグループへとさらにグループ化することができる。ワープは、あるグラフィックスアーキテクチャ上で、たとえば３２スレッドといった、一定の数のスレッドを含むことができる。
【００１１】
[0016]ＧＰＵのためのドライバまたはスケジューラが、ＧＰＵ上でカーネルを実行するスレッドを作り出す。スレッドは、ＧＰＵ上で処理されるデータの基本ユニットであり、ＣＰＵスレッドと混同されるべきでない。スケジューラは、各スレッドをＧＰＵの実行ユニットに割り当てることができる。処理要素（「ＰＥ」）またはシェーダとも呼ばれる実行ユニットは、複数のデータ値上の同じ命令の並列実行が可能なＳＩＭＤユニットである。
【００１２】
[0017]一般的に、ワープの各スレッドは、同じ命令を実行する。プログラムカウンタ（ＰＣ）は、各スレッドが実行するべき命令のメモリアドレスを記憶する。一般的に、ワープのスレッドの各々について、単一のＰＣが存在することができる。各ワープについて単一のＰＣを有することが、スレッドの各々が異なる命令を実行する必要がない限り、スレッドの各々を同時に実行することを可能にする。
【００１３】
[0018]今や多くのＧＰＵが、たとえば、分岐、ジャンプ、ｇｏｔｏ、および他のフロー制御命令を実行するといった、フロー制御命令を実行する機能を含む。フロー制御命令は、多くの方法で、プログラム実行のフローを変えることができる。フロー制御命令なしのプログラムまたはカーネル中では、ＰＥは、カーネルの命令を始めから終わりまで実行することができる。ＰＥが命令を実行することを終えた後、ＧＰＵは、ＰＣの値をメモリ中の次の命令のアドレスに（典型的には、ＰＣ値を１だけ増分することにより）設定し、ＰＥが次の命令を実行する。プログラムが、その点で実行が終了する出口点に達するまで、プログラムを実行するプロセスは、この方式でフロー制御命令なしのプログラムを継続する。
【００１４】
[0019]フロー制御命令を実行することが、ＰＥに、増分したＰＣ値以外のアドレスで、後続の命令を実行させることができる。増分したＰＣ値のアドレスで後続の命令を実行する代わりに、フロー制御命令を実行するＰＥは、サブルーチンのアドレスなど、異なるＰＣアドレスを有する後続の命令を実行することができる。したがって、フロー制御命令は、プログラムの実行「フロー」を変えるといわれる。
【００１５】
[0020]フロー制御命令の例は、サブルーチン呼出し、分岐、戻り、ジャンプなどを含む。様々な例では、ＰＥが「ジャンプ」する命令アドレス、すなわち、ＰＣに割り当てられるアドレスは、ランタイムにおけるスレッド間で変わるデータの値に基づくことができる。フロー制御命令は、各ＰＥが別個に評価するブール式にやはり関連され得る。ブール式は、真または偽のいずれかに評価するブール値を生成する式である。ブール式は、「ａｎｄ」、「ｏｒ」、「ｎｏｔ」、「排他的ｏｒ（ＸＯＲ）」などのブール演算子を含むことができる。ブール式は、「よりも大きい」、「未満」、「よりも」、「等しい」、「等しくない」、「以上」、「以下」などの算術的検査をやはり含むことができる。ブール式の真偽は、１つのスレッドから別のスレッドで変わるデータまたは値に依存することができる。
【００１６】
[0021]したがって、１つのスレッドが、同じワープ内の別のスレッドと異なる命令にジャンプして実行することが可能となることができる。しかし、上に述べたように、ワープごとにただ１つのＰＣしかない。ワープのうちの２つ以上のスレッドが異なる命令を実行する状態は、「発散」と呼ばれる。発散が発生すると、いくつかの組のスレッドは、同じ命令を実行し続ける場合がある。しかし、同様に、異なる命令を実行する複数の組のスレッドが存在する場合がある。
【００１７】
[0022]スレッド発散の例として、ワープの第１のスレッドおよび第２のスレッドが、「ｉｆ−ｅｌｓｅ」文またはループ文などのフロー制御命令を実行する場合がある。第１のスレッドが実行する後続の命令は、第１のスレッドのレジスタに記憶されるデータの値に基づく場合がある。同様に、第２のスレッドの後続の命令は、第２のスレッドのレジスタに記憶されるデータの値に基づく場合がある。第１のスレッドと第２のスレッドが異なるレジスタデータを有する場合、第１のスレッドと第２のスレッドは、異なる命令アドレスに関連する、異なる後続の命令にジャンプする可能性がある。
【００１８】
[0023]ワープのスレッドが発散である場合、スレッドは、「ｉｆ−ｅｌｓｅ」文などの、制御フローブロックの異なる分岐をとる可能性がある。ループ文の場合、ワープのスレッドは、たとえばループの異なる数の繰返しを実行した後、異なるときにループ文を抜け出る可能性もある。
【００１９】
[0024]たとえば、ｉｆ−ｅｌｓｅ文の異なる分岐をとること、またはループの異なる数の繰返しを実施することに起因して、ワープのスレッドが発散になると、ＧＰＵは、発散により引き起こされる異なる実行経路の各々を直列化する。すなわち、ＧＰＵは、「アクティブ」であるスレッドを決定して、同じ命令を実行する。スレッドが実行を終えるまで、または下でより詳細に議論される、発散バリア命令などのバリアに達するまで、アクティブなスレッドは、各スレッドに関連するＰＥ上で実行し続ける。
【００２０】
[0025]直列化中に、ＧＰＵは、やはり、現在は実行していないスレッドを決定し、それらの非アクティブなスレッドおよびそれらに関連するＰＥをアイドルに設定する。ＰＥがアイドルに設定されると、非アクティブなスレッドは実行を留意し、このことがＧＰＵの性能に害を与える。いくつかの場合、発散したスレッドがさらに発散する、すなわち、複数の「レベル」または「ネストした発散」が存在する可能性がある。ネストした発散に対処するために、ＧＰＵは、ネストした分岐およびループを追跡するために、集束スタックを使用する。ＧＰＵは、発散の最も深いまたは最も内側の層を最初に取り扱い、実行が完了または休止するまで、発散の最も深いレベルを有するスレッドを実行する。ＧＰＵは、次いで、集束スタックから発散のそのレベルを取り除き、集束スタック上の最も内側の残りのスレッドを実行して、集束素テックから完了したスレッドを取り除くプロセスを繰り返す。一度スレッドが分岐またはループを実行することを終了すると、ＧＰＵは、もはや発散でないワープを形成するために、スレッドを一緒に戻して再結合または集束することができる。
【００２１】
[0026]本開示の技法は、「発散バリア」命令と呼ばれる、ＧＰＵがサポートする命令を導入する。様々な例では、アプリケーションプログラミングインターフェース（ＡＰＩ）が、発散バリア命令についてのサポートを含むことができる。そのようなＡＰＩは、オープンコンピュート言語（ＯｐｅｎＣＬ）、オープングラフィックス言語（ＯｐｅｎＧＬ）、およびマイクロソフトＤｉｒｅｃｔＸ  ＡＰＩを含むことができる。ＧＰＵを特定のＡＰＩでプログラムするとき、プログラマは、発散が著しく性能に影響を及ぼす可能性のあるコードポイントにおいて、ＧＰＵに発散バリア命令を実行させる、発散バリア機能呼出しを挿入することができる。ＧＰＵドライバまたはコンパイラが、発散が著しく性能に影響を及ぼす可能性のあるコードポイントを自動的に検出することもでき、それらのコードポイントに発散バリア命令を挿入することができる。
【００２２】
[0027]ＣＰＵは、次いで、実行のために、ＧＰＵに発散バリア命令を含むカーネルのコードを送信する。ＧＰＵは、次いで、それが発散バリア命令に遭遇するまで、カーネルコードを実行する。各発散バリア命令は、ＧＰＵにブール式を評価させる。ＧＰＵがブール式を真と評価する場合、ＧＰＵは、ワープの実行を休止する。ＧＰＵは、別のワープにスイッチして、別のワープの実行を開始する。ＧＰＵは、（たとえば、発散バリア命令を実行することに起因して）カーネルのすべてのワープを実行することを終了する、または休止されるのいずれかとなるまで、ワープを実行するプロセスを継続する。一度、すべてのワープが実行を終了する、または休止されると、ＧＰＵは、発散バリア命令を実行することの結果として現在休止されるワープ間の発散を解消しようと試みる。
【００２３】
[0028]ＧＰＵが発散バリア命令を実行してワープの実行を休止すると、ＧＰＵは、発散バリア命令を実行したことに起因して現在休止されるワープの待ち行列の中にワープを挿入する。待ち行列の中に配置される際に、ＧＰＵは、挿入ソート法を使用して各ワープの中のアクティブなスレッドの数に基づいて待ち行列の中のワープをソートし、挿入ソート法を使用して待ち行列の中の休止ワープの各々をソートする。すべてのワープしたが休止されて待ち行列の中でソートされた（または、終了された）後、ＧＰＵは、次いで、カーネルを実行するワープのスレッド間の発散を解消しようと試みる。ワープのスレッド間の発散を解消するプロセスは、「スレッド圧縮」と呼ばれる。
【００２４】
[0029]スレッド圧縮中、ＧＰＵは、より多くの非アクティブなスレッドを有する現在アクティブなワープを、より多くのアクティブなスレッドを有するワープからの非アクティブなスレッドとスワップすることにより、発散がない、または発散がより少ないスレッドを有するワープを形成するように試みる。ＧＰＵは、異なるワープからのスレッドをスワップするときに交換されるデータ量を最小化するために、ワープソート待ち行列を使用する。新しいワープの形成をもたらすＧＰＵスレッド圧縮中に、ＧＰＵは、すべてのアクティブなスレッドを有するワープが形成されるとすぐに、各新しいワープの実行を継続することができる。この様式では、発散バリア命令をサポートするように構成されるＧＰＵは、ワープスレッド発散を減少させ、ＧＰＵ性能を改善することができる。
【００２５】
[0030]図１は、本開示の技法にしたがうＧＰＵ発散バリア命令の実行をサポートできる例示のコンピューティングデバイスを図示するブロック図である。図１は、コンピューティングデバイス２を含む。コンピューティングデバイス２は、パーソナルコンピュータ、デスクトップコンピュータ、ラップトップコンピュータ、コンピュータワークステーション、タブレットコンピューティングデバイス、ビデオゲームプラットフォームもしくはコンソール、（たとえば、モバイル電話、セルラー電話、衛星電話、および／もしくはモバイル電話ハンドセットなど）ワイヤレス通信デバイス、固定電話、インターネット電話、ポータブルビデオゲームデバイスもしくは携帯情報端末（ＰＤＡ）などのハンドヘルドデバイス、パーソナル音楽プレーヤ、ビデオプレーヤ、ディスプレイデバイス、テレビジョン、テレビジョンセットトップボックス、サーバ、中間ネットワークデバイス、メインフレームコンピュータ、またはグラフィカルデータを処理および／もしくは表示する任意の他のタイプのデバイスを備えることができる。
【００２６】
[0031]図１の例に図示されるように、コンピューティングデバイス２は、ＣＰＵ１６、システムメモリ１４、グラフィックス処理ユニット（ＧＰＵ）１２、およびコンパイラ／ドライバ１８を含む。ＣＰＵ１６は、様々なタイプのアプリケーションを実行することができる。アプリケーションの例として、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、または表示用の閲覧可能オブジェクトを生成する他のアプリケーションが挙げられる。１つまたは複数のアプリケーションの実行のための命令は、システムメモリ１４内に記憶され得る。
【００２７】
[0032]ＣＰＵ１６が、コンパイラ／ドライバ１８を実行することもできる。コンパイラ／ドライバ１８は、ＧＰＵ１２の相互作用を制御するコンパイラおよび／またはドライバを備えることができる。コンパイラ／ドライバ１８は、特定のグラフィックスアプリケーションプログラミングインターフェース（ＡＰＩ）で書かれたコードなどのプログラムコードをとり、コードをカーネル２０へと変換することができる。カーネル２０は、ＧＰＵ１２が実行することができる、たとえば２進数命令といった固有コードからなる。コンパイラ／ドライバ１８は、ＧＰＵ１２のランタイム実行を管理することもできる。下でより詳細に議論されるように、コンパイラ／ドライバ１８は、本開示の技法にしたがって、ランタイムにおいてカーネル２０の中に、発散バリア命令を挿入することができる。ＣＰＵ１６は、さらなる処理のために、カーネル２０をＧＰＵ１２へ送信することができる。
【００２８】
[0033]ＧＰＵ１２は、グラフィックスデータを処理するのに好適である、超並列処理を可能にする専用ハードウェアであってよい。この方法で、ＣＰＵ１６は、ＧＰＵ１２によってより適切に取り扱われるグラフィックス処理をオフロードする。ＣＰＵ１６は、特定のアプリケーションプロセッシングインターフェース（ＡＰＩ）にしたがってＧＰＵ１２と通信することができる。そのようなＡＰＩの例としては、マイクロソフト（登録商標）によるＤｉｒｅｃｔＸ（登録商標）ＡＰＩ、およびＫｈｒｏｎｏｓ  ＧｒｏｕｐによるＯｐｅｎＧＬ（登録商標）があるが、本開示の態様は、ＤｉｒｅｃｔＸ  ＡＰＩおよびＯｐｅｎＧＬ  ＡＰＩに限定されず、開発されたか、現在開発されているか、または将来開発される他のタイプのＡＰＩに拡張され得る。
【００２９】
[0034]ＧＰＵ１２がＣＰＵ１６からグラフィックスデータを受け取ることになる様式を規定することに加えて、ＡＰＩは、ＧＰＵ１２が実装することになる特定のグラフィックス処理パイプラインを規定することができる。ＧＰＵ１２は、図１において、Ｄｉｒｅｃｔ３Ｄ  １１  ＡＰＩによって規定されたグラフィックス処理パイプラインを示す。より詳しく説明すると、図２は、ＯｐｅｎＧＬ  ４．ｘ  ＡＰＩのグラフィックス処理パイプラインを示している。
【００３０】
[0035]ＣＰＵ１６およびＧＰＵ１２の例としては、限定はしないが、デジタル信号プロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、または他の等価な集積回路もしくはディスクリート論理回路がある。いくつかの例では、ＧＰＵ１２は、グラフィックス処理に好適な超並列処理能力をＧＰＵ１２に与える集積回路および／またはディスクリート論理回路を含む専用ハードウェアであり得る。いくつかの事例では、ＧＰＵ１２は、汎用処理をも含み得、汎用ＧＰＵ（ＧＰＧＰＵ）と呼ばれることがある。本開示で説明する技法は、ＧＰＵ１２がＧＰＧＰＵである例にも適用可能であり得る。
【００３１】
[0036]システムメモリ１４は１つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ１４の例としては、限定はしないが、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、電気消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、または命令および／またはデータ構造の形態で所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る任意の他の媒体がある。
【００３２】
[0037]いくつかの態様では、システムメモリ１４は、ＣＰＵ１６および／またはＧＰＵ１２に、本開示におけるＣＰＵ１６とＧＰＵ１２とに帰される機能を実行させる命令を含み得る。したがって、システムメモリ１４は、１つまたは複数のプロセッサ、たとえば、ＣＰＵ１６およびＧＰＵ１２に様々な機能を実行させる命令を備えるコンピュータ可読記憶媒体であり得る。
【００３３】
[0038]システムメモリ１４は、いくつかの例で、非一時的記憶媒体と考えることができる。「非一時的」という用語は、記憶媒体が、搬送波または伝搬される信号で具現化されないことを示し得る。しかしながら、「非一時的」という用語は、システムメモリ１４が非可動であることを意味するものと解釈されるべきでない。一例として、システムメモリ１４は、デバイス１０から取り外され、別のデバイスに移され得る。別の例として、システムメモリ１４に実質的に類似する、システムメモリは、デバイス１０内に挿入され得る。いくつかの実施形態において、非一時的記憶媒体は、時間の経過とともに変化し得るデータを格納することができる（たとえば、ＲＡＭ内）。
【００３４】
[0039]ＣＰＵ１６は、たとえば、レイトレーシングアプリケーションのためのコマンドおよびシーンデータ、物理シミュレーション、または任意の他のタイプのＧＰＧＰＵカーネルのためのデータといった、ＧＰＧＰＵアプリケーションのためのコマンドおよびデータを生成することもできる。たとえばカーネル２０といったＧＰＧＰＵアプリケーションは、やはり、ＤｉｒｅｃｔＸもしくはＯｐｅｎＧＬなどのグラフィックスＡＰＩを使用して、またはオープンコンピュート言語（ＯｐｅｎＣＬ）、もしくはＯｐｅｎＣｏｍｐｕｔｅ、もしくはＤｉｒｅｃｔＣｏｍｐｕｔｅなどのより汎用なコンピュートＡＰＩを使用してコンパイルされ得る。ＣＰＵ１６は、処理するため、カーネル２０のためのデータをコマンドバッファに送信することができる。様々な例で、コマンドバッファは、システムメモリ１４の部分、またはＧＰＵ１２の部分であってよい。いくつかの例では、ＣＰＵ１６は、ＰＣＩ−Ｅｘｐｒｅｓｓバスまたは別の汎用シリアルもしくはパラレルバスなどの専用バスを介して処理するため、カーネル２０のコマンドおよびデータをＧＰＵ１２に送信することができる。
【００３５】
[0040]コマンドバッファ中のカーネル２０の記憶された動作を実施するために、ＧＰＵ１２は、グラフィックス処理パイプラインを実装することができる。グラフィックス処理パイプラインは、ＧＰＵ１２上で実行するソフトウェアまたはファームウェアにより規定されるように実施すること、および非常に特殊な機能を実施するために配線接続される固定機能ユニットにより機能を実施することを含む。ＧＰＵ１２上で実行するソフトウェアまたはファームウェアは、たとえばシェーダ２２といった、シェーダと呼ばれ得る。シェーダ２２は、ＧＰＵ１２の（「シェーダコア」または「ＰＥ」とも呼ばれる）１つまたは複数の処理要素上で実行することができる。ユーザは、任意の他のプロセッサでのように、任意の想到できる様式で所望のタスクを実行するようにシェーダをプログラムできるので、シェーダ２２は、ユーザに、機能的フレキシビリティを提供する。固定機能ユニットは、しかしながら、固定機能ユニットがタスクを実行する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを提供できない。本開示の技法は、ＧＰＵシェーダ２２上の、カーネル２０などのカーネルの実行に向けられる。
【００３６】
[0041]一度ＣＰＵ１６が、グラフィカルなシーンをレンダリングすることまたはカーネルを実行することに関連するデータおよび／またはコマンドをコマンドバッファに送信すると、ＧＰＵ１２は、ＧＰＵ１２のグラフィックスパイプラインを通してコマンドの実行を開始する。ＧＰＵ１２のスケジューラ２４は、カーネルに関連する仕事の基本ユニットを実施するスレッドを作り出す。スケジューラ２４は、スレッドをシェーダ２２の特定の処理要素に割り当てる。スケジューラ２４は、やはり、実行するために、スレッドをワープへとグループ化し、ワープの実行を開始する。
【００３７】
[0042]上に議論されたように、フロー制御命令を実行した結果として異なるスレッドが異なる命令にジャンプする場合、ワープのスレッドは発散する。発散ワープの場合、スケジューラは、各組のスレッドを、直列に実行する。すなわち、ＧＰＵ１２は、もはやワープスレッドのすべてを並列に実行せず、グループ中で直列に実行し、このことがＧＰＵ性能に害を与える。
【００３８】
[0043]ワープが発散であるときにＧＰＵ性能を改善するため、プログラマまたはコンパイラ／ドライバ１８は、カーネル２０の中に、発散バリア命令を挿入することができる。発散バリアは、ＧＰＵ１２がランタイムにおいて評価するブール式に関連する。ブール式は、真または偽のいずれかと評価する式である。ブール式は、算術演算子、ビット単位の論理演算子、および／または様々な例における論理演算子を含むことができる。ブール式に基づいて発散バリア命令を実行するかどうかを決定することにより、ブール式は、ＧＰＵが発散バリアを実行するべきときの制御にフレキシビリティを提供する。ブール式の評価は、発散バリア命令が従来型のバリア命令から異なる１つの方法である。すなわち、バリア命令を実行するときＧＰＵが常にワープの実行を停止する従来型の発散バリア命令を実行するのとは異なり、発散バリアがブール条件に関連し、発散バリアがブール式にやはり関連する制御フローブロック中に配置されることが多いので、ワープは各発散バリアにおいて停止する必要がない。発散バリア命令についての疑似コードの例は、以下である。
ｄｉｖｅｒｇｅｎｃｅ＿ｂａｒｒｉｅｒ（ブール式）；
[0044]発散バリア命令は、ＧＰＵに、発散バリア命令に関連するブール式が、発散バリア命令に達するワープの各々における少なくとも１つのスレッドについて真であるかどうかを決定させる。条件が少なくとも１つのスレッドについて真である場合、ＧＰＵ１２は、複数のワープの各々の実行を休止し、アクティブなスレッドの数に基づいて、ワープをソートし、次いで、新しいアクティブな／非アクティブなワープを形成するために、非アクティブなスレッドをアクティブなスレッドとスワップする。ＧＰＵ１２は、すべて非アクティブなスレッドを有する非アクティブなワープが生成され得なくなるまで、非アクティブなスレッドをアクティブなスレッドとスワップし続ける。一度非アクティブなワープが生成され得なくなると、ＧＰＵ１２は、ワープの実行を再開する。ＧＰＵ１２がすべてアクティブなスレッドを有するワープを形成する場合、ＧＰＵ１２は、やはり、待ち行列から直ちに開放し、そのワープの実行を開始することができる。
【００３９】
[0045]本開示の技法に関連する一例として、コンピューティングデバイス２のＧＰＵ１２は、複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、式が真である対応するスレッドを有する各ワープの実行を休止することと、式が真である複数のワープの各々について、アクティブなスレッドの数を決定することとを備える方法を実施するように構成され得る。方法は、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることと、複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップすることと、式が真である複数のワープのうちの少なくとも１つの実行を再開することとをさらに備えることができる。
【００４０】
[0046]図２は、本開示の技法にしたがう複数の処理要素上で実行するワープを図示するブロック図である。図２は、複数の処理要素４２Ａ〜４２Ｎ（ＰＥ４２）上で実行するスレッドワープ４０を図示する。ＰＥ４２は、１つまたは複数のシェーダ２２の部分であってよい（図１）。ワープ４０などのスレッドワープは、実行するために、ＧＰＵスケジューラ２４がたとえばＰＥ４２などの複数の処理要素に割り当てることができる、スレッドのグループを備えることができる。図２の各ＰＥは、特定の時間に、複数のデータ値にベクトル命令などの単一の演算を実行することができる、単一命令複数データ（ＳＩＭＤ）ユニットを備えることができる。ＰＥ４２は、単一の浮動小数点値上の単一の演算など、単一データ値上の単一命令の実行をサポートすることもできる。
【００４１】
[0047]ワープ４０は、実行するために、ＧＰＵ１２のスケジューラがＰＥ４２を割り当てる命令４４も含む。いくつかの例では、命令４４は、コマンドバッファ中に記憶され得る。命令４４は、各ＰＥが実行するように構成されるカーネルの命令の組を含むことができる。プログラムカウンタ（ＰＣ）５０は、ＰＥ４２のうちの１つまたは複数が実行することになる現在の命令を示す。命令がＰＥ４２上の実行を終了した後、ＰＣ５０の値は、カーネル２０の次の命令のアドレスに増分され得る。ワープ４０は、レジスタ４６をやはり含む。レジスタ４６Ａ〜４６Ｎ（レジスタ４６）は、複数のデータ値または単一の値を保持することができる汎用レジスタであってよい。レジスタ４６は、「バンク化」され得る、すなわち、特定のＰＥのためデータをロードおよび記憶することができる。例として、レジスタ４６Ａは、ＰＥ４２Ａのためデータを記憶することに限定され得、他のＰＥのためデータをロードまたは記憶することができない。レジスタ４６の４６の各々は、ＰＥ４２のうちの１つとの間でデータを供給することができ、そのＰＥ４２は、次いで処理することができる。ワープ４０は、ワープコンテキストデータ４８を含むこともできる。ワープコンテキストデータ４８は、ワープ４０の異なるスレッド間で共通である、または共有されるデータを含むことができる。例として、コンテキストデータ４８は、ワープ４０のＰＥ４２上で実行する各スレッドについてのデータを含むことができる、プレディケーションレジスタのデータを含むことができる。
【００４２】
[0048]ワープ４０、ＰＥ４２、命令４４、レジスタ４６、コンテキスト４８、およびＰＣ５０は、ＧＰＵ１２のシェーダ２２のコアまたはコアの部分を備えることができる。様々な例では、ワープ４０は、ＧＰＵ１２のグラフィックスパイプラインの部分であってよい、幾何学シェーダ、ピクセルシェーダ、および／または頂点シェーダなどのシェーダの部分を備えることができる。いくつかの例では、ＧＰＵ１２は、追加処理のために、ワープにより生成された結果を、グラフィックスパイプラインの別のステージに送ることができる。
【００４３】
[0049]ワープ４０上のカーネルの実行中に、ＰＥ４２のうちの１つまたは複数が、ＰＣ５０により示されるアドレスに配置される命令４４のうちの１つを実行する。命令の実行中に、ＰＥ４２は、レジスタ４６から１つまたは複数のデータ値を読み取ることができる。ＰＥ４２は、データ値上に１つまたは複数の演算を実施し、新しい値をレジスタ４６に戻して記憶することができる。ＰＥ４２は、分岐、ジャンプ、ｇｏｔｏなどのフロー制御命令を実行することができる。フロー制御命令は、たとえばＰＥ４２Ａといった１つのＰＥに、ＰＥ４２Ｂ以外の、命令４４のうちの異なる１つにジャンプさせる場合がある、すなわち、ＰＥ上で実行するスレッドは、フロー制御の異なる評価に起因して発散となる場合がある。しかし、単一のＰＣ５０があるので、ＰＥ４２は、所与の時間における１つの項目において、ＰＣ５０により示される命令４４のうちの１つを実行することだけができる。
【００４４】
[0050]一度ワープのスレッドが発散すると、ＰＥ４２は、依然として、特定の時間において、ＰＣ５０の値により示される１つの命令を実行することだけができる。発散の実行をサポートするために、ワープ４０は、ＰＣ５０のアドレスにおいてＰＥ４２のどれが命令を実行するべきかを示す、ビットマスクなどの状態を維持する。例として、ＰＥ４２Ａおよび４２Ｂが、「ｉｆ−ｅｌｓｅ」文の異なる分岐をとることの結果として生じる異なる命令を実行するようにスケジュールされ得る。この例では、ＰＥ４２Ａが命令４４のうちの第１の命令を実行し、ＰＥ４２Ｂが、後の時間に、命令４４のうちの第２の異なる命令を実行する。ＰＥ４２Ａが第１の命令を実行すると、ワープ４０は、命令の実行中にＰＥ４２Ａがアクティブであり、一方ＰＥ４２Ｂが非アクティブなことを示すビットマスクを設定する。ＰＥ４２Ａは、次いで、ＰＥ４２Ａのスレッドが実行を終了する、または発散バリア命令を休止し実行し、スレッドの実行を休止するまで、命令４４を実行し続ける。一度ＰＥ４２Ａが実行を終了すると、ワープ４０は、ＰＥ４２Ｂのみがアクティブであることを示すビットマスクを変化させ、ＰＣ５０の値をＰＥ４２Ｂが実行するべき命令のアドレスに変化させ、次いで、ＰＥ４２Ｂは、スレッドが休止するまたは実行を終了するまで、ＰＣ５０により指定される命令を実行する。
【００４５】
[0051]上に述べられたように、本開示の技法は、実行されると、ワープ４０など複数のワープのスレッドが発散するとき、ＧＰＵ１２の性能を改善することができる発散バリア命令を含む。発散バリア命令は、ＤｉｒｅｃｔＸ  １１  ＡＰＩ、ＯｐｅｎＧＬ  ＡＰＩ、ＯｐｅｎＣＬ、および／または  ＤｉｒｅｃｔＣｏｍｐｕｔｅなどのアプリケーションプログラミングインターフェース（ＡＰＩ）の部分を備えることができる。そのようなＡＰＩで書かれたプログラムは、ＧＰＵ１２に発散バリア命令を実行させるカーネル２０の中に、発散バリア機能への呼出しを挿入することができる。
【００４６】
[0052]コンパイラ／ドライバ１８、またはオペレーティングシステムは、カーネル２０のコードの中に、発散バリア命令への呼出しを挿入することもできる。様々な例では、ユーザが、コンパイラ／ドライバ１８を使用してカーネル２０をコンパイルすることができる。コンパイル中に、コンパイラ／ドライバ１８は、カーネル２０を分析し、発散が発生する可能性があるプログラム、位置および性能に著しく影響を及ぼすことになる位置の少なくとも１つを決定することができ、それらの位置の少なくとも１つに発散バリア命令を挿入することができる。コンパイラ／ドライバ１８は、スレッド発散が発生する可能性がある位置および性能に著しく影響を及ぼすことになる位置のうちの少なくとも１つに、（「バインドタイム」とも呼ばれる）ランタイムにおいて、カーネル２０の命令の中に発散バリア命令を挿入することができる。
【００４７】
[0053]発散する可能性がある場合があるコードの一例は、下に含まれる、レイトレーシングアプリケーションのコードである場合がある。この例では、発散バリア命令は、たとえば（コンパイラまたはユーザによって）下のレイトレーシング疑似コードを実行するとき発散を減少させるため、挿入される。
【００４８】
【数１】
0006411477.tif 000002
【００４９】
[0054]上の疑似コードは、ＧＰＵ１２の複数のスレッドおよびワープが実行する可能性があるループの例である。各スレッドは、たとえば、レイトレーシングのシーンで光線が起こす反射の数に基づいて、異なる回数、ループを実行する可能性がある。したがって、いくつかのスレッドは、ループの少数の繰返しを実施した後で終わる場合があり、一方他のスレッドは、ループの３０回にもおよぶ繰返しの間、ループの実行を続ける場合がある。
【００５０】
[0055]この例では、ＧＰＵ１２は、各ループの繰返しの間に、発散バリア命令を実行する。発散バリア命令は、ＧＰＵがループの各繰返しで評価するブール式を含む。ＧＰＵ１２は、ブール式がワープの少なくとも１つのスレッドについて真に評価する場合、たとえば、ワープのソートおよびスレッド圧縮といった、発散バリア命令に関連する動作のみを実行する。この例では、ブール式  ｉ％１０＝＝０は、ループの１０回の繰返しごとの間に真に評価する。ブール式がワープの１つのスレッドについて真であるとき、ＧＰＵ１２は、「スレッド圧縮」と呼ばれるプロセスである、よりアクティブなスレッドを有する新しいワープを形成するために、異なるワープからスレッドをスワップすることができる。
【００５１】
[0056]１つのワープスレッドの発散バリアに関連するブール式が真に評価するときはいつでも、ＧＰＵ１２が、たとえばワープ４０といった、そのスレッドに関連するワープを、待ち行列またはバッファの中に入れる。一度ワープが待ち行列の中に配置されると、ＧＰＵ１２は、ワープ４０を実行から停止し、待ち行列の中のワープをソートする。
【００５２】
[0057]各ワープのアクティブなスレッドの数に基づいてワープをソートすることが、図３に非常に詳細に図示される  ＧＰＵ１２は、挿入ソート法を使用して、各ワープ中のアクティブなスレッドの数に基づいてワープの各々をソートすることができる。ＧＰＵ１２は、より多くのアクティブなスレッドを有するワープが待ち行列の前にソートされ、より少ないアクティブなスレッドを有するワープが待ち行列の後にソートされるようにワープをソートする。
【００５３】
[0058]すべてのワープが、待ち行列の中に追加されたか、またはバリアにおいて休止されることなく完了した後、ＧＰＵ１２は、次いで、待ち行列中のワープ上にスレッド圧縮を実施する、すなわち、より多い数のアクティブなスレッドを有するワークからの非アクティブなスレッドを、より少ない数のより多い数のスレッドを有するワープとスワップする。ＧＰＵ１２は、ＧＰＵ１２が「非アクティブな」ワープを作り出すことができなくなるまで、より多い数のアクティブなスレッドを有するワープからのスレッドをより少ない数のアクティブなスレッドを有するワープとスワップし続ける。非アクティブなワープは、すべて非アクティブなスレッドを有するワープである。ＧＰＵ１２は、非アクティブなスレッドデータをアクティブなスレッドとスワップするとき、もしあれば、スレッド単位コンテキストデータ４８をスワップすることもできる。一度すべてアクティブなスレッドを有する「完全にアクティブなワープ」がスレッドをスワップすることにより作り出されると、ＧＰＵ１２は、完全にアクティブなワープを待ち行列から取り除き、その状態をアクティブに設定し、現在の命令から完全にアクティブなワープの実行を再開する。ＧＰＵ１２がスレッド圧縮を終了した後、部分的にアクティブなワープおよび完全に非アクティブなワープを含むすべてのワープは、準備完了またはアクティブな状態に設定される。部分的にアクティブなワープは、やはり、現在の命令から再開される。完全に非アクティブなスレッドは、現在の制御フローブロックの終わりに速く転送することができ、現在の制御ブロックを命令が流れない場合、完全に非アクティブなワープは、直ちに実行を終了することができる。ワープ間でスレッドをスワップするプロセスは、図４に関してより詳細に説明される。
【００５４】
[0059]いくつかの例では、アクティブなスレッドを非アクティブなスレッドとスワップするため、ＧＰＵ１２は、レジスタスワップバッファ５２中の非アクティブなスレッドおよびアクティブなスレッドの、記憶されたレジスタデータを記憶することができる。ＧＰＵ１２は、次いで、以前のアクティブなスレッドの対応するレジスタ中に、以前の非アクティブなスレッドのレジスタデータを記憶する。ＧＰＵ１２は、マルチプレクサ５４（「ＭＵＸ５４」）を使用して、以前の非アクティブなスレッドの対応するレジスタ中に、以前のアクティブなスレッドのレジスタデータをやはり記憶する。より詳細には、各スレッドに関連する各レジスタについて、マルチプレクサ５４（「ＭＵＸ５４」）が、非アクティブな、およびアクティブなスレッドの記憶されたレジスタ値間で多重化し、スワップされるべきワープのレジスタファイルに値を戻して記憶する。スワッププロセス中に、ＤＢＳ５０が、第１および第２のワープから、スレッド単位コンテキストデータ４８をスワップすることもできる。いくつかの例では、ＧＰＵ１２は、レジスタデータをスワップするためにレジスタスワップバッファ５２を利用しない場合がある。むしろ、ＧＰＵ１２は、値をバッファ中に記憶するのではなく、レジスタ値を並列にスワップする場合がある。
【００５５】
[0060]いくつかの例では、各ワープは、レジスタポインタを使用して、「バンク」と呼ばれる、特定のスレッドに関連するレジスタ４６の組を参照することができる。ＧＰＵ１２は、ポインタのマッピング表を記憶することができる。表の各行または列は、特定のワープに対応することができ、ワープに対応する行または列内の各エントリは（表のレイアウトに依存して）、特定のスレッドをレジスタ４６内のレジスタバンクにマッピングするポインタ値を記憶することができる。ＧＰＵ１２は、コンテキストデータ４８中のワープのスレッドについて、レジスタバンクにポインタのマッピングを記憶することができる。いくつかの例では、レジスタ４６がスレッド単位レジスタバンクポインタにより参照される場合、ＧＰＵ１２は、レジスタスワップバッファ５２およびｍｕｘ５４を使用して２つのスレッドの対応するレジスタ値の各々をスワップするのではなく、２つのスレッドのスレッド単位レジスタバンクポインタ値を単純にスワップすることにより、スレッド単位レジスタデータをスワップすることができる。
【００５６】
[0061]いくつかの例では、カーネルを実行することは、たとえばＧＰＵ１２のグローバルメモリおよび／もしくはシステムメモリ１４に頻繁にアクセスする、または大量のアクセス時間またはレイテンシーを有する他の動作を実施する場合がある。この場合に、発散バリア動作を含むバリア動作は、あまりに多くのワープで休止するためにこれらの長いレイテンシー動作を隠すことができず、実行性能が悪くなる可能性がある。長いレイテンシー動作を有するカーネルの実行を速めるために、ＧＰＵ１２は、一度アクティブなワープの数（アクティブなワーププール）が一定の閾値に達すると直ちにスレッド圧縮を実施することができる。
【００５７】
[0062]いくつかのカーネルは、「従来型」バリア動作と発散バリア動作の混合体を含むことができる。従来型バリア動作は、バリアに達したすべてのワープに休止させ、発散バリアと異なり、ＧＰＵ１２がランタイムにおいて評価するブール条件に関連しない。従来型発散バリア動作は、やはり、ＧＰＵ１２にスレッドソートおよびスレッド圧縮を実施させない。従来型バリアと発散バリアの混合を含むカーネルでは、発散バリア命令は、従来型バリア動作に屈しなければならない。従来型と発散バリアとの両方の混合体を有するカーネルでは、ＧＰＵ１２は、従来型バリア動作を実行することに起因して、休止するために、ワープのため待機することなくスレッド圧縮を実施することができる。
【００５８】
[0063]いくつかのカーネルは、サブルーチン呼出しを含むこともできる。サブルーチン呼出し中に、ＧＰＵは、スワップデータを、呼び出されるサブルーチンに関連する異なる呼出しスタックを有するワープとスワップすることができる。サブルーチン呼出しは、発散バリア動作がそのような呼出し内に含まれるときに問題がある場合がある。たとえば、第１のワープのスレッドが、カーネルのたとえばライン１０といった第１のラインにおいてサブルーチンを呼び出すことができる。第２のワープが、カーネルのたとえばライン２０といったより後の実行ポイントにおいて同じサブルーチンを呼び出すことができる。サブルーチンは、発散バリア命令を含む。
【００５９】
[0064]第１および第２のワープがサブルーチン内部で発散バリア命令を実行するとき、実行介在命令および／または他の要因に起因して、第１のワープと第２のワープのスタックは互いに異なる場合がある。サブルーチン内部で発散バリアを有することの問題に対する１つの例示の解決策では、ＧＰＵ１２が、サブルーチン内部で発散バリアを有することを完全に禁止する場合がある。別の例示の解決策では、サブルーチン内部で発散バリア命令を実行するとき、発散バリア命令を有するサブルーチンを実行するワープが同じスタックを有することを確かにするロジックを、ＧＰＵ１２が実装する場合がある。
【００６０】
[0065]図３は、本開示の技法にしたがう各ワープ内のアクティブなスレッドの数に基づいて、ワープをソートすることを図示する概念図である。図３の例は、ソートされないワープ８０の数を図示する。上に記載されたように、ＧＰＵ１２は、発散バリア命令に関連するブール式を真と等しいと評価することに応答して、ソートされないワープ８０をソートする。図３の例では、ソートされないワープ８０は、ワープ８２、８４、８６、８８、９０、９２、９４、９６、および９８を含む。ソートされないワープ８０では、アクティブなワープは、斜線ハッシングで図示される。非アクティブなワープスレッドは、ハッシングなしで図示される。
【００６１】
[0066]ＧＰＵ１２は、各ワープ中のアクティブなスレッドの数に基づいてソートされないワープ８２をソートする。結果として得られるソートされたワープは、図３に、ソートされたワープ１００として図示される。ソートされないワープ８０について、ワープ８２は、ワープ９０、ワープ８８、ワープ９４、ワープ８４、ワープ９８、ワープ９２、ワープ８６、およびワープ９６（すべて非アクティブな）により順に後続される、最もアクティブなスレッドを有する（すべてアクティブ）。図３に図示されるように、ＧＰＵ１２は、挿入ソート法を使用して、ソートされないワープ８０をソートする。各ワープ中のアクティブなスレッドの数に基づく挿入ソート法の結果は、図３に、ソートされたワープ１００として図示される。様々な例では、ＧＰＵ１２は、待ち行列の中にソートされないワープ８０を記憶し、次いで、ソートされたワープ１００が待ち行列であることをもたらす、待ち行列の中でワープを所定の位置にソートすることができる。様々な例では、待ち行列は、ポインタのリンクされたリストとして実装され得る。各ポインタは、特定のワープを指すことができる。リンクされたリストをソートするために、ＧＰＵ１２は、リンクされたリスト中のワープに関連するポインタをスワップすることができる。
【００６２】
[0067]図４は、１つのワープからのアクティブなスレッドを別のワープからの非アクティブなスレッドとスワップするための技法を図示する概念図である。図４の例では、ＧＰＵ１２は、ソートされないワープ８０をソートされたワープ１００へと前もってソートした。ＧＰＵ１２は、非アクティブなスレッドを、ソートされたワープ１００のアクティブなスレッドとスワップする。ＧＰＵ１２は、「非アクティブなワープ」、すなわちすべて非アクティブなスレッドを有するワープがこれ以上作り出され得なくなるまで、非アクティブなスレッドをアクティブなスレッドとスワップする。非アクティブなスレッドをアクティブなスレッドとスワップするプロセスは、「スレッド圧縮」と呼ばれる。非アクティブなスレッドをソートされたワープ１００のアクティブなスレッドとスワップすることの結果が、圧縮されたワープ１２０として図示される。
【００６３】
[0068]ＧＰＵ１２は、２つのワープ中のアクティブおよび非アクティブなスレッドの数に基づいて、非アクティブなスレッドをアクティブなスレッドとスワップする。図４の例では、ＧＰＵ１２は、より多くのアクティブなスレッドを有するワープからのスレッドを、より少ないアクティブなスレッドを有するワープからのスレッドとスワップする。図４では、ＧＰＵ１２は、非アクティブなスレッドを有する最も左のワープのスレッドを、アクティブなスレッドを有する最も右のワープとスワップする。ＧＰＵ１２は、非アクティブなスレッドがこれ以上作り出され得なくなるまで、外側からの異なるワープからのスレッドを中にスワップする、すなわち、より多くのアクティブなスレッドを有するワープからの非アクティブなスレッドを、より多くの非アクティブなスレッドを有するワープからのアクティブなスレッドとスワップすることを続ける。スケジューラ２４は、そのときに待ち行列中に依然として残る、あらゆるすべてのワープの実行を再開する。加えて、待ち行列の先頭のワープがすべてアクティブなスレッドを含有するときはいつでも、スケジューラ２４は、待ち行列の先頭に配置されたすべてアクティブなスレッドを有するワープを解放し、そのワープの実行を開始する。
【００６４】
[0069]非アクティブなスレッドをアクティブなスレッドとスワップすることにより、本開示の技法は、より多い数のアクティブなスレッドを有するワープ、ならびにすべて非アクティブなスレッドを有するワープを形成する。より多い数のアクティブなスレッドを有するワープは、ＧＰＵ１２の利用率およびスループットを増加する。命令が現在の制御ブロックに続かない場合、非アクティブなワープは現在の制御フローブロックの最後に「速く転送する」または実行を終了することができるので、すべて非アクティブなスレッドを有するワープは、やはりＧＰＵ１２のスループットを増加させることができる。したがって、すべて非アクティブなスレッドを有するワープは、いくつかの場合に直ちに実行を終了することができる。したがって、ＧＰＵ１２は、スケジューラ２４が決定するそれらのＰＥ上で実行できる異なるワープを実行するために、そのような非アクティブなワープの実行時間を減少する、または実行を停止して、非アクティブなワープに関連するＰＥを利用することができる。
【００６５】
[0070]図５は、本開示の技法にしたがう複数の発散バリア命令を取り扱うための技法を図示する概念図である。発散バリアはしばしば、やはりブール条件に関連した制御フローブロック中に配置されるので、そのワープの任意のスレッドについてブール条件が真であるとＧＰＵが評価する場合に発散バリアが配置される制御フロー分岐にワープが入ってもよく、または発散バリアが配置される制御フローブロックをワープが通過して実行を継続することをＧＰＵが許可してもよい。ワープは、バリアが配置される制御フロー分岐にワープが入らない場合、または発散バリアのブール条件がワープ中のすべてのスレッドについて偽である場合に、発散バリアを通過することができる。図５の例では、ＧＰＵ１２は、「ＤＢ１」、「ＤＢ２」、および「ＤＢ３」と呼ばれる複数の発散バリアを含むカーネル２０を実行する。一例として、カーネルは、レイトレーシングアプリケーションであってよい。図５は、カーネルを通る、８つのスレッド、すなわちスレッド１４０、１４２、１４４、１４６、１４８、１５０、１５２、および１５４の進行を図示する。スレッド１４０〜１５４のバーの長さは、各スレッドが、発散バリアＤＢ１〜ＤＢ３のうちの１つに達したか、またはカーネルの実行を完全に終了したか（「終了」）を示す。
【００６６】
[0071]図５の例では、ＤＢ１、ＤＢ２、およびＤＢ３の各々は、カーネル中の異なるポイントに配置される。ＤＢ１、ＤＢ２、およびＤＢ３に対応する３つの発散バリアを含有するサンプルの、一例の疑似コードが下に含まれる。
【００６７】
【数２】
0006411477.tif 000003
【００６８】
[0072]カーネル疑似コードは、複数の発散バリア命令、ＤＢ１、ＤＢ２、およびＤＢ３を含む。発散バリア命令の各々は、分岐文またはループ文中に生じる。カーネル２０を実行するワープは、それらがどの制御ブローブロックに入るのか、およびたとえば発散バリア命令に関連するバリア条件といったブール条件の評価に依存して、異なる発散バリアに達する場合がある。カーネル２０を実行するスレッドは、カーネル２０の実行中、最初にＤＢ１、その後に続くＤＢ２またはＤＢ３に遭遇する場合がある。
【００６９】
[0073]ＧＰＵ１２は、単一の発散バリア命令ではなく、複数の発散バリア命令がカーネル中に存在するとき、ワープをソートしてスレッド圧縮を同様に実施するプロセスを取り扱うことができる。特に、スケジューラ２４は、同じ発散バリアに達するワープを一緒に、「圧縮プール」と呼ばれるものへとグループ化することができる。ＧＰＵ１２は、同じ発散バリア命令に達した、圧縮プール中のワープのスレッドを圧縮することができる。
【００７０】
[0074]より詳細には、ＧＰＵ１２は、ワープが達した発散バリアに関連するプレフィックスを各ワープと関連付ける。例として、第１の発散バリアに達するワープは、プレフィックス「１」を有してよく、第２の発散バリアに達するワープは、プレフィックス「２」を有してよく、などである。各ワープは、そのワープ中のアクティブなスレッドの数を示す、たとえばサフィックスといった第２の数をやはり割り当てられる。例として、ワープが３つのアクティブなワープを有する場合、ワープは、サフィックス「３」（３）を割り当てられる。
【００７１】
[0075]プレフィックスとサフィックスの組合せは、ワープ待ち行列中のワープをソートするためＧＰＵ１２が使用する数を形成する。例として、ＧＰＵ１２がソートする、ワープ待ち行列中の３つのスレッドが存在する場合がある。第１のワープは、発散バリア「２」に達し、４つの（４）アクティブなスレッドを有する。ＧＰＵ１２は、ソート目的で、第１のワープに数「２４」を割り当てることができる。第２のワープは、発散バリア「１」に達し、１つの（１）アクティブなスレッドを有する。ＧＰＵ１２は、第２のワープに値「１１」を割り当てることができる。第３のワープは、発散バリア「１」に達し、３つの（３）アクティブなスレッドを有する。ＧＰＵ１２は、ワープにソート値として１３を割り当てることができる。ＧＰＵ１２は、待ち行列中のワープを各ワープの値でソートする。ソートの結果は、第３のワープ（ソート値１１を有する）が待ち行列の先頭にあり、第２のワープ（ソート値１３を有する）が待ち行列の２番目であり、第１のワープ（ソート値２４を有する）が待ち行列の末尾にあるようなものであってよい。ソート値１１および１３を有するワープは同じプレフィックス「１」を有するので、ＧＰＵ１２は、圧縮グループを形成することができる。
【００７２】
[0076]ＧＰＵ１２がすべてのワープを休止させ、ワープを待ち行列中に挿入した（または、ワープがバリア上で休止されない場合に実行を終了した）後、ＧＰＵ１２は、アクティブなスレッドを非アクティブなスレッドとスワップすることにより第１のワープグループ中のワープ上にスレッド圧縮を実施する。言い換えれば、ＧＰＵ１２は、後続の発散バリア上の発散を解消する前に、第１の発散バリア上のすべての発散を解消する、すなわち、ＧＰＵ１２は、発散バリアＤＢ２、ＤＢ３などへと動く前に、発散バリアＤＢ１上の発散を解消する。
【００７３】
[0077]特定の発散バリアに関連する発散を解消するため、ＧＰＵ１２は、待ち行列から第１のワープグループを切り離し、圧縮プールを形成し、プール中のワープ上に圧縮を実施する。ＧＰＵ１２が圧縮を実行するとき、ＧＰＵ１２は、圧縮プールからワープを解放し、任意の後続の発散バリアに達する際にＧＰＵ１２が解放されたワープを再び休止することができるように、ワープを実行へと再開する。一方、残りのワープを含有する待ち行列は、任意の発散バリア上に休止した追加ワープを受け取り続ける。ＧＰＵ１２は、再開されたワープを、それらがバリアＤＢ２、ＤＢ３に、またはループの場合には再びＤＢ１にさえ達した場合に、休止する場合がある。ＧＰＵ１２は、上に記載されたように、ワープを待ち行列に追加し、ワープを待ち行列中の他のワープとソートする。
【００７４】
[0078]すべてのそれらのワープが休止されて待ち行列に挿入される、すなわち、待ち行列が再び一杯になると、ＧＰＵ１２は、たとえばＤＢ２についてであり得る、待ち行列中の現在の第１のグループ上に同じ圧縮プロセスを繰り返す。ＧＰＵ１２が以前の圧縮を完了し、以前の圧縮プールからすべてのワープを解放する前には、ＧＰＵ１２は、待ち行列中にすべてのワープを有し、圧縮の別の回を開始することができないことに留意されたい。したがって、連続する圧縮プロセス間に競合はない。一度すべてのワープが、待ち行列中でただ１つのグループを形成する同じバリア上で休止されると、ＧＰＵ１２は、待ち行列から休止されたワープのすべてを切り離し、待ち行列を空にすることができる。
【００７５】
[0079]待ち行列の前のバリア、たとえばＤＢ１上で休止したワープが、後で後続のバリア、たとえばＤＢ２／ＤＢ３に当たる可能性があるので、ＧＰＵ１２は、後続のバリア（たとえば、ＤＢ２、ＤＢ３など）について圧縮を実施するとき、できるだけ多くの発散ワープを一緒に圧縮プールにグループ化することを可能にするために、第１のワープグループだけを圧縮する技法を利用することができる。一度に１つのバリアを圧縮することによって、この技法は、後続の発散バリアの圧縮期間に、圧縮プール中のより多くの数のワープの圧縮を可能にすることにより、スレッド圧縮の効率を改善することができる。
【００７６】
[0080]複数のバリアの場合、ＧＰＵ１２は、より早く、すなわち、待ち行列が一杯でないとき、上に記載された同じ方式で、同じ条件下で、発散バリア上に圧縮を実施することを開始できる。それらの条件は、たとえば、カーネルプログラムが従来型バリアを含有する、または頻繁な長いレイテンシー動作を招くことを含む場合がある。
【００７７】
[0081]複数の発散バリアがカーネル中に存在し、ワープに関連するブール式が少なくとも１つのワープスレッドについて真に評価するとき、ＧＰＵ１２は、ワープを待ち行列の中に置き、プレフィックスをワープに関連付ける。プレフィックスは、ワープが達した特定の発散バリアを示す。一例として、スケジューラ２４は、それらのワープが発散バリアＤＢ１に達したことを示すため、ワープ１４０、１４６、１４８、１５２、および１５４の各々に関連する識別子に、「１」などのプレフィックスを添付することができる。スケジューラ２４は、ワープ１４４および１５０に、それぞれ、それらのワープが発散バリアＤＢ３およびＤＢ２に達したことを示すため、同様のプレフィックス（たとえば、「２」、「３」）を追加することができる。
【００７８】
[0082]ＤＢＭ５２は、待ち行列中に、ワープ１４０、１４２、１４４、１４６、１４８、１５０、１５２、および１５４の各々を記憶する。ワープ１４０〜１５４は、最初は未ソートであり、どの発散バリアにワープが達したのかに基づくプレフィックスに関連付けられる。ＤＢＭ５２は、最初に、スレッドの各々に関連するプレフィックスに基づいて、ワープ１４０、１４２、１４４、１４６、１４８、１５０、１５２、および１５４をソートし、プレフィックス数に基づいて、ワープを一緒に圧縮グループへとグループ化する。
【００７９】
[0083]たとえばＤＢ１といった最も早い発散バリアに対応するプレフィックスを有するワープのグループは、「圧縮プール」と呼ばれる。図１の例では、圧縮プール１５６は、そのすべてが発散バリアＤＢ１に達し、したがって同じプレフィックスを含む、ワープ１４０、１４６、１４８、１５２、および１５４を含む。
【００８０】
[0084]上に記載されたように、ＧＰＵ１２は、達した発散バリア数に基づいて導出されるプレフィックス、および各ワープ中のアクティブなスレッドの数に関するサフィックスに基づいて圧縮プール１５６のワープをソートする。ＧＰＵ１２が、（実行を終了したものを除く）すべてのワープをバリア上で休止させ、休止したワープを待ち行列の中に挿入し、待ち行列の中でワープをソートした後、ＧＰＵ１２は、待ち行列の中の最も前のバリアを表す、第１のワープグループを待ち行列から切り離し、このグループで圧縮プールを形成する。ＧＰＵ１２は、次いで、圧縮プールのワープからこれ以上非アクティブなワープが作り出され得なくなるまで、より大きい数のアクティブなスレッドを有する圧縮プール中のワープの非アクティブなスレッドを、より大きい数の非アクティブなスレッドを有する圧縮プール中のワープのアクティブなスレッドとスワップすることによりスレッド圧縮を実施する。一度ＧＰＵ１２が任意の新しいワープのスレッド圧縮を終了すると、ＤＢＭ５２は、実行のために、ワープを圧縮プール１５６から解放する。
【００８１】
[0085]同時に、待ち行列は、それらが上に述べたように実行を再開した後に、任意のバリア上で休止されたワープを受け取り続けることができる。ＧＰＵ１２は、新たに受け取ったワープをソートして、上に記載されたように、挿入ソート法を使用して、待ち行列中に存在するワープとともに待ち行列の中でそれらをソートすることができる。一度すべてのワープが発散バリア上で休止して待ち行列へと移動する、または実行を終了し次いで抜け出るのいずれかを行うと、ＧＰＵ１２は、圧縮プールを形成するために、待ち行列から現在の第１のワープグループを切り離し、圧縮プール上で圧縮を実施する。
【００８２】
[0086]いくつかのカーネルアプリケーションは、カーネルを実行するスレッドの、一様なペース配分を必要とする場合がある。スレッドが実行するペースに影響を受けやすいカーネルが、発散バリアの使用を複雑にする場合もある。たとえば、発散バリアが追加されたそのようなペースに影響を受けやすいカーネルを実行するとき、いくつかのワープは、発散バリアに達して休止する可能性があり、一方他のワープは、カーネルの命令シーケンス中ではるかに後まで、発散バリアで休止されない場合がある。したがって、発散バリアは、一様でないスレッドおよびワープのペース配分をもたらす可能性がある。第１の関連するブール条件を有する第１の発散バリアのあたりのスレッドのペース配分を一様にするため、プログラマは、第１のブール条件のブール補数である第２の関連するブール式を有する第２の発散バリア命令を挿入することができる。
【００８３】
[0087]次の疑似コードは、この技法を説明する。
【００８４】
【数３】
0006411477.tif 000004
【００８５】
[0088]上の疑似コードでは、ＧＰＵ１２は、第１のブール条件に関連する第１の発散バリア命令を含むループを実行する。コードは、第１のブール条件の補数である第２のブール条件を有するループの外側の、第２の発散バリア命令を含む。第２のブール条件は第１の補数であるので、ＧＰＵ１２は、第１または第２の発散バリア命令のいずれかで各ワープを休止することになり、このことにより一定なスレッドのペース配分を確保する。
【００８６】
[0089]図６は、本開示の技法にしたがう発散バリア命令を実行するための技法を図示する流れ図である。ＧＰＵ１２は、図６に図示される方法を実施するように構成され得る。いくつかの例では、ＧＰＵ１２は、各ワープの対応するスレッドについてブール式が真であるかどうかを、複数のワープの各ワープについて決定することができる（２００）。ＧＰＵ１２は、式が真である対応するスレッドを有する各ワープの実行を休止することができ（２０２）、式が真である複数のワープの各々について、アクティブなスレッドの数を決定する（２０４）。ＧＰＵ１２は、複数のワープの各々の中のアクティブなスレッドの数に基づいて、式が真である複数のワープをソートすることができる（２０６）。ＧＰＵ１２は、次いで、複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップし（２０８）、式が真である複数のワープのうちの少なくとも１つの実行を再開する（２１０）ことができる。
【００８７】
[0090]様々な例では、図６の方法は、複数のワープのうちの少なくとも１つの実行を再開する前に、式が真である複数のスレッドについて、スレッド単位コンテキストデータ４８をスワップすることをさらに備えることができる。アクティブなスレッドのスレッドデータは、アクティブなスレッドのレジスタデータを備えることができ、非アクティブなスレッドのスレッドデータは、非アクティブなスレッドのレジスタデータを備えることができる。いくつかの例では、複数のワープをソートすることが、挿入ソート法を使用して、複数のワープをソートすることを備えることができる。
【００８８】
[0091]いくつかの例では、ＧＰＵ１２は、式が真である複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定し、各ワープの関連する発散バリアに基づいて、複数のワープの各ワープを複数の圧縮プールへとグループ化することができる。複数のワープをソートするために、ＧＰＵ１２は、複数のワープをソートするようにさらに構成され得るが、複数の圧縮プールのうちの同じものに属する複数のワープをソートすることを備える。様々な例では、第１のワープおよび第２のワープは、複数の圧縮プールのうちの同じものに属するワープを備え、条件が真である複数のワープのうちの少なくとも１つの実行を再開するために、ＧＰＵ１２は、同じ１つの圧縮プールの少なくとも１つのワープの実行を再開するように構成され得る。
【００８９】
[0092]いくつかの例では、ＧＰＵ１２は、複数のワープの各々に関連する発散バリアに基づいて、複数のワープの各々にプレフィックスをさらに割り当てることができ、複数のワープを少なくとも１つの圧縮プールへとグループ化するために、ＧＰＵ１２は、割り当てられたプレフィックスに基づいて、複数のワープを少なくとも１つの圧縮プールへとグループ化することができる。
【００９０】
[0093]さらに他の例では、ＧＰＵ１２は、複数のワープがすべてアクティブなスレッドを有するワープを含むことをさらに決定することができ、すべてアクティブなスレッドを有するワープの実行を再開する。さらに別の例では、式が真である複数のワープをソートするため、ＧＰＵ１２は、待ち行列中の複数のワープを記憶し、アクティブなスレッドの数に基づいて式が真である複数のワープをソートし、待ち行列中のソートされた複数のワープを記憶するように構成され得る。
【００９１】
[0094]さらに別の例では、コンパイラ／ドライバ１８は、発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル２０内で著しく性能に影響を及ぼす位置のうちの少なくとも１つを決定するようにさらに構成され得る。コンパイラ／ドライバ１８は、少なくとも１つの位置において、発散バリア命令をカーネルへと挿入することができる。図６の方法のブール式は、この例の中の発散バリア命令に関連され得る。
【００９２】
[0095]本開示に記載された技法は、少なくとも部分的に、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。たとえば、説明される技法の様々な態様は、１つまたは複数のプロマイクロプロセッサ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、または任意の同等の集積回路もしくはディスクリート論理回路網を含む１つまたは複数のプロセッサならびにそのようなコンポーネントの任意の組合せ内で実施され得る。「プロセッサ」または「処理回路網」という用語は、一般に、単独でもしくは他の論理回路網と組み合わされた前述の論理回路網のいずれか、あるいは処理を実行するディスクリートハードウェアなどの任意の他の同等の回路網を指すことができる。
【００９３】
[0096]そのようなハードウェア、ソフトウェア、およびファームウェアは、本開示で説明される様々な動作と機能とをサポートするために、同一のデバイス内または別々のデバイス内で実施され得る。さらに、説明されるユニット、モジュール、またはコンポーネントのいずれもが、一緒にまたは別個ではあるがインターオペラブルな論理デバイスとして別々に実施され得る。モジュールまたはユニットとしての異なる特徴の描写は、異なる機能的態様を強調することを意図されたものであって、必ずしも、そのようなモジュールまたはユニットが別々のハードウェアコンポーネントまたはソフトウェアコンポーネントによって実現されなければならないことを暗示するものではない。そうではなく、１つまたは複数のモジュールまたはユニットに関連する機能性は、別々のハードウェア、ファームウェア、および／もしくはソフトウェアコンポーネントによって実行され、または共通のもしくは別々のハードウェアもしくはソフトウェアコンポーネント内で一体化され得る。
【００９４】
[0097]本開示で説明される技法は、命令を記憶するコンピュータ可読記憶媒体などのコンピュータ可読媒体内に記憶され、実施され、または符号化されることも可能である。コンピュータ可読媒体内に組み込まれまたは符号化された命令は、たとえば命令が１つまたは複数のプロセッサによって実行されるときに、その１つまたは複数のプロセッサに、本明細書で説明される技法を実行させることができる。コンピュータ可読記憶媒体は、ランダムアクセスメモリ（ＲＡＭ）、読取り専用メモリ（ＲＯＭ）、プログラマブル読取り専用メモリ（ＰＲＯＭ）、消去可能プログラマブル読取り専用メモリ（ＥＰＲＯＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ）、フラッシュメモリ、ハードディスク、ＣＤ−ＲＯＭ、フロッピー（登録商標）ディスク、カセット、磁気媒体、光学媒体、または他の有形のコンピュータ可読記憶媒体を含み得る。
【００９５】
[0098]コンピュータ可読媒体は、上にリスト化されたもののような有形の記憶媒体に対応するコンピュータ可読記憶媒体を含み得る。コンピュータ可読媒体はまた、たとえば、通信プロトコルにしたがって、ある場所から別の場所へのコンピュータプログラムの転送を可能にする任意の媒体を含む通信媒体を備え得る。この様式で、「コンピュータ可読媒体」という語句は、一般的に、（１）非一時的である有形のコンピュータ可読記憶媒体、および（２）一時的な信号または搬送波などの無形のコンピュータ可読通信媒体に対応し得る。
【００９６】
[0099]様々な態様および例が説明されてきた。しかしながら、以下の特許請求の範囲から逸脱することなく、本開示の構造または技法に変更が行われ得る。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
少なくとも１つのプログラム可能なプロセッサによって実施される方法であって、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定することと、
前記式が真である対応するスレッドを有する各ワープの実行を休止することと、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定することと、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートすることと、
前記複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップすることと、
前記式が真である前記複数のワープのうちの少なくとも１つの実行を再開することとを備える方法。
［Ｃ２］
前記複数のワープのうちの前記少なくとも１つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップすることをさらに備える、Ｃ１に記載の方法。
［Ｃ３］
前記少なくとも１つのプログラム可能なプロセッサがグラフィックス処理ユニット（ＧＰＵ）を備える、Ｃ１に記載の方法。
［Ｃ４］
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備え、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、Ｃ１に記載の方法。
［Ｃ５］
前記複数のワープをソートすることが、挿入ソート法を使用して、前記複数のワープをソートすることを備える、Ｃ１に記載の方法。
［Ｃ６］
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定することと、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化することと、をさらに備える、
ここにおいて、前記複数のワープをソートすることが、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備える、
ここにおいて、前記第１のワープおよび前記第２のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも１つの実行を再開させることが、前記同じ１つの圧縮プールの少なくとも１つのワープの実行を再開することを備える、Ｃ１に記載の方法。
［Ｃ７］
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスをさらに割り当てることをさらに備える、
ここにおいて、前記複数のワープを前記少なくとも１つの圧縮プールへとグループ化することが、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも１つの圧縮プールへとグループ化することを備える、Ｃ６に記載の方法。
［Ｃ８］
アクティブなスレッドの前記スレッドデータを、非アクティブなスレッドのスレッド前記データと前記スワップすることが、非アクティブなワープが形成され得なくなるまで継続する、Ｃ１に記載の方法。
［Ｃ９］
前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定することと、すべてアクティブなスレッドを有する前記ワープの実行を再開することとをさらに備える、Ｃ１に記載の方法。
［Ｃ１０］
前記式が真である前記複数のワープをソートすることが、
前記複数のワープを待ち行列の中でソートすることと、
前記式が真である前記複数のワープを、アクティブなスレッドの前記数に基づいてソートすることと、
前記ソートされた複数のワープを前記待ち行列の中でソートすることと、を備える、Ｃ１に記載の方法。
［Ｃ１１］
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも１つを決定することと、
前記少なくとも１つの位置において、発散バリア命令を前記カーネルへと挿入することとをさらに備える、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、Ｃ１に記載の方法。
［Ｃ１２］
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定するための手段と、
前記式が真である対応するスレッドを有する各ワープの実行を休止するための手段と、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定するための手段と、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートするための手段と、
前記複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップするための手段と、
前記式が真である前記複数のワープのうちの少なくとも１つの実行を再開するための手段とを備える装置。
［Ｃ１３］
前記複数のワープのうちの前記少なくとも１つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップするための手段をさらに備える、Ｃ１２に記載の装置。
［Ｃ１４］
グラフィックス処理ユニット（ＧＰＵ）を備える、Ｃ１２に記載の装置。
［Ｃ１５］
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備える、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、Ｃ１２に記載の装置。
［Ｃ１６］
前記複数のワープをソートするための前記手段が、挿入ソート法を使用して、前記複数のワープをソートするための手段を備える、Ｃ１２に記載の装置。
［Ｃ１７］
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定するための手段と、
各ワープの前記関連する発散バリアに基づいて、前記複数のワープの各ワープを複数の圧縮プールへとグループ化するための手段とをさらに備える、
ここにおいて、前記複数のワープをソートするための前記手段が、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートするための手段を備える、
ここにおいて、前記第１のワープおよび前記第２のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも１つの実行を再開させるための前記手段が、前記同じ１つの圧縮プールの少なくとも１つのワープの実行を再開するための手段を備える、Ｃ１２に記載の装置。
［Ｃ１８］
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスをさらに割り当てるための手段をさらに備える、
ここにおいて、前記複数のワープを少なくとも１つの圧縮プールへとグループ化するための前記手段が、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも１つの圧縮プールへとグループ化するための手段を備える、Ｃ１７に記載の装置。
［Ｃ１９］
アクティブなスレッドの前記スレッドデータを、非アクティブなスレッドのスレッド前記データとスワップするための前記手段が、非アクティブなワープが形成され得なくなるまで継続する、Ｃ１２に記載の装置。
［Ｃ２０］
前記複数のワープがすべてアクティブなスレッドを有するワープを含むことを決定するための手段と、
すべてアクティブなスレッドを有する前記ワープの実行を再開するための手段とをさらに備える、Ｃ１２に記載の装置。
［Ｃ２１］
前記式が真である前記複数のワープをソートするための前記手段が、
前記複数のワープを待ち行列の中でソートするための手段と、
前記式が真である前記複数のワープを、アクティブなスレッドの前記数に基づいてソートするための手段と、
前記ソートされた複数のワープを前記待ち行列の中でソートするための手段と、を備える、Ｃ１２に記載の装置。
［Ｃ２２］
発散が生じる可能性がある位置、および複数のワープ上で実行するカーネル内で著しく性能に影響を及ぼす位置のうちの少なくとも１つを決定するための手段と、
前記少なくとも１つの位置において、発散バリア命令を前記カーネルへと挿入するための手段とをさらに備え、
ここにおいて、前記ブール式が前記発散バリア命令に関連する、Ｃ１２に記載の装置。
［Ｃ２３］
実行されると、少なくとも１つのプログラム可能なプロセッサに、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定させ、
前記式が真である対応するスレッドを有する各ワープの実行を休止させ、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定させ、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートさせ、
前記複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップさせ、
前記式が真である前記複数のワープのうちの少なくとも１つの実行を再開させる命令を備える、非一時的コンピュータ可読記憶媒体。
［Ｃ２４］
メモリと、
複数のワープの各ワープについて、ブール式が各ワープの対応するスレッドについて真であるかどうかを決定し、
前記式が真である対応するスレッドを有する各ワープの実行を休止し、
前記式が真である前記複数のワープの各々について、アクティブなスレッドの数を決定し、
前記複数のワープの各々の中のアクティブなスレッドの前記数に基づいて、前記式が真である前記複数のワープをソートし、
前記複数のワープの第１のワープのアクティブなスレッドのスレッドデータを、前記複数のワープの第２のワープの非アクティブなスレッドのスレッドデータとスワップし、
前記式が真である前記複数のワープのうちの少なくとも１つの実行を再開する、ように構成される、少なくとも１つのプログラム可能なプロセッサとを備える、装置。
［Ｃ２５］
前記少なくとも１つのプログラム可能なプロセッサが、
前記複数のワープのうちの前記少なくとも１つの実行を再開する前に、前記式が真である前記複数のスレッドについて、スレッド単位コンテキストデータをスワップするようにさらに続けられる、Ｃ２４に記載の装置。
［Ｃ２６］
グラフィックス処理ユニット（ＧＰＵ）を備える、Ｃ２４に記載の装置。
［Ｃ２７］
前記アクティブなスレッドの前記スレッドデータが、前記アクティブなスレッドのレジスタデータを備える、
ここにおいて、前記非アクティブなスレッドの前記スレッドデータが、前記非アクティブなスレッドのレジスタデータを備える、Ｃ２４に記載の装置。
［Ｃ２８］
前記少なくとも１つのプログラム可能なプロセッサが、
前記式が真である前記複数のワープの各ワープについて、複数の発散バリアの関連する発散バリアをさらに決定し、
前記複数のワープのうちの各ワープを、各ワープの前記関連する発散バリアに基づいて複数の圧縮プールへとグループ化するようにさらに構成される、
ここにおいて、前記複数のワープをソートするために、前記少なくとも１つのプログラム可能なプロセッサが、前記複数のワープをソートするようにさらに構成される、前記複数の圧縮プールのうちの同じものに属する前記複数のワープをソートすることを備える
ここにおいて、前記第１のワープおよび前記第２のワープが、前記複数の圧縮プールのうちの前記同じものに属するワープを備える、
ここにおいて、前記条件が真である前記複数のワープのうちの前記少なくとも１つの実行を再開させるために、前記少なくとも１つのプログラム可能なプロセッサが、前記同じ１つの圧縮プールの少なくとも１つのワープの実行を再開するように構成される、Ｃ２４に記載の装置。
［Ｃ２９］
前記少なくとも１つのプログラム可能なプロセッサが、
前記複数のワープの各々に関連する前記発散バリアに基づいて、前記複数のワープの各々にプレフィックスを割り当てるようにさらに構成される、
ここにおいて、前記少なくとも１つのプログラム可能なプロセッサに複数のワープを前記少なくとも１つの圧縮プールへとグループ化させる命令が、前記少なくとも１つのプログラム可能なプロセッサに、前記割り当てられたプレフィックスに基づいて、前記複数のワープを少なくとも１つの圧縮プールへとグループ化させる命令を備える、Ｃ２８に記載の装置。
［Ｃ３０］
前記式が真である前記複数のワープをソートするために、前記少なくとも１つのプログラム可能なプロセッサが、
前記複数のワープを待ち行列の中に記憶し、
アクティブなスレッドの前記数に基づいて前記式が真である前記複数のワープを記憶し、
前記待ち行列中に前記ソートされた複数のワープを記憶するように構成される、Ｃ２４に記載の装置。
【図１】
0006411477.tif 000005
【図２】
0006411477.tif 000006
【図３】
0006411477.tif 000007
【図４】
0006411477.tif 000008
【図５】
0006411477.tif 000009
【図６】
0006411477.tif 000010