(58)【調査した分野】(Int.Cl.,DB名)
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきであるように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項1に記載の方法。
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項1に記載の方法。
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行すること
をさらに備える、請求項5に記載の方法。
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきであるように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項7に記載の装置。
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項7に記載の装置。
前記第2のプロセッサがスカラー処理ユニットをさらに含み、ここにおいて、前記第2のプロセッサが、前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行するようにさらに構成された、請求項7に記載の装置。
前記第2のプロセッサが、複数の処理要素を含む単一命令複数データ(SIMD)処理コアをさらに含み、ここにおいて、前記第2のプロセッサが、前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、前記SIMD処理コアを使用して、命令の第2のセットを実行するようにさらに構成された、請求項13に記載の装置。
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項17に記載の装置。
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行するための手段
をさらに備える、請求項20に記載の装置。
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、請求項22に記載のコンピュータ可読記憶媒体。
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行すること
をさらに備える、請求項25に記載のコンピュータ可読記憶媒体。
【発明を実施するための形態】
【0012】
[0018]多くの演算を並列に(たとえば、同時に)実施するように構成されたグラフィックス処理ユニット(GPU)など、並列処理ユニットは、1つまたは複数のプログラムの命令を実行する1つまたは複数のプロセッサコア(たとえば、GPUのためのシェーダコア)を含む。説明しやすいように、本開示で説明される技法は、GPUまたは汎用GPU(GPGPU:general purpose GPU)に関して説明される。しかしながら、本開示で説明される技法は、必ずしもGPUまたはGPGPUであるとは限らない並列処理ユニット、ならびに、非並列処理ユニット(たとえば、並列処理のために特に構成されていない処理ユニット)に拡張され得る。
【0013】
[0019]GPUは、単一命令複数データ(SIMD)構造を用いて設計され得る。SIMD構造では、シェーダコア(または、より一般的には、SIMD処理コア)は複数のSIMD処理要素を含み、各SIMD処理要素は、同じプログラムの命令を、ただし異なるデータに対して実行する。特定のSIMD処理要素上で実行する特定の命令は、スレッドまたはファイバーと呼ばれる。スレッドのグループは、波またはワープと呼ばれることがある。ワープを実行する処理要素のすべてが一緒に、ベクトル処理ユニットと呼ばれることがあり、ベクトルの各レーン(たとえば、処理要素)は1つのスレッドを実行する。各SIMD処理要素は、所与のスレッドのためのデータが異なり得るので、異なるスレッドを実行するものと見なされ得るが、処理要素上で実行するスレッドは、他の処理要素上で実行する命令と、同じプログラムの、同じ命令である。このようにして、SIMD構造は、GPUが多くのタスクを並列に(たとえば、同時に)実施することを可能にする。
【0014】
[0020]SIMD処理コアは複数の処理要素を含み得、各処理要素はスレッドを実行する。各処理要素は、命令の同じセットを並列に実行する。いくつかの状況では、命令のセットは、条件付き分岐命令(たとえば、if−then−else命令)を含み得る。各処理要素が、異なるデータに対して演算するので、同じワープ中の異なるスレッドが、異なる方法で分岐し得る。すなわち、各スレッドのための異なる入力データを仮定すれば、条件付き命令の「then」分岐を取るべきなのか条件文の「else」分岐を取るべきなのかの条件は、各スレッドごとに異なり得る。
【0015】
[0021]いくつかの例では、SIMD処理コアのための制御フローは、述語ビットを使用して「スレッドごと」ベース(“per-thread” basis)で実施され、述語ビットは、SIMDベクトルの各スレッド(レーン)がどのように(たとえば、各処理要素がどのように)分岐するべきであるかを示す(すなわち、命令の単一のセットが分岐命令を含む場合)。スレッドは独立したデータを有するので、これらの述語(predicate)は、一般に、互いに相関関係を有しない。しかしながら、それは常に真であるとは限らず、同じ述語がワープ中のすべてのスレッドに適用される場合、独立した述語の使用は不経済である。
【0016】
[0022]本開示は、述語ビットの単一のセットがそれにおいてワープ全体に適用される、一様な(uniform)述語のセットを使用する方法、技法、およびデバイスについて説明する。そのような一様な述語は、ワープのすべてのスレッドが同様の方法で分岐すると決定されたとき、使用され得る。このようにして、スレッドごとベースで述語ビットを割り当てることとは対照的に、一様な述語を使用するときに、単一の試験のみが行われるので、電力節約が達成され得る。
【0017】
[0023]さらに、本開示は、GPUのSIMDコアと並んで、GPUにおけるスカラー処理ユニットの追加についても説明する。スカラー処理ユニットは、ワープのすべてスレッドについて同様の方法で分岐すると決定された、命令のセットを実行するために使用され得る。このようにして、スカラー処理ユニットは、一様な分岐をもつ命令のセットを実行するために一様な述語セットを使用し得、SIMDコアのベクトル処理ユニットは、スカラー処理ユニットと並列に命令の別のセットを処理するために使用され得る。
【0018】
[0024]
図1は、一様な述語を用いたシェーダコアにおけるスレッドの実行のための本開示で説明される1つまたは複数の例示的な技法による、データを処理するための例示的なデバイスを示すブロック図である。
図1は、デバイス10を示し、デバイス10の例としては、限定はしないが、メディアプレーヤなどのビデオデバイス、セットトップボックス、携帯電話などのワイヤレス通信デバイス、携帯情報端末(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲーミングコンソール、ビデオ会議ユニット、タブレットコンピューティングデバイスなどがある。
【0019】
[0025]
図1の例では、デバイス10は、プロセッサ12と、グラフィックス処理ユニット(GPU)14と、システムメモリ16とを含む。デバイス10がモバイルデバイスである例など、いくつかの例では、プロセッサ12およびGPU14は、集積回路(IC)として形成され得る。たとえば、ICは、システムオンチップ(SoC)など、チップパッケージ内の処理チップと見なされ得る。デバイス10がデスクトップまたはラップトップコンピュータである例など、いくつかの例では、プロセッサ12およびGPU14は、異なる集積回路(たとえば、異なるチップパッケージ)に格納され得る。しかしながら、プロセッサ12およびGPU14は、デバイス10がモバイルデバイスである例において、異なる集積回路に格納されることが可能であり得る。
【0020】
[0026]プロセッサ12およびGPU14の例としては、限定はしないが、1つまたは複数のデジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路がある。プロセッサ12は、デバイス10の中央処理ユニット(CPU)であり得る。いくつかの例では、GPU14は、グラフィックス処理に好適な超並列処理能力をGPU14に与える集積回路および/またはディスクリート論理回路を含む専用ハードウェアであり得る。いくつかの事例では、GPU14は、汎用処理能力をも含み得、汎用処理タスク(すなわち、非グラフィックス関係タスク)を実装するとき、汎用GPU(GPGPU)と呼ばれることがある。
【0021】
[0027]例示のために、本開示で説明される技法は、GPU14を用いて説明される。ただし、本開示で説明される技法はそのように限定されない。本開示で説明される技法は、他のタイプの並列処理ユニット(たとえば、グラフィックス処理用でない場合でも、超並列処理能力を与える処理ユニット)に拡張され得る。また、本開示で説明される技法は、並列処理のために特に構成されていない処理ユニットに拡張され得る。
【0022】
[0028]プロセッサ12は様々なタイプのアプリケーションを実行し得る。アプリケーションの例としては、オペレーティングシステム、ウェブブラウザ、電子メールアプリケーション、スプレッドシート、ビデオゲーム、または表示のために閲覧可能オブジェクトを生成する他のアプリケーションがある。システムメモリ16は、1つまたは複数のアプリケーションの実行のための命令を記憶し得る。プロセッサ12上でのアプリケーションの実行は、プロセッサ12に、表示されるべきである画像コンテンツのためのグラフィックスデータを生成させる。プロセッサ12は、さらなる処理のために画像コンテンツのグラフィックスデータをGPU14に送信し得る。
【0023】
[0029]一例として、プロセッサ12上でのアプリケーションの実行は、プロセッサ12にプリミティブの頂点を生成させ、それぞれの頂点におけるプリミティブの相互接続がグラフィカルオブジェクトを形成する。この例では、プロセッサ12が生成するグラフィックスデータは、頂点の属性のための属性データである。たとえば、プロセッサ12上で実行するアプリケーションは、頂点のための色値、不透明値、座標などを生成し得、それらはすべて、頂点の属性の例である。同様に追加の属性があり得、いくつかの例では、アプリケーションは例示的な属性のすべてを生成する必要があるとは限らない。概して、本技法は、属性データ以外のデータタイプ(たとえば、カウンタ)に拡張可能であり、本技法は、属性データに限定されると見なされるべきではなく、または色値、不透明値、座標などの属性データの例に限定されると見なされるべきではない。
【0024】
[0030]いくつかの非グラフィックス関係例では、プロセッサ12は、GPU14によって処理されるのにより良く適しているデータを生成し得る。そのようなデータは、グラフィックスまたは表示目的である必要がない。たとえば、プロセッサ12は、行列演算がそれに対してGPU14によって実施される必要があるデータを出力し得、今度は、GPU14が行列演算を実施し得る。
【0025】
[0031]概して、プロセッサ12は、超並列演算を必要とするタスクなど、処理タスクをGPU14にオフロードし得る。一例として、グラフィックス処理は超並列演算を必要とし、プロセッサ12は、そのようなグラフィックス処理タスクをGPU14にオフロードし得る。しかしながら、行列演算などの他の演算も、GPU14の並列処理能力から恩恵を受け得る。これらの例では、プロセッサ12は、GPU14に非グラフィックス関係演算を実施させるために、GPU14の並列処理能力を活用し得る。
【0026】
[0032]プロセッサ12は、特定のアプリケーション処理インターフェース(API:application processing interface)に従ってGPU14と通信し得る。そのようなAPIの例としては、Microsoft(登録商標)によるDirectX(登録商標)API、クロノスグループによるOpenGL(登録商標)またはOpenGL ES(登録商標)、およびOpenCL(登録商標)があるが、本開示の態様は、DirectX、OpenGL、またはOpenCL APIに限定されず、他のタイプのAPIに拡張され得る。その上、本開示で説明される技法は、APIに従って機能することを必要とせず、プロセッサ12およびGPU14は通信のために任意の技法を利用し得る。
【0027】
[0033]デバイス10は、ディスプレイ18と、ユーザインターフェース20と、トランシーバモジュール22とをも含み得る。デバイス10は、明快のために
図1に示されていない追加のモジュールまたはユニットを含み得る。たとえば、デバイス10は、デバイス10がモバイルワイヤレス電話である例において電話通信を実現するために、そのいずれも
図1に示されていないスピーカーおよびマイクロフォンを含み得る。さらに、デバイス10に示されている様々なモジュールおよびユニットは、デバイス10のあらゆる例において必要であるとは限らない。たとえば、ユーザインターフェース20およびディスプレイ18は、デバイス10がデスクトップコンピュータである例では、デバイス10の外部にあり得る。別の例として、ユーザインターフェース20は、ディスプレイ18がモバイルデバイスのタッチセンシティブまたはプレゼンスセンシティブディスプレイである例では、ディスプレイ18の一部であり得る。
【0028】
[0034]ディスプレイ18は、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、タッチセンシティブディスプレイ、プレゼンスセンシティブディスプレイ、または別のタイプのディスプレイデバイスを備え得る。ユーザインターフェース20の例としては、限定はしないが、トラックボール、マウス、キーボード、および他のタイプの入力デバイスがある。ユーザインターフェース20はまた、タッチスクリーンであり得、ディスプレイ18の一部として組み込まれ得る。トランシーバモジュール22は、デバイス10と別のデバイスまたはネットワークとの間のワイヤレスまたはワイヤード通信を可能にするための回路を含み得る。トランシーバモジュール22は、ワイヤードまたはワイヤレス通信のための変調器、復調器、増幅器および他のそのような回路を含み得る。
【0029】
[0035]システムメモリ16はデバイス10のためのメモリであり得る。システムメモリ16は1つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ16の例としては、限定はしないが、ランダムアクセスメモリ(RAM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM(登録商標))、フラッシュメモリ、あるいは命令および/またはデータ構造の形態の所望のプログラムコードを搬送または記憶するために使用され得、コンピュータまたはプロセッサによってアクセスされ得る、他の媒体がある。
【0030】
[0036]いくつかの態様では、システムメモリ16は、本開示ではプロセッサ12およびGPU14に起因する機能をプロセッサ12および/またはGPU14に実施させる命令を含み得る。したがって、システムメモリ16は、実行されたとき、1つまたは複数のプロセッサ(たとえば、プロセッサ12およびGPU14)に様々な機能を実施させる命令を記憶したコンピュータ可読記憶媒体であり得る。
【0031】
[0037]いくつかの例では、システムメモリ16は非一時的記憶媒体であり得る。「非一時的」という用語は、記憶媒体が、搬送波または伝搬信号では実施されないことを示し得る。ただし、「非一時的」という用語は、システムメモリ16が非可動であること、またはそれのコンテンツが静的であることを意味すると解釈されるべきではない。一例として、システムメモリ16は、デバイス10から取り外され、別のデバイスに移動され得る。別の例として、システムメモリ16と実質的に同様のメモリがデバイス10中に挿入され得る。いくつかの例では、非一時的記憶媒体は、時間とともに変化し得るデータを(たとえば、RAMに)記憶し得る。
【0032】
[0038]たとえば、本開示における他の場所でより詳細に説明されるように、システムメモリ16は、本開示で説明される1つまたは複数の例の技法を実施するプロセッサ12上で実行するコンパイラのためのコードを記憶し得る。システムメモリ16は、GPU14のシェーダコア上で実行するシェーダプログラム(たとえば、頂点シェーダ、ピクセルまたはフラグメントシェーダ、計算シェーダなど)のためのコードをも記憶し得る。
【0033】
[0039]グラフィックス項目(graphics item)という用語は、本開示では、GPU14が並列処理をそれに対して実施する基本単位を指すために使用される。GPU14は、複数のグラフィックス項目を並列に(たとえば、同時に)処理し得る。たとえば、頂点シェーダは頂点を処理し得、GPU14は、複数の頂点を同時に処理するために、頂点シェーダの複数のインスタンスを並列に実行し得る。同様に、ピクセルまたはフラグメントシェーダはディスプレイのピクセルを処理し得、GPU14は、ディスプレイの複数のピクセルを同時に処理するために、ピクセルシェーダの複数のインスタンスを並列に実行し得る。頂点およびピクセルは、グラフィックス項目の例である。
【0034】
[0040]非グラフィックス関係アプリケーションの場合、グラフィックス項目という用語は、GPU14が処理をそれに対して実施する最小単位をも指す。ただし、そのような処理は、グラフィックス関係でないことがある。したがって、「グラフィックス項目」という用語は、グラフィックス処理ユニット(たとえば、GPU14)または汎用グラフィックス処理ユニット(たとえば、GPU14がGPGPUとして機能する例)が並列に処理するべきである項目を指すように意図されている。グラフィックス項目は、グラフィカルまたは非グラフィカル目的のために使用され得る。
【0035】
[0041]以下でより詳細に説明されるように、本開示の様々な例によれば、GPU14は、GPUにおけるワープのすべてのスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信することと、1つまたは複数の述語ビットを述語ビットの単一のセットとしてメモリに記憶することと、ここにおいて、述語ビットの単一のセットはワープ中のスレッドのすべてに適用される、述語ビットの単一のセットに従って命令の第1のセットの一部分を実行することとを行うように構成される。
【0036】
[0042]
図2は、
図1に示されたデバイスの構成要素をより詳細に示すブロック図である。
図2に示されているように、GPU14は、汎用レジスタ(GPR)26と一様述語レジスタ(UPR:uniform predicate register)92とを含むシェーダコア24と、固定機能パイプライン30とを含む。シェーダコア24および固定機能パイプライン30はともに、グラフィックスまたは非グラフィックス関係機能を実施するために使用される処理パイプラインを形成し得る。処理パイプラインは、GPU14上で実行するソフトウェアまたはファームウェアによって定義された機能を実施し、特定の機能を実施するように配線接続された固定機能ユニットによって機能を実施する。
【0037】
[0043]GPU14上で実行するソフトウェアおよび/またはファームウェアはシェーダプログラム(または単にシェーダ)と呼ばれることがあり、シェーダプログラムは、GPU14のシェーダコア24上で実行し得る。1つのシェーダコア24のみが示されているが、いくつかの例では、GPU14は、シェーダコア24と同様の1つまたは複数のシェーダコアを含み得る。固定機能パイプライン30は固定機能ユニットを含む。シェーダコア24および固定機能パイプライン30は、互いにデータを送信および受信し得る。たとえば、処理パイプラインは、シェーダコア24上で実行するシェーダプログラムを含み得、シェーダコア24は、固定機能パイプライン30の固定機能ユニットからデータを受信し、処理されたデータを固定機能パイプライン30の別の固定機能ユニットに出力する。
【0038】
[0044]ユーザは、任意の考えられる様式で所望のタスクを実施するようにシェーダプログラムを設計することができるので、シェーダプログラムはユーザおよび/または開発者に機能的フレキシビリティを与える。しかしながら、固定機能ユニットは、固定機能ユニットがタスクを実施する様式のために配線接続される。したがって、固定機能ユニットは多くの機能的フレキシビリティを与えないことがある。
【0039】
[0045]シェーダプログラムの例としては、頂点シェーダプログラム32、フラグメントシェーダプログラム34、および計算シェーダプログラム36がある。頂点シェーダプログラム32およびフラグメントシェーダプログラム34は、グラフィックス関係タスクのためのシェーダプログラムであり得、計算シェーダプログラム36は、非グラフィックス関係タスクのためのシェーダプログラムであり得る。いくつかの例では、頂点シェーダプログラム32およびフラグメントシェーダプログラム34のようなグラフィックス関係シェーダプログラムのみが使用され得る。いくつかの例では、計算シェーダプログラム36のような非グラフィックス関係シェーダプログラムのみが使用され得る。簡潔の目的で説明されない、ジオメトリシェーダなどのシェーダプログラムの追加の例がある。
【0040】
[0046]プロセッサ12上で実行するグラフィックスドライバ40は、アプリケーションプログラミングインターフェース(API)を実装するように構成され得る。そのような例では、シェーダプログラム(たとえば、頂点シェーダプログラム32、フラグメントシェーダプログラム34、および計算シェーダプログラム36)は、グラフィックスドライバ40と同じAPIに従って構成され得る。図示されていないが、システムメモリ16は、プロセッサ12が実行のためにシステムメモリ16から取り出すグラフィックスドライバ40のためのコードを記憶し得る。グラフィックスドライバ40は、この例では、グラフィックスドライバ40がハードウェア(たとえば、プロセッサ12)上で実行するソフトウェアであることを示すための点線ボックス中に示されている。しかしながら、グラフィックスドライバ40の機能の一部または全部は、プロセッサ12上のハードウェアとして実装され得る。
【0041】
[0047]グラフィックスドライバ40は、プロセッサ12とGPU14とが互いに通信できるように構成され得る。たとえば、プロセッサ12が、グラフィックスまたは非グラフィックス処理タスクをGPU14にオフロードするとき、プロセッサ12は、そのような処理タスクをグラフィックスドライバ40を介してGPU14にオフロードする。
【0042】
[0048]一例として、プロセッサ12は、グラフィックスデータを生成するゲームアプリケーションを実行し得、プロセッサ12は、このグラフィックスデータの処理をGPU14にオフロードし得る。この例では、プロセッサ12は、グラフィックスデータをシステムメモリ16に記憶し得、グラフィックスドライバ40は、グラフィックスデータをいつ取り出すべきかと、システムメモリ16においてどこからグラフィックスデータを取り出すべきかと、グラフィックスデータをいつ処理すべきかとを、GPU14に命令し得る。また、ゲームアプリケーションは、GPU14が1つまたは複数のシェーダプログラムを実行することを必要とし得る。たとえば、ゲームアプリケーションは、シェーダコア24が、(たとえば、
図1のディスプレイ18上に)表示されるべきである画像を生成するために、頂点シェーダプログラム32とフラグメントシェーダプログラム34とを実行することを必要とし得る。グラフィックスドライバ40は、いつシェーダプログラムを実行すべきかをGPU14に命令し、シェーダプログラムのために必要とされるグラフィックスデータをどこで取り出すべきかをGPU14に命令し得る。このようにして、グラフィックスドライバ40は、プロセッサ12とGPU14との間のリンクを形成し得る。
【0043】
[0049]グラフィックスドライバ40は、APIに従って構成され得るが、グラフィックスドライバ40は、特定のAPIに従って構成されることに限定される必要はない。デバイス10がモバイルデバイスである一例では、グラフィックスドライバ40は、OpenGL ES APIに従って構成され得る。OpenGL ES APIは、モバイルデバイスのために特別に設計される。デバイス10が非モバイルデバイスである一例では、グラフィックスドライバ40は、OpenGL APIに従って構成され得る。他の例示的なAPIとしては、マイクロソフト社によるAPIのDirectXファミリーがある。
【0044】
[0050]いくつかの例では、システムメモリ16は、頂点シェーダプログラム32と、フラグメントシェーダプログラム34と、計算シェーダプログラム36とのうちの1つまたは複数のためのソースコードを記憶し得る。これらの例では、プロセッサ12上で実行するコンパイラ38は、ランタイム中に(たとえば、これらのシェーダプログラムがシェーダコア24上で実行されるべきである時間において)GPU14のシェーダコア24によって実行可能なオブジェクトまたは中間コードを作成するために、これらのシェーダプログラムのソースコードをコンパイルし得る。いくつかの例では、コンパイラ38は、シェーダプログラムをプリコンパイルし、シェーダプログラムのオブジェクトまたは中間コードをシステムメモリ16に記憶し得る。
【0045】
[0051]シェーダコア24は、同じシェーダプログラムの同じ命令の多くのインスタンスを並列に実行するように構成され得る。たとえば、グラフィックスドライバ40は、複数の頂点のための頂点値を取り出すようにGPU14に命令し、頂点の頂点値を処理するために頂点シェーダプログラム32を実行するようにGPU14に命令し得る。この例では、シェーダコア24は、頂点シェーダプログラム32の複数のインスタンスを実行し、頂点の各々のためのシェーダコア24の1つの処理要素上で頂点シェーダプログラム32の1つのインスタンスを実行することによって、そうすることがある。
【0046】
[0052]シェーダコア24の各処理要素は、同じインスタンスにおいて頂点シェーダプログラム32の同じ命令を実行し得るが、特定の頂点値は、各処理要素が異なる頂点を処理しているので、異なり得る。上記で説明されたように、各処理要素は、頂点シェーダプログラム32のスレッドを実行するものと見なされ得、ここで、スレッドは、特定の頂点を処理している頂点シェーダプログラム32の1つの命令を指す。このようにして、シェーダコア24は、複数の頂点の頂点値を並列に(たとえば、同時に)処理するために、頂点シェーダプログラム32の多くのインスタンスを実行し得る。
【0047】
[0053]シェーダコア24は、同様に、複数のピクセルのピクセル値を並列に処理するために、フラグメントシェーダプログラム34の多くのインスタンスを実行するか、または多くの非グラフィックス関係データを並列に処理するために、計算シェーダプログラム36の多くのインスタンスを実行し得る。このようにして、シェーダコア24は、単一命令複数データ(SIMD)構造で構成され得る。説明しやすいように、以下は、一般シェーダプログラムに関して説明されるが、それの例としては、頂点シェーダプログラム32、フラグメントシェーダプログラム34、計算シェーダプログラム36、およびジオメトリシェーダなどの他のタイプのシェーダがある。
【0048】
[0054]システムメモリ16は、プロセッサ12が実行のためにシステムメモリ16から取り出す、コンパイラ38のためのコードを記憶し得る。
図2の例では、コンパイラ38は、この例では、コンパイラ38がハードウェア(たとえば、プロセッサ12)上で実行するソフトウェアであることを示すための点線ボックス中に示されている。しかしながら、いくつかの例では、コンパイラ38のいくつかの機能は、プロセッサ12上のハードウェアとして実装され得る。
【0049】
[0055]本開示の技法によれば、プロセッサ12は、シェーダプログラム(たとえば、頂点シェーダプログラム32、フラグメントシェーダプログラム34、計算シェーダプログラム36、または任意の他のシェーダプログラム)からの命令の特定のセットが分岐命令を含むかどうかを決定するように構成され得る。この例では、命令のセットは、シェーダコア24(たとえば、SIMD処理コア)を使用して(たとえば、複数のスレッドを並列に使用して)ワープとして実施されるべき命令の特定のセットであり得る。プロセッサ12上で実行するコンパイラ38は、ワープのための命令のセットが分岐命令を含むという決定を行うように構成され得る。
【0050】
[0056]
図3は、分岐命令39を含む命令のセット37を示す概念図である。この例では、分岐命令39は、if−then−else分岐命令である。一般論として、「if(条件)」という項は、特定の条件が真であるかどうかを(たとえば、ある値を別の値と比較することによって)決定する。条件がどのように決定されるかにかかわらず、条件が真である場合、シェーダコア24中の処理要素は、命令のセット37の第1の部分41(たとえば、「then」分岐に関連する命令の部分)を実行する。条件が真でない場合、処理要素は、命令のセット37の第2の部分43(たとえば、「else」分岐に関連する命令の部分)を実行する。
【0051】
[0057]再び
図2を参照すると、GPU14および/またはコンパイラ38は、ワープの各スレッドが分岐命令をどのように取ることになるかを決定するように構成され得る。この決定に基づいて、GPU14および/またはコンパイラ38は、スレッドが分岐命令をどのように取ることになるかを示すために、ワープの各スレッドのために述語ビットを割り当て得る。事実上、述語ビットは、特定のスレッドによって命令のセットのどの部分が実行されることになるかを示す。たとえば、述語ビットは、
図3の第1の部分41が実行されるべきなのか
図3の第2の部分43が実行されるべきなのかを示し得る。
【0052】
[0058]いくつかの例では、述語ビットは、命令のセットのどの部分を実行すべきかを指定し得る。他の例では、述語ビットは、命令のセットのどの部分を実行すべきでないかを示す。とにかく、ワープの各スレッドは、命令のセットを並列に実行する。特定のスレッドが、述語ビットによって示されるような、命令のセットの特定の部分を実行しない場合、その特定のスレッドはアクションを実施しない(たとえば、演算命令を実行しない)が、ワープ中の他のスレッドは、命令のセットのその特定の部分を実行する。
【0053】
[0059]本開示の技法によれば、プロセッサ12は(たとえば、コンパイラ38の実行を通して)、ワープのすべてのスレッドが分岐命令の同じ分岐を取ることになるかどうかを決定するようにさらに構成され得る。そのような決定が行われた場合、コンパイラ38は、ワープ中のあらゆるスレッドのために使用され得る一様述語ビット(uniform predicate bit)の単一のセットを設定するようにGPU14に示し得る。すなわち、すべてのスレッドが条件付き分岐命令の同じ分岐を取るとき、ワープの各スレッドのための別個の述語ビットを有するのではなく、述語ビットの単一のセットのみが記憶される。
【0054】
[0060]たとえば、コンパイラ38は、一様述語ビットの単一のセットをUPR92に記憶するように構成されるか、または、GPU14に、一様述語ビットの単一のセットをUPR92に記憶させるように構成され得る。UPR92は、ワープの特定のスレッドを実行しているシェーダコア24中の各処理要素によってアクセス可能であるレジスタまたは他のタイプのメモリであり得る。コンパイラ38は、任意の様式で、ワープのすべてのスレッドが条件付き分岐命令の同じ分岐を取ると決定し得る。たとえば、コンパイラ38は、ワープのための入力値が、定数ベースであるか、または一様汎用レジスタ(uGPR:uniform general purpose register)からアクセスされる場合、そのような決定を行い得る。
【0055】
[0061]一例として、シェーダプログラム(たとえば、頂点シェーダプログラム32、フラグメントシェーダプログラム34、または計算シェーダプログラム36)をコンパイルしながら、コンパイラ38は、ワープとして実行されるべきシェーダプログラムの命令のセットが、一様なデータにアクセスすることを必要とするかどうかを決定し得る。このコンテキストでは、シェーダプログラムが一様なデータへのアクセスを必要とすることは、シェーダコア24のそれぞれの処理要素上で実行するシェーダプログラムの各スレッドが、それぞれ同じデータを要求することを意味する。この例では、シェーダコア24は、uGPRからこの同じデータを取り出し得る。
【0056】
[0062]別の例として、シェーダプログラムは、分岐命令(たとえば、if−then−else命令)を含み得る。いくつかの特定の分岐のために、シェーダプログラムは、1つまたは複数の変数を定数値に等しく設定する命令(たとえば、x、y、zおよびw座標をすべて0に等しく設定する命令)を含み得る。この例では、コンパイラ38は、定数値が、ワープ中のすべてのスレッドにわたって一様であるグラフィックス項目の変数のためのデータであると決定し得る。
【0057】
[0063]コンパイラ38が、シェーダプログラムがグラフィックス波にわたって一様なデータにアクセスすることを必要とすると決定した場合、コンパイラ38は、データがグラフィックス波にわたって一様であることをシェーダコア24に示す明示的命令を含み得る。応答して、GPU14は、UPR92における一様述語ビットを設定し得る。いくつかの例では、一様なデータは、一様なデータ(すなわち、ワープのすべてのスレッドによって一様にアクセス可能であるデータ)を記憶するために割り振られるGPR26のセクションに記憶され得る。一様なデータのために割り振られたGPR26のそのようなセクションは、uGPRと呼ばれることがある。
【0058】
[0064]分岐命令を含むコードの一般的な例について考える。たとえば、高水準言語では、分岐命令の一例は、以下の通りであり得る。
【0060】
[0065]一例では、そのようなコードは、コンパイラ38によって以下のようにコンパイルされ得る。
【0062】
[0066]別の例では、「分岐(branch)」命令の代わりに「述語(predication)」が使用され得る。
【0064】
[0067]コンパイラ38が、R0中の値とR1中の値が「一様」であると決定することができない場合、スレッドごとの述語ビットが使用されことになる。しかしながら、値R0と値R1とが一様であるとコンパイラ38が決定した場合(たとえば、使用される値が定数レジスタから来る場合、「一様な」述語(UP0)が代わりに使用され得る。
【0066】
[0068]
図4は、GPUのシェーダコアのGPRにおけるデータ記憶の一例を示す概念図である。図示のように、GPU14はシェーダコア24を含み、シェーダコア24はGPR26を含む。
図4に示されていないが、シェーダコア24は、シェーダプログラムのインスタンスをそれぞれ実行する複数の処理要素をも含む。
【0067】
[0069]一例として、シェーダコア24は、32個の処理要素を含み得、各々は、1つのグラフィックス項目を処理するためにシェーダプログラムの1つのインスタンスを実行し得る。GPR26は、グラフィックス項目のためのデータを記憶し得る。たとえば、GPR26は、32個のグラフィックス項目のための9つの属性のための属性データを記憶し得る。しかしながら、GPR26は、32個のグラフィックス項目のための9つよりも多いまたは少ない属性のためのデータを記憶し得る。また、GPR26は、グラフィックス項目の属性に関連しないが、グラフィックス項目を処理するために必要とされる変数のためのデータである、データを記憶し得る。
【0068】
[0070]
図4に示されている例では、グラフィックス項目は、頂点であり得るP0〜P31として識別される。属性は、グラフィックス項目識別子に続く変数によって識別される。たとえば、P0.Xは、P0グラフィックス項目のためのx座標を指し、P0.YはP0グラフィックス項目のためのy座標を指し、以下同様である。P0.R、P0.G、P0.B、およびP0.Aは、それぞれ、P0グラフィックス項目の赤色成分、緑色成分、青色成分、および不透明部を指す。他のグラフィックス項目(たとえば、P1〜P31)が、同様に識別される。
【0069】
[0071]言い換えれば、
図4では、頂点P0〜P31はそれぞれ、複数の変数に関連する。一例として、頂点P0〜P31の各々は、x座標(P0.X〜P31.X)を識別する変数に関連する。頂点P0〜P31の各々は、y座標(P0.Y〜P31Y)を識別する変数に関連し、以下同様である。これらの変数の各々は、複数のグラフィックス項目の各々を処理するために必要とされる。たとえば、x座標を識別する変数は、頂点P0〜P31の各々を処理するために必要とされる。
【0070】
[0072]また、
図4に示されているように、グラフィックス項目の各々はPRJ属性をも含む。PRJ属性は、シェーダコア24の処理要素上で実行する頂点シェーダが利用し得る射影行列(projection matrix)である。この例では、PRJ属性は、頂点P0〜P31の各々を処理するために必要とされる別の変数である。たとえば、頂点シェーダは、射影行列にそれぞれの座標を乗算し(たとえば、P0.PRJにP0.X、P0.Y、P0.Z、およびP0.Wを乗算し)得る。
【0071】
[0073]GPU14がデータ(たとえば、値)をそれに記憶し得る様々なユニットがあり得ることを理解されたい。GPU14は、データをシステムメモリ16に記憶し得、またはデータをローカルメモリ(たとえば、キャッシュ)に記憶し得る。シェーダコア24のGPR26は、システムメモリ16とGPU14のローカルメモリの両方とは別個である。たとえば、システムメモリ16は、デバイス10の様々な構成要素によってアクセス可能であり、これらの構成要素は、データを記憶するためにシステムメモリ16を使用する。GPU14のローカルメモリは、GPU14の様々な構成要素によってアクセス可能であり、これらの構成要素は、データを記憶するためにGPU14のローカルメモリを使用する。しかしながら、GPR26は、シェーダコア24の構成要素によってのみアクセス可能であり得、シェーダコア24の処理要素のためのデータのみを記憶し得る。
【0072】
[0074]いくつかの例では、グラフィック波中のグラフィックス項目の1つまたは複数の変数が、グラフィック波にわたって一様である。そのような例では、1つまたは複数の変数のための一様なデータをGPR26中の各スレッドのための別個のエントリに記憶するのではなく、GPU14は、一様なデータをuGPR27に1回記憶し得る。
図4に示されているように、uGPR27はGPR26の一部である。他の例では、uGPR27は別個のレジスタであり得る。
【0073】
[0075]一例では、uGPR27は複数の記憶ロケーションを含み得、各記憶ロケーションは、グラフィックス項目の複数の属性のうちの1つの属性に関連する。たとえば、
図4に示されているように、各グラフィックス項目P0〜P31は、9つの属性(PRJ、x、y、z、w、R、G、B、およびA)を含む。この例では、uGPR27は、9つの記憶ロケーションを含み得、uGPR27の第1のロケーションはPRJ属性に関連し、uGPR27の第2のロケーションはx座標に関連し、以下同様である。同じく、uGPR27中のデータは、ワープの各スレッドによって使用され得る。
【0074】
[0076]
図5は、本開示の一様な述語のための技法を実装するために使用され得るGPU14の例示的な構成を示すブロック図である。GPU14は、プログラムのための命令を並列様式で実行するように構成される。GPU14は、制御ユニット72と、処理要素74A〜74D(総称して「処理要素74」)と、命令ストア76と、データストア78と、通信経路80、82、84、86A〜86Dと、述語レジスタ(PR)75A〜75D(総称して「述語レジスタ(PR)75またはPR75)と、一様述語レジスタ(UPR)92とを含む、シェーダコア24を含む。通信経路86A〜86Dは、総称して「通信経路86」と呼ばれることがある。いくつかの例では、GPU14は、処理要素74を使用してプログラム(たとえば、シェーダ)のワープのための複数の実行スレッドを実行するように構成された、単一命令複数データ(SIMD)処理システムとして構成され得る。そのようなSIMDシステムでは、処理要素74は一緒に、異なるデータ項目に関して単一の命令を一度に処理し得る。プログラムは、プログラムに関連するスレッドのすべてが実行を完了した後に退き得る。
【0075】
[0077]制御ユニット72は、通信経路80を介して命令ストア76に通信可能に結合され、通信経路82を介して処理要素74に通信可能に結合され、通信経路84を介してデータストア78に通信可能に結合される。制御ユニット72は、読取り命令を命令ストア76に送るために通信経路80を使用し得る。読取り命令は、命令がそこから取り出されるべきである命令ストア76中の命令アドレスを指定し得る。制御ユニット72は、読取り命令を送ったことに応答して、命令ストア76から1つまたは複数のプログラム命令を受信し得る。制御ユニット72は、命令を処理要素74に与えるために、およびいくつかの例では、処理要素74からのデータ、たとえば、分岐条件を評価するための比較命令の結果を受信するために、通信経路82を使用し得る。いくつかの例では、制御ユニット72は、たとえば、分岐条件を決定するために、データストア78からデータ項目値を取り出すために通信経路84を使用し得る。
図4は、通信経路84を含むものとしてGPU14を示しているが、他の例では、GPU14は通信経路84を含まないことがある。
【0076】
[0078]処理要素74の各々は、命令ストア76に記憶されたプログラムのための命令を処理するように構成され得る。いくつかの例では、処理要素74の各々は、演算の同じセットを実施するように構成され得る。たとえば、処理要素74の各々は、同じ命令セットアーキテクチャ(ISA:instruction set architecture)を実装し得る。追加の例では、処理要素74の各々は、算術論理ユニット(ALU:arithmetic logic unit)であり得る。さらなる例では、GPU14はベクトルプロセッサとして構成され得、処理要素74の各々はベクトルプロセッサ内の処理要素であり得る。追加の例では、GPU14はSIMD実行ユニットであり得、処理要素74の各々はSIMD実行ユニット内のSIMD処理要素であり得る。
【0077】
[0079]処理要素74によって実施される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、たとえば、加算演算、減算演算、乗算演算などの演算を含み得る。算術演算は、たとえば、整数算術演算および/または浮動小数点算術演算をも含み得る。論理演算は、たとえば、ビット単位AND演算、ビット単位OR演算、ビット単位XOR演算などの演算を含み得る。比較演算は、たとえば、大なり演算、小なり演算、ゼロに等しい(equal to zero)演算、ゼロに等しくない(not equal to zero)演算などの演算を含み得る。大なり演算および小なり演算は、第1のデータ項目が第2のデータ項目よりも大きいのか第2のデータ項目よりも小さいのかを決定し得る。ゼロに等しい演算およびゼロに等しくない演算は、データ項目がゼロに等しいのかゼロに等しくないのかを決定し得る。演算のために使用されるオペランドは、データストア78中に含まれているレジスタに記憶され得る。
【0078】
[0080]処理要素74の各々は、通信経路82を介して制御ユニット72からの命令を受信したことに応答して、演算を実施するように構成され得る。いくつかの例では、処理要素74の各々は、他の処理要素74とは無関係にアクティブ化および/または非アクティブ化されるように構成され得る。そのような例では、処理要素74の各々は、それぞれの処理要素74A〜74Dがアクティブ化されているとき、制御ユニット72からの命令を受信したことに応答して演算を実施し、それぞれの処理要素74A〜74Dが非アクティブ化されているとき、すなわち、アクティブ化されていないとき、制御ユニット72からの命令を受信したことに応答して演算を実施しないように構成され得る。
【0079】
[0081]処理要素74A〜74Dの各々は、それぞれの通信経路86A〜86Dを介してデータストア78に通信可能に結合され得る。処理要素74は、通信経路86を介して、データストア78からデータを取り出し、データをデータストア78に記憶するように構成され得る。データストア78から取り出されるデータは、いくつかの例では、処理要素74によって実施される演算のためのオペランドであり得る。データストア78に記憶されるデータは、いくつかの例では、処理要素74によって実施された演算の結果であり得る。
【0080】
[0082]命令ストア76は、GPU14が実行するためのプログラムを記憶するように構成される。プログラムは、命令のシーケンスとして記憶され得る。いくつかの例では、各命令は、一意の命令アドレス値によってアドレス指定され得る。そのような例では、命令のシーケンス中のより遅い命令のための命令アドレス値は、命令のシーケンス中のより早い命令のための命令アドレス値よりも大きい。プログラム命令は、いくつかの例では、マシンレベル命令であり得る。すなわち、そのような例では、命令は、GPU14のISAに対応する形式であり得る。命令ストア76は、通信経路80を介して制御ユニット72から読取り命令を受信するように構成される。読取り命令は、命令がそれから取り出されるべきである命令アドレスを指定し得る。読取り命令を受信したことに応答して、命令ストア76は、読取り命令において指定された命令アドレスに対応する命令を、通信経路80を介して制御ユニット72に与え得る。
【0081】
[0083]命令ストア76は、任意のタイプのメモリ、キャッシュまたはそれらの組合せであり得る。命令ストア76がキャッシュであるとき、命令ストア76は、GPU14の外部のプログラムメモリに記憶されるプログラムをキャッシュし得る。命令ストア76はGPU14内にあるものとして示されているが、他の例では、命令ストア76はGPU14の外部にあり得る。
【0082】
[0084]データストア78は、処理要素74によって使用されるデータ項目を記憶するように構成される。いくつかの例では、データストア78は複数のレジスタを備え得、各レジスタは、GPU14上で演算された複数のデータ項目内のそれぞれのデータ項目を記憶するように構成される。データストア78は、データストア78中のレジスタとメモリまたはキャッシュ(図示せず)との間でデータを転送するように構成された、1つまたは複数の通信経路(図示せず)に結合され得る。
【0083】
[0085]
図4は、処理要素74によって使用されるデータを記憶するための単一のデータストア78を示しているが、他の例では、GPU14は、処理要素74の各々のための別個の専用データストアを含み得る。GPU14は、例示のために4つの処理要素74を示す。他の例では、GPU14は、同じ構成または異なる構成で、はるかに多い処理要素を有し得る。
【0084】
[0086]制御ユニット72は、命令ストア76に記憶されたプログラムのための命令を実行するようにGPU14を制御するように構成される。プログラムの各命令または命令のセットについて、制御ユニット72は、通信経路80を介して命令ストア76から命令を取り出し、命令を処理し得る。いくつかの例では、制御ユニット72は、命令に関連する演算が処理要素74のうちの1つまたは複数上で実行することを引き起こすことによって、命令を処理し得る。たとえば、制御ユニット72によって取り出される命令は、命令によって指定されたデータ項目に関して算術演算を実施するようにGPU14に命令する、算術命令であり得、制御ユニット72は、処理要素74のうちの1つまたは複数に、算術演算を指定されたデータ項目に対して実施させ得る。さらなる例では、制御ユニット72は、処理要素74上で演算が実施されることを引き起こすことなしに、命令を処理し得る。
【0085】
[0087]制御ユニット72は、命令を通信経路82を介して処理要素74に与えることによって、処理要素74のうちの1つまたは複数上で演算が実施されることを引き起こし得る。命令は、処理要素74によって実施されるべき演算を指定し得る。処理要素74のうちの1つまたは複数に与えられる命令は、命令ストア76から取り出された命令と同じであるかまたはそれとは異なり得る。いくつかの例では、制御ユニット72は、演算がそれの上で実施されるべきである処理要素74の特定のサブセットをアクティブ化することと、演算がそれの上で実施されるべきでない処理要素74の別のサブセットを非アクティブ化することとの一方または両方によって、(単一の処理要素だけを含む)処理要素74の特定のサブセット上で演算が実施されることを引き起こし得る。制御ユニット72は、それぞれのアクティブ化信号および/または非アクティブ化信号を通信経路82を介して処理要素74の各々に与えることによって、処理要素74をアクティブ化および/または非アクティブ化し得る。いくつかの例では、制御ユニット72は、命令を処理要素74に与えることとともに、アクティブ化信号および/または非アクティブ化信号を処理要素74に与えることによって、処理要素74をアクティブ化および/または非アクティブ化し得る。さらなる例では、制御ユニット72は、命令を処理要素74に与えるより前に、処理要素74をアクティブ化および/または非アクティブ化し得る。
【0086】
[0088]制御ユニット72は、処理要素74を使用して、プログラムのための複数の実行スレッドを実行し得る並列に実行されるべき複数のスレッドは、ワープと呼ばれることがある。処理要素74の各々は、複数のスレッドのそれぞれのスレッドのためのプログラムの命令を処理するように構成され得る。たとえば、制御ユニット72は、処理するために各実行スレッドを処理要素74のうちの個々の処理要素に割り当て得る。プログラムのための実行スレッドは、データ項目のセット中の異なるデータ項目に関して、命令の同じセットを実行し得る。たとえば、処理要素74Aは、複数のデータ項目中のデータ項目の第1のサブセットに関して、命令ストア76に記憶されたプログラムのための第1の実行スレッドを実行し得、処理要素74Bは、複数のデータ項目中のデータ項目の第2のサブセットに関して、命令ストア76に記憶されたプログラムのための第2の実行スレッドを実行し得る。第1の実行スレッドは第2の実行スレッドと同じ命令を含み得るが、データ項目の第1のサブセットはデータ項目の第2のサブセットとは異なり得る。
【0087】
[0089]いくつかの例では、制御ユニット72が、複数の実行スレッド中の個々のスレッドをアクティブ化および非アクティブ化し得る。制御ユニット72がスレッドを非アクティブ化するとき、制御ユニット72は、スレッドを実行するために割り当てられた処理要素74A〜74Dをも非アクティブ化および/または無効化し得る。そのような非アクティブ化されたスレッドは、非アクティブスレッド(inactive thread)と呼ばれることがある。同様に、制御ユニット72がスレッドをアクティブ化するとき、制御ユニット72は、スレッドを実行するために割り当てられた処理要素74A〜74Dをもアクティブ化し得る。そのようなアクティブ化されたスレッドは、アクティブスレッド(active thread)と呼ばれることがある。以下でより詳細に説明されるように、制御ユニット72は、他のアクティブスレッドまたは非アクティブスレッドを考慮する必要なしに、発散(divergent)演算(たとえば、直列演算)を実行するためにアクティブスレッドを選択するように構成され得る。
【0088】
[0090]本明細書で使用される、アクティブスレッドはアクティブ化されたスレッドを指すことがあり、非アクティブスレッドは非アクティブ化されたスレッドを指すことがある。所与の処理サイクル(processing cycle)中にGPU14上で実行する複数のスレッドについて、アクティブスレッドの各々は、処理サイクル中に複数スレッドのためのグローバルプログラムカウンタレジスタによって識別されたプログラムの命令を処理するように構成され得る。たとえば、制御ユニット72は、アクティブスレッドに割り当てられた処理要素74を処理サイクル中にプログラムの命令を処理するように構成するために、そのような処理要素74をアクティブ化し得る。一方、所与の処理サイクル中にGPU14上で実行する複数のスレッドについて、非アクティブスレッドの各々は、処理サイクル中にプログラムの命令を処理しないように構成され得る。たとえば、制御ユニット72は、非アクティブスレッドに割り当てられた処理要素74を処理サイクル中にプログラムの命令を処理しないように構成するために、そのような処理要素74を非アクティブ化し得る。
【0089】
[0091]いくつかの例では、処理サイクルは、プログラムカウンタの連続ロード間の時間間隔を指すことがある。たとえば、処理サイクルは、プログラムカウンタが第1の値をロードされるときと、プログラムカウンタが第2の値をロードされるときとの間の時間を指すことがある。第1の値と第2の値とは、同じ値または異なる値であり得る。プログラムカウンタが再開検査技法による非同期様式でロードされる例では、そのような非同期ロードは、いくつかの例では、処理サイクルを区別するように働かないことがある。言い換えれば、そのような例では、処理サイクルは、プログラムカウンタの連続同期ロード間の時間間隔を指すことがある。プログラムカウンタの同期ロードは、いくつかの例では、クロック信号によってトリガされるロードを指すことがある。
【0090】
[0092]次の命令の取出しより前のあるとき、制御ユニット72は、GPU14によって処理されるべき次の命令を決定する。制御ユニット72が、処理されるべき次の命令を決定する様式は、GPU14によって前に取り出された命令が制御フロー命令であるかどうかに応じて異なる。GPU14によって前に取り出された命令が制御フロー命令でない場合、制御ユニット72は、GPU14によって処理されるべき次の命令が、命令ストア76に記憶された次の連続命令に対応すると決定し得る。たとえば、命令ストア76は、プログラムのための命令を、順序付けされたシーケンスで記憶し得、次の連続命令は、前に取り出された命令の直後に生じる命令であり得る。
【0091】
[0093]GPU14によって前に取り出された命令が制御フロー命令である場合、制御ユニット72は、制御フロー命令において指定された情報に基づいて、GPU14によって処理されるべき次の命令を決定し得る。たとえば、制御フロー命令は無条件制御フロー命令、たとえば、無条件分岐命令またはジャンプ命令であり得、その場合、制御ユニット72は、GPU14によって処理されるべき次の命令が、制御フロー命令によって識別されるターゲット命令であると決定し得る。別の例として、制御フロー命令は条件付き制御フロー命令、たとえば、条件付き分岐命令であり得、その場合、制御ユニット72は、制御フロー命令によって識別されたターゲット命令、または、命令ストア76に記憶された次の連続命令のうちの1つを、命令ストア76からの処理すべき次の命令として選択し得る。
【0092】
[0094]本明細書で使用される制御フロー命令は、命令ストア76中のターゲット命令を識別する情報を含む命令を指すことがある。たとえば、制御フロー命令は、制御フロー命令のためのターゲットプログラムカウンタ値を示すターゲット値を含み得る。ターゲットプログラムカウンタ値は、ターゲット命令のためのターゲットアドレスを示し得る。ターゲット命令は、いくつかの例では、命令ストア76に記憶された次の連続命令とは異なり得る。高レベルプログラムコードは、たとえば、if文,switch文、do文、for文、while文、continue文、break文、およびgoto文など、制御フロー文を含み得る。コンパイラ38は、高レベル制御フロー文を、低レベル、たとえば、マシンレベル制御フロー命令に変換し得る。制御フロー命令でない命令は、本明細書では連続命令と呼ばれることがある。たとえば、連続命令は、ターゲット命令を識別する情報を含まないことがある。
【0093】
[0095]制御フロー命令のために、ターゲット命令を識別する情報は、命令ストア76に記憶されたターゲット命令を示す値であり得る。いくつかの例では、命令ストア76中のターゲット命令を示す値は、命令ストア76中のターゲット命令の命令アドレスを示す値であり得る。ターゲット命令の命令アドレスを示す値は、いくつかの場合には、命令ストア76中のターゲット命令のアドレスであり得る。ターゲット命令の命令アドレスを示す値は、追加の場合には、ターゲット命令のアドレスを計算するために使用される値であり得る。さらなる例では、ターゲット命令の命令アドレスを示す値は、ターゲット命令に対応するターゲットプログラムカウンタ値を示す値であり得る。ターゲットプログラムカウンタ値を示す値は、いくつかの場合には、ターゲット命令に対応するターゲットプログラムカウンタ値であり得る。ターゲットプログラムカウンタ値を示す値は、追加の場合には、ターゲットプログラムカウンタ値を計算するために使用される値であり得る。ターゲット命令に対応するターゲットプログラムカウンタ値は、いくつかの例では、ターゲット命令のアドレスに等しくなり得る。
【0094】
[0096]制御フロー命令は、順方向制御フロー命令または逆方向制御フロー命令であり得る。順方向制御フロー命令は、ターゲット命令が、命令ストア76に記憶された命令の順序付けされたシーケンスにおいて制御フロー命令の後に生じる、制御フロー命令であり得る。逆方向制御フロー命令は、ターゲット命令が、命令ストア76に記憶された命令の順序付けされたシーケンスにおいて次の連続命令の前に生じる、制御フロー命令であり得る。次の連続命令は、命令の順序付けされたシーケンスにおいて制御フロー命令の直後に生じ得る。
【0095】
[0097]制御フロー命令は、条件付き制御フロー命令または無条件制御フロー命令であり得る。条件付き制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含む。条件付き制御フロー命令を処理するとき、条件が満たされたと制御ユニット72が決定した場合、制御ユニット72は、処理されるべき次の命令がターゲット命令であると決定し得る。一方、条件が満たされないと制御ユニット72が決定した場合、制御ユニット72は、処理されるべき次の命令が、命令ストア76に記憶された次の連続命令であると決定し得る。無条件制御フロー命令は、制御フロー命令に関連するターゲット命令にジャンプするための条件を指定する情報を含まない。無条件制御フロー命令を処理するとき、制御ユニット72は、処理すべき次の命令が、制御フロー命令によって識別されるターゲット命令であると無条件に決定し得る。言い換えれば、そのような場合での決定は、無条件制御フロー命令において指定されるいかなる条件も、条件としない。本明細書で使用される条件制御フロー命令は、分岐命令が、そうではなく無条件分岐命令として指定されない限り、本明細書では分岐命令と呼ばれることがある。また、無条件制御フロー命令は、本明細書ではジャンプ命令と呼ばれることがある。
【0096】
[0098]条件付き分岐命令は、1つまたは複数のデータ項目値に関して指定される条件を含み得る。たとえば、1つのタイプの条件は、GPU14において実行する各アクティブスレッドについて、第1のデータ項目値を第2のデータ項目値と比較する比較条件であり得る。データ項目値を比較することは、たとえば、第1のデータ項目値が、第2のデータ項目値よりも大きいのか、それよりも小さいのか、それ以下であるのか、それ以上であるのか、それに等しいのか、それに等しくないのかを決定することを含み得る。別のタイプの条件は、GPU14上で実行する各アクティブスレッドのためのデータ項目値がゼロに等しいのか等しくないのかを決定する、ゼロ検査条件であり得る。各処理要素74が、異なるデータ項目に対して演算するので、条件を評価した結果は、GPU14上で実行する各アクティブスレッドについて異なり得る。
【0097】
[0099]GPU14上で実行するアクティブスレッドのすべてが分岐条件を満たすか、またはGPU14上で実行するアクティブスレッドのすべてが分岐条件を満たさない場合、一様分岐条件が生じ、スレッドのための分岐ダイバージェンスは、一様であると言われる。一方、GPU14上で実行するアクティブスレッドのうちの少なくとも1つが分岐条件を満たし、GPU14上で実行するアクティブスレッドのうちの少なくとも1つが分岐条件を満たさない場合、発散分岐条件が生じ、スレッドのための分岐ダイバージェンスは、発散であると言われる。
【0098】
[0100]発散命令の一例はif−then−else命令である。上記で説明されたように、if−then−else命令を処理するとき、「if(条件)」という項は、(たとえば、ある値を別の値と比較することによって)特定の条件が真であるかどうかを決定する。条件がどのように決定されるかにかかわらず、条件が真である場合、シェーダコア24中の処理要素74は、命令のセットの第1の部分(たとえば、部分41)を実行する。条件が真でない場合、処理要素74は、命令のセットの第2の部分(たとえば、部分43)を実行する。いくつかの例では、分岐条件に従って実行される命令の部分が、演算命令でないことがある(たとえば、分岐命令は、演算を実施しないようにとの命令を含み得る)。
【0099】
[0101]処理要素74の各々が分岐命令をどのように扱うべきであるかを示すために、制御ユニット72は、述語ビットをそれぞれの述語レジスタ75の各々に記憶し得る。各処理要素74は、特定の処理要素に関連する専用のPR75にアクセスし得る。これは、処理要素74の各々が、一般に、異なるデータに対して演算するからである。したがって、分岐命令のための条件は、処理要素74の各々について異なり(すなわち、分岐の各スレッドについて異なり)得る。
【0100】
[0102]上記で説明されたように、述語ビットは、特定のスレッド、したがって、特定の処理要素74によって命令のセットのどの部分が実行されることになるかを示す。いくつかの例では、述語ビットは、命令のセットのどの部分を実行すべきかを指定し得る。他の例では、述語ビットは、命令のセットのどの部分を実行すべきでないかを示す。とにかく、ワープの各処理要素74は、命令のセットを並列に実行する。特定の処理要素74が、述語ビットによって示されるような、命令のセットの特定の部分を実行しない場合、その特定の処理要素74はアクションを実施しない(たとえば、演算命令を実行しない)が、ワープ中の他の処理要素74は、命令のセットのその特定の部分を実行する。
【0101】
[0103]本開示の技法によれば、プロセッサ12は(たとえば、コンパイラ38の実行を通して)、ワープのすべてのスレッドが分岐命令の同じ分岐を取ることになるかどうかを決定するようにさらに構成され得る。そのような決定が行われた場合、コンパイラ38は、ワープ中のあらゆるスレッドのために使用され得る一様述語ビットの単一のセットを設定するようにGPU14に示し得る。すなわち、すべてスレッドが条件付き分岐命令の同じ分岐を取るとき、ワープの各スレッドのための別個の述語ビットを有するのではなく、述語ビットの単一のセットのみが記憶される。
【0102】
[0104]たとえば、制御ユニット72は、第1の命令90のためのワープのすべてのスレッドが分岐命令の同じ分岐を実行すべきであるという決定に応答して、一様述語ビット93の単一のセットをUPR92に記憶するように構成され得る。第1の命令90は、分岐命令を含むシェーダプログラムの命令の任意のセットであり得る。UPR92に記憶された述語ビット93は、ワープを実行する処理要素74の各々によってアクセス可能である。処理要素74のすべてのための述語ビット93の単一のセットを含めることによって、(各スレッドのための述語の試験とは対照的に)述語セットのために単一の試験のみが実施されるので、電力が節約され得る。
【0103】
[0105]
図6は、
図1のGPUの別の例示的なシェーダコアのより詳細なブロック図である。
図6の例では、シェーダコア24は、スカラー処理ユニット94の追加を除いて、
図5に示されているものと同じである。この例では、スカラー処理ユニット94は、UPR92中の述語ビットが、ワープのすべてスレッドが同じ方向に分岐することと、処理されるべきデータが一様であることと示す場合、第1の命令90を実行するために使用され得る。このようにして、処理要素74を含むベクトルプロセッサを使用するのではなく、一様なデータに対して実行される一様に分岐する第1の命令90を処理するために、単一のスカラー処理ユニット94が使用され得る。いくつかの例では、処理要素74は、次いで、(一様に分岐していないことがある)第2の命令91を処理するために、スカラー処理ユニット94と並列に使用され得る。
【0104】
[0106]UPR92中の述語ビット93によって示されるように、一様に分岐する命令を実行するためにスカラー処理ユニット94を使用することは、いくつかの実装利益を与える。これは、スカラー処理ユニット94が、命令のセットがどのように分岐するかを決定するためにPR75にアクセスする必要がないからである。したがって、処理要素74によって実行される第2の命令91と、スカラー処理ユニット94によって実行される第1の命令90との間には、「衝突」または曖昧な状態がない。これが、第1の命令90と第2の命令91とを並列に処理することを可能にする。
【0105】
[0107]スカラー処理ユニット94は、一度に1つのデータ項目に対して演算するように構成された任意のタイプのプロセッサであり得る。処理要素74のように、スカラー処理ユニット94はALUを含み得る。スカラー処理ユニット94によって実施される演算は、算術演算、論理演算、比較演算などを含み得る。算術演算は、たとえば、加算演算、減算演算、乗算演算、除算演算などの演算を含み得る。算術演算は、たとえば、整数算術演算および/または浮動小数点算術演算をも含み得る。論理演算は、たとえば、ビット単位AND演算、ビット単位OR演算、ビット単位XOR演算などの演算を含み得る。比較演算は、たとえば、大なり演算、小なり演算、ゼロに等しい演算、ゼロに等しくない演算などの演算を含み得る。大なり演算および小なり演算は、第1のデータ項目が第2のデータ項目よりも大きいのか第2のデータ項目よりも小さいのかを決定し得る。ゼロに等しい演算およびゼロに等しくない演算は、データ項目がゼロに等しいのかゼロに等しくないのかを決定し得る。演算のために使用されるオペランドは、データストア78中に含まれているレジスタに記憶され得る。
【0106】
[0108]いくつかの状況では、ワープによってそれに対して演算されるべき各データ要素またはグラフィックス項目が同じ値であるので、第1の命令90の各スレッドは同様に分岐する。この例では、スカラー処理ユニット94は、1つの演算を実施することのみを必要とし、その演算の結果は、処理されるべきであったすべてのデータ要素のために記憶され得る。
【0107】
[0109]
図7は、本開示の技法による、例示的な方法を示すフローチャートである。
図7の技法は、GPU14および/またはプロセッサ12(
図1参照)のうちの1つまたは複数によって実装され得る。
【0108】
[0110]本開示の一例では、GPU14は、GPU14におけるワープのすべてスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信するようにさらに構成され得る(100)。GPU14は、1つまたは複数の述語ビットを述語ビットの単一のセットとしてメモリに記憶するようにさらに構成され、ここにおいて、述語ビットの単一のセットはワープ中のスレッドのすべてに適用され得る(102)。GPU14は、述語ビットの単一のセットに従って命令の第1のセットの一部分を実行するようにされに構成され得る(104)。
【0109】
[0111]本開示の一例では、述語ビットの単一のセットは、命令の第1のセットの一部分をワープの各スレッドによって実施されるべきであるように示し、命令のセットの一部分は、命令の第1のセット中の同じ分岐に関係する。本開示の別の例では、述語ビットの単一のセットは、命令の第1のセットの一部分を、ワープの各スレッドによって実施されるべきでないように示し、命令のセットの一部分は、命令の第1のセット中の同じ分岐に関係する。
【0110】
[0112]本開示の別の例では、GPU14は、SIMD処理コア(たとえば、
図5の処理要素74)を使用して、述語ビットの単一のセットに従って命令の第1のセットを実行するように構成され得る。本開示の別の例では、GPU14は、スカラー処理ユニット(たとえば、
図6のスカラー処理ユニット94)を使用して、述語ビットの単一のセットに従って命令の第1のセットを実行するように構成され得る。一例では、GPU14は、スカラー処理ユニットを使用して、述語ビットの単一のセットに従って命令の第1のセットを実行することと並行して、SIMD処理コアを使用して、命令の第2のセットを実行するように構成され得る。
【0111】
[0113]本開示の別の例では、プロセッサ12は、GPUにおけるワープのすべてスレッドが、命令の第1のセットの同じ分岐を実行すべきであると決定することと、決定に応答して、指示を行うように構成され得る。別の例では、プロセッサ12は、命令の第1のセットのためのワープ全体が定数の同じセットを使用すると決定することによって、または、命令の第1のセットためのワープ全体が、ワープのすべてのスレッドに適用される一様汎用レジスタ(uGPR)からのデータを使用すると決定することによって、GPU14におけるワープのすべてのスレッドが命令の第1のセットの同じ分岐を実行すべきであると決定するように構成され得る。
【0112】
[0114]1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはそれらの任意の組合せで実装され得る。ソフトウェアで実装される場合、機能は、1つまたは複数の命令またはコードとしてコンピュータ可読媒体上に記憶されるか、あるいはコンピュータ可読媒体を介して送信され、ハードウェアベースの処理ユニットによって実行され得る。コンピュータ可読媒体は、データ記憶媒体などの有形媒体に対応するコンピュータ可読記憶媒体を含み得る。このようにして、コンピュータ可読媒体は、概して、非一時的である有形コンピュータ可読記憶媒体に対応し得る。データ記憶媒体は、本開示で説明された技法の実装のための命令、コードおよび/またはデータ構造を取り出すために、1つまたは複数のコンピュータあるいは1つまたは複数のプロセッサによってアクセスされ得る、任意の利用可能な媒体であり得る。コンピュータプログラム製品は、コンピュータ可読媒体を含み得る。
【0113】
[0115]限定ではなく例として、そのようなコンピュータ可読記憶媒体は、RAM、ROM、EEPROM、CD−ROMまたは他の光ディスクストレージ、磁気ディスクストレージ、または他の磁気ストレージデバイス、フラッシュメモリ、あるいは命令またはデータ構造の形態の所望のプログラムコードを記憶するために使用され得、コンピュータによってアクセスされ得る、任意の他の媒体を備えることができる。コンピュータ可読記憶媒体およびデータ記憶媒体は、搬送波、信号、または他の一時的媒体を含まないが、代わりに非一時的有形記憶媒体を対象とすることを理解されたい。本明細書で使用されるディスク(disk)およびディスク(disc)は、コンパクトディスク(disc)(CD)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(disc)(DVD)、フロッピー(登録商標)ディスク(disk)、およびBlu−ray(登録商標)ディスク(disc)を含み、ディスク(disk)は、通常、データを磁気的に再生し、ディスク(disc)は、データをレーザーで光学的に再生する。上記の組合せもコンピュータ可読媒体の範囲内に含まれるべきである。
【0114】
[0116]命令は、1つまたは複数のデジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、あるいは他の等価な集積回路またはディスクリート論理回路など、1つまたは複数のプロセッサによって実行され得る。したがって、本明細書で使用される「プロセッサ」という用語は、上記の構造、または本明細書で説明された技法の実装に好適な他の構造のいずれかを指すことがある。さらに、いくつかの態様では、本明細書で説明された機能は、符号化および復号のために構成された専用ハードウェアおよび/またはソフトウェアモジュール内に与えられるか、あるいは複合コーデックに組み込まれ得る。また、本技法は、1つまたは複数の回路または論理要素で十分に実装され得る。
【0115】
[0117]本開示の技法は、ワイヤレスハンドセット、集積回路(IC)またはICのセット(たとえば、チップセット)を含む、多種多様なデバイスまたは装置において実装され得る。本開示では、開示される技法を実施するように構成されたデバイスの機能的態様を強調するために、様々な構成要素、モジュール、またはユニットが説明されたが、それらの構成要素、モジュール、またはユニットは、必ずしも異なるハードウェアユニットによる実現を必要とするとは限らない。むしろ、上記で説明されたように、様々なユニットが、好適なソフトウェアおよび/またはファームウェアとともに、上記で説明された1つまたは複数のプロセッサを含めて、コーデックハードウェアユニットにおいて組み合わせられるか、または相互動作可能なハードウェアユニットの集合によって与えられ得る。
【0116】
[0118]様々な例が説明された。これらおよび他の例は以下の特許請求の範囲内に入る。
以下に本願発明の当初の特許請求の範囲に記載された発明を付記する。
[C1]
データを処理するための方法であって、前記方法は、
グラフィックス処理ユニット(GPU)におけるワープのすべてのスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信することと、
1つまたは複数の述語ビットを述語ビットの単一のセットとしてメモリに記憶することと、ここにおいて、述語ビットの前記単一のセットが前記ワープ中の前記スレッドのすべてに適用される、
述語ビットの前記単一のセットに従って命令の前記第1のセットの一部分を実行することと
を備える、方法。
[C2]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきであるように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C1に記載の方法。
[C3]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C1に記載の方法。
[C4]
命令の前記第1のセットの前記一部分を実行することが、
単一命令複数データ(SIMD)処理コアを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行すること
を備える、C1に記載の方法。
[C5]
命令の前記第1のセットの前記一部分を実行することが、
スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行すること
を備える、C1に記載の方法。
[C6]
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行すること
をさらに備える、C5に記載の方法。
[C7]
前記GPUにおける前記ワープのすべてのスレッドが命令の前記第1のセットの前記同じ分岐を実行すべきであると決定することと、
前記決定に応答して、前記指示を送ることと
をさらに備える、C1に記載の方法。
[C8]
命令の前記第1のセットのためのワープ全体が定数の同じセットを使用すると決定することによって、または、命令の前記第1のセットのための前記ワープ全体が、前記ワープのすべてのスレッドに適用される一様汎用レジスタ(uGPR)からのデータを使用すると決定することによって、前記GPUにおける前記ワープのすべてのスレッドが命令の前記第1のセットの前記同じ分岐を実行すべきであると決定すること
をさらに備える、C7に記載の方法。
[C9]
データを処理するための装置であって、前記装置は、
命令の第1のセットを記憶するように構成されたメモリと、
第1のプロセッサとを備え、前記第1のプロセッサは、
前記第1のプロセッサにおけるワープのすべてのスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信することと、
1つまたは複数の述語ビットを述語ビットの単一のセットとしてレジスタに記憶することと、ここにおいて、述語ビットの前記単一のセットが前記ワープ中の前記スレッドのすべてに適用される、
述語ビットの前記単一のセットに従って命令の前記第1のセットの一部分を実行することと
を行うように構成された、
装置。
[C10]
前記第1のプロセッサがグラフィックス処理ユニット(GPU)である、C9に記載の装置。
[C11]
前記第1のプロセッサが、複数の処理要素を含む単一命令複数データ(SIMD)処理コアをさらに含み、前記装置が、
前記レジスタをさらに備え、ここにおいて、前記レジスタが、前記SIMDコアの前記複数の処理要素の各々によってアクセス可能である、
C9に記載の装置。
[C12]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきであるように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C9に記載の装置。
[C13]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C9に記載の装置。
[C14]
前記第1のプロセッサが、前記SIMD処理コアを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行するようにさらに構成された、C9に記載の装置。
[C15]
前記第1のプロセッサがスカラー処理ユニットをさらに含み、ここにおいて、前記第1のプロセッサが、前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行するようにさらに構成された、C9に記載の装置。
[C16]
前記第1のプロセッサが、複数の処理要素を含む単一命令複数データ(SIMD)処理コアをさらに含み、ここにおいて、前記第1のプロセッサが、前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、前記SIMD処理コアを使用して、命令の第2のセットを実行するようにさらに構成された、C15に記載の装置。
[C17]
前記第1のプロセッサと通信している第2のプロセッサをさらに備え、前記第2のプロセッサは、
前記第1のプロセッサにおける前記ワープのすべてのスレッドが命令の前記第1のセットの前記同じ分岐を実行すべきであると決定することと、
前記決定に応答して、前記指示を前記第1のプロセッサに送ることと
を行うように構成された、
C9に記載の装置。
[C18]
前記第2のプロセッサが中央処理ユニット(CPU)である、C17に記載の装置。
[C19]
前記第2のプロセッサは、命令の前記第1のセットのためのワープ全体が定数の同じセットを使用すると決定することによって、または、命令の前記第1のセットのための前記ワープ全体が、前記ワープのすべてのスレッドに適用される一様汎用レジスタ(uGPR)からのデータを使用すると決定することによって、前記第1のプロセッサにおける前記ワープのすべてのスレッドが命令の前記第1のセットの前記同じ分岐を実行すべきであると決定するようにさらに構成された、C17に記載の装置。
[C20]
前記装置がワイヤレス通信デバイスである、C9に記載の装置。
[C21]
データを処理するための装置であって、前記装置は、
グラフィックス処理ユニット(GPU)におけるワープのすべてのスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信するための手段と、
1つまたは複数の述語ビットを述語ビットの単一のセットとしてメモリに記憶するための手段と、ここにおいて、述語ビットの前記単一のセットが前記ワープ中の前記スレッドのすべてに適用される、
述語ビットの前記単一のセットに従って命令の前記第1のセットの一部分を実行するための手段と
を備える、装置。
[C22]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C21に記載の装置。
[C23]
命令の前記第1のセットの前記一部分を実行するための前記手段が、
単一命令複数データ(SIMD)処理コアを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行するための手段
を備える、C21に記載の装置。
[C24]
命令の前記第1のセットの前記一部分を実行するための前記手段が、
スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行するための手段
を備える、C21に記載の装置。
[C25]
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行するための手段
をさらに備える、C24に記載の装置。
[C26]
実行されたとき、1つまたは複数のプロセッサに、
グラフィックス処理ユニット(GPU)におけるワープのすべてのスレッドが命令の第1のセット中の同じ分岐を実行すべきであるという指示を受信することと、
1つまたは複数の述語ビットを述語ビットの単一のセットとしてメモリに記憶することと、ここにおいて、述語ビットの前記単一のセットが前記ワープ中の前記スレッドのすべてに適用される、
述語ビットの前記単一のセットに従って命令の前記第1のセットの一部分を実行することと
を行わせる命令を記憶するコンピュータ可読記憶媒体。
[C27]
述語ビットの前記単一のセットは、命令の前記第1のセットの前記一部分を、前記ワープの各スレッドによって実施されるべきでないように示し、命令の前記セットの前記一部分が、命令の前記第1のセット中の前記同じ分岐に関係する、C26に記載のコンピュータ可読記憶媒体。
[C28]
前記命令が、前記1つまたは複数のプロセッサに、
単一命令複数データ(SIMD)処理コアを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行すること
をさらに行わせる、C26に記載のコンピュータ可読記憶媒体。
[C29]
前記命令が、前記1つまたは複数のプロセッサに、
スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットの前記一部分を実行すること
をさらに行わせる、C26に記載のコンピュータ可読記憶媒体。
[C30]
前記スカラー処理ユニットを使用して、述語ビットの前記単一のセットに従って命令の前記第1のセットを実行することと並行して、単一命令複数データ(SIMD)処理コアを使用して、命令の第2のセットを実行すること
をさらに備える、C29に記載のコンピュータ可読記憶媒体。