(57)【特許請求の範囲】
【請求項１】
複数のシェーダプロセッサを有するグラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法であって、
前記複数のシェーダプロセッサのうちの第１のシェーダプロセッサに関する実行順序を受信することであって、前記実行順序が、前記受信された実行順序に関連する入力データに対して作用するように、複数のカーネル指定および指定されたカーネルに含まれるワークグループの複数のワークグループ指定を含む、受信することと、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサに割り当てることと、
前記第１のシェーダプロセッサのローカルメモリに前記入力データを記憶することと、
前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサによって、前記入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別された前記カーネルのワークグループを実行することであって、前記カーネルのワークグループの実行中に前記ローカルメモリ内に前記入力データを保持することを含む、実行することと、を備える方法。
【請求項２】
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが前記ＧＰＵによって実施される機能を定義する、請求項１に記載の方法。
【請求項３】
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、請求項１に記載の方法。
【請求項４】
前記実行順序を受信することが、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信することを含み、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが前記入力データに関連づけられる、請求項１に記載の方法。
【請求項５】
前記実行順序を実行することが、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサによって、前記第1のカーネルの前記第1のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行することを含む、請求項４に記載の方法。
【請求項６】
前記複数のシェーダプロセッサのうちの第２のシェーダプロセッサに関する第２の実行順序を受信することであって、前記第２の実行順序が、前記受信された第２の実行順序に関連する第２の入力データに対して作用するように、前記複数のカーネル指定および指定されたカーネルに含まれるワークグループの第２の複数のワークグループ指定を含む、受信することと、
前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを、前記第２のシェーダプロセッサに割り当てることと、
前記第２のシェーダプロセッサのローカルメモリに前記第２の入力データを記憶することと、
前記第２のシェーダプロセッサによって、前記入力データを処理するために前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを実行することであって、前記ワークグループの実行中に前記第２のシェーダプロセッサの前記ローカルメモリ内に前記第２の入力データを保持することを含む、実行することと、をさらに備える、請求項１に記載の方法。
【請求項７】
前記第２の実行順序を受信することが、第１のカーネルの第３のワークグループを第２のカーネルの第４のワークグループにリンクさせる指定を受信することを含み、前記第１のカーネルの前記第３のワークグループおよび前記第２のカーネルの前記第４のワークグループが前記第２の入力データに関連づけられ、
前記第２の実行順序を実行することが、前記複数のシェーダプロセッサのうちの前記第２のシェーダプロセッサによって、前記第１のカーネルの前記第３のワークグループの後に前記第２のカーネルの前記第４のワークグループを実行することを含む、請求項６に記載の方法。
【請求項８】
ユーザ入力に応答して、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を用いて前記実行順序を定義する前記入力を生成することをさらに含む、請求項１に記載の方法。
【請求項９】
複数のシェーダプロセッサを有するグラフィックス処理ユニット（ＧＰＵ）であって、前記ＧＰＵが、
前記複数のシェーダプロセッサのうちの第１のシェーダプロセッサに関する実行順序を受信するように構成されたシーケンサ・モジュールであって、前記実行順序が、前記受信された実行順序に関連する入力データに対して作用するように、複数のカーネル指定および指定されたカーネルに含まれるワークグループの複数のワークグループ指定を備える、シーケンサ・モジュールと、
ここで、前記シーケンサ・モジュールが、前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサに割り当てるように構成され、
前記入力データを記憶するように構成された前記第１のシェーダプロセッサのローカルメモリと、
ここで、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサが、前記入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループを実行することであって、前記カーネルのワークグループの実行中に前記ローカルメモリ内に前記入力データを保持することを含む、実行することを行うように構成される、
を備える、グラフィックス処理ユニット（ＧＰＵ）。
【請求項１０】
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが、前記ＧＰＵによって実施される機能を定義する、請求項９に記載のＧＰＵ。
【請求項１１】
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、請求項９に記載のＧＰＵ。
【請求項１２】
前記シーケンサ・モジュールが、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信するようにさらに構成され、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが前記入力データに関連づけられる、請求項９に記載のＧＰＵ。
【請求項１３】
前記シェーダプロセッサが、前記第１のカーネルの前記第１のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行するようにさらに構成される、請求項１２に記載のＧＰＵ。
【請求項１４】
前記シーケンサ・モジュールが、さらに、前記複数のシェーダプロセッサのうちの第２のシェーダプロセッサに関する第２の実行順序を受信するように構成され、前記第２の実行順序は、前記受信された第２の実行順序に関連する第２の入力データに対して作用するように、前記複数のカーネル指定および指定されたカーネルに含まれるワークグループの第２の複数のワークグループ指定を含み、
前記シーケンサ・モジュールが、前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを、前記第２のシェーダプロセッサに割り当てるように構成され、
前記ＧＰＵが、前記第２の入力データを記憶するように構成された前記第２のシェーダプロセッサの第２のローカルメモリをさらに備え、
前記第２のシェーダプロセッサが、前記入力データを処理するために前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを実行することであって、前記ワークグループの実行中に前記第２のシェーダプロセッサの前記ローカルメモリ内に前記第２の入力データを保持することを含む、実行すること、を行うように構成される、請求項９に記載のＧＰＵ。
【請求項１５】
前記第２の実行順序を受信することが、第１のカーネルの第３のワークグループを第２のカーネルの第４のワークグループにリンクさせる指定を受信することを含み、前記第１のカーネルの前記第３のワークグループおよび前記第２のカーネルの前記第４のワークグループが前記第２の入力データに関連づけられ、
前記第２の実行順序を実行することが、前記複数のシェーダプロセッサのうちの前記第２のシェーダプロセッサによって、前記第１のカーネルの前記第３のワークグループの後に前記第２のカーネルの前記第４のワークグループを実行することを含む、請求項１４に記載のＧＰＵ。
【請求項１６】
複数のシェーダプロセッサを有するグラフィックス処理ユニット（ＧＰＵ）であって、前記ＧＰＵが、
前記複数のシェーダプロセッサのうちの第１のシェーダプロセッサに関する実行順序を受信するための手段であって、前記実行順序が、前記受信された実行順序に関連する入力データに対して作用するように、複数のカーネル指定および指定されたカーネルに含まれるワークグループの複数のワークグループ指定を含む、受信するための手段と、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサに割り当てるための手段と、
前記第１のシェーダプロセッサのローカルメモリに前記入力データを記憶するための手段と、
前記入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループを実行するための手段であって、前記実行することが前記カーネルのワークグループの実行中に前記ローカルメモリ内に前記入力データを保持することを含む、実行するための手段と、を備えるグラフィックス処理ユニット（ＧＰＵ）。
【請求項１７】
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが前記ＧＰＵによって実施される機能を定義する、請求項１６に記載のＧＰＵ。
【請求項１８】
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが、前記ＧＰＵによって入力データに対して実行される命令を含む、請求項１６に記載のＧＰＵ。
【請求項１９】
前記実行順序を受信するための前記手段が、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信するようにさらに構成され、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが前記入力データに関連づけられる、請求項１６に記載のＧＰＵ。
【請求項２０】
実行するための前記手段が、前記第１のカーネルの前記第１のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行するようにさらに構成される、請求項１９に記載のＧＰＵ。
【請求項２１】
前記複数のシェーダプロセッサのうちの第２のシェーダプロセッサに関する第２の実行順序を受信するための手段であって、前記第２の実行順序が、前記受信された第２の実行順序に関連する第２の入力データに対して作用するように、前記複数のカーネル指定および指定されたカーネルに含まれるワークグループの第２の複数のワークグループ指定を含む、第２の実行順序を受信するための手段と、
前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを、前記第２のシェーダプロセッサに割り当てるための手段と、
前記第２のシェーダプロセッサのローカルメモリに前記第２の入力データを記憶するための手段と、
前記第２のシェーダプロセッサによって、前記入力データを処理するために前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを実行するための手段であって、前記実行することが前記ワークグループの実行中に前記第２のシェーダプロセッサの前記ローカルメモリ内に前記第２の入力データを保持することを含む、実行するための手段と、をさらに備える、請求項１６に記載のＧＰＵ。
【請求項２２】
前記第２の実行順序を受信するための手段が、第１のカーネルの第３のワークグループを第２のカーネルの第４のワークグループにリンクさせる指定を受信するための手段を含み、前記第１のカーネルの前記第３のワークグループおよび前記第２のカーネルの前記第４のワークグループが前記第２の入力データに関連づけられ、
前記第２の実行順序を実行するための手段が、前記複数のシェーダプロセッサのうちの前記第２のシェーダプロセッサによって、前記第１のカーネルの前記第３のワークグループの後に前記第２のカーネルの前記第４のワークグループを実行するための手段を含む、請求項２１に記載のＧＰＵ。
【請求項２３】
コンピュータ可読記憶媒体であって、
複数のシェーダプロセッサのうちの第１のシェーダプロセッサに関する実行順序を受信することであって、前記実行順序が、前記受信された実行順序に関連する入力データに対して作用するように、複数のカーネル指定および指定されたカーネルに含まれるワークグループの複数のワークグループ指定を含む、受信することと、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを、前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサに割り当てることと、
前記第１のシェーダプロセッサのローカルメモリに前記入力データを記憶することと、
前記複数のシェーダプロセッサのうちの前記第１のシェーダプロセッサによって、前記入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループを実行することであって、前記カーネルのワークグループの実行中に前記ローカルメモリ内に前記入力データを保持することを含む、実行することと、
を、複数のシェーダプロセッサを含むグラフィックス処理ユニット（ＧＰＵ）を有するコンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに行わせるための命令でエンコードされたコンピュータ可読記憶媒体。
【請求項２４】
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが、前記ＧＰＵによって実施される機能を定義する、請求項２３に記載のコンピュータ可読記憶媒体。
【請求項２５】
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、請求項２３に記載のコンピュータ可読記憶媒体。
【請求項２６】
第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信することをコンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに行わせるための命令をさらに備え、
前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが前記入力データに関連づけられる、請求項２３に記載のコンピュータ可読記憶媒体。
【請求項２７】
前記実行順序を実行することが、前記シェーダプロセッサによって、前記第1のカーネルの前記第1のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行することを含む、請求項２６に記載のコンピュータ可読記憶媒体。
【請求項２８】
前記複数のシェーダプロセッサのうちの第２のシェーダプロセッサに関する第２の実行順序を受信することであって、前記第２の実行順序が、前記受信された第２の実行順序に関連する第２の入力データに対して作用するように、前記複数のカーネル指定および指定されたカーネルに含まれるワークグループの第２の複数のワークグループ指定を含む、受信することと、
前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを、前記第２のシェーダプロセッサに割り当てることと、
前記第２のシェーダプロセッサのローカルメモリに前記第２の入力データを記憶することと、
前記第２のシェーダプロセッサによって、前記入力データを処理するために前記第２の複数のワークグループ指定において識別されたカーネルのワークグループを実行することであって、前記ワークグループの実行中に前記第２のシェーダプロセッサの前記ローカルメモリ内に前記第２の入力データを保持することを含む、実行することと、
を前記１つまたは複数のプログラマブルプロセッサに行わせる命令をさらに備える、請求項２３に記載のコンピュータ可読記憶媒体。
【請求項２９】
前記第２の実行順序を受信するために、前記命令が、第１のカーネルの第３のワークグループを第２のカーネルの第４のワークグループにリンクさせる指定を受信することを前記１つまたは複数のプログラマブルプロセッサに行わせ、ここで、前記第１のカーネルの前記第３のワークグループおよび前記第２のカーネルの前記第４のワークグループは、前記第２の入力データに関連づけられ、
前記第２の実行順序を実行するために、前記１つまたは複数のプログラマブルプロセッサが、前記複数のシェーダプロセッサのうちの前記第２のシェーダプロセッサによって、前記第１のカーネルの前記第３のワークグループの後に前記第２のカーネルの前記第４のワークグループを実行する、請求項２８に記載のコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理することに関する。
【背景技術】
【０００２】
グラフィックス処理デバイスは、様々な画像処理またはその他の汎用処理アプリケーションを実行するために実装され得る。例えば、グラフィックス処理ユニット（ＧＰＵ、場合によっては、汎用グラフィックス処理ユニット（ＧＰＧＰＵ）と呼ばれる）は、色補正アルゴリズム、顔検出アルゴリズム、パターン認識アルゴリズム、拡張現実アプリケーション、様々なアルゴリズム・アプリケーション（例えば、ウェーブレット変換、フーリエ変換など）、または様々なその他のアプリケーションのような、高度の並列化から恩恵を受けるアプリケーションを実行することができる。
【０００３】
一般的に、ＧＰＵは、ＧＰＵ内に存在する１つまたは複数のシェーダプロセッサを用いて、シェーダ命令と呼ばれ得る、一連の命令を処理するように設計される。画像処理アプリケーションの一例において、シェーダ命令は、画像を構成するピクセル上でシェーダプロセッサによって実施されるべき１つまたは複数の数学的演算を定義することができる。ピクセルにシェーダ命令を適用することによって、ピクセル値は、シェーダ命令によって定義される数学的演算に従って変更されるか、または評価される。
【０００４】
シェーダ命令は、カーネルとして知られるシェーダプログラムコードに編成され得る。カーネルは、ＧＰＵによって実施される機能またはタスクを定義することができる。カーネルを実行するために、プログラムコードは、ワークアイテム（例えば、ＧＰＵにおけるワークの基本単位）に分割され、ワークアイテムは、１つまたは複数のワークグループ（例えば、ワークアイテムのセット）へと編成される。
【発明の概要】
【０００５】
一般的に、本開示の態様は、グラフィックス処理に関するカーネルおよびワークグループ実行順序（execution orders）の生成および処理に関する。カーネルおよびワークグループ実行順序は、グラフィックス処理ユニット（ＧＰＵ）のシェーダプロセッサ（ＳＰ）に関連づけられたメモリリソースの管理を提供することができる。例えば、カーネルおよびワークグループ実行順序は、ＳＰのローカルメモリリソースに記憶されたデータが異なるカーネルのワークグループによって共有されることを可能にする。一例において、本開示の態様は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法に関する。該方法は、シェーダプロセッサに関する実行順序を定義する入力を受信することを含み、実行順序は、複数のカーネル指定および複数のワークグループ指定を備える。該方法はまた、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループをシェーダプロセッサに割り当てることを含む。この方法はまた、入力データを処理するために、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループを、シェーダプロセッサによって実行することを含む。
【０００６】
別の例において、本開示の態様は、シーケンサ・モジュールを備えるグラフィックス処理ユニット（ＧＰＵ）に関する。シーケンサ・モジュールは、シェーダプロセッサに関する実行順序を定義する入力を受信するように構成され、実行順序は、複数のカーネル指定および複数のワークグループ指定を備える。シーケンサ・モジュールはまた、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループをシェーダプロセッサに割り当てるように構成される。シェーダプロセッサは、入力データを処理するために、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループを実行するように構成される。
【０００７】
別の例において、本開示の態様は、コンピューティングデバイスの１つまたは複数のプログラマブルプロセッサにシェーダプロセッサに関する実行順序を定義する入力を受信させるための命令を用いて符号化されたコンピュータ可読記憶媒体に関し、実行順序は、複数のカーネル指定および複数のワークグループ指定を備える。該命令はまた、コンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループをシェーダプロセッサに割り当てさせる。命令はまた、入力データを処理するために、コンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループを、シェーダプロセッサによって実行させる。
【０００８】
別の例において、本開示の態様は、シェーダプロセッサに関する実行順序を定義する入力を受信するための手段を備えるグラフィックス処理ユニット（ＧＰＵ）に関し、実行順序は複数のカーネル指定および複数のワークグループ指定を備える。ＧＰＵはまた、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループをシェーダプロセッサに割り当てるための手段を備える。ＧＰＵはまた、入力データを処理するために、複数のワークグループ指定および複数のカーネル指定において識別されたカーネルのワークグループを、シェーダプロセッサによって実行するための手段を備える。
【０００９】
１つまたは複数の例の詳細は、添付の図面および以下の説明において示される。他の特徴、目的、および利点は、説明および図面、ならびに特許請求の範囲から明白であろう。
【図面の簡単な説明】
【００１０】
【図１】図１は、本開示の態様を実施するように構成されることができるグラフィックス処理ユニット（ＧＰＵ）を有するコンピューティングデバイスを示すブロック図である。
【図２】図２は、本開示の態様による、ＧＰＵによって実行され得る、画像を処理するための命令に関連づけられた画像データを有する画像の例を示すブロック図である。
【図３】図３は、本開示の態様による、ＧＰＵによって実行され得る３つのカーネルを有するアプリケーションを示すブロック図である。
【図４】図４は、本開示の態様を実行するように構成され得るＧＰＵを示すブロック図である。
【図５】図５は、本開示の態様による、第１のカーネル、第２のカーネル、および第３のカーネル１４６のワークグループを分配するように構成されたシーケンサ・モジュールの例を示すブロック図である。
【図６】図６は、本開示の態様による、第１のカーネル、第２のカーネル、および第３のカーネルのワークグループを分配するように構成されたシーケンサ・モジュールの例を示すブロック図である。
【図７】図７は、本開示の態様による、実行順序のストリームを割り当てる例を示すブロック図である。
【図８】図８は、本開示の態様による、実行順序の１つまたは複数のストリームを生成および実行する方法を示すフローチャートである。
【詳細な説明】
【００１１】
本開示の態様は、一般的に、ＧＰＧＰＵとして実装され得るＧＰＵのシェーダプロセッサ（ＳＰ）による実行のためのシェーダ命令のストリームを定義および生成することに関する。通常、ＧＰＵは、１つまたは複数のシェーダプログラム（ここでは「カーネル」と呼ばれる）を実行するように設計された複数のＳＰを含む。カーネルは、様々な入力データを解析または修正するために実装され得る機能を定義する。例としては、比較的大きい数値データのセットを並列に処理するための機能が含まれる。画像処理のコンテキストにおいて、機能は、例えば、色補正アルゴリズム、顔検出アルゴリズム、または拡張現実アプリケーションを実行するための機能を含むことができる。その他の例は、変換機能、レイ・トレーシングに関する機能、または様々なその他の機能を含む。
【００１２】
カーネルは、複数のワークグループにグループ分けされる個々のワークアイテム（例えば、ＧＰＵにおけるワークの基本単位）を備える。ＧＰＵが画像（例えば、ビデオデータのフレーム、コンピュータ生成グラフィックス画像、静止画像等）を処理するために実装されるひとつの例では、入力データは画像であり、ワークアイテムは、その画像のピクセルを解析または修正するように構成される。複数のワークアイテムは、ワークグループ（例えば、ワークアイテムのセット）に編成され得る。したがって、画像処理の例において、ワークグループは、画像におけるピクセルの特定のグループに関連する命令を含み得る。
【００１３】
カーネルを実行するときには、ＧＰＵは、ＳＰがワークグループを実行することができる前に、ＳＰのローカルメモリに、ワークグループに関連づけられた入力データをロードする。一般的に、ＧＰＵがカーネルを実行するときには、ＧＰＵは、どのＳＰが特定のワークグループを実行するかを識別または制御することなくＳＰにカーネルのワークグループを割り当てる。例えば、ＧＰＵは、ＧＰＵアプリケーション開発者（例えば、コンピュータ・プログラマー）によって設定可能ではない固定パターンでＳＰにワークグループを分配するハードウェアを含み得る。こういった例において、ＧＰＵは、次のカーネルに進む前に、特定のカーネルに関連づけられた全てのワークグループを均一に分配し、実行することによって、複数のカーネルを有するアプリケーションを順次に実行する。
【００１４】
ワークグループデータは、通常、ＳＰ間で共有されない。例えば、ＳＰは、ＧＰＵ内の、通常は別々の、物理的に分離されたユニットであり、ＧＰＵアプリケーション開発者は、どのＳＰが特定のワークグループを実行するかを制御しない。従って、同じまたは実質的に同じ入力データを処理する複数のカーネルを有するアプリケーションでは、特定のワークグループに関連づけられた入力データは、異なるＳＰのローカルメモリにロードされる必要があり得る。例えば、ＧＰＵのどのＳＰが特定のカーネルの特定のワークグループを実行するかを制御する能力なしに、第２のカーネルのワークグループと同じ入力データを有する第１のカーネルのワークグループは、ＧＰＵの異なるＳＰによって処理され得る。
【００１５】
本開示の態様は、カーネルおよびワークグループ実行順序を生成および処理することに関する。カーネルおよびワークグループ実行順序は、ＧＰＵのＳＰに関連づけられたローカルメモリリソースの管理を支援する。例えば、ＧＰＵによって実行されるカーネルおよびワークグループ実行順序は、ＳＰローカルメモリに記憶されたデータが異なるカーネルのワークグループによって共有されることを可能にする。カーネルおよびワークグループ実行順序は、「命令ストリーム」と呼ばれ得る。命令ストリームは、ひとつのカーネルのひとつのワークグループに関連づけられた入力データが、単一のＳＰを使用して他の複数のカーネルによって共有され直列的に実行され得るように、ワークグループとカーネルをつなぎ合わせ、または仮想的にリンクさせる。命令ストリームを生成することによって、入力データは、ローカルＳＰメモリ内にとどまることが可能であり、複数のカーネルのワークグループにとって利用可能であり得る。命令ストリームを作り出すと、同じデータを何度もフェッチするために算術論理ユニット（ＡＬＵ）演算が必ずしも必要ではないので、メモリ帯域幅消費量ならびにＳＰ算術論理ユニット（ＡＬＵ）の演算が低減される。
【００１６】
いくつかの例において、カーネルおよびワークグループ実行順序は、ＧＰＵが、同じかまたは実質的に同じ入力データを処理する複数のカーネルを有するアプリケーションを実行しているときに有用である。ひとつの実施例において、ＧＰＵは、画像（例えば、ビデオデータのフレーム、コンピュータ生成グラフィックス画像、静止画像等）を処理するために実装されることができる。この例において、ワークアイテムは、画像の特定のピクセルに関連する命令に対応し得る。複数のワークアイテムは、画像のピクセルの特定のグループに関連する命令を含むワークグループへと編成され得る。ピクセルのグループに関連づけられたワークグループを処理するときには、ＧＰＵは、ＳＰのローカルメモリにピクセルのグループに関連づけられた画像データをロードする。
【００１７】
ＧＰＵのどのＳＰが特定のワークグループを実行するかを制御する能力がなければ、画像処理の例では、順次に複数のカーネルを実行すると、同じ入力画像領域が異なるＳＰによって処理されることになり得る。例えば、第１のカーネルを実行するために、ＧＰＵは、画像全体に関連づけられたデータを、一度にひとつのワークグループで、実行のためにＧＰＵのＳＰのローカルメモリにロードする。第１のカーネルを実行した後に第２のカーネルを実行するために、ＧＰＵは、実行のためにＧＰＵのＳＰのローカルメモリに同じ画像データをリロードする。したがって、入力画像データは、各カーネルについて１回、ローカルＳＰメモリに何度もロードされる。画像全体に関するＳＰローカルメモリ入力帯域幅消費量は、画像データサイズにカーネルの数を乗じたものにほぼ等しい（例えば、３つのカーネルを有する６４ＭＢの画像を解析するためのプログラムは、帯域幅３×６４ＭＢ、すなわち１９２ＭＢの消費をまねく）。カーネルとそれらの実行されたワークグループとの間の入力データの共有なしでは、比較的多量のメモリ帯域幅が消費される。
【００１８】
画像処理の例において、命令ストリームを生成および実行することは、画像の特定の部分に関連づけられたデータが、一度特定のＳＰのローカルメモリリソースにロードされ、そして複数のカーネルを用いて処理されることを可能にする。３つのカーネル（例えば、第１のカーネル、第２のカーネル、および第３のカーネル）を有するプログラムの一例が提供される。第１のカーネルの第１のワークグループに関連づけられたデータは、特定のＳＰのローカルメモリにロードされ、第１のワークグループは、ＳＰによって実行される。加えて、カーネルおよびワークグループ実行順序を含む命令ストリームが提供され、これは、同じＳＰに、第２のカーネルの第１のワークグループ、その後に第３のカーネルの第１のワークグループを続いて実行させる。従って、第１のワークグループに関連づけられた画像データは、第２のカーネルおよび第３のカーネルを実行する前に、特定のＳＰのローカルメモリにロードされる必要はない。代わりに、第２のカーネルおよび第３のカーネルは、第１のカーネルについてあらかじめロードされた入力データを用いる。こうして、メモリ帯域幅消費量は、入力画像の特定の領域に関連づけられたデータがローカルＳＰメモリに１度しかロードされる必要が無く、また複数のカーネルを用いて処理されることができるので、低減され得る。以上で提供された３つのカーネルの例において、メモリ帯域幅消費量は３分の２低減される。
【００１９】
命令ストリームは、様々な方法で定義されることができる。いくつかの態様によれば、ユーザは、命令ストリームを用いることから恩恵を受けることになる候補のカーネルを識別する。例えば、ユーザは、同じ入力データを何度も用いるカーネルを識別することができる。命令ストリームを用いることは、入力データがローカルメモリリソースにロードされる必要がある回数を減らすことによって、ＳＰのローカルメモリリソースを管理するのに役立つことができる。
【００２０】
候補を識別した後、ユーザは、ＧＰＵによって実行されるプログラムにおいて、命令ストリームを定義することができる。例えば、ＧＰＵアプリケーション・プログラミングは、通常、マルチプル・プラットフォーム、オペレーティング・システム、およびハードウェア上で実行することができる標準ソフトウェア・インターフェースを提供するアプリケーション・プログラム・インターフェース（ＡＰＩ）を用いてアプリケーション開発者（例えば、コンピュータ・プログラマー）によって実施される。ＡＰＩの例は、オープン・グラフィクス・ライブラリ（Open Graphics Library）（２０１０年７月２６日にリリースされかつ公的に入手可能である「ＯｐｅｎＧＬ」バージョン４．１）、コンピュート・ユニファイド・デバイス・アーキテクチャ（Compute Unified Device Architecture）（ＮＶＩＤＩＡ社によって開発された「ＣＵＤＡ」、２０１０年９月１７日にリリースされたバージョン３．２）、およびＤｉｒｅｃｔＸ（マイクロソフト社によって開発、２００９年１０月２７日にリリースされたバージョン１１）を含む。一般的に、ＡＰＩは、関連ハードウェアによって実行される所定の標準化されたコマンドセットを含む。ＡＰＩコマンドは、ユーザが、ハードウェア・コンポーネントの仕様に関するユーザの知識無しにコマンドを実行するようにＧＰＵのハードウェア・コンポーネントに指示することを可能にする。
【００２１】
本開示の態様は、ユーザが命令ストリームを定義することを可能にする１つまたは複数のＡＰＩコマンドに関する。例えば、１つまたは複数のＡＰＩコマンドは、設計環境において開発および作成され得る。ＡＰＩコマンドは、次いで、ＡＰＩのユーザ（例えば、コンピュータ・プログラマー）のために予め設定されたオプションとして、上述のＡＰＩのようなＡＰＩに含まれ得る。
【００２２】
ユーザは、予め設定された命令ストリームＡＰＩコマンドを実施して、アプリケーションの開発およびコーディング中にＧＰＵによって実行されることになるアプリケーションにおいて命令ストリームを指定することができる。例えば、命令ストリームＡＰＩコマンドは、ユーザが、特定のＳＰによって順次に処理されるべきマルチカーネル・アプリケーションの異なるカーネルからの命令（例えば、１つまたは複数のワークグループ）を指定することを可能にする。命令ストリーム指定を含むアプリケーションを実行し次第、ＧＰＵは、受信された指定にしたがって、ＧＰＵのＳＰに命令（例えば、異なるカーネルのワークグループ）をルーティングする。
【００２３】
別の例において、自動化されたシステムが、命令ストリームを生成するために実装され得る。例えば、コンパイラ・プログラムのようなプログラムは、複数のカーネルを用いて同じ入力データを繰り返し処理するアプリケーションに関する命令ストリームを自動的に生成し得る。この例において、プログラムは、命令の各グループが入力データの所定の量（例えば、命令のワークグループ）に対応するように、各カーネルの命令をパーティショニングする。プログラムは、次いで、ひとつのカーネルの命令から成るひとつのグループに関連づけられた入力データが、単１のＳＰを用いる複数の他のカーネルによって共有され、直列的に実行されることができるように、異なるカーネルからの命令のグループをリンクさせることによって命令ストリームを生成し得る。
【００２４】
非限定的な画像処理の例では、ＧＰＵアプリケーション開発者は、入力画像および画像を処理するための３つのカーネルを有するアプリケーションを命令ストリーム生成プログラムに提供し得る。命令ストリーム生成プログラムは、画像のあらかじめ定義された空間領域に基づいて命令ストリームを自動的に生成し得る。例えば、命令ストリーム生成プログラムは、３つのカーネルの各々の命令を、命令の各グループが入力画像のあらかじめ定義された領域に対応する命令のグループへとパーティショニングし得る。命令ストリーム生成プログラムは、次いで、同じ入力画像領域に関連づけられたカーネルの各々の命令のグループをリンクさせることによって命令ストリームを生成し得る。
【００２５】
例えば、コンパイラ・プログラムまたはその他の開発／解析プログラムのようなプログラムは、命令ストリームを実施することから恩恵を受けることになる候補のカーネルを識別し得る。例えば、プログラムは、メモリ・アクセス・パターンを監視し、１つよりも多くのカーネルによって用いられるデータを識別し得る。この例において、プログラムは、複数のカーネルを有するアプリケーションのワークグループに関連づけられた読取り／書込みアクセス・パターンを監視および記録（log）する。記録（logging）の後、プログラムは、各カーネルのそれぞれのワークグループの入力／出力の依存性を検出し得る。すなわち、プログラムは、複数のカーネル・アプリケーションのどのワークグループが同じ入力データを利用するかを決定することができる。このデータ共有情報に基づいて、命令ストリーム指定は、マルチカーネル・アプリケーションの異なるカーネルからのワークグループが特定のＳＰによって順次に処理されることを容易にするアプリケーションに挿入されることができる。例えば、コードは、同じＳＰによって順次に実行されるべき同じ入力データを共有する異なるカーネルからのワークグループを実行することをＧＰＵに命令するアプリケーションに挿入されることができる。
【００２６】
候補のカーネルを識別し、命令ストリームに異なるカーネルのワークグループを指定するためのプログラムは、アプリケーション開発中に、またはＧＰＵアプリケーションの実行中の「オンザフライ」で、実行されることができる。例えば、いくつかの態様によれば、ＧＰＵアプリケーション開発者は、候補のカーネルを識別し、命令ストリームに異なるカーネルのワークグループを指定するためにプログラムを実装することができる。開発されたＧＰＵアプリケーションは、これで、ＧＰＵによって実行される命令ストリーム指定を含み得る。別の例において、コンピューティングデバイスのホストプロセッサまたはＧＰＵは、候補のカーネルを識別し、ＧＰＵアプリケーションを実行する間に命令ストリームに「オンザフライ」で異なるカーネルのワークグループを指定するためのプログラムを実装することができる。
【００２７】
図１は、本開示の態様を実施するように構成され得るコンピューティングデバイス２０を示すブロック図である。図１に示されるように、コンピューティングデバイス２０は、ホストプロセッサ２４、ストレージデバイス２８、メモリ３２、ネットワークモジュール３６、ユーザ・インターフェース４０、およびディスプレイ４４を含む。コンピューティングデバイス２０はまた、グラフィックス処理ユニット（ＧＰＵ）４８含む。
【００２８】
コンピューティングデバイス２０は、いくつかの例において、ポータブルコンピューティングデバイス（例えば、モバイル電話、ネットブック、ラップトップ、タブレットデバイス、デジタルメディアプレイヤー、ゲームデバイス、またはその他のポータブルコンピューティングデバイス）を含むことができ、またはその一部であり得る。あるいは、コンピューティングデバイス２０は、デスクトップコンピュータまたはその他の固定式コンピューティングデバイスとして構成されることができる。コンピューティングデバイス２０は、明りょうにするために図１には示されていない、追加のコンポーネントを含むことができる。例えば、コンピューティングデバイス２０は、コンピューティングデバイス２０のコンポーネント間でデータを転送するための１つまたは複数の通信ブリッジを含み得る。さらに、図１に示されるコンピューティングデバイス２０のコンポーネントは、コンピューティングデバイス２０のあらゆる例において必要とされるわけではない。例えば、ユーザ・インターフェース４０およびディスプレイ４４は、例えば、コンピューティングデバイス２０がデスクトップコンピュータである場合の例では、コンピューティングデバイス２０の外部にあり得る。
【００２９】
ホストプロセッサ２４は、マイクロプロセッサ、コントローラ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブル・ゲート・アレイ（ＦＰＧＡ）、または等価ディスクリートもしくは集積論理回路のいずれか１つまたは複数を含むことができる。さらに、ホストプロセッサ２４に起因する機能は、本開示では、ソフトウェア、ファームウェア、ハードウェア、またはそれらのいずれかの組み合わせとして組み込まれ得る。
【００３０】
ホストプロセッサ２４は、コンピューティングデバイス２０内で、実行のための命令を処理する。ホストプロセッサ２４は、ストレージデバイス２８上に記憶された命令、またはメモリ３２に記憶された命令を処理可能であり得る。アプリケーションの一例は、視認可能な画像を処理する（例えば、画像をフィルタリングする、あらかじめ定義された特徴について画像を解析する、など）ためのアプリケーションを含む。ホストプロセッサ２４は、ユーザ・インターフェース４０を介して、ユーザによる選択に基づいて１つまたは複数のアプリケーションを実行し得る。いくつかの例において、ホストプロセッサ２４は、ユーザインタラクションなしに１つまたは複数のアプリケーションを実行し得る。
【００３１】
本開示のいくつかの態様によれば、また、ＧＰＵ４８に関して以下でさらに詳細に説明するように、ホストプロセッサ２４は、ＧＰＵ４８と連携して、１つまたは複数のアプリケーションに関連づけられた様々なタスクを実行し得る。例えば、ホストプロセッサ２４は、アプリケーションの実行を初期化し、アプリケーションに関連づけられた特定の処理機能をオフロードし、ＧＰＵ４８に委託し得る。ひとつの例において、ホストプロセッサ２４は、画像処理アプリケーションの実行を初期化し、ＧＰＵ４８にアプリケーションに関連づけられた特定の処理機能をオフロードし得る。
【００３２】
ストレージデバイス２８は、１つまたは複数のコンピュータ可読記憶媒体を含み得る。ストレージデバイス２８は、情報の長期記憶のために構成され得る。いくつかの例において、ストレージデバイス２８は、不揮発性のストレージエレメントを含み得る。このような不揮発性ストレージエレメントの例は、磁気ハードディスク、光学デスィスク、フロッピー（登録商標）ディスク、フラッシュメモリ、または電気的プログラム可能メモリ（ＥＰＲＯＭ）または電気的消去可能およびプログラム可能（ＥＥＰＲＯＭ）メモリの形態を含み得る。ストレージデバイス２８は、いくつかの例にでは、非一時的記憶媒体とみなされる。用語「非一時的な」は、記憶媒体が搬送波または伝搬信号に組み込まれないことを示し得る。しかし、用語「非一時的な」は、ストレージデバイス２８が非可動であることを意味すると解釈されるべきではない。ひとつの例として、ストレージデバイス２８は、コンピューティングデバイス２０から取り出され、そして別の装置に移動され得る。別の例として、実質的にストレージデバイス２８に類似するストレージデバイスは、コンピューティングデバイス２０に挿入され得る。
【００３３】
ストレージデバイス２８は、ホストプロセッサ２４またはＧＰＵ４８によって１つまたは複数のアプリケーションの実行のための命令を記憶し得る。ストレージデバイス２８はまた、ホストプロセッサ２４またはＧＰＵ４８によって用いられるためのデータを記憶し得る。例えば、ストレージデバイス２８は、ホストプロセッサ２４またはＧＰＵ４８によって処理するための画像データを記憶し得る。
【００３４】
メモリ３２は、オペレーションの間、コンピューティングデバイス２０内の情報を記憶するように構成され得る。いくつかの例において、メモリ３２は、一時記憶装置であり、これは、メモリ３２の主要目的が長期記憶ではないことを意味する。メモリ３２は、いくつかの例では、コンピュータ可読記憶媒体として説明される。従って、メモリ３２は、また、時間とともに変化し得るデータを記憶するにもかかわらず、「非一時的」と見なされ得る。メモリ３２はまた、いくつかの例では、揮発性記憶メモリとして説明されており、これは、メモリ３２は、コンピュータがオフにされるときに、記憶されたコンテンツを維持しないことを意味している。揮発性メモリの例は、当業者に知られている、ランダム・アクセス・メモリ（ＲＡＭ）、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、および揮発性メモリのその他の形態を含む。
【００３５】
いくつかの例において、メモリ３２は、ホストプロセッサ２４またはＧＰＵ４８によって実行するためのプログラム命令を記憶するために使用され得る。メモリ３２は、プログラム実行中に、情報を一時的に記憶するためにコンピューティングデバイス２０上で実行するソフトウェアまたはアプリケーションによって使用され得る。このように、メモリ３２は、ホストプロセッサ２４およびＧＰＵ４８のようなコンピューティングデバイス２０のその他のコンポーネントによってアクセスされ得る。
【００３６】
コンピューティングデバイス２０は、ネットワークモジュール３６を用いて、１つまたは複数のワイヤレスネットワークのような１つまたは複数のネットワークを介して、外部のデバイスと通信し得る。ネットワークモジュール３６は、イーサネット（登録商標）カード、光学送受信機、無線周波数送受信機、または情報を送信および受信することができる他の任意のタイプのデバイスのようなネットワークインターフェースカードであり得る。いくつかの例において、コンピューティングデバイス２０は、ネットワークモジュール３６を用いて、サーバ、モバイル電話、またはその他のネットワークコンピューティングデバイスのような外部のデバイスとワイヤレスに通信し得る。
【００３７】
コンピューティングデバイス２０は、また、ユーザ・インターフェース４０を含む。ユーザ・インターフェース４０の例は、トラックボール、マウス、キーボード、および他のタイプの入力デバイスを含むが、それらに限定されない。ユーザ・インターフェース４０は、また、ディスプレイ４４の一部として組み込まれたタッチセンサ式のスクリーンを含み得る。ディスプレイ４４は、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオード（ＯＬＥＤ）ディスプレイ、プラズマ・ディスプレイ、または別のタイプのディスプレイデバイスを含み得る。
【００３８】
コンピューティングデバイス２０のＧＰＵ４８は、固定された機能を有する専用のハードウェアユニット、およびＧＰＵアプリケーションを実行するためのプログラマブル・コンポーネントであり得る。ＧＰＵ４８は、また、ＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、またはその他の等価の集積論理回路またはディスクリート論理回路を含み得る。ＧＰＵ４８は、また、図４に関してさらに詳細に説明されるように、専用メモリのようなその他のコンポーネントを含み得る。さらに、図１には別個のコンポーネントとして示されているが、いくつかの例では、ＧＰＵ４８は、ホストプロセッサ２４の一部として形成され得る。ＧＰＵ４８は、様々なアプリケーション・プログラミング・インターフェース（ＡＰＩｓ）に従って、処理技術を利用するように構成され得る。例えば、ユーザは、マルチプル・プラットフォーム、オペレーティング・システム、およびハードウェア上で実行することができる標準のソフトウェア・インターフェースを使用してＧＰＵ４８によって実行されるようにアプリケーションをプログラムし得る。いくつかの例では、ＧＰＵ４８は、（前述のように）ＡＰＩのＯｐｅｎＣＬ、ＣＵＤＡ、またはＤｉｒｅｃｔＸコレクションを用いて生成されたアプリケーションを利用するように構成され得る。
【００３９】
いくつかの例によれば、ＧＰＵ４８は、汎用グラフィックス処理ユニット（ＧＰＧＰＵ）として実装され得る。例えば、ＧＰＵ４８は、ホストプロセッサ２４によって従来から実行される様々な汎用の計算機能を実行することができる。例としては、ビデオデコーディングおよび後処理（例えば、デブロッキング、ノイズ低減、色補正、等）およびその他のアプリケーション特有の画像処理機能（例えば、顔の検出／認識、パターン認識、ウェーブレット変換、等）を含む、様々な画像処理機能が含まれる。いくつかの例では、ＧＰＵ４８は、ホストプロセッサ２４と連携してアプリケーションを実行し得る。例えば、ホストプロセッサ２４は、ＧＰＵ４８による実行のための命令をＧＰＵ４８に提供することによって、ＧＰＵ４８に特定の機能をオフロードし得る。
【００４０】
ＧＰＧＰＵとして実装されたときには、ＧＰＵ４８は、ここではカーネルと呼ばれるシェーダプログラムを実行する。カーネルは、上述したＡＰＩの例のようなＡＰＩを用いて、ユーザによって定義され得る。カーネルは、ワークグループにグループ分けされる個々のワークアイテム（例えば、ＧＰＵにおけるワークの基本単位）を含み得る。
【００４１】
本開示のいくつかの態様によれば、ＧＰＵ４８は、ここでは命令ストリームと呼ばれる、カーネルおよびワークグループ実行順序を受信および実行する。ＧＰＵ４８は、ＧＰＵ４８のＳＰ（例えば、図４に関して示され記載されるように）に関連付けられたローカルメモリリソースを管理するためにカーネルおよびワークグループ実行順序を使用し得る。例えば、ＧＰＵ４８は、異なるカーネルのワークグループとＳＰローカルメモリに記憶されたデータを共有するために、カーネルおよびワークグループ実行順序を使用し得る。
【００４２】
後続の図に提供される特定の例は、画像処理アプリケーションを実施するためにワークアイテムおよびワークグループを実行するＧＰＵについて述べる。例えば、ワークアイテムおよびワークグループは、画像（例えば、ビデオデータのフレーム）のピクセルに関連づけられるものとして以下で説明される。しかし、ＧＰＵは、様々な入力データに対して画像処理機能以外の様々な機能（例えば、並列処理から恩恵を受けるいずれかの機能およびデータセット）を実行するために実装され得ることが理解されるべきである。従って、ワークグループ間での命令ストリームおよびメモリの共有に関して以下で説明される例および態様は、様々な他の入力データセットに対して様々な他の機能を実施するＧＰＵによって実施され得る。
【００４３】
図２は、画像４９を処理するための関連付けられた命令を備える画像データを有する例示的な画像４９を示すブロック図である。命令は、各ワークグループが複数のワークアイテム５２を含む、複数のワークグループ５０Ａ〜５０Ｐ（まとめてワークグループ５０）に分割されるものとして表される。命令は、図１に示されるＧＰＵ４８のようなＧＰＵによって実行され得る。図２に示される例では、画像４９を処理するための命令は、１６個のワークグループ５０に分割され、各ワークグループ５０は、他の分割も可能であるが、６４個の別個のワークアイテム５２に分割される。
【００４４】
図２に示される例において、画像４９は、正方形の、１０２４個のピクセルを含むおおよそ１６メガバイト（ＭＢ）の画像である。ワークアイテム５２の各々は、ＧＰＵ４８によって実行されることができるワークの基本単位を表す。いくつかの例において、各ワークアイテム５２は、画像４９の特定のピクセルに関連し得る命令を含む。したがって、ＧＰＵ４８がワークアイテム５２を実行するときには、画像４９の対応するピクセルは、処理され得る（例えば、命令にしたがって解析または変更され得る）。ワークアイテム５２は、画像４９のピクセルの特定のグループに関連する命令を含むワークグループ５０に編成され得る。ワークグループ５０を処理するときには、ワークグループ５０に関連づけられたピクセルの特定のグループに関連する画像データは、ＳＰのローカルメモリリソースにロードされ得る（例えば、下記で図４に関して示され、説明される）。
【００４５】
図２に関して説明されるピクセルデータ、ワークアイテム、およびワークグループの間の関係は、単に、可能な命令構造のひとつの例にすぎない。その他の例において、ワークアイテムは、画像４９の１ピクセルよりも多いまたは少ないものに関連し得る。
【００４６】
図３は、図１に示されるＧＰＵ４８のようなＧＰＵによって実行され得る３つのカーネル（例えば、第１のカーネル５６、第２のカーネル５７、および第３のカーネル５８）の配置におけるワークグループを示すブロック図である。この場合も、各カーネルは、所与のアプリケーションに関連する特定の機能を実施するために実行され得る。いくつかの例において、カーネル５６〜５８は、色補正アルゴリズム、顔検出アルゴリズム、パターン認識アルゴリズム、拡張現実アプリケーション、様々なアルゴリズム・アプリケーション（例えば、ウェーブレット変換、フーリエ変換等）、または様々なその他のアプリケーションに関する機能を定義し得る。単なる例示の目的で、図３は、図１に示される例示的なＧＰＵ４８および図２に示される例示的な画像４９に関して説明される。
【００４７】
ＧＰＵ４８は、図２に示される画像４９のような画像に対して特定のタスクを実施するために、カーネル５６〜５８を実行することができる。例えば、ＧＰＵ４８は、顔検出／認識、パターン認識、および並列処理（例えば、同時に２つ以上の命令を処理すること）に適している多くのその他の機能のような様々な機能を実施するためにＧＰＧＰＵとして実装され得る。簡易化された、非限定的な例として、カーネル５６〜５８は、顔検出アプリケーションにおいて実装され得る。この例では、ＧＰＵ４８は、画像４９において１つまたは複数の顔を検出するためにカーネル５６〜５８を実装し得る。カーネル５６〜５８の各々は、特定の顔検出に関連する機能を実施するように構成され得る。このようなカーネル５６〜５８は、「分類子」と呼ばれ得る。すなわち、カーネル５６〜５８は、特定の、あらかじめ定義された特徴（feature）を有するもの（または有さないもの）にピクセルを分類する。カーネル５６〜５８は、いくつかのトレーニング画像を用いて作成された数式を含み得る。例えば、カーネル５６〜５８は、いくつかのあらかじめ定義された画像を備えるテスト環境において開発された数式を含み得る。
【００４８】
図３に示される例では、ＧＰＵ４８は、各ピクセルがカーネル５６〜５８に示されるあらかじめ定義されたプロパティを含むかどうかを決定するために連続的にカーネル５６〜５８を実行することができる。すなわち、ＧＰＵ４８によって実行されるときには、各カーネル５６〜５８は、顔に関連づけられたあらかじめ定義されたプロパティを識別するために使用され得るブール値（Boolean value）を返すことができる。特定のピクセルがカーネル５６〜５８に示されたあらかじめ定義されたプロパティの全てを示す（例えば、ピクセルに関連づけられたブーリアンの結果がいくつかのあらかじめ定義された基準を満たす）場合、そのピクセルは、候補の顔ピクセルと見なされる。特定のピクセルがカーネル５６〜５８に示されるあらかじめ定義されたプロパティを示さない（例えば、ピクセルに関連づけられたブーリアンの結果がいくつかのあらかじめ定義された基準を満たさない）場合、そのピクセルは、顔ピクセルと見なされることから除外される。
【００４９】
図３の画像処理の例において、画像４９に関連づけられたデータは、３回、すなわち、各カーネル５６〜５８について１回処理される。例えば、カーネル５６〜５８のワークグループは、画像４９の同じ入力画像領域に対応し得る。同様に、カーネル５６〜５８の各々の、番号が付けられたワークグループは、画像４９の同じ入力画像領域上で実施されるべき命令のセットを含み得る。
【００５０】
本開示の態様は、同様に番号付けされたカーネル５６〜５８のワークグループをＧＰＵ４８による処理のために命令ストリームへと結合する命令の生成に関する。例えば、ユーザ（例えば、コンピュータまたはアプリケーション・プログラマー）またはプログラムは、ＧＰＵ４８に、同じＳＰを用いて、カーネル５６のワークグループ０、続いてカーネル５７のワークグループ０、そしてその後にカーネル５８のワークグループ０を実行するように命令する命令ストリームを作成することができる。こうして、ＧＰＵ４８は、ワークグループ０に対応する画像４９の入力領域をＧＰＵ４８のシェーダプロセッサ（ＳＰ）のローカルメモリリソースにロードし（例えば、図４に関して示され説明されるように）、カーネル５６〜５８を用いて順次その入力画像領域を処理することができる。
【００５１】
いくつかの例において、ユーザ（例えば、コンピュータまたはアプリケーション・プログラマー）は、カーネル５６〜５８を開発する間に、予め設定されたＡＰＩコマンドを用いてカーネル５６〜５８のワークグループ指定を含む命令ストリームを定義することができる。例えば、ユーザは、ＧＰＵ４８によって実行される命令ストリームにカーネル５６〜５８のワークグループを指定するために予め設定された命令ストリームＡＰＩコマンドを実装し得る。カーネル５６〜５８に関連づけられた命令ストリーム指定を実行すると、ＧＰＵ４８は、ＧＰＵ４８の特定のＳＰにカーネル５６〜５８のワークグループをルーティングする。
【００５２】
別の例において、自動化されたシステムが、カーネル５６〜５８のワークグループ指定を含む命令ストリームを生成するために実装され得る。例えば、コンパイラ・プログラムまたはその他のプログラム（例えば、コンパイルされた低水準のマシンアセンブラコードからメモリ・アクセス・パターンを追跡するプログラム）は、メモリ・アクセス・パターンを監視または解析し、そしてワークグループ０のようなワークグループに関連づけられたデータがカーネル５６〜５８によって何度もアクセスされることを識別し得る。プログラムは、次いで、ワークグループがＧＰＵ４８のＳＰによって順次に処理されるように、命令ストリームにワークグループを指定し得る。カーネル５６〜５８に関連づけられた命令ストリーム指定を実行すると、ＧＰＵ４８は、ＧＰＵ４８の特定のＳＰにカーネル５６〜５８のワークグループをルーティングする。
【００５３】
図４は、本開示の態様を実行するように構成され得るＧＰＵ６０を示すブロック図である。いくつかの例において、ＧＰＵ６０は、図１に示されるＧＰＵ４８と同様にまたは同じく構成され得る。図４に示される例において、ＧＰＵ６０は、メモリ７２、シェーダプロセッサメモリ７８Ａ〜７８Ｃ（まとめて、ＳＰメモリ７８）をそれぞれ有するシェーダプロセッサ７６Ａ〜７６Ｃ（まとめて、ＳＰ７６）、およびシーケンサ・モジュール８２を含む。
【００５４】
その他の例において、ＧＰＵ６０は、明りょうにするために図４には示されていないその他のコンポーネントを含み得る。例えば、ＧＰＵ６０はまた、ラスタライザ、テクスチャユニット、１つまたは複数のバッファ、またはその他のＧＰＵコンポーネントのような、画像を解析およびレンダリングすることに関連する様々なその他のモジュールを含み得る。加えて、ＧＰＵ６０は、図４に示されるものよりも多くのまたは少ないコンポーネントを含みうる。例えば、ＧＰＵ６０は、図４では３つのＳＰ７６を含むものとして示されている。しかし、その他の例では、ＧＰＵ６０は、図４に示されるものよりも多くのまたは少ないＳＰを含み得る。
【００５５】
いくつかの例において、ＧＰＵメモリ７２は、図１に示されるメモリ３２と同様のものであり得る。例えば、ＧＰＵメモリ７２は、一時的なコンピュータ可読記憶媒体であり得る。ＧＰＵメモリ７２の例には、ランダム・アクセス・メモリ（ＲＡＭ）、ダイナミック・ランダム・アクセス・メモリ（ＤＲＡＭ）、スタティック・ランダム・アクセス・メモリ（ＳＲＡＭ）、および当該技術分野で知られている他の形態のメモリが含まれる。ＧＰＵ６０が、図１に示されるホストプロセッサ２４のような別のプロセッサの一部として形成される例では、ＧＰＵメモリ７２は、ＧＰＵ６０以外のコンポーネントによってアクセスされ得る。
【００５６】
ＧＰＵメモリ７２は、ＧＰＵ６０に関するグローバルメモリとして構成され得る。例えば、ＧＰＵメモリ７２は、動作中、ＧＰＵ６０内の命令および情報（例えば、ＧＰＵ６０によって処理するための画像データおよび命令）を記憶するように構成され得る。ＧＰＵメモリ７２は、また、ＧＰＵ６０によって処理されたデータの結果を記憶するように構成され得る。いくつかの例において、ＧＰＵメモリ７２は、ＧＰＵ６０の外部にあるコンピューティングデバイス・コンポーネントとインターフェースをとる。例えば、ＧＰＵ６０を内蔵するコンピューティングデバイスのコンポーネントは、はじめに、ＧＰＵ６０による処理のためにＧＰＵメモリ７８（例えば、ビデオデータの１つまたは複数のフレーム）にデータを渡すことができる。ＧＰＵ６０は、次いで、データを処理し、その結果をＧＰＵメモリ７２に記憶する。その結果は、ＧＰＵメモリ７２からコンピューティングデバイスの別のコンポーネントへと順次読み取られる。
【００５７】
ＳＰ７６は、処理コンポーネントのプログラマブル・パイプラインとして構成され得る。いくつかの例において、ＳＰ７６は、ＳＰ７６がグラフィックスをレンダリングするために、ジオメトリ、バーテックス、またはピクセル・シェーディング操作を実施することができる点において、「統合シェーダ」と呼ばれ得る。ＳＰ７６はまた、汎用計算を実行するためのＧＰＧＰＵアプリケーションにおいて使用され得る。例えば、ＳＰ７６は、図２に示される画像４９のような画像を解析し、または他の方法で処理するために、実装され得る。ＳＰ７６は、命令をフェッチし、復号するためのコンポーネント、および算術計算を実施する１つまたは複数の算術論理演算ユニット（「ＡＬＵ」）など、図４には特に示されていない１つまたは複数のコンポーネントを含み得る。ＳＰ７６は、また、ＳＰメモリ７８のような１つまたは複数のメモリ、キャッシュ、またはレジスタを含み得る。
【００５８】
ＳＰメモリ７８は、ＳＰ７６によって処理されるデータを記憶するためのレジスタまたはデータキャッシュとして構成され得る。いくつかの例において、ＳＰメモリ７８は、ＳＰ７６のローカルメモリである。例えば、ＳＰメモリ７８は、グローバルＧＰＵメモリ７２よりも相対的に小さく、実行の前に１つまたは複数のワークグループに関連づけられたデータを記憶し得る。ＳＰメモリ７８は、ＧＰＵメモリ７２よりも相対的に低い待ち時間(lower latency)を有し得る。例えば、ＳＰメモリ７８は、比較的迅速にＳＰ７６によってアクセスされることができる。しかし、グローバルメモリ７２からＳＰメモリ７８へのデータ移動に関係する待ち時間は、通常、はるかに大きい。例えば、グローバルメモリ７２からＳＰメモリ７８へのデータ移動は、複数のクロックサイクルを消費し、それによって、ボトルネックを生み出し、ＧＰＵ６０の全体的な性能を遅くし得る。
【００５９】
ＳＰメモリ７８は、ＧＰＵ６０が動作しているときに、ＧＰＵメモリ７２とデータを交換し得る。例えば、ＧＰＵ６０は、ＧＰＵメモリ７２からＳＰメモリ７８に１つまたは複数のワークグループに関連づけられたデータを送る。ＳＰメモリ７８内に記憶されると、ＳＰ７６は、別個のＳＰメモリ７８に記憶されたデータにアクセスし、処理するために、並列に動作する。データを実行すると、ＳＰ７６は、ＧＰＵメモリ７２に結果を返す。一般的に、ＳＰメモリ７８とＳＰ７６との間のメモリ帯域幅は、ＧＰＵメモリ７２とＳＰ７６との間のメモリ帯域幅よりも大きい。従って、ＳＰ７６は一般的に、ＳＰ７６がＧＰＵメモリ７２からデータを読み取ることができるよりも早く、関連するＳＰメモリ７８からデータを読み取ることができる。すなわち、ＧＰＵメモリ７２は、通常、ＳＰメモリ７８に関連づけられるものよりも高い待ち時間を示す。従って、データが、ＳＰ７６によって実行される前に、ＳＰメモリ７８に移されるのは有益であり得る。
【００６０】
シーケンサ・モジュール８２は、ＧＰＵ６０内で命令およびデータフローを制御する。シーケンサ・モジュール８２は、ＳＰ７６による実行のためにＳＰメモリ７８にワークアイテム、ワークグループ、および関連データを分配するための固定された機能とプログラマブル・コンポーネントの組み合わせを備えることができる。従って、シーケンサ・モジュール８２は、ＧＰＵメモリ７２と複数のＳＰ７６との間でのデータ転送を管理する。単に例示の目的で、シーケンサ・モジュール８２のワークグループの分配について、図３に関して示され説明される用途に関して説明する。
【００６１】
シーケンサ・モジュール８２は、どのワークグループがＳＰ７６の特定のＳＰによって実行されるかに関係なく、固定された分配パターンでワークグループを分配し得る。例えば、複数のカーネル５６〜６８を有する例示的なアプリケーション５４（図３に示される）を処理するために、シーケンサ・モジュール８２は、ＧＰＵ６０の全てのＳＰ７６にワークグループを均等に分配し得る。加えて、下記で図５に関連してより詳細に説明するように、シーケンサ・モジュール８２は、次のカーネルに進む前に、カーネルの全てのワークグループをＳＰ７６に分配し得る。例えば、シーケンサ・モジュール８２は、カーネル５６がＳＰ７６によって処理済みとなるまで、カーネル５６のワークグループ０をＳＰ７６Ａに、カーネル５６のワークグループ１をＳＰ７６Ｂに、カーネル５６のワークグループ２をＳＰ７６Ｃといった具合に分配することができる。
【００６２】
その他の例において、本開示のいくつかの態様によれば、シーケンサ・モジュール８２は、カーネルおよびワークグループ実行順序を受信し実行し得る。例えば、シーケンサ・モジュール８２は、複数のＳＰ７６のうちの特定のＳＰにカーネルのワークグループを分配することをシーケンサ・モジュール８２に命令する命令ストリームを定義する命令を受信し得る。命令ストリームは、異なるカーネルのワークグループを、それらが複数のＳＰ７６のうちの同じＳＰによって処理されるように結びつける。命令ストリームは、ＳＰメモリ７８のリソースを管理するための方法を提供する。例えば、命令ストリームを定義する命令を実行することによって、シーケンサ・モジュール８２は、ひとつのワークグループに関連づけられた入力データが複数のその他のカーネルのワークグループによって共有され、直列的に実行されることを可能にする。
【００６３】
シーケンサ・モジュール８２は、ＧＰＵ６０が同じまたは実質的に同じ入力データを処理する複数のカーネルを有するアプリケーションを実行しているときに命令ストリームを定義する命令を実行するように実装され得る。例えば、図３に関して説明されるように、アプリケーション５４は、３つのカーネル５６〜５８を含み、各カーネルは複数の関連するワークグループを有する。カーネル５６のワークグループ０は、カーネル５７のワークグループ０およびカーネル５８のワークグループ０と同じ入力データに対応する。従って、シーケンサ・モジュール８２は、ＳＰ７６Ａにカーネル５６〜５８のワークグループ０を順次に分配し得る。加えて、シーケンサ・モジュール８２は、全てのカーネルの全てのワークグループがＳＰ７６によって実行済みとなるまで、カーネル５６〜５８のワークグループ１をＳＰ７６Ｂに分配するなどすることができる。
【００６４】
このように、シーケンサ・モジュール８２は、ＳＰメモリ７８のローカルメモリリソースを管理し得る。例えば、カーネル５６のワークグループ０を実行する前に、ＧＰＵ６０は、ＧＰＵメモリ７２からＳＰメモリ７８Ａに、カーネル５６のワークグループ０に関連づけられた入力データを転送する。カーネル５６のワークグループ０を実行した後、ＳＰメモリ７８Ａに関する新しいデータをフェッチする代わりに、シーケンサ・モジュール８２は、カーネル５７のワークグループ０を実行し、次にカーネル５８のワークグループ０を実行するようにＳＰ７６Ａに命令する。ワークグループ０の入力データは、カーネル５６〜５８の間で同じであり、そのためワークグループ０に関連づけられたデータは、ＳＰメモリ７８Ａ内に留まり、３つのカーネル５６〜５８全てのワークグループ０によって共有されることができる。
【００６５】
命令ストリームを実行し、異なるカーネルのワークグループの間でデータを共有することは、固定された分配パターンでワークグループを分配するシステムと比べて、ローカルメモリ帯域幅の節約もたらすことができる。例えば、異なるカーネルのワークグループの間でデータを共有することは、ＧＰＵメモリ７２とＳＰメモリ７８との間で転送されるデータをより少なくすることを可能にする。図３に示される３つのカーネルの例において、ＧＰＵメモリ７２とＳＰメモリ７８との間のメモリ帯域幅消費量が３分の２低減される。ワークグループ０のようなワークグループに関連づけられたデータをローカルＳＰメモリに３回転送する（例えば、各カーネルにつき１回の転送）のではなく、ＧＰＵ６０は、ワークグループに関連づけられたデータをローカルＳＰメモリに一度転送し、３つのカーネル５６〜５８すべての間でデータを共有することができる。
【００６６】
本開示のいくつかの例によれば、命令ストリームを実行することに関連したローカルメモリ帯域幅の節約は、また、時間の節約をもたらすことができる。例えば、ＳＰが、プログラム５４のような所与のプログラムを実行するためにワークグループに関連づけられた同数の計算を実行可能である一方、ＧＰＵメモリ７２とＳＰメモリ７８との間で転送されるデータがより少なくなり得るので、時間の節約が達成されることができる。上述したように、ＧＰＵメモリ７２とＳＰメモリ７８との間のデータ転送は、プログラム５４を実行するプロセスにボトルネックをもたらす、比較的時間のかかるプロセスであり得る。従って、ＧＰＵメモリ７２とＳＰメモリ７８との間で転送される必要のあるデータの量を減らすことはまた、ＧＰＵメモリ７２とＳＰメモリ７８との間のデータ転送に関連するボトルネックを減らし得る。
【００６７】
命令ストリームを定義するシーケンサ・モジュール８２によって受信された命令は、ユーザによって生成され得、または自動的に生成され得る（例えば、コンパイラ・プログラムによって）。例えば、ユーザ（例えば、ソフトウェア開発者）は、１つまたは複数の命令ストリームコマンドを含むＡＰＩを用いる命令ストリームを定義して実装することができる。命令ストリームコマンドを有するアプリケーションを受信すると、シーケンサ・モジュール８２は、ＳＰ７６に関連付けられたローカルメモリリソースを管理するために命令ストリームコマンドを実行する。
【００６８】
命令ストリームを定義する命令は、図１に示されるホストプロセッサ２４のようなコンピューティングデバイスのホストプロセッサによってシーケンサ・モジュール８２に送信され得る。ＧＰＵ６０が別個のデバイスである（例えば、ホストプロセッサを有するコンピューティングデバイスに含まれない）例では、別の処理コンポーネントが、シーケンサ・モジュール８２に対して命令ストリームを含む命令を送信することを担うことができる。
【００６９】
図５は、第１のカーネル１４２、第２のカーネル１４４、および第３のカーネル１４６のワークグループを、第１のＳＰメモリ１５６Ａを有する第１のＳＰ１５２Ａ、第２のＳＰメモリ１５６Ｂを有する第２のＳＰ１５２Ｂ、および第３のＳＰメモリ１５６Ｃを有する第３のＳＰ１５２Ｃ（まとめてＳＰ１５２およびＳＰメモリ１５６）に分配するシーケンサ・モジュール１４０の例を示すブロック図である。本開示のいくつかの態様によれば、シーケンサ・モジュール１４０とＳＰ１５２は、図１に示されるＧＰＵ４８または図４に示されるＧＰＵ６０のようなＧＰＵに組み入れられることができる。
【００７０】
シーケンサ・モジュール１４０およびＳＰ１５２は、図４に関して示され説明されたシーケンサ・モジュール８２およびＳＰ７６と同様に、または同じく構成され得る。例えば、シーケンサ・モジュール１４０は、ＧＰＵ内の命令およびデータフローを制御することを担うことができる。シーケンサ・モジュール１４０は、ワークアイテムおよびワークグループをＳＰ１５２および関連するＳＰメモリ１５６に分配するための固定された機能とプログラマブル・コンポーネントの組み合わせを含み得る。
【００７１】
シーケンサ・モジュール１４０は、異なるカーネルのワークグループの特定の宛先を制御することなく、固定された分配パターンでカーネル１４２〜１４６のワークグループを分配する。例えば、シーケンサ・モジュール１４０は、第１のカーネル１４２が分配されて実行されるまで、第１のワークグループＷＧ０をＳＰ１５２Ａに（ライン１６０によって表される）、第２のワークグループＷＧ１をＳＰ１５２Ｂに（ライン１６１によって表される）、第３のワークグループＷＧ２をＳＰ１５２Ｃに（ライン１６２によって表される）など、順次に分配することによって、第１のカーネル１４２のワークグループを分配する。シーケンサ・モジュール１４０は、次いで、第２のカーネル１４４および第３のカーネル１４６に進み、それらのワークグループをＳＰ１５２に分配する。例えば、シーケンサ・モジュール１４０は、固定された分配パターンにおいて継続することができ、ＳＰ１５２の間で第２のカーネル１４４のワークグループの全てを分配することができる。シーケンサ・モジュール１４０は、次いで、第３のカーネル１４６に進んで、ＳＰ１５２の間で第３のカーネル１４６のワークグループの全てを分配することができる。
【００７２】
どのＳＰ１５２が特定のワークグループを実行するかを制御する能力がなければ、ワークグループに関連づけられたデータは、ＳＰメモリ１５６のうちの２つ以上にロードされることを要求され得る。図５の例に示されるように、固定された分配パターンに従う際には、第１のカーネル１４２全体を処理した後、ｍシーケンサ・モジュール１４０は、第２のカーネル１４４のワークグループＷＧ０をＳＰ１５２Ｂ（ライン１６１）に分配する。従って、ＷＧ０に関連づけられた入力データは、ＳＰメモリ１５６Ｂにロードされなければならない。加えて、第２のカーネル１４４全体を処理した後、分配パターンの固定された性質に起因して、シーケンサ・モジュール１４０は、第３のカーネル１４６のワークグループＷＧ０をＳＰ１５２Ｃ（ライン１６２）に分配する。従って、ＷＧ０に関連づけられた入力データは、ＳＰメモリ１５６Ｃにロードされる。
【００７３】
図４に関して上述したように、特定のワークグループに関連づけられたデータは、通常、ＳＰがワークグループを実行し得る前に、ＳＰのローカルメモリにロードされなければならない。どのＳＰ１５２が特定のワークグループを実行するかを制御する能力がなければ、ワークグループに関連づけられたデータは、カーネル間で共有されることはできない。図５に示される例において、ワークグループＷＧ０に関連づけられたデータは、ＳＰ１５２Ａ〜１５２Ｃによる処理の前に、異なる時間においてＳＰメモリ１５６Ａ、１５６Ｂ、および１５６Ｃの各々にロードされなければならない。従って、ＳＰ１５２に関するメモリ帯域幅は、各カーネルについての入力データの３倍に等しい。
【００７４】
図６は、第１のカーネル１８４、第２のカーネル１８６、第３のカーネル１８８のワークグループを、第１のＳＰメモリ２０４Ａを有する第１のＳＰ２００Ａ、第２のＳＰメモリ２０４Ｂを有する第２のＳＰ２００Ｂ、第３のＳＰメモリ２０４Ｃを有する第３のＳＰ２００Ｃ（まとめてＳＰ２００およびＳＰメモリ２０４）に分配するシーケンサ・モジュール１８０の例を示すブロック図である。本開示のいくつかの態様によれば、シーケンサ・モジュール１８０およびＳＰ２００は、図１に示されるＧＰＵ４８または図４に示されるＧＰＵ６０のようなＧＰＵに組み入れられることができる。
【００７５】
シーケンサ・モジュール１８０およびＳＰ２００は、図４に関して示され説明されるシーケンサ・モジュール８２およびＳＰ７６と同様にまたは同じく構成され得る。例えば、シーケンサ・モジュール１８０は、ＧＰＵ内の命令およびデータフローを制御することを担い得る。シーケンサ・モジュール１８０は、ＳＰ２００による実行のためにワークアイテムおよびワークグループをＳＰメモリ２０４に分配するための固定された機能とプログラマブル・コンポーネントの組み合わせを含み得る。
【００７６】
本開示のいくつかの態様によれば、シーケンサ・モジュール８２は、ワークグループを命令ストリームに指定するあらかじめ定義された命令にしたがって、カーネル１８４〜１８８のワークグループを分配する。例えば、シーケンサ・モジュール８２は、異なるカーネルのワークグループを、それらが同じＳＰによって実行されるように結びつける命令ストリームを受信するように構成され得る。従って、固定されたパターンでカーネル１８４〜１８８のワークグループを分配するのではなく（例えば、図５に示すように）、シーケンサ・モジュール１８０は、カーネルのワークグループを結びつける命令ストリームに基づいてワークグループを分配するように構成され得る。
【００７７】
図６に示される例において、シーケンサ・モジュール１８０は、カーネル１８４のワークグループＷＧ０をカーネル１８６のワークグループＷＧ０とカーネル１８８のワークグループＷＧ０とに結びつける命令ストリームを実行する。カーネル１８４〜１８６のワークグループＷＧ０は、すべて同じ入力データに関連づけられる。命令ストリームを実行することによって、カーネル１８４〜１８８のワークグループＷＧ０は、ＳＰ２００Ａを用いて順次に処理される。従って、カーネル１８４〜１８８の間で同じであり得る、ＷＧ０に関連づけられた入力データは、カーネル１８４〜１８８のワークグループＷＧ０の間で共有されることができる。例えば、ワークグループＷＧ０に関連づけられたデータは、カーネル１８４のＷＧ０を処理するときにはＳＰメモリ２０４Ａにロードされ、そしてカーネル１８６のＷＧ０とカーネル１８８のＷＧ０によって共有され得る。
【００７８】
ＳＰメモリ２０４Ａ内でのデータの保持と、複数のワークグループ間でのデータの共有は、ＳＰメモリ２０４Ａの効率的な管理を提供する。例えば、ワークグループの実行が終わるたびに、新しいデータをフェッチしＳＰメモリ２０４Ａに転送しなければならないのではなく、データは、ＳＰメモリ２０４Ａ内にとどまり、複数のカーネルの複数のワークグループによって共有されることができる。従って、ローカルメモリ帯域幅消費量は、低減され得る。図６に示される３つのカーネルの例では、ローカルメモリ帯域幅消費量は、図５に示される３つのカーネルの例と比較して３分の２低減される。
【００７９】
本開示のいくつかの例によれば、命令ストリームを実行することに関連したローカルメモリ帯域幅の節約は、また、時間の節約ももたらす。例えば、ＳＰ２００が、所与のプログラムを実行するために命令ストリームを利用しないシステムとしてワークグループに関連づけられた同数の計算を実行できる一方、ＧＰＵグローバルメモリとＳＰメモリ２０４との間で転送されるデータが少なくなるはずであるので、時間の節約が達成されることができる。ＧＰＵグローバルメモリとＳＰメモリ２０４との間のデータ転送は、カーネル１８４〜１８８の実行のプロセスにボトルネックをもたらす、比較的時間のかかるプロセスであり得る。従って、ＧＰＵグローバルメモリとＳＰメモリ２０４との間で転送される必要のあるデータの量を減らすことはまた、ＧＰＵグローバルメモリとＳＰメモリ２０４との間のデータ転送に関連づけられたボトルネックを減らす。
【００８０】
図７は、実行順序２４０、２４４、および２４８のストリームを、第１のＳＰメモリ２５６Ａを有する第１のＳＰ２５２Ａ、第２のＳＰメモリ２５６Ｂを有する第２のＳＰ２５２Ｂ、および第３のＳＰメモリ２５６Ｃを有する第３のＳＰ２５２Ｃ（まとめてＳＰ２５２およびＳＰメモリ２５６）に割り当てる例を示すブロック図である。本開示のいくつかの態様によれば、ＳＰ２５２は、図１に示されるＧＰＵ４８または図４に示されるＧＰＵ６０のようなＧＰＵに組み入れられることができる。
【００８１】
図７に示される例は、３つのカーネルに関連づけられたワークグループを実行する３つのＳＰ２５２を含む。しかし、実行順序のストリームが図７に示されるよりも多くのまたは少ないＳＰを有するシステムにおいて実装さ得ることが理解されるべきである（例えば、２つのＳＰ、１０個のＳＰ、１００個のＳＰ）。加えて、実行順序のストリームは、図７に示される３つよりも多くのまたは少ないワークグループおよびカーネルを互いにリンクさせることができる。
【００８２】
実行順序のストリームまたは命令ストリーム２４０〜２４８は、図４に示されるシーケンサ・モジュール８２のようなシーケンサ・モジュールによってＳＰ２５２に割り当てられることができる。命令ストリーム２４０〜２４８は、異なるカーネルのワークグループを、それらが同じＳＰによって処理されるように、仮想的に結びつける。例えば、図７に示されるように、命令ストリーム２４０は、カーネル１のワークグループ０をカーネル２のワークグループ０とカーネル３のワークグループ０とにリンクさせる。同様に、命令ストリーム２４４は、カーネル１のワークグループ１をカーネル２のワークグループ１とカーネル３のワークグループ１とにリンクさせ、命令ストリーム２４８は、カーネル１のワークグループ２をカーネル２のワークグループ２とカーネル３のワークグループ２とにリンクさせる。
【００８３】
図７に示される例では、同様の番号が付けられたワークグループに関連する入力データの少なくともいくつかは一致している。例えば、カーネル１のワークグループ０に関連する入力データは、カーネル２のワークグループ０およびカーネル３のワークグループ０に関連する入力データと同じであり、または少なくともいくらか重複する。従って、ＳＰ２５２Ａは、ワークグループ０に関連づけられた入力データをＳＰメモリ２５６Ａにロードし、カーネル１のワークグループ０、カーネル２のワークグループ０、およびカーネル３のワークグループ０を実行するときにその入力データを共有することによって、命令ストリーム２４０を実行することができる。このように、命令ストリーム２４０を実行することは、カーネル１、２、および３の実行中にＳＰメモリ２５６Ａへと転送されるおよびＳＰメモリ２５６Ａから転送される必要のあるデータ量を低減する。類似の動作が、ＳＰ２５２ＢおよびＳＰメモリ２５６Ｂに関して、またＳＰ２５２ＣおよびＳＰメモリ２５６Ｃに関して実施され得る。
【００８４】
図８は、図７に示されるストリーム２４０〜２４８のような実行順序（例えば、「命令ストリーム」）を生成および実行する方法３００を示すフローチャートである。本開示のいくつかの態様によれば、方法３００は、図１に示されるＧＰＵ４８または図４に示されるＧＰＵ６０のようなＧＰＵによって実行され得る。単に説明の目的で、方法３００のいくつかの部分は、図４に示される例示的なＧＰＵ６０によって実施されるものとして説明され得る。
【００８５】
図８に示されるように、実行順序ストリームに関する候補が、はじめに識別される（３０４）。いくつかの態様によれば、ユーザは、命令ストリームを利用することから恩恵をうける、候補のカーネルを識別する。例えば、ユーザは何度も同じ入力データを利用するカーネルを識別することができる。別の例において、コンパイラ・プログラムのようなプログラムは、命令ストリーム実装することから恩恵をうける候補のカーネルを識別することができる。例えば、コンパイラ・プログラムは、メモリ・アクセス・パターンを監視し、２つ以上のカーネルによって用いられる入力データを識別し得る。入力データがプログラムの２つ以上のカーネルによって用いられるときには、命令ストリームは、同じデータを利用するワークグループを、それらのワークグループが同じＳＰによって実行されるように結びつけるために実装され得る。この方法において命令ストリームを利用することは、入力データがローカルメモリリソースにロードされる必要のある回数を減らすことによって、ＳＰのローカルメモリリソースを管理するのに役立ち得る。例えば、入力データは、ＳＰのローカルメモリに一度ロードされ、複数のカーネルの複数のワークグループの間で共有されることができる。
【００８６】
候補が識別された後、実行順序ストリーム指定が生成される（３０８）。ユーザは、命令ストリームコマンドを含むように適合されたＡＰＩを用いて命令ストリームを定義することができる。例えば、ＯｐｅｎＧＬ、ＣＵＤＡ、ＤｉｒｅｃｔＸ、またはＧＰＵプログラムを作成するための他のＡＰＩのようなＡＰＩは、ユーザがワークグループおよびそれらの関連するカーネルを命令ストリームに指定することを可能にする１つまたは複数のコマンドを含むように適合され得る。別の例では、コンパイラ・プログラムのようなプログラムが、繰り返されるメモリ・アクセス・パターンを識別した後に、命令ストリームを自動的に生成することができる。
【００８７】
命令ストリームが生成された後、実行順序指定は、ＧＰＵ６０のようなＧＰＵに送信され、ＧＰＵによって受信される（３１２）。いくつかの例では、シーケンサ・モジュール８２は、１つまたは複数のカーネル指定および１つまたは複数のワークグループ指定を含む実行順序ストリームを定義する入力を受信し得る。命令ストリームは、図１に示されるホストプロセッサ２４のようなコンピューティングデバイスのホストプロセッサによってシーケンサ・モジュール８２に送信されることができる。ＧＰＵ６０が別個のデバイスである（例えば、ホストプロセッサを有するコンピューティングデバイスに含まれない）例では、別の処理コンポーネントが、命令ストリームを受信し、それらをシーケンサ・モジュール８２に送信することを担い得る。
【００８８】
シーケンサ・モジュール８２は、ＳＰ７６のようなＳＰにストリームを割り当てることによって実行順序を実装し得る（３１６）。例えば、シーケンサ・モジュール８２は、ＧＰＵ６０の同じＳＰによって実行されるべき命令ストリームにおいて指定されたワークグループを割り当てることができる。ＳＰは、実行順序において指定された命令を実行することによって命令ストリームを実行する。（３２０）。例えば、ＳＰは、命令ストリームにおいて指定されたワークグループを順次に実行する。そうすることによって、命令ストリームにおいて指定されたワークグループに関連づけられた入力データは、命令ストリームにおいて指定されたワークグループの間で共有されることができる。命令ストリームを実行することは、ＧＰＵメモリ７２とＳＰメモリ７８の間で転送される必要のあるデータの量を減らし、特定のプログラムを実行するために必要とされる全体的な時間を減らすことができる。
【００８９】
以上で提供された例では、命令ストリームは、異なるカーネルのワークグループが同じＳＰによって連続的に実行されるように該異なるカーネルのワークグループを結びつけるものとして説明される。この方法で異なるカーネルのワークグループを結びつけることは、ワークグループに関連づけられたデータが複数のカーネルによって共有されることができるので、ＳＰに関連づけられたメモリリソースを管理するのに役立つ。しかし、用語「ワークグループ」は総称的に命令のグループを指すということが理解されるべきである。例えば、「ワークグループ」は、コンピュート・ユニファイド・デバイス・アーキテクチャ（ＮＶＩＤＩＡ社によって開発された「ＣＵＤＡ」、２０１０年９月１７日にリリースされたバージョン３．２）では「スレッドブロック（thread block）」と呼ばれ得る。
【００９０】
ワークグループおよびカーネル指定は、一例として提供されるにすぎないことが理解されるべきである。本開示のメモリ管理の態様は、ＧＰＵアプリケーションのその他の構成に適用され得る。例えば、その他のＧＰＵアプリケーションは、実行中に２回以上同じ入力データを用いる命令を含む、単一の比較的大きい「カーネル」を含み得る。こういった例において、本開示の態様は、やはりメモリリソースを管理するために適用され得る。同じ入力データを使用する命令を、それらの命令が同じカーネルに属するにもかかわらず結び付ける命令ストリームが、作り出されることができる。
【００９１】
１つまたは複数の例において、説明された機能は、ハードウェア、ハードウェア上で実行されるソフトウェア、ハードウェア上で実行されるファームウェア、またはそれらのいずれかの組み合わせに実装されることができる。いくつかの例において、コンピュータ可読媒体上に記憶された命令は、ハードウェア・コンポーネントに上述したそれらの各機能を実行させることができる。コンピュータ可読媒体はコンピュータ・データ記憶媒体を含むことができる。データ記憶媒体は、本開示で説明される技術の実装に関する命令、コードおよび／またはデータ構造を読み出すための１つまたは複数のコンピュータまたは１つまたは複数のプロセッサによってアクセスされることができる利用可能な任意の媒体であり得る。限定ではなく例として、このようなコンピュータ可読媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭまたはその他の光ディスクストレージ、磁気ディスクストレージ、またはその他の磁気ストレージデバイス、フラッシュメモリ、または命令もしくはデータ構造の形態で所望のプログラムコードを運びもしくは記憶するために用いられることができ、コンピュータによってアクセスされることができる、その他の任意の媒体を含むことができる。上記の組み合わせもまた、コンピュータ可読媒体の範囲内に含まれるべきである。
【００９２】
コードは、１つまたは複数のＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、またはその他の等価な集積回路またはディスクリート論理回路のような１つまたは複数のプロセッサによって実行され得る。従って、ここで用いられる用語「プロセッサ」は、上述の構造のいずれか、または本明細書で説明された技術の実施に適した他のいずれかの構造を指し得る。加えて、いくつかの態様において、ここで説明された機能は、符号化および復号のために構成された、または結合された符号復号器に組み込まれた、専用のハードウェアおよび／またはソフトウェアモジュール内に設けられることができる。また、技術は、１つまたは複数の回路または論理素子において十分に実施される。
【００９３】
本開示の技術は、ワイヤレスハンドセット、集積回路（ＩＣ）または複数のＩＣのセット（例えば、チップセット）を含む、多種多様のデバイスまたは装置において実施されることができる。様々なコンポーネント、モジュール、またはユニットは、開示された技術を実行するために構成された装置の機能的な態様を強調するために本開示において説明されているが、必ずしも異なるハードウェアユニットによる実現を要求するわけではない。むしろ、上述したように、様々なユニットは、適切なソフトウェアおよび／またはファームウェアと併せて、上述したような１つまたは複数のプロセッサを含む相互動作可能なハードウェアユニットの収集によって組み合わされることができる。
【００９４】
様々な例について説明した。これらおよびその他の例は、特許請求の範囲内にある。
以下に、本願の出願当初請求項に記載された発明を付記する。
［Ｃ１］
グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法であって、
シェーダプロセッサに関する実行順序を定義する入力を受信することであって、前記実行順序が複数のカーネル指定および複数のワークグループ指定を含む、受信することと、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを前記シェーダプロセッサに割り当てることと、
前記シェーダプロセッサによって、入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別された前記カーネルのワークグループを実行することと、を備える方法。
［Ｃ２］
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが前記ＧＰＵによって実施される機能を定義する、上記Ｃ１に記載の方法。
［Ｃ３］
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、上記Ｃ１に記載の方法。
［Ｃ４］
前記実行順序を定義する入力を受信することが、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信することを含み、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが実質的に同じ入力データに関連づけられる、上記Ｃ１に記載の方法。
［Ｃ５］
前記実行順序を実行することが、前記シェーダプロセッサによって、前記第1のカーネルの前記第1のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行することを含む、上記Ｃ４に記載の方法。
［Ｃ６］
実行順序のストリームを実行することが、前記複数のワークグループ指定において識別された２つ以上のワークグループの間で入力データを共有することを含む、上記Ｃ１に記載の方法。
［Ｃ７］
前記２つ以上のワークグループの間で入力データを共有することが、前記２つ以上のワークグループの第１のワークグループと前記２つ以上のワークグループの第２のワークグループの実行のために前記シェーダプロセッサのローカルメモリ内に前記入力データを保持することを含む、上記Ｃ６に記載の方法
［Ｃ８］
ユーザ入力に応答して、アプリケーション・プログラミング・インターフェース（ＡＰＩ）を用いて前記実行順序を定義する前記入力を生成することをさらに含む、上記Ｃ１に記載の方法。
［Ｃ９］
グラフィックス処理ユニット（ＧＰＵ）であって、
シェーダプロセッサに関する実行順序を定義する入力を受信するように構成されたシーケンサ・モジュールであって、前記実行順序が複数のカーネル指定および複数のワークグループ指定を備える、シーケンサ・モジュールを備え、
前記シーケンサ・モジュールが、前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを前記シェーダプロセッサに割り当てるように構成され、
前記シェーダプロセッサが、入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループを実行するように構成される、グラフィックス処理ユニット（ＧＰＵ）。
［Ｃ１０］
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが、前記ＧＰＵよって実施される機能を定義する、上記Ｃ９に記載のＧＰＵ。
［Ｃ１１］
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、上記Ｃ９に記載のＧＰＵ。
［Ｃ１２］
前記シーケンサ・モジュールが、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信するようにさらに構成され、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが実質的に同じ入力データに関連づけられる、上記Ｃ９に記載のＧＰＵ。
［Ｃ１３］
前記シェーダプロセッサが、前記第１のカーネルの前記第１のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行するようにさらに構成される、上記Ｃ１２に記載のＧＰＵ。
［Ｃ１４］
前記シェーダプロセッサが、シェーダプロセッサメモリをさらに備え、前記シェーダプロセッサが、前記複数のワークグループ指定において識別された２つ以上のワークグループに関連づけられた入力データを記憶するように構成される、上記Ｃ９に記載のＧＰＵ。
［Ｃ１５］
前記シェーダプロセッサメモリが、前記２つ以上のワークグループに関連づけられた前記記憶された入力データを保持し、前記２つ以上のワークグループの間で前記記憶されたデータを共有するようにさらに構成される、上記Ｃ１４に記載のＧＰＵ。
［Ｃ１６］
グラフィックス処理ユニット（ＧＰＵ）であって、
シェーダプロセッサに関する実行順序を定義する入力を受信するための手段であって、前記実行順序が複数のカーネル指定および複数のワークグループ指定を含む、受信するための手段と、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを前記シェーダプロセッサに割り当てるための手段と、
入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループを実行するための手段と、を備えるグラフィックス処理ユニット（ＧＰＵ）。
［Ｃ１７］
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが前記ＧＰＵによって実施される機能を定義する、上記Ｃ１６に記載のＧＰＵ。
［Ｃ１８］
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが、前記ＧＰＵによって入力データに対して実行される命令を含む、上記Ｃ１６に記載のＧＰＵ。
［Ｃ１９］
入力を受信するための前記手段が、第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信するようにさらに構成され、前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが実質的に同じ入力データに関連づけられる、上記Ｃ１６に記載のＧＰＵ。
［Ｃ２０］
実行するための前記手段が、前記第１のカーネルの前記第１のワークグループの後に前記第２のカーネルの前記第１のワークグループを実行するようにさらに構成される、上記Ｃ１９に記載のＧＰＵ。
［Ｃ２１］
実行するための前記手段が、前記複数のワークグループ指定において識別された２つ以上のワークグループに関連づけられた入力データを記憶するための手段をさらに含む、上記Ｃ１６に記載のＧＰＵ。
［Ｃ２２］
入力データを記憶するための前記手段が、前記２つ以上のワークグループに関連づけられた前記記憶された入力データを保持し、前記２つ以上のワークグループの間で前記記憶されたデータを共有するようにさらに構成される、上記Ｃ２１に記載のＧＰＵ。
［Ｃ２３］
コンピュータ可読記憶媒体であって、
シェーダプロセッサに関する実行順序を定義する入力を受信することであって、前記実行順序が複数のカーネル指定および複数のワークグループ指定を含む、受信することと、
前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルのワークグループを前記シェーダプロセッサに割り当てることと、
前記シェーダプロセッサによって、入力データを処理するために前記複数のワークグループ指定および前記複数のカーネル指定において識別されたカーネルの前記ワークグループ実行することと、
を、グラフィックス処理ユニット（ＧＰＵ）を有するコンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに行わせるための命令でエンコードされたコンピュータ可読記憶媒体。
［Ｃ２４］
前記複数のカーネル指定が複数のカーネルを識別し、前記複数のカーネルの各カーネルが、前記ＧＰＵよって実施される機能を定義する、上記Ｃ２３に記載のコンピュータ可読記憶媒体。
［Ｃ２５］
前記複数のワークグループ指定が複数のワークグループを識別し、前記複数のワークグループの各ワークグループが前記ＧＰＵによって入力データに対して実行される命令を含む、上記Ｃ２３に記載のコンピュータ可読記憶媒体。
［Ｃ２６］
第１のカーネルの第１のワークグループを第２のカーネルの第１のワークグループにリンクさせる指定を受信することをコンピューティングデバイスの１つまたは複数のプログラマブルプロセッサに行わせるための命令をさらに備え、
前記第１のカーネルの前記第１のワークグループと前記第２のカーネルの前記第１のワークグループが実質的に同じ入力データに関連づけられる、上記Ｃ２３に記載のコンピュータ可読記憶媒体。
［Ｃ２７］
前記実行順序を実行することが、前記シェーダプロセッサによって、前記第1のカーネルの前記第1のワークグループの後に、第２のカーネルの前記第１のワークグループを実行することを含む、上記Ｃ２６に記載のコンピュータ可読記憶媒体。
［Ｃ２８］
実行順序のストリームを実行することが、前記複数のワークグループ指定において識別された２つ以上のワークグループの間で入力データを共有することを含む、上記Ｃ２３に記載のコンピュータ可読記憶媒体。
［Ｃ２９］
前記２つ以上のワークグループの間で入力データを共有することが、前記２つ以上のワークグループの第１のワークグループと前記２つ以上のワークグループの第２のワークグループの実行のために前記シェーダプロセッサのローカルメモリに前記入力データを保持することを含む、上記Ｃ２８に記載のコンピュータ可読記憶媒体。
【図１】
0005752853.tif 000002
【図２】
0005752853.tif 000003
【図３】
0005752853.tif 000004
【図４】
0005752853.tif 000005
【図５】
0005752853.tif 000006
【図６】
0005752853.tif 000007
【図７】
0005752853.tif 000008
【図８】
0005752853.tif 000009