(57)【要約】      （修正有）【課題】グラフィック処理ユニットにおいてデータを処理するための方法を提供する。【解決手段】方法は、シェーダーのスレッドの複数のグループに共通する命令のコードブロックを受信することと、スレッドの複数のグループのうちスレッドの１つのグループによって結果をもたらすようにシェーダーのスレッドの複数のグループに共通する命令のコードブロックを実行することと、スレッドの複数のグループの各々によってアクセス可能なオンチップランダムアクセスメモリ（ＲＡＭ）においてシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することと、シェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することが完了したとの決定において、オンチップＲＡＭからシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果をリターンすることと、を含む。【選択図】図６
2020024716.tif 000002
【特許請求の範囲】
【請求項１】
グラフィック処理ユニット（ＧＰＵ）を動作する方法であって、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから前記ＧＰＵによって、受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、前記ＧＰＵによって、実行することと、
前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを、前記ＧＰＵによって、実行することと、を備える、方法。
【請求項２】
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを、プロセッサで作動する前記シェーダーコンパイラによって、識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックを、前記プロセッサで作動する前記シェーダーコンパイラによって、グループ化することと、をさらに備える、請求項１に記載の方法。
【請求項３】
命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、請求項２に記載の方法。
【請求項４】
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別することをさらに備える、請求項１に記載の方法。
【請求項５】
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にすることを、さらに備える、請求項１に記載の方法。
【請求項６】
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡することを、さらに備える、請求項１に記載の方法。
【請求項７】
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡することをさらに備える、請求項１に記載の方法。
【請求項８】
前記プリアンブルコードブロックの前記実行は、前記ＧＰＵにスカラープロセッサによって実行される、請求項１に記載の方法。
【請求項９】
前記１つまたは複数の結果の前記記憶は、書き込み可能バッファ管理キャッシュにおける、請求項１に記載の方法。
【請求項１０】
前記１つまたは複数の結果の前記記憶は、シェーダープロセッサのすべての処理エレメントによってアクセス可能である、請求項１に記載の方法。
【請求項１１】
前記プリアンブルコードブロックは、１つまたは複数のコンスタント結果の値を求める、請求項１に記載の方法。
【請求項１２】
コンスタントメモリにランダムアクセスメモリ（ＲＡＭ）から前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、ロードすること、をさらに備える、請求項１に記載の方法。
【請求項１３】
データを処理するための装置であって、前記装置は、
グラフィック処理ユニット（ＧＰＵ）と、前記ＧＰＵは、メモリおよびシェーダーコアを備え、前記シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、前記制御ユニットは、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループ上で、実行するように前記複数の処理エレメントの少なくとも１つを、指示することと、
前記コンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するように前記複数の処理エレメントの少なくとも１つを指示することと、を行うように構成されている、装置。
【請求項１４】
プロセッサをさらに備え、前記プロセッサは、
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化することと、を行うように構成されている、請求項１３に記載の装置。
【請求項１５】
命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、請求項１４に記載の装置。
【請求項１６】
前記制御ユニットは、
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するようにさらに構成されている、請求項１３に記載の装置。
【請求項１７】
前記制御ユニットは、
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするように、さらに構成されている、請求項１３に記載の装置。
【請求項１８】
前記制御ユニットは、
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するように、さらに構成されている、請求項１３に記載の装置。
【請求項１９】
前記制御ユニットは、
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡するようにさらに構成されている、請求項１３に記載の装置。
【請求項２０】
前記プリアンブルコードブロックの前記実行は、前記複数の処理エレメントのスカラープロセッサによって実行される、請求項１３に記載の装置。
【請求項２１】
記憶された前記１つまたは複数の結果は、前記シェーダーコアのすべての処理エレメントによってアクセス可能である、請求項１３に記載の装置。
【請求項２２】
グラフィック処理ユニット（ＧＰＵ）を動作するように構成されている装置であって、前記装置は、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信するための手段と、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、実行するための手段と、
前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶するための手段と、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するための手段と、を備える、装置。
【請求項２３】
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別するための手段と、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化するための手段と、をさらに備える、請求項２２に記載の装置。
【請求項２４】
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するための手段をさらに備える、請求項２２に記載の装置。
【請求項２５】
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするための手段をさらに備える、請求項２２に記載の装置。
【請求項２６】
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するための手段をさらに備える、請求項２２に記載の装置。
【請求項２７】
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを追跡するための手段をさらに備える、請求項２２に記載の装置。
【請求項２８】
前記プリアンブルコードブロックは、１つまたは複数のコンスタント結果の値を求める、請求項２２に記載の装置。
【請求項２９】
コンスタントメモリにランダムアクセスメモリ（ＲＡＭ）から前記プリアンブルコードブロックの前記１つまたは複数の結果をロードするための手段をさらに備える、請求項２２に記載の装置。
【請求項３０】
記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されたときに、少なくとも１つのプロセッサに、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、実行することと、コンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行することと、を行わせる、非一時的コンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
[0001]  本開示は、データ処理、より具体的には、グラフィック処理のためのシェーダープリアンブルの生成および実行に関する。
【背景技術】
【０００２】
[0002]  シングルインストラクションマルチプルデータ（ＳＩＭＤ）処理システムは、データの複数のピースで同じ命令を実行する複数の処理エレメントを含む並列計算システムの類である。ＳＩＭＤシステムは、計算システムのサブシステム、またはスタンドアロンコンピュータであり得る。例えば、１つまたは複数のＳＩＭＤ実行ユニットは、プログラム可能なシェーディングをサポートするプログラム可能なシェーディングユニットをインプリメントするために、グラフィック処理ユニット（ＧＰＵ）で使用され得る。ＳＩＭＤ処理システムは、プログラムのための実行の複数のスレッドが並行して複数の処理エレメント上で同期的に実行することを可能にし、それによって、同じセットの演算（operation）が複数のピースのデータ上で実施される必要があるプログラムのためのスループットを増大させる。特定のＳＩＭＤ処理エレメントを実行する特定の命令は、スレッドまたはファイバーと呼ばれる。スレッドのグループは、ウェーブまたはワープと呼ばれ得る。
【０００３】
[0003]  処理ユニット、例えばＧＰＵ、は、命令の実行に関わるデータを記憶する汎用レジスタ（ＧＰＲ）および処理エレメントを含む。いくつかの例では、処理エレメントは、データのあるアイテムを処理するための命令を実行し、それぞれの処理エレメントは、そのアイテムのデータ、またはそのアイテムの、ＧＰＲにおける処理の結果としてのデータを記憶する。データのアイテムは、処理が行われるベースユニットであり得る。例えば、グラフィック処理において、プリミティブの頂点（vertex of a primitive）は、アイテムの一例であり、ピクセルは、アイテム別の例である。各頂点およびピクセルに関連するグラフィックデータ（例えば、座標、明度など）がある。
【０００４】
[0004]  命令の並列実行を可能にする（例えば、複数の処理エレメントが同時に同じ命令を実行する）ように、処理エレメントのプロセッサコア内に複数の処理エレメントがあり得る。シェーダーは、（例えば、シェーダープロセッサのような）並列処理環境を使用することができるコンピュータプログラムであり、グラフィック処理パイプラインのさまざまな段階で２および３次元モデルにグラフィックレンダリング技術を実施するために使用されている。シェーダーの例は、色、およびピクセル（またはフラグメント）の他の属性を計算するために使用されるピクセル（またはフラグメント）シェーダー、位置、動き、明暗、および色、または頂点を制御するために使用される頂点シェーダー、グラフィックプリミティブを生成するために使用される幾何学シェーダー、テッセレーション（tessellation）関連のシェーダー（例えば、頂点データのパッチをより小さいプリミティブにさらに分割するときに使用されるドメインシェーダー、および／または、ハルシェーダーを含み、計算シェーダーは、他の情報（例えば、非グラフィックデータ）を計算するために使用される。
【発明の概要】
【０００５】
[0005]  概して、本開示は、ＧＰＵのシェーダープロセッサにおいてシェーダープログラムを実行するときの冗長演算（redundant operation）を減じるための技術を説明する。一例では、本開示は、シェーダーのすべての並列処理エレメント（例えばスレッド）の間で同じ結果をもたらす命令が識別され、シェーダーごとにおよび／またはコマンド（例えば、ドローまたはディスパッチコマンド）ごとに一度実行するようにスケジューリングされている技術を、説明する。コンパイラは、冗長命令を識別し、パーシェーダー（per-shader）プリアンブルと呼ばれるコードブロックに冗長命令をグループ化し得る。そしてＧＰＵシステムは、一度パーシェーダープリアンブルを実行し、オンチップメモリにおいてパーシェーダープリアンブルの冗長命令の結果をセーブする。そしてシェーダープロセッサの処理エレメントにおいて実行するシェーダーの各次のスレッドは、同じ結果を再度計算することなく結果を再利用することができる。さらに、データは、パーシェーダープリアンブルを介してオンチップステートキャッシュ／バッファに、および／またはオンチップランダムアクセスメモリ（ＲＡＭ）に、システムメモリからプレロードされ得る。
【０００６】
[0006]  本開示の一例では、グラフィック処理ユニット（ＧＰＵ）を動作する方法は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラからＧＰＵによって、受信することと、プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、１つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、１つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第１のグループにおいてＧＰＵによって、実行することと、プリアンブルコードブロックの１つまたは複数の結果を、ＧＰＵによって、記憶することと、プリアンブルコードブロックの１つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの１つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる１つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの１つのグループのスレッドごとにメインシェーダーコードブロックを、ＧＰＵによって、実行することと、を備える。
【０００７】
[0007]  別の例では、データを処理するための装置であって、装置は、グラフィック処理ユニット（ＧＰＵ）と、ＧＰＵは、コンスタントメモリおよびシェーダーコアを備え、シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、制御ユニットは、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、１つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、１つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第１のグループにおいて、実行するように、複数の処理エレメントの少なくとも１つに、指示する（direct）ことと、コンスタントメモリにおいてプリアンブルコードブロックの１つまたは複数の結果を記憶することと、プリアンブルコードブロックの１つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの１つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる１つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの１つのグループのスレッドごとにメインシェーダーコードブロックを実行するように複数の処理エレメントの少なくとも１つに指示することと、を行うように構成されている。
【０００８】
[0008]  別の例では、グラフィック処理ユニット（ＧＰＵ）を動作するように構成されている装置であって、装置は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信するための手段と、プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、１つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、１つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第１のグループにおいて、実行するための手段と、
[0009]  プリアンブルコードブロックの１つまたは複数の結果を記憶するための手段と、プリアンブルコードブロックの１つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの１つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる１つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの１つのグループのスレッドごとにメインシェーダーコードブロックを実行するための手段と、を備える。
【０００９】
[0010]  別の例では、記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、命令は、実行されたときに少なくとも１つのプロセッサに、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、１つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、１つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第１のグループにおいて、実行することと、コンスタントメモリにおいてプリアンブルコードブロックの１つまたは複数の結果を記憶することと、プリアンブルコードブロックの１つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの１つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる１つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの１つのグループのスレッドごとにメインシェーダーコードブロックを実行することと、を行わせる。
【００１０】
[0011]  １つまたは複数の例の詳細は、添付の図面および以下の説明において示される。
他の特徴、目的、および利点は、その説明、図面、および請求項から明らかになるだろう。
【図面の簡単な説明】
【００１１】
【図１】[0012]  図１は、本開示に説明される１つまたは複数の例としての技術に従ってデータを処理するための例としてのデバイスを例示するブロック図である。
【図２】[0013]  図２は、図１に示されているデバイスのコンポーネントを詳細に示すブロック図である。
【図３】[0014]  図３は、例としての命令のセットを示す概念図である。
【図４】[0015]  図４は、ＧＰＵのシェーダーコアの汎用レジスタ（ＧＰＲ）におけるデータ記憶の例を示す概念図である。
【図５】[0016]  図５は、図１のＧＰＵの例としてのシェーダーコアの詳細なブロック図である。
【図６】[0017]  図６は、ＧＰＵにおけるデータを処理する例としての技術を示すフローチャートである。
【図７】[0018]  図７は、シェーダープログラムをコンパイルする例としての技術を示すフローチャートである。
【発明を実施するための形態】
【００１２】
[0019]  並列処理ユニット、例えば、並行して（例えば、同時にまたはほぼ同時に）多くの演算を実施するように構成されているグラフィック処理ユニット（ＧＰＵ）、は、１つまたは複数のプログラムの命令を実行する１つまたは複数のプロセッサコア（例えば、ＧＰＵのためのシェーダーコア）を含む。説明を容易にするために、本開示に説明される技術は、グラフィック処理アプリケーションおよび／または汎用ＧＰＵ（ＧＰＧＰＵ）アプリケーションを実施するように構成されているＧＰＵに関して説明される。しかしながら、本開示に説明される技術は、必ずしもＧＰＵまたはＧＰＧＰＵでは無い並列処理ユニット、並びに、非並列処理ユニット（例えば、特に並列処理のために構成されていないもの）にまで及び得る。
【００１３】
[0020]  ＧＰＵは、シングルインストラクションマルチプルデータ（ＳＩＭＤ）構造で設計され得る。ＳＩＭＤ構造では、シェーダーコア（または、より一般的にはＳＩＭＤ処理コア）は、複数のＳＩＭＤ処理エレメントを含み、ここにおいて各ＳＩＭＤ処理エレメントは、同じプログラムの、しかし異なるデータにおける命令を実行する。特定のＳＩＭＤ処理エレメントにおいて実行する特定の命令は、スレッドまたはファイバーと呼ばれる。スレッドのグループは、ウェーブまたはワープと呼ばれ得る。ワープを実行する処理エレメントのすべては、総じて、ベクトル処理ユニットと呼ばれ得、ここにおいて、ベクトルの各レーン（例えば、処理エレメント）は、１つのスレッドを実行する。各ＳＩＭＤ処理エレメントは、所与のスレッドに関わるデータが異なり得るので異なるスレッドを実行していると見なされ得るが、しかしながら、処理エレメント上で実行しているスレッドは、他の処理エレメント上で実行している命令と、同じプログラムの、同じ命令である。この方法で、ＳＩＭＤ構造は、並行して（例えば、同時に）多くのタスクを実施することをＧＰＵに可能にする。
【００１４】
[0021]  シェーダー（またはシェーダープログラム）は、並列処理環境（例えばシェーダープロセッサ）を使用することができるコンピュータプログラムである。ドローコマンドは、ディスプレイデバイスにおける表示のためにオブジェクトをドローイング（例えば、レンダリング）するために、グラフィック処理ユニット（例えば、ＧＰＵ）と相互作用するグラフィックアプリケーションプログラムインターフェース（ＡＰＩ）に対して処理ユニット（例えば、ＣＰＵ）によって実行されるコマンドの群の１つまたは複数に言及する。ディスパッチコマンドは、非ディスプレイ演算を実行するためにグラフィック処理ユニット（ＧＰＵ）と相互作用するグラフィックＡＰＩに対して処理ユニット（例えばＣＰＵ）によって実行されるコマンドの群の１つまたは複数に言及する。ドローまたはディスパッチコマンドのエレメントは、関連するシェーダーにおいて冗長演算を実行し得る。特に、ＧＰＵは、バッチ処理コマンド、例えばドローコールおよびディスパッチを実施し得る。コマンドは、処理エレメント、例えばワークアイテム（work item）、ピクセル、および頂点に１つまたは複数のシェーダーを使用するようにＧＰＵに命令し得る。そしてシェーダーが、エレメントのために呼び出され得る。同じシェーダーが、同じタイプのコマンドのエレメントのために呼び出され得る。シェーダーの演算は、同じタイプのすべてのエレメントのために同じ結果をもたらし得る。このような演算は、各エレメントに対して同じコードセグメントを冗長的に実行する必要なく、一度で識別および実行され得る。
【００１５】
[0022]  本開示は、同じタイプのすべてのエレメントに対して同じ結果をもたらすシェーダーの演算が識別され、シェーダータイプごとにおよび／またはコマンド（例えば、ドローまたはディスパッチコマンド）ごとに一度実行するようにスケジューリングされる。コンパイラは、冗長命令を識別し、パーシェーダープリアンブルと呼ばれるコードブロックに冗長命令をグループ化し得る。ＧＰＵは、一度パーシェーダープリアンブルを実行し、オンチップメモリ（例えば、ランダムアクセスメモリ（ＲＡＭ））においてパーシェーダープリアンブルの冗長命令の結果をセーブする。冗長命令は、読出し／書込みコンスタントＲＡＭの使用を可能にし得、冗長命令の計算において使用される定数が、冗長命令（すなわち、パーシェーダープリアンブル）の実行の前にこの読出し／書込みコンスタントＲＡＭにロードされ得る。シェーダーのエレメントは、同じ結果を再度計算すること無く結果を再利用することができる。これは、大いに、性能を向上させ、電力消費を減じ得る。
【００１６】
[0023]  図１は、パーシェーダープリアンブルの生成および実行のための、本開示において説明される１つまたは複数の例としての技術に従って、データを処理するための例としてのデバイスを示すブロック図である。図１は、デバイス１０を示し、これの例は、メディアプレーヤーのようなビデオデバイス、セットトップボックス、携帯電話、パーソナルデジタルアシスタント（ＰＤＡ）、デスクトップコンピュータ、ラップトップコンピュータ、ゲーム機、ビデオ会議ユニット、タブレット計算デバイスのようなワイヤレス通信デバイス、などを含むがこれらに限定されない。
【００１７】
[0024]  図１の例において、デバイス１０は、プロセッサ１２、グラフィック処理ユニット（ＧＰＵ)１４、およびシステムメモリ１６を含む。いくつかの例、例えば、デバイス１０がモバイルデバイスである例では、プロセッサ１２およびＧＰＵ１４は、集積回路（ＩＣ）として形成され得る。例えば、ＩＣは、システムオンチップ（ＳｏＣ：system on chip）のようなチップパッケージ内の処理チップと見なされ得る。いくつかの例、例えば、デバイス１０がデスクトップかラップトップコンピュータである例では、プロセッサ１２およびＧＰＵ１４は、異なる集積回路（例えば、異なるチップパッケージ）に収容され得る。しかしながら、デバイス１０がモバイルデバイスである例では、プロセッサ１２およびＧＰＵ１４が異なる集積回路に収容されることが可能であり得る。
【００１８】
[0025]  プロセッサ１２およびＧＰＵ１４の例は、１つまたは複数のデジタルシグナルプロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、または他の同等な集積または離散論理回路を含むが、それらに限定されない。プロセッサ１２は、デバイス１０の中央処理ユニット（ＣＰＵ）であり得る。いくつかの例では、ＧＰＵ１４は、グラフィック処理（例えば、ＳＩＭＤプロセッサ）に適した超並列処理能力（massive parallel processing capabilities）をＧＰＵ１４に提供する集積および／または離散論理回路を含む特殊ハードウェアであり得る。いくつかのインスタンスでは、ＧＰＵ１４はまた、汎用処理能力を含み得、汎用処理タスク（すなわち非グラフィック関連のタスク）をインプリメントする場合、汎用ＧＰＵ（ＧＰＧＰＵ）と呼ばれ得る。
【００１９】
[0026]  例の目的で、本開示に説明される技術は、ＧＰＵ１４で説明される。しかしながら、本開示に説明される技術は、あまり限定されない。本開示に説明される技術は、他のタイプの並列処理ユニット（例えば、グラフィック処理のためでなくとも、超並列処理能力を提供する処理ユニット）まで及び得る。また、本開示に説明される技術は、特に並列処理のために構成されていない処理ユニットまで及び得る。
【００２０】
[0027]  プロセッサ１２は、さまざまなタイプのアプリケーションを実行し得る。アプリケーションの例は、演算システム、ウェブブラウザ、ｅメールアプリケーション、スプレッドシート、ビデオゲーム、またはディスプレイのための可視オブジェクトを生成する他のアプリケーションを含む。システムメモリ１６は、１つまたは複数のアプリケーションの実行のための命令を記憶し得る。プロセッサ１２におけるアプリケーションの実行は、プロセッサ１２に、表示される画像コンテンツに関するグラフィックデータを生成させる。プロセッサ１２は、さらなる処理のためにＧＰＵ１４に画像コンテンツのグラフィックデータを送信し得る。
【００２１】
[0028]  例として、プロセッサ１２におけるアプリケーションの実行は、プロセッサ１２に、プリミティブの頂点（vertices of primitives）を生成させ、ここにおいて、それぞれの頂点におけるプリミティブの相互接続は、グラフィカルなオブジェクトを形成する。この例では、プロセッサ１２が生成するグラフィックデータは、頂点の属性に関わる属性データである。例えば、プロセッサ１２上で実行するアプリケーションは、頂点に関する明度、透明度、座標などを生成し得、それらはすべて、頂点の属性の例である。頂点の属性のいくつかは、各頂点のために複製され得るコードを、部分的に、使用して生成され得、特にここにおいて、このようなコードは、実行されたときに、定数（constant）の値を求める。そしてプロセッサ１２は、一度で（例えば、第１の頂点に関わる実行の間に）識別された冗長コードを実行し、このような冗長コードを使用する頂点の残りに関わる結果を再利用し得る。概して、技術は、属性データ以外のデータタイプ（例えばカウンター）に拡張可能であり、技術は、属性データに限定されるか、明度、透明度、座標などの属性データの例に限定されるとは、見なされるべきではない。
【００２２】
[0029]  いくつかの非グラフィック関連の例では、プロセッサ１２は、ＧＰＵ１４によって処理されるためにより適切なデータを生成し得る。このようなデータは、グラフィック、またはディスプレイの目的である必要はない。例えば、プロセッサ１２は、行列演算がＧＰＵ１４によって実施される必要があるデータを出力し得、ＧＰＵ１４は、続いて行列演算を実施し得る。
【００２３】
[0030]  概して、プロセッサ１２は、超並列演算を必要とするタスクのような処理タスクを、ＧＰＵ１４にオフロードし得る。一例として、グラフィック処理は、超並列演算を要し、プロセッサ１２は、ＧＰＵ１４にこのようなグラフィック処理タスクをオフロードし得る。しかしながら、行列演算のような他の演算はまた、ＧＰＵ１４の並列処理能力からの恩恵を受け得る。これらの例では、プロセッサ１２は、非グラフィック関連の演算をＧＰＵ１４に実施させるために、ＧＰＵ１４の並列処理能力を利用し得る。
【００２４】
[0031]  プロセッサ１２は、特定のアプリケーション処理インターフェース（ＡＰＩ）に従ってＧＰＵ１４と通信し得る。このようなＡＰＩの例は、マイクロソフト（登録商標）によるＤｉｒｅｃｔＸ（登録商標）ＡＰＩ、クロノスグループ（Khronos group）による ＯｐｅｎＧＬ（登録商標）またはＯｐｅｎＧＬ ＥＳ（登録商標）、およびＯｐｅｎＣＬ（登録商標）を含み、しかしながら、この開示の態様は、ＤｉｒｅｃｔＸ、ＯｐｅｎＧＬ、またはＯｐｅｎＣＬ ＡＰＩに限定されず、他のタイプのＡＰＩにまで及び得る。さらに、本開示に説明される技術は、ＡＰＩに従って機能することは要求されず、プロセッサ１２およびＧＰＵ１４は、通信に関わる任意の技術を使用し得る。
【００２５】
[0032]  デバイス１０はまた、ディスプレイ１８、ユーザーインターフェース２０およびトランシーバモジュール２２を含み得る。デバイス１０は、明確化のために図１に示されていない、追加のモジュールまたはユニットを含み得る。例えば、デバイス１０は、デバイス１０がモバイルワイヤレス電話である例では、電話による通信を達成するために、スピーカおよびマイクルフォンを含み得る、それらはどちらも図１に示されていない。さらに、デバイス１０に示されているさまざまなモジュールおよびユニットは、デバイス１０のすべての例には必要とされない場合もある。例えば、ユーザーインターフェース２０およびディスプレイ１８は、デバイス１０がデスクトップコンピュータである例では、デバイス１０の外側にあり得る。別の例として、ユーザーインターフェース２０は、ディスプレイ１８がモバイルデバイスのタッチセンサ式または存在センサ式ディスプレイである例では、ディスプレイ１８の一部であり得る。
【００２６】
[0033]  ディスプレイ１８は、液晶ディスプレイ（ＬＣＤ）、陰極線管（ＣＲＴ）ディスプレイ、プラズマディスプレイ、タッチセンサ式ディスプレイ、存在センサ式ディスプレイ、または他のタイプのディスプレイデバイスを備え得る。ユーザーインターフェース２０の例は、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含むが、それらに限定されない。ユーザーインターフェース２０はまた、タッチスクリーンであり得、ディスプレイ１８の一部として組み込まれ得る。トランシーバモジュール２２は、デバイス１０と他のデバイスまたはネットワークとの間の有線または無線の通信を可能にするために、回路を含み得る。トランシーバモジュール２２は、変調器、復調器、増幅器、および有線または無線の通信のための他のこのような回路を含み得る。
【００２７】
[0034]  システムメモリ１６は、デバイス１０のためのメモリであり得る。システムメモリ１６は、１つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ１６の例は、ランダムアクセスメモリ（ＲＡＭ）、電気的消去可能プログラマブル読取り専用メモリ（ＥＥＰＲＯＭ（登録商標））、フラッシュメモリ、あるいは、データ構造および／または命令の形式で所望のプログラムコードを記憶または搬送するために使用可能であり、かつコンピュータまたはプロセッサによってアクセスされることができるその他の媒体を含むが、それらに限定されるものではない。
【００２８】
[0035]  いくつかの態様では、システムメモリ１６は、本開示ではプロセッサ１２、およびＧＰＵ１４に属する機能を、プロセッサ１２および／またはＧＰＵ１４に実施させる命令を含み得る。従って、システムメモリ１６は、実行されたときに、１つまたは複数のプロセッサ（例えば、プロセッサ１２およびＧＰＵ１４）にさまざまな機能を実施させる、記憶された命令を有するコンピュータ可読記憶媒体であり得る。
【００２９】
[0036]  いくつかの例では、システムメモリ１６は、非一時的な記憶媒体であり得る。「非一時的な」という用語は、記憶媒体が、搬送波または伝播信号で具現化されないことを示し得る。しかしながら、「非一時的な」という用語は、システムメモリ１６が移動不可能である（non-movable）こと、またはそれのコンテンツが静的であること、を意味するように解釈されるべきではない。１つの例として、システムメモリ１６は、デバイス１０から取り除かれ、別のデバイスへ移動され得る。別の例として、システムメモリ１６と実質的に同様のメモリが、デバイス１０に挿入され得る。ある特定の例では、非一時的な記憶媒体は、（例えば、ＲＡＭにおいて）経時的に変化し得るデータを記憶し得る。
【００３０】
[0037]  例えば、本開示の各所でより詳細に説明されるように、システムメモリ１６は、本開示に説明される１つまたは複数の例の技術を実施するプロセッサ１２において実行する、コンパイラに関わるコードを記憶し得る。システムメモリ１６はまた、ＧＰＵ１４のシェーダーコア（シェーダープロセッサまたはカーネルとも呼ばれる）上で実行するシェーダープログラム（例えば、頂点シェーダー、ピクセルまたはフラグメントシェーダー、テッセレーション関連のシェーダー、計算シェーダーなど）のためのコードを記憶し得る。さらに、システムメモリ１６は、１つまたは複数のコンスタントバッファを記憶し得る。コンスタントロード命令は、ＧＰＵ１４のコンスタントメモリにシステムメモリから定数をロードすることをコンパイラ３８に可能にし得る。定数は、コンスタントメモリ４４が満杯である場合、ＧＰＲ２６（またはｕＧＰＲ２７）にロードされ得る。
【００３１】
[0038]  グラフィックアイテムという用語は、ＧＰＵ１４が並列処理を実施するベースユニットに言及するために本開示において使用される。ＧＰＵ１４は、並行して（例えば、同時に）複数のグラフィックアイテムを処理し得る。例えば、頂点シェーダーは、頂点を処理し得、ＧＰＵ１４は、同時に複数の頂点を処理するために並行して頂点シェーダーの複数のインスタンスを実行し得る。同様に、ピクセルまたはフラグメントシェーダーは、ディスプレイのピクセルを処理し得、ＧＰＵ１４は、同時にディスプレイの複数のピクセルを処理するために並行してピクセルシェーダーの複数のインスタンスを実行し得る。頂点およびピクセルは、グラフィックアイテムの例である。非グラフィック関連のアプリケーションに関しては、「ワークアイテム」という用語は、ＧＰＵ１４が処理を実施する最小のユニットに言及し得る。
【００３２】
[0039]  以下により詳細に説明されるように、本開示のさまざまな例に従えば、ＧＰＵ１４は、ＧＰＵ１４におけるワープの（または複数のワープにわたる）すべてのスレッドが、プロセッサ１２によって実行されるコンパイラによって識別された第１のスレッド／ワープの実行の間に（単一のまたは複数のワープにわたる）各スレッドの間で共通の命令の第１のセットを実行する、というインジケーションを（例えば、パーシェーダープリアンブルにおいて）受信するように構成され得る。パーシェーダープリアンブルにおける命令は、命令が一定、および／または可変／動的であり得る非発散性の（non-divergent）入力を使用する（例えば、それらはすべてのファイバー／スレッドにわたって均一および／またはスカラーである）ので、パーシェーダープリアンブルにおける包含のために識別され得る。そしてＧＰＵ１４は、システムメモリ１６からそれらの定数にアクセスし、ＧＰＵ１４におけるコンスタントＲＡＭにおいてそれらを記憶し得る。パーシェーダープリアンブルの共通の命令を実行するとき、ＧＰＵ１４は、コンスタントＲＡＭにおける定数にアクセスし得る。ＧＰＵ１４は、共通の命令を実施し得る。パーシェーダープリアンブルの共通の命令を実施した後に、ＧＰＵ１４は、読取り／書込みコンスタントＲＡＭにおいて結果を記憶し得る。別の例では、パーシェーダープリアンブルの結果（例えば、定数値）は、システムメモリ１６におけるまたはＧＰＵ１４における他のオンチップＲＡＭでは、１つまたは複数の汎用レジスタ（ＧＰＲ）、均一ＧＰＲ（ｕＧＰＲ）、または共有ＧＰＲ（ｓＧＰＲ）において記憶され得る。しかしながら、ＧＰＲ、ｕＧＰＲ、およびｓＧＰＲは、各ワープ間でクリアされ得（すなわち、データはワープ間のＧＰＲにおいて共有されることができない）、このようなデータは、ワープごとにこのようなＧＰＲに書き換えられなければならない。ＧＰＲはまた、特定のスレッド／ファイバーに関わるデータを記憶し（およびそれらによってアクセス可能であり）得、一方でｕＧＰＲは、ウェーブ／ワープにおけるすべてのスレッド／ファイバーに関わるデータを記憶し（およびそれによってアクセス可能であり）得る。データはまた、ワープ間データ共有を許可するオンチップ（例えばＧＰＵ１４上の）メモリまたはシステムメモリ１６において記憶され得る。パーシェーダープリアンブルの実行の結果は、２度目（またはそれ以降）に同じ結果を再びもたらすことなく、シェーダーの各エレメント（例えばスレッド）のために再利用され得る。パーシェーダープリアンブルの実行の結果はまた、２度目（またはそれ以降）に同じ結果を再びもたらすことなく、シェーダーの複数のワープのために再利用され得る。
【００３３】
[0040]  図２は、図１に示されているデバイスのコンポーネントを詳細に示すブロック図である。図２に示されているように、ＧＰＵ１４は、シェーダーコア２４を含み、それは、汎用レジスタ（ＧＰＲ）２６、ユニフォームＧＰＲ２７、およびコンスタントメモリ４４、（１つまたは複数の）固定機能パイプライン３０、およびＧＰＵメモリ４２を含む。ＧＰＲ２６は、単一のＧＰＲ、ＧＰＲファイル、および／またはＧＰＲバンクを含み得る。ｕＧＰＲ２７は、単一のｕＧＰＲ、ｕＧＰＲファイル、および／またはｕＧＰＲバンクを含み得る。ＧＰＲ２６は、単一のスレッド／ファイバーにアクセス可能なデータを記憶し得る。ｕＧＰＲ２７は、単一のウェーブ／ワープにおけるすべてのスレッド／ファイバーによってアクセス可能なデータを記憶し得る。シェーダーコア２４および（１つまたは複数の）固定機能パイプライン３０は共に、グラフィックまたは非グラフィック関連の機能を実施するために使用される処理パイプラインを形成し得る。処理パイプラインは、ＧＰＵ１４上で実行するソフトウェアまたはファームウェアによって規定されるような機能を実施し、特定の機能を実施するようにハードウェアに組み込まれている固定機能ユニットによって機能を実施する。ＧＰＵ１４のこのような固定機能パイプライン３０は、視錐台（viewing frustum）の範囲外にあるクリッピング、テッセレーション段階、テクスチャパイプライン、および明暗を含み得る。
【００３４】
[0041]  ＧＰＵ１４上で実行するソフトウェアおよび／またはファームウェアは、シェーダープログラム（または単純にシェーダー）と呼ばれ得、シェーダープログラムは、ＧＰＵ１４のシェーダーコア２４上で実行し得る。ただ１つのシェーダーコア２４が示されているが、いくつかの例では、ＧＰＵ１４は、シェーダーコア２４に類似した２つ以上のシェーダーコアを含み得る。（１つまたは複数の）固定機能パイプライン３０は、固定機能ユニットを含む。シェーダーコア２４および（１つまたは複数の）固定機能パイプライン３０は、互いからデータを送受信し得る。例えば、処理パイプラインは、固定機能パイプライン３０の固定機能ユニットからデータを受信し、固定機能パイプライン３０の別の固定機能ユニットに処理されたデータを出力する、シェーダーコア２４上で実行するシェーダープログラムを含み得る。
【００３５】
[0042]  シェーダープログラムは、ユーザーが、いかなる考えられ得る方法でも所望のタスクを実施するようにシェーダープログラムを設計することができるので、機能フレキシビリティをユーザーおよび／または開発者に提供する。しかしながら、固定機能ユニットは、固定機能ユニットがタスクを実施する方法に関しては、ハードウェアに組み込まれている。従って、固定機能ユニットは、あまり多くの機能フレキシビリティを提供しない場合がある。
【００３６】
[0043]  シェーダープログラムの例は、頂点シェーダープログラム３２、フラグメントシェーダープログラム３４、および計算シェーダープログラム３６を含む。頂点シェーダープログラム３２およびフラグメントシェーダープログラム３４は、グラフィック関連のタスクに関わるシェーダープログラムであり得、計算シェーダープログラム３６は、非グラフィック関連のタスクに関わるシェーダープログラムであり得る。シェーダープログラムの追加の例、例えば、幾何学シェーダーおよびテッセレーション関連シェーダーがあるが、簡潔にするためにそれらは説明されない。
【００３７】
[0044]  プロセッサ１２上で実行するグラフィックドライバー４０は、アプリケーションプログラミングインタフェース（ＡＰＩ）をインプリメントするように構成され得、とはいえ、グラフィックドライバー４０は、特定のＡＰＩに従って構成されるように制約される必要はない。このような例では、シェーダープログラム（例えば、頂点シェーダープログラム３２、フラグメントシェーダープログラム３４、および計算シェーダープログラム３６）は、グラフィックドライバー４０によってサポートされるＡＰＩに従って構成され得る。デバイス１０がモバイルデバイスである例では、グラフィックドライバー４０は、ＯｐｅｎＧＬ ＥＳ ＡＰＩに従って構成され得る。ＯｐｅｎＧＬ ＥＳ ＡＰＩは、具体的には、モバイルデバイスのために設計されている。デバイス１０が非モバイルデバイスである例では、グラフィックドライバー４０は、ＯｐｅｎＧＬ ＡＰＩに従って構成され得る。他のＡＰＩの例は、マイクロソフトコーポレーションによってＡＰＩのＤｉｒｅｃｔＸ群を含む。示されてはいないが、システムメモリ１６は、プロセッサ１２が実行のためにシステムメモリ１６から回収するグラフィックドライバー４０のためのコードを記憶し得る。グラフィックドライバー４０は、この例では、グラフィックドライバー４０がハードウェア（例えば、プロセッサ１２）上で実行するソフトウェアであることを示すために、破線のボックス中に示されている。
【００３８】
[0045]  グラフィックドライバー４０は、プロセッサ１２とＧＰＵ１４とが互いに通信することを可能にするように構成され得る。例えば、プロセッサ１２がＧＰＵ１４にグラフィックまたは非グラフィックの処理タスクをオフロードする場合、プロセッサ１２は、グラフィックドライバー４０を介してＧＰＵ１４にこのような処理タスクをオフロードする。
【００３９】
[0046]  例として、プロセッサ１２は、グラフィックデータを生成するゲームアプリケーションを実行し得、プロセッサ１２は、ＧＰＵ１４にこのグラフィックデータの処理をオフロードし得る。この例では、プロセッサ１２は、システムメモリ１６においてグラフィックデータを記憶し得、グラフィックドライバー４０は、いつグラフィックデータを回収するか、どこからシステムメモリ１６におけるグラフィックデータを回収するか、および、いつグラフィックデータを処理するか、をＧＰＵ１４に知らせ得る。また、ゲームアプリケーションは、１つまたは複数のシェーダープログラムを実行することをＧＰＵ１４に求め得る。例えば、ゲームアプリケーションは、（例えば、図１のディスプレイ１８に）表示される画像を生成するために頂点シェーダープログラム３２およびフラグメントシェーダープログラム３４を実行することをシェーダーコア２４に求め得る。グラフィックドライバー４０は、シェーダープログラムをいつ実行するかをＧＰＵ１４に知らせ、シェーダープログラムに必要とされるグラフィックデータをどこで回収するかをＧＰＵ１４に知らせ得る。この方法で、グラフィックドライバー４０は、プロセッサ１２とＧＰＵ１４との間のリンクを形成し得る。
【００４０】
[0047]  いくつかの例では、システムメモリ１６は、頂点シェーダープログラム３２、フラグメントシェーダープログラム３４、および計算シェーダープログラム３６のうちの１つまたは複数に関わるソースコードを記憶し得る。これらの例では、プロセッサ１２において実行するコンパイラ３８は、ランタイムの間に（例えば、これらのシェーダープログラムがシェーダーコア２４において実行される時間において）ＧＰＵ１４のシェーダーコア２４によって実行可能である中間コードまたはオブジェクトを形成するように、これらのシェーダープログラムのソースコードをコンパイルし得る。いくつかの例では、コンパイラ３８は、シェーダープログラムを事前にコンパイルし、システムメモリ１６においてシェーダープログラムの中間コードまたはオブジェクトを記憶し得る。
【００４１】
[0048]  本開示の技術に従えば、プロセッサ１２において作動するコンパイラ３８（または、別の例ではグラフィックドライバー４０）は、「メイン」シェーダーコンポーネントおよび「プリアンブル」シェーダーコンポーネントを含む複数のコンポーネントにシェーダーを構築し得る。メインシェーダーコンポーネントは、プリアンブルシェーダーコンポーネントを含まないシェーダーコンポーネントの全体または一部分に言及し得る。コンパイラ３８は、プロセッサ１２上で実行するプログラムからコンパイルするためのコードを受信し得る。コンパイラ３８はまた、シェーダーにおける共通の演算およびコンスタントロード命令を識別し、（メインシェーダーコンポーネントではなく）プリアンブルシェーダーコンポーネント内に共通の演算を配置し得る。コンパイラ３８は、例えば、共通の命令において定数（すなわち定数値）の排他的な使用によって、これらの共通の命令を識別し得る。コンパイラ３８は、命令、例えば、シェーダープリアンブルの開始を示すためにシェーダープリアンブルスタートを、シェーダープリアンブルの終わりを示すためにシェーダープリアンブルエンドを、使用し得る。コンパイラ３８は、パーシェーダープリアンブルの開始を示すためにＳＨＰＳ（シェーダープリアンブルスタート）命令を使用し得る。ＭＡＩＮは、現在のウェーブが第１のウェーブではない場合、ＳＨＰＳ命令が（例えば、コードのメインシェーダーブロックに）分岐し得ることの例示的なラベルである。コンパイラ３８は、パーシェーダープリアンブルの終わりを示すためにＳＨＰＥ（シェーダープリアンブルエンド）命令を使用し得る。
【００４２】
[0049]  シェーダーコア２４は、並行して同じシェーダープログラムの同じ命令の多くのインスタンスを実行するように構成され得る。例えば、グラフィックドライバー４０は、複数の頂点に関わる頂点値を回収するようにＧＰＵ１４に命令し、頂点の頂点値を処理するために頂点シェーダープログラム３２を実行するようにＧＰＵ１４に命令し得る。この例では、シェーダーコア２４は、頂点シェーダープログラム３２の複数のインスタンスを実行し、頂点の各々に関わるシェーダーコア２４の処理エレメントにおいて頂点シェーダープログラム３２の１つのインスタンスを実行することによって、それを行い得る。
【００４３】
[0050]  シェーダーコア２４におけるシェーダープログラム３２、３４、または３６の実行の第１のウェーブの処理の間に、シェーダーコア２４は、シェーダープリアンブルを実行し得る。シェーダープリアンブルの実行において使用されるコンスタント入力は、読取り／書込みコンスタントメモリ４４（例えば、コンスタントＲＡＭ）、ＧＰＲ（例えば、ＧＰＲ２６）、またはｕＧＰＲ（例えば、ｕＧＰＲ２７）において記憶され得る。シェーダーコア２４のロードユニットは、コンスタントメモリ４４に定数をロードし得る。シェーダーコア２４のロードユニットに対する命令は、パーシェーダープリアンブルコードブロック内で見つけられ得、ＧＰＵ１４におけるオンチップコンスタントメモリにシステムメモリ１６から定数がロードされることを可能にし得る。
【００４４】
[0051]  いくつかの例では、シェーダープリアンブルは、シェーダーコア２４におけるスカラープロセッサ（例えば、単一の演算論理ユニット（ＡＬＵ：arithmetic logic unit））によって実行され得る。他の例では、シェーダープリアンブルは、（時としてベクトルプロセッサと呼ばれる）シェーダーコア２４の並列処理エレメントによって実行され得る。シェーダープリアンブルの実行は、定数値または値のセットをもたらし得る。定数値プリアンブルの結果は、ｕＧＰＲ２７、コンスタントメモリ４４（例えば、コンスタントＲＡＭ）、ＧＰＵメモリ４２、またはシステムメモリ１６のようなオンチップメモリにおいて記憶され得る。コンスタントメモリ４４は、ｕＧＰＲ２７またはＧＰＲ２６において保持される値のような特定のワープまたはスレッドのためにリザーブされる特定の部分のみではなく、シェーダーコア２４のすべてのエレメントによってアクセス可能なメモリを含み得る。コンスタントメモリ４４はまた、各ワープの前にデータがリロードされる必要があるのではなく、ワープ間でデータを持続的に記憶し得る。シェーダーの実行の次のワープの実行の間に、シェーダープログラム３２、３４、または３６の実行の第１のワープの間に計算された定数値（すなわち、プリアンブル結果）は、冗長コードを実行するのではなく、コンスタントメモリ４４から回収され得る。ＧＰＵ１４は、シェーダーの第１のワープのみがシェーダープリアンブルを実行することを確実にし得る。ＧＰＵ１４は、シェーダーの第１のワープのみがオンチップ内部ステートレジスタ、コンスタントメモリ４４、またはＧＰＵメモリ４２においてフラグを介してシェーダープリアンブルを実行することを確実にし得る。ＧＰＵ１４はまた、第１のワープとしてシェーダープリアンブルの実行を開始したワープを追跡し得る。現在のワープが第１のワープであること（または、別の例では、第１のワープではないこと）を示すフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ４４、またはＧＰＵメモリ４２において値として、ＧＰＵ１４によって、記憶され得る。ＧＰＵ１４はまた、第１のワープがシェーダープリアンブル命令の実行を完了したか否かを追跡し得る。第１のワープがシェーダープリアンブル命令の実行を完了した（または、別の例では、完了していない）ことを示すフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ４４、またはＧＰＵメモリ４２において、ＧＰＵ１４よって、記憶され得る。シェーダーコア２４は、シェーダープリアンブルを（例えば、これが第１のワープである、および／またはプリアンブルが事前に実行されていない場合、）実行するか、または（例えば、これが第１のワープではない、および／またはプリアンブルが事前に実行されていた場合、）実行しないかを決定するために、これらのフラグを使用することができる。シェーダーコア２４はまた、シェーダープリアンブルの実行の完了、およびＧＰＵ１４によるコンスタントメモリ４４、ＧＰＵメモリ４２、またはｕＧＰＲ２７におけるプリアンブルのコンスタント結果のロードまで、シェーダープログラム３２、３４、または３６のスレッドの第２のワープの実行を延期し得る。
【００４５】
[0052]  一例では、シェーダーコア２４の各タイプは、オンチップ内部ステートレジスタにおいて記憶されるコンテキスト（例えば、フラグ）ビットにアクセスすることができる。シェーダーコア２４は、現在のワープが第１のワープである／でない、および／または、シェーダーコア２４におけるワープがプリアンブルを実行し始めた（または実行し始めていない）ことを示し得る１ビットpreamble_token_takenコンテキストビット（1-bit preamble_token_taken context bit）を有し得る。これらのビットは両方とも、特定のタイプのシェーダー（例えば、シェーダーコア２４）がロードされるとき、誤（false）に初期化され得る。例えば、所与のシェーダーコア２４またはシェーダータイプにおいてＳＨＰＳ（例えば、シェーダープリアンブルスタート）命令を実行するための第１のワープは、preamble_token_takenフラグを誤として見つけ得る。シェーダーコア２４は、preamble_token_takenフラグを正（true）に設定する。第１のワープがＳＨＰＥ（例えば、シェーダープリアンブルエンド）命令を実行するとき、シェーダーコア２４は、preamble_completedフラグを正に設定する。そしてシェーダーコア２４は、メインシェーダー命令ラベルからのコードを実行し続ける。非第１の（non-first）ワープでは、preamble_token_takenフラグは、正に設定され得る。すべての次のワープがメインコードセクション（例えば、ＭＡＩＮラベル）に分岐し、preamble_completedフラグが誤から正に変わるまでそこで待機する。preamble_completedフラグの変化が誤から正に変わるとき、シェーダーコア２４は、次のウェーブを実行する。
【００４６】
[0053]  図３は、シェーダープリアンブル３９を含む命令３７のセットを示す概念図である。この例では、シェーダープリアンブル３９は、シェーダープリアンブルスタート命令（ＳＨＰＳ）命令を備える。シェーダープリアンブルスタート命令は、preamble_token_takenフラグが正に設定される場合に（例えば、メインシェーダー命令４１において）「Label_MAIN」ラベルに分岐し、シェーダープリアンブルが一度で実行されることを可能にする。命令はまた、preamble_token_takenフラグが誤に設定されるとき、preamble_token_takenフラグを正に設定するようにシェーダーコア２４に命令し得る。
【００４７】
[0054]  命令（例えば、ＡＤＤ ｚ，ｙ，ｘ命令）は、シェーダーコードにおける冗長の命令を示す。命令が実行され得る（例えば、「ADD z,y,x;」は、「ｘ」および「ｙ」において共に値を追加し、「ｚ」において結果の値を記憶する）。冗長の命令の各々は、同様に実行される。冗長の値（redundant value）は、例えばコンスタントメモリ命令への記憶データを介して、コンスタントメモリ４４にセーブされ得る（例えば、「STC c[5],z;」は、「ｚ」における値をコンスタントＲＡＭロケーション５に記憶する）。冗長の値はまた、ｕＧＰＲ２７またはＧＰＲ２６に移動され得る。
【００４８】
[0055]  次の例示的な命令は、例えば、ロードコンスタント命令を介して、コンスタントメモリ４４にコンスタントバッファから複数の定数をロードし得る（例えば、「LDC c[10], index, CB1, 4;」は、ロケーション１０において開始するコンスタントＲＡＭにコンスタントバッファ（ＣＢ）１から４の定数をロードする）。シェーダープリアンブル３９は、シェーダープリアンブルエンド命令（ＳＨＰＥ)で閉じる。特定のインプリメンテーションでは、シェーダープログラム３２、３４、または３６において単独のシェーダープリアンブルスタートおよびシェーダープリアンブルエンド命令があり得る。シェーダープリアンブル３９にはメインシェーダー命令４１が後続する。
【００４９】
[0056]  シェーダープリアンブル３９における命令は、（例えば、このような命令は定数値においてのみ演算するため、）シェーダーのすべてのスレッドに対して同じ結果をもたらす命令を含み、シェーダー実行のワープ間では変化しない。これらの命令は、コンパイラ３８によって識別され得る。
【００５０】
[0057]  そしてシェーダープリアンブル３９は、シェーダープログラム３２、３４、または３６の実行のワープの数に関係なく、一度で実行されるのみである。メインシェーダー命令４１は、ワープごとに別個に実行される。シェーダープリアンブル３９の実行においてもたらされる結果は、メインシェーダー命令４１の実行において使用され、コンスタントメモリ４４において記憶され得る。実行時に、シェーダーコア２４は、シェーダープリアンブル３９が実行されたか否かを決定するために種々のフラグを使用し得るので、コンスタントメモリ４４内に記憶されるシェーダープリアンブル３９の実行の（１つまたは複数の）結果の場所を決定するだけでなく、２度目にシェーダープリアンブル３９のプリアンブルコードを実行する必要がない。種々のフラグは、現在のワープが第１のワープである（または、別の例では、それは第１のワープではない）ことを示すフラグと、第１のワープがシェーダープリアンブル命令の実行を完了した（または、別の例では完了していない）ことを示すフラグとを、含み得る。これらのフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ４４、または、ＧＰＵメモリ４２において、ＧＰＵ１４によって、記憶され得る。
【００５１】
[0058]  シェーダープリアンブル３９は、メインシェーダー命令４１の前のシェーダーコード３７の開始であるように示されているが、シェーダープリアンブル３９は、シェーダープリアンブルスタート命令（例えば、ＳＨＰＳ）およびシェーダープリアンブルエンド命令（ＳＨＰＥ）によってのみ範囲を定めるように、シェーダーコア３７内に散在し得る。さらに、シェーダープリアンブルは、制御フロー内にあり得る。シェーダープリアンブルが制御フロー内にある場合、プリアンブルを実行するためのウェーブは、シェーダーの第１のウェーブではない場合がある。
【００５２】
[0059]  図４は、ＧＰＵのシェーダーコアのＧＰＲにおけるデータ記憶の例を示す概念図である。例として、ＧＰＵ１４は、シェーダーコア２４を含み、シェーダーコア２４は、ＧＰＲ２６を含む。例として、シェーダーコア２４は、３２の処理エレメントを含み得、各々は、１つのグラフィックアイテムを処理するためにシェーダープログラムの１つのインスタンスを実行し得る。ＧＰＲ２６は、グラフィックアイテムに関わるデータを記憶し得る。例えば、ＧＰＲ２６は、３２のグラフィックアイテムに関わる９個の属性についての属性データを記憶し得る。しかしながら、ＧＰＲ２６は、３２のグラフィックアイテムに関わるおよそ９個の属性についてのデータを記憶し得る。また、ＧＰＲ２６は、グラフィックアイテムの属性に関連しないデータを記憶し得るが、そのデータは、グラフィックアイテムを処理するために必要な変数に関わるデータである。
【００５３】
[0060]  図４に示される例では、グラフィックアイテムは、Ｐ０−Ｐ３１と識別され、それは、頂点であり得る。属性は、グラフィックアイテム識別子に続いて変数によって識別される。例えば、Ｐ０．Ｘは、Ｐ０グラフィックアイテムに関わるｘ座標に言及し、Ｐ０．Ｙは、Ｐ０グラフィックアイテムに関わるｙ座標に言及する、など。Ｐ０．Ｒ、Ｐ０．Ｇ、Ｐ０．ＢおよびＰ０．Ａは、それぞれ、Ｐ０グラフィックアイテムの赤コンポーネント、緑コンポーネント、青コンポーネント、および不透明性に言及する。他のグラフィックアイテム（例えば、Ｐ１−Ｐ３１）は、同様に識別される。
【００５４】
[0061]  言い換えると、図４では、頂点Ｐ０−Ｐ３１は、複数の変数に各々関連する。一例では、頂点Ｐ０−Ｐ３１の各々は、ｘ座標（Ｐ０．Ｘ乃至Ｐ３１．Ｘ）を識別する変数に関連する。頂点Ｐ０−Ｐ３１の各々は、ｙ座標（Ｐ０．Ｙ乃至Ｐ３１Ｙ）を識別する変数に関連する、など。これらの変数の各１つは、複数のグラフィックアイテムの各々を処理するために必要とされる。例えば、ｘ座標を識別する変数は、頂点Ｐ０−Ｐ３１の各々を処理するために必要とされる。
【００５５】
[0062]  図４にも示されているように、グラフィックアイテムの各々はまた、ＰＲＪ属性を含む。ＰＲＪ属性は、シェーダーコア２４の処理エレメントを実行する頂点シェーダーが利用し得るプロジェクション行列である。この例では、ＰＲＪ属性は、頂点Ｐ０−Ｐ３１の各々を処理するために必要とされる別の変数である。例えば、頂点シェーダーは、プロジェクション行列にそれぞれの座標を乗じ（例えば、Ｐ０．ＰＲＪにＰ０．Ｘ、Ｐ０．Ｙ、Ｐ０．ＺおよびＰ０．Ｗを乗じ）得る。
【００５６】
[0063]  ＧＰＵ１４がデータ（例えば値）を記憶し得るさまざまなユニットがあり得ることが、理解されるべきである。ＧＰＵ１４は、システムメモリ１６においてデータを記憶し得、または、ローカルメモリ（例えば、キャッシュ）においてデータを記憶し得る。シェーダーコア２４のＧＰＲ２６は、ＧＰＵ１４のローカルメモリおよびシステムメモリ１６のどちらとも異なる。例えば、システムメモリ１６は、デバイス１０のさまざまなコンポーネントによってアクセス可能であり、これらのコンポーネントは、データを記憶するためにシステムメモリ１６を使用する。ＧＰＵ１４のローカルメモリは、ＧＰＵ１４のさまざまなコンポーネントによってアクセス可能であり、これらのコンポーネントは、データを記憶するためにＧＰＵ１４のローカルメモリを使用する。しかしながら、ＧＰＲ２６は、シェーダーコア２４のコンポーネントによってのみアクセス可能であり得、シェーダーコア２４の処理エレメントに関わるデータのみ記憶し得る。
【００５７】
[0064]  いくつかの例では、グラフィックワープにおけるグラフィックアイテムの１つまたは複数の変数は、グラフィックワープにわたって均一である。このような例では、ＧＰＲ２６における各スレッド／ファイバーに関わる別個のエントリーにおいて１つまたは複数の変数に関わる均一のデータを記憶するのではなく、ＧＰＵ１４は、コンスタントメモリ４４におけるまたはワープ／ウェーブにおけるすべてのスレッド／ファイバーによってアクセス可能であるｕＧＰＲ２７において、一度で均一のデータを記憶し得る。
【００５８】
[0065]  一例では、ｕＧＰＲ２７は、複数の記憶ロケーションを含み得、ここにおいて各記憶ロケーションは、グラフィックアイテムの複数の属性の１つの属性に関連する。例えば、図４に示されるように、各グラフィックアイテムＰ０−Ｐ３１は、９個の属性（ＰＲＪ、ｘ、ｙ、ｚ、ｗ、Ｒ、Ｇ、Ｂ、およびＡ）を含む。この例では、ｕＧＰＲ２７は、９個の記憶ロケーションを含み得、ここにおいてｕＧＰＲ２７の第１のロケーションは、ＰＲＪ属性に関連し、ｕＧＰＲ２７の第２のロケーションは、ｘ座標に関連する、など。さらに、ｕＧＰＲ２７におけるデータは、ワープの各スレッドによって使用され得る。
【００５９】
[0066]  定数は、システムメモリにおけるコンスタントバッファにおいて記憶され得る。コンスタントロード命令は、システムメモリからコンスタントメモリ４４に定数をロードすることをコンパイラに可能にするために使用され得る。定数はまた、コンスタントメモリ４４が満杯である場合、ＧＰＲ２６およびｕＧＰＲ２７において記憶され得る。
【００６０】
[0067]  慣例として、データはワープ間にセーブされない場合がある。いくつかの例では、ＧＰＲ２６およびｕＧＰＲ２７は、ウェーブごとにリロードまたは再計算される。コンスタントメモリ４４は、ワープ間にセーブされ得る。しかしながら、シェーダーコア２４は、プリアンブル命令にアクセスし、第１のワープの間にそれらを実行し得る。命令が実行された後、次のワープが、コンスタントメモリ４４におけるこれらの命令の結果にアクセスし得る。
【００６１】
[0068]  図５は、本開示の均一なプレディケート（uniform predicate）に関わる技術をインプリメントするために使用され得るＧＰＵ１４の例としての構成を示すブロック図である。ＧＰＵ１４は、並行してプログラムに関わる命令を実行するように構成されている。ＧＰＵ１４は、制御ユニット７２、処理エレメント７４Ａ−７４Ｄ（総じて「処理エレメント７４」）、命令ストア７６、ＧＰＲ２６、コンスタントメモリ４４、ｕＧＰＲ２７、ステートレジスタ９２、通信パス８０、８２、８４、８６Ａ−８６Ｄ、およびロードユニット９０を含むシェーダーコア２４を含む。通信パス８６Ａ−８６Ｄは、「通信パス８６」と総称され得る。いくつかの例では、ＧＰＵ１４は、処理エレメント７４を使用してプログラム（例えばシェーダー）のワープに関わる実行の複数のスレッドを実行するように構成されたシングルインストラクションマルチプルデータ（ＳＩＭＤ）処理システムとして構成され得る。このようなＳＩＭＤシステムにおいて、処理エレメント７４は一緒に、異なるデータアイテムに対して一度に単一の命令を処理し得る。プログラムは、プログラムに関連するスレッドのすべてが実行を完了した後にリタイアする。
【００６２】
[0069]  制御ユニット７２は、通信パス８０を介して命令ストア７６に、通信パス８２を介して処理エレメント７４に、通信パス８４を介してＧＰＲ２６に、通信可能に結合される。制御ユニット７２は、命令ストア７６に読取り命令を送るために、通信パス８０を使用し得る。読取り命令は、命令が回収されるべき命令ストア７６における命令アドレスを特定し得る。制御ユニット７２は、読取り命令を送るのに応答して、命令ストア７６から１つまたは複数のプログラム命令を受信し得る。制御ユニット７２は、命令ストア７６からメインシェーダー命令４１およびシェーダープリアンブル３９を読取り得る。制御ユニット７２は、（オンチップステートレジスタ９２、ｕＧＰＲ２７、またはＧＰＲ２６において記憶されるフラグを介して）プリアンブルが事前に実行されているか否かを決定し得る。制御ユニットは、（オンチップステートレジスタ９２、ｕＧＰＲ２７、またはＧＰＲ２６において記憶されるフラグを介して）現在のワープが第１のワープであるか否かを決定し得る。制御ユニット７２はまた、基本的な状態が変化する（例えば、プリアンブルが実行された、および／または、現在のワープが第１のワープではない）とき、先行のフラグを変化させ得る。制御ユニット７２による先行のフラグの使用は、プリアンブルコードが一度のみで実行されること、および次の（例えば第２の、第３の、などの）ワープはプリアンブルが実行を完了する前に開始しないことを、確実にし得る。制御ユニット７２は、処理エレメント７４に命令を提供するために、およびいくつかの例では、処理エレメント７４からデータ、例えば、分岐条件を評価するための比較命令の結果、を受信するために、通信パス８２を使用し得る。いくつかの例では、制御ユニット７２は、ステートレジスタ９２、ｕＧＰＲ２７、ＧＰＲ２６、またはコンスタントメモリ４４からデータアイテム値を回収するために、例えば、分岐条件を決定するために、通信パス８４を使用し得る。図５は、他の例では通信パス８４を含むようにＧＰＵ１４を示しているが、ＧＰＵ１４は、通信パス８４を含まない場合もある。
【００６３】
[0070]  定数値は、最初は、システムメモリ１６におけるコンスタントバッファにおいて記憶され得る。ロードユニット９０は、制御ユニット７２、コンパイラ３８、および／またはグラフィックドライバー４０からの命令を介して、システムメモリ１６におけるコンスタントバッファから定数値を、コンスタントメモリ４４、ｕＧＰＲ２７、またはＧＰＲ２６にロードし得る。ロードユニット９０は、コンスタントメモリ４４においてアロケートされるスペースが満杯である場合、ｕＧＰＲ２７において定数をロードするように構成され得る。
【００６４】
[0071]  処理エレメント７４の各々は、命令ストア７６において記憶されるプログラムに関わる命令を処理するように構成され得る。いくつかの例では、処理エレメント７４の各々は、演算の同じセットを実施するように構成され得る。例えば、処理エレメント７４の各々は、同じ命令セットアーキテクチャ（ＩＳＡ）をインプリメントし得る。追加の例では、処理エレメント７４の各々は、演算論理ユニット（ＡＬＵ）であり得る。さらなる例では、ＧＰＵ１４は、ベクトルプロセッサとして構成され得、処理エレメント７４の各々は、ベクトルプロセッサ内の処理エレメントであり得る。追加の例では、ＧＰＵ１４は、ＳＩＭＤ実行ユニットであり得、処理エレメント７４の各々は、ＳＩＭＤ実行ユニット内のＳＩＭＤ処理エレメントであり得る。
【００６５】
[0072]  処理エレメント７４によって実施される演算は、算術演算、論理演算、比較演算、などを含み得る。算術演算は、例えば、加法演算、減法演算、乗法演算などの演算を含み得る。算術演算はまた、例えば、整数演算、および／または浮動小数点演算を含み得る。論理演算は、例えば、ビット単位のＡＮＤ演算、ビット単位のＯＲ演算、ビット単位のＸＯＲ演算、などの演算を含み得る。比較演算は、例えば、greater than演算、less than演算、equal to zero演算、not equal to zero演算などの演算を含み得る。greater than演算、およびless than演算は、第１のデータアイテムが第２のデータアイテムより大きいか小さいかを決定し得る。equal to zero演算およびnot equal to zero演算は、データアイテムがゼロに等しいかゼロと等しくないかを決定し得る。演算のために使用される演算数は、ＧＰＲ２６またはｕＧＰＲ２７において内包されるレジスタにおいて記憶され得る。
【００６６】
[0073]  処理エレメント７４の各々は、通信パス８２を介して制御ユニット７２から命令を受信することに応答して、演算を実施するように構成され得る。いくつかの例では、処理エレメント７４の各々は、他の処理エレメント７４から独立して活性化および／または不活性化されるように構成され得る。このような例では、処理エレメント７４の各々は、それぞれの処理エレメント７４Ａ−７４Ｄが活性化されるとき、制御ユニット７２から命令を受信することに応答して演算を実施するように構成され得、それぞれの処理エレメント７４Ａ−７４Ｄが不活性化されるとき、すなわち、活性化されないとき、制御ユニット７２から命令を受信することに応答して演算を実施しないように構成され得る。
【００６７】
[0074]  処理エレメント７４Ａ−７４Ｄの各々は、それぞれの通信パス８４Ａ−８６Ｄを介してＧＰＲ２６に通信可能に結合され得る。処理エレメント７４は、ＧＰＲ２６、ｕＧＰＲ２７、および／またはコンスタントメモリ４４からデータを回収し、通信パス８６、ｕＧＰＲ２７、および／またはコンスタントメモリ４４を介してＧＰＲ２６にデータを記憶するように構成され得る。ＧＰＲ２６、ｕＧＰＲ２７、および／またはコンスタントメモリ４４から回収されるデータは、いくつかの例では、処理エレメント７４によって実施される演算に関わる演算数であり得る。ＧＰＲ２６、ｕＧＰＲ２７、および／またはコンスタントメモリ４４において記憶されるデータは、いくつかの例では、処理エレメント７４によって実施される演算の結果であり得る。
【００６８】
[0075]  命令ストア７６は、ＧＰＵ１４による実行のためのプログラムを記憶するように構成されている。プログラムは、一連の命令として記憶され得る。これらの命令は、シェーダープリアンブル３９およびメインシェーダー命令４１を含み得る。いくつかの例では、各命令は、均一命令アドレス値によってアドレスを指定され得る。このような例では、一連の命令における後の命令に関わる命令アドレス値は、一連の命令における先の命令に関わる命令アドレス値より大きい。プログラム命令は、いくつかの例では、マシンレベル命令であり得る。かくして、このような例では、命令は、ＧＰＵ１４のＩＳＡに対応するフォーマットであり得る。命令ストア７６は、通信パス８０を介して制御ユニット７２から読取り命令を受信するように構成されている。読取り命令は、命令が回収されるべき命令アドレスを特定し得る。読取り命令を受信するのに応答して、命令ストア７６は、通信パス８０を介して制御ユニット７２に、読取り命令において特定された命令アドレスに対応する命令を提供し得る。
【００６９】
[0076]  命令ストア７６は、任意のタイプのメモリ、キャッシュ、またはそれらの組み合わせであり得る。命令ストア７６がキャッシュである場合、命令ストア７６は、ＧＰＵ１４の外部にあるプログラムメモリにおいて記憶されるプログラムをキャッシュに格納し得る。命令ストア７６は、ＧＰＵ１４内にあるように示されているが、他の例では、命令ストア７６は、ＧＰＵ１４の外部にあり得る。
【００７０】
[0077]  ＧＰＲ２６は、処理エレメント７４によって使用されるデータアイテムを記憶するように構成されている。いくつかの例では、ＧＰＲ２６は、複数のレジスタを備え得、各レジスタは、ＧＰＵ１４上で演算される複数のデータアイテム内にそれぞれのデータアイテムを記憶するように構成されている。ＧＰＲ２６は、ＧＰＲ２６におけるレジスタとメモリまたはキャッシュ（図示されていない）との間でデータを転送するように構成されている１つまたは複数の通信パス（図示されていない）に結合され得る。
【００７１】
[0078]  ｕＧＰＲ２７は、処理エレメント７４によって使用されるデータアイテムを記憶するように構成されており、ｕＧＰＲ２７内の各メモリエレメントは、ウェーブ／ワープの複数の処理エレメント（例えば、スレッド／ファイバー）によってアクセス可能であるように構成されている。
【００７２】
[0079]  ステートレジスタ９２、ｕＧＰＲ２７、またはＧＰＲ２６は、制御ユニット７２によって使用される複数のフラグを記憶し得る。ステートレジスタ９２、ｕＧＰＲ２７、またはＧＰＲ２６において記憶されたフラグは、プリアンブルが事前に実行されていることを示すためにフラグを含み得る。このフラグは、制御ユニット７２が、シェーダープリアンブル３９が完全に実行された後に開始するようにワープにおけるスレッドの処理の時間を決めることを可能にし得、実行の結果は、コンスタントメモリ４４、ｕＧＰＲ２７、および／またはＧＰＲ２６において記憶される。プリアンブルが事前に実行されていることを示すフラグは、最初に、ステートレジスタ９２、ｕＧＰＲ２７、またはＧＰＲ２６において「off」に設定され得る。ステートレジスタ９２、ｕＧＰＲ２７またはＧＰＲ２６はまた、現在のワープが第１のワープであることを示すためにフラグを含み得る。現在のワープが第１のワープであることを示すフラグは、最初に「on」に設定され得る。
【００７３】
[0080]  図５は、処理エレメント７４によって使用されるデータを記憶するための単一のＧＰＲ２６を示しているが、他の例では、ＧＰＵ１４は、処理エレメント７４の各々に対して専用の、別個のデータストアを含み得る。ＧＰＵ１４は、例の目的のために、４つの処理エレメント７４を示している。他の例では、ＧＰＵ１４は、同じまたは異なる構成でさらに多くの処理エレメントを有し得る。
【００７４】
[0081]  制御ユニット７２は、命令ストア７６において記憶されるプログラムに関わる命令を実行するためにＧＰＵ１４を制御するように構成されている。プログラムの命令のセットまたは各命令に関して、制御ユニット７２は、通信パス８０を介して命令ストア７６から命令を回収し、命令を処理し得る。いくつかの例では、制御ユニット７２は、命令に関連する演算を処理エレメント７４の１つまたは複数上で実行させることによって、命令を処理し得る。例えば、制御ユニット７２によって回収される命令は、命令によって特定されるデータアイテムに関して算術演算を実施するようにＧＰＵ１４に命令する算術命令であり得、制御ユニット７２は、処理エレメント７４のうちの１つまたは複数に、特定されるデータアイテムにおいて算術演算を実施させ得る。さらなる例では、制御ユニット７２は、演算を処理エレメント７４において実施させることなく、命令を処理し得る。
【００７５】
[0082]  制御ユニット７２は、通信パス８２を介して処理エレメント７４に命令を提供することによって、演算を処理エレメント７４の１つまたは複数において実施させ得る。命令は、処理エレメント７４によって実施される演算を特定し得る。処理エレメント７４の１つまたは複数に提供される命令は、命令ストア７６から回収される命令と同じ、または異なり得る。いくつかの例では、制御ユニット７２は、演算が実施されるべき処理エレメント７４の特定のサブセットを活性化することと、演算が実施されるべきでない処理エレメント７４の別のサブセットを不活性化することとの一方または両方によって、（単独の処理エレメントを含む）処理エレメント７４の特定のサブセットにおいて演算を実施させ得る。制御ユニット７２は、通信パス８２を介して処理エレメント７４の各々に活性化信号および／または不活性化信号をそれぞれ提供することによって処理エレメント７４を活性化および／または不活性化し得る。いくつかの例では、制御ユニット７２は、処理エレメント７４に命令を提供することと同時に、処理エレメント７４に活性化および／または不活性化信号を提供することによって処理エレメント７４を活性化および／または不活性化し得る。さらなる例では、制御ユニット７２は、処理エレメント７４に命令を提供する前に処理エレメント７４を活性化および／または不活性化し得る。制御ユニット７２は、処理エレメント７４を使用してプログラムに関わる実行の複数のスレッドを実行し得る。並行して実行される複数のスレッドは、時としてワープと呼ばれる。処理エレメント７４の各々は、複数のスレッドのそれぞれのスレッドに関わるプログラムの命令を処理するように構成され得る。例えば、制御ユニット７２は、処理のための処理エレメント７４のうちの個々の１つに実行の各スレッドを割り当て得る。プログラムに関わる実行のスレッドは、データアイテムのセットにおける異なるデータアイテムに対して命令の同じセットを実行し得る。例えば、処理エレメント７４Ａは、複数のデータアイテムにおけるデータアイテムの第１のサブセットに対して命令ストア７６において記憶されるプログラムに関わる実行の第１のスレッドを実行し得、処理エレメント７４Ｂは、複数のデータアイテムにおけるデータアイテムの第２のサブセットに対して命令ストア７６において記憶されるプログラムに関わる実行の第２のスレッドを実行し得る。実行の第１のスレッドは、実行の第２のスレッドと同じ命令を含み得るが、データアイテムの第１のサブセットは、データアイテムの第２のサブセットとは異なり得る。処理エレメント７４は、メインシェーダー命令４１を実行し得る。処理エレメント７４は、シェーダープリアンブル３９を実行し得る。別の例では、シェーダーコア２４は、シェーダープリアンブル３９の命令を実行するために、通信パス８８を介して、別個のスカラー処理ユニット９４を使用し得る。
【００７６】
[0083]  スカラー処理ユニット９４は、一度に１つのデータアイテムにおいて演算するように構成される任意のタイプのプロセッサであり得る。処理エレメント７４と同様に、スカラー処理ユニット９４は、ＡＬＵを含み得る。スカラー処理ユニット９４によって実施される演算は、算術演算、論理演算、比較演算、などを含み得る。算術演算は、例えば、加法演算、減法演算、乗法演算、除法演算などの演算を含み得る。算術演算はまた、例えば、整数演算、および／または浮動小数点演算を含み得る。論理演算は、例えば、ビット単位のＡＮＤ演算、ビット単位のＯＲ演算、ビット単位のＸＯＲ演算、などの演算を含み得る。比較演算は、例えば、greater than演算、less than演算、equal to zero演算、not equal to zero演算などの演算を含み得る。greater than演算、およびless than演算は、第１のデータアイテムが第２のデータアイテムより大きいか小さいかを決定し得る。equal to zero演算およびnot equal to zero演算は、データアイテムがゼロに等しいかゼロに等しくないかを決定し得る。演算のために使用される演算数は、ＧＰＲ２６において内包されるレジスタにおいて記憶され得る。
【００７７】
[0084]  プリアンブル命令の結果を参照するシェーダー命令が実行されるとき、（コンスタント）結果が、再度シェーダープリアンブル命令を実行する代わりにＧＰＲ２６から回収される。
【００７８】
[0085]  図６は、本開示の技術に従った例としての方法を示すフローチャートである。図６の技術は、ＧＰＵ１４および／またはプロセッサ１２のうちの１つまたは複数によってインプリメントされ得る（図１および図２参照）。
【００７９】
[0086]  本開示の一例では、ＧＰＵ１４は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラ３８から受信する（１００）ように構成され得る。プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、１つまたは複数の結果は、シェーダープログラムを実行する（例えばウェーブ／ワープのような）スレッドの複数のグループの各々に対して同じ１つまたは複数の結果であり得る。ＧＰＵ１４は、１つまたは複数の結果をもたらすためにプリアンブルコードブロックを実行する（１０２）ようにさらに構成され得る。プリアンブルコードブロックは、ＧＰＵ１４においてスカラー処理ユニット９４によって実行され得る。プリアンブルコードブロックは、定数値の値を求め得る。
【００８０】
[0087]  ＧＰＵ１４はさらに、プリアンブルコードブロックの１つまたは複数の結果を記憶する（１０４）ように構成され得る。結果は、オンチップランダムアクセスメモリ（ＲＡＭ）において記憶され得る。オンチップＲＡＭは、スレッドの複数のグループの各々によってアクセス可能であり得、シェーダーコア２４のすべての処理エレメントによってアクセス可能であり得る。オンチップＲＡＭは、メインバスにアクセスすることなくＧＰＵ１４によってアクセス可能であり得る。オンチップＲＡＭは、書込み可能バッファ管理キャッシュ（writeable buffer managed cache）を含み得る。ＧＰＵ１４がシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することを完了したとの決定において、ＧＰＵ１４は、プリアンブルコードブロックを実行することによってもたらされる１つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの１つのグループのスレッドごとにメインシェーダーコードブロックを実行する（１０６）ように構成され得る。本開示の一例では、ＧＰＵ１４は、シェーダープリアンブルスタート命令を識別することに基づいてプリアンブルコードブロックを識別するように構成され得る。
【００８１】
[0088]  本開示のさらなる例では、ＧＰＵ１４は、プリアンブルコードブロックが、スレッドの第１のグループによって実行されているか否かを追跡し、シェーダーがスレッドの複数のグループのうちスレッドの次のグループを実行することを可能にするように、構成され得る。ＧＰＵ１４はまた、プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの第１のグループの前にスレッドの複数のグループのスレッドの任意のグループが実行されているか否かを追跡するように、構成され得る。ＧＰＵ１４はまた、プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、プリアンブルコードブロックが実行されているか否かを、追跡するように構成され得る。本開示のさらなる例では、ＧＰＵ１４は、オンチップコンスタントメモリに、システムＲＡＭ（例えば、非オンチップＲＡＭ）において位置を特定されるコンスタントバッファからプリアンブルコードブロックの１つまたは複数の結果をロードするように構成され得る。
【００８２】
[0089]  プロセッサ１２において作動するシェーダーコンパイラ（例えば、コンパイラ３８）は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別し得る。プロセッサ１２において作動するシェーダーコンパイラ（例えば、コンパイラ３８）はまた、シェーダープログラムのプリアンブルコードブロックに命令のコードブロックをグループ化し得る。このようなグループ化は、ＧＰＵ１４によって使用され得る。シェーダー命令のスレッドの複数のグループに共通する命令のコードブロックの識別は、定数の値を求める命令の識別を含み得る。識別可能なコードブロックは、プリアンブルコードに体系化され得る。プリアンブルコードは、スレッドの複数のグループのうちスレッドの第１のグループによって実行されるように構成され得る。実行されるプリアンブルコードの１つまたは複数の結果は、スレッドの複数のグループの他のグループによって使用可能であり得る。
【００８３】
[0090]  図７は、本開示の技術に従った例としての方法を示すフローチャートである。図７の技術は、ＧＰＵ１４および／またはプロセッサ１２のうちの１つまたは複数によってインプリメントされ得る（図１および図２参照）。
【００８４】
[0091]  プロセッサ１２において実行するコンパイラ３８は、シェーダーコードを受信し得る（２００）。プロセッサ１２上で実行するコンパイラ３８は、定数の値を求める命令を識別し得る（２０２）。プロセッサ１２上で実行するコンパイラ３８は、シェーダープリアンブルに命令をグループ化し得る（２０４）。シェーダープリアンブルは、シェーダープリアンブルスタートおよびシェーダープリアンブルエンドコマンドによって範囲を指定され得る。プロセッサ１２上で実行するコンパイラ３８は、オブジェクトコードにシェーダーコードにおける命令を転換し得る（２０６）。このようなオブジェクトコードは、ＧＰＵ１４において作動するように構成される。プロセッサ１２上で実行するコンパイラ３８は、シェーダーコア２４上での実行のためにＧＰＵ１４にオブジェクトコードを送り得る。
【００８５】
[0092]  １つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはこれらの任意の組み合わせでインプリメントされ得る。ソフトウェアでインプリメントされる場合、それら機能は、コンピュータ可読媒体上で１つまたは複数の命令またはコードとして記憶または送信され、ハードウェアベースの処理ユニットによって実行され得る。コンピュータ可読媒体は、データ記憶媒体のような有形の媒体に対応する、コンピュータ可読記憶媒体を含み得る。このように、コンピュータ可読媒体は一般的に、非一時的である有形のコンピュータ可読記憶媒体に対応し得る。データ記憶媒体は、本開示に説明された技法のインプリメンテーションのための命令、コード、および／またはデータ構造を取り出すために、１つまたは複数のコンピュータまたは１つまたは複数のプロセッサによってアクセスされることができる任意の利用可能な媒体であり得る。コンピュータプログラム製品は、コンピュータ可読媒体を含み得る。
【００８６】
[0093]  限定ではなく例として、このようなコンピュータ可読記憶媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたはその他の光ディスク記憶装置、磁気ディスク記憶装置、またはその他の磁気記憶デバイス、フラッシュメモリ、あるいは、データ構造または命令の形式で所望のプログラムコードを記憶するために使用可能であり、かつコンピュータによってアクセスされることができるその他任意の媒体を備えることができる。コンピュータ可読記憶媒体およびデータ記憶媒体は、搬送波、信号、または他の一時的な媒体を含まないが、代わりとして非一時的な有形の記憶媒体を対象にすることが理解されるべきである。ディスク（disk）およびディスク（disc）は、本書で使用される場合、コンパクトディスク（ＣＤ）（disc）、レーザーディスク（登録商標）（disc）、光ディスク（disc）、デジタル多用途ディスク（ＤＶＤ）（disc）、フロッピー（登録商標）ディスク（disk）およびＢｌｕ−ｒａｙ（登録商標）ディスク（disc）を含み、ここでは、ディスク（disk）は通常、磁気的にデータを再生し、その一方でディスク（disc）は、レーザーを用いて光学的にデータを再生する。上記の組み合わせもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
【００８７】
[0094]  命令は、１つまたは複数のデジタルシグナルプロセッサ（ＤＳＰ）、汎用マイクロプロセッサ、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル論理アレイ（ＦＰＧＡ）、または他の同等な集積または離散論理回路などの、１つまたは複数のプロセッサによって実行され得る。従って、本書で使用されるような「プロセッサ」という用語は、前述の構造、または本書に説明されている技法のインプリメンテーションに適したあらゆる他の構造のいずれかに言及し得る。これに加えて、いくつかの態様では、本書に説明された機能は、符号化および復号のために構成された専用のハードウェアモジュールおよび／またはソフトウェアモジュール内で提供され得、または、組み合わされたコーデックに組み込まれ得る。また、これら技法は、１つまたは複数の回路または論理要素において完全にインプリメントされ得る。
【００８８】
[0095]  本開示の技法は、無線ハンドセット、集積回路（ＩＣ）またはＩＣのセット（例えば、チップセット）を含む、幅広い様々なデバイスまたは装置でインプリメントされ得る。様々なコンポーネント、モジュール、またはユニットは、本開示において、開示された技法を実行するように構成されたデバイスの機能的な態様を強調するために説明されているが、それらは、異なるハードウェアユニットによる実現を必ずしも必要とするわけではない。むしろ、上述されたように、様々なユニットは、コーデックハードウェアユニットにおいて組み合わされ得るか、または適切なソフトウェアおよび／またはファームウェアと併せて、上述のような１つまたは複数のプロセッサを含む、相互運用ハードウェアユニットの集合によって提供され得る。
【００８９】
[0096]  様々な例が説明された。これらの例および他の例は、以下の特許請求の範囲の範囲内にある。
【図１】
2020024716.tif 000003
【図２】
2020024716.tif 000004
【図３】
2020024716.tif 000005
【図４】
2020024716.tif 000006
【図５】
2020024716.tif 000007
【図６】
2020024716.tif 000008
【図７】
2020024716.tif 000009
【手続補正書】
【提出日】令和1年10月8日(2019.10.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
グラフィック処理ユニット（ＧＰＵ）を動作する方法であって、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから前記ＧＰＵによって、受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、前記ＧＰＵによって、実行することと、
前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを、前記ＧＰＵによって、実行することと、
を備える、方法。
【手続補正２】
【補正対象書類名】明細書
【補正対象項目名】００８９
【補正方法】変更
【補正の内容】
【００８９】
[0096]  様々な例が説明された。これらの例および他の例は、以下の特許請求の範囲の範囲内にある。
以下に本願の出願当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］
グラフィック処理ユニット（ＧＰＵ）を動作する方法であって、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから前記ＧＰＵによって、受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、前記ＧＰＵによって、実行することと、
前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを、前記ＧＰＵによって、実行することと、を備える、方法。
［Ｃ２］
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを、プロセッサで作動する前記シェーダーコンパイラによって、識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックを、前記プロセッサで作動する前記シェーダーコンパイラによって、グループ化することと、をさらに備える、Ｃ１に記載の方法。
［Ｃ３］
命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、Ｃ２に記載の方法。
［Ｃ４］
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別することをさらに備える、Ｃ１に記載の方法。
［Ｃ５］
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にすることを、さらに備える、Ｃ１に記載の方法。
［Ｃ６］
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡することを、さらに備える、Ｃ１に記載の方法。
［Ｃ７］
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡することをさらに備える、Ｃ１に記載の方法。
［Ｃ８］
前記プリアンブルコードブロックの前記実行は、前記ＧＰＵにスカラープロセッサによって実行される、Ｃ１に記載の方法。
［Ｃ９］
前記１つまたは複数の結果の前記記憶は、書き込み可能バッファ管理キャッシュにおける、Ｃ１に記載の方法。
［Ｃ１０］
前記１つまたは複数の結果の前記記憶は、シェーダープロセッサのすべての処理エレメントによってアクセス可能である、Ｃ１に記載の方法。
［Ｃ１１］
前記プリアンブルコードブロックは、１つまたは複数のコンスタント結果の値を求める、Ｃ１に記載の方法。
［Ｃ１２］
コンスタントメモリにランダムアクセスメモリ（ＲＡＭ）から前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、ロードすること、をさらに備える、Ｃ１に記載の方法。
［Ｃ１３］
データを処理するための装置であって、前記装置は、
グラフィック処理ユニット（ＧＰＵ）と、前記ＧＰＵは、メモリおよびシェーダーコアを備え、前記シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、前記制御ユニットは、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループ上で、実行するように前記複数の処理エレメントの少なくとも１つを、指示することと、
前記コンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するように前記複数の処理エレメントの少なくとも１つを指示することと、を行うように構成されている、装置。
［Ｃ１４］
プロセッサをさらに備え、前記プロセッサは、
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化することと、を行うように構成されている、Ｃ１３に記載の装置。
［Ｃ１５］
命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、Ｃ１４に記載の装置。
［Ｃ１６］
前記制御ユニットは、
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するようにさらに構成されている、Ｃ１３に記載の装置。
［Ｃ１７］
前記制御ユニットは、
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするように、さらに構成されている、Ｃ１３に記載の装置。
［Ｃ１８］
前記制御ユニットは、
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するように、さらに構成されている、Ｃ１３に記載の装置。
［Ｃ１９］
前記制御ユニットは、
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡するようにさらに構成されている、Ｃ１３に記載の装置。
［Ｃ２０］
前記プリアンブルコードブロックの前記実行は、前記複数の処理エレメントのスカラープロセッサによって実行される、Ｃ１３に記載の装置。
［Ｃ２１］
記憶された前記１つまたは複数の結果は、前記シェーダーコアのすべての処理エレメントによってアクセス可能である、Ｃ１３に記載の装置。
［Ｃ２２］
グラフィック処理ユニット（ＧＰＵ）を動作するように構成されている装置であって、前記装置は、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信するための手段と、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、実行するための手段と、
前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶するための手段と、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するための手段と、を備える、装置。
［Ｃ２３］
前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ１つまたは複数の結果である前記１つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別するための手段と、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化するための手段と、をさらに備える、Ｃ２２に記載の装置。
［Ｃ２４］
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するための手段をさらに備える、Ｃ２２に記載の装置。
［Ｃ２５］
前記プリアンブルコードブロックが、スレッドの前記第１のグループによって実行されているか否かを追跡し、前記ＧＰＵがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするための手段をさらに備える、Ｃ２２に記載の装置。
［Ｃ２６］
前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第１のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するための手段をさらに備える、Ｃ２２に記載の装置。
［Ｃ２７］
前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを追跡するための手段をさらに備える、Ｃ２２に記載の装置。
［Ｃ２８］
前記プリアンブルコードブロックは、１つまたは複数のコンスタント結果の値を求める、Ｃ２２に記載の装置。
［Ｃ２９］
コンスタントメモリにランダムアクセスメモリ（ＲＡＭ）から前記プリアンブルコードブロックの前記１つまたは複数の結果をロードするための手段をさらに備える、Ｃ２２に記載の装置。
［Ｃ３０］
記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されたときに、少なくとも１つのプロセッサに、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、前記プリアンブルコードブロックは、１つまたは複数の結果をもたらすように実行可能であり、前記１つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ１つまたは複数の結果である、
前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第１のグループにおいて、実行することと、コンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記１つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
前記プリアンブルコードブロックの前記１つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの１つのグループのスレッドごとに前記メインシェーダーコードブロックを実行することと、を行わせる、非一時的コンピュータ可読記憶媒体。
【手続補正書】
【提出日】令和1年12月26日(2019.12.26)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
グラフィック処理ユニット（ＧＰＵ）を動作する方法であって、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから前記ＧＰＵによって、受信することと、前記プリアンブルコードブロックは、前記シェーダープログラムの実行中に命令が実行されるたびに同じ１つまたは複数の結果をもたらす前記命令を備える、
前記ＧＰＵによって、前記シェーダープログラムの複数のインスタンスを実行することと、
を備え、ここにおいて、前記シェーダープログラムの前記複数のインスタンスの各々を実行することは、
前記プリアンブルコードブロックの前記実行が開始したことを第１のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が開始していないことを示す前記第１のフラグに応答して、前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを実行し、かつ前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、
前記プリアンブルコードブロックの実行が開始したことを示す前記第１のフラグに応答して、前記プリアンブルコードブロックを実行しないことと、
前記プリアンブルコードブロックの実行が完了したことを第２のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が完了していないことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックの実行が完了したことを示すための前記第２のフラグを待つことと、
前記プリアンブルコードブロックの実行が完了したことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用して前記メインシェーダーコードブロックを実行することと、
を備える、方法。
【請求項２】
前記シェーダープログラムの実行中に前記命令が実行されるたびに同じ前記１つまたは複数の結果をもたらす前記命令を、プロセッサで作動する前記シェーダーコンパイラによって、識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに前記命令を、前記プロセッサで作動する前記シェーダーコンパイラによって、グループ化することと、
をさらに備える、請求項１に記載の方法。
【請求項３】
命令の前記識別は、もっぱら定数を使用する命令の識別を備える、請求項２に記載の方法。
【請求項４】
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別することをさらに備える、請求項１に記載の方法。
【請求項５】
前記プリアンブルコードブロックの前記実行は、前記ＧＰＵにスカラープロセッサによって実行される、請求項１に記載の方法。
【請求項６】
前記１つまたは複数の結果の前記記憶は、書き込み可能バッファ管理キャッシュにおける、請求項１に記載の方法。
【請求項７】
前記１つまたは複数の結果の前記記憶は、シェーダープロセッサのすべての処理エレメントによってアクセス可能である、請求項１に記載の方法。
【請求項８】
コンスタントメモリにランダムアクセスメモリ（ＲＡＭ）から前記プリアンブルコードブロックの前記１つまたは複数の結果を、前記ＧＰＵによって、ロードすること、
をさらに備える、請求項１に記載の方法。
【請求項９】
データを処理するための装置であって、前記装置は、
グラフィック処理ユニット（ＧＰＵ）と、前記ＧＰＵは、メモリおよびシェーダーコアを備え、前記シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、前記制御ユニットは、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、前記プリアンブルコードブロックは、前記シェーダープログラムの実行中に命令が実行されるたびに１つまたは複数の結果をもたらす前記命令を備える、
前記シェーダープログラムの複数のインスタンスを実行することと、
を行うように構成され、ここにおいて、前記シェーダープログラムの前記複数のインスタンスの各々を実行することは、
前記プリアンブルコードブロックの前記実行が開始したことを第１のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が開始していないことを示す前記第１のフラグに応答して、前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを実行するように前記複数の処理エレメントの少なくとも１つを指示し、かつ前記コンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、
前記プリアンブルコードブロックの実行が開始したことを示す前記第１のフラグに応答して、前記プリアンブルコードブロックを実行しないことと、
前記プリアンブルコードブロックの実行が完了したことを第２のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が完了していないことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックの実行が完了したことを示すための前記第２のフラグを待つことと、
前記プリアンブルコードブロックの実行が完了したことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用して前記メインシェーダーコードブロックを実行するように前記複数の処理エレメントの少なくとも１つを指示することと、
を備える、装置。
【請求項１０】
プロセッサをさらに備え、前記プロセッサは、
前記シェーダープログラムの実行中に前記命令が実行されるたびに同じ前記１つまたは複数の結果をもたらす前記命令を識別することと、
前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化することと、
を行うように構成されている、請求項９に記載の装置。
【請求項１１】
前記命令の前記識別は、もっぱら定数を使用する命令の識別を備える、請求項１０に記載の装置。
【請求項１２】
前記制御ユニットは、
シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するようにさらに構成されている、請求項９に記載の装置。
【請求項１３】
前記プリアンブルコードブロックの前記実行は、前記複数の処理エレメントのスカラープロセッサによって実行される、請求項９に記載の装置。
【請求項１４】
記憶された前記１つまたは複数の結果は、前記シェーダーコアのすべての処理エレメントによってアクセス可能である、請求項９に記載の装置。
【請求項１５】
記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されたときに、少なくとも１つのプロセッサに、
プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、前記プリアンブルコードブロックは、前記シェーダープログラムの実行中に命令が実行されるたびに同じ１つまたは複数の結果をもたらす前記命令を備える、
前記シェーダープログラムの複数のインスタンスを実行することと、
を行わせ、ここにおいて、前記シェーダープログラムの前記複数のインスタンスの各々を実行することは、
前記プリアンブルコードブロックの前記実行が開始したことを第１のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が開始していないことを示す前記第１のフラグに応答して、前記１つまたは複数の結果をもたらすために前記プリアンブルコードブロックを実行し、かつコンスタントメモリにおいて前記プリアンブルコードブロックの前記１つまたは複数の結果を記憶することと、
前記プリアンブルコードブロックの実行が開始したことを示す前記第１のフラグに応答して、前記プリアンブルコードブロックを実行しないことと、
前記プリアンブルコードブロックの実行が完了したことを第２のフラグが示すか否かを決定することと、
前記プリアンブルコードブロックの実行が完了していないことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックの実行が完了したことを示すための前記第２のフラグを待つことと、
前記プリアンブルコードブロックの実行が完了したことを示す前記第２のフラグに応答して、前記プリアンブルコードブロックを実行することによってもたらされる前記１つまたは複数の結果を使用して前記メインシェーダーコードブロックを実行することと、
を備える、非一時的コンピュータ可読記憶媒体。
【外国語明細書】
2020024716000001.pdf