【文献】
Hisa Ando,”プロセッサを支える技術 −果てしなくスピードを追求する世界 初版”,株式会社技術評論社,2011年 1月25日,第1版,p.311-343
(58)【調査した分野】(Int.Cl.,DB名)
【発明を実施するための形態】
【0012】
本開示の態様は、概して、汎用グラフィックス処理ユニット(“GPGPU”)として実装することができるグラフィックス処理ユニット(“GPU)”の効率を向上させることに関するものである。概して、GPUは、計算を行うための複数のシェーダプロセッサ(“SP”)を含む。それらの計算は、1つ以上のシェーダプログラム(ここでは、“カーネル”と呼ばれる)を含むGPGPUアプリケーションにおいて構造化することができる。カーネルは、様々な入力データを解析又は変更するために実装することができる関数を定義する。例は、相対的に大きな数値データセットを並列処理するための関数を含む。画像処理では、関数は、例えば、色補正アルゴリズム、顔検出アルゴリズム、又は拡張現実アプリケーションを実行するための関数を含むことができる。その他の例は、変換関数、レイトレーシング関数、又は様々なその他の関数を含む。
【0013】
カーネルは、ワークグループに分類することができる個々のワークアイテム(例えば、GPUにおける作業の基本単位)から成る。画像(例えば、映像データのフレーム、コンピュータによって生成されるグラフィックス画像、静止画像、等)を処理するためにGPUが実装される例では、ワークアイテムは、画像のピクセルを解析又は変更(modify)するための関数を定義する1つ以上の命令を含むことができる。さらに、複数のワークアイテムを、画像のピクセルグループを解析又は変更するためのワークグループ(例えば、一組のワークアイテム)として編成することができる。
【0014】
幾つかのアプリケーションは、同じ入力データに関して複数の関数を実行するための複数のカーネルを含むことができる。さらに、複数のカーネルを有するアプリケーションは、その他のカーネルに依存する幾つかのカーネルを含むことができる。例えば、ある1つのアプリケーションが2つのカーネルを含むことができ、第2のカーネルは、第1のカーネルの結果に依存する。従って、幾つかの例では、1つのカーネルの結果が、後続するカーネルの結果を“無関係”にすることがある。ここで説明される場合において、“無関係な命令”とは、アプリケーションの目的を促進させない命令であることができる。換言すると、“無関係な”命令は、アプリケーションの結果を変更しない、又は考慮に入れない命令であることができる。
【0015】
単純な例では、ある1つのアプリケーションは、データセット内のある特徴[x,y,z]を識別するための2つのカーネルを含む。第1及び第2のカーネルは、3つの命令を各々有しており、それらは、[x,y,z]とそれぞれ関連付けられた3つの別個のワークアイテムで定義することができる。それらの3つの命令は、その特徴が命令を実行することによって識別される場合は“真”、その特徴が命令を実行することによって識別されない場合は“偽”であると評価する。さらに、第2のカーネルは、第1のカーネルの結果に依存する。例えば、特徴を識別するためには両方のカーネルの命令を“真”と評価しなければならず、このため、第2のカーネルの命令は、“真”であると評価される第1のカーネルの命令に依存する。第1のカーネルを実行後は、GPUは、希望される特徴を“x”及び“y”に含めることができ、“z”には含めることができないと決定する。第2のカーネルの命令は、“z”に関連しており、アプリケーションの結果と無関係である。例えば、“z”に関連する第2の命令は、アプリケーションの結果を考慮に入れず、その理由は、“z”に関連する第2の命令が“真”であると評価される場合でも、命令が第1のカーネルを既に失敗しているためである。特に、第1のカーネル内の“z”に関連する命令は、希望される特徴を識別しなかった。このアプリケーション例では、第2のカーネルは、個々の無関係の命令(例えば、ワークアイテム)を含み、従って、カーネルの一部分のみが無関係であり、カーネルの残りの部分は結果に関係することができる。
【0016】
2つ以上の無関係の命令を有するカーネルは、幾つかの状況では、“スパースな”(sparse)として説明することができる。例えば、“スパースな”カーネルは、数多くの無関係な命令によって分離された関係する命令を含むことができる。典型的には、GPUは、命令の関係性にかかわらず、実行を目的としてすべての命令(例えば、カーネルのワークアイテム及びワークグループ)をシェーダプロセッサ(SP)に配分する。例えば、GPUは、概して、無関係な命令を識別するためのメカニズムを含まない。従って、GPUのSPは、典型的には、カーネルのワークアイテム又はワークグループの関係性にかかわらず、すべてのワークグループ及びワークアイテムを実行しなければならない。スパースなカーネルを実行することは、GPUのSPが無関係の命令を実行することに占有されてGPU処理電力を消費するため、GPU性能を低下させることがある。
【0017】
本開示の態様は、少なくとも幾つかの無関係な命令の実行を回避することによってGPUのSPの効率及び利用を向上させることに関するものである。幾つかの例では、GPUは、無関係な命令を特定し、それらの無関係な命令がGPUのSPによって処理されるのを防止する。すなわち、GPUは、GPU内での作業の基本単位(例えば、実行可能なコード)である無関係なワークアイテムを特定することができ、及び、1つ以上の個々の命令を含むことができ、及び、無関係なワークアイテムがGPUのSPによって処理されるのを防止することができる。無関係なワークアイテムが処理されるのを防止するため、GPUは、無関係なワークアイテムが実行される前に“カリングする”、すなわち、取り除くことができる。幾つかの態様により、GPUは、カリングを実施するためのカルバッファ(cull buffer)を実装することができる。例えば、カルバッファは、GPUがワークアイテムを実行できる前にそのワークアイテムを取り除くべきかどうかを決定するために使用することができる1つ以上の値を保有することができる。
【0018】
概して、用語“ワークアイテム”及び“命令”は、互換可能な形で使用することができる。本開示は、概して、入力データを処理ための関数の少なくとも一部分として命令を記述する。本開示は、概して、ワークアイテムをGPUにとっての作業の基本単位(例えば、実行可能なコードの基本単位)と呼び、1つ以上の個々の命令を含むことができる。従って、用語“ワークアイテム”は、入力データを処理するための関数を定義する1つ以上の命令を概して意味することが理解されるべきである。“ワークアイテム”は、Compute Unified Device Architecture(NVIDIA Corporationによって開発された“CUDA”、バージョン3.2 2010年9月17日リリース)では“スレッド”と呼ぶこともできる。
【0019】
GPUは、無関係の命令を実行のために編成してSPに配分する前に命令の組からカリングすることができる。無関係な命令をSPに提供して処理できるようになる前にカリングすることは、SPが無関係な命令を実行するために占有されないためGPUの効率を向上させるのに役立つことができる。さらに、無関係な命令をカリングすることで、GPUは、無関係な命令を編成して配分することにリソースを専念させない。むしろ、GPUは、関係がある命令をDPに配分することができ、そのことは、関係がある命令を連続的に実行するのを可能にする。
【0020】
本開示の態様により、GPUは、命令カリングを実施するためのカルバッファを実装することができる。カルバッファは、実行された命令の特徴を表す1つ以上の値を格納することができる。その特徴は、後続する命令が関係があるか又は無関係かを決定するために使用することができる。例えば、GPUは、2つのカーネルを有するアプリケーションを実行することができる。第1のカーネルを実行している間に、GPUは、第1のカーネルと関連付けられた命令の結果に基づいて第2のカーネルの命令が関係があるかどうかを表す1つ以上の値をカルバッファに格納することができる。第2のカーネルの1つ以上の命令が関係ない場合は、GPUは、それらの無関係の命令がSPによって実行されるのを防止することができる。例えば、GPUのうちで命令を編成してSPに配分することを担当するコンポーネントは、カルバッファに格納された値に基づいて無関係の命令をカリングすることができる。
【0021】
従って、概して、本開示の技法は、2つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第1のカーネルのワークアイテム及びワークグループを実行した時点で、GPUは、第2のカーネルのワークアイテム及びワークグループが関係するかどうかを表すカルバッファ値を設定することができる。すなわち、GPUは、第1のカーネルの結果に基づいてカルバッファ値を設定することができ、それらは、第1のカーネルのワークアイテム及びワークグループの各々の同じ入力データと関連付けられた第2のカーネルの各々のワークアイテム及びワークグループが関係するかどうかを表す。従って、第1のカーネルを実行後は、GPUは、第2のカーネル内の無関係のワークアイテム及びワークグループが実行されないようにそれらの無関係のワークアイテム及びワークグループをカリングするためにカルバッファ値を利用することができる。
【0022】
幾つかの例では、カルバッファは、アプリケーションのすべての命令の特徴を表す1つ以上の値を格納するように設計することができる。例えば、各命令を実行後は、GPUは、命令が関係があるか又は無関係であるかを示す各命令の特徴を表すカルバッファを格納することができる。他の例では、GPUは、後続する命令が無関係であるとGPUが決定したときのみにカルバッファ値を格納することができる。
【0023】
カルバッファは、ワークグループの特徴を表す1つ以上の値、及び、そのワークグループ内の個々のワークアイテムの特徴を表す1つ以上の値を格納するように設計することができる。従って、カルバッファは、ワークグループ及びワークアイテムの両方のレベルで命令が無関係であるかどうかを決定するために使用することができる。所定のワークグループのすべてのワークアイテムが前に実行されたカーネルによって無関係とされた場合は、GPUは、無関係のワークグループがSPによって実行されないようにワークグループ全体をカリングすることができる。代替として、所定のワークグループのワークアイテムの一部のみが前に実行されたカーネルによって無関係とされた場合は、GPUは、無関係のワークアイテムがSPによって実行されないように個々のワークアイテムをカリングすることができる。
【0024】
用語“ワークグループ”は、概して、予め定義された命令のグループ、例えば、予め定義されたワークアイテムのグループ、を意味することが理解されるべきである。“ワークグループ”は、Compute Unified Device Architecture(NVIDIA Corporationによって開発された“CUDA”、バージョン3.2 2010年9月17日リリース)では“スレッドブロック”と呼ぶこともできる。
【0025】
本開示の態様は、様々な異なるカルバッファサイズ及び様々な異なるカルバッファ能力の使用を含む。一例では、カルバッファは、カーネルの各ワークアイテムの単一の特徴を表す単一のバイナリ値(例えば、単一の記憶ビット)を格納することができる。該例では、GPUは、前に実行されたワークアイテムの結果に基づいてワークアイテムが関係があるか又は無関係であるかを識別するためにカルバッファ値を使用することができる。
【0026】
単一のバイナリ値を格納するカルバッファは、カルバッファ構成の単なる一例であるにすぎない。他の例では、カルバッファは、ワークアイテムごとに2つ以上の値を格納することができる。例えば、カルバッファは、実行されたワークアイテムの2つ以上の特徴に対応する2つ以上の値を格納することができる。制限することを意味しない画像処理例では、GPUは、ピクセルデータの赤緑青(RGB)の特徴を決定するためにピクセルデータに関するワークアイテムを実行することができる。従って、カルバッファは、実行された命令の赤、緑、及び青の成分に対応する3つの値を格納するために実装することができる。この例では、GPUは、カルバッファに格納された値のうちのいずれかに基づいて命令をカリングすることができる。カルバッファのコンフィギュレーション(例えば、サイズ及び能力)は、アプリケーション及びGPUに依存することが理解されるべきである。例えば、幾つかのGPUは、相対的に大きな多機能のカルバッファのために相対的に大きなメモリ量を提供するように設計することができる。その他のGPUは、該多様性を提供することができない。従って、提供される例は、実装することができるカルバッファの唯一のコンフィギュレーションではないことが理解されるべきである。
【0027】
GPUは、様々な方法でカルバッファに値を格納することができる。一例では、SPがワークアイテムを実行後に、SPは、実行されたワークアイテムの結果に基づいて1つ以上のカルバッファ値をカルバッファに書き込むことができる。この例では、他のカーネルの新しいワークアイテム(例えば、同じ入力データと関連付けられたワークアイテム)を実行後に、SPは、カルバッファに格納された1つ以上のカルバッファ値を読み取り、1つ以上のカルバッファ値を新しいワークアイテムの実行によって生成された新しい値と比較することによって1つ以上のカルバッファ値を更新することができる。この例では、格納された値を新しいワークアイテムの実行によって生成された新しい値と比較する前にカルバッファに格納された1つ以上のカルバッファ値を読み取ることに関連するレーテンシーが存在することがある。
【0028】
他の例では、SPがワークアイテムを実行後に、SPは、1つ以上のカルバッファ値をプログラミング可能な又は固定された機能のハードウェア(programmable or fixed function hardware)に提供することができ、それが1つ以上のカルバッファ値をカルバッファに書き込む。例えば、プログラミング可能な又は固定された機能のハードウェアは、ワークアイテムの実行時点でSPからの入力を受け取るように構成することができる。プログラミング可能な又は固定された機能のハードウェアは、入力を解釈して入力に対応するカルバッファに1つ以上の値を格納するために実装することができる。この例では、プログラミング可能な又は固定された機能のハードウェアは、カルバッファに格納された1つ以上の値を新しいワークアイテムの実行によって生成された新しい値と比較するのを担当することができる。プログラミング可能な又は固定された機能のハードウェアがカルバッファの更新を行うのを可能にすることは、SPが格納された1つ以上の値を読み取る必要がないため、その結果として、より低いレーテンシーになる。むしろ、プログラミング可能な又は固定された機能のハードウェアが、1つ以上のカルバッファ値を読み取ることを担当する。
【0029】
幾つかの態様により、バッファ値は、命令をシーケンシングしてGPUのSPに配分することを担当するGPUのコンポーネントによってアクセス及び利用することができる。例えば、シーケンシングコンポーネントは、命令をSPに配分する準備をしている間にバッファ値を読み取って命令を取り除くことができる。従って、シーケンシングコンポーネントは、SPに命令を配分する前にそれらの命令を取り除くことができる。幾つかの例では、シーケンシングコンポーネントは、ワークグループ及びワークアイテムの両方のセットアップ及び配分を担当することができる。シーケンシングコンポーネントは、カルバッファに格納された値を読み取り、SPに命令を配分する前にワークグループ及びワークアイテムの両方のレベルで命令を取り除くことができる。例えば、シーケンシングモジュールは、カルバッファに格納された値を読み取り、それらの値に基づいてワークアイテムのワークグループ全体が無関係であると決定することができる。シーケンシングモジュールは、カルバッファに格納された値を読み取り、それらの値に基づいて個々のワークアイテムが無関係であることを決定することもできる。
【0030】
幾つかの態様により、アプリケーションは、命令カリングを可能にする命令を含むことができる。例えば、アプリケーションは、カルバッファが機能するのを可能にする命令を含むことができる。命令カリングを可能にするために、アプリケーションの実行された命令は、結果、及びその結果の特徴を表す、カルバッファに格納される1つ以上の値、の両方を提供し、それらは、後続する命令の関係性を決定するために使用することができる。
【0031】
GPUアプリケーションのプログラミングは、典型的には、複数のプラットフォーム、オペレーティングシステム、及びハードウェア上で実行することができる標準的なソフトウェアインタフェースを提供するアプリケーションプログラムインタフェース(API)を用いてユーザ(例えば、コンピュータプログラマ)によって行われる。APIの例は、Open Graphics Library(“OpenGL”、バージョン4.1、2010年7月26日リリース、公に入手可能)と、Compute Unified Device Architecture(“CUDA”、NVIDA Corporation開発、バージョン3.2、2010年9月17日リリース)と、DirectX(Microsoft開発、バージョン11、2009年10月27日リリース)と、を含む。概して、APIは、関連付けられたハードウェアによって実行される予め決定された、標準化された一組のコマンドを含む。APIコマンドは、ユーザがGPUのハードウェアコンポーネントの詳細に関する知識なしにコマンドを実行するようにそれらのハードウェアコンポーネントに命令するのを可能にする。
【0032】
本開示の幾つかの態様は、ユーザ(例えば、コンピュータプログラマ)が命令カリングを定義及び実装するのを可能にする1つ以上のAPIコマンドに関するものである。例えば、APIコマンドは、ユーザが命令の実行後にアプリケーションによって生成されることになるカルバッファ値を定義するのを可能にすることもできる。APIコマンドは、1つ以上のカルバッファ値を指定されたカルバッファに格納するようにGPUに命令することもできる。APIコマンドは、命令を編成してSPに配分する前にカルバッファを解析するようにGPUに命令することもできる。GPUは、コマンドを受け取って実行した時点で、1つ以上のカルバッファ値を生成してカルバッファに格納し、無関係な命令がSPに配分される前にそれらをカリングする。
【0033】
様々な異なるGPGPUアプリケーションが無関係な命令のカリングから利益を得ることができる。1つの限定することを意味しない単純化された画像処理アプリケーション(例えば、顔検出アプリケーション)が、複数のカーネルを有することができるアプリケーションの一例として提供され、1つのカーネルが、他のカーネルの命令を無関係にする命令を有する。顔検出アプリケーションの一例は、画像(例えば、映像データのフレーム、コンピュータによって生成されたグラフィックス画像、静止画像、等)内に含まれている顔と関連付けられた、異なる予め定義された特徴を検出するための3つのカーネルを含む。
【0034】
この例では、各カーネルは、顔と関連付けられた画像のピクセル内の特定の特徴(例えば、色、色調、飽和、輝度、又はその他の性質)を識別するために実装することができる。この例により、カーネル内で設定されるすべての判定基準を満たす映像データのフレーム内のピクセル又はピクセルのグループが顔の候補である。さらに、この例のカーネルは、より控えめからより少なく控えめになるように編成される。
【0035】
例えば、第1のカーネルは、可能性のある候補を除外するのを回避するために数多くの候補の顔ピクセルを識別することができる。しかしながら、第2及び第3のカーネルは、候補数を十分に少なくするために候補となる顔のピクセルとみなされるピクセルを排除する上でより積極的であることができる。この例では、各カーネルが実行された後にカーネルの一部分が無関係になる。例えば、第1のカーネルを実行後は、幾つかのピクセルのみが候補の顔のピクセルとして識別され、残りのピクセルは考慮の対象から除外される。従って、第2及び第3のカーネル内の除外されたピクセルと関連付けられた命令はすべて無関係である。それらの命令は、実行された場合でも、顔候補を識別するのには貢献しない。
【0036】
提供された顔検出例においてカーネルが実行されるのに応じて、第2及び第3のカーネルはスパースになる。例えば、各カーネルが実行された後は、後続するカーネルのより多くの命令が無関係になる。無関係な命令は、顔を見つけるのには貢献しないにもかかわらずGPUリソースを消費する。本開示の態様により、GPUは、無関係な命令が実行のためにSPに配分される前に無関係な命令を取り除くために命令カリングを実装することができる。このようにして、無関係な命令を実行するためにGPUのSPが実装されるため、GPUの効率が向上される。
【0037】
提供された顔検出例を実行するときには、GPUは、最初に第1のカーネルを実行し、1つ以上のカルバッファ値を生成することができる。例えば、GPUのSPは、第1のカーネルの命令を実行し、第1のカーネルの実行された命令の特徴(例えば、後続する命令が関係するか又は無関係であるか)を表すカルバッファ値でカルバッファをポピュレート(populate)することができる。第2のカーネルを実行した時点で、GPUは、無関係な命令を特定して第2のカーネルからカリングするためにカルバッファに格納された値を利用することができる。例えば、GPUは、カルバッファ76に格納された値を読み取り、命令が実行目的でSP84に配分される前にそれらの命令をカリングすべきかどうかを決定することができる。GPUが命令カリングを完了した後は、GPUは、第2のカーネルを実行し、新しいカルバッファ値でカルバッファを更新する。GPUは、このプロセス例を繰り返して第3のカーネルを実行することができる。
【0038】
画像処理は、1つのカーネルの命令が他のカーネルの命令を無関係にする一例であるにすぎない。その他の例は、例えば、拡張現実アプリケーションと、レイトレーシングと、パターン認識と、を含む。概して、GPUは、様々な入力データに関して様々なアプリケーションを実行するために実装することができる。カーネルは、個々のアプリケーション専用であり、命令を構成するための枠組のみを提供する。従って、無関係な命令をカリングする概念は、様々なその他のアプリケーションに対して適用可能であることが理解されるべきである。
【0039】
ここにおいて説明される幾つかの例及び態様は、異なるカーネルの無関係のワークアイテム及びワークグループがGPUのSPに配分される前にそれらのワークアイテム及びワークグループを特定してカリングすることを対象とする。しかしながら、カーネル/ワークグループ/ワークアイテムに関する詳細な説明は、GPGPUアプリケーション構造の単なる一例であるにすぎない。無関係なワークアイテム及びワークグループを特定すること、及び、ワークアイテム及びワークグループカリング値を生成、格納、及び使用することは、ほんの一例として提供されていることが理解されるべきである。本開示の態様は、無関係な命令を特定することに関するものであり、カルバッファ値を生成、格納、及び使用することは、その他のGPUアプリケーション構造でも適用可能である。例えば、その他のGPUアプリケーションは、同じ入力データを実行中に2回以上使用する命令を含む単一の相対的により大きな“カーネル”を含むことができる。該例では、本開示の態様は、SP効率を最大にするためにも適用することができる。同じ入力データに関連する無関係な命令は、それらの命令が同じカーネルに属していてもカリングすることができる。
【0040】
図1は、無関係な命令、例えば、ワークアイテム及びワークグループ、を特定してカリングするための技法を実装することができるコンピューティングデバイス20を例示するブロック図である。
図1に示されるように、コンピューティングデバイス20は、ホストプロセッサ24と、記憶装置28と、メモリ32と、ネットワークモジュール36と、ユーザインタフェース40と、ディスプレイ44と、を含む。コンピューティングデバイス20は、グラフィックス処理ユニット(GPU)48も含む。コンピューティングデバイス20は、幾つかの例では、ポータブルコンピューティングデバイス(例えば、携帯電話、ネットブック、ラップトップ、タブレットデバイス、デジタルメディアプレーヤー、ゲームデバイス、又はその他のポータブルなコンピューティングデバイス)を含むことができ又はポータブルコンピューティングデバイス(例えば、携帯電話、ネットブック、ラップトップ、タブレットデバイス、デジタルメディアプレーヤー、ゲームデバイス、又はその他のポータブルなコンピューティングデバイス)の一部であることができる。代替として、コンピューティングデバイス20は、静止型のコンピューティングデバイス、例えば、デスクトップコンピュータ、テレビ、テレビのセットトップボックス、ゲーム用コンソール、等として構成することができる。
【0041】
図1の例示されるコンピューティングデバイス20は、単なる一例である。無関係な命令を特定及びカリングするための技法は、その他のコンポーネントを有する様々なその他のコンピューティングデバイスによって実施することができる。幾つかの例では、コンピューティングデバイス20は、明確化を目的として
図1に示されていない追加のコンポーネントを含むことができる。例えば、コンピューティングデバイス20は、コンピューティングデバイス20のコンポーネント間でデータを転送するための1つ以上の通信ブリッジを含むことができる。さらに、
図1に示されるコンピューティングデバイス20のコンポーネントは、コンピューティングデバイス20のすべての例において必要であるわけではない。例えば、ユーザインタフェース40及びディスプレイ44は、コンピューティングデバイス20がデスクトップコンピュータである例ではコンピューティングデバイス20の外部に存在することができる。
【0042】
ホストコンピュータ24は、マイクロプロセッサ、コントローラ、デジタル信号プロセッサ(DSP)、特定用途向け集積回路(ASIC)、フィールドプログラマブルゲートアレイ(FPGA)、又は同等のディスクリートの又は一体化された論理回路のうちのいずれか1つ以上を含むことができる。加えて、ホストプロセッサ24に帰属する機能は、本開示では、ソフトウェア、ファームウェア、ハードウェア又はそれらのあらゆる組み合わせとして具現化することができる。
【0043】
ホストプロセッサ24は、コンピューティングデバイス20内で実行するために命令を処理する。ホストプロセッサ24は、記憶装置28に格納された命令又はメモリ32に格納された命令を処理することが可能である。アプリケーション例は、観ることが可能な画像を処理するためのアプリケーション(例えば、画像のフィルタリング、画像の予め定義された特徴に関する解析、等)を含む。ホストプロセッサ24は、ユーザインタフェース40を介してのユーザによる選択に基づいて1つ以上のアプリケーションを実行することができる。幾つかの例では、ホストプロセッサ24は、ユーザとの対話なしに1つ以上のアプリケーションを実行することができる。
【0044】
本開示の幾つかの態様により、及び、以下においてGPU48に関してより詳細に説明されるように、ホストプロセッサ24は、アプリケーションを実行するためにGPU48と協力することができる。例えば、ホストプロセッサ24は、アプリケーションの実行を初期化し、そのアプリケーションと関連付けられた一定の処理機能をGPU48に委託することができる。一例では、ホストプロセッサ24は、画像処理アプリケーションの実行を初期化し、そのアプリケーションと関連付けられた一定の処理機能をGPU48に委託することができる。
【0045】
記憶装置28は、1つ以上のコンピュータによって読み取り可能な記憶媒体を含むことができる。記憶装置28は、情報の長期格納用に構成することができる。幾つかの例では、記憶装置28は、非揮発性記憶素子を含むことができる。該非揮発性記憶素子の例は、磁気ハードディスク、光ディスク、フロッピー(登録商標)ディスク、フラッシュメモリ、又は幾つかの形態の電気的プログラマブルメモリ(EPROM)又は電気的消去可能プログラマブル(EEPROM)メモリを含むことができる。記憶装置28は、幾つかの例では、非一時的な記憶媒体であるとみなすことができる。用語“非一時的な”は、その記憶媒体が搬送波又は伝搬信号で具現化されないことを示すことができる。しかしながら、用語“非一時的な”は、記憶装置28が移動不能であることを意味するとは解釈されるべきではない。一例として、記憶装置28は、コンピューティングデバイス20から取り外して他のデバイスに移動させることができる。他の例として、記憶装置28と実質的に類似する記憶装置をコンピューティングデバイス20内に挿入することができる。
【0046】
記憶装置28は、ホストプロセッサ24又はGPU48による1つ以上のアプリケーションの実行のための命令を格納することができる。記憶装置28は、ホストプロセッサ24又はGPU48による使用のためにデータを格納することもできる。例えば、記憶装置28は、ホストプロセッサ24又はGPU48による処理のために画像データを格納することができる。
【0047】
メモリ32は、動作中に情報をコンピューティングデバイス20内に格納するように構成することができる。幾つかの例では、メモリ32は、一時的なメモリであり、メモリ32の主目的は長期格納ではないことを意味する。メモリ32は、幾つかの例では、コンピュータによって読み取り可能な記憶媒体として説明することができる。従って、メモリ32は、経時で変化することが可能なデータを格納するにもかかわらず“非一時的”であるとみなすこともできる。メモリ32は、幾つかの例では、揮発性メモリとして説明することもでき、メモリ32は、コンピュータの電源が切られたときに格納されている内容物を維持しないことを意味する。揮発性メモリの例は、ランダムアクセスメモリ(RAM)と、ダイナミックランダムアクセスメモリ(DRAM)と、スタティックランダムアクセスメモリ(SRAM)と、当業において知られるその他の形態の揮発性メモリと、を含む。
【0048】
幾つかの例では、メモリ32は、ホストプロセッサ24又はGPU48による実行のためにプログラム命令を格納するために使用することができる。メモリ32は、プログラムの実行中に情報を一時的に格納するためにコンピューティングデバイス20上で実行中のソフトウェア又はアプリケーションによって使用することができる。従って、メモリ32は、コンピューティングデバイス20のその他のコンポーネント、例えば、ホストプロセッサ24及びGPU48、によってアクセスすることができる。
【0049】
コンピューティングデバイス20は、1つ以上のネットワーク、例えば、1つ以上の無線ネットワーク、を介して外部のデバイスと通信するためにネットワークモジュール36を利用することができる。ネットワークモジュール36は、ネットワークインタフェースカード、例えば、イーサネット(登録商標)カード、光学トランシーバ、無線周波数トランシーバ、又は情報を送信及び受信することができるあらゆるその他のタイプのデバイスであることができる。幾つかの例では、コンピューティングデバイス20は、外部のデバイス、例えば、サーバ、携帯電話、又はその他のネットワーク化されたコンピューティングデバイス、と無線通信するためにネットワークモジュール36を利用することができる。
【0050】
コンピューティングデバイス20は、ユーザインタフェース40も含む。ユーザインタフェース40の例は、トラックボールと、マウスと、キーボードと、その他のタイプの入力デバイスと、を含み、ただしそれらに限定されない。ユーザインタフェース40は、ディスプレイ44の一部として組み入れられたタッチ式画面も含むことができる。ディスプレイ44は、液晶ディスプレイ(LCD)、有機発光ダイオード(OLED)ディスプレイ、プラズマディスプレイ、又は他のタイプの表示装置を備えることができる。
【0051】
コンピューティングデバイス20のGPU48は、GPUアプリケーションを実行するための固定された機能の及びプログラミング可能なコンポーネントを有する専用ハードウェアユニットであることができる。GPU48は、DSP、汎用マイクロプロセッサ、ASIC、FPGA、又はその他の同等の集積回路又はディリスクリート論理回路を含むこともできる。GPU48は、その他のコンポーネント、例えば、
図2に関してより詳細に説明される専用メモリ、を含むこともできる。さらに、
図1では別個のコンポーネントとして示されているが、幾つかの例では、GPU48は、ホストプロセッサ24の一部として構成することができる。GPU48は、様々なアプリケーションプログラミングインタフェース(API)に従って処理技法を利用するように構成することができる。例えば、ユーザは、複数のプラットフォーム、オペレーティングシステム、及びハードウェア上で走ることができる標準的なソフトウェアインタフェースを用いてGPU48によって実行されるアプリケーションをプログラミングすることができる。幾つかの例では、GPU48は、OpenCL、CUDA、又はAPIの集合であるDirectXを用いて生成されたアプリケーションを利用するように構成することができる。
【0052】
幾つかの例により、GPU48は、汎用グラフィックス処理ユニット(GPGPU)として実装することができる。例えば、GPS48は、伝統的にはホストプロセッサ24によって実施される様々な汎用のコンピューティング機能を実施することができる。例は、様々な画像処理機能、例えば、映像の復号及び後処理(例えば、デブロッキング、ノイズ低減、色補正、等)及びその他の特定用途向けの画像処理機能(例えば、顔の検出/認識、パターン認識、ウェーブレット変換、等)を含む。幾つかの例では、GPU48は、アプリケーションを実行するためにホストプロセッサ24と協力することができる。例えば、ホストプロセッサ24は、GPU48による実行のための命令をGPUに提供することによって幾つかの機能をGPU48に委託することができる。
【0053】
GPGPUとして実装された場合、GPU48及びホストプロセッサ24は、ここではカーネルと呼ばれる1つ以上のシェーダプログラムを有するアプリケーションを実行することができる。アプリケーションの各カーネルは、特定のタスクを実施するための関数を定義することができ、各カーネルは、同じ入力データで実行することができる。例えば、GPU48及びホストプロセッサ24は、画像内の特徴を識別するための複数のカーネルを有する画像処理アプリケーション例を実行することができ、及び、これらの複数のカーネルの各々は、特徴を識別するために画像データに基づいて実行することができる。さらに、GPU48は、その他のカーネルの結果に依存するカーネルを含むアプリケーションを実行することができる。該例では、カーネルの結果は、後続するカーネルの命令、例えば、後続するカーネルのワークアイテム及びワークグループ、を“無関係”にすることができる(例えば、アプリケーションの目的を促進させない1つ以上の命令)。
【0054】
本開示の幾つかの態様により、GPU48は、無関係な命令が実行されるのを防止することによって無関係な命令を実行するのを回避することができる。例えば、無関係な命令が実行されるのを防止するために、GPU48は、それらの命令が実行される前に“カリングする”、すなわち、取り除くことができる。すなわち、GPU48は、無関係なワークアイテム及び/又はワークグループが実行される前にカリングすることができる。上述されるように、用語“ワークアイテム”は、入力データを処理するための関数を定義する1つ以上の個々の命令を含むことができるGPUに関する作業の基本単位を含む。さらに、用語“ワークグループ”は、概して、予め定義された命令のグループ、例えば、予め定義されたワークアイテムのグループ、を意味する。
【0055】
従って、本開示の技法は、概して、2つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第1のカーネルのワークアイテム及びワークグループを実行した時点で、GPU48は、第2のカーネルのワークアイテム及びワークグループが関係するかどうかを表すカルバッファ値を設定することができる。すなわち、GPU48は、第1のカーネルのワークアイテム及びワークグループの各々の同じ入力データと関連付けられた第2のカーネルの各々のワークアイテム及びワークグループが関係があるかどうかを表す、カルバッファ値を第1のカーネルの結果に基づいて設定することができる。従って、第1のカーネルを実行後は、GPU48は、第2のカーネル内の無関係なワークアイテム及びワークグループが実行されないようにそれらの無関係なワークアイテム及びワークグループをカリングするためにカルバッファ値を利用することができる。
【0056】
図2は、GPU48をさらに詳細に例示したブロック図であり、命令カリング、例えば、ワークアイテム及びワークグループのカリング、のための技法を実施するように構成することができる。
図2に示される例では、GPU48は、GPUメモリ64と、カルバッファ76及びカルモジュール80を有するシーケンサモジュール72と、を含む。GPU48は、シェーダプロセッサ84A乃至84D(総称して“SP”84)も含む。
【0057】
図2は、命令カリングのための技法を利用することができるGPUの単なる一例として提供される。無関係な命令を特定及びカリングするための技法は、その他のコンポーネントを有する様々なその他のGPUによって実施することができる。例えば、その他の例では、GPU48は、画像を解析及びレンダリングすることに関連する様々なその他のモジュール、例えば、ラスタライザモジュール、テクスチャユニット、1つ以上のバッファ、又はその他のGPUコンポーネント、を含むこともできる。さらに、GPU48は、
図2に示されるコンポーネントよりも多い又は少ないそれらを含むことができる。例えば、
図2では、4つのSP84を含むGPU48が示される。しかしながら、その他の例では、GPU48は、
図2に示されるよりも多い又は少ないSP84を含むことができる。
【0058】
GPUメモリ64は、GPU48によって処理される命令を格納するためのGPU48内部の専用メモリモジュールであることができる。幾つかの例では、GPUメモリ64は、
図1に示されるメモリ32に類似する。例えば、GPUメモリ64は、一時的なコンピュータによって読み取り可能な記憶媒体であることができる。GPUメモリ64の例は、ランダムアクセスメモリ(RAM)と、ダイナミックランダムアクセスメモリ(DRAM)と、スタティックランダムアクセスメモリ(SRAM)と、当業において知られるその他の形態のメモリと、を含む。GPU48が他のプロセッサ、例えば、
図1に示されるホストプロセッサ24、の一部として構成される例では、GPUメモリ64は、GPU48以外のコンポーネントによってアクセスすることができる。
【0059】
GPUメモリ64は、GPU48のためのグローバルメモリとして構成することができる。例えば、GPUメモリ64は、動作中にGPU48内に命令及び情報を格納するように構成することができる(例えば、GPU48による処理のための画像データ及び命令)。GPUメモリ64は、GPU48によって処理されているデータの結果を格納するように構成することもできる。
【0060】
シーケンサモジュール72は、SP84による処理のための命令及びデータを最初に準備することができる。例えば、シーケンサモジュール72は、ホストプロセッサ、例えば、
図1に示されるホストプロセッサ24、又はGPUメモリ64から命令及びデータを受け取り、SP84によって処理される入力データを準備することができる。幾つかの例では、シーケンサモジュール72は、GPU48によって実施される機能を定義する命令の1つ以上のカーネルを受け取る。シーケンサモジュール72は、命令をワークアイテム(例えば、作業の基本単位)として編成し、それらのワークアイテムをグループに分類してワークグループにする。
【0061】
シーケンサモジュール72は、GPU48内での命令及びデータの流れを制御するために実装することもできる。例えば、シーケンサモジュール72は、命令及び関連付けられたデータを実行のためにSP84にルーティングすることができる。シーケンサモジュール72は、命令(例えば、ワークアイテム及びワークグループ)及び関連付けられた入力データをSP48に配分するための機能が固定されたコンポーネント及びプログラミング可能なコンポーネントの組み合わせから成ることができる。本開示の幾つかの態様により、シーケンサモジュール72は、無関係な命令を特定してそれらの無関係な命令がGPU48のSP84によって処理されるのを防止するためのカルモジュール76とカルバッファ80とを含む。すなわち、シーケンサモジュール72は、無関係なワークアイテム及びワークグループを特定してそれらの無関係なワークアイテム及びワークグループがGPU48のSP84によって処理されるのを防止するためのカルモジュール76とカルバッファ80とを含むことができる。
【0062】
図2に示される例では、SP72は、各々、スレッドセットアップモジュール88A乃至88D(総称して、スレッドセットアップモジュール88)、及び複数の算術論理装置(“ALU”)(総称して、ALU92)を含む。SP72は、グラフィックスをレンダリングするための幾何、頂点、又はピクセルシェーディング演算を行うことができるという点で、“統合シェーダプロセッサ”と呼ぶことができる。SP72は、GPGPUアプリケーションの命令を実行時に汎用計算を行うために使用することもできる。例えば、SP72は、シーケンサモジュール76から命令を受け取ってそれらの命令を実行することができる。
【0063】
幾つかの例では、SP84のスレッドセットアップモジュール88は、シーケンサモジュール72から命令を受け取り、ALU92による実行のためのスレッドを生成することを担当する。例えば、スレッドセットアップモジュール88は、シーケンサモジュール72から命令(例えば、ワークアイテムのワークグループ)を受け取り、それらの命令を一時的に格納し、ALU92による実行のためのスレッド、すなわち、ワークアイテム、を生成し、それらのスレッドをALU92に配分する。幾つかの態様により、スレッドセットアップモジュール88は、ALU92が2つ以上のスレッドを並列処理するのを可能にするような形でALU92にスレッドを配分する。SP84のALU92を関係があるスレッド(例えば、関係がある命令を有するスレッド)で連続的に占有することによってGPU48の性能及び効率を最大にすることができる。
【0064】
本開示の幾つかの態様により、GPU48は、“無関係な”命令(例えば、アプリケーションの目的を促進させない命令)を特定してそれらの無関係な命令がSP84によって処理されるのを防止するためにシーケンサモジュール72を実装することによって効率を向上させることができる。例えば、無関係なワークアイテムが処理されるのを防止するために、シーケンサモジュール72は、命令をSP84にルーティングする前に無関係なワークアイテムをカリングする、すなわち、取り除く、ことができる。従って、SP84のスレッドセットアップモジュール88は、無関係なワークアイテムを含むスレッドは生成せず、SP84のALU92は、無関係なワークアイテムを実行するために占有されない。
【0065】
シーケンサモジュール72は、命令カリングを実施するためのカルバッファ76及びカルモジュール80を実装することができる。
図2では2つの個別のモジュールとして説明及び表されているが、カルバッファ76及びカルモジュール80は、同じコンポーネント内に実装することができる。さらに、幾つかの例により、カルバッファ76及びカルモジュール80は、個別のコンポーネントとして実装することができない。むしろ、幾つかの例では、カルバッファ76及びカルモジュール80は、GPU48のその他のコンポーネント内に組み入れることができる。例えば、カルバッファ76は、GPUメモリ64の1つのパーティションとして実装することができる。他の例では、カルバッファ76は、GPU48の外部のメモリであることができる。代替として又はさらに加えて、カルモジュール80に関して説明される命令カリング技法は、シーケンサモジュール72又はSP84内に組み入れることができる。
【0066】
カルバッファ76は、実行されたワークアイテムの特徴を表す1つ以上の値を格納することができる。その特徴は、後続するカーネルと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。例えば、GPU48は、2つのカーネルを有するアプリケーションを実行することができる。第1のカーネルを実行した後は、GPU48は、第1のカーネルの結果に基づいて、第2のカーネルのワークアイテムが関係があるかを表す1つ以上の値をカルバッファ80に格納することができる。
【0067】
カルバッファ76は、カルバッファ値を定義する入力を様々なソースから受信することができる。一例では、SP84のうちの1つ、例えば、SP84A、がワークアイテムを実行した後に、SP84Aは、実行されたワークアイテムの結果に基づいて1つ以上のカルバッファ値をカルバッファ76に直接書き込むことができる。他の例では、カルバッファ76は、上述されるように、プログラミング可能な又は固定された機能のハードウェアからカルバッファ値を受け取ることができる。
【0068】
幾つかの態様により、カルバッファ76は、ワークグループの特徴を表す1つ以上の値、及びそのワークグループ内の個々のワークアイテムの特徴を表す1つ以上の値を格納するように設計することができる。例えば、カルバッファ76は、所定のワークグループの全ワークアイテムが前に実行されたカーネルによって無関係になった場合は特定のワークグループの全ワークアイテムが無関係であることを表すワークグループカリング値を格納することができる。代替として又はさらに加えて、カルバッファ76は、所定のワークグループのワークアイテムの一部のみが前に実行されたカーネルによって無関係になったことを表す1つ以上のワークアイテムカリング値を格納することができる。従って、カルバッファ76に格納された値は、ワークグループレベル及びワークアイテムレベルの両方での特徴(例えば、命令の関係性)を決定するために使用することができる。
【0069】
カルバッファ76は、様々な異なる容量を有することができ、より大きい容量ほど追加の容量を提供する。一例では、カルバッファ76は、カーネルの各ワークアイテムのための単一の記憶ビットを含むことができる。この例では、単一の記憶ビットは、カーネルの各ワークアイテムの単一の特徴を表すバイナリ値を格納するために使用することができる。GPU48は、前に実行されたワークアイテムの結果に基づいてワークアイテムが関係があるか又は無関係であるかを特定するために単一の特徴を使用することができる。
【0070】
その他の例では、カルバッファ76は、カーネルの各ワークアイテムのために2つ以上の記憶ビットを含むことができる。例えば、カーネルの各ワークアイテムの様々な特徴を記述するために2つ以上の値をカルバッファ76に格納することができる。限定することを意味しない1つの画像処理例では、GPU48は、ピクセルデータの赤緑青(RGB)の特徴を決定するためにそのピクセルデータに基づいてワークアイテムを実行することができる。従って、カルバッファ76は、実行されたワークアイテムの赤、緑、及び青の成分に対応する3つの値を格納するのを可能にするストレージを含むことができる。この例では、GPU48及びカルモジュール80は、カルバッファ76に格納された値のうちのいずれかに基づいてワークアイテムをカリングすることができる。カルバッファ76のコンフィギュレーション(例えば、容量及び能力)は、アプリケーション及びGPUに依存することができることが理解されるべきである。例えば、幾つかのGPUは、相対的に大きい多機能カルバッファのために相対的に大きなメモリ量を提供するように設計することができる。その他のGPUは、該多様性を提供することはできない。従って、提供される例は、実装することができるカルバッファの唯一のコンフィギュレーションではないことが理解されるべきである。
【0071】
カルモジュール80は、カルバッファ76に格納された値にアクセスすること及びカルバッファ76に格納された値に基づいて無関係な命令をカリングすることを担当することができる。幾つかの例により、カルモジュール80は、シーケンサモジュール72が準備をしてSP84に命令を配分する前にカルバッファ76に格納された値にアクセスする。
図7に関してさらに詳細に説明されるように、カルモジュール80は、カルバッファ76に格納された値を読み取り、ワークアイテム及びワークグループの両方のレベルで命令をカリングすることができる。例えば、カルモジュール80は、カルバッファ76に格納された値を読み取り、ワークアイテムのワークグループ全体が無関係であることをそれらの値に基づいて決定することができる。カルモジュール80は、カルバッファ76に格納された値を読み取り、個々のワークアイテムが無関係であることをそれらの値に基づいて決定することもできる。カルモジュール80が無関係な命令をカリングした後は、シーケンサモジュール72は、残りの命令を準備してSP84に配分することができる。
【0072】
本開示の態様は、GPU48が同じ入力データを処理する2つ以上のカーネルを有するアプリケーションを実行時に無関係な命令をカリングするためにカルバッファ76及びカルモジュール80を利用することに関するものである。一例では、GPU48は、複数のカーネルを定義する命令及びデータをホストプロセッサ、例えば、
図1に示されるホストプロセッサ24、又はその他のコンピューティングユニットから受け取る。カーネルを受け取った時点で、シーケンサモジュール72は、SP84による処理のために第1のカーネルと関連付けられた命令及びデータを最初に準備することができる。例えば、シーケンサモジュール72は、第1のカーネルの命令を編成してワークアイテム及びワークグループにすることができる。
【0073】
ワークグループの格子を生成した時点で、シーケンサモジュール72のカルモジュール80は、命令カリングを行うべきかどうかを決定するためにカルバッファ76に問い合わせることができる。幾つかの例により、カルモジュール80は、命令の第1のカーネルに関しては命令カリングを行わず、その理由は、幾つかの例では、カルバッファ値は、実行された命令の結果に基づいて生成されるためである。従って、カルバッファ76は、第1のカーネルの実行前は空である。シーケンサモジュール72は、作業を進めて、第1のカーネルと関連付けられた命令(例えば、ワークグループ及びワークアイテム)をSP84に配分し、それが命令を実行する。
【0074】
SP84が第1のカーネルの命令を実行した後は、SP84は、カルバッファ76にカルバッファ値をポピュレートするか又はカルバッファ値を用いて更新する。例えば、SP84は、第1のカーネルの実行されたワークアイテムの特徴を表す1つ以上の値でカルバッファ76をポピュレートすることができる。その特徴は、次のカーネルと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。
【0075】
GPUは、第2のカーネルを実行することによって継続することができる。例えば、シーケンサモジュール72は、第2のカーネルと関連付けられたワークグループの1つ以上の格子を編成することによってSP84による処理のために第2のカーネルと関連付けられた命令及びデータを準備することができる。次に、カルモジュール80は、カリングのための命令を特定するためにカルバッファ76に問い合わせる。例えば、カルモジュール80は、カルバッファ76に格納された値を読み取り、命令がシーケンサモジュール72によってSP84に配分される前にそれらの命令をカリングすべきかどうかを決定する。幾つかの例では、カルモジュール80は、ワークアイテム及びワークグループの両方に基づいて命令をカリングする。カルモジュール80が命令カリングを完了した後は、シーケンサモジュール72は、SP84に命令を配分し、それは、命令を実行し、カルバッファ76の値を更新する。このプロセス例は、GPU48が全カーネルを実行するまで繰り返すことができる。
【0076】
図2に関して説明される例は、シーケンサモジュール72がカルバッファ76及びカルモジュール80を用いてすべての命令カリング(例えば、ワークアイテムのカリング及びワークグループのカリング)を実施することが対象である。しかしながら、GPU48のその他のモジュールが命令カリングを担当することができ、その他のモジュールがカルバッファ76と対話できることが理解されるべきである。一例により、シーケンサモジュール72は、ワークグループのカリングのみを担当することができ、SP84のスレッドセットアップモジュール88がワークアイテムのカリングを担当する。例えば、シーケンサモジュール72は、上述されるように、カルバッファ76及びカルモジュール80を用いてワークグループのカリングを行うことができる。ワークグループのカリングを行った後は、シーケンサモジュール76は、残りのワークグループ(例えば、カリング後に残っているワークグループ)をSP84に配分することができる。この例では、スレッドセットアップモジュール88が、ワークアイテムのカリングを担当することができる。例えば、ワークグループをシーケンサモジュール72から受け取った後に、スレッドセットアップモジュール88は、カルバッファ76を利用してワークアイテムのカリングを行うことができる。幾つかの態様により、スレッドセットアップモジュール88は、カルバッファ76を読み取り、カルバッファ76に格納された1つ以上の値に基づいてワークアイテムをカリングすべきかどうかを決定する。さらに、スレッドセットアップモジュール88は、カルバッファ76に格納されたカルバッファ値に基づいてALU92による実行のためのスレッドを編成する前に無関係なワークアイテムを取り除くことができる。
【0077】
幾つかの態様により、GPU48での命令カリングを可能にするために、GPU48は、命令カリングコマンドを有するアプリケーションを実行する。例えば、GPU48は、命令カリングコマンドを実行し、命令を実行したときに、GPU48は、結果、及び、その結果の特徴を表すカルバッファ76に格納するための1つ以上の値、の両方を生成する。GPU48は、カルモジュール80がカルバッファ76の値を読み取って命令カリングを行うのを可能にする命令カリングコマンドを実行することもできる。
【0078】
本開示の幾つかの態様は、ユーザ(例えば、コンピュータプログラマ)が命令カリングコマンドを有するアプリケーションを生成するのを可能にする1つ以上のAPIコマンドに関するものである。例えば、APIコマンドは、1つ以上のカルバッファ値を生成して指定されたカルバッファ、例えば、カルバッファ76、に格納するようにGPU48に命令するために使用することもできる。APIコマンドは、命令を編成してSP84に配分する前にカルバッファ値を解析すること及びそれらの値に基づいて命令カリングを実施することをGPU48に命令することもできる。例えば、APIコマンドは、カルバッファ値に基づいて関係がない命令がGPU48のSP84に配分されないようにそれらの命令を廃棄するようにGPU48に命令することができる。
【0079】
図3は、
図3ではワークグループ0として表される、ワークグループと関連付けられたワークアイテムの格子を例示したブロック図である。繰り返すと、各ワークアイテムは、GPUのSP、例えば、GPU48のSP84のうちの1つ、によって実行することができる個々の命令(例えば、作業の基本単位)に関連することができる。例示のみを目的として、
図3に示されるワークアイテムは、
図2に示されるGPU48例に関して説明される。
【0080】
ワークアイテム、例えば、
図3のワークグループ0内に示されるワークアイテム、は、SP84によって実行される前にスレッド(例えば、ALUによる効率的な実行を提供する構成において編成された1つ以上の命令)にすることができる。例えば、SP84のうちの1つ、例えば、SP84A、は、ワークグループ0をシーケンサモジュール72から受け取り、ワークグループ0と関連付けられたワークアイテムを用いてスレッドを生成することによってワークグループ0を実行のために準備することができる。
【0081】
幾つかの例により、SP84の効率は、スレッドになったワークアイテムの関係性によって影響を受けることがある。例えば、SP84の効率は、スレッドが無関係のワークアイテムを用いて生成され、及び、SP84が無関係のワークアイテムを実行することで占有されている場合に悪影響を受けることがある。幾つかの例では、前に実行された命令の結果に基づいて、マルチカーネルプログラムのワークグループが“スパース(希薄)”(sparse)になることがある。例えば、“スパースな”ワークグループは、1つ以上の無関係なワークアイテムによって分離された関係のあるワークアイテムを含むことがある。
図3に示される例では、ワークグループ0は、前に実行された命令によって幾つかのワークアイテムが無関係になった場合に“スパース”であるとみなすことができる。
【0082】
本開示の態様は、無関係なワークアイテムを特定し、それらの無関係なワークアイテムがスレッドとして編成される前に取り除くことに関するものである。幾つかの例では、ワークアイテムは、SP84に配分される前にカリングすることができる。例えば、カルモジュール80は、カルバッファ76に格納された値を利用し、ワークアイテムがSP84に配分される前にそのワークアイテムをカリングすべきかどうかを決定することができる。幾つかの例では、GPU48は、
図4に関して説明されるように、ワークアイテムのカリングを実施する前にワークグループのカリングを実施することができる。
【0083】
図4は、GPU,例えば、
図2に示されるGPU48、によって実行することができる3つのカーネル(例えば、第1のカーネル124、第2のカーネル128、及び第3のカーネル132)の配列のワークグループの格子を例示したブロック図である。繰り返すと、各カーネル124乃至132は、所定のアプリケーションに関連する特定の関数を実施するために実行することができる。幾つかの例では、カーネル124乃至132は、色補正アルゴリズム、顔検出アルゴリズム、顔認識アルゴリズム、拡張現実アプリケーション、様々なアルゴリズムアプリケーション(例えば、ウェーブレット変換、フーリエ変換、等)、又は様々なその他のアプリケーションのための関数を定義することができる。例示のみを目的として、
図4は、
図2に示されるGPU48例に関して説明される。
【0084】
図4に示されるワークグループの格子は、シーケンサモジュール72によって生成することができる。例えば、シーケンサモジュール72は、ホストプロセッサ、例えば、
図1に示されるホストプロセッサ24、又はGPUメモリ64から命令及びデータを受け取り、それらの命令を編成してワークグループの格子にすることによって実行のための準備をすることができる。幾つかの例では、各々のカーネル124乃至132のワークグループは、同じ入力データに関する。例えば、カーネル124のワークグループ0は、カーネル128のワークグループ0、及びカーネル132のワークグループ0と同じ入力データと関連付けられた命令を含む。さらに、GPU48は、カーネル124乃至132を連続して実行することができ、従って、カーネル124はカーネル128の前に実行され、カーネル128はカーネル132の前に実行される。
【0085】
本開示の幾つかの態様により、1つのカーネルの1つ以上のワークグループの結果が、他のカーネルのワークグループを無関係にすることがある。例えば、GPU48は、カーネル124のワークグループ0を実行し、カーネル124のワークグループ0の結果は、カーネル128のワークグループ0と関連付けられた命令を無関係にする。カーネル128のワークグループ0は、ワークグループ0と関連付けられた命令がカーネル124乃至132の基本的目標を促進させない場合に無関係であるとみなすことができる。例えば、画像処理アプリケーションの例では、カーネル124乃至132の1つの基本的な目標は、画像内の人間の顔を識別することである。
【0086】
本開示の態様は、無関係なワークグループを実行できるようになる前にカリングする、すなわち、取り除く、ために実装することができる。上述される例では、GPU48は、ワークグループ0をSP84に配分できるようになる前に無関係なワークグループ0を取り除くことができる。例えば、カルモジュール80は、ワークグループ0が無関係であると決定し、それをSP84に配分できるようになる前にワークグループ0をカリングするためにカルバッファ76に格納された値を利用することができる。
【0087】
既述のように、1つのアプリケーション専用の実装により、GPU48は、画像、例えば、
図5A乃至5Cに示される画像、に関して特定のタスクを実施するためにカーネル124乃至132を実行することができる。
【0088】
図5A乃至5Cは、3つのカーネル(例えば、
図5Aに示されるカーネル150、
図5Bに示されるカーネル158、及び
図5Cに示されるカーネル164)を用いて処理中の画像例146を示したブロック図である。例えば、カーネル150、158、及び164は、画像146と関連付けられた画像データを処理するための命令を各々含む。
図5A乃至5Cは、例示することのみを目的として、
図2に示されるGPU例48に関して説明される。
【0089】
図5A乃至5Cに示される例により、画像146は、1024のピクセルを含む、正方形の、約16メガバイト(MB)の画像である。各カーネル150、158、及び164は、画像の特定のピクセルに関連させることができるワークアイテム(例えば、相対的により小さいブロックとして表される)を含む。従って、GPU48がワークアイテムを実行するときには、そのワークアイテムと関連付けられた命令により画像146の対応するピクセルを処理(例えば、解析)することができる。
【0090】
各カーネル150、158、及び164は、画像146の特定のピクセルグループに関連する命令を含む(相対的により小さいブロックとして表される)ワークグループも含む。
図5A乃至5Cに関して説明されるピクセルデータ、ワークアイテム、及びワークグループの間の関係は、可能な命令構造の単なる一例であるにすぎない。その他の例では、ワークアイテムは、画像146の2つ以上又は1つ未満のピクセルと関連することができる。
【0091】
1つの限定しない例により、カーネル150、158、及び164は、画像146内の1つ以上の人間の顔を検出するための顔検出アプリケーションの一部として実装される。この例では、カーネル150、158、及び164は、人間の顔と関連付けられた幾つかの予め決定された特性(例えば、色、色調、飽和、輝度、又はその他の特性)を含むピクセルを識別するために実装される。GPU48は、カーネル150、158、及び164内で顔の候補ピクセルとして設定された全判定基準を満たす画像146のあらゆるピクセル又はピクセルグループを識別することができる。例えば、ピクセルがカーネル150の特徴を含まない場合は、カーネル158及びカーネル164内のそのピクセルに関連する命令は無関係になる。
【0092】
図5A乃至5Cに関して示されてより詳細に説明されるように、GPU48がカーネル150、158、及び164の各々を実行するのに従い、後続するカーネルと関連付けられた関係がある命令はより“スパース”になる。例えば、各カーネルが実行された後は、GPU48は、顔ピクセルの予め決定された特徴を含まないピクセルをより多く識別するため、後続するカーネルのより多くの命令が無関係になる。本開示の態様により、GPU48は、無関係な命令が実行のためにSP84に配分される前にそれらの無関係な命令を取り除くために命令カリングを実施することができる。このようにして、SP84が無関係な命令を実行するために占有されないため、GPU48の効率が向上される。
【0093】
図5Aは、画像146を処理するための第1のカーネル150を例示したブロック図である。
図5Aに示されるように、第1のカーネルは、ワークグループ154A乃至154P(総称して、ワークグループ154)を含み、それらは、各々、複数のワークアイテム156を含む。GPU48は、ワークグループ154A乃至154Pと関連付けられたすべてのワークアイテム156を実行することによって第1のカーネル150を実行することができる。例えば、GPU48は、ホストプロセッサ、例えば、
図1に示されるホストプロセッサ24、又は他のコンピューティングユニットから第1のカーネル150を受け取ることができる。第1のカーネル150を受け取った時点で、シーケンサモジュール72は、第1のカーネル150を編成してワークグループ154にすることができる。
【0094】
次に、シーケンサモジュール72は、作業進め、すべてのワークグループ154及びワークアイテム156をSP84に配分することができる。SP84は、ワークグループ154及び関連付けられたワークアイテム156を実行し、カルバッファ76に1つ以上のカバレッジ値をポピュレートする。カルバッファ値は、第1のカーネル150の実行されたワークアイテムの特徴を表すことができる。その特徴は、次のカーネルと関連付けられた後続命令が関係があるか又は無関係であるかを決定するために使用することができる。例えば、特定のワークアイテムの結果が、カーネル150の希望される予め定義された特性、例えば、予め定義された色、色調、飽和、輝度、又はその他の特性、を含まないことを示す場合は、命令を実行するのを担当するSPは、そのピクセルと関連付けられたワークアイテムが無関係であることを示す値をカルバッファ76に格納することができる。同じSPがワークグループ全体を実行するのを担当する場合は、SPは、ワークグループ全体と関連付けられたピクセルが無関係であることを示す値をカルバッファ76に格納することもできる。
図5Bに示されるように、GPU48がカーネル150を実行し、カルバッファ76にポピュレートした後は、GPU48は、カーネル158を実行することに進むことができる。
【0095】
図5Bは、本開示の態様による、第2のカーネル158に関する命令カリングを例示したブロック図である。本開示の幾つかの態様により、カリング前に、第2のカーネル158は、
図5Aに示されるワークグループ154A乃至154Pに対応するワークグループ160A乃至160P(総称してワークグループ160)を最初に含んでいる。さらに、カリング前に、ワークグループ160の各々は、
図5Aに示されるワークアイテム156に対応する、ワークアイテム162の完全な組を最初に含む。ワークグループ160及びワークアイテム162は、
図5Aに示される第1のカーネル150と同じ入力データ、すなわち、画像146、に基づいて実行することができる。
【0096】
図5Bに示される例では、GPU48は、第2のカーネル158からの無関係なワークグループ160及びワークアイテム162に関する命令カリングを実施する。例えば、第1のカーネル150を実行後は、GPU48は、カーネル150の予め決定された特性を含まない幾つかのピクセルを識別することができる。それらのピクセルと関連付けられた後続するワークグループ及びワークアイテムは、画像146内の顔を検出するのに無関係であるとみなすことができる。GPU48は、無関係のワークグループ及びワークアイテムに関する命令カリングを行うために使用することができる。
【0097】
本開示の幾つかの態様により、GPU48は、ワークアイテム及びワークグループの両方に基づいてカルバッファ76及びカルモジュール80を実装することによって命令をカリングする。例えば、第1のカーネル150を実行後は、GPU48は、ワークグループ154M乃至154Pの位置内のピクセルに関する後続する命令が無関係であると決定することができる。さらに、GPU48は、ワークグループ154H(
図5Aに示される)内の一定のピクセルに関する後続する命令が無関係であると決定することができる。従って、GPU48は、ワークグループ160M乃至160P及び一定のワークアイテム162と関連付けられたピクセルデータが無関係であることを示す値をカルバッファ76に格納する。カーネル158を実行した時点で、GPU48は、カルモジュール80を用いてワークグループ160M乃至160P及び一定のワークアイテム162をカリングすることができる。
【0098】
カルモジュール80が命令カリングを完了した後は、シーケンサモジュール72は、残りの命令を編成し、それらの命令をSP84に配分する。例えば、幾つかの態様により、SP84は、命令をALU92に並列して簡単に配分するのを可能にする形で編成される命令を受信するように構成され、GPUに依存することができる。従って、シーケンサモジュール72は、配分及び実行プロセスを最適化するために第2のカーネル158と関連付けられた命令を再編成することができる。
【0099】
カリングされた命令の組を受け取り後は、SP84がそれらの命令を実行する。さらに、SP84は、カルバッファ76内の値を更新することができる。例えば、特定のワークアイテム162の結果が、特定のワークアイテム162と関連付けられたピクセルがカーネル158の希望される予め定義された特性を含まないことを示す場合は、ワークアイテム162を実行するのを担当するSPは、そのピクセルと関連付けられた後続するワークアイテムが無関係であることを示す値をカルバッファ76に格納することができる。同じSPがワークグループ全体を実行するのを担当する場合は、SPは、ワークグループ全体と関連付けられたピクセルが無関係であることを示す値をカルバッファ76に格納することができる。
図5Cに示されるように、GPU48がカーネル158を実行してカルバッファ76にポピュレートした後は、GPU48は、カーネル164を実行するために進むことができる。
【0100】
図5Cは、本開示の態様による、第3のカーネル164に関する命令カリングを例示したブロック図である。本開示の幾つかの態様により、カリング前に、第3のカーネル164は、
図5Aに示されるワークグループ154A乃至154Pに対応するワークグループ166A乃至166P(総称してワークグループ166)を最初に含んでいる。さらに、カリング前に、ワークグループ166の各々は、
図5Aに示されるワークアイテム156に対応する、ワークアイテム168の完全な組を最初に含む。ワークグループ166及びワークアイテム168は、
図5Aに示される第1のカーネル150及び
図5Bに示される第2のカーネル150と同じ入力データ、すなわち、画像146、に基づいて実行される。
【0101】
図5Cに示されるように、GPU48は、第3のカーネル164を実行する前に命令カリングを実施し、GPU48のSP84による処理のための命令数をさらに減らすことができる。例えば、第2のカーネル158を実行した後は、GPU48は、ワークグループ158A、158B、158E、158I、及び158M乃至158Pの位置内のピクセルデータに関する後続命令は無関係であると決定することができる。さらに、GPU48は、ワークグループ158H(
図5Bに示される)内の幾つかのピクセルデータに関する後続命令は無関係であると決定することができる。従って、GPU48は、カルバッファ76内の値を更新し、ワークグループ166A、166B、166E、166I、及び166M乃至166P及び幾つかのワークアイテム168と関連付けられたピクセルデータが無関係であることを示す。
図5Bに関して説明されるように、カーネル164を実行した時点で、GPU48は、カルモジュール80を用いてワークグループ166A、166B、166E、166I、及び166M乃至166P及び幾つかのワークアイテム168をカリングし、残りの命令を実行することができる。
【0102】
図5A乃至5Cに示される例が示すように、命令カリングは、アプリケーションがその他を無関係にする命令を含むときにGPUにとっての計算数を大幅に減少させることができる。命令をカリングすることは、GPUが無関係の命令を配分及び実行することにリソースを投入する必要がないため、GPUの全体的な効率を向上させることができる。
【0103】
図5A乃至5Cは、概して、ワークアイテム及びワークグループの両方のレベルで命令をカリングするGPU48について説明する。しかしながら、その他の例では、GPU48は、ワークアイテムのカリング又はワークグループのカリングを行うことができる。さらに、
図5A乃至5Cは、カーネルに基づく命令カリングについても説明する。例えば、GPU48は、カーネルの全ワークグループ及び全ワークアイテムを実行後のみに命令をカリングすることができる。しかしながら、その他の例では、GPU48は、その他の間隔で命令カリングを実施することができる。幾つかの態様により、GPU48は、他の前に実行された命令に何らかの形で基づくことができる命令を実行する前の何時でも命令カリングを実施することができる。
【0104】
図6は、本開示の態様による、命令をカリングする方法200を例示したフローチャートである。幾つかの例では、方法200は、GPU、例えば、
図2に示されるGPU48、によって実施することができる。従って、方法200は、例示のみを目的として、
図2に示されるGPU例48によって実施されるとして説明される。
【0105】
本開示の態様により、GPU48は、1つ以上の命令を実行後に命令カリングを実施する。GPU48は、最初に、例えば、ホストプロセッサ、例えば、
図1に示されるホストプロセッサ24、から1つ以上の命令を受け取る。例えば、第1のワークアイテムを受け取り後は、GPU48は、その第1のワークアイテムを実行する(204)。幾つかの例では、GPU48は、シーケンサモジュール72を用いてSP84にワークアイテムを配分することによって第1のワークアイテムを実行することができる。SP84は、1つ以上のハードウェアスレッドを構築し、それらのハードウェアスレッドを実行のためにALUに配分することによってワークアイテムを実行することができる。
【0106】
第1のワークアイテムが実行された後は、GPU48は、1つ以上のカリング値を生成する(208)。カルバッファ値は、実行されたワークアイテムの特徴を表すことができる。幾つかの例では、その特徴は、第1のワークアイテムと同じ入力データと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。繰り返すと、ワークアイテムは、命令が組み込まれているアプリケーションの目標又は目的を促進させない場合に無関係であるとみなすことができる。例えば、画像処理関係、例えば、
図5A乃至5Cに関して説明される顔検出例、では、ワークアイテムは、画像内の顔を識別する目的を促進させない場合に無関係であるとみなすことができる。
【0107】
一例では、カルバッファ値は、後続するワークアイテムが関係があるか又は無関係であるかを表す単一のバイナリ値であることができる。その他の例では、単一のワークアイテムに関して2つ以上のカルバッファ値を格納することができる。例えば、単一のワークアイテムに関して2つ以上のカルバッファ値を格納することができ、各カルバッファ値は、実行されたワークアイテムの異なる特徴に対応する。限定しない画像処理例では、GPU48は、ピクセルデータに基づいてワークアイテムを実行してそのピクセルデータの赤緑青(RGB)の特徴を決定することができる。従って、実行されたワークアイテムの赤、緑、及び青の成分に対応する3つのカルバッファ値を格納することができる。この例では、GPU48及びカルモジュール80は、カルバッファ76に格納されたいずれかの値に基づいてワークアイテムをカリングすることができる。カルバッファ値を生成後は、GPU48は、1つ以上のカリング値でバッファ、例えば、カルバッファ76、をポピュレートすることができる(212)。
【0108】
次に、GPU48は、他のワークアイテムを受け取る(216)。幾つかの例では、第2のワークアイテムは、第1のワークアイテムに依存し、第1のワークアイテムと同じ入力データと関連付けられる。例えば、第2のワークアイテムは、第1のワークアイテムの結果がある1つの予め決定された値、又は複数の予め決定された値のうちの1つに従うと評価された場合のみに関係があることができる。第2のワークアイテムを受け取った時点で、GPU48は、第2のワークアイテムと関連付けられたカルバッファ値を解析することができる(220)。幾つかの態様により、GPU48は、第2のワークアイテムが同じ入力データに対応し、第1のワークアイテムに依存することをGPU48が識別することができるようにカルバッファ値をインデキシングする。従って、GPU48は、カルバッファ値に基づいて第2のワークアイテムを実行すべきかどうかを決定することができる(224)。
【0109】
幾つかの例により、GPU48は、カルバッファ値に基づいて第2のワークアイテムは関係があると決定した場合に第2のワークアイテムを実行することができる(228)。第2のワークアイテムを実行後は、GPU48は、第2のワークアイテムの結果の特徴を表すカリング値を生成することによってプロセスを繰り返すのを開始することができる(ステップ208)。代替として、GPU48は、カルバッファ値に基づいて第2のワークアイテムが無関係であると決定した場合は第2のワークアイテムを実行することができず、第2のワークアイテムを廃棄することができる(232)。GPU48が第2のワークアイテムを実行しない場合は、GPU48は、次のワークアイテムを受け取ることに直接進むことができる(216)。
【0110】
図6の方法は、ワークアイテムに基づく命令カリングについて説明する。例えば、ワークアイテムは個々に実行されるとして説明され、カリング値は個々に生成されるとして説明され、以下同様である。しかしながら、実際上は、GPUは、2つ以上の命令を並列して実行できることが理解されるべきである。従って、2つ以上の値をカルバッファ76に実質的に同時並行して書き込むことができる。さらに、GPUは、新しい命令に関連する2つ以上のカルバッファ値を実質的に同時並行して解析することができる。
図5A乃至5Cに関して説明されるように、幾つかの例では、GPU48は、幾つかの命令を実行後に(例えば、命令のカーネルを実行後に)命令カリングを実施することができ、及び、個々のワークアイテム又はグループ(例えば、ワークグループ)に基づいて命令カリングを実施することができる。
【0111】
図7は、本開示の態様による、命令をカリングするために実装することができる命令の流れ250を例示したフローチャートである。幾つかの例では、命令の流れ250は、GPU,例えば、
図2に示されるGPU48、によって実装することができる。従って、命令の流れ250は、例示のみを目的として、
図2に示されるGPU例48によって実装されるとして説明される。
図7は、ワークグループ及びワークアイテムの両方に基づく命令カリングを示す。しかしながら、GPU、例えば、GPU48、は、ワークグループのみに基づいて、又はワークアイテムのみに基づいて命令カリングを実施できることが理解されるべきである。
【0112】
本開示の態様により、GPU48は、命令を受け取り、それらの命令を編成して1つ以上のワークグループにする(254)。幾つかの例では、GPU48は、命令を編成してワークグループの1つ以上の格子、例えば、
図4に示されるワークグループの格子、にすることができる。命令が編成されてワークグループになった後は、GPU48は、ワークグループのカリングを実施する(258)。例えば、GPU48は、カルバッファ76に格納された値を解析し、それらの値を現在のワークグループの組に関連づけることによってワークグループのカリングを実施することができる。GPU48は、無関係の命令のみから成るとしてGPU48が特定したあらゆるワークグループをカリングすることができる。ワークグループをカリング後は、GPU48は、ワークグループを実行のためにセットアップすることができる(262)。例えば、GPU48は、残りのワークグループを再編成し、それらのワークグループをSP84に配分するのを可能にする構成にすることができる。
【0113】
幾つかの例では、GPU48は、ワークアイテムのカリングを実施する(266)。GPU48は、ワークグループに基づいてワークアイテムのカリングを実施することができる。例えば、GPU48は、カルバッファ76に格納された値を解析し、一度に1つのワークグループごとに、それらの値をワークグループのワークアイテムに関連させることができる。GPU48は、GPU48が(例えば、カルバッファ値により)無関係であるとして特定したあらゆるワークアイテムをカリングすることができる。ワークアイテムをカリング後は、GPU48は、ワークグループを実行のためにセットアップすることができる(270)。例えば、GPU48は、残りのワークアイテムを再編成し、ワークグループをスレッドとして構築してSP84によって実行するのを可能にする構成にすることができる。
【0114】
次に、GPU48は、1つ以上のワークグループ及び関連付けられたワークアイテムを実行することができる(274)。命令を実行後は、GPU48は、後続するワークグループ及びワークアイテムをカリングするために値を更新することができる(278)。例えば、GPU48は、実行された命令の結果の特徴を表す値を用いてカルバッファ76を更新することができる。
【0115】
本開示の技法は、概して、2つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第1のカーネルのワークアイテム及びワークグループを実行した時点で、GPUは、第2のカーネルのワークアイテム及びワークグループが関係があるかどうかを表すカルバッファ値を設定することができる。すなわち、GPUは、第1のカーネルの各々のワークアイテム及びワークグループの同じ入力データと関連付けられた第2のカーネルの各々のワークアイテム及びワークグループが関係があるかどうかを表すカルバッファ値を第1のカーネルの結果に基づいて設定することができる。従って、第1のカーネルを実行後は、GPU48は、カルバッファ値を利用し、第2のカーネル内の無関係なワークアイテム及びワークグループが実行されないようにそれらの無関係なワークアイテム及びワークグループをカリングすることができる。
【0116】
従って、本開示の態様は、概して、命令カリングに関するものである。上記の図に関して説明される例及び態様は、例として提供されるにすぎないことが理解されるべきである。本開示の態様は、その他の命令カリング実施方法にも関するものである。例えば、命令カリングは、すべてGPUによって実施されるものとして説明される一方で、他の例では、命令は、コンピューティングコンポーネント又はコンピューティングデバイスの組み合わせによって実行することができる。一例では、カルモジュール及びカルバッファ、例えば、
図2に示されるカルモジュール80及びカルバッファ76、は、GPUの外部のコンポーネント内に実装することができる。この例では、中央処理装置又はホストプロセッサが、命令をGPUに提供する前にカルバッファにアクセスして命令カリングを実装することができる。
【0117】
さらに、本開示の態様は、概して、無関係のワークアイテム及びワークグループが実行される前にそれらをカリングすることに関するものであることが理解されるべきである。上述されるように、用語“ワークアイテム”は、概して、入力データを処理するための機能を定義する1つ以上の命令を意味し、1つ以上の個々の命令を含むことができる。用語“ワークアイテム”は、幾つかのアーキテクチャでは“スレッド”と呼ばれることもある。さらに、用語“ワークグループ”は、概して、予め定義されたワークアイテムのグループを意味する。“ワークグループ”は、幾つかのアーキテクチャでは“スレッドブロック”と呼ばれることもある。
【0118】
1つ以上の例では、説明される機能は、ハードウェア、ハードウェアで実行されるソフトウェア、ハードウェアで実行されるファームウェア、又はそれらのあらゆる組み合わせにおいて実装することができる。幾つかの例では、コンピュータによって読み取り可能な媒体に格納された命令は、上述される各々の機能を実施することをハードウェアコンポーネントに行わせることができる。コンピュータによって読み取り可能な媒体は、コンピュータデータ記憶媒体を含むことができる。データ記憶媒体は、本開示において説明される技法の実装のために命令、コード及び/又はデータ構造を取り出すために1つ以上のコンピュータ又は1つ以上のプロセッサによってアクセスすることができるあらゆる利用可能な媒体であることができる。一例として、ただし限定せずに、該コンピュータによって読み取り可能な媒体は、RAM、ROM、EEPROM、CD−ROM又はその他の光学ディスク記憶装置、磁気ディスク記憶装置又はその他の磁気記憶装置、フラッシュメモリ、又は、希望されるプログラムコードを命令又はデータ構造の形態で搬送又は格納するために用いることができ及びコンピュータによってアクセス可能なあらゆるその他の媒体、を備えることができる。上記の組み合わせも、コンピュータによって読み取り可能な媒体の適用範囲内に含められるべきである。
【0119】
コードは、1つ以上のプロセッサ、例えば、1つ以上のDSP、汎用マイクロプロセッサ、ASIC、FPGA、その他の同等の集積回路又はディスクリート論理回路、によって実行することができる。従って、用語“プロセッサ”は、ここで使用される場合は、上記の構造又はここにおいて説明される技法の実装に適したあらゆるその他の構造のうちのいずれかを指すことができる。さらに、幾つかの態様では、ここにおいて説明される機能は、符号化及び復号のために構成される専用のハードウェア及び/又はソフトウェアモジュール内で提供すること、又は結合されたコーデック内に組み入れることができる。さらに、技法は、1つ以上の回路又は論理素子において完全に実装することが可能である。
【0120】
本開示の技法は、無線ハンドセット、集積回路(IC)又はICセット(例えば、チップセット)を含む非常に様々なデバイス又は装置内に実装することができる。本開示では、開示される技法を実施するように構成されたデバイスの機能上の態様を強調するために様々なコンポーネント、モジュール、又はユニットが説明されているが、異なるハードウェアによる実現は必ずしも要求していない。むしろ、上述されるように、様々なユニットを、適切なソフトウェア及び/又はファームウェアと関連させて、上述される1つ以上のプロセッサを含む相互運用的なハードウェアユニットの集合によって結合させることができる。
【0121】
本開示の様々な例及び態様が説明されている。これらの及びその他の例及び態様は、以下の請求項の範囲内にある。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[C1] グラフィックス処理ユニット(GPU)を用いてデータを処理する方法であって、
前記GPUのシェーダプロセッサによって第1のワークアイテムを実行することであって、前記第1のワークアイテムは、入力データを処理するための1つ以上の命令を含むことと、
前記第1のワークアイテムの結果に基づいて1つ以上の値を生成することであって、前記1つ以上の値は、前記結果の1つ以上の特徴を表すことと、
前記1つ以上の値に基づいて第2のワークアイテムを実行すべきかどうかを決定することであって、前記第2のワークアイテムは、前記入力データを処理するための前記第1のワークアイテムの前記1つ以上の命令と別個である1つ以上の命令を含むことと、を備える、方法。
[C2] 前記第2のワークアイテムを前記決定に基づいて命令ストリームから取り除くことをさらに備えるC1に記載の方法。
[C3] 前記第2のワークアイテムを前記命令ストリームから取り除くことは、前記第2のワークアイテムが前記シェーダプロセッサによって実行されるようにスケジューリングする前に前記第2のワークアイテムを取り除くことをさらに備えるC2に記載の方法。
[C4] 前記第1のワークアイテムの前記結果に基づく前記1つ以上の値をバッファに格納することをさらに備えるC1に記載の方法。
[C5] 前記第2のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記1つ以上の値を読み取ることをさらに備えるC4に記載の方法。
[C6] 前記GPUの前記シェーダプロセッサによって第3のワークアイテムを実行することであって、前記第3のワークアイテムは、前記入力データを処理するための1つ以上の命令を含むことと、
前記第3のワークアイテムの結果に基づいて1つ以上の値を生成することであって、前記1つ以上の値は、前記結果の1つ以上の特徴を表すことと、
前記第3のワークアイテムの前記結果に基づいて前記バッファに格納された前記1つ以上の値を更新することと、
前記1つ以上の値に基づいて第4のワークアイテムを実行すべきかどうかを決定することと、をさらに備えるC4に記載の方法。
[C7] 前記1つ以上の値は、前記第2のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第2のワークアイテムの前記結果が関係があるデータを含まない場合は前記第2のワークアイテムを実行しないことを決定するC1に記載の方法。
[C8] 前記第1のワークアイテムは、アプリケーションの第1のカーネルと関連付けられ、前記第2のワークアイテムは、前記アプリケーションの第2のカーネルと関連付けられ、前記第1のワークアイテム及び前記第2のワークアイテムは、前記入力データを処理するように構成されるC1に記載の方法。
[C9] 前記GPUの前記シェーダプロセッサによって第1のワークグループを実行することであって、前記第1のワークグループは、アプリケーションの第1のカーネルと関連付けられ、前記第1のワークグループは、入力データを処理するための前記第1のワークアイテムを含む複数の命令を備えることと、
前記第1のワークグループの結果に基づいて1つ以上の値を生成することであって、前記1つ以上の値は、前記結果の1つ以上の特徴を表すことと、
前記1つ以上の値に基づいて第2のワークグループを実行すべきかどうかを決定することであって、前記第2のワークグループは、前記アプリケーションの第2のカーネルと関連付けられ、前記第2のワークグループは、前記入力データを処理するための前記第2のワークアイテムを含む複数の命令を備えることと、をさらに備えるC1に記載の方法。
[C10] グラフィックス処理ユニット(GPU)を用いてデータを処理するための装置であって、
入力データを処理するための1つ以上の命令を含む第1のワークアイテムを実行し、及び前記第1の命令の結果に基づいて1つ以上の値を生成するように構成されたシェーダプロセッサであって、前記1つ以上の値は、前記結果の1つ以上の特徴を表すシェーダプロセッサと、
前記1つ以上の値に基づいて前記第1のワークアイテムの前記1つ以上の命令と別個である1つ以上の命令を含む第2のワークアイテムを実行すべきかどうかを決定するように構成されたカルモジュールと、を備える、装置。
[C11] 前記カルモジュールは、前記決定に基づいて前記第2のワークアイテムを命令ストリームから取り除くようにさらに構成されるC10に記載の装置。
[C12] 前記カルモジュールは、前記第2のワークアイテムが前記シェーダプロセッサによって実行されるようにスケジューリングする前に前記第2のワークアイテムを前記命令ストリームから取り除くようにさらに構成されるC11に記載の装置。
[C13] 前記第1のワークアイテムの前記結果に基づく前記1つ以上の値を格納するように構成されたカルバッファをさらに備えるC10に記載の装置
[C14] 前記カルモジュールは、前記カルバッファに格納された前記1つ以上の値を読み取ることによって前記第2のワークアイテムを実行すべきかどうかを決定するように構成されるC13に記載の装置。
[C15] 前記シェーダプロセッサは、第3のワークアイテムを実行し、前記第3のワークアイテムの結果に基づいて1つ以上の値を生成し、及び前記第3のワークアイテムの前記結果に基づいて前記カルバッファに格納された前記1つ以上の値を更新するようにさらに構成され、前記第3のワークアイテムは、前記入力データを処理するための1つ以上の命令を含み、前記1つ以上の値は、前記結果の1つ以上の特徴を表し、前記カルモジュールは、前記1つ以上の値に基づいて第4のワークアイテムを実行すべきかどうかを決定するようにさらに構成されるC13に記載の方法。
[C16] 前記1つ以上の値は、前記第2のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記カルモジュールは、前記第2のワークアイテムの前記結果が関係があるデータを含まない場合は前記第2のワークアイテムを実行しないことを決定するように構成されるC10に記載の装置。
[C17] 前記第1のワークアイテムは、アプリケーションの第1のカーネルと関連付けられ、前記第2のワークアイテムは、前記アプリケーションの第2のカーネルと関連付けられ、前記第1のワークアイテム及び前記第2のワークアイテムは、前記入力データを処理するように構成されるC10に記載の装置。
[C18] 第1のカーネルと関連付けられた第1のワークグループをさらに備え、前記第1のワークグループは、前記第1のワークアイテムと、第2のカーネルと関連付けられた第2のワークグループとを含む複数の命令を備え、前記第2のワークグループは、前記第2のワークアイテムを含む複数の命令を備え、前記シェーダプロセッサは、前記第1のワークグループを実行し及び前記第1のワークグループの結果に基づいて1つ以上の値を生成するようにさらに構成され、前記1つ以上の値は、前記結果の1つ以上の特徴を表し、前記カルモジュールは、前記1つ以上の値に基づいて前記第2のワークグループを実行すべきかどうかを決定するようにさらに構成されるC10に記載の装置。
[C19] 前記シェーダプロセッサ及びカルモジュールは、ボータブルなコンピューティングデバイスに含められるC10に記載の装置。
[C20] 第1のワークアイテムを実行し、
前記第1のワークアイテムの結果に基づいて1つ以上の値を生成し、及び
前記1つ以上の値に基づいて第2のワークアイテムを実行すべきかどうかを決定することをコンピューティングデバイスの1つ以上のプログラミング可能なプロセッサに行わせるための命令を用いて符号化されたコンピュータによって読み取り可能な記憶媒体であって、前記第1のワークアイテムは、入力データを処理するための1つ以上の命令を含み、前記1つ以上の値は、前記結果の1つ以上の特徴を表し、前記第2のワークアイテムは、前記入力データを処理するための前記第1のワークアイテムと別個の1つ以上の命令を含む、コンピュータによって読み取り可能な記憶媒体。
[C21] 前記決定に基づいて前記第2のワークアイテムを命令ストリームから取り除くことを前記コンピューティングデバイスの1つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備えるC20に記載のコンピュータによって読み取り可能な記憶媒体。
[C22] 前記第2のワークアイテムを前記命令ストリームから取り除くことは、前記第2のワークアイテムが実行されるようにスケジューリングする前に前記第2のワークアイテムを取り除くことをさらに備えるC21に記載のコンピュータによって読み取り可能な記憶媒体。
[C23] 前記第1のワークアイテムの前記結果に基づく前記1つ以上の値をバッファに格納することを前記コンピューティングデバイスの1つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備えるC20に記載のコンピュータによって読み取り可能な記憶媒体。
[C24] 前記第2のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記1つ以上の値を読み取ることをさらに備えるC23に記載のコンピュータによって読み取り可能な記憶媒体。
[C25] 第3の命令を実行し、
前記第3のワークアイテムの結果に基づいて1つ以上の値を生成し、
前記第3のワークアイテムの前記結果に基づいて前記バッファに格納された前記1つ以上の値を更新し、及び
前記1つ以上の値に基づいて第4のワークアイテムを実行すべきかどうかを決定することを前記コンピューティングデバイスの1つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備え、前記第3のワークアイテムは、入力データを処理するための1つ以上の命令を含み、前記1つ以上の値は、前記結果の1つ以上の特徴を表すC23に記載のコンピュータによって読み取り可能な記憶媒体。
[C26] 前記1つ以上の値は、前記第2のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第2のワークアイテムの前記結果が関係があるデータを含まない場合は前記第2のワークアイテムを実行しないことを決定するC20に記載のコンピュータによって読み取り可能な記憶媒体。
[C27] 前記第1のワークアイテムは、アプリケーションの第1のカーネルと関連付けられ、前記第2のワークアイテムは、前記アプリケーションの第2のカーネルと関連付けられ、前記第1のワークアイテム及び前記第2のワークアイテムは、前記入力データを処理するように構成されるC20に記載のコンピュータによって読み取り可能な記憶媒体。
[C28] 前記GPUの前記シェーダプロセッサによって第1のワークグループを実行し、
前記第1のワークグループの結果に基づいて1つ以上の値を生成し、及び
前記1つ以上の値に基づいて第2のワークグループを実行すべきかどうかを決定することを前記コンピューティングデバイスの1つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備え、前記第1のワークグループは、アプリケーションの第1のカーネルと関連付けられ、前記第1のワークグループは、入力データを処理するための前記第1のワークアイテムを含む複数の命令を備え、前記1つ以上の値は、前記結果の1つ以上の特徴を表し、前記第2のワークグループは、前記アプリケーションの第2のカーネルと関連付けられ、前記第2のワークグループは、前記入力データを処理するための前記第2のワークアイテムを含む複数の命令を備えるC27に記載のコンピュータによって読み取り可能な記憶媒体。
[C29] グラフィックス処理ユニット(GPU)を用いてデータを処理するための装置であって、
第1のワークアイテムを実行するための手段であって、前記第1のワークアイテムは、入力データを処理するための1つ以上の命令を含む手段と、
前記第1のワークアイテムの結果に基づいて1つ以上の値を生成するための手段であって、前記1つ以上の値は、前記結果の1つ以上の特徴を表す手段と、
前記1つ以上の値に基づいて第2のワークアイテムを実行すべきかどうかを決定するための手段であって、前記第2のワークアイテムは、前記入力データを処理するための前記第1のワークアイテムと別個の1つ以上の命令を含む手段と、を備える、装置。
[C30] 前記決定に基づいて前記第2のワークアイテムを命令ストリームから取り除くための手段をさらに備えるC29に記載の方法。
[C31] 前記第2のワークアイテムを前記命令ストリームから取り除くことは、前記第2のワークアイテムが実行されるようにスケジューリングする前に前記第2のワークアイテムを取り除くことをさらに備えるC30に記載の方法。
[C32] 前記第1のワークアイテムの前記結果に基づく前記1つ以上の値をバッファに格納するための手段をさらに備えるC29に記載の方法。
[C33] 前記第2のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記1つ以上の値を読み取ることをさらに備えるC32に記載の方法。
[C34] 第3のワークアイテムを実行するための手段であって、前記第3のワークアイテムは、前記入力データを処理するための1つ以上の命令を含む手段と、
前記第3のワークアイテムの結果に基づいて1つ以上の値を生成するための手段であって、前記1つ以上の値は、前記結果の1つ以上の特徴を表す手段と、
前記第3のワークアイテムの前記結果に基づいて前記バッファに格納された前記1つ以上の値を更新するための手段と、
前記1つ以上の値に基づいて第4のワークアイテムを実行すべきかどうかを決定するための手段であって、前記第4のワークアイテムは、前記入力データを処理するための1つ以上の命令を含む手段と、をさらに備えるC32に記載の方法。
[C35] 前記1つ以上の値は、前記第2のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第2のワークアイテムの前記結果が関係があるデータを含まない場合は前記第2のワークアイテムを実行しないことを決定するC29に記載の方法。
[C36] 前記第1のワークアイテムは、アプリケーションの第1のカーネルと関連付けられ、前記第2のワークアイテムは、前記アプリケーションの第2のカーネルと関連付けられ、前記第1のワークアイテム及び前記第2のワークアイテムは、前記入力データを処理するように構成されるC29に記載の方法。
[C37] 前記GPUの前記シェーダプロセッサによって第1のワークグループを実行するための手段であって、前記第1のワークグループは、アプリケーションの第1のカーネルと関連付けられ、前記第1のワークグループは、入力データを処理するための前記第1のワークアイテムを含む複数の命令を備える手段と、
前記第1のワークグループの結果に基づいて1つ以上の値を生成するための手段であって、前記1つ以上の値は、前記結果の1つ以上の特徴を表す手段と、
前記1つ以上の値に基づいて第2のワークグループを実行すべきかどうかを決定するための手段であって、前記第2のワークグループは、前記アプリケーションの第2のカーネルと関連付けられ、前記第2のワークグループは、前記入力データを処理するための前記第2のワークアイテムを含む複数の命令を備える手段と、をさらに備えるC29に記載の方法。