JP2019517078A - グラフィック処理のためのパーシェーダープリアンブル - Google Patents

グラフィック処理のためのパーシェーダープリアンブル Download PDF

Info

Publication number
JP2019517078A
JP2019517078A JP2018561212A JP2018561212A JP2019517078A JP 2019517078 A JP2019517078 A JP 2019517078A JP 2018561212 A JP2018561212 A JP 2018561212A JP 2018561212 A JP2018561212 A JP 2018561212A JP 2019517078 A JP2019517078 A JP 2019517078A
Authority
JP
Japan
Prior art keywords
code block
shader
threads
results
preamble code
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2018561212A
Other languages
English (en)
Other versions
JP6911055B2 (ja
Inventor
チェン、リン
ドゥ、ユン
グルバー、アンドリュー・イバン
ジャオ、グオファン
ユ、チュン
ガルシア・ガルシア、デイビッド・リゲル
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Qualcomm Inc
Original Assignee
Qualcomm Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Qualcomm Inc filed Critical Qualcomm Inc
Publication of JP2019517078A publication Critical patent/JP2019517078A/ja
Application granted granted Critical
Publication of JP6911055B2 publication Critical patent/JP6911055B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/60Memory management
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T15/003D [Three Dimensional] image rendering
    • G06T15/50Lighting effects
    • G06T15/80Shading
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T2200/00Indexing scheme for image data processing or generation, in general
    • G06T2200/28Indexing scheme for image data processing or generation, in general involving image processing hardware

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Graphics (AREA)
  • Image Generation (AREA)
  • Advance Control (AREA)
  • Image Processing (AREA)
  • Complex Calculations (AREA)

Abstract

グラフィック処理ユニットにおいてデータを処理するための方法であって、シェーダーのスレッドの複数のグループに共通する命令のコードブロックを受信することと、スレッドの複数のグループのうちスレッドの1つのグループによって結果をもたらすようにシェーダーのスレッドの複数のグループに共通する命令のコードブロックを実行することと、スレッドの複数のグループの各々によってアクセス可能なオンチップランダムアクセスメモリ(RAM)においてシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することと、シェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することが完了したとの決定において、オンチップRAMからシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果をリターンすることと、を含む。【選択図】図5

Description

[0001] 本開示は、データ処理、より具体的には、グラフィック処理のためのシェーダープリアンブルの生成および実行に関する。
[0002] シングルインストラクションマルチプルデータ(SIMD)処理システムは、データの複数のピースで同じ命令を実行する複数の処理エレメントを含む並列計算システムの類である。SIMDシステムは、計算システムのサブシステム、またはスタンドアロンコンピュータであり得る。例えば、1つまたは複数のSIMD実行ユニットは、プログラム可能なシェーディングをサポートするプログラム可能なシェーディングユニットをインプリメントするために、グラフィック処理ユニット(GPU)で使用され得る。SIMD処理システムは、プログラムのための実行の複数のスレッドが並行して複数の処理エレメント上で同期的に実行することを可能にし、それによって、同じセットの演算(operation)が複数のピースのデータ上で実施される必要があるプログラムのためのスループットを増大させる。特定のSIMD処理エレメントを実行する特定の命令は、スレッドまたはファイバーと呼ばれる。スレッドのグループは、ウェーブまたはワープと呼ばれ得る。
[0003] 処理ユニット、例えばGPU、は、命令の実行に関わるデータを記憶する汎用レジスタ(GPR)および処理エレメントを含む。いくつかの例では、処理エレメントは、データのあるアイテムを処理するための命令を実行し、それぞれの処理エレメントは、そのアイテムのデータ、またはそのアイテムの、GPRにおける処理の結果としてのデータを記憶する。データのアイテムは、処理が行われるベースユニットであり得る。例えば、グラフィック処理において、プリミティブの頂点(vertex of a primitive)は、アイテムの一例であり、ピクセルは、アイテム別の例である。各頂点およびピクセルに関連するグラフィックデータ(例えば、座標、明度など)がある。
[0004] 命令の並列実行を可能にする(例えば、複数の処理エレメントが同時に同じ命令を実行する)ように、処理エレメントのプロセッサコア内に複数の処理エレメントがあり得る。シェーダーは、(例えば、シェーダープロセッサのような)並列処理環境を使用することができるコンピュータプログラムであり、グラフィック処理パイプラインのさまざまな段階で2および3次元モデルにグラフィックレンダリング技術を実施するために使用されている。シェーダーの例は、色、およびピクセル(またはフラグメント)の他の属性を計算するために使用されるピクセル(またはフラグメント)シェーダー、位置、動き、明暗、および色、または頂点を制御するために使用される頂点シェーダー、グラフィックプリミティブを生成するために使用される幾何学シェーダー、テッセレーション(tessellation)関連のシェーダー(例えば、頂点データのパッチをより小さいプリミティブにさらに分割するときに使用されるドメインシェーダー、および/または、ハルシェーダーを含み、計算シェーダーは、他の情報(例えば、非グラフィックデータ)を計算するために使用される。
[0005] 概して、本開示は、GPUのシェーダープロセッサにおいてシェーダープログラムを実行するときの冗長演算(redundant operation)を減じるための技術を説明する。一例では、本開示は、シェーダーのすべての並列処理エレメント(例えばスレッド)の間で同じ結果をもたらす命令が識別され、シェーダーごとにおよび/またはコマンド(例えば、ドローまたはディスパッチコマンド)ごとに一度実行するようにスケジューリングされている技術を、説明する。コンパイラは、冗長命令を識別し、パーシェーダー(per-shader)プリアンブルと呼ばれるコードブロックに冗長命令をグループ化し得る。そしてGPUシステムは、一度パーシェーダープリアンブルを実行し、オンチップメモリにおいてパーシェーダープリアンブルの冗長命令の結果をセーブする。そしてシェーダープロセッサの処理エレメントにおいて実行するシェーダーの各次のスレッドは、同じ結果を再度計算することなく結果を再利用することができる。さらに、データは、パーシェーダープリアンブルを介してオンチップステートキャッシュ/バッファに、および/またはオンチップランダムアクセスメモリ(RAM)に、システムメモリからプレロードされ得る。
[0006] 本開示の一例では、グラフィック処理ユニット(GPU)を動作する方法は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラからGPUによって、受信することと、プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、1つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、1つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第1のグループにおいてGPUによって、実行することと、プリアンブルコードブロックの1つまたは複数の結果を、GPUによって、記憶することと、プリアンブルコードブロックの1つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの1つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる1つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの1つのグループのスレッドごとにメインシェーダーコードブロックを、GPUによって、実行することと、を備える。
[0007] 別の例では、データを処理するための装置であって、装置は、グラフィック処理ユニット(GPU)と、GPUは、コンスタントメモリおよびシェーダーコアを備え、シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、制御ユニットは、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、1つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、1つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第1のグループにおいて、実行するように、複数の処理エレメントの少なくとも1つに、指示する(direct)ことと、コンスタントメモリにおいてプリアンブルコードブロックの1つまたは複数の結果を記憶することと、プリアンブルコードブロックの1つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの1つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる1つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの1つのグループのスレッドごとにメインシェーダーコードブロックを実行するように複数の処理エレメントの少なくとも1つに指示することと、を行うように構成されている。
[0008] 別の例では、グラフィック処理ユニット(GPU)を動作するように構成されている装置であって、装置は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信するための手段と、プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、1つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、1つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第1のグループにおいて、実行するための手段と、
[0009] プリアンブルコードブロックの1つまたは複数の結果を記憶するための手段と、プリアンブルコードブロックの1つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの1つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる1つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの1つのグループのスレッドごとにメインシェーダーコードブロックを実行するための手段と、を備える。
[0010] 別の例では、記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、命令は、実行されたときに少なくとも1つのプロセッサに、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、1つまたは複数の結果は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、1つまたは複数の結果をもたらすためにプリアンブルコードブロックを、スレッドの複数のグループのうちスレッドの第1のグループにおいて、実行することと、コンスタントメモリにおいてプリアンブルコードブロックの1つまたは複数の結果を記憶することと、プリアンブルコードブロックの1つまたは複数の結果は、スレッドの複数のグループの各々によってアクセス可能である、プリアンブルコードブロックの1つまたは複数の結果のすべてを記憶することが完了したとの決定において、プリアンブルコードブロックを実行することによってもたらされる1つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの1つのグループのスレッドごとにメインシェーダーコードブロックを実行することと、を行わせる。
[0011] 1つまたは複数の例の詳細は、添付の図面および以下の説明において示される。
他の特徴、目的、および利点は、その説明、図面、および請求項から明らかになるだろう。
[0012] 図1は、本開示に説明される1つまたは複数の例としての技術に従ってデータを処理するための例としてのデバイスを例示するブロック図である。 [0013] 図2は、図1に示されているデバイスのコンポーネントを詳細に示すブロック図である。 [0014] 図3は、例としての命令のセットを示す概念図である。 [0015] 図4は、GPUのシェーダーコアの汎用レジスタ(GPR)におけるデータ記憶の例を示す概念図である。 [0016] 図5は、図1のGPUの例としてのシェーダーコアの詳細なブロック図である。 [0017] 図6は、GPUにおけるデータを処理する例としての技術を示すフローチャートである。 [0018] 図7は、シェーダープログラムをコンパイルする例としての技術を示すフローチャートである。
[0019] 並列処理ユニット、例えば、並行して(例えば、同時にまたはほぼ同時に)多くの演算を実施するように構成されているグラフィック処理ユニット(GPU)、は、1つまたは複数のプログラムの命令を実行する1つまたは複数のプロセッサコア(例えば、GPUのためのシェーダーコア)を含む。説明を容易にするために、本開示に説明される技術は、グラフィック処理アプリケーションおよび/または汎用GPU(GPGPU)アプリケーションを実施するように構成されているGPUに関して説明される。しかしながら、本開示に説明される技術は、必ずしもGPUまたはGPGPUでは無い並列処理ユニット、並びに、非並列処理ユニット(例えば、特に並列処理のために構成されていないもの)にまで及び得る。
[0020] GPUは、シングルインストラクションマルチプルデータ(SIMD)構造で設計され得る。SIMD構造では、シェーダーコア(または、より一般的にはSIMD処理コア)は、複数のSIMD処理エレメントを含み、ここにおいて各SIMD処理エレメントは、同じプログラムの、しかし異なるデータにおける命令を実行する。特定のSIMD処理エレメントにおいて実行する特定の命令は、スレッドまたはファイバーと呼ばれる。スレッドのグループは、ウェーブまたはワープと呼ばれ得る。ワープを実行する処理エレメントのすべては、総じて、ベクトル処理ユニットと呼ばれ得、ここにおいて、ベクトルの各レーン(例えば、処理エレメント)は、1つのスレッドを実行する。各SIMD処理エレメントは、所与のスレッドに関わるデータが異なり得るので異なるスレッドを実行していると見なされ得るが、しかしながら、処理エレメント上で実行しているスレッドは、他の処理エレメント上で実行している命令と、同じプログラムの、同じ命令である。この方法で、SIMD構造は、並行して(例えば、同時に)多くのタスクを実施することをGPUに可能にする。
[0021] シェーダー(またはシェーダープログラム)は、並列処理環境(例えばシェーダープロセッサ)を使用することができるコンピュータプログラムである。ドローコマンドは、ディスプレイデバイスにおける表示のためにオブジェクトをドローイング(例えば、レンダリング)するために、グラフィック処理ユニット(例えば、GPU)と相互作用するグラフィックアプリケーションプログラムインターフェース(API)に対して処理ユニット(例えば、CPU)によって実行されるコマンドの群の1つまたは複数に言及する。ディスパッチコマンドは、非ディスプレイ演算を実行するためにグラフィック処理ユニット(GPU)と相互作用するグラフィックAPIに対して処理ユニット(例えばCPU)によって実行されるコマンドの群の1つまたは複数に言及する。ドローまたはディスパッチコマンドのエレメントは、関連するシェーダーにおいて冗長演算を実行し得る。特に、GPUは、バッチ処理コマンド、例えばドローコールおよびディスパッチを実施し得る。コマンドは、処理エレメント、例えばワークアイテム(work item)、ピクセル、および頂点に1つまたは複数のシェーダーを使用するようにGPUに命令し得る。そしてシェーダーが、エレメントのために呼び出され得る。同じシェーダーが、同じタイプのコマンドのエレメントのために呼び出され得る。シェーダーの演算は、同じタイプのすべてのエレメントのために同じ結果をもたらし得る。このような演算は、各エレメントに対して同じコードセグメントを冗長的に実行する必要なく、一度で識別および実行され得る。
[0022] 本開示は、同じタイプのすべてのエレメントに対して同じ結果をもたらすシェーダーの演算が識別され、シェーダータイプごとにおよび/またはコマンド(例えば、ドローまたはディスパッチコマンド)ごとに一度実行するようにスケジューリングされる。コンパイラは、冗長命令を識別し、パーシェーダープリアンブルと呼ばれるコードブロックに冗長命令をグループ化し得る。GPUは、一度パーシェーダープリアンブルを実行し、オンチップメモリ(例えば、ランダムアクセスメモリ(RAM))においてパーシェーダープリアンブルの冗長命令の結果をセーブする。冗長命令は、読出し/書込みコンスタントRAMの使用を可能にし得、冗長命令の計算において使用される定数が、冗長命令(すなわち、パーシェーダープリアンブル)の実行の前にこの読出し/書込みコンスタントRAMにロードされ得る。シェーダーのエレメントは、同じ結果を再度計算すること無く結果を再利用することができる。これは、大いに、性能を向上させ、電力消費を減じ得る。
[0023] 図1は、パーシェーダープリアンブルの生成および実行のための、本開示において説明される1つまたは複数の例としての技術に従って、データを処理するための例としてのデバイスを示すブロック図である。図1は、デバイス10を示し、これの例は、メディアプレーヤーのようなビデオデバイス、セットトップボックス、携帯電話、パーソナルデジタルアシスタント(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲーム機、ビデオ会議ユニット、タブレット計算デバイスのようなワイヤレス通信デバイス、などを含むがこれらに限定されない。
[0024] 図1の例において、デバイス10は、プロセッサ12、グラフィック処理ユニット(GPU)14、およびシステムメモリ16を含む。いくつかの例、例えば、デバイス10がモバイルデバイスである例では、プロセッサ12およびGPU14は、集積回路(IC)として形成され得る。例えば、ICは、システムオンチップ(SoC:system on chip)のようなチップパッケージ内の処理チップと見なされ得る。いくつかの例、例えば、デバイス10がデスクトップかラップトップコンピュータである例では、プロセッサ12およびGPU14は、異なる集積回路(例えば、異なるチップパッケージ)に収容され得る。しかしながら、デバイス10がモバイルデバイスである例では、プロセッサ12およびGPU14が異なる集積回路に収容されることが可能であり得る。
[0025] プロセッサ12およびGPU14の例は、1つまたは複数のデジタルシグナルプロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の同等な集積または離散論理回路を含むが、それらに限定されない。プロセッサ12は、デバイス10の中央処理ユニット(CPU)であり得る。いくつかの例では、GPU14は、グラフィック処理(例えば、SIMDプロセッサ)に適した超並列処理能力(massive parallel processing capabilities)をGPU14に提供する集積および/または離散論理回路を含む特殊ハードウェアであり得る。いくつかのインスタンスでは、GPU14はまた、汎用処理能力を含み得、汎用処理タスク(すなわち非グラフィック関連のタスク)をインプリメントする場合、汎用GPU(GPGPU)と呼ばれ得る。
[0026] 例の目的で、本開示に説明される技術は、GPU14で説明される。しかしながら、本開示に説明される技術は、あまり限定されない。本開示に説明される技術は、他のタイプの並列処理ユニット(例えば、グラフィック処理のためでなくとも、超並列処理能力を提供する処理ユニット)まで及び得る。また、本開示に説明される技術は、特に並列処理のために構成されていない処理ユニットまで及び得る。
[0027] プロセッサ12は、さまざまなタイプのアプリケーションを実行し得る。アプリケーションの例は、演算システム、ウェブブラウザ、eメールアプリケーション、スプレッドシート、ビデオゲーム、またはディスプレイのための可視オブジェクトを生成する他のアプリケーションを含む。システムメモリ16は、1つまたは複数のアプリケーションの実行のための命令を記憶し得る。プロセッサ12におけるアプリケーションの実行は、プロセッサ12に、表示される画像コンテンツに関するグラフィックデータを生成させる。プロセッサ12は、さらなる処理のためにGPU14に画像コンテンツのグラフィックデータを送信し得る。
[0028] 例として、プロセッサ12におけるアプリケーションの実行は、プロセッサ12に、プリミティブの頂点(vertices of primitives)を生成させ、ここにおいて、それぞれの頂点におけるプリミティブの相互接続は、グラフィカルなオブジェクトを形成する。この例では、プロセッサ12が生成するグラフィックデータは、頂点の属性に関わる属性データである。例えば、プロセッサ12上で実行するアプリケーションは、頂点に関する明度、透明度、座標などを生成し得、それらはすべて、頂点の属性の例である。頂点の属性のいくつかは、各頂点のために複製され得るコードを、部分的に、使用して生成され得、特にここにおいて、このようなコードは、実行されたときに、定数(constant)の値を求める。そしてプロセッサ12は、一度で(例えば、第1の頂点に関わる実行の間に)識別された冗長コードを実行し、このような冗長コードを使用する頂点の残りに関わる結果を再利用し得る。概して、技術は、属性データ以外のデータタイプ(例えばカウンター)に拡張可能であり、技術は、属性データに限定されるか、明度、透明度、座標などの属性データの例に限定されるとは、見なされるべきではない。
[0029] いくつかの非グラフィック関連の例では、プロセッサ12は、GPU14によって処理されるためにより適切なデータを生成し得る。このようなデータは、グラフィック、またはディスプレイの目的である必要はない。例えば、プロセッサ12は、行列演算がGPU14によって実施される必要があるデータを出力し得、GPU14は、続いて行列演算を実施し得る。
[0030] 概して、プロセッサ12は、超並列演算を必要とするタスクのような処理タスクを、GPU14にオフロードし得る。一例として、グラフィック処理は、超並列演算を要し、プロセッサ12は、GPU14にこのようなグラフィック処理タスクをオフロードし得る。しかしながら、行列演算のような他の演算はまた、GPU14の並列処理能力からの恩恵を受け得る。これらの例では、プロセッサ12は、非グラフィック関連の演算をGPU14に実施させるために、GPU14の並列処理能力を利用し得る。
[0031] プロセッサ12は、特定のアプリケーション処理インターフェース(API)に従ってGPU14と通信し得る。このようなAPIの例は、マイクロソフト(登録商標)によるDirectX(登録商標)API、クロノスグループ(Khronos group)による OpenGL(登録商標)またはOpenGL ES(登録商標)、およびOpenCL(登録商標)を含み、しかしながら、この開示の態様は、DirectX、OpenGL、またはOpenCL APIに限定されず、他のタイプのAPIにまで及び得る。さらに、本開示に説明される技術は、APIに従って機能することは要求されず、プロセッサ12およびGPU14は、通信に関わる任意の技術を使用し得る。
[0032] デバイス10はまた、ディスプレイ18、ユーザーインターフェース20およびトランシーバモジュール22を含み得る。デバイス10は、明確化のために図1に示されていない、追加のモジュールまたはユニットを含み得る。例えば、デバイス10は、デバイス10がモバイルワイヤレス電話である例では、電話による通信を達成するために、スピーカおよびマイクルフォンを含み得る、それらはどちらも図1に示されていない。さらに、デバイス10に示されているさまざまなモジュールおよびユニットは、デバイス10のすべての例には必要とされない場合もある。例えば、ユーザーインターフェース20およびディスプレイ18は、デバイス10がデスクトップコンピュータである例では、デバイス10の外側にあり得る。別の例として、ユーザーインターフェース20は、ディスプレイ18がモバイルデバイスのタッチセンサ式または存在センサ式ディスプレイである例では、ディスプレイ18の一部であり得る。
[0033] ディスプレイ18は、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、タッチセンサ式ディスプレイ、存在センサ式ディスプレイ、または他のタイプのディスプレイデバイスを備え得る。ユーザーインターフェース20の例は、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含むが、それらに限定されない。ユーザーインターフェース20はまた、タッチスクリーンであり得、ディスプレイ18の一部として組み込まれ得る。トランシーバモジュール22は、デバイス10と他のデバイスまたはネットワークとの間の有線または無線の通信を可能にするために、回路を含み得る。トランシーバモジュール22は、変調器、復調器、増幅器、および有線または無線の通信のための他のこのような回路を含み得る。
[0034] システムメモリ16は、デバイス10のためのメモリであり得る。システムメモリ16は、1つまたは複数のコンピュータ可読記憶媒体を備え得る。システムメモリ16の例は、ランダムアクセスメモリ(RAM)、電気的消去可能プログラマブル読取り専用メモリ(EEPROM(登録商標))、フラッシュメモリ、あるいは、データ構造および/または命令の形式で所望のプログラムコードを記憶または搬送するために使用可能であり、かつコンピュータまたはプロセッサによってアクセスされることができるその他の媒体を含むが、それらに限定されるものではない。
[0035] いくつかの態様では、システムメモリ16は、本開示ではプロセッサ12、およびGPU14に属する機能を、プロセッサ12および/またはGPU14に実施させる命令を含み得る。従って、システムメモリ16は、実行されたときに、1つまたは複数のプロセッサ(例えば、プロセッサ12およびGPU14)にさまざまな機能を実施させる、記憶された命令を有するコンピュータ可読記憶媒体であり得る。
[0036] いくつかの例では、システムメモリ16は、非一時的な記憶媒体であり得る。「非一時的な」という用語は、記憶媒体が、搬送波または伝播信号で具現化されないことを示し得る。しかしながら、「非一時的な」という用語は、システムメモリ16が移動不可能である(non-movable)こと、またはそれのコンテンツが静的であること、を意味するように解釈されるべきではない。1つの例として、システムメモリ16は、デバイス10から取り除かれ、別のデバイスへ移動され得る。別の例として、システムメモリ16と実質的に同様のメモリが、デバイス10に挿入され得る。ある特定の例では、非一時的な記憶媒体は、(例えば、RAMにおいて)経時的に変化し得るデータを記憶し得る。
[0037] 例えば、本開示の各所でより詳細に説明されるように、システムメモリ16は、本開示に説明される1つまたは複数の例の技術を実施するプロセッサ12において実行する、コンパイラに関わるコードを記憶し得る。システムメモリ16はまた、GPU14のシェーダーコア(シェーダープロセッサまたはカーネルとも呼ばれる)上で実行するシェーダープログラム(例えば、頂点シェーダー、ピクセルまたはフラグメントシェーダー、テッセレーション関連のシェーダー、計算シェーダーなど)のためのコードを記憶し得る。さらに、システムメモリ16は、1つまたは複数のコンスタントバッファを記憶し得る。コンスタントロード命令は、GPU14のコンスタントメモリにシステムメモリから定数をロードすることをコンパイラ38に可能にし得る。定数は、コンスタントメモリ44が満杯である場合、GPR26(またはuGPR27)にロードされ得る。
[0038] グラフィックアイテムという用語は、GPU14が並列処理を実施するベースユニットに言及するために本開示において使用される。GPU14は、並行して(例えば、同時に)複数のグラフィックアイテムを処理し得る。例えば、頂点シェーダーは、頂点を処理し得、GPU14は、同時に複数の頂点を処理するために並行して頂点シェーダーの複数のインスタンスを実行し得る。同様に、ピクセルまたはフラグメントシェーダーは、ディスプレイのピクセルを処理し得、GPU14は、同時にディスプレイの複数のピクセルを処理するために並行してピクセルシェーダーの複数のインスタンスを実行し得る。頂点およびピクセルは、グラフィックアイテムの例である。非グラフィック関連のアプリケーションに関しては、「ワークアイテム」という用語は、GPU14が処理を実施する最小のユニットに言及し得る。
[0039] 以下により詳細に説明されるように、本開示のさまざまな例に従えば、GPU14は、GPU14におけるワープの(または複数のワープにわたる)すべてのスレッドが、プロセッサ12によって実行されるコンパイラによって識別された第1のスレッド/ワープの実行の間に(単一のまたは複数のワープにわたる)各スレッドの間で共通の命令の第1のセットを実行する、というインジケーションを(例えば、パーシェーダープリアンブルにおいて)受信するように構成され得る。パーシェーダープリアンブルにおける命令は、命令が一定、および/または可変/動的であり得る非発散性の(non-divergent)入力を使用する(例えば、それらはすべてのファイバー/スレッドにわたって均一および/またはスカラーである)ので、パーシェーダープリアンブルにおける包含のために識別され得る。そしてGPU14は、システムメモリ16からそれらの定数にアクセスし、GPU14におけるコンスタントRAMにおいてそれらを記憶し得る。パーシェーダープリアンブルの共通の命令を実行するとき、GPU14は、コンスタントRAMにおける定数にアクセスし得る。GPU14は、共通の命令を実施し得る。パーシェーダープリアンブルの共通の命令を実施した後に、GPU14は、読取り/書込みコンスタントRAMにおいて結果を記憶し得る。別の例では、パーシェーダープリアンブルの結果(例えば、定数値)は、システムメモリ16におけるまたはGPU14における他のオンチップRAMでは、1つまたは複数の汎用レジスタ(GPR)、均一GPR(uGPR)、または共有GPR(sGPR)において記憶され得る。しかしながら、GPR、uGPR、およびsGPRは、各ワープ間でクリアされ得(すなわち、データはワープ間のGPRにおいて共有されることができない)、このようなデータは、ワープごとにこのようなGPRに書き換えられなければならない。GPRはまた、特定のスレッド/ファイバーに関わるデータを記憶し(およびそれらによってアクセス可能であり)得、一方でuGPRは、ウェーブ/ワープにおけるすべてのスレッド/ファイバーに関わるデータを記憶し(およびそれによってアクセス可能であり)得る。データはまた、ワープ間データ共有を許可するオンチップ(例えばGPU14上の)メモリまたはシステムメモリ16において記憶され得る。パーシェーダープリアンブルの実行の結果は、2度目(またはそれ以降)に同じ結果を再びもたらすことなく、シェーダーの各エレメント(例えばスレッド)のために再利用され得る。パーシェーダープリアンブルの実行の結果はまた、2度目(またはそれ以降)に同じ結果を再びもたらすことなく、シェーダーの複数のワープのために再利用され得る。
[0040] 図2は、図1に示されているデバイスのコンポーネントを詳細に示すブロック図である。図2に示されているように、GPU14は、シェーダーコア24を含み、それは、汎用レジスタ(GPR)26、ユニフォームGPR27、およびコンスタントメモリ44、(1つまたは複数の)固定機能パイプライン30、およびGPUメモリ42を含む。GPR26は、単一のGPR、GPRファイル、および/またはGPRバンクを含み得る。uGPR27は、単一のuGPR、uGPRファイル、および/またはuGPRバンクを含み得る。GPR26は、単一のスレッド/ファイバーにアクセス可能なデータを記憶し得る。uGPR27は、単一のウェーブ/ワープにおけるすべてのスレッド/ファイバーによってアクセス可能なデータを記憶し得る。シェーダーコア24および(1つまたは複数の)固定機能パイプライン30は共に、グラフィックまたは非グラフィック関連の機能を実施するために使用される処理パイプラインを形成し得る。処理パイプラインは、GPU14上で実行するソフトウェアまたはファームウェアによって規定されるような機能を実施し、特定の機能を実施するようにハードウェアに組み込まれている固定機能ユニットによって機能を実施する。GPU14のこのような固定機能パイプライン30は、視錐台(viewing frustum)の範囲外にあるクリッピング、テッセレーション段階、テクスチャパイプライン、および明暗を含み得る。
[0041] GPU14上で実行するソフトウェアおよび/またはファームウェアは、シェーダープログラム(または単純にシェーダー)と呼ばれ得、シェーダープログラムは、GPU14のシェーダーコア24上で実行し得る。ただ1つのシェーダーコア24が示されているが、いくつかの例では、GPU14は、シェーダーコア24に類似した2つ以上のシェーダーコアを含み得る。(1つまたは複数の)固定機能パイプライン30は、固定機能ユニットを含む。シェーダーコア24および(1つまたは複数の)固定機能パイプライン30は、互いからデータを送受信し得る。例えば、処理パイプラインは、固定機能パイプライン30の固定機能ユニットからデータを受信し、固定機能パイプライン30の別の固定機能ユニットに処理されたデータを出力する、シェーダーコア24上で実行するシェーダープログラムを含み得る。
[0042] シェーダープログラムは、ユーザーが、いかなる考えられ得る方法でも所望のタスクを実施するようにシェーダープログラムを設計することができるので、機能フレキシビリティをユーザーおよび/または開発者に提供する。しかしながら、固定機能ユニットは、固定機能ユニットがタスクを実施する方法に関しては、ハードウェアに組み込まれている。従って、固定機能ユニットは、あまり多くの機能フレキシビリティを提供しない場合がある。
[0043] シェーダープログラムの例は、頂点シェーダープログラム32、フラグメントシェーダープログラム34、および計算シェーダープログラム36を含む。頂点シェーダープログラム32およびフラグメントシェーダープログラム34は、グラフィック関連のタスクに関わるシェーダープログラムであり得、計算シェーダープログラム36は、非グラフィック関連のタスクに関わるシェーダープログラムであり得る。シェーダープログラムの追加の例、例えば、幾何学シェーダーおよびテッセレーション関連シェーダーがあるが、簡潔にするためにそれらは説明されない。
[0044] プロセッサ12上で実行するグラフィックドライバー40は、アプリケーションプログラミングインタフェース(API)をインプリメントするように構成され得、とはいえ、グラフィックドライバー40は、特定のAPIに従って構成されるように制約される必要はない。このような例では、シェーダープログラム(例えば、頂点シェーダープログラム32、フラグメントシェーダープログラム34、および計算シェーダープログラム36)は、グラフィックドライバー40によってサポートされるAPIに従って構成され得る。デバイス10がモバイルデバイスである例では、グラフィックドライバー40は、OpenGL ES APIに従って構成され得る。OpenGL ES APIは、具体的には、モバイルデバイスのために設計されている。デバイス10が非モバイルデバイスである例では、グラフィックドライバー40は、OpenGL APIに従って構成され得る。他のAPIの例は、マイクロソフトコーポレーションによってAPIのDirectX群を含む。示されてはいないが、システムメモリ16は、プロセッサ12が実行のためにシステムメモリ16から回収するグラフィックドライバー40のためのコードを記憶し得る。グラフィックドライバー40は、この例では、グラフィックドライバー40がハードウェア(例えば、プロセッサ12)上で実行するソフトウェアであることを示すために、破線のボックス中に示されている。
[0045] グラフィックドライバー40は、プロセッサ12とGPU14とが互いに通信することを可能にするように構成され得る。例えば、プロセッサ12がGPU14にグラフィックまたは非グラフィックの処理タスクをオフロードする場合、プロセッサ12は、グラフィックドライバー40を介してGPU14にこのような処理タスクをオフロードする。
[0046] 例として、プロセッサ12は、グラフィックデータを生成するゲームアプリケーションを実行し得、プロセッサ12は、GPU14にこのグラフィックデータの処理をオフロードし得る。この例では、プロセッサ12は、システムメモリ16においてグラフィックデータを記憶し得、グラフィックドライバー40は、いつグラフィックデータを回収するか、どこからシステムメモリ16におけるグラフィックデータを回収するか、および、いつグラフィックデータを処理するか、をGPU14に知らせ得る。また、ゲームアプリケーションは、1つまたは複数のシェーダープログラムを実行することをGPU14に求め得る。例えば、ゲームアプリケーションは、(例えば、図1のディスプレイ18に)表示される画像を生成するために頂点シェーダープログラム32およびフラグメントシェーダープログラム34を実行することをシェーダーコア24に求め得る。グラフィックドライバー40は、シェーダープログラムをいつ実行するかをGPU14に知らせ、シェーダープログラムに必要とされるグラフィックデータをどこで回収するかをGPU14に知らせ得る。この方法で、グラフィックドライバー40は、プロセッサ12とGPU14との間のリンクを形成し得る。
[0047] いくつかの例では、システムメモリ16は、頂点シェーダープログラム32、フラグメントシェーダープログラム34、および計算シェーダープログラム36のうちの1つまたは複数に関わるソースコードを記憶し得る。これらの例では、プロセッサ12において実行するコンパイラ38は、ランタイムの間に(例えば、これらのシェーダープログラムがシェーダーコア24において実行される時間において)GPU14のシェーダーコア24によって実行可能である中間コードまたはオブジェクトを形成するように、これらのシェーダープログラムのソースコードをコンパイルし得る。いくつかの例では、コンパイラ38は、シェーダープログラムを事前にコンパイルし、システムメモリ16においてシェーダープログラムの中間コードまたはオブジェクトを記憶し得る。
[0048] 本開示の技術に従えば、プロセッサ12において作動するコンパイラ38(または、別の例ではグラフィックドライバー40)は、「メイン」シェーダーコンポーネントおよび「プリアンブル」シェーダーコンポーネントを含む複数のコンポーネントにシェーダーを構築し得る。メインシェーダーコンポーネントは、プリアンブルシェーダーコンポーネントを含まないシェーダーコンポーネントの全体または一部分に言及し得る。コンパイラ38は、プロセッサ12上で実行するプログラムからコンパイルするためのコードを受信し得る。コンパイラ38はまた、シェーダーにおける共通の演算およびコンスタントロード命令を識別し、(メインシェーダーコンポーネントではなく)プリアンブルシェーダーコンポーネント内に共通の演算を配置し得る。コンパイラ38は、例えば、共通の命令において定数(すなわち定数値)の排他的な使用によって、これらの共通の命令を識別し得る。コンパイラ38は、命令、例えば、シェーダープリアンブルの開始を示すためにシェーダープリアンブルスタートを、シェーダープリアンブルの終わりを示すためにシェーダープリアンブルエンドを、使用し得る。コンパイラ38は、パーシェーダープリアンブルの開始を示すためにSHPS(シェーダープリアンブルスタート)命令を使用し得る。MAINは、現在のウェーブが第1のウェーブではない場合、SHPS命令が(例えば、コードのメインシェーダーブロックに)分岐し得ることの例示的なラベルである。コンパイラ38は、パーシェーダープリアンブルの終わりを示すためにSHPE(シェーダープリアンブルエンド)命令を使用し得る。
[0049] シェーダーコア24は、並行して同じシェーダープログラムの同じ命令の多くのインスタンスを実行するように構成され得る。例えば、グラフィックドライバー40は、複数の頂点に関わる頂点値を回収するようにGPU14に命令し、頂点の頂点値を処理するために頂点シェーダープログラム32を実行するようにGPU14に命令し得る。この例では、シェーダーコア24は、頂点シェーダープログラム32の複数のインスタンスを実行し、頂点の各々に関わるシェーダーコア24の処理エレメントにおいて頂点シェーダープログラム32の1つのインスタンスを実行することによって、それを行い得る。
[0050] シェーダーコア24におけるシェーダープログラム32、34、または36の実行の第1のウェーブの処理の間に、シェーダーコア24は、シェーダープリアンブルを実行し得る。シェーダープリアンブルの実行において使用されるコンスタント入力は、読取り/書込みコンスタントメモリ44(例えば、コンスタントRAM)、GPR(例えば、GPR26)、またはuGPR(例えば、uGPR27)において記憶され得る。シェーダーコア24のロードユニットは、コンスタントメモリ44に定数をロードし得る。シェーダーコア24のロードユニットに対する命令は、パーシェーダープリアンブルコードブロック内で見つけられ得、GPU14におけるオンチップコンスタントメモリにシステムメモリ16から定数がロードされることを可能にし得る。
[0051] いくつかの例では、シェーダープリアンブルは、シェーダーコア24におけるスカラープロセッサ(例えば、単一の演算論理ユニット(ALU:arithmetic logic unit))によって実行され得る。他の例では、シェーダープリアンブルは、(時としてベクトルプロセッサと呼ばれる)シェーダーコア24の並列処理エレメントによって実行され得る。シェーダープリアンブルの実行は、定数値または値のセットをもたらし得る。定数値プリアンブルの結果は、uGPR27、コンスタントメモリ44(例えば、コンスタントRAM)、GPUメモリ42、またはシステムメモリ16のようなオンチップメモリにおいて記憶され得る。コンスタントメモリ44は、uGPR27またはGPR26において保持される値のような特定のワープまたはスレッドのためにリザーブされる特定の部分のみではなく、シェーダーコア24のすべてのエレメントによってアクセス可能なメモリを含み得る。コンスタントメモリ44はまた、各ワープの前にデータがリロードされる必要があるのではなく、ワープ間でデータを持続的に記憶し得る。シェーダーの実行の次のワープの実行の間に、シェーダープログラム32、34、または36の実行の第1のワープの間に計算された定数値(すなわち、プリアンブル結果)は、冗長コードを実行するのではなく、コンスタントメモリ44から回収され得る。GPU14は、シェーダーの第1のワープのみがシェーダープリアンブルを実行することを確実にし得る。GPU14は、シェーダーの第1のワープのみがオンチップ内部ステートレジスタ、コンスタントメモリ44、またはGPUメモリ42においてフラグを介してシェーダープリアンブルを実行することを確実にし得る。GPU14はまた、第1のワープとしてシェーダープリアンブルの実行を開始したワープを追跡し得る。現在のワープが第1のワープであること(または、別の例では、第1のワープではないこと)を示すフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ44、またはGPUメモリ42において値として、GPU14によって、記憶され得る。GPU14はまた、第1のワープがシェーダープリアンブル命令の実行を完了したか否かを追跡し得る。第1のワープがシェーダープリアンブル命令の実行を完了した(または、別の例では、完了していない)ことを示すフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ44、またはGPUメモリ42において、GPU14よって、記憶され得る。シェーダーコア24は、シェーダープリアンブルを(例えば、これが第1のワープである、および/またはプリアンブルが事前に実行されていない場合、)実行するか、または(例えば、これが第1のワープではない、および/またはプリアンブルが事前に実行されていた場合、)実行しないかを決定するために、これらのフラグを使用することができる。シェーダーコア24はまた、シェーダープリアンブルの実行の完了、およびGPU14によるコンスタントメモリ44、GPUメモリ42、またはuGPR27におけるプリアンブルのコンスタント結果のロードまで、シェーダープログラム32、34、または36のスレッドの第2のワープの実行を延期し得る。
[0052] 一例では、シェーダーコア24の各タイプは、オンチップ内部ステートレジスタにおいて記憶されるコンテキスト(例えば、フラグ)ビットにアクセスすることができる。シェーダーコア24は、現在のワープが第1のワープである/でない、および/または、シェーダーコア24におけるワープがプリアンブルを実行し始めた(または実行し始めていない)ことを示し得る1ビットpreamble_token_takenコンテキストビット(1-bit preamble_token_taken context bit)を有し得る。これらのビットは両方とも、特定のタイプのシェーダー(例えば、シェーダーコア24)がロードされるとき、誤(false)に初期化され得る。例えば、所与のシェーダーコア24またはシェーダータイプにおいてSHPS(例えば、シェーダープリアンブルスタート)命令を実行するための第1のワープは、preamble_token_takenフラグを誤として見つけ得る。シェーダーコア24は、preamble_token_takenフラグを正(true)に設定する。第1のワープがSHPE(例えば、シェーダープリアンブルエンド)命令を実行するとき、シェーダーコア24は、preamble_completedフラグを正に設定する。そしてシェーダーコア24は、メインシェーダー命令ラベルからのコードを実行し続ける。非第1の(non-first)ワープでは、preamble_token_takenフラグは、正に設定され得る。すべての次のワープがメインコードセクション(例えば、MAINラベル)に分岐し、preamble_completedフラグが誤から正に変わるまでそこで待機する。preamble_completedフラグの変化が誤から正に変わるとき、シェーダーコア24は、次のウェーブを実行する。
[0053] 図3は、シェーダープリアンブル39を含む命令37のセットを示す概念図である。この例では、シェーダープリアンブル39は、シェーダープリアンブルスタート命令(SHPS)命令を備える。シェーダープリアンブルスタート命令は、preamble_token_takenフラグが正に設定される場合に(例えば、メインシェーダー命令41において)「Label_MAIN」ラベルに分岐し、シェーダープリアンブルが一度で実行されることを可能にする。命令はまた、preamble_token_takenフラグが誤に設定されるとき、preamble_token_takenフラグを正に設定するようにシェーダーコア24に命令し得る。
[0054] 命令(例えば、ADD z,y,x命令)は、シェーダーコードにおける冗長の命令を示す。命令が実行され得る(例えば、「ADD z,y,x;」は、「x」および「y」において共に値を追加し、「z」において結果の値を記憶する)。冗長の命令の各々は、同様に実行される。冗長の値(redundant value)は、例えばコンスタントメモリ命令への記憶データを介して、コンスタントメモリ44にセーブされ得る(例えば、「STC c[5],z;」は、「z」における値をコンスタントRAMロケーション5に記憶する)。冗長の値はまた、uGPR27またはGPR26に移動され得る。
[0055] 次の例示的な命令は、例えば、ロードコンスタント命令を介して、コンスタントメモリ44にコンスタントバッファから複数の定数をロードし得る(例えば、「LDC c[10], index, CB1, 4;」は、ロケーション10において開始するコンスタントRAMにコンスタントバッファ(CB)1から4の定数をロードする)。シェーダープリアンブル39は、シェーダープリアンブルエンド命令(SHPE)で閉じる。特定のインプリメンテーションでは、シェーダープログラム32、34、または36において単独のシェーダープリアンブルスタートおよびシェーダープリアンブルエンド命令があり得る。シェーダープリアンブル39にはメインシェーダー命令41が後続する。
[0056] シェーダープリアンブル39における命令は、(例えば、このような命令は定数値においてのみ演算するため、)シェーダーのすべてのスレッドに対して同じ結果をもたらす命令を含み、シェーダー実行のワープ間では変化しない。これらの命令は、コンパイラ38によって識別され得る。
[0057] そしてシェーダープリアンブル39は、シェーダープログラム32、34、または36の実行のワープの数に関係なく、一度で実行されるのみである。メインシェーダー命令41は、ワープごとに別個に実行される。シェーダープリアンブル39の実行においてもたらされる結果は、メインシェーダー命令41の実行において使用され、コンスタントメモリ44において記憶され得る。実行時に、シェーダーコア24は、シェーダープリアンブル39が実行されたか否かを決定するために種々のフラグを使用し得るので、コンスタントメモリ44内に記憶されるシェーダープリアンブル39の実行の(1つまたは複数の)結果の場所を決定するだけでなく、2度目にシェーダープリアンブル39のプリアンブルコードを実行する必要がない。種々のフラグは、現在のワープが第1のワープである(または、別の例では、それは第1のワープではない)ことを示すフラグと、第1のワープがシェーダープリアンブル命令の実行を完了した(または、別の例では完了していない)ことを示すフラグとを、含み得る。これらのフラグは、オンチップ内部ステートレジスタ、コンスタントメモリ44、または、GPUメモリ42において、GPU14によって、記憶され得る。
[0058] シェーダープリアンブル39は、メインシェーダー命令41の前のシェーダーコード37の開始であるように示されているが、シェーダープリアンブル39は、シェーダープリアンブルスタート命令(例えば、SHPS)およびシェーダープリアンブルエンド命令(SHPE)によってのみ範囲を定めるように、シェーダーコア37内に散在し得る。さらに、シェーダープリアンブルは、制御フロー内にあり得る。シェーダープリアンブルが制御フロー内にある場合、プリアンブルを実行するためのウェーブは、シェーダーの第1のウェーブではない場合がある。
[0059] 図4は、GPUのシェーダーコアのGPRにおけるデータ記憶の例を示す概念図である。例として、GPU14は、シェーダーコア24を含み、シェーダーコア24は、GPR26を含む。例として、シェーダーコア24は、32の処理エレメントを含み得、各々は、1つのグラフィックアイテムを処理するためにシェーダープログラムの1つのインスタンスを実行し得る。GPR26は、グラフィックアイテムに関わるデータを記憶し得る。例えば、GPR26は、32のグラフィックアイテムに関わる9個の属性についての属性データを記憶し得る。しかしながら、GPR26は、32のグラフィックアイテムに関わるおよそ9個の属性についてのデータを記憶し得る。また、GPR26は、グラフィックアイテムの属性に関連しないデータを記憶し得るが、そのデータは、グラフィックアイテムを処理するために必要な変数に関わるデータである。
[0060] 図4に示される例では、グラフィックアイテムは、P0−P31と識別され、それは、頂点であり得る。属性は、グラフィックアイテム識別子に続いて変数によって識別される。例えば、P0.Xは、P0グラフィックアイテムに関わるx座標に言及し、P0.Yは、P0グラフィックアイテムに関わるy座標に言及する、など。P0.R、P0.G、P0.BおよびP0.Aは、それぞれ、P0グラフィックアイテムの赤コンポーネント、緑コンポーネント、青コンポーネント、および不透明性に言及する。他のグラフィックアイテム(例えば、P1−P31)は、同様に識別される。
[0061] 言い換えると、図4では、頂点P0−P31は、複数の変数に各々関連する。一例では、頂点P0−P31の各々は、x座標(P0.X乃至P31.X)を識別する変数に関連する。頂点P0−P31の各々は、y座標(P0.Y乃至P31Y)を識別する変数に関連する、など。これらの変数の各1つは、複数のグラフィックアイテムの各々を処理するために必要とされる。例えば、x座標を識別する変数は、頂点P0−P31の各々を処理するために必要とされる。
[0062] 図4にも示されているように、グラフィックアイテムの各々はまた、PRJ属性を含む。PRJ属性は、シェーダーコア24の処理エレメントを実行する頂点シェーダーが利用し得るプロジェクション行列である。この例では、PRJ属性は、頂点P0−P31の各々を処理するために必要とされる別の変数である。例えば、頂点シェーダーは、プロジェクション行列にそれぞれの座標を乗じ(例えば、P0.PRJにP0.X、P0.Y、P0.ZおよびP0.Wを乗じ)得る。
[0063] GPU14がデータ(例えば値)を記憶し得るさまざまなユニットがあり得ることが、理解されるべきである。GPU14は、システムメモリ16においてデータを記憶し得、または、ローカルメモリ(例えば、キャッシュ)においてデータを記憶し得る。シェーダーコア24のGPR26は、GPU14のローカルメモリおよびシステムメモリ16のどちらとも異なる。例えば、システムメモリ16は、デバイス10のさまざまなコンポーネントによってアクセス可能であり、これらのコンポーネントは、データを記憶するためにシステムメモリ16を使用する。GPU14のローカルメモリは、GPU14のさまざまなコンポーネントによってアクセス可能であり、これらのコンポーネントは、データを記憶するためにGPU14のローカルメモリを使用する。しかしながら、GPR26は、シェーダーコア24のコンポーネントによってのみアクセス可能であり得、シェーダーコア24の処理エレメントに関わるデータのみ記憶し得る。
[0064] いくつかの例では、グラフィックワープにおけるグラフィックアイテムの1つまたは複数の変数は、グラフィックワープにわたって均一である。このような例では、GPR26における各スレッド/ファイバーに関わる別個のエントリーにおいて1つまたは複数の変数に関わる均一のデータを記憶するのではなく、GPU14は、コンスタントメモリ44におけるまたはワープ/ウェーブにおけるすべてのスレッド/ファイバーによってアクセス可能であるuGPR27において、一度で均一のデータを記憶し得る。
[0065] 一例では、uGPR27は、複数の記憶ロケーションを含み得、ここにおいて各記憶ロケーションは、グラフィックアイテムの複数の属性の1つの属性に関連する。例えば、図4に示されるように、各グラフィックアイテムP0−P31は、9個の属性(PRJ、x、y、z、w、R、G、B、およびA)を含む。この例では、uGPR27は、9個の記憶ロケーションを含み得、ここにおいてuGPR27の第1のロケーションは、PRJ属性に関連し、uGPR27の第2のロケーションは、x座標に関連する、など。さらに、uGPR27におけるデータは、ワープの各スレッドによって使用され得る。
[0066] 定数は、システムメモリにおけるコンスタントバッファにおいて記憶され得る。コンスタントロード命令は、システムメモリからコンスタントメモリ44に定数をロードすることをコンパイラに可能にするために使用され得る。定数はまた、コンスタントメモリ44が満杯である場合、GPR26およびuGPR27において記憶され得る。
[0067] 慣例として、データはワープ間にセーブされない場合がある。いくつかの例では、GPR26およびuGPR27は、ウェーブごとにリロードまたは再計算される。コンスタントメモリ44は、ワープ間にセーブされ得る。しかしながら、シェーダーコア24は、プリアンブル命令にアクセスし、第1のワープの間にそれらを実行し得る。命令が実行された後、次のワープが、コンスタントメモリ44におけるこれらの命令の結果にアクセスし得る。
[0068] 図5は、本開示の均一なプレディケート(uniform predicate)に関わる技術をインプリメントするために使用され得るGPU14の例としての構成を示すブロック図である。GPU14は、並行してプログラムに関わる命令を実行するように構成されている。GPU14は、制御ユニット72、処理エレメント74A−74D(総じて「処理エレメント74」)、命令ストア76、GPR26、コンスタントメモリ44、uGPR27、ステートレジスタ92、通信パス80、82、84、86A−86D、およびロードユニット90を含むシェーダーコア24を含む。通信パス86A−86Dは、「通信パス86」と総称され得る。いくつかの例では、GPU14は、処理エレメント74を使用してプログラム(例えばシェーダー)のワープに関わる実行の複数のスレッドを実行するように構成されたシングルインストラクションマルチプルデータ(SIMD)処理システムとして構成され得る。このようなSIMDシステムにおいて、処理エレメント74は一緒に、異なるデータアイテムに対して一度に単一の命令を処理し得る。プログラムは、プログラムに関連するスレッドのすべてが実行を完了した後にリタイアする。
[0069] 制御ユニット72は、通信パス80を介して命令ストア76に、通信パス82を介して処理エレメント74に、通信パス84を介してGPR26に、通信可能に結合される。制御ユニット72は、命令ストア76に読取り命令を送るために、通信パス80を使用し得る。読取り命令は、命令が回収されるべき命令ストア76における命令アドレスを特定し得る。制御ユニット72は、読取り命令を送るのに応答して、命令ストア76から1つまたは複数のプログラム命令を受信し得る。制御ユニット72は、命令ストア76からメインシェーダー命令41およびシェーダープリアンブル39を読取り得る。制御ユニット72は、(オンチップステートレジスタ92、uGPR27、またはGPR26において記憶されるフラグを介して)プリアンブルが事前に実行されているか否かを決定し得る。制御ユニットは、(オンチップステートレジスタ92、uGPR27、またはGPR26において記憶されるフラグを介して)現在のワープが第1のワープであるか否かを決定し得る。制御ユニット72はまた、基本的な状態が変化する(例えば、プリアンブルが実行された、および/または、現在のワープが第1のワープではない)とき、先行のフラグを変化させ得る。制御ユニット72による先行のフラグの使用は、プリアンブルコードが一度のみで実行されること、および次の(例えば第2の、第3の、などの)ワープはプリアンブルが実行を完了する前に開始しないことを、確実にし得る。制御ユニット72は、処理エレメント74に命令を提供するために、およびいくつかの例では、処理エレメント74からデータ、例えば、分岐条件を評価するための比較命令の結果、を受信するために、通信パス82を使用し得る。いくつかの例では、制御ユニット72は、ステートレジスタ92、uGPR27、GPR26、またはコンスタントメモリ44からデータアイテム値を回収するために、例えば、分岐条件を決定するために、通信パス84を使用し得る。図5は、他の例では通信パス84を含むようにGPU14を示しているが、GPU14は、通信パス84を含まない場合もある。
[0070] 定数値は、最初は、システムメモリ16におけるコンスタントバッファにおいて記憶され得る。ロードユニット90は、制御ユニット72、コンパイラ38、および/またはグラフィックドライバー40からの命令を介して、システムメモリ16におけるコンスタントバッファから定数値を、コンスタントメモリ44、uGPR27、またはGPR26にロードし得る。ロードユニット90は、コンスタントメモリ44においてアロケートされるスペースが満杯である場合、uGPR27において定数をロードするように構成され得る。
[0071] 処理エレメント74の各々は、命令ストア76において記憶されるプログラムに関わる命令を処理するように構成され得る。いくつかの例では、処理エレメント74の各々は、演算の同じセットを実施するように構成され得る。例えば、処理エレメント74の各々は、同じ命令セットアーキテクチャ(ISA)をインプリメントし得る。追加の例では、処理エレメント74の各々は、演算論理ユニット(ALU)であり得る。さらなる例では、GPU14は、ベクトルプロセッサとして構成され得、処理エレメント74の各々は、ベクトルプロセッサ内の処理エレメントであり得る。追加の例では、GPU14は、SIMD実行ユニットであり得、処理エレメント74の各々は、SIMD実行ユニット内のSIMD処理エレメントであり得る。
[0072] 処理エレメント74によって実施される演算は、算術演算、論理演算、比較演算、などを含み得る。算術演算は、例えば、加法演算、減法演算、乗法演算などの演算を含み得る。算術演算はまた、例えば、整数演算、および/または浮動小数点演算を含み得る。論理演算は、例えば、ビット単位のAND演算、ビット単位のOR演算、ビット単位のXOR演算、などの演算を含み得る。比較演算は、例えば、greater than演算、less than演算、equal to zero演算、not equal to zero演算などの演算を含み得る。greater than演算、およびless than演算は、第1のデータアイテムが第2のデータアイテムより大きいか小さいかを決定し得る。equal to zero演算およびnot equal to zero演算は、データアイテムがゼロに等しいかゼロと等しくないかを決定し得る。演算のために使用される演算数は、GPR26またはuGPR27において内包されるレジスタにおいて記憶され得る。
[0073] 処理エレメント74の各々は、通信パス82を介して制御ユニット72から命令を受信することに応答して、演算を実施するように構成され得る。いくつかの例では、処理エレメント74の各々は、他の処理エレメント74から独立して活性化および/または不活性化されるように構成され得る。このような例では、処理エレメント74の各々は、それぞれの処理エレメント74A−74Dが活性化されるとき、制御ユニット72から命令を受信することに応答して演算を実施するように構成され得、それぞれの処理エレメント74A−74Dが不活性化されるとき、すなわち、活性化されないとき、制御ユニット72から命令を受信することに応答して演算を実施しないように構成され得る。
[0074] 処理エレメント74A−74Dの各々は、それぞれの通信パス84A−86Dを介してGPR26に通信可能に結合され得る。処理エレメント74は、GPR26、uGPR27、および/またはコンスタントメモリ44からデータを回収し、通信パス86、uGPR27、および/またはコンスタントメモリ44を介してGPR26にデータを記憶するように構成され得る。GPR26、uGPR27、および/またはコンスタントメモリ44から回収されるデータは、いくつかの例では、処理エレメント74によって実施される演算に関わる演算数であり得る。GPR26、uGPR27、および/またはコンスタントメモリ44において記憶されるデータは、いくつかの例では、処理エレメント74によって実施される演算の結果であり得る。
[0075] 命令ストア76は、GPU14による実行のためのプログラムを記憶するように構成されている。プログラムは、一連の命令として記憶され得る。これらの命令は、シェーダープリアンブル39およびメインシェーダー命令41を含み得る。いくつかの例では、各命令は、均一命令アドレス値によってアドレスを指定され得る。このような例では、一連の命令における後の命令に関わる命令アドレス値は、一連の命令における先の命令に関わる命令アドレス値より大きい。プログラム命令は、いくつかの例では、マシンレベル命令であり得る。かくして、このような例では、命令は、GPU14のISAに対応するフォーマットであり得る。命令ストア76は、通信パス80を介して制御ユニット72から読取り命令を受信するように構成されている。読取り命令は、命令が回収されるべき命令アドレスを特定し得る。読取り命令を受信するのに応答して、命令ストア76は、通信パス80を介して制御ユニット72に、読取り命令において特定された命令アドレスに対応する命令を提供し得る。
[0076] 命令ストア76は、任意のタイプのメモリ、キャッシュ、またはそれらの組み合わせであり得る。命令ストア76がキャッシュである場合、命令ストア76は、GPU14の外部にあるプログラムメモリにおいて記憶されるプログラムをキャッシュに格納し得る。命令ストア76は、GPU14内にあるように示されているが、他の例では、命令ストア76は、GPU14の外部にあり得る。
[0077] GPR26は、処理エレメント74によって使用されるデータアイテムを記憶するように構成されている。いくつかの例では、GPR26は、複数のレジスタを備え得、各レジスタは、GPU14上で演算される複数のデータアイテム内にそれぞれのデータアイテムを記憶するように構成されている。GPR26は、GPR26におけるレジスタとメモリまたはキャッシュ(図示されていない)との間でデータを転送するように構成されている1つまたは複数の通信パス(図示されていない)に結合され得る。
[0078] uGPR27は、処理エレメント74によって使用されるデータアイテムを記憶するように構成されており、uGPR27内の各メモリエレメントは、ウェーブ/ワープの複数の処理エレメント(例えば、スレッド/ファイバー)によってアクセス可能であるように構成されている。
[0079] ステートレジスタ92、uGPR27、またはGPR26は、制御ユニット72によって使用される複数のフラグを記憶し得る。ステートレジスタ92、uGPR27、またはGPR26において記憶されたフラグは、プリアンブルが事前に実行されていることを示すためにフラグを含み得る。このフラグは、制御ユニット72が、シェーダープリアンブル39が完全に実行された後に開始するようにワープにおけるスレッドの処理の時間を決めることを可能にし得、実行の結果は、コンスタントメモリ44、uGPR27、および/またはGPR26において記憶される。プリアンブルが事前に実行されていることを示すフラグは、最初に、ステートレジスタ92、uGPR27、またはGPR26において「off」に設定され得る。ステートレジスタ92、uGPR27またはGPR26はまた、現在のワープが第1のワープであることを示すためにフラグを含み得る。現在のワープが第1のワープであることを示すフラグは、最初に「on」に設定され得る。
[0080] 図5は、処理エレメント74によって使用されるデータを記憶するための単一のGPR26を示しているが、他の例では、GPU14は、処理エレメント74の各々に対して専用の、別個のデータストアを含み得る。GPU14は、例の目的のために、4つの処理エレメント74を示している。他の例では、GPU14は、同じまたは異なる構成でさらに多くの処理エレメントを有し得る。
[0081] 制御ユニット72は、命令ストア76において記憶されるプログラムに関わる命令を実行するためにGPU14を制御するように構成されている。プログラムの命令のセットまたは各命令に関して、制御ユニット72は、通信パス80を介して命令ストア76から命令を回収し、命令を処理し得る。いくつかの例では、制御ユニット72は、命令に関連する演算を処理エレメント74の1つまたは複数上で実行させることによって、命令を処理し得る。例えば、制御ユニット72によって回収される命令は、命令によって特定されるデータアイテムに関して算術演算を実施するようにGPU14に命令する算術命令であり得、制御ユニット72は、処理エレメント74のうちの1つまたは複数に、特定されるデータアイテムにおいて算術演算を実施させ得る。さらなる例では、制御ユニット72は、演算を処理エレメント74において実施させることなく、命令を処理し得る。
[0082] 制御ユニット72は、通信パス82を介して処理エレメント74に命令を提供することによって、演算を処理エレメント74の1つまたは複数において実施させ得る。命令は、処理エレメント74によって実施される演算を特定し得る。処理エレメント74の1つまたは複数に提供される命令は、命令ストア76から回収される命令と同じ、または異なり得る。いくつかの例では、制御ユニット72は、演算が実施されるべき処理エレメント74の特定のサブセットを活性化することと、演算が実施されるべきでない処理エレメント74の別のサブセットを不活性化することとの一方または両方によって、(単独の処理エレメントを含む)処理エレメント74の特定のサブセットにおいて演算を実施させ得る。制御ユニット72は、通信パス82を介して処理エレメント74の各々に活性化信号および/または不活性化信号をそれぞれ提供することによって処理エレメント74を活性化および/または不活性化し得る。いくつかの例では、制御ユニット72は、処理エレメント74に命令を提供することと同時に、処理エレメント74に活性化および/または不活性化信号を提供することによって処理エレメント74を活性化および/または不活性化し得る。さらなる例では、制御ユニット72は、処理エレメント74に命令を提供する前に処理エレメント74を活性化および/または不活性化し得る。制御ユニット72は、処理エレメント74を使用してプログラムに関わる実行の複数のスレッドを実行し得る。並行して実行される複数のスレッドは、時としてワープと呼ばれる。処理エレメント74の各々は、複数のスレッドのそれぞれのスレッドに関わるプログラムの命令を処理するように構成され得る。例えば、制御ユニット72は、処理のための処理エレメント74のうちの個々の1つに実行の各スレッドを割り当て得る。プログラムに関わる実行のスレッドは、データアイテムのセットにおける異なるデータアイテムに対して命令の同じセットを実行し得る。例えば、処理エレメント74Aは、複数のデータアイテムにおけるデータアイテムの第1のサブセットに対して命令ストア76において記憶されるプログラムに関わる実行の第1のスレッドを実行し得、処理エレメント74Bは、複数のデータアイテムにおけるデータアイテムの第2のサブセットに対して命令ストア76において記憶されるプログラムに関わる実行の第2のスレッドを実行し得る。実行の第1のスレッドは、実行の第2のスレッドと同じ命令を含み得るが、データアイテムの第1のサブセットは、データアイテムの第2のサブセットとは異なり得る。処理エレメント74は、メインシェーダー命令41を実行し得る。処理エレメント74は、シェーダープリアンブル39を実行し得る。別の例では、シェーダーコア24は、シェーダープリアンブル39の命令を実行するために、通信パス88を介して、別個のスカラー処理ユニット94を使用し得る。
[0083] スカラー処理ユニット94は、一度に1つのデータアイテムにおいて演算するように構成される任意のタイプのプロセッサであり得る。処理エレメント74と同様に、スカラー処理ユニット94は、ALUを含み得る。スカラー処理ユニット94によって実施される演算は、算術演算、論理演算、比較演算、などを含み得る。算術演算は、例えば、加法演算、減法演算、乗法演算、除法演算などの演算を含み得る。算術演算はまた、例えば、整数演算、および/または浮動小数点演算を含み得る。論理演算は、例えば、ビット単位のAND演算、ビット単位のOR演算、ビット単位のXOR演算、などの演算を含み得る。比較演算は、例えば、greater than演算、less than演算、equal to zero演算、not equal to zero演算などの演算を含み得る。greater than演算、およびless than演算は、第1のデータアイテムが第2のデータアイテムより大きいか小さいかを決定し得る。equal to zero演算およびnot equal to zero演算は、データアイテムがゼロに等しいかゼロに等しくないかを決定し得る。演算のために使用される演算数は、GPR26において内包されるレジスタにおいて記憶され得る。
[0084] プリアンブル命令の結果を参照するシェーダー命令が実行されるとき、(コンスタント)結果が、再度シェーダープリアンブル命令を実行する代わりにGPR26から回収される。
[0085] 図6は、本開示の技術に従った例としての方法を示すフローチャートである。
図6の技術は、GPU14および/またはプロセッサ12のうちの1つまたは複数によってインプリメントされ得る(図1および図2参照)。
[0086] 本開示の一例では、GPU14は、プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラ38から受信する(100)ように構成され得る。プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、1つまたは複数の結果は、シェーダープログラムを実行する(例えばウェーブ/ワープのような)スレッドの複数のグループの各々に対して同じ1つまたは複数の結果であり得る。GPU14は、1つまたは複数の結果をもたらすためにプリアンブルコードブロックを実行する(102)ようにさらに構成され得る。プリアンブルコードブロックは、GPU14においてスカラー処理ユニット94によって実行され得る。プリアンブルコードブロックは、定数値の値を求め得る。
[0087] GPU14はさらに、プリアンブルコードブロックの1つまたは複数の結果を記憶する(104)ように構成され得る。結果は、オンチップランダムアクセスメモリ(RAM)において記憶され得る。オンチップRAMは、スレッドの複数のグループの各々によってアクセス可能であり得、シェーダーコア24のすべての処理エレメントによってアクセス可能であり得る。オンチップRAMは、メインバスにアクセスすることなくGPU14によってアクセス可能であり得る。オンチップRAMは、書込み可能バッファ管理キャッシュ(writeable buffer managed cache)を含み得る。GPU14がシェーダーのスレッドの複数のグループに共通する命令のコードブロックの結果を記憶することを完了したとの決定において、GPU14は、プリアンブルコードブロックを実行することによってもたらされる1つまたは複数の結果を使用してスレッドの複数のグループのうちスレッドの1つのグループのスレッドごとにメインシェーダーコードブロックを実行する(106)ように構成され得る。本開示の一例では、GPU14は、シェーダープリアンブルスタート命令を識別することに基づいてプリアンブルコードブロックを識別するように構成され得る。
[0088] 本開示のさらなる例では、GPU14は、プリアンブルコードブロックが、スレッドの第1のグループによって実行されているか否かを追跡し、シェーダーがスレッドの複数のグループのうちスレッドの次のグループを実行することを可能にするように、構成され得る。GPU14はまた、プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの第1のグループの前にスレッドの複数のグループのスレッドの任意のグループが実行されているか否かを追跡するように、構成され得る。GPU14はまた、プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、プリアンブルコードブロックが実行されているか否かを、追跡するように構成され得る。本開示のさらなる例では、GPU14は、オンチップコンスタントメモリに、システムRAM(例えば、非オンチップRAM)において位置を特定されるコンスタントバッファからプリアンブルコードブロックの1つまたは複数の結果をロードするように構成され得る。
[0089] プロセッサ12において作動するシェーダーコンパイラ(例えば、コンパイラ38)は、シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である1つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別し得る。プロセッサ12において作動するシェーダーコンパイラ(例えば、コンパイラ38)はまた、シェーダープログラムのプリアンブルコードブロックに命令のコードブロックをグループ化し得る。このようなグループ化は、GPU14によって使用され得る。シェーダー命令のスレッドの複数のグループに共通する命令のコードブロックの識別は、定数の値を求める命令の識別を含み得る。識別可能なコードブロックは、プリアンブルコードに体系化され得る。プリアンブルコードは、スレッドの複数のグループのうちスレッドの第1のグループによって実行されるように構成され得る。実行されるプリアンブルコードの1つまたは複数の結果は、スレッドの複数のグループの他のグループによって使用可能であり得る。
[0090] 図7は、本開示の技術に従った例としての方法を示すフローチャートである。図7の技術は、GPU14および/またはプロセッサ12のうちの1つまたは複数によってインプリメントされ得る(図1および図2参照)。
[0091] プロセッサ12において実行するコンパイラ38は、シェーダーコードを受信し得る(200)。プロセッサ12上で実行するコンパイラ38は、定数の値を求める命令を識別し得る(202)。プロセッサ12上で実行するコンパイラ38は、シェーダープリアンブルに命令をグループ化し得る(204)。シェーダープリアンブルは、シェーダープリアンブルスタートおよびシェーダープリアンブルエンドコマンドによって範囲を指定され得る。プロセッサ12上で実行するコンパイラ38は、オブジェクトコードにシェーダーコードにおける命令を転換し得る(206)。このようなオブジェクトコードは、GPU14において作動するように構成される。プロセッサ12上で実行するコンパイラ38は、シェーダーコア24上での実行のためにGPU14にオブジェクトコードを送り得る。
[0092] 1つまたは複数の例では、説明された機能は、ハードウェア、ソフトウェア、ファームウェア、またはこれらの任意の組み合わせでインプリメントされ得る。ソフトウェアでインプリメントされる場合、それら機能は、コンピュータ可読媒体上で1つまたは複数の命令またはコードとして記憶または送信され、ハードウェアベースの処理ユニットによって実行され得る。コンピュータ可読媒体は、データ記憶媒体のような有形の媒体に対応する、コンピュータ可読記憶媒体を含み得る。このように、コンピュータ可読媒体は一般的に、非一時的である有形のコンピュータ可読記憶媒体に対応し得る。データ記憶媒体は、本開示に説明された技法のインプリメンテーションのための命令、コード、および/またはデータ構造を取り出すために、1つまたは複数のコンピュータまたは1つまたは複数のプロセッサによってアクセスされることができる任意の利用可能な媒体であり得る。コンピュータプログラム製品は、コンピュータ可読媒体を含み得る。
[0093] 限定ではなく例として、このようなコンピュータ可読記憶媒体は、RAM、ROM、EEPROM、CD−ROMまたはその他の光ディスク記憶装置、磁気ディスク記憶装置、またはその他の磁気記憶デバイス、フラッシュメモリ、あるいは、データ構造または命令の形式で所望のプログラムコードを記憶するために使用可能であり、かつコンピュータによってアクセスされることができるその他任意の媒体を備えることができる。コンピュータ可読記憶媒体およびデータ記憶媒体は、搬送波、信号、または他の一時的な媒体を含まないが、代わりとして非一時的な有形の記憶媒体を対象にすることが理解されるべきである。ディスク(disk)およびディスク(disc)は、本書で使用される場合、コンパクトディスク(CD)(disc)、レーザーディスク(登録商標)(disc)、光ディスク(disc)、デジタル多用途ディスク(DVD)(disc)、フロッピー(登録商標)ディスク(disk)およびBlu−ray(登録商標)ディスク(disc)を含み、ここでは、ディスク(disk)は通常、磁気的にデータを再生し、その一方でディスク(disc)は、レーザーを用いて光学的にデータを再生する。上記の組み合わせもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
[0094] 命令は、1つまたは複数のデジタルシグナルプロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブル論理アレイ(FPGA)、または他の同等な集積または離散論理回路などの、1つまたは複数のプロセッサによって実行され得る。従って、本書で使用されるような「プロセッサ」という用語は、前述の構造、または本書に説明されている技法のインプリメンテーションに適したあらゆる他の構造のいずれかに言及し得る。これに加えて、いくつかの態様では、本書に説明された機能は、符号化および復号のために構成された専用のハードウェアモジュールおよび/またはソフトウェアモジュール内で提供され得、または、組み合わされたコーデックに組み込まれ得る。また、これら技法は、1つまたは複数の回路または論理要素において完全にインプリメントされ得る。
[0095] 本開示の技法は、無線ハンドセット、集積回路(IC)またはICのセット(例えば、チップセット)を含む、幅広い様々なデバイスまたは装置でインプリメントされ得る。様々なコンポーネント、モジュール、またはユニットは、本開示において、開示された技法を実行するように構成されたデバイスの機能的な態様を強調するために説明されているが、それらは、異なるハードウェアユニットによる実現を必ずしも必要とするわけではない。むしろ、上述されたように、様々なユニットは、コーデックハードウェアユニットにおいて組み合わされ得るか、または適切なソフトウェアおよび/またはファームウェアと併せて、上述のような1つまたは複数のプロセッサを含む、相互運用ハードウェアユニットの集合によって提供され得る。
[0096] 様々な例が説明された。これらの例および他の例は、以下の特許請求の範囲の範囲内にある。

Claims (30)

  1. グラフィック処理ユニット(GPU)を動作する方法であって、
    プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから前記GPUによって、受信することと、前記プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、前記1つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、
    前記1つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第1のグループにおいて、前記GPUによって、実行することと、
    前記プリアンブルコードブロックの前記1つまたは複数の結果を、前記GPUによって、記憶することと、前記プリアンブルコードブロックの前記1つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
    前記プリアンブルコードブロックの前記1つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記1つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの1つのグループのスレッドごとに前記メインシェーダーコードブロックを、前記GPUによって、実行することと、を備える、方法。
  2. 前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ1つまたは複数の結果である前記1つまたは複数の結果をもたらすように実行可能である命令のコードブロックを、プロセッサで作動する前記シェーダーコンパイラによって、識別することと、
    前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックを、前記プロセッサで作動する前記シェーダーコンパイラによって、グループ化することと、をさらに備える、請求項1に記載の方法。
  3. 命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、請求項2に記載の方法。
  4. シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別することをさらに備える、請求項1に記載の方法。
  5. 前記プリアンブルコードブロックが、スレッドの前記第1のグループによって実行されているか否かを追跡し、前記GPUがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にすることを、さらに備える、請求項1に記載の方法。
  6. 前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第1のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡することを、さらに備える、請求項1に記載の方法。
  7. 前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡することをさらに備える、請求項1に記載の方法。
  8. 前記プリアンブルコードブロックの前記実行は、前記GPUにスカラープロセッサによって実行される、請求項1に記載の方法。
  9. 前記1つまたは複数の結果の前記記憶は、書き込み可能バッファ管理キャッシュにおける、請求項1に記載の方法。
  10. 前記1つまたは複数の結果の前記記憶は、シェーダープロセッサのすべての処理エレメントによってアクセス可能である、請求項1に記載の方法。
  11. 前記プリアンブルコードブロックは、1つまたは複数のコンスタント結果の値を求める、請求項1に記載の方法。
  12. コンスタントメモリにランダムアクセスメモリ(RAM)から前記プリアンブルコードブロックの前記1つまたは複数の結果を、前記GPUによって、ロードすること、をさらに備える、請求項1に記載の方法。
  13. データを処理するための装置であって、前記装置は、
    グラフィック処理ユニット(GPU)と、前記GPUは、メモリおよびシェーダーコアを備え、前記シェーダーコアは、制御ユニット、複数の処理エレメント、およびコンスタントメモリを備え、ここにおいて、前記制御ユニットは、
    プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから受信することと、前記プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、前記1つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、
    前記1つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第1のグループ上で、実行するように前記複数の処理エレメントの少なくとも1つを、指示することと、
    前記コンスタントメモリにおいて前記プリアンブルコードブロックの前記1つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記1つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
    前記プリアンブルコードブロックの前記1つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記1つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの1つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するように前記複数の処理エレメントの少なくとも1つを指示することと、を行うように構成されている、装置。
  14. プロセッサをさらに備え、前記プロセッサは、
    前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ1つまたは複数の結果である前記1つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別することと、
    前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化することと、を行うように構成されている、請求項13に記載の装置。
  15. 命令の前記コードブロックの前記識別は、定数の値を求める命令の識別を備える、請求項14に記載の装置。
  16. 前記制御ユニットは、
    シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するようにさらに構成されている、請求項13に記載の装置。
  17. 前記制御ユニットは、
    前記プリアンブルコードブロックが、スレッドの前記第1のグループによって実行されているか否かを追跡し、前記GPUがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするように、さらに構成されている、請求項13に記載の装置。
  18. 前記制御ユニットは、
    前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第1のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するように、さらに構成されている、請求項13に記載の装置。
  19. 前記制御ユニットは、
    前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを、追跡するようにさらに構成されている、請求項13に記載の装置。
  20. 前記プリアンブルコードブロックの前記実行は、前記複数の処理エレメントのスカラープロセッサによって実行される、請求項13に記載の装置。
  21. 記憶された前記1つまたは複数の結果は、前記シェーダーコアのすべての処理エレメントによってアクセス可能である、請求項13に記載の装置。
  22. グラフィック処理ユニット(GPU)を動作するように構成されている装置であって、前記装置は、
    プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信するための手段と、前記プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、前記1つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、
    前記1つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第1のグループにおいて、実行するための手段と、
    前記プリアンブルコードブロックの前記1つまたは複数の結果を記憶するための手段と、前記プリアンブルコードブロックの前記1つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
    前記プリアンブルコードブロックの前記1つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記1つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの1つのグループのスレッドごとに前記メインシェーダーコードブロックを実行するための手段と、を備える、装置。
  23. 前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して前記同じ1つまたは複数の結果である前記1つまたは複数の結果をもたらすように実行可能である命令のコードブロックを識別するための手段と、
    前記シェーダープログラムの前記プリアンブルコードブロックに命令の前記コードブロックをグループ化するための手段と、をさらに備える、請求項22に記載の装置。
  24. シェーダープリアンブルスタート命令を識別することに基づいて前記プリアンブルコードブロックを識別するための手段をさらに備える、請求項22に記載の装置。
  25. 前記プリアンブルコードブロックが、スレッドの前記第1のグループによって実行されているか否かを追跡し、前記GPUがスレッドの前記複数のグループのうちスレッドの次のグループを実行することを可能にするための手段をさらに備える、請求項22に記載の装置。
  26. 前記プリアンブルコードブロックが事前に実行されているか否かを、少なくとも部分的に、決定するために、スレッドの前記第1のグループの前にスレッドの前記複数のグループのスレッドの任意のグループが実行されているか否かを追跡するための手段をさらに備える、請求項22に記載の装置。
  27. 前記プリアンブルコードブロックを実行するか否かを、少なくとも部分的に、決定するために、前記プリアンブルコードブロックが実行されているか否かを追跡するための手段をさらに備える、請求項22に記載の装置。
  28. 前記プリアンブルコードブロックは、1つまたは複数のコンスタント結果の値を求める、請求項22に記載の装置。
  29. コンスタントメモリにランダムアクセスメモリ(RAM)から前記プリアンブルコードブロックの前記1つまたは複数の結果をロードするための手段をさらに備える、請求項22に記載の装置。
  30. 記憶された命令を含む非一時的なコンピュータ可読記憶媒体であって、前記命令は、実行されたときに、少なくとも1つのプロセッサに、
    プリアンブルコードブロックおよびメインシェーダーコードブロックを備えるシェーダープログラムを、シェーダーコンパイラから、受信することと、前記プリアンブルコードブロックは、1つまたは複数の結果をもたらすように実行可能であり、前記1つまたは複数の結果は、前記シェーダープログラムを実行するスレッドの複数のグループの各々に対して同じ1つまたは複数の結果である、
    前記1つまたは複数の結果をもたらすために前記プリアンブルコードブロックを、スレッドの前記複数のグループのうちスレッドの第1のグループにおいて、実行することと、
    コンスタントメモリにおいて前記プリアンブルコードブロックの前記1つまたは複数の結果を記憶することと、前記プリアンブルコードブロックの前記1つまたは複数の結果は、スレッドの前記複数のグループの各々によってアクセス可能である、
    前記プリアンブルコードブロックの前記1つまたは複数の結果のすべてを記憶することが完了したとの決定において、前記プリアンブルコードブロックを実行することによってもたらされる前記1つまたは複数の結果を使用してスレッドの前記複数のグループのうちスレッドの1つのグループのスレッドごとに前記メインシェーダーコードブロックを実行することと、を行わせる、非一時的コンピュータ可読記憶媒体。
JP2018561212A 2016-05-23 2017-04-10 グラフィック処理のためのパーシェーダープリアンブル Active JP6911055B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/162,272 2016-05-23
US15/162,272 US9799089B1 (en) 2016-05-23 2016-05-23 Per-shader preamble for graphics processing
PCT/US2017/026835 WO2017204909A1 (en) 2016-05-23 2017-04-10 Per-shader preamble for graphics processing

Related Child Applications (1)

Application Number Title Priority Date Filing Date
JP2019179317A Division JP6848028B2 (ja) 2016-05-23 2019-09-30 グラフィック処理のためのパーシェーダープリアンブル

Publications (2)

Publication Number Publication Date
JP2019517078A true JP2019517078A (ja) 2019-06-20
JP6911055B2 JP6911055B2 (ja) 2021-07-28

Family

ID=58664778

Family Applications (2)

Application Number Title Priority Date Filing Date
JP2018561212A Active JP6911055B2 (ja) 2016-05-23 2017-04-10 グラフィック処理のためのパーシェーダープリアンブル
JP2019179317A Active JP6848028B2 (ja) 2016-05-23 2019-09-30 グラフィック処理のためのパーシェーダープリアンブル

Family Applications After (1)

Application Number Title Priority Date Filing Date
JP2019179317A Active JP6848028B2 (ja) 2016-05-23 2019-09-30 グラフィック処理のためのパーシェーダープリアンブル

Country Status (9)

Country Link
US (1) US9799089B1 (ja)
EP (1) EP3465606A1 (ja)
JP (2) JP6911055B2 (ja)
KR (1) KR101973924B1 (ja)
CN (1) CN109074625B (ja)
BR (1) BR112018073898A2 (ja)
HK (1) HK1258710A1 (ja)
SG (1) SG11201808972SA (ja)
WO (1) WO2017204909A1 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10186069B2 (en) * 2017-02-15 2019-01-22 Arm Limited Methods and systems for grouping and executing initial pilot shader programs
US10891708B1 (en) 2019-11-25 2021-01-12 Arm Limited Shader program execution in graphics processing
US20230102767A1 (en) * 2021-09-29 2023-03-30 Advanced Micro Devices, Inc. System and methods for efficient execution of a collaborative task in a shader system
US11966726B2 (en) * 2022-02-25 2024-04-23 International Business Machines Corporation Operating system (OS) scheduler and compiler for code generation optimization in a (simultaneous multi-threading) SMT enabled CPU

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060170680A1 (en) * 2005-01-28 2006-08-03 Microsoft Corporation Preshaders: optimization of GPU programs
US20140354669A1 (en) * 2013-05-30 2014-12-04 Arm Limited Graphics processing

Family Cites Families (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6885374B2 (en) 2001-06-29 2005-04-26 Intel Corporation Apparatus, method and system with a graphics-rendering engine having a time allocator
JP4202033B2 (ja) * 2001-09-05 2008-12-24 三菱電機株式会社 並列画像処理装置および並列画像処理方法
JP4335516B2 (ja) * 2001-12-04 2009-09-30 パナソニック株式会社 複数のプロセッサを用いた動画像符号化装置およびその方法
US8154554B1 (en) * 2006-07-28 2012-04-10 Nvidia Corporation Unified assembly instruction set for graphics processing
US8325177B2 (en) 2008-12-29 2012-12-04 Microsoft Corporation Leveraging graphics processors to optimize rendering 2-D objects
US9256915B2 (en) * 2012-01-27 2016-02-09 Qualcomm Incorporated Graphics processing unit buffer management
US9019289B2 (en) * 2012-03-07 2015-04-28 Qualcomm Incorporated Execution of graphics and non-graphics applications on a graphics processing unit
US10002021B2 (en) 2012-07-20 2018-06-19 Qualcomm Incorporated Deferred preemption techniques for scheduling graphics processing unit command streams
US9123167B2 (en) 2012-09-29 2015-09-01 Intel Corporation Shader serialization and instance unrolling
US10134102B2 (en) 2013-06-10 2018-11-20 Sony Interactive Entertainment Inc. Graphics processing hardware for using compute shaders as front end for vertex shaders
US10114755B2 (en) 2013-06-14 2018-10-30 Nvidia Corporation System, method, and computer program product for warming a cache for a task launch
US9754342B2 (en) 2014-05-30 2017-09-05 Intel Corporation Method and apparatus for parallel pixel shading
GB2527822B (en) * 2014-07-03 2020-10-07 Advanced Risc Mach Ltd Graphics processing
US9665370B2 (en) * 2014-08-19 2017-05-30 Qualcomm Incorporated Skipping of data storage

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20060170680A1 (en) * 2005-01-28 2006-08-03 Microsoft Corporation Preshaders: optimization of GPU programs
US20140354669A1 (en) * 2013-05-30 2014-12-04 Arm Limited Graphics processing

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
川人 基弘、外2名: ""大域的なコード移動を使った複数式の実行コスト削減法"", 情報処理学会論文誌, vol. Vol.44, No.SIG 15(PRO 19), JPN6019013343, 15 November 2003 (2003-11-15), JP, pages 1 - 12, ISSN: 0004081863 *
服部 直也、外3名: ""関数間最適化による冗長メモリアクセスの削減"", 情報処理学会研究報告, vol. 2001, no. 76, JPN6019013342, 27 July 2001 (2001-07-27), JP, pages 73 - 78, ISSN: 0004081862 *
渡邊 坦、藤瀬 哲朗: ""高水準中間表現HIRでの最適化"", 情報処理, vol. 47, no. 11, JPN6019013344, 15 November 2006 (2006-11-15), JP, pages 1263 - 1271, ISSN: 0004081864 *
近藤 伸宏、外2名: ""Cellの性能をとことん引き出す 並列処理プログラミングの勘所 SIMD命令と負荷分散で最適化"", 日経エレクトロニクス, vol. 940, JPN6019013345, 4 December 2006 (2006-12-04), JP, pages 147 - 156, ISSN: 0004016167 *

Also Published As

Publication number Publication date
JP2020024716A (ja) 2020-02-13
CN109074625A (zh) 2018-12-21
WO2017204909A1 (en) 2017-11-30
KR20180128075A (ko) 2018-11-30
HK1258710A1 (zh) 2019-11-15
EP3465606A1 (en) 2019-04-10
JP6911055B2 (ja) 2021-07-28
KR101973924B1 (ko) 2019-04-29
JP6848028B2 (ja) 2021-03-24
US9799089B1 (en) 2017-10-24
CN109074625B (zh) 2020-04-24
BR112018073898A2 (pt) 2019-02-26
SG11201808972SA (en) 2018-12-28

Similar Documents

Publication Publication Date Title
US10430912B2 (en) Dynamic shader instruction nullification for graphics processing
US9799094B1 (en) Per-instance preamble for graphics processing
JP6848028B2 (ja) グラフィック処理のためのパーシェーダープリアンブル
EP3417369B1 (en) Uniform predicates in shaders for graphics processing units
EP3161817B1 (en) Load scheme for shared register in gpu
JP2011518398A (ja) 混合精度命令実行を伴うプログラマブルストリーミングプロセッサ
US20140366033A1 (en) Data processing systems
US11829439B2 (en) Methods and apparatus to perform matrix multiplication in a streaming processor
US9632783B2 (en) Operand conflict resolution for reduced port general purpose register
US20160077837A1 (en) System, method, and computer program product for implementing large integer operations on a graphics processing unit
WO2017053022A1 (en) Speculative scalarization in vector processing

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20181121

A871 Explanation of circumstances concerning accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A871

Effective date: 20181121

A975 Report on accelerated examination

Free format text: JAPANESE INTERMEDIATE CODE: A971005

Effective date: 20190408

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190416

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190606

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20190730

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190930

C60 Trial request (containing other claim documents, opposition documents)

Free format text: JAPANESE INTERMEDIATE CODE: C60

Effective date: 20190930

A911 Transfer to examiner for re-examination before appeal (zenchi)

Free format text: JAPANESE INTERMEDIATE CODE: A911

Effective date: 20191008

C21 Notice of transfer of a case for reconsideration by examiners before appeal proceedings

Free format text: JAPANESE INTERMEDIATE CODE: C21

Effective date: 20191015

A912 Re-examination (zenchi) completed and case transferred to appeal board

Free format text: JAPANESE INTERMEDIATE CODE: A912

Effective date: 20191025

C211 Notice of termination of reconsideration by examiners before appeal proceedings

Free format text: JAPANESE INTERMEDIATE CODE: C211

Effective date: 20191029

C22 Notice of designation (change) of administrative judge

Free format text: JAPANESE INTERMEDIATE CODE: C22

Effective date: 20200218

C22 Notice of designation (change) of administrative judge

Free format text: JAPANESE INTERMEDIATE CODE: C22

Effective date: 20200623

C22 Notice of designation (change) of administrative judge

Free format text: JAPANESE INTERMEDIATE CODE: C22

Effective date: 20200811

C22 Notice of designation (change) of administrative judge

Free format text: JAPANESE INTERMEDIATE CODE: C22

Effective date: 20201013

C13 Notice of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: C13

Effective date: 20201027

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20201224

C23 Notice of termination of proceedings

Free format text: JAPANESE INTERMEDIATE CODE: C23

Effective date: 20210511

C03 Trial/appeal decision taken

Free format text: JAPANESE INTERMEDIATE CODE: C03

Effective date: 20210608

C30A Notification sent

Free format text: JAPANESE INTERMEDIATE CODE: C3012

Effective date: 20210608

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20210707

R150 Certificate of patent or registration of utility model

Ref document number: 6911055

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150