グラフィックス処理ユニット(GPU)は、データを並列で素早くかつ効率的に処理するように構成することができる。開発者は、GPU上で実行するアプリケーションの形でデータ処理アルゴリズムを開発することができる。例えば、GPUは、1つ以上のアプリケーションを実行するように構成されるシェーダプロセッサを含むことができる。これらのアプリケーションの例は、シェーダプログラム、例えば、バーテックスシェーダ(vertex shader)(頂点シェーダ)、ハルシェーダ(hull shader)、フラグメントシェーダ(fragment shader)、幾何シェーダ(geometry shader)、及びグラフィックス処理に関連するその他の該アプリケーション、を含む。
さらに、幾つかのアプリケーション開発者は、GPUの大規模な並列性を利用し、グラフィックスに関連しないアプリケーションをGPUで実行するのが有益であるとみなすであろう。例えば、GPUによって提供される処理の並列性は、並列行列演算がグラフィックス処理に関連していないときでさえも、それらの行列演算を実行するのに適することができる。グラフィックスに関連しないアプリケーションのその他の例は、並列演算の素早い実行が有益であることができる流体力学又は線形代数に関連する技法を含む。
該グラフィックスに関連しないアプリケーションを実行することが可能なGPUは、汎用GPU(GPGPU)であるとみなすことができる。例えば、GPUがグラフィックスに関連しないアプリケーションを実行中であるときには、GPUは、GPGPUとして機能している。ほとんどのGPUは、GPGPUとして機能するように構成することができる。
例示を目的として、本開示は、GPGPUとして機能しているGPUに関して技法を説明する。しかしながら、それらの技法は、GPUがGPGPUとして機能している(すなわち、グラフィックスに関連しないアプリケーションを実行している)事例には限定されず、それらの技法は、GPUがグラフィックス関連のアプリケーションを実行している事例にも適用することができる。さらに、本開示において説明される技法は、あらゆるタイプの処理ユニット、例えば、中央処理装置(CPU)、アクセラレータ、又はその他のカスタムデバイスによって実装することができる。それらの技法は、GPUに関して説明されが、それらの技法は、その他のタイプの処理ユニットにも拡張可能であることが理解されるべきである。
GPU内のシェーダプロセッサは、複数のシェーダコア(これらのコアはグラフィックス関連及びグラフィックスに関連しない、の両方のアプリケーションに関する命令を実行できることを示すためにプログラマブル計算ユニットとも呼ばれる)を含むことができる。プログラマブル計算ユニットの各々は、そのプログラマブル計算ユニットによって実行される命令に関して予約されているローカルメモリ、及びそれらの命令の実行によって生成されたデータ、例えば、命令の実行中に生成される即座の結果、を含むことができる。プログラマブル計算ユニットのローカルメモリは、その他のプログラマブル計算ユニットによってはアクセス不能であることができる。幾つかの例では、GPUで実行されるべき異なるアプリケーションは、異なるプログラマブル計算ユニットによって実行することができる。
本開示において説明される技法では、グラフィックス関連のアプリケーションはシェーダと呼ばれ、グラフィックスに関連しないアプリケーションは、カーネルと呼ばれる。例えば、シェーダ(すなわち、グラフィックス関連のアプリケーション)の例は、バーテックスシェーダと、フラグメントシェーダと、幾何シェーダと、含み、ただしこれらに限定されない。カーネル(すなわち、グラフィックスに関連しないアプリケーション)の例は、行列演算、流体力学、画像処理動作、映像処理動作、等を行うためのアプリケーションを含む。
さらに、カーネルは、GPUによって実行されるアプリケーションのみに必ずしも限定する必要はなく、GPUの固定機能ユニット(fixed−function unit)(すなわち、プログラミング不能なユニット)も含む。例示のみを目的として、本開示において説明される技法は、GPUで実行されるアプリケーションであるカーネルに関して説明される。例えば、それらの技法は、GPUがGPGPUとして機能するためにGPUのシェーダプロセッサで実行するグラフィックスに関連しないアプリケーションに関して説明される。
カーネルは、複数のワークグループ、タスク、又はスレッドを含むことができる(これらはすべて、本開示では同義語として用いられる)。例えば、スレッドは、カーネルのその他のスレッドから独立して実行することができるカーネルの命令の組であることができる。幾つかの例では、カーネルを実行するためには、プログラマブル計算ユニットのうちの1つ以上がカーネルの1つ以上のスレッドを各々実行することができる。例えば、第1のプログラマブル計算ユニットは、カーネルの第1のスレッドを実行することができ、第2のプログラマブル計算ユニットは、同じカーネルの第2のスレッドを実行することができる。幾つかの例では、1つのプログラマブル計算ユニットが1つのカーネルの1つ以上のスレッドを実行することができ、他のプログラマブル計算ユニットは、他のカーネルの1つ以上のスレッドを実行する。幾つかの例では、2つの組み合わせが可能である(すなわち、幾つかのプログラマブル計算ユニットが同じカーネルの異なるスレッドを実行中であり、他方、幾つかのその他のプログラマブル計算ユニットが異なるカーネルのスレッドを実行中である)。
GPUは、大規模な並列性を処理のために提供する一方で、開発者、例えば、カーネルの開発者、は、様々なタイプのGPUにおいてパイプライン方式で効率的に実行するカーネルを開発するのは困難であるとみなすであろう。パイプライン方式でカーネルを実行することは、1つのカーネルによって生成されたデータが他のカーネルによって消費されるような形でカーネルを実行することを意味する。他の例として、パイプライン方式でカーネルを実行することは、同じカーネルの他のスレッドによって消費されるべきデータを生成するカーネルのスレッドを実行することを意味する。この開示では、データを生成するスレッドは、生成するスレッド(producer thread)と呼ぶことができ、データを受信するスレッドは、消費するスレッド(comsumer thread)と呼ぶことができる。
幾つかの例では、生成するスレッド及び消費するスレッドは、同じカーネルのスレッドであることができる。幾つかの例では、生成するスレッド及び消費するスレッドは、異なるカーネルのスレッドであることができる。これらの例では、生成するスレッドを含むカーネルは生成するカーネルと呼ぶことができ、消費するスレッドを含むカーネルは消費するカーネルと呼ぶことができる。
一例として、データ処理アルゴリズム、例えば、画像処理又は映像処理、を実装するために、開発者は、複数のカーネルを開発することができ、各カーネルは、全体的アルゴリズムの一部分を実装する。第1のカーネルは、第2のカーネルによる消費のために処理されるべきデータ(例えば、グラフィックスに関連しないデータ)を受信し、データを処理し、及びデータを出力することができる。第2のカーネルは、第3のカーネルによる消費のために第1のカーネルによって出力されたデータを受信し、データをさらに処理し、データを出力し、以下同様である。
この例では、第1、第2、及び第3のカーネルがパイプラインを形成すると考えることができ、第1のカーネル(例えば、生成するカーネル)は、第2のカーネル(例えば、第1のカーネルの観点からの消費するカーネル)によって消費されるべきデータを生成する。第2のカーネルは、第3のカーネルによって消費されるべきデータを生成する。この例では、第2のカーネルは、第3のカーネルの観点からの生成するカーネルであり、第3のカーネルは、消費するカーネルである。この方法により、GPUは、パイプライン方式で第1、第2、及び第3のカーネルを実行することができる。
幾つかの例では、パイプライン方式でカーネルを実行することは、カーネルを逐次に実行する(例えば、第1のカーネルを実行し、第2のカーネルを実行することによって後続され、第3のカーネルを実行することによって後続され、以下同様である)ことを意味することができる。しかしながら、本開示において説明される技法は、そのようには限定されない。幾つかの例では、パイプライン方式でカーネルを実行することは、並列して(同時に又は時間が重なる状態で)カーネルを実行することを意味することができる。例えば、GPUは、第2のカーネルが第1のカーネルに関する消費するカーネルであり、第3のカーネルが第2のカーネルに関する消費するカーネルである場合でも第1、第2、及び第3のカーネルのうちの2つ以上を同時に実行することができる。
開発者は、データ処理アルゴリズムを実装するためにパイプライン方式で実行するカーネルを開発することができるが、開発者は、様々なタイプのGPUにまたがってカーネルの最適な実行を保証することはできないであろう。例えば、開発者は、プロセッサで実行する命令を書くことができる。これらの命令は、いつカーネルを実行すべきかをGPUに命令することをプロセッサに行わせることができる。上述されるように、カーネルは、1つ以上の計算ユニットで実行することができる。しかしながら、開発者は、特定のCPUIで利用可能な計算ユニットの数、より一般的には、特定のGPUの並列処理能力、を知らないことがある。
この場合は、開発者は、GPUの処理能力を開発者が知らないため、いつカーネルを実行すべきかを予め決定することができないことがある。この結果、開発者は、各々が異なるタイプのGPU専用の異なる命令を書くことになる。例えば、開発者は、第1のGPUタイプ専用の、プロセッサで実行する命令の第1の組を書くことができる。例えば、第1のGPUタイプが3つの計算ユニットを含む場合は、命令の第1の組は、3つの計算ユニットを有するGPUでカーネルを実行することができる方法を定義することができる。開発者は、第2のGPUタイプ専用の、プロセッサで実行する、命令の第2の組も書くことができる。例えば、第2のGPUタイプが4つの計算ユニットを含む場合は、命令の第2の組は、4つの計算ユニットを有するGPUでカーネルを実行することができる方法を定義することができる。
幾つかの例では、異なるGPUタイプに関する命令を書くのではなく、開発者は、1つのみのタイプのGPU(例えば、推定される最悪の事態のシナリオでのGPU)に関する命令を書くことができる。これらの例では、1つのタイプのみのGPUがデータ処理アルゴリズムを効率的に実装することができ、その他のGPUタイプは、データ処理アルゴリズムを効率的に実装することができない。
換言すると、開発者がGPUで効率的な方法で実行することをカーネルに行わせる命令を書くことができるプラットフォームから独立した方法は存在することができない。むしろ、開発者は、その他のGPUタイプで非効率的に実行する(例えば、GPUタイプに依存しない)一般的命令を書くことができる。他方、開発者は、結果的には非ポータブルな(non−portable)命令になるプラットフォームに依存する命令を書くことができる。例えば、開発者は、異なるGPUタイプの各々に関して別々の命令を書かなければならないことがあり、それは過度に厄介であろう。
本開示において説明される技法は、プラットフォームから独立した方法で(すなわち、異種の計算のために)データ処理アルゴリズムを実装するためにカーネルを効率的に実行することを考慮する。本開示において説明される技法では、異種計算は、プラットフォームから独立した方法での計算を意味する。より詳細に説明されるように、本開示において説明される技法により、開発者は、データ処理アルゴリズムを実装するためのカーネルに関するパイプライン実行モデルを指定する。
パイプライン実行モデルを指定するために、開発者は、パイプラインのトポロジーを定義することができる。パイプラインのトポロジーは、相互に接続されたカーネル及びバッファを含む実行グラフであるとみなすことができる。例えば、第1のカーネルが第2のカーネルによって消費されるべきデータを生成する場合。開発者は、第1のカーネルがバッファ、例えば、先入れ先出し(FIFO)バッファ、に結合され、バッファが第2のカーネルに結合されるような形で、トポロジーを定義することができる。この例では、実行グラフは、第1のカーネルがバッファにデータを出力し、第2のカーネルがバッファからデータを受信することを示すことができる。
トポロジーを定義することに加えて、開発者は、実行モデルの一部としてトポロジーの特徴を定義することもできる。一例として、開発者は、各カーネルに関する拡大係数(amplification factor)を定義することができる。拡大係数は、カーネルが受信する所定の量のデータに関してカーネルが生成する最大のデータ量を示すことができる。例えば、拡大係数がカーネルに関して5であり、カーネルが2つのデータパケットを受信する場合は、カーネルが生成する最大のデータ量は、10のデータパケットである。
他の例として、開発者は、バッファのサイズを定義することができる。例えば、開発者は、バッファの幅(例えば、バッファの記憶場所内に格納することができるデータの量)及びバッファの長さ(例えば、バッファ内の記憶場所の数)を定義することができる。
この方法により、開発者は、データ処理アルゴリズムに関するプラットフォームから独立した実行モデルを定義することができる。例えば、開発者は、データ処理アルゴリズムが実装される特定のGPUを説明する必要がない。むしろ、各GPUに関する実行モデルは、同じであることができる。
本開示おいて説明される技法は、開発者がバウンドされた方法で(bounded manner)実行モデルを定義するのを可能にすることができる。例えば、開発者は、いずれのカーネルが必要であるか、いずれのカーネルが生成するカーネルを形成するか及びいずれのカーネルが消費するカーネルを形成するかを完全に定義することができる。バウンドされた方法で実行モデルを定義することは、静的実行モデル(例えば、実行前に定義されるそれ)であるとみなすことができる。
バウンドされた方法で実行モデルを定義することは、バウンドされない方法で(unbouneded manner)実行モデルを定義することと比較して計算効率の利得を可能にすることができる。実行モデルのバウンドされない定義では、開発者は、実行前には、必要になるカーネル数、いずれのカーネルが生成するカーネルになるか及びいずれのカーネルが消費するカーネルになるかを定義することができない(すなわち、カーネル間の相互接続を定義することができない)。この結果、バウンドされた実行モデルと比較して、バウンドされない実行モデルの性能が最適でなくなる可能性がある。
例えば、本開示において説明される技法では、プロセッサは、実行モデルを受信することができ、及び実行モデルをコンパイルしてGPUによって処理することができるオブジェクトコード(すなわち、バイナリコード)にすることができる。コンパイルステップは、プラットフォームに依存するステップであることができる。例えば、プロセッサは、データ処理アルゴリズムが実装されるGPUの処理能力を示す情報で予め構成することができる。一例として、プロセッサは、GPU内の計算ユニット数を示す情報で予め構成することができる。
コンパイルステップでは、プロセッサは、メタスケジューラ(meta−scheduler)に関する命令を生成することができる。メタスケジューラは、GPUで実行するソフトウェアであることができ又はGPU内のハードウェアであることができる。メタスケジューラに関する命令は、実行モデルが実行される方法を定義することができる。この例では、実行モデルはバウンド(bound)することができ(例えば、カーネル数及びカーネルの相互接続が知られている)、プロセッサは、GPUの処理能力を示す情報で予め構成することができるため、コンパイラは、GPUが実行モデルを実装する方法を最適化するメタ−スケジューラに関する命令を定義することができる。バウンドされない実行モデルの場合は、カーネル数及びそれらの各々の相互接続は知ることができず、コンパイラは、GPUでの実行モデルの実行を適切に最適化することができない。
図1は、実行モデルの例を示した概念図である。例えば、図1は、実行モデル10を例示する。開発者は、データ処理アルゴリズムを実装するための実行モデル10を定義することができる。例えば、開発者は、画像処理、映像処理、線形代数演算、又は流体力学を計算するためのアルゴリズムを実装するために実行モデル10を定義することができる。概して、開発者は、グラフィックス処理ユニット(GPU)によって提供される大規模な並列計算効率を利用するデータ処理アルゴリズムを実装するために実行モデル10を定義することができ、グラフィックスに関連しない目的を含む。GPUがグラフィックスに関連しないアルゴリズムを実装中である例では、GPUは、汎用GPU(GPGPU)のように機能しているとみなすことができる。
例示されるように、実行モデル10は、バッファ12A乃至12Dと、カーネル14A乃至14Cと、を含む。幾つかの例では、図1に示されるバッファ及びカーネルよりも多い又は少ないそれらが存在することができる。バッファ12A乃至12Dの例は、先入れ先出し(FIFO)バッファとリングバッファと含み、ただしこれらに限定されない。
カーネル14A乃至14Cの例は、実行モデル10が実装するように定義される全体的データ処理アルゴリズムの少なくとも一部分を実装する、開発者によって開発されたアプリケーションを含む。開発者は、カーネル14A乃至14Cを開発するためにあらゆるプログラミング言語を利用することができる。
開発者が実行モデル10を定義することができる様々な方法が存在することができる。一例として、開発者は、コンピューティングデバイス、例えば、デスクトップコンピュータ又はラップトップコンピュータ、において実行モデルを定義することができる。開発者は、グラフィカルユーザインタフェース(GUI)を提示するコンピューティングデバイスでアプリケーションを実行することができる。開発者は、図1において例示される方法でバッファ12A乃至12D及びカーネル14A乃至14Cを相互接続するためにGUIを利用することができる。さらに、開発者は、バッファ12A乃至12D及びカーネル14A乃至14Dの特徴を定義するためにGUIを利用することができる。
他の例として、開発者は、特定のアプリケーション処理インタフェース(API)によりコマンドを利用して実行モデルを定義することができる。該APIの例は、Microsoft(登録商標)によるDirectX(登録商標)、KhronosグループによるOpenGL(登録商標)、及びKhronosグループによるOpenCL(登録商標)を含む。しかしながら、本開示の態様は、DirectX、OpenGL又はOpenCL APIには限定されず、開発済みの、現在開発中の、又は将来開発予定のその他のタイプのAPIにまで拡張することができる。さらに、本開示において説明される技法は、APIにより機能することは要求されない。
例えば、コマンドは、開発者が実行モデルを定義中であることを示すコマンドを含むことができる。コマンドは、バッファ12A乃至12D及びカーネル14A乃至14Cが実行モデル10に属することを開発者が定義するのを可能にし、及びバッファ12A乃至12D及びカーネル14A乃至14Cが相互接続される方法を定義するコマンドも含むことができる。
いずれの例でも(すなわち、GUIに基づく又はコマンドに基づく)、開発者が実行モデル10を定義したコンピューティングデバイスは、実行モデル10を変換することができ、実行モデル10のトポロジーを指定するコマンドリストを含む。例えば、例示されるように、カーネル14Aは、バッファ12Aからデータを受信し、データを処理し、バッファ12B及び12Cにデータを格納する。カーネル14Bは、バッファ12Bからデータを受信し、データを処理し、及びバッファ12Dにデータを格納する。カーネル14Cは、バッファ12D及び12Cからデータを受信し、データを処理する。
この方法により、バッファ12A乃至12D及びカーネル14A乃至14Cは、計算パイプラインとして構成される。例えば、カーネル14Aは、カーネル14B及び14Cに関する生成するカーネルである。カーネル14Bは、カーネル14Aに関する消費するカーネル及びカーネル14Cに関する生成するカーネルである。カーネル14Cは、カーネル14A及び14Bの両方に関する消費するカーネルである。
理解を助けるために、図1は、実行モデル10のパイプライントポロジーを例示するとみなすことができる。例えば、開発者は、実行モデル10のパイプライントポロジーを定義する実行グラフを定義するとみなすことができる。この実行グラフでは、カーネル14A乃至14Cは、バッファ12A乃至12Dと相互接続されるノードであるとみなすことができる。
幾つかの例では、開発者は、異なる実行モデルを相互接続することもできる。例えば、データ処理アルゴリズムに関して1つの実行モデルを定義する代わりに、開発者は、複数の実行モデルを開発することができ、各実行モデルがデータ処理アルゴリズムの一部分を実装する。これらの例では、各々の実行モデル内のカーネルは、全体的データ処理アルゴリズムの一部分の小部分を実装することができる。開発者は、カーネル14A乃至14C及びバッファ12乃至12Dを相互接続するのと同様の方法で実行モデルを相互接続することができる。例えば、開発者は、バッファ12Aを他の実行モデルに相互接続すること及び/又はカーネル14Cを他の実行モデルに相互接続することができる。
複数の実行モデルを定義するのが有益であることができる。より詳細に説明されるように、プロセッサは、実行モデル、例えば、実行モデル10、をコンパイルしてオブジェクトコードにし、その結果得られたオブジェクトコードを格納することができる。実行モデル10が複数の実行モデルのうちの1つである例では、プロセッサは、実行モデル10を再コンパイルする必要がない。換言すると、実行モデルは、全体的なデータ処理アルゴリズムに関するビルディングブロックであるとみなすことができ又はデータ処理アルゴリズムの全体を定義することができる。これで、共通して使用される実行モデルは、実行モデルが使用されるすべての事例に関して再コンパイルする必要がない。
実行モデル10のトポロジーを定義することに加えて、開発者は、バッファ12A乃至12D及びカーネル14A乃至14Cの特徴を定義することもできる。開発者は、GUI又は上述されるコマンドに基づくフォーマットを用いて特徴を定義することができる。開発者は、バッファ12A乃至12D内の記憶場所の数(すなわち、バッファ12A乃至12Dの長さ)を定義することができる。開発者は、バッファ12A乃至12Dの各記憶場所内に格納することができるデータの量(すなわち、バッファ12A乃至12Dの幅)を定義することもできる。
幾つかの例では、開発者は、バッファ12A乃至12Dの次元を定義することができる。例えば、幾つかの画像処理技法、例えば、畳み込み、は、ピクセルのブロック(例えば、7×7のピクセルのブロック)において生じる。これらの例では、ピクセルをブロック形態で格納するためにバッファ12A乃至12Dは二次元バッファであることが有益であることができる。例えば、ピクセルのブロックが7×7のピクセルのブロックである場合は、バッファ12A乃至12Dのうちの1つ以上は、49の記憶場所を有する線形バッファではなく、7×7の記憶場所を有する状態で(すなわち、二次元バッファとして)構成することができる。
カーネル14A乃至14Cに関しては、開発者は、一例として、拡大係数を定義することができる。拡大係数は、カーネルが消費する所定のデータ量に関してそのカーネルが生成する最大のデータ量を示すことができる。例えば、カーネル14Bに関する拡大係数が2であり、カーネル14Bが5つのデータパケットをバッファ12Bから受信する場合は、カーネル14Bが生成する最大のデータ量は10のデータパケットである。他の例として、カーネル14A乃至14Cのうちの1つ以上に関して、開発者は、カーネルが(例えば、受信されたデータ量から独立して)生成する最大データ量を定義することもできる。
さらに他の例として、開発者は、相対的重要性をカーネル14A乃至14Cに割り当てることができる。例えば、重要性は、カーネル14A乃至14Cのうちのいずれが割り込まれないで実行すべきかを示すことができ、カーネル14A乃至14Cのうちのより重要なそれらは割り込まれないで実行し、カーネル14A乃至14Cのうちの重要性がより低いそれらは割り込まれないで又は割り込まれた状態で実行することができる(すなわち、その他の実行のために解放するために実行が断続的に休止される)。
カーネル14A乃至14C及びバッファ12A乃至12Dの特徴は、例示する目的で説明されており、限定するものであるとはみなされるべきでない。開発者が上述されるすべての特徴例を定義する必要はない。例えば、開発者は、バッファ12A乃至12Dのサイズ(例えば、長さ及び幅)を定義することができ、カーネル14A乃至14Cの特徴は定義することができない。これらの例では、カーネル14A乃至14Cが生成又は消費するデータの量は、バッファ12A乃至12Dのサイズが既に定義されているため重要ではない。他の例として、開発者は、拡大係数又はカーネル14A乃至14Cが生成する最大データ量を定義することができ、バッファ12乃至12Dの特徴は定義しない。これらの例では、実行モデル10をコンパイルするプロセッサは、拡大係数及び/又はカーネル14A乃至14Cが生成する最大データ量に基づいてバッファ12A乃至12Dのサイズを決定することができる。さらに、これらの例では、実行モデル10をコンパイルするプロセッサは、バッファ12A乃至12Dが一次元(すなわち、線形)バッファ又は多次元バッファのいずれであるべきかを決定することができる。
概して、開発者又はプロセッサは、バッファ12A乃至12Dが大きくなりすぎないようにする一方で、“行き詰まった”状況を回避するためにカーネル14A乃至14C及びバッファ12A乃至12Dの特徴を決定することができる。行き詰まった状況は、消費するカーネルが、データを受信すべきバッファ内に格納されていないデータを期待したとき又は生成するカーネルが、消費するカーネルがデータを消費するよりも高速でデータを格納しているためバッファがデータでオーバーフローするときに発生する可能性がある。行き詰まった状況では、カーネルは、“停滞し”(hang)、カーネルが行き詰まった状況で停滞しないようにするための追加措置を講じないかぎりデータ処理アルゴリズムの実装を停止する。幾つかの例では、行き詰まりが発生したときに停滞を回避するために追加のタスクを実装するようにGPUを構成するよりも、行き詰まりが発生しないようにカーネル14A乃至14C及びバッファ12A乃至12Dの特徴を定義したほうが良いであろう。
開発者又はプロセッサが行き詰まりを緩和するために相対的に大きいサイズのバッファ12A乃至12Dを定義することが可能である。しかしながら、バッファ12A乃至12Dのサイズが不必要に大きい場合は、プロセッサは、必要なメモリスペースよりもはるかに大きいメモリスペースをバッファ12A乃至12Dのために予約する可能性があり、その結果、非効率的なメモリの使用になってしまうおそれがある。
従って、バッファ12A乃至12D及び/又はカーネル14A14Dの特徴を定義することによって、開発者は、メモリが効率的に使用される一方で行き詰まりの機会が低下されるような形で実行モデル10を定義することができる。この方法により、開発者は、完全にバウンドされた静的な実行モデル10を定義することができる。例えば、開発者は、実行モデル10を実装するために必要なカーネル及びバッファの数が動的に(すなわち、実装中に)定義されるのではなく、実装前に、実行モデル10を実装するために必要なカーネル14A乃至14C及びバッファ12A乃至12Dの数、及びバッファ12A乃至12D及びカーネル14A乃至14Cの特徴を定義することができる。
開発者は、データ処理アルゴリズムを実装するGPUを含むデバイスに実行モデル10を格納することができる。例えば、開発者は、実行モデル10のパイプライントポロジーを指定するコマンドリストを、GPUを含むデバイスに格納することができる。幾つかの例では、開発者が実行モデル10をデバイスに格納するのではなく、デバイスのユーザがデバイスでの格納のために実行モデル10をダウンロードすることができる。概して、データ処理アルゴリズムを実装するGPUを含むデバイスが実行モデル10を格納する方法は、本開示で説明される技法の制約にはならない。換言すると、データ処理アルゴリズムが実装されるべきGPUを含むデバイスに実行モデル10(例えば、実行モデル10のコマンドのリスト)を格納するためにあらゆる技法を利用することができる。例えば、開発者が実行モデル10を定義したコンピューティングデバイスがデータ処理アルゴリズムを実装すべきGPUを含む同じコンピューティングデバイスであることさえも可能である。
より詳細に説明されるように、GPUを含むデバイスは、プロセッサを含むこともできる。プロセッサは、実行モデル10を受信して実行モデル10をコンパイルし、GPUが実行モデル10によって定義されたデータ処理アルゴリズムを実装するために実行すべきオブジェクトコードにする。本開示において説明される技法により、プロセッサは、GPUの処理能力を説明する実行モデル10をコンパイルすることができる。
従って、開発者は、プラットフォームから独立した方法で(すなわち、データ処理アルゴリズムを実装するGPUのタイプを考慮せずに)実行モデル10のパイプライントポロジーを定義することができる。GPUを含むデバイスのプロセッサは、GPUが実行モデル10を実装すべき方法を定義する実行モデル10に基づいて命令を生成することができる。例えば、プロセッサは、実行モデル10をコンパイルし、コンパイルの一部として命令を生成することができる。実行モデル10のコンパイル中には、プロセッサは、GPUの処理能力を説明することができる。この方法により、プロセッサは、GPUでの実装のために実行モデル10を最適化することができる。これは、開発者が、結果的に非常にポータブルな実行モデル(すなわち、異種計算のために異なるタイプのGPUで効率的に実装することができるモデル)が得られる柔軟で理解しやすい方法で実行モデル10を開発するのを可能にすることができる。開発者は、GPUのプラットフォーム専用の又は実装によって定義される挙動に関わる必要がない。
さらに、バウンドされた方法で実行モデル10を定義することは、実行モデル10の組み込み式のデバッギングを可能にすることができる。一例として、実行モデル10を定義することは、上述されるように、行き詰まりの機会を低減させることができる。さらに、バウンドされない実行モデルに関しては、開発者が第2のカーネルによって消費されるデータを出力するように第1のカーネルを定義し、実装中に第1のカーネルを実行させるように不注意に第2のカーネルを定義し、従って、第1のカーネルが第2のカーネルによって生成されたデータを消費するようにする可能性がある。これは、実際には、無限のループを作り出す。バウンドされない実行モデルの場合は、実装まで該状況を決定する方法がない。
しかしながら、バウンドされた実行モデル10を用いることで、開発者は、該無限ループを作り出すのを簡単に回避することができる。例えば、開発者は、該無限ループを作り出したことをGUIで見ることができる。他の例として、アプリケーションが実行モデル10のパイプライントポロジーを変換して実行モデル10のコマンドリスト内に入れたときには、アプリケーションは、該無限ループが存在するかどうかを決定することができる。
図2は、本開示において説明される1つ以上の例によるデバイスの例を示したブロック図である。例えば、図2は、デバイス16を例示する。デバイス16の例は、ビデオデバイス、例えば、メディアプレーヤー、セットトップボックス、無線ハンドセット、例えば、携帯電話、パーソナルデジタルアシスタント(PDA)、デスクトップコンピュータ、ラップトップコンピュータ、ゲームプレイコンソール、ビデオ会議装置、タブレットコンピューティングデバイス、等を含み、ただしこれらに限定されない。デバイス16は、図2において例示されるコンポーネントに加えてのそれらを含むことができる。
例示されるように、デバイス16は、集積回路(IC)18と、グローバルメモリ20と、を含む。グローバルメモリ20は、デバイス16のためのメモリとみなすことができる。例えば、グローバルメモリ20は、IC18の外部に存在することができ及びIC18及びグローバルメモリ20は、システムバス36を介して通信することができる。グローバルメモリ20は、1つ以上のコンピュータによって読み取り可能な記憶媒体を備えることができる。グローバルメモリ20の例は、ランダムアクセスメモリ(RAM)、又は希望されるプログラムコードを搬送又は格納するために使用することができ及びコンピュータ又はプロセッサによってアクセスすることができるその他のあらゆる媒体を含み、ただしこれらに限定されない。
幾つかの態様では、グローバルメモリ20は、本開示においてプロセッサ22及びGPU24に起因する機能を実行することをプロセッサ22及び/又はグラフィックス処理ユニット(GPU)24に行わせる命令を含むことができる。従って、グローバルメモリ20は、実行されたときに様々な機能を実行することを1つ以上のプロセッサ(例えば、プロセッサ22及びGPU24)に行わせる命令が格納されているコンピュータによって読み取り可能な記憶媒体であることができる。
グローバルメモリ20は、幾つかの例では、非一時的な記憶媒体であるとみなすことができる。用語“非一時的な”は、記憶媒体が搬送波又は伝搬される信号において具現化されないことを示すことができる。しかしながら、用語“非一時的な”は、グローバルメモリ20が移動不能である又はその内容が静的であることを意味するとは解釈されるべきでない。一例として、グローバルメモリ20は、データ16から取り外して他のデバイスに移動させることができる。他の例として、グローバルメモリ20に実質的に類似するグローバルメモリは、デバイス16内に挿入することができる。幾つかの例では、非一時的な記憶媒体は、(例えば、RAMにおいて)経時で変化することが可能なデータを格納することができる。
IC18は、プロセッサ22と、グラフィックス処理ユニット(GPU)24と、を含む。IC18は、追加のコンポーネント、例えば、グローバルメモリ20と通信するためのインタフェースユニット、グローバルメモリ20内のメモリを管理するためのユニット、及びその他の処理ユニット、例えば、ディスプレイプロセッサ、を含むことができる。IC18は、プロセッサ22及びGPU24を収納又は形成するあらゆるタイプの集積回路であることができる。例えば、IC18は、チップパッケージ内の処理チップであるとみなすことができる。
プロセッサ22及びGPU24は、単一のIC18の一部として例示されているが、本開示の態様はそのようには限定されない。幾つかの例では、プロセッサ22及びGPU24は、異なる集積回路(すなわち、異なるチップパッケージ)に収納することができる。
プロセッサ22及びGPU24の例は、デジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルロジックアレイ(FPGA)、又はその他の同等の集積回路又はディスクリート論理回路を含み、ただし、これらに限定されない。幾つかの例では、GPU24は、グラフィックス処理に適する大規模な並列処理能力をGPU24に提供する集積回路及び/又はディスクリート論理回路を含む専用ハードウェアであることができる。幾つかの例では、GPU24は、汎用処理を含むこともでき、汎用の処理タスク(すなわち、グラフィックスに関連しないタスク)を実装するときには汎用GPU(GPGPU)と呼ぶことができる。
プロセッサ22は、ホストと時々呼ばれ、デバイス16の中央処理装置(CPU)であることができる。プロセッサ22は、様々なタイプのアプリケーションを実行することができる。アプリケーションの例は、ウェブブラウザ、電子リーダー、電子メールアプリケーション、スプレッドシート、ビデオゲーム、映像再生、音声再生、ワードプロセシング、表示のためのビュー可能なオブジェクトを生成するその他のアプリケーション、又はその他のタイプのアプリケーションを含む。グローバルメモリ20は、1つ以上のアプリケーションの実行のための命令を格納することができる。
幾つかの例では、プロセッサ22は、処理タスク、例えば、大規模な並列演算を要求するタスク、をGPU24に委託することができる。一例として、グラフィックス処理は、大規模な並列演算を要求し、プロセッサ22は、該グラフィックス処理タスクをGPU24に委託することができる。幾つかの例では、プロセッサ22は、グラフィックス処理に関連しないタスクをGPU24に委託することができる。例えば、データ処理アルゴリズム、例えば、行列演算、画像処理、及び映像処理、は、並列演算を要求し、GPU24は、プロセッサ22と比較して該演算を実装するのにより適している。
タスクを実装するために、GPU24は、1つ以上のアプリケーションを実行するように構成することができる。例えば、グラフィックスに関連する処理の場合は、GPU24は、バーテックスシェーダ、フラグメントシェーダ、及び幾何シェーダ、等のアプリケーションを実行することができる。グラフィックスに関連しない処理に関しては、GPU24は、該処理(例えば、グラフィックス関連処理又はグラフィックスに関連しない処理)に関して設計されたアプリケーションを実行することができる。いずれの例(例えば、グラフィックス関連処理又はグラフィックスに関連しない処理)に関しても、プロセッサ22は、以下においてより詳細に説明されるように、1つ以上のアプリケーションを実行するようにGPU24に命令することができる。
プロセッサ22は、特定のアプリケーション処理インタフェース(API)によりGPU24と通信することができる。例えば、プロセッサ22は、命令、例えば、APIを利用して1つ以上のアプリケーションを実行するようにGPU24に命令する命令、をGPU24に送信することができる。該APIの例は、Microsoft(登録商標)によるDirectX(登録商標)、KhronosグループによるOpenGL(登録商標)、及びKhronosグループによるOpenCL(登録商標)を含む。しかしながら、本開示の態様は、DirectX、OpenGL又はOpenCL APIには限定されず、開発済みの、現在開発中の、又は将来開発予定のその他のタイプのAPIにまで拡張することができる。さらに、本開示において説明される技法は、APIにより機能することは要求されず、プロセッサ22及びGPU24は、あらゆる通信技法を利用することができる。
一例として、グラフィックス関連のアプリケーションに関しては、プロセッサ22は、OpenGL APIを用いてGPUと通信することができる。グラフィックスに関連しないアプリケーションに関しては、プロセッサ22は、OpenCL APIを用いてGPU24と通信することができる。繰り返すと、本開示において説明される技法は、プロセッサ22がOpenGL及び/又はOpenCL APIを用いてGPU24と通信することは必ずしも要求しない。
GPU24が実行するグラフィックス関連のアプリケーションは、シェーダと呼ぶことができ、GPU24が実行するグラフィックスに関連しないアプリケーションは、カーネルと呼ぶことができる。例えば、グローバルメモリ20は、シェーダ及びカーネルの命令を格納することができ、プロセッサ14で実行するコンパイラは、シェーダ及びカーネルの命令をGPU16での実行のためのオブジェクトコードに変換することができる。他の例として、グローバルメモリ20は、GPU16が取り出して実行するシェーダ及びカーネルのオブジェクトコードを格納することができる。
図2において例示されるように、グローバルメモリ20は、実行モデル(図1)を格納する。例えば、グローバルメモリ20は、実行モデル10のパイプライントポロジーを定義するコマンドのリストを格納することができる。上述されるように、開発者は、カーネル14A乃至14Cを含むために実行モデル10のパイプライントポロジーを定義しておくことができる。従って、グローバルメモリ20は、カーネル14A乃至14Cのソースコードを格納することができる。代替として又はさらに加えて、グローバルメモリ20は、カーネル14A乃至14Cの予めコンパイルされたソースコード(すなわち、カーネル14A乃至14Cのオブジェクトコード)を格納することができる。開発者がより多くの又はより少ないカーネル又は異なるカーネルを含むように実行モデルを定義した場合は、グローバルメモリ20は、それらのカーネルに関するソースコード及び/又はオブジェクトコードを格納することができる。カーネル14Aと14Cとの間の楕円形は、カーネル14Bもグローバルメモリ20に含まれることを示す。
この例では、プロセッサ22は、実行モデル10のパイプライントポロジーをグローバルメモリ20から取り出すことができる。実行モデル10のパイプライントポロジーに基づき、プロセッサ22は、実行モデル10がバッファ12A乃至12Dを含むことを決定することができる。この例では、プロセッサ22は、バッファ12A乃至12Dに関してグローバルメモリ20内で記憶場所を予約することができる。例えば、実行モデル10の一部は、バッファ12A乃至12Dの特徴、例えば、バッファ12A乃至12Dのサイズ、を含むことができる。この例では、プロセッサ22は、バッファ12A乃至12Dの特徴に基づいてグローバルメモリ20内の記憶場所を予約することができる。バッファ12Aと12Dとの間の楕円形は、バッファ12B及び12Cもグローバルメモリ20に含まれることを示す。
他の例として、実行モデル10の一部は、カーネル14A乃至14Cの特徴、例えば、拡大係数及び/又はカーネル14A乃至14Cが生成する最大データ量、を含むことができる。この例では、プロセッサ22は、カーネル14A乃至14Cの特徴に基づいてグローバルメモリ20内の記憶場所を予約することができる。例えば、拡大係数及び/又はカーネル14A乃至14Cが生成する最大データ量を示す値に基づいて、プロセッサ22は、バッファ12A乃至12Dに関する該当するサイズを決定し、決定されたサイズに基づいてグローバルメモリ20内の記憶場所を予約することができる。
プロセッサ22は、バッファ12A乃至12Dに関するグローバルメモリ20内の記憶場所を予約するとして説明されるが、本開示の態様はそのようには限定されないことが理解されるべきである。幾つかの例では、IC18又はGPU24は、実行モデル10によって定義されるデータ処理アルゴリズムを実装するためにGPU24によって使用されるバッファを管理するように構成される管理ユニット(図2には示されない)を含むことができる。これらの例では、プロセッサ22は、バッファ12A乃至12Dのサイズに関して管理ユニットを命令することができ、管理ユニットは、バッファ12A乃至12Dに関してグローバルメモリ内の記憶場所を予約するように構成することができる。
この管理ユニットは、その他の機能、例えば、バッファ12A乃至12D内に格納されたキャッシュバッキング(cache−backing)データ及び/又はIC18又はGPU24のキャッシュ内のカーネル14A乃至14Cの命令、を実行するように構成することができる。この管理ユニットは、バッファ12A乃至12Dの各々の1つに格納されるデータ量を示す情報を格納することもできる。この管理ユニットは、GPU24での実行時にカーネル14A乃至14C間でのデータ転送を管理するように構成することができる。例えば、図1において例示されるように、実行モデル10のパイプライントポロジーは、カーネル14Aがバッファ12Bに出力し、カーネル14Bがバッファ12Bからデータを受信することを示す。管理ユニットは、カーネル14Aによって生成されたデータのバッファ12B内での格納、及びカーネル14Bによるバッファ12Bからのデータの取り出し、そして幾つかの例では、バッファ12Bに格納されるデータ量の格納を管理するように構成することができる。管理ユニットに関する技法は、"GRAPHICS PROCESSING UNIT BUFFER MANAGEMENT"(グラフィックス処理ユニットバッファ管理)という題名を有し、引用によってその内容全体が組み入れられている同時係属米国特許出願第13/747,947号(出願日:2013年1月23日)においても記述される。
管理ユニットの利用は、例示することを目的として提供されるものであり、限定するものであるとはみなされるべきでない。例えば、管理ユニットは、プロセッサ22以外のユニットがグローバルメモリ20内のバッファ12A乃至12Dに関する記憶場所を予約する1つの方法例として説明される。しかしながら、本開示の態様は、そのようには限定されず、プロセッサ22、又はGPU24でさえも、該機能を果たすように構成することができる。例えば、GPU24がバッファ12A乃至12D内にデータを格納するときには、GPU24は、GPU24がバッファ12A乃至12Dに格納したデータ量を格納するようにも構成することができる。説明を容易にするため、技法は、プロセッサ22又はGPU24が該機能を実行することに関して説明される。
本開示において説明される技法により、プロセッサ22は、実行モデル10によって定義されたパイプライントポロジーのインディケーション(indication)(例えば、一例として、実行モデル10のコマンドリスト)を受信することができる。プロセッサ22は、GPU24がパイプライントポロジーを実装する方法を定義する命令を生成することができる。
例えば、例示されるように、プロセッサ22は、コンパイラ28を実行することができる。コンパイラ28は、プロセッサ22内で形成されていないことを示すために破断線で示される。むしろ、グローバルメモリ20は、コンパイラ28のオブジェクトを格納することができ、プロセッサ22が取り出して実行する。
コンパイラ28は、GPU24が実行するオブジェクトコード、及びGPU24が実行モデル10を実装する方法を定義する命令を生成するために実行モデル10(例えば、実行モデル10のコマンドリスト)をコンパイルするように構成することができる。GPU24が実行モデル10を実装する方法を定義する命令を生成するためのコンパイルの一部として、コンパイラ28は、GPU24の処理能力を説明する(account for)ことができる。
例えば、例示されるように、グローバルメモリ20は、GPU構成32を格納することができる。GPU構成32は、GPU24の処理能力を定義する又は示す構成情報であることができる。一例として、GPU構成32は、GPU24内のプログラマブル計算ユニット数を示すことができる。上述されるように、カーネルは、GPU内の1つ以上のプログラマブル計算ユニットで実行する。
他の例として、GPU構成32は、GPU24が並列でデータを処理することが可能な方法を示すことができる。例えば、GPU24は、単一プログラム多データ(SPMD)プログラミングモデル又は単一命令多データ(SIMD)プログラミングモデルを実装するように構成することができる。一例として、GPU24がSIMDプログラミングモデルに関して構成される場合は、GPU構成32は、SIMDプログラミングモデル(例えば、8レーンSIMD)を実装するためのGPU24内のレーン(lane)の数を示す構成情報を含むことができる。
GPU構成32は、上述される情報の追加の又は上述される情報と異なるGPU24の構成情報を含むことができる。概して、GPU構成32は、GPU24の処理能力を記述する構成情報を含むことができる。
さらに、GPU構成32はグローバルメモリ20に格納されるとして例示されるが、本開示の態様は、そのようには限定されない。幾つかの例では、IC18内のレジスタ又はキャッシュがGPU構成32を格納することができる。これらの例の両方において、プロセッサ22は、グローバルメモリ20からではなく、レジスタからGPU構成32の情報を読み取ることができる。幾つかの例では、プロセッサ22をGPU構成32で予め構成することさえも可能である。
コンパイラ28は、実行モデル10をコンパイルするために、実行モデル10の情報に加えて、GPU構成32の情報を利用することができる。コンパイルの結果は、GPU24が実行するオブジェクトコード、及び、GPU24が実行モデル10を実装する方法に関する命令であることができる。例えば、オブジェクトコードに加えて、コンパイラ28の出力は、プロセッサ22がグローバルメモリ20に格納するメタ−スケジューラ命令34であることができる。メタ−スケジューラ命令34は、より詳細に説明されるように、GPU24が実行モデル10を実装する方法を指示する、メタ−スケジューラ30に関する命令であることができる。
例えば、メタ−スケジューラ命令34は、GPU24がカーン処理ネットワーク(Kahn Processing Network)(KPN)に類似する実行モデル10を実装するように指示することができる。例えば、KPNは、データを含むチャネルを決定し、そのチャネルに関するコンシューマ(consumer)を識別し、データのうちの一部の量に関してコンシューマを実行し、全データが処理されるまでこれらのステップを繰り返す。実行モデル10のトポロジーは、(KPNのプロセスに類似する)カーネル及び(KPNのプロセスに類似する)バッファを定義することができる。この方法により、実行モデル10は、バッファの各々に関する消費するカーネルを示す。より詳細に説明されるように、実行モデル10を実装する際には、GPU24は、データを含むバッファ12A乃至12Dのうちの1つを識別することができ、及び、バッファ12A乃至12Dのうちの識別されたそれのデータを消費することになる消費するカーネル(例えば、カーネル14A乃至14Cのうちの1つ)を実行することができる。KPNに関する説明は、単に例示する目的で及び理解を助けるために提供されたものであることが理解されるべきである。本開示において説明される技法は、KPNのそれらに限定される又はKPNのそれらと同一であるとはみなされるべきではない。
それらの技法により、メタ−スケジューラ命令34は、デバイスをターゲットにしたバイナリ(device target binary)であることができる。換言すると、実行モデル10はプラットフォームから独立する(すなわち、GPU専用でない)ことができる一方で、メタ−スケジューラ命令34は、プラットフォームに依存する(すなわち、GPU24専用である)。例えば、コンパイラ28は、GPU24での実行モデル10の実装を最適化するためにGPU構成32からの情報を利用することができる。
一例として、コンパイラ28は、カーネル14A乃至14CがGPU24のプログラマブル計算ユニットで実行する時間を決定するために情報、例えば、GPU24のプログラマブル計算ユニット数、を利用することができる。例えば、上述されるように、実行モデル10によって定義されるデータ処理アルゴリズムのパイプライン実装は、カーネル14A乃至14Cのうちの1つ以上の並列の実行(例えば、同時)又はカーネル14A乃至14Cのうちの1つ以上の順次の実行(例えば、1つずつ)を含むことができる。この例では、コンパイラ28は、カーネル14A乃至14Cが、数多くの利用可能なプログラマブル計算ユニットが存在しない場合は順次で実行すべきであること又は数多くの利用可能なプログラマブル計算ユニットが存在する場合は並列で実行すべきであることを指示するメタ−スケジューラ命令34を生成することができる。
他の例として、コンパイラ28は、カーネル14A乃至14Cの一部のそれらがその他よりも重要であることを示す実行モデル10からの情報を利用することができる。例えば、カーネル14Bがカーネル14Cよりも重要であると仮定する。この例では、コンパイラ28は、カーネル14Cが幾つかの割り込み有りで実行することになった場合でもカーネル14Bは割り込みなしで実行するようにするメタ−スケジューラ命令34を生成するためにGPU構成34からの情報を利用することができる。
例えば、プログラマブル計算ユニットが1つのカーネルのスレッドを実行することから他のカーネルのスレッドを実行することに切り換わり、次に戻ることが可能である。この場合は、プログラマブル計算ユニットが切り換わったカーネルは割り込まれたとみなすことができ、プログラマブル計算ユニットがそのカーネルのスレッドを実行するために切り換わって戻るまで休止状態にあるとみなすことができる。幾つかの例では、コンパイラ28は、重要なカーネルのスレッドを実行中のプログラマブル計算ユニットが他のカーネルのスレッドの実行に切り換わらないように指示するメタ−スケジューラ命令34を生成することができる。
さらに他の例として、コンパイラ28は、GPU24内のデータレーン(data lane)の数を示すGPU構成34からの情報を利用することができる。例えば、GPU構成34は、GPU24が8レーンのSIMD GPUであることを示すと仮定する。この例では、コンパイラ28は、消費するカーネルに結合されたバッファ内に少なくとも8つのエントリが存在するまでGPU24が消費するカーネルを実行すべきでないことを指示するメタ−スケジューラ命令34を生成することができる。例えば、図1において例示されるように、カーネル14Bは、カーネル14Aにとっての消費するカーネルであり、バッファ12Bからデータを受信する。GPU24は8レーンSIMD GPUであると仮定すると、コンパイラ28は、少なくとも8つのデータ項目がバッファ12B内に格納されるまでGPU24がカーネル14Bを実行すべきでないことを指示するメタ−スケジューラ命令34を生成することができる。
追加の例として、コンパイラ28は、バッファ12A乃至12Dのサイズを説明することができる。例えば、コンパイラ28は、行き詰まりの変化が最小限になるようにカーネル14A乃至14Cをいつ実行すべきかを決定するためにバッファ12A乃至12Dのサイズに関する情報を利用することができる。この例では、コンパイラ28は、行き詰まりが発生しないようにカーネル14A乃至14Cが実行する順序を指示するメタ−スケジューラ命令34を生成することができる。
幾つかの例では、コンパイラ28は、GPU24に実行モデル10を実装する際に誤りが存在するかどうかを決定するように構成することができる。例えば、コンパイラ28は、実行モデル10の一部であるが、カーネル14A乃至14Dのいずれの1つにも結合されていないバッファ12A乃至12Dが存在するかどうかを決定するように構成することができる。他の例として、コンパイラ28は、カーネル14A乃至14Dのうちのいずれか1つが存在していないバッファにアクセスしようとしているか、又はバッファ内のアウトオブバウンド(out−of−bounds)記憶場所にアクセスしようとしているかを決定するように構成することができる。コンパイラ28がコンパイル時に実行モデル10の機能を検証するため、コンパイラ28は、実行モデル10の機能を検証することをGPU24に行わせる命令をメタ−スケジューラ命令34に含める必要がない。
プロセッサ22が、コンパイラ28を介して、メタ−スケジューラ命令34を生成した後は、プロセッサ22は、メタ−スケジューラ命令34を実行のために取り出すようにGPU24に命令することができる。例示されるように、GPU24は、メタ−スケジューラ30を含む。メタ−スケジューラ30は、GPU24内のハードウェア、GPU内のハードウェアで実行するファームウェア、又はGPU24内のハードウェアで実行するソフトウェアであることができる。メタ−スケジューラ30は、メタ−スケジューラ命令34の命令を実行するように構成することができる。
本開示において説明される技法では、メタ−スケジューラ30は、GPU24のいずれのプログラマブル計算ユニットがカーネル14A乃至14Cのいずれのスレッドを何時に実行すべきかを決定するように構成することができる。換言すると、メタ−スケジューラ30は、実行モデル10のパイプライントポロジーによって定義されたデータ処理アルゴリズムを実装することをGPU24に行わせるためにGPU24でのカーネル14A乃至14Cの実行をスケジューリングするように構成することができる。本開示において説明される技法により、メタ−スケジューラ30は、メタ−スケジューラ命令34に基づいてGPU24でカーネル14A乃至14Cを実行するスケジュールを決定することができる。
例えば、メタ−スケジューラ命令34は、カーネル14A乃至14Cのうちの1つ以上を並列で又は順次実行すべきかを指示することができる。この例では、メタ−スケジューラ30は、並列又は順次の実行を達成するためにいずれのプログラマブル計算ユニットがカーネル14A乃至14Cのスレッドを実行すべきかを決定することができる。他の例として、メタ−スケジューラ命令34は、カーネル14A乃至14Cの重要性を示すことができる。この例では、メタ−スケジューラ30は、重要なカーネルを実行するプログラマブル計算ユニットがカーネルを実行中に割り込まれないようにいずれのプログラマブル計算ユニットがカーネル14A乃至14Cのスレッドを実行すべきかを決定することができる。他の例として、メタ−スケジューラ命令34は、GPU24のSIMD又はSPMD能力に基づいてカーネル14A乃至14Cのうちの1つがいつ実行すべきかを指示することができる。この例では、メタ−スケジューラ30は、メタ−スケジューラ命令34の命令に基づいて、いずれのプログラマブル計算ユニットが何時にスレッドを実行するかを決定することができる。メタ−スケジューラ30は、行き詰まりを回避するためにカーネル14A乃至14Cがいつ実行すべきかのタイミングを指示するメタ−スケジューラ命令34内の命令を利用することもできる。
繰り返すと、コンパイラ28は、メタ−スケジューラ命令34を生成する際に、GPU構成32内の情報に基づいて、GPU24の計算能力を考慮に入れておくことができる。従って、本開示において説明される技法は、メタ−スケジューラ30がメタ−スケジューラ34によって示された方法でカーネル14A乃至14Cを実行するためにプログラマブル計算ユニットを適切に割り当てることができることをある程度のレベルで保証する。例えば、上述されるように、コンパイラ28は、メタ−スケジューラ命令34を生成するために、幾つかの説明例として、幾つかの要因、例えば、GPU24内でのプログラマブル計算ユニットの数、バッファ12A乃至12Dのサイズ、GPU24のSIMD又はSPMD能力、又はカーネル14A乃至14Cの重要性、を説明することができる。GPU24のメタ−スケジューラ30がカーネル14A乃至14Cがどのように実行されるべきかを決定するためにメタ−スケジューラ命令34を利用するときには、カーネル14A乃至14CはGPU24で効率的に実行することをある程度保証することができる。
この方法により、プロセッサ22は、実行モデル10のパイプライントポロジーを示すインディケーションを受信することができ、実行モデル10は、プラットフォームから独立した形で定義される。プロセッサ22は、コンパイラ28を実行することができ、それは、実行モデル10のパイプライントポロジーがどのようにしてGPU24上に実装されるべきかをプラットフォーム専用の方法で定義するメタ−スケジューラ命令34を生成するためのGPU24の処理能力を説明する。GPU24のメタ−スケジューラ30は、メタ−スケジューラ命令34を受信し、メタ−スケジューラ命令34の命令に基づいて、いずれのプログラマブル計算ユニットが何時にカーネル14A乃至14Cのスレッドを実行すべきかどうかを決定することができる。
メタ−スケジューラ命令34は、各プラットフォーム専用であるため、メタ−スケジューラ命令34は、GPU24での実行モデル10のパイプライントポロジーの最適な実装になるようにカーネル14A乃至14Cが実行されるべき方法を定義することができる。例えば、メタ−スケジューラ命令34がGPU24と異なるタイプのGPUによって使用される場合は、この異なるタイプのGPUは、メタ−スケジューラ命令34がGPU24のプラットフォーム専用であるため。実行モデル10のパイプライントポロジーを効率的に実装することができない。
幾つかの例では、メタ−スケジューラ30は、実行ポリシーを実装するように構成することができる。例えば、すべての例においてコンパイラ28が、カーネル14A乃至14Cがいつ実行されるべきかを正確に定義する必要がないことがある。むしろ、コンパイラ28が生成するメタ−スケジューラ命令34は、カーネル14A乃至14CをGPU24で実行すべきことを指示することができ及びいずれのカーネル14A乃至14Cが生成するカーネルであり、いずれが消費するカーネルであるかを示すことができる。
これらの例では、メタ−スケジューラ30は、カーネル14A乃至14Cがいつ実行すべきかを示す実行ポリシーを実装するように構成することができる。実行ポリシーの一例は、バッファ12A乃至12Dのうちのいずれがデータを格納するかをメタ−スケジューラ30が決定し、データを格納するバッファ12A乃至12Dからデータを受信するカーネル14A乃至14Cのうちの1つ以上を実行する。例えば、メタ−スケジューラ30は、バッファ12A乃至12Dをラウンドロビン方式で検査することができ、及び、データを格納するバッファ12A乃至12Dからデータを消費する全カーネルを実行することができる。
実行ポリシーの他の例として、メタ−スケジューラ30は、カーネル14A乃至14Cの重要性に基づいていずれのバッファ12A乃至12Dがデータを格納するかを決定することができる。カーネル14A乃至14Cの重要性は、カーネル14A乃至14Cの優先度によって定義することができる。メタ−スケジューラ30は、最初に、カーネル14A乃至14Dの最高の優先度を有するカーネルがデータを受信するバッファ12A乃至12Dのバッファを検査することができる。そのバッファがデータを格納している場合は、メタ−スケジューラ30は、最高の優先度を有するカーネルを実行することができる。次に、メタ−スケジューラ30は、カーネル14A乃至14Dの次に最高の優先度を有するカーネルがデータを受信するバッファ12A乃至12Dのバッファを検査することができる。そのバッファがデータを格納している場合は、メタ−スケジューラ30は、次に最高の優先度を有するカーネルを実行することができ、以下同様である。
実行ポリシーのさらに他の例として、メタ−スケジューラ30は、バッファ12A乃至12Dのちのいずれが最も多くの量のデータを格納するかを決定することができる。メタ−スケジューラ30は、最も多くの量のデータを格納するバッファ12A乃至12Dのバッファからデータを受信するカーネル14A乃至14Cのカーネルを実行することができる。一例として、CPU24がバッファ12A乃至12Dのうちの1つにデータを書き込むときには、GPU24は、GPU24がデータを書き込んだバッファ12A乃至12Dのうちの1つに格納されるデータの量を示す情報を格納することができる。これらの例では、メタ−スケジューラ30は、GPU24が格納し、バッファ12A乃至12D内のデータの量を示す情報に基づいてバッファ12A乃至12Dのうちのいずれの1つが最も多くの量のデータを格納するかを決定するように構成することができる。
しかしながら、メタ−スケジューラ30を実行ポリシーを実装するように予め構成する必要がない。むしろ、コンパイラ28が、コンパイラ28によって生成されるメタ−スケジューラ命令34の命令の一部としてメタ−スケジューラ30の実行ポリシーを決定することが可能である。
さらに、開発者がメタ−スケジューラ30の実行ポリシーを定義することが可能である。例えば、開発者は、実行モデル10の一部としてメタ−スケジューラ30の実行ポリシーを定義することができ、コンパイラ28は、開発者によって定義された実行ポリシーに関してメタ−スケジューラ30に命令するメタ−スケジューラ命令34の命令を生成するためにこの開発者によって定義された実行ポリシーを利用することができる。
しかしながら、開発者が実行ポリシーを定義しないほうが適切である場合がある。例えば、開発者が実行ポリシーを定義した場合は、実行ポリシーは、プラットフォームから独立した方法では適切に機能しないことがある。すべてのGPUタイプに関して適切に機能し、決定するアプリケーションにおいて同じ機能上の結果(例えば、同じアプリケーションに関する異なるGPUタイプにわたって同じ結果)を生み出す実行ポリシーを開発者が開発するのは困難であろう。
概して、開発者は、カーネル14A乃至14Cが実行モデル10によって定義されたデータ処理アルゴリズムを実装するために適切に実行するかぎりは実行ポリシーには特別の関心を有さないであろう。従って、開発者が実行ポリシーを定義することができないかどうか、及びコンパイラ28が実行ポリシーを決定することは関係ないであろう。
上述される例においては、コンパイラ28は、GPUで実行されるオブジェクトコードを生成するために及びメタ−スケジューラ命令34を生成するために実行モデル10をコンパイルした。幾つかの例では、コンパイラ28は、GPU24で実行されるオブジェクトコードをグローバルメモリ20に格納することができる。実行モデル10が複数の実行モデルのうちの1つの実行モデルである場合は、コンパイラ28は、実行モデル10を再コンパイルする必要がない。換言すると、複数の実行モデルを結合することによって、及び幾つかの例では、グローバルメモリ20に格納された実行モデルのオブジェクトコードを結合することによって、大きなデータ処理アルゴリズムを生成することが可能である。例えば、データ処理アルゴリズムは、グローバルメモリ20に格納された実行モデルのオブジェクトコードから生成することができる。データ処理アルゴリズムの該生成は、GPU24がFPGA又は埋め込まれたデバイスである例にとって有用であることができる。
本開示において説明される技法では、メタ−スケジューラ30に関してメタ−スケジューラ命令34を取り出すようにGPU24に命令することに加えて、プロセッサ22は、GPU24がカーネル14A乃至14Cを実行するために必要な追加情報をGPU24に提供することができる。例えば、カーネル14A乃至14Cは、バッファ12A乃至12Dからのデータに加えて、機能するために追加情報(例えば、引数)を要求することができる。プロセッサ22は、該追加情報をGPU24に提供することができる。
プロセッサ22は、実行モデル10を実装するようにGPU24に命令することができる。GPU24は、メタ−スケジューラ命令34の命令及びプロセッサ22がコンパイラ28によるコンパイルプロセスの一部として生成したオブジェクトコードに基づいて実行モデル10を実装することができる。幾つかの例では、GPU24は、プロセッサ22との同期化なしで実行モデル10を実装することができる。
さらに、幾つかの例では、コンパイラ28及びメタ−スケジューラ30をデバッグモードで構成することが可能である。例えば、開発者が実行モデル10を開発した後に、開発者は、リリース前にGPUでの実行モデルの実装を試験することを希望することができる。試験に関しては、開発者は、デバイス、例えば、デバイス16、に実行モデル10をロードし、GPU24で実行モデル10を試験することができる。試験の一環として、開発者は、デバッグモードを利用することができる。デバッグモードでは、コンパイラ28は、バッファ12A乃至12Dの記憶場所の範囲を単一の記憶場所にまで狭める(例えば、NDrangeサイズを最小に小さくする)メタ−スケジューラ命令34を生成することができる。メタ−スケジューラ命令34は、カーネル14A乃至14Cのうちの1つのカーネルのみが一度に実行するように指示することもできる。
デバッグモードでは、開発者は、データがバッファ12A乃至12D内に格納されている方法、及びカーネル14A乃至14Cの各々の1つがGPU24で実行されている方法を追跡することができる。これは、開発者がカーネル14A乃至14C内の問題又は実行モデル10内の問題に対処するのを可能にすることができる。
上述されるように、コンパイラ28は、メタ−スケジューラ命令34を生成することができる。以下は、実行モデル10に関するメタ−スケジューラ命令34の擬似コード例である。幾つかの例では、メタ−スケジューラ命令34を生成する能力を開発者に与えるのではなく、コンパイラ28がメタ−スケジューラ命令34を生成するのが有益であることができる。例えば、開発者がメタ−スケジューラ命令34を生成した場合は、実行モデル10はポータブルになることができず、混乱が生じ、さらにデバッグが困難なユーザエラーが生じる可能性がある。
以下の擬似コードでは、F1は、バッファ12Aを指し示し、F2は、バッファ12Bを指し示し、F3は、バッファ12Cを指し示し、F4は、バッファ12Dを指し示す。K1は、カーネル14Aを指し示し、K2は、カーネル14Bを指し示し、K3は、カーネル14Cを指し示す。
図3は、本開示において説明される1つ以上の例による技法例を示したフローチャートである。例えば、図3は、異種計算(例えば、プラットフォームから独立した形での計算)に関する技法を例示する。例示を容易にするために、図2が参照される。
図3において例示されるように、プロセッサ22は、プラットフォームから独立した方法でデータ処理アルゴリズムを定義する実行モデル10のパイプライントポロジーのインディケーションを受信することができる(38)。例えば、実行モデル10のパイプライントポロジーのインディケーションは、実行モデル10の開発者によって作成されたコマンドリストであることができる。データ処理アルゴリズムのプラットフォームから独立したに関する定義は、実行モデル10がGPUの特定のプラットフォームに基づいて設計されていない(例えば、データ処理アルゴリズムを実装するGPUのタイプから独立している)ことを意味する。
プロセッサ22のコンパイラ28は、メタ−スケジューラ命令34を生成するためにパイプライントポロジーを指定するコマンドリストをコンパイルすることができる(40)。メタ−スケジューラ命令34は、GPU24が実行モデル10のパイプライントポロジーを実装するプラットフォームに依存した方法を指示することができる。GPU24がパイプライントポロジーを実装するプラットフォームに依存した方法は、メタ−スケジューラ命令が(例えば、GPU24のGPUタイプに基づいて)GPU構成32によって示されるGPU24の特定のプラットフォームに基づくことを意味する。プロセッサ22は、実行モデル10のパイプライントポロジーを実装するようにGPU24に命令するための命令を送信することができる(42)。
プロセッサ22が、コンパイラ28を介して、メタ−スケジューラ命令34を生成することができる様々な方法が存在する。一例として、コンパイラ28は、実行モデル10のパイプライントポロジーがGPU24に実装されるプラットフォームに依存する方法を定義する命令を生成するためにGPU24の構成情報に少なくとも基づいてコマンドリストをコンパイルすることができる。GPU構成32は、GPU24の構成情報を提供することができる。例えば、構成情報は、GPU24内のプログラマブル計算ユニット数を含むことができる。構成情報は、GPU24内のデータレーン数(すなわち、GPU24のSIMD又はSPMD能力)を含むことができる。
幾つかの例では、コンパイラ28は、実行モデル10で提供された情報に基づいてコマンドリストをコンパイルすることができる。例えば、コンパイラ28は、メタ−スケジューラ命令34を生成するために実行モデル10のパイプライントポロジーで識別されたバッファ(例えば、バッファ12A乃至12D)のサイズに基づいてコマンドリストをコンパイルすることができる。他の例として、コンパイラ28は、メタ−スケジューラ命令34を生成するために実行モデル10のパイプライントポロジーで識別されたカーネル(例えば、カーネル14A乃至14C)の重要性に基づいてコマンドリストをコンパイルすることができる。
幾つかの要因、例えば、GPU24におけるプログラマブル計算ユニット数、GPU24におけるデータレーン数、バッファ12A乃至12Dのサイズ、及びカーネル14A乃至14Cの重要性、等を利用するコンパイラ28は、例示を目的として提供されるものであり、限定するとはみなされるべきでないことが理解されるべきである。さらに、コンパイラ28は、要因を単独で又はあらゆる組み合わせで利用することができる。例えば、コンパイラ28は、メタ−スケジューラ命令34を生成する際にこれらの要因のうちの1つのみを利用する必要はない。むしろ、コンパイラ28は、メタ−スケジューラ命令34を生成するためにこれらの要因のうちの1つ、これらの要因のうちの1つ以上、及びこれらの要因のあらゆる組み合わせを利用することができる。
図4は、図2のデバイスをさらに詳細に例示したブロック図である。例えば、図4は、デバイス16をさらに例示する。デバイス16の例は、無線デバイス、携帯電話、パーソナルデジタルアシスタント(PDA)、ビデオディスプレイを含むビデオゲームコンソール、モバイルビデオ会議装置、ラップトップコンピュータ、デスクトップコンピュータ、テレビセットトップボックス、ダフレットコンピューティングデバイス、電子書籍リーダー、等を含み、ただしこれらには限定されない。デバイス16は、プロセッサ22と、GPU24と、グローバルメモリ20と、ディスプレイ44と、ユーザインタフェース46と、トランシーバモジュール48と、を含むことができる。プロセッサ22及びGPU24は、図4において例示されるように、共通のIC18内に収納することができ、又は別々に収納することができる。さらに、例示されるように、プロセッサ22は、メタ−スケジューラ命令34を生成するためにコンパイラ28を実行することができ、GPU24は、メタ−スケジューラ命令34の命令を実装するように構成されたメタ−スケジューラ30を含む。
デバイス16は、明確化のために図4には示されていない追加のモジュール又はユニットを含むことができる。例えば、デバイス16は、デバイス16がモバイル無線電話である例において電話通信を有効にするためのスピーカーとマイクとを含むことができ、これらはいずれも図4には示されていない。さらに、デバイス16内に示される様々なモジュール及びユニットは、デバイス16のすべての例において必要であるわけではない。例えば、ユーザインタフェース46及びディスプレイ44は、デバイス16がデスクトップコンピュータである例ではデバイス16の外部に存在することができる。他の例として、ユーザインタフェース46は、ディスプレイ44がモバイルデバイスのタッチ感応式又はプレゼンス感応式(presence−sensitive)のディスプレイである例ではディスプレイ44の一部であることができる。
グローバルメモリ20、プロセッサ22、GPU24、コンパイラ28、及びメタ−スケジューラ30は、グローバルメモリ20、プロセッサ22、GPU24、コンパイラ28、及びメタ−スケジューラ30に類似するものであり、図4に関してはこれ以上は説明されない。ユーザインタフェース46の例は、トラックボールと、マウスと、キーボードと、その他のタイプの入力デバイスとを含み、ただしこれらに限定されない。ユーザインタフェース46は、タッチ画面であることもでき、ディスプレイ44の一部として組み入れることができる。トランシーバモジュール48は、デバイス16と他のデバイス又はネットワークとの間の無線又は有線通信を可能にするための回路を含むことができる。トランシーバモジュール48は、変調器と、復調器と、増幅器と、有線又は無線通信のためのその他の該回路と、を含むことができる。ディスプレイ44は、液晶ディスプレイ(LCD)、陰極線管(CRT)ディスプレイ、プラズマディスプレイ、タッチ感応式ディスプレイ、プレゼンス感応式ディスプレイ、又は他のタイプのディスプレイデバイスを備えることができる。
1つ以上の例では、説明される機能は、ハードウェア、ソフトウェア、ファームウェア、又はそれらのあらゆる組み合わせにおいて実装することができる。ソフトウェアにおいて実装される場合は、それらの機能は、コンピュータによって読み取り可能な媒体において1つ以上の命令又はコードとして格納又は送信すること及びハードウェアに基づく処理ユニットによって実行することができる。コンピュータによって読み取り可能な媒体は、コンピュータによって読み取り可能な記憶媒体を含むことができ、それは、有形な媒体、例えば、データ記憶媒体、又は、例えば、通信プロトコルにより、1つの場所から他へのコンピュータプログラムの転送を容易にするあらゆる媒体を含む通信媒体、に対応する。このように、コンピュータによって読み取り可能な媒体は、概して、(1)非一時的である有形なコンピュータによって読み取り可能な記憶媒体又は(2)通信媒体、例えば、信号又は搬送波、に対応することができる。データ記憶媒体は、本開示において説明される技法の実装のために命令、コード及び/又はデータ構造を取り出すために1つ以上のコンピュータ又は1つ以上のプロセッサによってアクセスすることができるあらゆる利用可能な媒体であることができる。コンピュータプログラム製品は、コンピュータによって読み取り可能な媒体を含むことができる。
一例により、及び制限することなしに、該コンピュータによって読み取り可能な記憶媒体は、希望されるプログラムコードを命令又はデータ構造の形態で格納するために使用することができ及びコンピュータによってアクセス可能であるRAM、ROM、EEPROM、CD−ROM又はその他の光学ディスク記憶装置、磁気ディスク記憶装置、又はその他の磁気記憶デバイス、フラッシュメモリ、又はその他のいずれかの媒体を備えることができる。さらに、どのような接続も、コンピュータによって読み取り可能な媒体であると適切に呼ばれる。例えば、命令が、同軸ケーブル、光ファイバケーブル、より対線、デジタル加入者ライン(DSL)、又は無線技術、例えば、赤外線、無線、及びマイクロ波、を用いてウェブサイト、サーバ、又はその他の遠隔ソースから送信される場合は、該同軸ケーブル、光ファイバケーブル、より対線、DSL、又は無線技術、例えば赤外線、無線、及びマイクロ波、は、媒体の定義の中に含まれる。しかしながら、コンピュータによって読み取り可能な記憶媒体およびデータ記憶媒体は、接続、搬送波、信号、又はその他の一時的な媒体は含まず、代わりに、非一時的な、有形の記憶媒体を対象とすることが理解されるべきである。ここにおいて用いられるときのディスク(disk及びdisc)は、コンパクトディスク(CD)(disc)と、レーザディスク(disc)と、光ディスク(disc)と、デジタルバーサタイルディスク(DVD)(disc)と、フロッピー(登録商標)ディスク(disk)と、Blu−ray(登録商標)ディスク(disc)と、を含み、ここで、diskは、通常は磁気的にデータを複製し、discは、レーザを用いて光学的にデータを複製する。上記の組み合わせも、コンピュータによって読み取り可能な媒体の適用範囲内に含められるべきである。
命令は、1つ以上のプロセッサ、例えば、1つ以上のデジタル信号プロセッサ(DSP)、汎用マイクロプロセッサ、特定用途向け集積回路(ASIC)、フィールドプログラマブルロジックアレイ(FPGA)又はその他の同等の集積回路又はディスクリート論理回路によって実行することができる。従って、ここにおいて用いられる場合の用語“プロセッサ”は、上記の構造又はここにおいて説明される技法の実装に適するあらゆるその他の構造のうちのいずれかを意味することができる。さらに、幾つかの態様では、ここにおいて説明される機能は、符号化および復号のために構成された専用のハードウェア及び/又はソフトウェアモジュール内において提供されること、又は組み合わされたコーデック内に組み入れることができる。さらに、技法は、1つ以上の回路又は論理素子内に完全に実装することが可能である。
本開示の技法は、無線ハンドセット、集積回路(IC)又は一組のIC(例えば、チップセット)を含む非常に様々なデバイス又は装置内に実装することができる。本開示では、開示される技法を実施するように構成されたデバイスの機能上の態様を強調するために様々なコンポーネント、モジュール、又はユニットが説明されるが、異なるハードウェアユニットによる実現は必ずしも要求しない。むしろ、上述されるように、様々なユニットは、適切なソフトウェア及び/又はファームウェアと関係させて、ハードウェアユニット内において結合させること又は上述されるように1つ以上のプロセッサを含む相互運用的なハードウェアユニットの集合によって提供することができる。
様々な例が説明されている。これらの及びその他の例は、以下の請求項の範囲内である。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
[C1]
異種計算のための方法であって、
プロセッサを用いて、プラットフォームから独立した方法でデータ処理アルゴリズムを定義する実行モデルのパイプライントポロジーを受信することと、
前記プロセッサを用いて、前記実行モデルの前記パイプライントポロジーがグラフィックス処理ユニット(GPU)に実装されるプラットフォームに依存する方法を指示する命令を生成することであって、前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存する方法は、前記GPUのプラットフォームに基づくことと、
前記プロセッサを用いて、前記GPUに前記命令を送信することと、を備える、方法。
[C2]
命令を生成することは、前記命令を生成するために前記実行モデルの前記パイプライントポロジーを指定するコマンドリストをコンパイルすることを備えるC1に記載の方法。
[C3]
前記コマンドリストをコンパイルすることは、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存する方法を定義する前記命令を生成するために前記GPUの構成情報に少なくとも基づいて前記コマンドリストをコンパイルすることを備えるC2に記載の方法。
[C4]
前記GPUの前記構成情報は、
前記GPU内のプログラマブル計算ユニット数、及び
前記GPU内のデータレーン数
のうちの1つ以上を備えるC3に記載の方法。
[C5]
前記コマンドリストをコンパイルすることは、
前記実行モデルの前記パイプライントポロジーにおいて識別されたバッファのサイズ、及び
前記実行モデルの前記パイプライントポロジーにおいて識別されたカーネルの重要性
のうちの1つ以上に少なくとも基づいて前記コマンドリストをコンパイルすることを備えるC2に記載の方法。
[C6]
前記パイプライントポロジーを受信することは、
前記パイプライントポロジーを形成するために相互に接続された1つ以上のカーネル及び1つ以上のバッファを示すコマンドリストを受信することを備えるC1に記載の方法。
[C7]
装置であって、
グラフィックス処理ユニット(GPU)と、
プラットフォームから独立した方法でデータ処理アルゴリズムを定義する実行モデルのパイプライントポロジーのインディケーションを受信し、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装されるプラットフォームに依存した方法を指示する命令を生成し、及び
前記GPUに前記命令を送信するように構成されたプロセッサと、を備え、前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存した方法は、前記GPUのプラットフォームに基づく、装置。
[C8]
前記命令を生成するために、前記プロセッサは、
前記実行モデルの前記パイプライントポロジーを指定するコマンドリストをコンパイルように構成されるC7に記載の装置。
[C9]
前記コマンドリストをコンパイルするために、前記プロセッサは、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存した方法を定義する前記命令を生成するために前記GPUの構成情報に少なくとも基づいて前記コマンドリストをコンパイルするように構成されるC8に記載の装置。
[C10]
前記GPUの前記構成情報は、
前記GPU内のプログラマブル計算ユニット数、及び
前記GPU内のデータレーン数
のうちの1つ以上を備えるC9に記載の装置。
[C11]
前記コマンドリストをコンパイルするために、前記プロセッサは、
前記実行モデルの前記パイプライントポロジーにおいて識別されたバッファのサイズ、及び
前記実行モデルの前記パイプライントポロジーにおいて識別されたカーネルの重要性
のうちの1つ以上に少なくとも基づいて前記コマンドリストをコンパイルするように構成されるC8に記載の装置。
[C12]
前記パイプライントポロジーを受信するために、前記プロセッサは、
前記パイプライントポロジーを形成するために相互に接続された1つ以上のカーネル及び1つ以上のバッファを示すコマンドリストを受信するように構成されるC7に記載の装置。
[C13]
前記装置は、
メディアプレーヤー、
セットトップボックス、
無線ハンドセット、
デスクトップコンピュータ
ラップトップコンピュータ
ゲームコンソール
ビデオ会議装置、及び
タブレットコンピューティングデバイス、
のうちの1つを備えるC7に記載の装置。
[C14]
コンピュータによって読み取り可能な記憶媒体であって、
1つ以上のプロセッサによって実行されたときに、
プラットフォームから独立した方法でデータ処理アルゴリズムを定義する実行モデルのパイプライントポロジーのインディケーションを受信し、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装されるプラットフォームに依存した方法を指示する命令を生成し、及び
前記GPUに前記命令を送信することを前記1つ以上のプロセッサに行わせる命令が格納されており、前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存した方法は、前記GPUのプラットフォームに基づく、コンピュータによって読み取り可能な記憶媒体。
[C15]
命令を生成することを前記1つ以上のプロセッサに行わせる前記命令は、
前記命令を生成するために前記実行モデルの前記パイプライントポロジーを指定するコマンドリストをコンパイルすることを前記1つ以上のプロセッサに行わせる命令を備えるC14に記載のコンピュータによって読み取り可能な記憶媒体。
[C16]
前記コマンドリストをコンパイルすることを前記1つ以上のプロセッサに行わせる前記命令は、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装される前記プラットフォームに依存した方法を定義する前記命令を生成するために前記GPUの構成情報に少なくとも基づいて前記コマンドリストをコンパイルすることを前記1つ以上のプロセッサに行わせる命令を備えるC15に記載のコンピュータによって読み取り可能な記憶媒体。
[C17]
前記GPUの前記構成情報は、
前記GPU内のプログラマブル計算ユニット数、及び
前記GPU内のデータレーン数
のうちの1つ以上を備えるC16に記載のコンピュータによって読み取り可能な記憶媒体。
[C18]
前記コマンドリストをコンパイルすることを前記1つ以上のプロセッサに行わせる前記命令は、
前記実行モデルの前記パイプライントポロジーにおいて識別されたバッファのサイズ、及び
前記実行モデルの前記パイプライントポロジーにおいて識別されたカーネルの重要性
のうちの1つ以上に少なくとも基づいて前記コマンドリストをコンパイルすることを前記1つ以上のプロセッサに行わせる命令を備えるC15に記載のコンピュータによって読み取り可能な記憶媒体。
[C19]
装置であって、
グラフィックス処理ユニット(GPU)と、
プラットフォームから独立した方法でデータ処理アルゴリズムを定義する実行モデルのパイプライントポロジーを受信するための手段と、
前記実行モデルの前記パイプライントポロジーが前記GPUに実装されるプラットフォームに依存した方法を指示する命令を生成するための手段であって、前記実行モデルの前記パイプライントポロジーが前記GPUで実装される前記プラットフォームに依存した方法は、前記GPUのプラットフォームに基づく手段と、
前記GPUに前記命令を送信するための手段と、を備える、装置。
[C20]
命令を生成するための前記手段は、
前記命令を生成するために前記実行モデルの前記パイプライントポロジーを指定するコマンドリストをコンパイルするための手段を備えるC19に記載の装置。