(57)【特許請求の範囲】
【請求項１】
グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法であって、
ＧＰＵの１つ以上のシェーダプロセッサを用いて、第１のカーネルおよび１つ以上の連続して実行される第２のカーネルを含むアプリケーションの前記第１のカーネルの第１のワークアイテムを実行することであって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含むことと、
前記第１のワークアイテムの結果に加えて、前記第１のワークアイテムの前記結果に基づいて１つ以上のカリング値を生成することであって、前記１つ以上のカリング値は、前記入力データに関して前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示すことと、
前記１つ以上のカリング値が前記１つ以上の第２のカーネルの前記ワークアイテムが実行されるべきでないことを示すとき、前記１つ以上の第２のカーネルの前記ワークアイテムを実行しないことを決定し、前記１つ以上のシェーダプロセッサによる前記ワークアイテムの実行の前に命令ストリームから前記１つ以上の第２のカーネルの前記ワークアイテムを取り除くことと、を備える、方法。
【請求項２】
前記１つ以上の値をバッファに格納することをさらに備え、前記１つ以上の第２のカーネルの前記ワークアイテムを実行しないことを決定することは、前記バッファに格納された前記１つ以上のカリング値を読み取ることを備える、請求項１に記載の方法。
【請求項３】
前記ＧＰＵの前記１つ以上のシェーダプロセッサを用いて、前記入力データに関して前記１つ以上の第２のカーネルの第２のカーネルの第２のワークアイテムを実行することと、
前記第２のワークアイテムの結果に基づいて前記１つ以上のカリング値を更新することであって、前記１つ以上の値は、前記入力データに関して前記１つ以上の第２のカーネルの後続するワークアイテムを実行すべきかどうかを示すことと、
前記更新された１つ以上のカリング値に基づいて前記後続するワークアイテムを実行すべきかどうかを決定することと、をさらに備える請求項２に記載の方法。
【請求項４】
前記ＧＰＵの前記シェーダプロセッサを用いて第１のワークグループを実行することであって、前記第１のワークグループは、前記第１のカーネルと関連付けられ、前記第１のワークグループは、前記入力データを処理するための前記第１のワークアイテムを含む複数の命令を備えることと、
前記第１のワークグループの結果に基づいて１つ以上のワークグループカリング値を生成することであって、前記１つ以上のワークグループカリング値は、前記１つ以上の第２のカーネルのワークグループを実行すべきかどうかを示すことと、
前記１つ以上のワークグループカリング値に基づいて前記１つ以上の第２のカーネルの前記ワークグループを実行すべきかどうかを決定することと、をさらに備える請求項１に記載の方法。
【請求項５】
グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置であって、
入力データを処理するための１つ以上の命令を含む前記第１のカーネルの第１のワークアイテムを実行し、及び前記第１のカーネルの前記第１のワークアイテムの結果に基づいて１つ以上のカリング値を生成するように構成された１つ以上のシェーダプロセッサであって、前記１つ以上のカリング値は、前記入力データに関して１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す１つ以上のシェーダプロセッサと、
前記１つ以上のカリング値が前記１つ以上の第２のカーネルの前記ワークアイテムが実行されるべきでないことを示すとき、前記１つ以上の第２のカーネルの前記ワークアイテムを実行しないことを決定し、前記１つ以上のシェーダプロセッサによる前記ワークアイテムの実行の前に命令ストリームから前記１つ以上の第２のカーネルの前記ワークアイテムを取り除くように構成されたカルモジュールと、を備える、装置。
【請求項６】
前記１つ以上のカリング値を格納するように構成されたカルバッファをさらに備え、前記カルモジュールは、前記カルバッファに格納された前記１つ以上のカリング値を読み取ることによって、前記１つ以上の第２のカーネルの前記ワークアイテムを実行するべきかどうかを決定するように構成される、請求項５に記載の装置。
【請求項７】
前記１つ以上のシェーダプロセッサは、前記１つ以上の第２のカーネルの第２のカーネルの第２のワークアイテムを実行し、前記第２のワークアイテムの結果に基づいて前記１つ以上のカリング値を更新し、及び前記更新された１つ以上のカリング値に基づいて後続するワークアイテムを実行すべきかどうかを決定するようにさらに構成され、前記１つ以上の値は、前記入力データに関して前記１つ以上の第２のカーネルの前記後続するワークアイテムを実行すべきかどうかを示す請求項６に記載の装置。
【請求項８】
前記１つ以上のシェーダプロセッサは、
前記第１のカーネルと関連付けられた第１のワークグループを実行し、前記第１のワークグループの結果に基づいて１つ以上のワークグループカリング値を生成し、及び前記１つ以上のワークグループカリング値に基づいて前記１つ以上の第２のカーネルの前記ワークグループを実行すべきかどうかを決定するように構成され、
前記第１のワークグループは、前記入力データを処理するための前記第１のワークアイテムを含む複数の命令を備え、前記１つ以上のワークグループカリング値は、前記１つ以上の第２のカーネルのワークグループを実行すべきかどうかを示す、請求項５に記載の装置。
【請求項９】
前記１つ以上のシェーダプロセッサ及びカルモジュールは、ボータブルなコンピューティングデバイスに含められる請求項５に記載の装置。
【請求項１０】
コンピューティングデバイスのＧＰＵの１つ以上のシェーダプロセッサを用いて、第１のカーネルおよび１つ以上の連続して実行される第２のカーネルを含むアプリケーションの前記第１のカーネルの第１のワークアイテムを実行し、
前記第１のワークアイテムの結果に加えて、前記第１のカーネルの前記第１のワークアイテムの前記結果に基づいて１つ以上のカリング値を生成し、及び
前記１つ以上のカリング値が前記１つ以上の第２のカーネルの前記ワークアイテムが実行されるべきでないことを示すとき、前記１つ以上の第２のカーネルの前記ワークアイテムを実行しないことを決定し、前記１つ以上のシェーダプロセッサによる前記ワークアイテムの実行の前に命令ストリームから前記１つ以上の第２のカーネルの前記ワークアイテムを取り除くことを前記コンピューティングデバイスの１つ以上のプロセッサに行わせるための命令を用いて符号化されたコンピュータによって読み取り可能な記憶媒体であって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含み、前記１つ以上のカリング値は、前記入力データに関して前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す、コンピュータによって読み取り可能な記憶媒体。
【請求項１１】
前記１つ以上のカリング値をバッファに格納することを前記コンピューティングデバイスの前記１つ以上のプロセッサに行わせるための命令をさらに備え、前記１つ以上の第２のカーネルの前記ワークアイテムを実行すべきかどうかを決定するために、前記命令は、前記カルバッファに格納された前記１つ以上のカリング値を読み取ることを前記１つ以上のプロセッサに行わせる、請求項１０に記載のコンピュータによって読み取り可能な記憶媒体。
【請求項１２】
前記ＧＰＵの前記シェーダプロセッサを用いて、前記入力データに関して前記１つ以上の第２のカーネルの第２のカーネルの第２のワークアイテムを実行し、
前記第２のワークアイテムの結果に基づいて前記１つ以上のカリング値を更新し、及び
前記更新された１つ以上のカリング値に基づいて後続するワークアイテムを実行すべきかどうかを決定することを前記コンピューティングデバイスの前記１つ以上のプロセッサに行わせるための命令をさらに備え、前記１つ以上の値は、前記入力データに関して前記１つ以上の第２のカーネルの前記後続するワークアイテムを実行すべきかどうかを示す請求項１１に記載のコンピュータによって読み取り可能な記憶媒体。
【請求項１３】
前記ＧＰＵの前記シェーダプロセッサを用いて第１のワークグループを実行し、
前記第１のワークグループの結果に基づいて１つ以上のワークグループカリング値を生成し、及び
前記１つ以上のワークグループカリング値に基づいて前記１つ以上の第２のカーネルの前記ワークグループを実行すべきかどうかを決定することを前記コンピューティングデバイスの前記１つ以上のプロセッサに行わせるための命令をさらに備え、前記第１のワークグループは、前記第１のカーネルと関連付けられ、前記第１のワークグループは、前記入力データを処理するための前記第１のワークアイテムを含む複数の命令を備え、前記１つ以上のワークグループカリング値は、前記１つ以上の第２のカーネルのワークグループを実行すべきかどうかを示す、請求項１０に記載のコンピュータによって読み取り可能な記憶媒体。
【請求項１４】
グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置であって、
前記ＧＰＵの１つ以上のシェーダプロセッサを用いて、第１のカーネルおよび１つ以上の連続して実行される第２のカーネルを含むアプリケーションの前記第１のカーネルの第１のワークアイテムを実行するための手段であって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含む手段と、
前記第１のワークアイテムの結果に加えて、前記第１のカーネルの前記第１のワークアイテムの前記結果に基づいて１つ以上のカリング値を生成するための手段であって、前記１つ以上のカリング値は、前記入力データに関して前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す手段と、
前記１つ以上のカリング値が前記１つ以上の第２のカーネルの前記ワークアイテムが実行されるべきでないことを示すとき、前記１つ以上の第２のカーネルの前記ワークアイテムを実行しないことを決定し、前記１つ以上のシェーダプロセッサによる前記ワークアイテムの実行の前に命令ストリームから前記１つ以上の第２のカーネルの前記ワークアイテムを取り除く手段と、を備える、装置。
【請求項１５】
前記第１のワークアイテムの前記結果に基づく前記１つ以上の値をバッファに格納するための手段をさらに備える請求項１４に記載の装置。
【請求項１６】
前記ＧＰＵの前記１つ以上のシェーダプロセッサを用いて、前記１つ以上の第２のカーネルの第２のカーネルの第２のワークアイテムを実行するための手段と、
前記第２のワークアイテムの結果に基づいて前記１つ以上のカリング値を更新するための手段であって、前記１つ以上の値は、前記入力データに関して前記１つ以上の第２のカーネルの後続するワークアイテムを実行すべきかどうかを示す手段と、
前記更新された１つ以上のカリング値に基づいて前記後続するワークアイテムを実行すべきかどうかを決定するための手段と、をさらに備える請求項１５に記載の装置。
【請求項１７】
前記ＧＰＵの前記シェーダプロセッサを用いて第１のワークグループを実行するための手段であって、前記第１のワークグループは、前記第１のカーネルと関連付けられ、前記第１のワークグループは、前記入力データを処理するための前記第１のワークアイテムを含む複数の命令を備える手段と、
前記第１のワークグループの結果に基づいて１つ以上のワークグループカリング値を生成するための手段であって、前記１つ以上のワークグループカリング値は、前記１つ以上の第２のカーネルのワークグループを実行すべきかどうかを示す手段と、
前記１つ以上のワークグループカリング値に基づいて前記１つ以上の第２のカーネルの前記ワークグループを実行すべきかどうかを決定するための手段と、をさらに備える請求項１４に記載の装置。
【請求項１８】
前記１つ以上の第２のカーネルは、複数のカーネルを備え、前記１つ以上のカリング値を生成することは、前記入力データに関して前記複数のカーネルの前記ワークアイテムの全てを実行すべきかどうかを示す１つ以上のカリング値を生成することを備える請求項１に記載の方法。
【請求項１９】
前記１つ以上のカリング値を生成することは、複数のカリング値を生成することを備え、前記複数のうちの各それぞれのカリング値は、前記第１のワークアイテムの結果のそれぞれの特徴を表し、前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す請求項１に記載の方法。
【請求項２０】
前記１つ以上の第２のカーネルは、複数のカーネルを備え、前記１つ以上のカリング値を生成するために、１つ以上のシェーダプロセッサは、前記入力データに関して前記複数のカーネルの前記ワークアイテムの全てを実行すべきかどうかを示す１つ以上のカリング値を生成するように構成される請求項５に記載の装置。
【請求項２１】
前記１つ以上のカリング値を生成するために、前記１つ以上のシェーダプロセッサは、複数のカリング値を生成するように構成され、前記複数のうちの各それぞれのカリング値は、前記第１のワークアイテムの結果のそれぞれの特徴を表し、前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す請求項５に記載の装置。
【請求項２２】
前記１つ以上の第２のカーネルは、複数のカーネルを備え、前記１つ以上のカリング値を生成するために、前記命令は、前記入力データに関して前記複数のカーネルの前記ワークアイテムの全てを実行すべきかどうかを示す１つ以上のカリング値を生成することを前記１つ以上のプロセッサを行わせる請求項１０に記載のコンピュータによって読み取り可能な記憶媒体。
【請求項２３】
前記１つ以上のカリング値を生成するために、前記命令は、複数のカリング値を生成することを前記１つ以上のプロセッサに行わせ、前記複数のうちの各それぞれのカリング値は、前記第１のワークアイテムの結果のそれぞれの特徴を表し、前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す請求項１０に記載のコンピュータによって読み取り可能な記憶媒体。
【請求項２４】
前記１つ以上の第２のカーネルは、複数のカーネルを備え、前記１つ以上のカリング値を生成するための手段は、前記入力データに関して前記複数のカーネルの前記ワークアイテムの全てを実行すべきかどうかを示す１つ以上のカリング値を生成するための手段を備える請求項１４に記載の装置。
【請求項２５】
前記１つ以上のカリング値を生成するための手段は、複数のカリング値を生成するための手段を備え、前記複数のうちの各それぞれのカリング値は、前記第１のワークアイテムの結果のそれぞれの特徴を表し、前記１つ以上の第２のカーネルのワークアイテムを実行すべきかどうかを示す請求項１４に記載の装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本開示の態様は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理することに関するものである。
【背景技術】
【０００２】
様々な画像処理又はその他の汎用処理アプリケーションを実施するためにグラフィックス処理デバイスを実装することができる。例えば、グラフィックス処理ユニット（ＧＰＵ）は、汎用グラフィックス処理ユニット（ＧＰＧＰＵ）とも呼ばれ、高度な並列処理の利益を享受するアプリケーション、例えば、色補正アルゴリズム、顔検出アルゴリズム、パターン認識アルゴリズム、拡張現実アプリケーション、様々なアルゴリズムアプリケーション（例えば、ウェーブレット変換、フーリエ変換、等）、又は様々なその他のアプリケーション、を実行することができる。
【０００３】
概して、ＧＰＵは、ＧＰＵ内に常駐する１つ以上のシェーダプロセッサ（ｓｈａｄｅｒ  ｐｒｏｃｅｓｓｏｒ）を用いて、シェーダ命令と呼ばれることがある一連の命令を処理するように設計される。１つの画像処理アプリケーション例では、シェーダ命令は、画像を構成するピクセルに関してシェーダプロセッサによって実施される１つ以上の数学的演算を定義することができる。シェーダ命令をピクセルに適用することによって、ピクセル値は、シェーダ命令によって定義された数学的演算に従って変更又は評価される。
【０００４】
シェーダ命令は、カーネルと呼ばれるシェーダプログラムコードにすることができる。カーネルは、ＧＰＵによって実施される機能又はタスクを定義することができる。カーネルを実行するために、プログラムコードは、ワークアイテム（ｗｏｒｋ  ｉｔｅｍ）（例えば、ＧＰＵにおける作業の基本単位）に分割され、それらは、１つ以上のワークグループ（例えば、一組のワークアイテム）として編成される。
【発明の概要】
【０００５】
概して、本開示の態様は、ＧＰＵによる実行にとって無関係な（ｉｒｒｅｌｅｖａｎｔ）シェーダ命令を特定してそれらの無関係な命令が実行されるのを防止することに関するものである。無関係な命令が実行されるのを防止するために、無関係な命令は、実行される前に命令の組から“カリング”（ｃｕｌｌｉｎｇ）される、すなわち取り除かれる。幾つかの態様により、ＧＰＵは、命令のカリングを行うためのカルバッファ（ｃｕｌｌ  ｂｕｆｆｅｒ）を実装することができる。例えば、命令を実行後は、ＧＰＵは、後続する命令の１つ以上の特徴（例えば、関係性に関する特徴）を表す１つ以上の値を格納することができる。ＧＰＵは、後続する命令が実行される前にその命令を取り除くべきかどうかを決定するために格納された値を使用することができる。
【０００６】
一例では、本開示の態様は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法を対象とする。幾つかの態様により、方法は、第１のワークアイテムをＧＰＵのシェーダプロセッサによって実行することを含み、第１のワークアイテムは、入力データを処理するための１つ以上の命令を含む。方法は、第１のワークアイテムの結果に基づいて１つ以上の値を生成することも含み、１つ以上の値は、その結果の１つ以上の特徴を表す。方法は、１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定することも含み、第２のワークアイテムは、入力データを処理するための第１のワークアイテムの１つ以上の命令と別個の１つ以上の命令を含む。
【０００７】
他の例では、本開示の態様は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置を対象とする。装置は、入力データを処理するための１つ以上の命令を含む第１のワークアイテムを実行し、及び、第１の命令の結果に基づいて１つ以上の値を生成するように構成されたシェーダプロセッサを含み、１つ以上の値は、その結果の１つ以上の特徴を表す。装置は、１つ以上の値に基づいて第１のワークアイテムの１つ以上の命令と別個の１つ以上の命令を含む第２のワークアイテムを実行すべきかどうかを決定するように構成されたカルモジュール（ｃｕｌｌ  ｍｏｄｕｌｅ）も含む。
【０００８】
他の例では、本開示の態様は、第１のワークアイテムを実行すること、及び、第１のワークアイテムの結果に基づいて１つ以上の値を生成することをコンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令を用いて符号化されたコンピュータによって読み取り可能な記憶媒体が対象であり、第１のワークアイテムは、入力データを処理するための１つ以上の命令を含み、１つ以上の値は、その結果の１つ以上の特徴を表す。コンピュータによって読み取り可能な記憶媒体は、１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定することをコンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令によっても符号化され、第２のワークアイテムは、入力データを処理するための第１のワークアイテムと別個の１つ以上の命令を含む。
【０００９】
他の例では、本開示の態様は、グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置を対象とする。装置は、第１のワークアイテムを実行するための手段を含み、第１のワークアイテムは、入力データを処理するための１つ以上の命令を含む。装置は、第１のワークアイテムの結果に基づいて１つ以上の値を生成するための手段も含み、１つ以上の値は、その結果の１つ以上の特徴を表す。装置は、１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定するための手段も含み、第２のワークアイテムは、入力データを処理するための第１のワークアイテムと別個の１つ以上の命令を含む。
【００１０】
本開示の１つ以上の例の詳細が添付図及び以下の説明において示される。これらの説明及び図面から、及び請求項から、本開示のその他の特徴、目的、及び利点が明らかになるであろう。
【図面の簡単な説明】
【００１１】
【図１】本開示の態様による無関係の命令を特定及びカリングするための技法を実装することができるコンピューティングデバイスを例示したブロック図である。
【図２】図１に示されるＧＰＵをより詳細に例示したブロック図であり、本開示の態様による命令カリング技法を実施するように構成することができる。
【図３】本開示の態様による、ワークグループと関連付けられたワークアイテムの格子を例示したブロック図である。
【図４】本開示の態様による、３つのカーネルの配列におけるワークグループの格子を例示したブロック図である。
【図５Ａ】本開示の態様による、画像を処理するための第１のカーネルを例示したブロック図である。
【図５Ｂ】本開示の態様による、図５Ａに示される画像を処理するための第２のカーネルでの命令カリングを例示したブロック図である。
【図５Ｃ】本開示の態様による、図５Ａに示される画像を処理するための第３のカーネルでの命令カリングを例示したブロック図である。
【図６】本開示の態様による、命令をカリングする方法を例示したフローチャートである。
【図７】本開示の態様による、命令をカリングするために実装することができる。命令の流れを例示したフローチャートである。
【発明を実施するための形態】
【００１２】
本開示の態様は、概して、汎用グラフィックス処理ユニット（“ＧＰＧＰＵ”）として実装することができるグラフィックス処理ユニット（“ＧＰＵ）”の効率を向上させることに関するものである。概して、ＧＰＵは、計算を行うための複数のシェーダプロセッサ（“ＳＰ”）を含む。それらの計算は、１つ以上のシェーダプログラム（ここでは、“カーネル”と呼ばれる）を含むＧＰＧＰＵアプリケーションにおいて構造化することができる。カーネルは、様々な入力データを解析又は変更するために実装することができる関数を定義する。例は、相対的に大きな数値データセットを並列処理するための関数を含む。画像処理では、関数は、例えば、色補正アルゴリズム、顔検出アルゴリズム、又は拡張現実アプリケーションを実行するための関数を含むことができる。その他の例は、変換関数、レイトレーシング関数、又は様々なその他の関数を含む。
【００１３】
カーネルは、ワークグループに分類することができる個々のワークアイテム（例えば、ＧＰＵにおける作業の基本単位）から成る。画像（例えば、映像データのフレーム、コンピュータによって生成されるグラフィックス画像、静止画像、等）を処理するためにＧＰＵが実装される例では、ワークアイテムは、画像のピクセルを解析又は変更（ｍｏｄｉｆｙ）するための関数を定義する１つ以上の命令を含むことができる。さらに、複数のワークアイテムを、画像のピクセルグループを解析又は変更するためのワークグループ（例えば、一組のワークアイテム）として編成することができる。
【００１４】
幾つかのアプリケーションは、同じ入力データに関して複数の関数を実行するための複数のカーネルを含むことができる。さらに、複数のカーネルを有するアプリケーションは、その他のカーネルに依存する幾つかのカーネルを含むことができる。例えば、ある１つのアプリケーションが２つのカーネルを含むことができ、第２のカーネルは、第１のカーネルの結果に依存する。従って、幾つかの例では、１つのカーネルの結果が、後続するカーネルの結果を“無関係”にすることがある。ここで説明される場合において、“無関係な命令”とは、アプリケーションの目的を促進させない命令であることができる。換言すると、“無関係な”命令は、アプリケーションの結果を変更しない、又は考慮に入れない命令であることができる。
【００１５】
単純な例では、ある１つのアプリケーションは、データセット内のある特徴［ｘ，ｙ，ｚ］を識別するための２つのカーネルを含む。第１及び第２のカーネルは、３つの命令を各々有しており、それらは、［ｘ，ｙ，ｚ］とそれぞれ関連付けられた３つの別個のワークアイテムで定義することができる。それらの３つの命令は、その特徴が命令を実行することによって識別される場合は“真”、その特徴が命令を実行することによって識別されない場合は“偽”であると評価する。さらに、第２のカーネルは、第１のカーネルの結果に依存する。例えば、特徴を識別するためには両方のカーネルの命令を“真”と評価しなければならず、このため、第２のカーネルの命令は、“真”であると評価される第１のカーネルの命令に依存する。第１のカーネルを実行後は、ＧＰＵは、希望される特徴を“ｘ”及び“ｙ”に含めることができ、“ｚ”には含めることができないと決定する。第２のカーネルの命令は、“ｚ”に関連しており、アプリケーションの結果と無関係である。例えば、“ｚ”に関連する第２の命令は、アプリケーションの結果を考慮に入れず、その理由は、“ｚ”に関連する第２の命令が“真”であると評価される場合でも、命令が第１のカーネルを既に失敗しているためである。特に、第１のカーネル内の“ｚ”に関連する命令は、希望される特徴を識別しなかった。このアプリケーション例では、第２のカーネルは、個々の無関係の命令（例えば、ワークアイテム）を含み、従って、カーネルの一部分のみが無関係であり、カーネルの残りの部分は結果に関係することができる。
【００１６】
２つ以上の無関係の命令を有するカーネルは、幾つかの状況では、“スパースな”（ｓｐａｒｓｅ）として説明することができる。例えば、“スパースな”カーネルは、数多くの無関係な命令によって分離された関係する命令を含むことができる。典型的には、ＧＰＵは、命令の関係性にかかわらず、実行を目的としてすべての命令（例えば、カーネルのワークアイテム及びワークグループ）をシェーダプロセッサ（ＳＰ）に配分する。例えば、ＧＰＵは、概して、無関係な命令を識別するためのメカニズムを含まない。従って、ＧＰＵのＳＰは、典型的には、カーネルのワークアイテム又はワークグループの関係性にかかわらず、すべてのワークグループ及びワークアイテムを実行しなければならない。スパースなカーネルを実行することは、ＧＰＵのＳＰが無関係の命令を実行することに占有されてＧＰＵ処理電力を消費するため、ＧＰＵ性能を低下させることがある。
【００１７】
本開示の態様は、少なくとも幾つかの無関係な命令の実行を回避することによってＧＰＵのＳＰの効率及び利用を向上させることに関するものである。幾つかの例では、ＧＰＵは、無関係な命令を特定し、それらの無関係な命令がＧＰＵのＳＰによって処理されるのを防止する。すなわち、ＧＰＵは、ＧＰＵ内での作業の基本単位（例えば、実行可能なコード）である無関係なワークアイテムを特定することができ、及び、１つ以上の個々の命令を含むことができ、及び、無関係なワークアイテムがＧＰＵのＳＰによって処理されるのを防止することができる。無関係なワークアイテムが処理されるのを防止するため、ＧＰＵは、無関係なワークアイテムが実行される前に“カリングする”、すなわち、取り除くことができる。幾つかの態様により、ＧＰＵは、カリングを実施するためのカルバッファ（ｃｕｌｌ  ｂｕｆｆｅｒ）を実装することができる。例えば、カルバッファは、ＧＰＵがワークアイテムを実行できる前にそのワークアイテムを取り除くべきかどうかを決定するために使用することができる１つ以上の値を保有することができる。
【００１８】
概して、用語“ワークアイテム”及び“命令”は、互換可能な形で使用することができる。本開示は、概して、入力データを処理ための関数の少なくとも一部分として命令を記述する。本開示は、概して、ワークアイテムをＧＰＵにとっての作業の基本単位（例えば、実行可能なコードの基本単位）と呼び、１つ以上の個々の命令を含むことができる。従って、用語“ワークアイテム”は、入力データを処理するための関数を定義する１つ以上の命令を概して意味することが理解されるべきである。“ワークアイテム”は、Ｃｏｍｐｕｔｅ  Ｕｎｉｆｉｅｄ  Ｄｅｖｉｃｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＮＶＩＤＩＡ  Ｃｏｒｐｏｒａｔｉｏｎによって開発された“ＣＵＤＡ”、バージョン３．２  ２０１０年９月１７日リリース）では“スレッド”と呼ぶこともできる。
【００１９】
ＧＰＵは、無関係の命令を実行のために編成してＳＰに配分する前に命令の組からカリングすることができる。無関係な命令をＳＰに提供して処理できるようになる前にカリングすることは、ＳＰが無関係な命令を実行するために占有されないためＧＰＵの効率を向上させるのに役立つことができる。さらに、無関係な命令をカリングすることで、ＧＰＵは、無関係な命令を編成して配分することにリソースを専念させない。むしろ、ＧＰＵは、関係がある命令をＤＰに配分することができ、そのことは、関係がある命令を連続的に実行するのを可能にする。
【００２０】
本開示の態様により、ＧＰＵは、命令カリングを実施するためのカルバッファを実装することができる。カルバッファは、実行された命令の特徴を表す１つ以上の値を格納することができる。その特徴は、後続する命令が関係があるか又は無関係かを決定するために使用することができる。例えば、ＧＰＵは、２つのカーネルを有するアプリケーションを実行することができる。第１のカーネルを実行している間に、ＧＰＵは、第１のカーネルと関連付けられた命令の結果に基づいて第２のカーネルの命令が関係があるかどうかを表す１つ以上の値をカルバッファに格納することができる。第２のカーネルの１つ以上の命令が関係ない場合は、ＧＰＵは、それらの無関係の命令がＳＰによって実行されるのを防止することができる。例えば、ＧＰＵのうちで命令を編成してＳＰに配分することを担当するコンポーネントは、カルバッファに格納された値に基づいて無関係の命令をカリングすることができる。
【００２１】
従って、概して、本開示の技法は、２つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第１のカーネルのワークアイテム及びワークグループを実行した時点で、ＧＰＵは、第２のカーネルのワークアイテム及びワークグループが関係するかどうかを表すカルバッファ値を設定することができる。すなわち、ＧＰＵは、第１のカーネルの結果に基づいてカルバッファ値を設定することができ、それらは、第１のカーネルのワークアイテム及びワークグループの各々の同じ入力データと関連付けられた第２のカーネルの各々のワークアイテム及びワークグループが関係するかどうかを表す。従って、第１のカーネルを実行後は、ＧＰＵは、第２のカーネル内の無関係のワークアイテム及びワークグループが実行されないようにそれらの無関係のワークアイテム及びワークグループをカリングするためにカルバッファ値を利用することができる。
【００２２】
幾つかの例では、カルバッファは、アプリケーションのすべての命令の特徴を表す１つ以上の値を格納するように設計することができる。例えば、各命令を実行後は、ＧＰＵは、命令が関係があるか又は無関係であるかを示す各命令の特徴を表すカルバッファを格納することができる。他の例では、ＧＰＵは、後続する命令が無関係であるとＧＰＵが決定したときのみにカルバッファ値を格納することができる。
【００２３】
カルバッファは、ワークグループの特徴を表す１つ以上の値、及び、そのワークグループ内の個々のワークアイテムの特徴を表す１つ以上の値を格納するように設計することができる。従って、カルバッファは、ワークグループ及びワークアイテムの両方のレベルで命令が無関係であるかどうかを決定するために使用することができる。所定のワークグループのすべてのワークアイテムが前に実行されたカーネルによって無関係とされた場合は、ＧＰＵは、無関係のワークグループがＳＰによって実行されないようにワークグループ全体をカリングすることができる。代替として、所定のワークグループのワークアイテムの一部のみが前に実行されたカーネルによって無関係とされた場合は、ＧＰＵは、無関係のワークアイテムがＳＰによって実行されないように個々のワークアイテムをカリングすることができる。
【００２４】
用語“ワークグループ”は、概して、予め定義された命令のグループ、例えば、予め定義されたワークアイテムのグループ、を意味することが理解されるべきである。“ワークグループ”は、Ｃｏｍｐｕｔｅ  Ｕｎｉｆｉｅｄ  Ｄｅｖｉｃｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ（ＮＶＩＤＩＡ  Ｃｏｒｐｏｒａｔｉｏｎによって開発された“ＣＵＤＡ”、バージョン３．２  ２０１０年９月１７日リリース）では“スレッドブロック”と呼ぶこともできる。
【００２５】
本開示の態様は、様々な異なるカルバッファサイズ及び様々な異なるカルバッファ能力の使用を含む。一例では、カルバッファは、カーネルの各ワークアイテムの単一の特徴を表す単一のバイナリ値（例えば、単一の記憶ビット）を格納することができる。該例では、ＧＰＵは、前に実行されたワークアイテムの結果に基づいてワークアイテムが関係があるか又は無関係であるかを識別するためにカルバッファ値を使用することができる。
【００２６】
単一のバイナリ値を格納するカルバッファは、カルバッファ構成の単なる一例であるにすぎない。他の例では、カルバッファは、ワークアイテムごとに２つ以上の値を格納することができる。例えば、カルバッファは、実行されたワークアイテムの２つ以上の特徴に対応する２つ以上の値を格納することができる。制限することを意味しない画像処理例では、ＧＰＵは、ピクセルデータの赤緑青（ＲＧＢ）の特徴を決定するためにピクセルデータに関するワークアイテムを実行することができる。従って、カルバッファは、実行された命令の赤、緑、及び青の成分に対応する３つの値を格納するために実装することができる。この例では、ＧＰＵは、カルバッファに格納された値のうちのいずれかに基づいて命令をカリングすることができる。カルバッファのコンフィギュレーション（例えば、サイズ及び能力）は、アプリケーション及びＧＰＵに依存することが理解されるべきである。例えば、幾つかのＧＰＵは、相対的に大きな多機能のカルバッファのために相対的に大きなメモリ量を提供するように設計することができる。その他のＧＰＵは、該多様性を提供することができない。従って、提供される例は、実装することができるカルバッファの唯一のコンフィギュレーションではないことが理解されるべきである。
【００２７】
ＧＰＵは、様々な方法でカルバッファに値を格納することができる。一例では、ＳＰがワークアイテムを実行後に、ＳＰは、実行されたワークアイテムの結果に基づいて１つ以上のカルバッファ値をカルバッファに書き込むことができる。この例では、他のカーネルの新しいワークアイテム（例えば、同じ入力データと関連付けられたワークアイテム）を実行後に、ＳＰは、カルバッファに格納された１つ以上のカルバッファ値を読み取り、１つ以上のカルバッファ値を新しいワークアイテムの実行によって生成された新しい値と比較することによって１つ以上のカルバッファ値を更新することができる。この例では、格納された値を新しいワークアイテムの実行によって生成された新しい値と比較する前にカルバッファに格納された１つ以上のカルバッファ値を読み取ることに関連するレーテンシーが存在することがある。
【００２８】
他の例では、ＳＰがワークアイテムを実行後に、ＳＰは、１つ以上のカルバッファ値をプログラミング可能な又は固定された機能のハードウェア（ｐｒｏｇｒａｍｍａｂｌｅ  ｏｒ  ｆｉｘｅｄ  ｆｕｎｃｔｉｏｎ  ｈａｒｄｗａｒｅ）に提供することができ、それが１つ以上のカルバッファ値をカルバッファに書き込む。例えば、プログラミング可能な又は固定された機能のハードウェアは、ワークアイテムの実行時点でＳＰからの入力を受け取るように構成することができる。プログラミング可能な又は固定された機能のハードウェアは、入力を解釈して入力に対応するカルバッファに１つ以上の値を格納するために実装することができる。この例では、プログラミング可能な又は固定された機能のハードウェアは、カルバッファに格納された１つ以上の値を新しいワークアイテムの実行によって生成された新しい値と比較するのを担当することができる。プログラミング可能な又は固定された機能のハードウェアがカルバッファの更新を行うのを可能にすることは、ＳＰが格納された１つ以上の値を読み取る必要がないため、その結果として、より低いレーテンシーになる。むしろ、プログラミング可能な又は固定された機能のハードウェアが、１つ以上のカルバッファ値を読み取ることを担当する。
【００２９】
幾つかの態様により、バッファ値は、命令をシーケンシングしてＧＰＵのＳＰに配分することを担当するＧＰＵのコンポーネントによってアクセス及び利用することができる。例えば、シーケンシングコンポーネントは、命令をＳＰに配分する準備をしている間にバッファ値を読み取って命令を取り除くことができる。従って、シーケンシングコンポーネントは、ＳＰに命令を配分する前にそれらの命令を取り除くことができる。幾つかの例では、シーケンシングコンポーネントは、ワークグループ及びワークアイテムの両方のセットアップ及び配分を担当することができる。シーケンシングコンポーネントは、カルバッファに格納された値を読み取り、ＳＰに命令を配分する前にワークグループ及びワークアイテムの両方のレベルで命令を取り除くことができる。例えば、シーケンシングモジュールは、カルバッファに格納された値を読み取り、それらの値に基づいてワークアイテムのワークグループ全体が無関係であると決定することができる。シーケンシングモジュールは、カルバッファに格納された値を読み取り、それらの値に基づいて個々のワークアイテムが無関係であることを決定することもできる。
【００３０】
幾つかの態様により、アプリケーションは、命令カリングを可能にする命令を含むことができる。例えば、アプリケーションは、カルバッファが機能するのを可能にする命令を含むことができる。命令カリングを可能にするために、アプリケーションの実行された命令は、結果、及びその結果の特徴を表す、カルバッファに格納される１つ以上の値、の両方を提供し、それらは、後続する命令の関係性を決定するために使用することができる。
【００３１】
ＧＰＵアプリケーションのプログラミングは、典型的には、複数のプラットフォーム、オペレーティングシステム、及びハードウェア上で実行することができる標準的なソフトウェアインタフェースを提供するアプリケーションプログラムインタフェース（ＡＰＩ）を用いてユーザ（例えば、コンピュータプログラマ）によって行われる。ＡＰＩの例は、Ｏｐｅｎ  Ｇｒａｐｈｉｃｓ  Ｌｉｂｒａｒｙ（“ＯｐｅｎＧＬ”、バージョン４．１、２０１０年７月２６日リリース、公に入手可能）と、Ｃｏｍｐｕｔｅ  Ｕｎｉｆｉｅｄ  Ｄｅｖｉｃｅ  Ａｒｃｈｉｔｅｃｔｕｒｅ（“ＣＵＤＡ”、ＮＶＩＤＡ  Ｃｏｒｐｏｒａｔｉｏｎ開発、バージョン３．２、２０１０年９月１７日リリース）と、ＤｉｒｅｃｔＸ（Ｍｉｃｒｏｓｏｆｔ開発、バージョン１１、２００９年１０月２７日リリース）と、を含む。概して、ＡＰＩは、関連付けられたハードウェアによって実行される予め決定された、標準化された一組のコマンドを含む。ＡＰＩコマンドは、ユーザがＧＰＵのハードウェアコンポーネントの詳細に関する知識なしにコマンドを実行するようにそれらのハードウェアコンポーネントに命令するのを可能にする。
【００３２】
本開示の幾つかの態様は、ユーザ（例えば、コンピュータプログラマ）が命令カリングを定義及び実装するのを可能にする１つ以上のＡＰＩコマンドに関するものである。例えば、ＡＰＩコマンドは、ユーザが命令の実行後にアプリケーションによって生成されることになるカルバッファ値を定義するのを可能にすることもできる。ＡＰＩコマンドは、１つ以上のカルバッファ値を指定されたカルバッファに格納するようにＧＰＵに命令することもできる。ＡＰＩコマンドは、命令を編成してＳＰに配分する前にカルバッファを解析するようにＧＰＵに命令することもできる。ＧＰＵは、コマンドを受け取って実行した時点で、１つ以上のカルバッファ値を生成してカルバッファに格納し、無関係な命令がＳＰに配分される前にそれらをカリングする。
【００３３】
様々な異なるＧＰＧＰＵアプリケーションが無関係な命令のカリングから利益を得ることができる。１つの限定することを意味しない単純化された画像処理アプリケーション（例えば、顔検出アプリケーション）が、複数のカーネルを有することができるアプリケーションの一例として提供され、１つのカーネルが、他のカーネルの命令を無関係にする命令を有する。顔検出アプリケーションの一例は、画像（例えば、映像データのフレーム、コンピュータによって生成されたグラフィックス画像、静止画像、等）内に含まれている顔と関連付けられた、異なる予め定義された特徴を検出するための３つのカーネルを含む。
【００３４】
この例では、各カーネルは、顔と関連付けられた画像のピクセル内の特定の特徴（例えば、色、色調、飽和、輝度、又はその他の性質）を識別するために実装することができる。この例により、カーネル内で設定されるすべての判定基準を満たす映像データのフレーム内のピクセル又はピクセルのグループが顔の候補である。さらに、この例のカーネルは、より控えめからより少なく控えめになるように編成される。
【００３５】
例えば、第１のカーネルは、可能性のある候補を除外するのを回避するために数多くの候補の顔ピクセルを識別することができる。しかしながら、第２及び第３のカーネルは、候補数を十分に少なくするために候補となる顔のピクセルとみなされるピクセルを排除する上でより積極的であることができる。この例では、各カーネルが実行された後にカーネルの一部分が無関係になる。例えば、第１のカーネルを実行後は、幾つかのピクセルのみが候補の顔のピクセルとして識別され、残りのピクセルは考慮の対象から除外される。従って、第２及び第３のカーネル内の除外されたピクセルと関連付けられた命令はすべて無関係である。それらの命令は、実行された場合でも、顔候補を識別するのには貢献しない。
【００３６】
提供された顔検出例においてカーネルが実行されるのに応じて、第２及び第３のカーネルはスパースになる。例えば、各カーネルが実行された後は、後続するカーネルのより多くの命令が無関係になる。無関係な命令は、顔を見つけるのには貢献しないにもかかわらずＧＰＵリソースを消費する。本開示の態様により、ＧＰＵは、無関係な命令が実行のためにＳＰに配分される前に無関係な命令を取り除くために命令カリングを実装することができる。このようにして、無関係な命令を実行するためにＧＰＵのＳＰが実装されるため、ＧＰＵの効率が向上される。
【００３７】
提供された顔検出例を実行するときには、ＧＰＵは、最初に第１のカーネルを実行し、１つ以上のカルバッファ値を生成することができる。例えば、ＧＰＵのＳＰは、第１のカーネルの命令を実行し、第１のカーネルの実行された命令の特徴（例えば、後続する命令が関係するか又は無関係であるか）を表すカルバッファ値でカルバッファをポピュレート（ｐｏｐｕｌａｔｅ）することができる。第２のカーネルを実行した時点で、ＧＰＵは、無関係な命令を特定して第２のカーネルからカリングするためにカルバッファに格納された値を利用することができる。例えば、ＧＰＵは、カルバッファ７６に格納された値を読み取り、命令が実行目的でＳＰ８４に配分される前にそれらの命令をカリングすべきかどうかを決定することができる。ＧＰＵが命令カリングを完了した後は、ＧＰＵは、第２のカーネルを実行し、新しいカルバッファ値でカルバッファを更新する。ＧＰＵは、このプロセス例を繰り返して第３のカーネルを実行することができる。
【００３８】
画像処理は、１つのカーネルの命令が他のカーネルの命令を無関係にする一例であるにすぎない。その他の例は、例えば、拡張現実アプリケーションと、レイトレーシングと、パターン認識と、を含む。概して、ＧＰＵは、様々な入力データに関して様々なアプリケーションを実行するために実装することができる。カーネルは、個々のアプリケーション専用であり、命令を構成するための枠組のみを提供する。従って、無関係な命令をカリングする概念は、様々なその他のアプリケーションに対して適用可能であることが理解されるべきである。
【００３９】
ここにおいて説明される幾つかの例及び態様は、異なるカーネルの無関係のワークアイテム及びワークグループがＧＰＵのＳＰに配分される前にそれらのワークアイテム及びワークグループを特定してカリングすることを対象とする。しかしながら、カーネル／ワークグループ／ワークアイテムに関する詳細な説明は、ＧＰＧＰＵアプリケーション構造の単なる一例であるにすぎない。無関係なワークアイテム及びワークグループを特定すること、及び、ワークアイテム及びワークグループカリング値を生成、格納、及び使用することは、ほんの一例として提供されていることが理解されるべきである。本開示の態様は、無関係な命令を特定することに関するものであり、カルバッファ値を生成、格納、及び使用することは、その他のＧＰＵアプリケーション構造でも適用可能である。例えば、その他のＧＰＵアプリケーションは、同じ入力データを実行中に２回以上使用する命令を含む単一の相対的により大きな“カーネル”を含むことができる。該例では、本開示の態様は、ＳＰ効率を最大にするためにも適用することができる。同じ入力データに関連する無関係な命令は、それらの命令が同じカーネルに属していてもカリングすることができる。
【００４０】
図１は、無関係な命令、例えば、ワークアイテム及びワークグループ、を特定してカリングするための技法を実装することができるコンピューティングデバイス２０を例示するブロック図である。図１に示されるように、コンピューティングデバイス２０は、ホストプロセッサ２４と、記憶装置２８と、メモリ３２と、ネットワークモジュール３６と、ユーザインタフェース４０と、ディスプレイ４４と、を含む。コンピューティングデバイス２０は、グラフィックス処理ユニット（ＧＰＵ）４８も含む。コンピューティングデバイス２０は、幾つかの例では、ポータブルコンピューティングデバイス（例えば、携帯電話、ネットブック、ラップトップ、タブレットデバイス、デジタルメディアプレーヤー、ゲームデバイス、又はその他のポータブルなコンピューティングデバイス）を含むことができ又はポータブルコンピューティングデバイス（例えば、携帯電話、ネットブック、ラップトップ、タブレットデバイス、デジタルメディアプレーヤー、ゲームデバイス、又はその他のポータブルなコンピューティングデバイス）の一部であることができる。代替として、コンピューティングデバイス２０は、静止型のコンピューティングデバイス、例えば、デスクトップコンピュータ、テレビ、テレビのセットトップボックス、ゲーム用コンソール、等として構成することができる。
【００４１】
図1の例示されるコンピューティングデバイス２０は、単なる一例である。無関係な命令を特定及びカリングするための技法は、その他のコンポーネントを有する様々なその他のコンピューティングデバイスによって実施することができる。幾つかの例では、コンピューティングデバイス２０は、明確化を目的として図１に示されていない追加のコンポーネントを含むことができる。例えば、コンピューティングデバイス２０は、コンピューティングデバイス２０のコンポーネント間でデータを転送するための１つ以上の通信ブリッジを含むことができる。さらに、図１に示されるコンピューティングデバイス２０のコンポーネントは、コンピューティングデバイス２０のすべての例において必要であるわけではない。例えば、ユーザインタフェース４０及びディスプレイ４４は、コンピューティングデバイス２０がデスクトップコンピュータである例ではコンピューティングデバイス２０の外部に存在することができる。
【００４２】
ホストコンピュータ２４は、マイクロプロセッサ、コントローラ、デジタル信号プロセッサ（ＤＳＰ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（ＦＰＧＡ）、又は同等のディスクリートの又は一体化された論理回路のうちのいずれか１つ以上を含むことができる。加えて、ホストプロセッサ２４に帰属する機能は、本開示では、ソフトウェア、ファームウェア、ハードウェア又はそれらのあらゆる組み合わせとして具現化することができる。
【００４３】
ホストプロセッサ２４は、コンピューティングデバイス２０内で実行するために命令を処理する。ホストプロセッサ２４は、記憶装置２８に格納された命令又はメモリ３２に格納された命令を処理することが可能である。アプリケーション例は、観ることが可能な画像を処理するためのアプリケーション（例えば、画像のフィルタリング、画像の予め定義された特徴に関する解析、等）を含む。ホストプロセッサ２４は、ユーザインタフェース４０を介してのユーザによる選択に基づいて１つ以上のアプリケーションを実行することができる。幾つかの例では、ホストプロセッサ２４は、ユーザとの対話なしに１つ以上のアプリケーションを実行することができる。
【００４４】
本開示の幾つかの態様により、及び、以下においてＧＰＵ４８に関してより詳細に説明されるように、ホストプロセッサ２４は、アプリケーションを実行するためにＧＰＵ４８と協力することができる。例えば、ホストプロセッサ２４は、アプリケーションの実行を初期化し、そのアプリケーションと関連付けられた一定の処理機能をＧＰＵ４８に委託することができる。一例では、ホストプロセッサ２４は、画像処理アプリケーションの実行を初期化し、そのアプリケーションと関連付けられた一定の処理機能をＧＰＵ４８に委託することができる。
【００４５】
記憶装置２８は、１つ以上のコンピュータによって読み取り可能な記憶媒体を含むことができる。記憶装置２８は、情報の長期格納用に構成することができる。幾つかの例では、記憶装置２８は、非揮発性記憶素子を含むことができる。該非揮発性記憶素子の例は、磁気ハードディスク、光ディスク、フロッピー（登録商標）ディスク、フラッシュメモリ、又は幾つかの形態の電気的プログラマブルメモリ（ＥＰＲＯＭ）又は電気的消去可能プログラマブル（ＥＥＰＲＯＭ）メモリを含むことができる。記憶装置２８は、幾つかの例では、非一時的な記憶媒体であるとみなすことができる。用語“非一時的な”は、その記憶媒体が搬送波又は伝搬信号で具現化されないことを示すことができる。しかしながら、用語“非一時的な”は、記憶装置２８が移動不能であることを意味するとは解釈されるべきではない。一例として、記憶装置２８は、コンピューティングデバイス２０から取り外して他のデバイスに移動させることができる。他の例として、記憶装置２８と実質的に類似する記憶装置をコンピューティングデバイス２０内に挿入することができる。
【００４６】
記憶装置２８は、ホストプロセッサ２４又はＧＰＵ４８による１つ以上のアプリケーションの実行のための命令を格納することができる。記憶装置２８は、ホストプロセッサ２４又はＧＰＵ４８による使用のためにデータを格納することもできる。例えば、記憶装置２８は、ホストプロセッサ２４又はＧＰＵ４８による処理のために画像データを格納することができる。
【００４７】
メモリ３２は、動作中に情報をコンピューティングデバイス２０内に格納するように構成することができる。幾つかの例では、メモリ３２は、一時的なメモリであり、メモリ３２の主目的は長期格納ではないことを意味する。メモリ３２は、幾つかの例では、コンピュータによって読み取り可能な記憶媒体として説明することができる。従って、メモリ３２は、経時で変化することが可能なデータを格納するにもかかわらず“非一時的”であるとみなすこともできる。メモリ３２は、幾つかの例では、揮発性メモリとして説明することもでき、メモリ３２は、コンピュータの電源が切られたときに格納されている内容物を維持しないことを意味する。揮発性メモリの例は、ランダムアクセスメモリ（ＲＡＭ）と、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）と、スタティックランダムアクセスメモリ（ＳＲＡＭ）と、当業において知られるその他の形態の揮発性メモリと、を含む。
【００４８】
幾つかの例では、メモリ３２は、ホストプロセッサ２４又はＧＰＵ４８による実行のためにプログラム命令を格納するために使用することができる。メモリ３２は、プログラムの実行中に情報を一時的に格納するためにコンピューティングデバイス２０上で実行中のソフトウェア又はアプリケーションによって使用することができる。従って、メモリ３２は、コンピューティングデバイス２０のその他のコンポーネント、例えば、ホストプロセッサ２４及びＧＰＵ４８、によってアクセスすることができる。
【００４９】
コンピューティングデバイス２０は、１つ以上のネットワーク、例えば、１つ以上の無線ネットワーク、を介して外部のデバイスと通信するためにネットワークモジュール３６を利用することができる。ネットワークモジュール３６は、ネットワークインタフェースカード、例えば、イーサネット（登録商標）カード、光学トランシーバ、無線周波数トランシーバ、又は情報を送信及び受信することができるあらゆるその他のタイプのデバイスであることができる。幾つかの例では、コンピューティングデバイス２０は、外部のデバイス、例えば、サーバ、携帯電話、又はその他のネットワーク化されたコンピューティングデバイス、と無線通信するためにネットワークモジュール３６を利用することができる。
【００５０】
コンピューティングデバイス２０は、ユーザインタフェース４０も含む。ユーザインタフェース４０の例は、トラックボールと、マウスと、キーボードと、その他のタイプの入力デバイスと、を含み、ただしそれらに限定されない。ユーザインタフェース４０は、ディスプレイ４４の一部として組み入れられたタッチ式画面も含むことができる。ディスプレイ４４は、液晶ディスプレイ（ＬＣＤ）、有機発光ダイオード（ＯＬＥＤ）ディスプレイ、プラズマディスプレイ、又は他のタイプの表示装置を備えることができる。
【００５１】
コンピューティングデバイス２０のＧＰＵ４８は、ＧＰＵアプリケーションを実行するための固定された機能の及びプログラミング可能なコンポーネントを有する専用ハードウェアユニットであることができる。ＧＰＵ４８は、ＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、又はその他の同等の集積回路又はディリスクリート論理回路を含むこともできる。ＧＰＵ４８は、その他のコンポーネント、例えば、図２に関してより詳細に説明される専用メモリ、を含むこともできる。さらに、図１では別個のコンポーネントとして示されているが、幾つかの例では、ＧＰＵ４８は、ホストプロセッサ２４の一部として構成することができる。ＧＰＵ４８は、様々なアプリケーションプログラミングインタフェース（ＡＰＩ）に従って処理技法を利用するように構成することができる。例えば、ユーザは、複数のプラットフォーム、オペレーティングシステム、及びハードウェア上で走ることができる標準的なソフトウェアインタフェースを用いてＧＰＵ４８によって実行されるアプリケーションをプログラミングすることができる。幾つかの例では、ＧＰＵ４８は、ＯｐｅｎＣＬ、ＣＵＤＡ、又はＡＰＩの集合であるＤｉｒｅｃｔＸを用いて生成されたアプリケーションを利用するように構成することができる。
【００５２】
幾つかの例により、ＧＰＵ４８は、汎用グラフィックス処理ユニット（ＧＰＧＰＵ）として実装することができる。例えば、ＧＰＳ４８は、伝統的にはホストプロセッサ２４によって実施される様々な汎用のコンピューティング機能を実施することができる。例は、様々な画像処理機能、例えば、映像の復号及び後処理（例えば、デブロッキング、ノイズ低減、色補正、等）及びその他の特定用途向けの画像処理機能（例えば、顔の検出／認識、パターン認識、ウェーブレット変換、等）を含む。幾つかの例では、ＧＰＵ４８は、アプリケーションを実行するためにホストプロセッサ２４と協力することができる。例えば、ホストプロセッサ２４は、ＧＰＵ４８による実行のための命令をＧＰＵに提供することによって幾つかの機能をＧＰＵ４８に委託することができる。
【００５３】
ＧＰＧＰＵとして実装された場合、ＧＰＵ４８及びホストプロセッサ２４は、ここではカーネルと呼ばれる１つ以上のシェーダプログラムを有するアプリケーションを実行することができる。アプリケーションの各カーネルは、特定のタスクを実施するための関数を定義することができ、各カーネルは、同じ入力データで実行することができる。例えば、ＧＰＵ４８及びホストプロセッサ２４は、画像内の特徴を識別するための複数のカーネルを有する画像処理アプリケーション例を実行することができ、及び、これらの複数のカーネルの各々は、特徴を識別するために画像データに基づいて実行することができる。さらに、ＧＰＵ４８は、その他のカーネルの結果に依存するカーネルを含むアプリケーションを実行することができる。該例では、カーネルの結果は、後続するカーネルの命令、例えば、後続するカーネルのワークアイテム及びワークグループ、を“無関係”にすることができる（例えば、アプリケーションの目的を促進させない１つ以上の命令）。
【００５４】
本開示の幾つかの態様により、ＧＰＵ４８は、無関係な命令が実行されるのを防止することによって無関係な命令を実行するのを回避することができる。例えば、無関係な命令が実行されるのを防止するために、ＧＰＵ４８は、それらの命令が実行される前に“カリングする”、すなわち、取り除くことができる。すなわち、ＧＰＵ４８は、無関係なワークアイテム及び／又はワークグループが実行される前にカリングすることができる。上述されるように、用語“ワークアイテム”は、入力データを処理するための関数を定義する１つ以上の個々の命令を含むことができるＧＰＵに関する作業の基本単位を含む。さらに、用語“ワークグループ”は、概して、予め定義された命令のグループ、例えば、予め定義されたワークアイテムのグループ、を意味する。
【００５５】
従って、本開示の技法は、概して、２つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第１のカーネルのワークアイテム及びワークグループを実行した時点で、ＧＰＵ４８は、第２のカーネルのワークアイテム及びワークグループが関係するかどうかを表すカルバッファ値を設定することができる。すなわち、ＧＰＵ４８は、第１のカーネルのワークアイテム及びワークグループの各々の同じ入力データと関連付けられた第２のカーネルの各々のワークアイテム及びワークグループが関係があるかどうかを表す、カルバッファ値を第１のカーネルの結果に基づいて設定することができる。従って、第１のカーネルを実行後は、ＧＰＵ４８は、第２のカーネル内の無関係なワークアイテム及びワークグループが実行されないようにそれらの無関係なワークアイテム及びワークグループをカリングするためにカルバッファ値を利用することができる。
【００５６】
図２は、ＧＰＵ４８をさらに詳細に例示したブロック図であり、命令カリング、例えば、ワークアイテム及びワークグループのカリング、のための技法を実施するように構成することができる。図２に示される例では、ＧＰＵ４８は、ＧＰＵメモリ６４と、カルバッファ７６及びカルモジュール８０を有するシーケンサモジュール７２と、を含む。ＧＰＵ４８は、シェーダプロセッサ８４Ａ乃至８４Ｄ（総称して“ＳＰ”８４）も含む。
【００５７】
図２は、命令カリングのための技法を利用することができるＧＰＵの単なる一例として提供される。無関係な命令を特定及びカリングするための技法は、その他のコンポーネントを有する様々なその他のＧＰＵによって実施することができる。例えば、その他の例では、ＧＰＵ４８は、画像を解析及びレンダリングすることに関連する様々なその他のモジュール、例えば、ラスタライザモジュール、テクスチャユニット、１つ以上のバッファ、又はその他のＧＰＵコンポーネント、を含むこともできる。さらに、ＧＰＵ４８は、図２に示されるコンポーネントよりも多い又は少ないそれらを含むことができる。例えば、図２では、４つのＳＰ８４を含むＧＰＵ４８が示される。しかしながら、その他の例では、ＧＰＵ４８は、図２に示されるよりも多い又は少ないＳＰ８４を含むことができる。
【００５８】
ＧＰＵメモリ６４は、ＧＰＵ４８によって処理される命令を格納するためのＧＰＵ４８内部の専用メモリモジュールであることができる。幾つかの例では、ＧＰＵメモリ６４は、図１に示されるメモリ３２に類似する。例えば、ＧＰＵメモリ６４は、一時的なコンピュータによって読み取り可能な記憶媒体であることができる。ＧＰＵメモリ６４の例は、ランダムアクセスメモリ（ＲＡＭ）と、ダイナミックランダムアクセスメモリ（ＤＲＡＭ）と、スタティックランダムアクセスメモリ（ＳＲＡＭ）と、当業において知られるその他の形態のメモリと、を含む。ＧＰＵ４８が他のプロセッサ、例えば、図１に示されるホストプロセッサ２４、の一部として構成される例では、ＧＰＵメモリ６４は、ＧＰＵ４８以外のコンポーネントによってアクセスすることができる。
【００５９】
ＧＰＵメモリ６４は、ＧＰＵ４８のためのグローバルメモリとして構成することができる。例えば、ＧＰＵメモリ６４は、動作中にＧＰＵ４８内に命令及び情報を格納するように構成することができる（例えば、ＧＰＵ４８による処理のための画像データ及び命令）。ＧＰＵメモリ６４は、ＧＰＵ４８によって処理されているデータの結果を格納するように構成することもできる。
【００６０】
シーケンサモジュール７２は、ＳＰ８４による処理のための命令及びデータを最初に準備することができる。例えば、シーケンサモジュール７２は、ホストプロセッサ、例えば、図１に示されるホストプロセッサ２４、又はＧＰＵメモリ６４から命令及びデータを受け取り、ＳＰ８４によって処理される入力データを準備することができる。幾つかの例では、シーケンサモジュール７２は、ＧＰＵ４８によって実施される機能を定義する命令の１つ以上のカーネルを受け取る。シーケンサモジュール７２は、命令をワークアイテム（例えば、作業の基本単位）として編成し、それらのワークアイテムをグループに分類してワークグループにする。
【００６１】
シーケンサモジュール７２は、ＧＰＵ４８内での命令及びデータの流れを制御するために実装することもできる。例えば、シーケンサモジュール７２は、命令及び関連付けられたデータを実行のためにＳＰ８４にルーティングすることができる。シーケンサモジュール７２は、命令（例えば、ワークアイテム及びワークグループ）及び関連付けられた入力データをＳＰ４８に配分するための機能が固定されたコンポーネント及びプログラミング可能なコンポーネントの組み合わせから成ることができる。本開示の幾つかの態様により、シーケンサモジュール７２は、無関係な命令を特定してそれらの無関係な命令がＧＰＵ４８のＳＰ８４によって処理されるのを防止するためのカルモジュール７６とカルバッファ８０とを含む。すなわち、シーケンサモジュール７２は、無関係なワークアイテム及びワークグループを特定してそれらの無関係なワークアイテム及びワークグループがＧＰＵ４８のＳＰ８４によって処理されるのを防止するためのカルモジュール７６とカルバッファ８０とを含むことができる。
【００６２】
図２に示される例では、ＳＰ７２は、各々、スレッドセットアップモジュール８８Ａ乃至８８Ｄ（総称して、スレッドセットアップモジュール８８）、及び複数の算術論理装置（“ＡＬＵ”）（総称して、ＡＬＵ９２）を含む。ＳＰ７２は、グラフィックスをレンダリングするための幾何、頂点、又はピクセルシェーディング演算を行うことができるという点で、“統合シェーダプロセッサ”と呼ぶことができる。ＳＰ７２は、ＧＰＧＰＵアプリケーションの命令を実行時に汎用計算を行うために使用することもできる。例えば、ＳＰ７２は、シーケンサモジュール７６から命令を受け取ってそれらの命令を実行することができる。
【００６３】
幾つかの例では、ＳＰ８４のスレッドセットアップモジュール８８は、シーケンサモジュール７２から命令を受け取り、ＡＬＵ９２による実行のためのスレッドを生成することを担当する。例えば、スレッドセットアップモジュール８８は、シーケンサモジュール７２から命令（例えば、ワークアイテムのワークグループ）を受け取り、それらの命令を一時的に格納し、ＡＬＵ９２による実行のためのスレッド、すなわち、ワークアイテム、を生成し、それらのスレッドをＡＬＵ９２に配分する。幾つかの態様により、スレッドセットアップモジュール８８は、ＡＬＵ９２が２つ以上のスレッドを並列処理するのを可能にするような形でＡＬＵ９２にスレッドを配分する。ＳＰ８４のＡＬＵ９２を関係があるスレッド（例えば、関係がある命令を有するスレッド）で連続的に占有することによってＧＰＵ４８の性能及び効率を最大にすることができる。
【００６４】
本開示の幾つかの態様により、ＧＰＵ４８は、“無関係な”命令（例えば、アプリケーションの目的を促進させない命令）を特定してそれらの無関係な命令がＳＰ８４によって処理されるのを防止するためにシーケンサモジュール７２を実装することによって効率を向上させることができる。例えば、無関係なワークアイテムが処理されるのを防止するために、シーケンサモジュール７２は、命令をＳＰ８４にルーティングする前に無関係なワークアイテムをカリングする、すなわち、取り除く、ことができる。従って、ＳＰ８４のスレッドセットアップモジュール８８は、無関係なワークアイテムを含むスレッドは生成せず、ＳＰ８４のＡＬＵ９２は、無関係なワークアイテムを実行するために占有されない。
【００６５】
シーケンサモジュール７２は、命令カリングを実施するためのカルバッファ７６及びカルモジュール８０を実装することができる。図２では２つの個別のモジュールとして説明及び表されているが、カルバッファ７６及びカルモジュール８０は、同じコンポーネント内に実装することができる。さらに、幾つかの例により、カルバッファ７６及びカルモジュール８０は、個別のコンポーネントとして実装することができない。むしろ、幾つかの例では、カルバッファ７６及びカルモジュール８０は、ＧＰＵ４８のその他のコンポーネント内に組み入れることができる。例えば、カルバッファ７６は、ＧＰＵメモリ６４の１つのパーティションとして実装することができる。他の例では、カルバッファ７６は、ＧＰＵ４８の外部のメモリであることができる。代替として又はさらに加えて、カルモジュール８０に関して説明される命令カリング技法は、シーケンサモジュール７２又はＳＰ８４内に組み入れることができる。
【００６６】
カルバッファ７６は、実行されたワークアイテムの特徴を表す１つ以上の値を格納することができる。その特徴は、後続するカーネルと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。例えば、ＧＰＵ４８は、２つのカーネルを有するアプリケーションを実行することができる。第１のカーネルを実行した後は、ＧＰＵ４８は、第１のカーネルの結果に基づいて、第２のカーネルのワークアイテムが関係があるかを表す１つ以上の値をカルバッファ８０に格納することができる。
【００６７】
カルバッファ７６は、カルバッファ値を定義する入力を様々なソースから受信することができる。一例では、ＳＰ８４のうちの１つ、例えば、ＳＰ８４Ａ、がワークアイテムを実行した後に、ＳＰ８４Ａは、実行されたワークアイテムの結果に基づいて１つ以上のカルバッファ値をカルバッファ７６に直接書き込むことができる。他の例では、カルバッファ７６は、上述されるように、プログラミング可能な又は固定された機能のハードウェアからカルバッファ値を受け取ることができる。
【００６８】
幾つかの態様により、カルバッファ７６は、ワークグループの特徴を表す１つ以上の値、及びそのワークグループ内の個々のワークアイテムの特徴を表す１つ以上の値を格納するように設計することができる。例えば、カルバッファ７６は、所定のワークグループの全ワークアイテムが前に実行されたカーネルによって無関係になった場合は特定のワークグループの全ワークアイテムが無関係であることを表すワークグループカリング値を格納することができる。代替として又はさらに加えて、カルバッファ７６は、所定のワークグループのワークアイテムの一部のみが前に実行されたカーネルによって無関係になったことを表す１つ以上のワークアイテムカリング値を格納することができる。従って、カルバッファ７６に格納された値は、ワークグループレベル及びワークアイテムレベルの両方での特徴（例えば、命令の関係性）を決定するために使用することができる。
【００６９】
カルバッファ７６は、様々な異なる容量を有することができ、より大きい容量ほど追加の容量を提供する。一例では、カルバッファ７６は、カーネルの各ワークアイテムのための単一の記憶ビットを含むことができる。この例では、単一の記憶ビットは、カーネルの各ワークアイテムの単一の特徴を表すバイナリ値を格納するために使用することができる。ＧＰＵ４８は、前に実行されたワークアイテムの結果に基づいてワークアイテムが関係があるか又は無関係であるかを特定するために単一の特徴を使用することができる。
【００７０】
その他の例では、カルバッファ７６は、カーネルの各ワークアイテムのために２つ以上の記憶ビットを含むことができる。例えば、カーネルの各ワークアイテムの様々な特徴を記述するために２つ以上の値をカルバッファ７６に格納することができる。限定することを意味しない１つの画像処理例では、ＧＰＵ４８は、ピクセルデータの赤緑青（ＲＧＢ）の特徴を決定するためにそのピクセルデータに基づいてワークアイテムを実行することができる。従って、カルバッファ７６は、実行されたワークアイテムの赤、緑、及び青の成分に対応する３つの値を格納するのを可能にするストレージを含むことができる。この例では、ＧＰＵ４８及びカルモジュール８０は、カルバッファ７６に格納された値のうちのいずれかに基づいてワークアイテムをカリングすることができる。カルバッファ７６のコンフィギュレーション（例えば、容量及び能力）は、アプリケーション及びＧＰＵに依存することができることが理解されるべきである。例えば、幾つかのＧＰＵは、相対的に大きい多機能カルバッファのために相対的に大きなメモリ量を提供するように設計することができる。その他のＧＰＵは、該多様性を提供することはできない。従って、提供される例は、実装することができるカルバッファの唯一のコンフィギュレーションではないことが理解されるべきである。
【００７１】
カルモジュール８０は、カルバッファ７６に格納された値にアクセスすること及びカルバッファ７６に格納された値に基づいて無関係な命令をカリングすることを担当することができる。幾つかの例により、カルモジュール８０は、シーケンサモジュール７２が準備をしてＳＰ８４に命令を配分する前にカルバッファ７６に格納された値にアクセスする。図７に関してさらに詳細に説明されるように、カルモジュール８０は、カルバッファ７６に格納された値を読み取り、ワークアイテム及びワークグループの両方のレベルで命令をカリングすることができる。例えば、カルモジュール８０は、カルバッファ７６に格納された値を読み取り、ワークアイテムのワークグループ全体が無関係であることをそれらの値に基づいて決定することができる。カルモジュール８０は、カルバッファ７６に格納された値を読み取り、個々のワークアイテムが無関係であることをそれらの値に基づいて決定することもできる。カルモジュール８０が無関係な命令をカリングした後は、シーケンサモジュール７２は、残りの命令を準備してＳＰ８４に配分することができる。
【００７２】
本開示の態様は、ＧＰＵ４８が同じ入力データを処理する２つ以上のカーネルを有するアプリケーションを実行時に無関係な命令をカリングするためにカルバッファ７６及びカルモジュール８０を利用することに関するものである。一例では、ＧＰＵ４８は、複数のカーネルを定義する命令及びデータをホストプロセッサ、例えば、図１に示されるホストプロセッサ２４、又はその他のコンピューティングユニットから受け取る。カーネルを受け取った時点で、シーケンサモジュール７２は、ＳＰ８４による処理のために第１のカーネルと関連付けられた命令及びデータを最初に準備することができる。例えば、シーケンサモジュール７２は、第１のカーネルの命令を編成してワークアイテム及びワークグループにすることができる。
【００７３】
ワークグループの格子を生成した時点で、シーケンサモジュール７２のカルモジュール８０は、命令カリングを行うべきかどうかを決定するためにカルバッファ７６に問い合わせることができる。幾つかの例により、カルモジュール８０は、命令の第１のカーネルに関しては命令カリングを行わず、その理由は、幾つかの例では、カルバッファ値は、実行された命令の結果に基づいて生成されるためである。従って、カルバッファ７６は、第１のカーネルの実行前は空である。シーケンサモジュール７２は、作業を進めて、第１のカーネルと関連付けられた命令（例えば、ワークグループ及びワークアイテム）をＳＰ８４に配分し、それが命令を実行する。
【００７４】
ＳＰ８４が第１のカーネルの命令を実行した後は、ＳＰ８４は、カルバッファ７６にカルバッファ値をポピュレートするか又はカルバッファ値を用いて更新する。例えば、ＳＰ８４は、第１のカーネルの実行されたワークアイテムの特徴を表す１つ以上の値でカルバッファ７６をポピュレートすることができる。その特徴は、次のカーネルと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。
【００７５】
ＧＰＵは、第２のカーネルを実行することによって継続することができる。例えば、シーケンサモジュール７２は、第２のカーネルと関連付けられたワークグループの１つ以上の格子を編成することによってＳＰ８４による処理のために第２のカーネルと関連付けられた命令及びデータを準備することができる。次に、カルモジュール８０は、カリングのための命令を特定するためにカルバッファ７６に問い合わせる。例えば、カルモジュール８０は、カルバッファ７６に格納された値を読み取り、命令がシーケンサモジュール７２によってＳＰ８４に配分される前にそれらの命令をカリングすべきかどうかを決定する。幾つかの例では、カルモジュール８０は、ワークアイテム及びワークグループの両方に基づいて命令をカリングする。カルモジュール８０が命令カリングを完了した後は、シーケンサモジュール７２は、ＳＰ８４に命令を配分し、それは、命令を実行し、カルバッファ７６の値を更新する。このプロセス例は、ＧＰＵ４８が全カーネルを実行するまで繰り返すことができる。
【００７６】
図２に関して説明される例は、シーケンサモジュール７２がカルバッファ７６及びカルモジュール８０を用いてすべての命令カリング（例えば、ワークアイテムのカリング及びワークグループのカリング）を実施することが対象である。しかしながら、ＧＰＵ４８のその他のモジュールが命令カリングを担当することができ、その他のモジュールがカルバッファ７６と対話できることが理解されるべきである。一例により、シーケンサモジュール７２は、ワークグループのカリングのみを担当することができ、ＳＰ８４のスレッドセットアップモジュール８８がワークアイテムのカリングを担当する。例えば、シーケンサモジュール７２は、上述されるように、カルバッファ７６及びカルモジュール８０を用いてワークグループのカリングを行うことができる。ワークグループのカリングを行った後は、シーケンサモジュール７６は、残りのワークグループ（例えば、カリング後に残っているワークグループ）をＳＰ８４に配分することができる。この例では、スレッドセットアップモジュール８８が、ワークアイテムのカリングを担当することができる。例えば、ワークグループをシーケンサモジュール７２から受け取った後に、スレッドセットアップモジュール８８は、カルバッファ７６を利用してワークアイテムのカリングを行うことができる。幾つかの態様により、スレッドセットアップモジュール８８は、カルバッファ７６を読み取り、カルバッファ７６に格納された１つ以上の値に基づいてワークアイテムをカリングすべきかどうかを決定する。さらに、スレッドセットアップモジュール８８は、カルバッファ７６に格納されたカルバッファ値に基づいてＡＬＵ９２による実行のためのスレッドを編成する前に無関係なワークアイテムを取り除くことができる。
【００７７】
幾つかの態様により、ＧＰＵ４８での命令カリングを可能にするために、ＧＰＵ４８は、命令カリングコマンドを有するアプリケーションを実行する。例えば、ＧＰＵ４８は、命令カリングコマンドを実行し、命令を実行したときに、ＧＰＵ４８は、結果、及び、その結果の特徴を表すカルバッファ７６に格納するための１つ以上の値、の両方を生成する。ＧＰＵ４８は、カルモジュール８０がカルバッファ７６の値を読み取って命令カリングを行うのを可能にする命令カリングコマンドを実行することもできる。
【００７８】
本開示の幾つかの態様は、ユーザ（例えば、コンピュータプログラマ）が命令カリングコマンドを有するアプリケーションを生成するのを可能にする１つ以上のＡＰＩコマンドに関するものである。例えば、ＡＰＩコマンドは、１つ以上のカルバッファ値を生成して指定されたカルバッファ、例えば、カルバッファ７６、に格納するようにＧＰＵ４８に命令するために使用することもできる。ＡＰＩコマンドは、命令を編成してＳＰ８４に配分する前にカルバッファ値を解析すること及びそれらの値に基づいて命令カリングを実施することをＧＰＵ４８に命令することもできる。例えば、ＡＰＩコマンドは、カルバッファ値に基づいて関係がない命令がＧＰＵ４８のＳＰ８４に配分されないようにそれらの命令を廃棄するようにＧＰＵ４８に命令することができる。
【００７９】
図３は、図３ではワークグループ０として表される、ワークグループと関連付けられたワークアイテムの格子を例示したブロック図である。繰り返すと、各ワークアイテムは、ＧＰＵのＳＰ、例えば、ＧＰＵ４８のＳＰ８４のうちの１つ、によって実行することができる個々の命令（例えば、作業の基本単位）に関連することができる。例示のみを目的として、図３に示されるワークアイテムは、図２に示されるＧＰＵ４８例に関して説明される。
【００８０】
ワークアイテム、例えば、図３のワークグループ０内に示されるワークアイテム、は、ＳＰ８４によって実行される前にスレッド（例えば、ＡＬＵによる効率的な実行を提供する構成において編成された１つ以上の命令）にすることができる。例えば、ＳＰ８４のうちの１つ、例えば、ＳＰ８４Ａ、は、ワークグループ０をシーケンサモジュール７２から受け取り、ワークグループ０と関連付けられたワークアイテムを用いてスレッドを生成することによってワークグループ０を実行のために準備することができる。
【００８１】
幾つかの例により、ＳＰ８４の効率は、スレッドになったワークアイテムの関係性によって影響を受けることがある。例えば、ＳＰ８４の効率は、スレッドが無関係のワークアイテムを用いて生成され、及び、ＳＰ８４が無関係のワークアイテムを実行することで占有されている場合に悪影響を受けることがある。幾つかの例では、前に実行された命令の結果に基づいて、マルチカーネルプログラムのワークグループが“スパース（希薄）”（ｓｐａｒｓｅ）になることがある。例えば、“スパースな”ワークグループは、１つ以上の無関係なワークアイテムによって分離された関係のあるワークアイテムを含むことがある。図３に示される例では、ワークグループ０は、前に実行された命令によって幾つかのワークアイテムが無関係になった場合に“スパース”であるとみなすことができる。
【００８２】
本開示の態様は、無関係なワークアイテムを特定し、それらの無関係なワークアイテムがスレッドとして編成される前に取り除くことに関するものである。幾つかの例では、ワークアイテムは、ＳＰ８４に配分される前にカリングすることができる。例えば、カルモジュール８０は、カルバッファ７６に格納された値を利用し、ワークアイテムがＳＰ８４に配分される前にそのワークアイテムをカリングすべきかどうかを決定することができる。幾つかの例では、ＧＰＵ４８は、図４に関して説明されるように、ワークアイテムのカリングを実施する前にワークグループのカリングを実施することができる。
【００８３】
図４は、ＧＰＵ，例えば、図２に示されるＧＰＵ４８、によって実行することができる３つのカーネル（例えば、第１のカーネル１２４、第２のカーネル１２８、及び第３のカーネル１３２）の配列のワークグループの格子を例示したブロック図である。繰り返すと、各カーネル１２４乃至１３２は、所定のアプリケーションに関連する特定の関数を実施するために実行することができる。幾つかの例では、カーネル１２４乃至１３２は、色補正アルゴリズム、顔検出アルゴリズム、顔認識アルゴリズム、拡張現実アプリケーション、様々なアルゴリズムアプリケーション（例えば、ウェーブレット変換、フーリエ変換、等）、又は様々なその他のアプリケーションのための関数を定義することができる。例示のみを目的として、図４は、図２に示されるＧＰＵ４８例に関して説明される。
【００８４】
図４に示されるワークグループの格子は、シーケンサモジュール７２によって生成することができる。例えば、シーケンサモジュール７２は、ホストプロセッサ、例えば、図１に示されるホストプロセッサ２４、又はＧＰＵメモリ６４から命令及びデータを受け取り、それらの命令を編成してワークグループの格子にすることによって実行のための準備をすることができる。幾つかの例では、各々のカーネル１２４乃至１３２のワークグループは、同じ入力データに関する。例えば、カーネル１２４のワークグループ０は、カーネル１２８のワークグループ０、及びカーネル１３２のワークグループ０と同じ入力データと関連付けられた命令を含む。さらに、ＧＰＵ４８は、カーネル１２４乃至１３２を連続して実行することができ、従って、カーネル１２４はカーネル１２８の前に実行され、カーネル１２８はカーネル１３２の前に実行される。
【００８５】
本開示の幾つかの態様により、１つのカーネルの１つ以上のワークグループの結果が、他のカーネルのワークグループを無関係にすることがある。例えば、ＧＰＵ４８は、カーネル１２４のワークグループ０を実行し、カーネル１２４のワークグループ０の結果は、カーネル１２８のワークグループ０と関連付けられた命令を無関係にする。カーネル１２８のワークグループ０は、ワークグループ０と関連付けられた命令がカーネル１２４乃至１３２の基本的目標を促進させない場合に無関係であるとみなすことができる。例えば、画像処理アプリケーションの例では、カーネル１２４乃至１３２の１つの基本的な目標は、画像内の人間の顔を識別することである。
【００８６】
本開示の態様は、無関係なワークグループを実行できるようになる前にカリングする、すなわち、取り除く、ために実装することができる。上述される例では、ＧＰＵ４８は、ワークグループ０をＳＰ８４に配分できるようになる前に無関係なワークグループ０を取り除くことができる。例えば、カルモジュール８０は、ワークグループ０が無関係であると決定し、それをＳＰ８４に配分できるようになる前にワークグループ０をカリングするためにカルバッファ７６に格納された値を利用することができる。
【００８７】
既述のように、１つのアプリケーション専用の実装により、ＧＰＵ４８は、画像、例えば、図５Ａ乃至５Ｃに示される画像、に関して特定のタスクを実施するためにカーネル１２４乃至１３２を実行することができる。
【００８８】
図５Ａ乃至５Ｃは、３つのカーネル（例えば、図５Ａに示されるカーネル１５０、図５Ｂに示されるカーネル１５８、及び図５Ｃに示されるカーネル１６４）を用いて処理中の画像例１４６を示したブロック図である。例えば、カーネル１５０、１５８、及び１６４は、画像１４６と関連付けられた画像データを処理するための命令を各々含む。図５Ａ乃至５Ｃは、例示することのみを目的として、図２に示されるＧＰＵ例４８に関して説明される。
【００８９】
図５Ａ乃至５Ｃに示される例により、画像１４６は、１０２４のピクセルを含む、正方形の、約１６メガバイト（ＭＢ）の画像である。各カーネル１５０、１５８、及び１６４は、画像の特定のピクセルに関連させることができるワークアイテム（例えば、相対的により小さいブロックとして表される）を含む。従って、ＧＰＵ４８がワークアイテムを実行するときには、そのワークアイテムと関連付けられた命令により画像１４６の対応するピクセルを処理（例えば、解析）することができる。
【００９０】
各カーネル１５０、１５８、及び１６４は、画像１４６の特定のピクセルグループに関連する命令を含む（相対的により小さいブロックとして表される）ワークグループも含む。図５Ａ乃至５Ｃに関して説明されるピクセルデータ、ワークアイテム、及びワークグループの間の関係は、可能な命令構造の単なる一例であるにすぎない。その他の例では、ワークアイテムは、画像１４６の２つ以上又は１つ未満のピクセルと関連することができる。
【００９１】
１つの限定しない例により、カーネル１５０、１５８、及び１６４は、画像１４６内の１つ以上の人間の顔を検出するための顔検出アプリケーションの一部として実装される。この例では、カーネル１５０、１５８、及び１６４は、人間の顔と関連付けられた幾つかの予め決定された特性（例えば、色、色調、飽和、輝度、又はその他の特性）を含むピクセルを識別するために実装される。ＧＰＵ４８は、カーネル１５０、１５８、及び１６４内で顔の候補ピクセルとして設定された全判定基準を満たす画像１４６のあらゆるピクセル又はピクセルグループを識別することができる。例えば、ピクセルがカーネル１５０の特徴を含まない場合は、カーネル１５８及びカーネル１６４内のそのピクセルに関連する命令は無関係になる。
【００９２】
図５Ａ乃至５Ｃに関して示されてより詳細に説明されるように、ＧＰＵ４８がカーネル１５０、１５８、及び１６４の各々を実行するのに従い、後続するカーネルと関連付けられた関係がある命令はより“スパース”になる。例えば、各カーネルが実行された後は、ＧＰＵ４８は、顔ピクセルの予め決定された特徴を含まないピクセルをより多く識別するため、後続するカーネルのより多くの命令が無関係になる。本開示の態様により、ＧＰＵ４８は、無関係な命令が実行のためにＳＰ８４に配分される前にそれらの無関係な命令を取り除くために命令カリングを実施することができる。このようにして、ＳＰ８４が無関係な命令を実行するために占有されないため、ＧＰＵ４８の効率が向上される。
【００９３】
図５Ａは、画像１４６を処理するための第１のカーネル１５０を例示したブロック図である。図５Ａに示されるように、第１のカーネルは、ワークグループ１５４Ａ乃至１５４Ｐ（総称して、ワークグループ１５４）を含み、それらは、各々、複数のワークアイテム１５６を含む。ＧＰＵ４８は、ワークグループ１５４Ａ乃至１５４Ｐと関連付けられたすべてのワークアイテム１５６を実行することによって第１のカーネル１５０を実行することができる。例えば、ＧＰＵ４８は、ホストプロセッサ、例えば、図１に示されるホストプロセッサ２４、又は他のコンピューティングユニットから第１のカーネル１５０を受け取ることができる。第１のカーネル１５０を受け取った時点で、シーケンサモジュール７２は、第１のカーネル１５０を編成してワークグループ１５４にすることができる。
【００９４】
次に、シーケンサモジュール７２は、作業進め、すべてのワークグループ１５４及びワークアイテム１５６をＳＰ８４に配分することができる。ＳＰ８４は、ワークグループ１５４及び関連付けられたワークアイテム１５６を実行し、カルバッファ７６に１つ以上のカバレッジ値をポピュレートする。カルバッファ値は、第１のカーネル１５０の実行されたワークアイテムの特徴を表すことができる。その特徴は、次のカーネルと関連付けられた後続命令が関係があるか又は無関係であるかを決定するために使用することができる。例えば、特定のワークアイテムの結果が、カーネル１５０の希望される予め定義された特性、例えば、予め定義された色、色調、飽和、輝度、又はその他の特性、を含まないことを示す場合は、命令を実行するのを担当するＳＰは、そのピクセルと関連付けられたワークアイテムが無関係であることを示す値をカルバッファ７６に格納することができる。同じＳＰがワークグループ全体を実行するのを担当する場合は、ＳＰは、ワークグループ全体と関連付けられたピクセルが無関係であることを示す値をカルバッファ７６に格納することもできる。図５Ｂに示されるように、ＧＰＵ４８がカーネル１５０を実行し、カルバッファ７６にポピュレートした後は、ＧＰＵ４８は、カーネル１５８を実行することに進むことができる。
【００９５】
図５Ｂは、本開示の態様による、第２のカーネル１５８に関する命令カリングを例示したブロック図である。本開示の幾つかの態様により、カリング前に、第２のカーネル１５８は、図５Ａに示されるワークグループ１５４Ａ乃至１５４Ｐに対応するワークグループ１６０Ａ乃至１６０Ｐ（総称してワークグループ１６０）を最初に含んでいる。さらに、カリング前に、ワークグループ１６０の各々は、図５Ａに示されるワークアイテム１５６に対応する、ワークアイテム１６２の完全な組を最初に含む。ワークグループ１６０及びワークアイテム１６２は、図５Ａに示される第１のカーネル１５０と同じ入力データ、すなわち、画像１４６、に基づいて実行することができる。
【００９６】
図５Ｂに示される例では、ＧＰＵ４８は、第２のカーネル１５８からの無関係なワークグループ１６０及びワークアイテム１６２に関する命令カリングを実施する。例えば、第１のカーネル１５０を実行後は、ＧＰＵ４８は、カーネル１５０の予め決定された特性を含まない幾つかのピクセルを識別することができる。それらのピクセルと関連付けられた後続するワークグループ及びワークアイテムは、画像１４６内の顔を検出するのに無関係であるとみなすことができる。ＧＰＵ４８は、無関係のワークグループ及びワークアイテムに関する命令カリングを行うために使用することができる。
【００９７】
本開示の幾つかの態様により、ＧＰＵ４８は、ワークアイテム及びワークグループの両方に基づいてカルバッファ７６及びカルモジュール８０を実装することによって命令をカリングする。例えば、第１のカーネル１５０を実行後は、ＧＰＵ４８は、ワークグループ１５４Ｍ乃至１５４Ｐの位置内のピクセルに関する後続する命令が無関係であると決定することができる。さらに、ＧＰＵ４８は、ワークグループ１５４Ｈ（図５Ａに示される）内の一定のピクセルに関する後続する命令が無関係であると決定することができる。従って、ＧＰＵ４８は、ワークグループ１６０Ｍ乃至１６０Ｐ及び一定のワークアイテム１６２と関連付けられたピクセルデータが無関係であることを示す値をカルバッファ７６に格納する。カーネル１５８を実行した時点で、ＧＰＵ４８は、カルモジュール８０を用いてワークグループ１６０Ｍ乃至１６０Ｐ及び一定のワークアイテム１６２をカリングすることができる。
【００９８】
カルモジュール８０が命令カリングを完了した後は、シーケンサモジュール７２は、残りの命令を編成し、それらの命令をＳＰ８４に配分する。例えば、幾つかの態様により、ＳＰ８４は、命令をＡＬＵ９２に並列して簡単に配分するのを可能にする形で編成される命令を受信するように構成され、ＧＰＵに依存することができる。従って、シーケンサモジュール７２は、配分及び実行プロセスを最適化するために第２のカーネル１５８と関連付けられた命令を再編成することができる。
【００９９】
カリングされた命令の組を受け取り後は、ＳＰ８４がそれらの命令を実行する。さらに、ＳＰ８４は、カルバッファ７６内の値を更新することができる。例えば、特定のワークアイテム１６２の結果が、特定のワークアイテム１６２と関連付けられたピクセルがカーネル１５８の希望される予め定義された特性を含まないことを示す場合は、ワークアイテム１６２を実行するのを担当するＳＰは、そのピクセルと関連付けられた後続するワークアイテムが無関係であることを示す値をカルバッファ７６に格納することができる。同じＳＰがワークグループ全体を実行するのを担当する場合は、ＳＰは、ワークグループ全体と関連付けられたピクセルが無関係であることを示す値をカルバッファ７６に格納することができる。図５Ｃに示されるように、ＧＰＵ４８がカーネル１５８を実行してカルバッファ７６にポピュレートした後は、ＧＰＵ４８は、カーネル１６４を実行するために進むことができる。
【０１００】
図５Ｃは、本開示の態様による、第３のカーネル１６４に関する命令カリングを例示したブロック図である。本開示の幾つかの態様により、カリング前に、第３のカーネル１６４は、図５Ａに示されるワークグループ１５４Ａ乃至１５４Ｐに対応するワークグループ１６６Ａ乃至１６６Ｐ（総称してワークグループ１６６）を最初に含んでいる。さらに、カリング前に、ワークグループ１６６の各々は、図５Ａに示されるワークアイテム１５６に対応する、ワークアイテム１６８の完全な組を最初に含む。ワークグループ１６６及びワークアイテム１６８は、図５Ａに示される第１のカーネル１５０及び図５Ｂに示される第２のカーネル１５０と同じ入力データ、すなわち、画像１４６、に基づいて実行される。
【０１０１】
図５Ｃに示されるように、ＧＰＵ４８は、第３のカーネル１６４を実行する前に命令カリングを実施し、ＧＰＵ４８のＳＰ８４による処理のための命令数をさらに減らすことができる。例えば、第２のカーネル１５８を実行した後は、ＧＰＵ４８は、ワークグループ１５８Ａ、１５８Ｂ、１５８Ｅ、１５８Ｉ、及び１５８Ｍ乃至１５８Ｐの位置内のピクセルデータに関する後続命令は無関係であると決定することができる。さらに、ＧＰＵ４８は、ワークグループ１５８Ｈ（図５Ｂに示される）内の幾つかのピクセルデータに関する後続命令は無関係であると決定することができる。従って、ＧＰＵ４８は、カルバッファ７６内の値を更新し、ワークグループ１６６Ａ、１６６Ｂ、１６６Ｅ、１６６Ｉ、及び１６６Ｍ乃至１６６Ｐ及び幾つかのワークアイテム１６８と関連付けられたピクセルデータが無関係であることを示す。図５Ｂに関して説明されるように、カーネル１６４を実行した時点で、ＧＰＵ４８は、カルモジュール８０を用いてワークグループ１６６Ａ、１６６Ｂ、１６６Ｅ、１６６Ｉ、及び１６６Ｍ乃至１６６Ｐ及び幾つかのワークアイテム１６８をカリングし、残りの命令を実行することができる。
【０１０２】
図５Ａ乃至５Ｃに示される例が示すように、命令カリングは、アプリケーションがその他を無関係にする命令を含むときにＧＰＵにとっての計算数を大幅に減少させることができる。命令をカリングすることは、ＧＰＵが無関係の命令を配分及び実行することにリソースを投入する必要がないため、ＧＰＵの全体的な効率を向上させることができる。
【０１０３】
図５Ａ乃至５Ｃは、概して、ワークアイテム及びワークグループの両方のレベルで命令をカリングするＧＰＵ４８について説明する。しかしながら、その他の例では、ＧＰＵ４８は、ワークアイテムのカリング又はワークグループのカリングを行うことができる。さらに、図５Ａ乃至５Ｃは、カーネルに基づく命令カリングについても説明する。例えば、ＧＰＵ４８は、カーネルの全ワークグループ及び全ワークアイテムを実行後のみに命令をカリングすることができる。しかしながら、その他の例では、ＧＰＵ４８は、その他の間隔で命令カリングを実施することができる。幾つかの態様により、ＧＰＵ４８は、他の前に実行された命令に何らかの形で基づくことができる命令を実行する前の何時でも命令カリングを実施することができる。
【０１０４】
図６は、本開示の態様による、命令をカリングする方法２００を例示したフローチャートである。幾つかの例では、方法２００は、ＧＰＵ、例えば、図２に示されるＧＰＵ４８、によって実施することができる。従って、方法２００は、例示のみを目的として、図２に示されるＧＰＵ例４８によって実施されるとして説明される。
【０１０５】
本開示の態様により、ＧＰＵ４８は、１つ以上の命令を実行後に命令カリングを実施する。ＧＰＵ４８は、最初に、例えば、ホストプロセッサ、例えば、図１に示されるホストプロセッサ２４、から１つ以上の命令を受け取る。例えば、第１のワークアイテムを受け取り後は、ＧＰＵ４８は、その第１のワークアイテムを実行する（２０４）。幾つかの例では、ＧＰＵ４８は、シーケンサモジュール７２を用いてＳＰ８４にワークアイテムを配分することによって第１のワークアイテムを実行することができる。ＳＰ８４は、１つ以上のハードウェアスレッドを構築し、それらのハードウェアスレッドを実行のためにＡＬＵに配分することによってワークアイテムを実行することができる。
【０１０６】
第１のワークアイテムが実行された後は、ＧＰＵ４８は、１つ以上のカリング値を生成する（２０８）。カルバッファ値は、実行されたワークアイテムの特徴を表すことができる。幾つかの例では、その特徴は、第１のワークアイテムと同じ入力データと関連付けられた後続するワークアイテムが関係があるか又は無関係であるかを決定するために使用することができる。繰り返すと、ワークアイテムは、命令が組み込まれているアプリケーションの目標又は目的を促進させない場合に無関係であるとみなすことができる。例えば、画像処理関係、例えば、図５Ａ乃至５Ｃに関して説明される顔検出例、では、ワークアイテムは、画像内の顔を識別する目的を促進させない場合に無関係であるとみなすことができる。
【０１０７】
一例では、カルバッファ値は、後続するワークアイテムが関係があるか又は無関係であるかを表す単一のバイナリ値であることができる。その他の例では、単一のワークアイテムに関して２つ以上のカルバッファ値を格納することができる。例えば、単一のワークアイテムに関して２つ以上のカルバッファ値を格納することができ、各カルバッファ値は、実行されたワークアイテムの異なる特徴に対応する。限定しない画像処理例では、ＧＰＵ４８は、ピクセルデータに基づいてワークアイテムを実行してそのピクセルデータの赤緑青（ＲＧＢ）の特徴を決定することができる。従って、実行されたワークアイテムの赤、緑、及び青の成分に対応する３つのカルバッファ値を格納することができる。この例では、ＧＰＵ４８及びカルモジュール８０は、カルバッファ７６に格納されたいずれかの値に基づいてワークアイテムをカリングすることができる。カルバッファ値を生成後は、ＧＰＵ４８は、１つ以上のカリング値でバッファ、例えば、カルバッファ７６、をポピュレートすることができる（２１２）。
【０１０８】
次に、ＧＰＵ４８は、他のワークアイテムを受け取る（２１６）。幾つかの例では、第２のワークアイテムは、第１のワークアイテムに依存し、第１のワークアイテムと同じ入力データと関連付けられる。例えば、第２のワークアイテムは、第１のワークアイテムの結果がある１つの予め決定された値、又は複数の予め決定された値のうちの１つに従うと評価された場合のみに関係があることができる。第２のワークアイテムを受け取った時点で、ＧＰＵ４８は、第２のワークアイテムと関連付けられたカルバッファ値を解析することができる（２２０）。幾つかの態様により、ＧＰＵ４８は、第２のワークアイテムが同じ入力データに対応し、第１のワークアイテムに依存することをＧＰＵ４８が識別することができるようにカルバッファ値をインデキシングする。従って、ＧＰＵ４８は、カルバッファ値に基づいて第２のワークアイテムを実行すべきかどうかを決定することができる（２２４）。
【０１０９】
幾つかの例により、ＧＰＵ４８は、カルバッファ値に基づいて第２のワークアイテムは関係があると決定した場合に第２のワークアイテムを実行することができる（２２８）。第２のワークアイテムを実行後は、ＧＰＵ４８は、第２のワークアイテムの結果の特徴を表すカリング値を生成することによってプロセスを繰り返すのを開始することができる（ステップ２０８）。代替として、ＧＰＵ４８は、カルバッファ値に基づいて第２のワークアイテムが無関係であると決定した場合は第２のワークアイテムを実行することができず、第２のワークアイテムを廃棄することができる（２３２）。ＧＰＵ４８が第２のワークアイテムを実行しない場合は、ＧＰＵ４８は、次のワークアイテムを受け取ることに直接進むことができる（２１６）。
【０１１０】
図６の方法は、ワークアイテムに基づく命令カリングについて説明する。例えば、ワークアイテムは個々に実行されるとして説明され、カリング値は個々に生成されるとして説明され、以下同様である。しかしながら、実際上は、ＧＰＵは、２つ以上の命令を並列して実行できることが理解されるべきである。従って、２つ以上の値をカルバッファ７６に実質的に同時並行して書き込むことができる。さらに、ＧＰＵは、新しい命令に関連する２つ以上のカルバッファ値を実質的に同時並行して解析することができる。図５Ａ乃至５Ｃに関して説明されるように、幾つかの例では、ＧＰＵ４８は、幾つかの命令を実行後に（例えば、命令のカーネルを実行後に）命令カリングを実施することができ、及び、個々のワークアイテム又はグループ（例えば、ワークグループ）に基づいて命令カリングを実施することができる。
【０１１１】
図７は、本開示の態様による、命令をカリングするために実装することができる命令の流れ２５０を例示したフローチャートである。幾つかの例では、命令の流れ２５０は、ＧＰＵ，例えば、図２に示されるＧＰＵ４８、によって実装することができる。従って、命令の流れ２５０は、例示のみを目的として、図２に示されるＧＰＵ例４８によって実装されるとして説明される。図７は、ワークグループ及びワークアイテムの両方に基づく命令カリングを示す。しかしながら、ＧＰＵ、例えば、ＧＰＵ４８、は、ワークグループのみに基づいて、又はワークアイテムのみに基づいて命令カリングを実施できることが理解されるべきである。
【０１１２】
本開示の態様により、ＧＰＵ４８は、命令を受け取り、それらの命令を編成して１つ以上のワークグループにする（２５４）。幾つかの例では、ＧＰＵ４８は、命令を編成してワークグループの１つ以上の格子、例えば、図４に示されるワークグループの格子、にすることができる。命令が編成されてワークグループになった後は、ＧＰＵ４８は、ワークグループのカリングを実施する（２５８）。例えば、ＧＰＵ４８は、カルバッファ７６に格納された値を解析し、それらの値を現在のワークグループの組に関連づけることによってワークグループのカリングを実施することができる。ＧＰＵ４８は、無関係の命令のみから成るとしてＧＰＵ４８が特定したあらゆるワークグループをカリングすることができる。ワークグループをカリング後は、ＧＰＵ４８は、ワークグループを実行のためにセットアップすることができる（２６２）。例えば、ＧＰＵ４８は、残りのワークグループを再編成し、それらのワークグループをＳＰ８４に配分するのを可能にする構成にすることができる。
【０１１３】
幾つかの例では、ＧＰＵ４８は、ワークアイテムのカリングを実施する（２６６）。ＧＰＵ４８は、ワークグループに基づいてワークアイテムのカリングを実施することができる。例えば、ＧＰＵ４８は、カルバッファ７６に格納された値を解析し、一度に１つのワークグループごとに、それらの値をワークグループのワークアイテムに関連させることができる。ＧＰＵ４８は、ＧＰＵ４８が（例えば、カルバッファ値により）無関係であるとして特定したあらゆるワークアイテムをカリングすることができる。ワークアイテムをカリング後は、ＧＰＵ４８は、ワークグループを実行のためにセットアップすることができる（２７０）。例えば、ＧＰＵ４８は、残りのワークアイテムを再編成し、ワークグループをスレッドとして構築してＳＰ８４によって実行するのを可能にする構成にすることができる。
【０１１４】
次に、ＧＰＵ４８は、１つ以上のワークグループ及び関連付けられたワークアイテムを実行することができる（２７４）。命令を実行後は、ＧＰＵ４８は、後続するワークグループ及びワークアイテムをカリングするために値を更新することができる（２７８）。例えば、ＧＰＵ４８は、実行された命令の結果の特徴を表す値を用いてカルバッファ７６を更新することができる。
【０１１５】
本開示の技法は、概して、２つ以上のカーネルを用いて入力データを処理するためのアプリケーションを実行することを含む。第１のカーネルのワークアイテム及びワークグループを実行した時点で、ＧＰＵは、第２のカーネルのワークアイテム及びワークグループが関係があるかどうかを表すカルバッファ値を設定することができる。すなわち、ＧＰＵは、第１のカーネルの各々のワークアイテム及びワークグループの同じ入力データと関連付けられた第２のカーネルの各々のワークアイテム及びワークグループが関係があるかどうかを表すカルバッファ値を第１のカーネルの結果に基づいて設定することができる。従って、第１のカーネルを実行後は、ＧＰＵ４８は、カルバッファ値を利用し、第２のカーネル内の無関係なワークアイテム及びワークグループが実行されないようにそれらの無関係なワークアイテム及びワークグループをカリングすることができる。
【０１１６】
従って、本開示の態様は、概して、命令カリングに関するものである。上記の図に関して説明される例及び態様は、例として提供されるにすぎないことが理解されるべきである。本開示の態様は、その他の命令カリング実施方法にも関するものである。例えば、命令カリングは、すべてＧＰＵによって実施されるものとして説明される一方で、他の例では、命令は、コンピューティングコンポーネント又はコンピューティングデバイスの組み合わせによって実行することができる。一例では、カルモジュール及びカルバッファ、例えば、図２に示されるカルモジュール８０及びカルバッファ７６、は、ＧＰＵの外部のコンポーネント内に実装することができる。この例では、中央処理装置又はホストプロセッサが、命令をＧＰＵに提供する前にカルバッファにアクセスして命令カリングを実装することができる。
【０１１７】
さらに、本開示の態様は、概して、無関係のワークアイテム及びワークグループが実行される前にそれらをカリングすることに関するものであることが理解されるべきである。上述されるように、用語“ワークアイテム”は、概して、入力データを処理するための機能を定義する１つ以上の命令を意味し、１つ以上の個々の命令を含むことができる。用語“ワークアイテム”は、幾つかのアーキテクチャでは“スレッド”と呼ばれることもある。さらに、用語“ワークグループ”は、概して、予め定義されたワークアイテムのグループを意味する。“ワークグループ”は、幾つかのアーキテクチャでは“スレッドブロック”と呼ばれることもある。
【０１１８】
１つ以上の例では、説明される機能は、ハードウェア、ハードウェアで実行されるソフトウェア、ハードウェアで実行されるファームウェア、又はそれらのあらゆる組み合わせにおいて実装することができる。幾つかの例では、コンピュータによって読み取り可能な媒体に格納された命令は、上述される各々の機能を実施することをハードウェアコンポーネントに行わせることができる。コンピュータによって読み取り可能な媒体は、コンピュータデータ記憶媒体を含むことができる。データ記憶媒体は、本開示において説明される技法の実装のために命令、コード及び／又はデータ構造を取り出すために１つ以上のコンピュータ又は１つ以上のプロセッサによってアクセスすることができるあらゆる利用可能な媒体であることができる。一例として、ただし限定せずに、該コンピュータによって読み取り可能な媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭ又はその他の光学ディスク記憶装置、磁気ディスク記憶装置又はその他の磁気記憶装置、フラッシュメモリ、又は、希望されるプログラムコードを命令又はデータ構造の形態で搬送又は格納するために用いることができ及びコンピュータによってアクセス可能なあらゆるその他の媒体、を備えることができる。上記の組み合わせも、コンピュータによって読み取り可能な媒体の適用範囲内に含められるべきである。
【０１１９】
コードは、１つ以上のプロセッサ、例えば、１つ以上のＤＳＰ、汎用マイクロプロセッサ、ＡＳＩＣ、ＦＰＧＡ、その他の同等の集積回路又はディスクリート論理回路、によって実行することができる。従って、用語“プロセッサ”は、ここで使用される場合は、上記の構造又はここにおいて説明される技法の実装に適したあらゆるその他の構造のうちのいずれかを指すことができる。さらに、幾つかの態様では、ここにおいて説明される機能は、符号化及び復号のために構成される専用のハードウェア及び／又はソフトウェアモジュール内で提供すること、又は結合されたコーデック内に組み入れることができる。さらに、技法は、１つ以上の回路又は論理素子において完全に実装することが可能である。
【０１２０】
本開示の技法は、無線ハンドセット、集積回路（ＩＣ）又はＩＣセット（例えば、チップセット）を含む非常に様々なデバイス又は装置内に実装することができる。本開示では、開示される技法を実施するように構成されたデバイスの機能上の態様を強調するために様々なコンポーネント、モジュール、又はユニットが説明されているが、異なるハードウェアによる実現は必ずしも要求していない。むしろ、上述されるように、様々なユニットを、適切なソフトウェア及び／又はファームウェアと関連させて、上述される１つ以上のプロセッサを含む相互運用的なハードウェアユニットの集合によって結合させることができる。
【０１２１】
本開示の様々な例及び態様が説明されている。これらの及びその他の例及び態様は、以下の請求項の範囲内にある。
以下に、本願出願の当初の特許請求の範囲に記載された発明を付記する。
［Ｃ１］  グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理する方法であって、
前記ＧＰＵのシェーダプロセッサによって第１のワークアイテムを実行することであって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含むことと、
前記第１のワークアイテムの結果に基づいて１つ以上の値を生成することであって、前記１つ以上の値は、前記結果の１つ以上の特徴を表すことと、
前記１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定することであって、前記第２のワークアイテムは、前記入力データを処理するための前記第１のワークアイテムの前記１つ以上の命令と別個である１つ以上の命令を含むことと、を備える、方法。
［Ｃ２］  前記第２のワークアイテムを前記決定に基づいて命令ストリームから取り除くことをさらに備えるＣ１に記載の方法。
［Ｃ３］  前記第２のワークアイテムを前記命令ストリームから取り除くことは、前記第２のワークアイテムが前記シェーダプロセッサによって実行されるようにスケジューリングする前に前記第２のワークアイテムを取り除くことをさらに備えるＣ２に記載の方法。
［Ｃ４］  前記第１のワークアイテムの前記結果に基づく前記１つ以上の値をバッファに格納することをさらに備えるＣ１に記載の方法。
［Ｃ５］  前記第２のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記１つ以上の値を読み取ることをさらに備えるＣ４に記載の方法。
［Ｃ６］  前記ＧＰＵの前記シェーダプロセッサによって第３のワークアイテムを実行することであって、前記第３のワークアイテムは、前記入力データを処理するための１つ以上の命令を含むことと、
前記第３のワークアイテムの結果に基づいて１つ以上の値を生成することであって、前記１つ以上の値は、前記結果の１つ以上の特徴を表すことと、
前記第３のワークアイテムの前記結果に基づいて前記バッファに格納された前記１つ以上の値を更新することと、
前記１つ以上の値に基づいて第４のワークアイテムを実行すべきかどうかを決定することと、をさらに備えるＣ４に記載の方法。
［Ｃ７］  前記１つ以上の値は、前記第２のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第２のワークアイテムの前記結果が関係があるデータを含まない場合は前記第２のワークアイテムを実行しないことを決定するＣ１に記載の方法。
［Ｃ８］  前記第１のワークアイテムは、アプリケーションの第１のカーネルと関連付けられ、前記第２のワークアイテムは、前記アプリケーションの第２のカーネルと関連付けられ、前記第１のワークアイテム及び前記第２のワークアイテムは、前記入力データを処理するように構成されるＣ１に記載の方法。
［Ｃ９］  前記ＧＰＵの前記シェーダプロセッサによって第１のワークグループを実行することであって、前記第１のワークグループは、アプリケーションの第１のカーネルと関連付けられ、前記第１のワークグループは、入力データを処理するための前記第１のワークアイテムを含む複数の命令を備えることと、
前記第１のワークグループの結果に基づいて１つ以上の値を生成することであって、前記１つ以上の値は、前記結果の１つ以上の特徴を表すことと、
前記１つ以上の値に基づいて第２のワークグループを実行すべきかどうかを決定することであって、前記第２のワークグループは、前記アプリケーションの第２のカーネルと関連付けられ、前記第２のワークグループは、前記入力データを処理するための前記第２のワークアイテムを含む複数の命令を備えることと、をさらに備えるＣ１に記載の方法。
［Ｃ１０］  グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置であって、
入力データを処理するための１つ以上の命令を含む第１のワークアイテムを実行し、及び前記第１の命令の結果に基づいて１つ以上の値を生成するように構成されたシェーダプロセッサであって、前記１つ以上の値は、前記結果の１つ以上の特徴を表すシェーダプロセッサと、
前記１つ以上の値に基づいて前記第１のワークアイテムの前記１つ以上の命令と別個である１つ以上の命令を含む第２のワークアイテムを実行すべきかどうかを決定するように構成されたカルモジュールと、を備える、装置。
［Ｃ１１］  前記カルモジュールは、前記決定に基づいて前記第２のワークアイテムを命令ストリームから取り除くようにさらに構成されるＣ１０に記載の装置。
［Ｃ１２］  前記カルモジュールは、前記第２のワークアイテムが前記シェーダプロセッサによって実行されるようにスケジューリングする前に前記第２のワークアイテムを前記命令ストリームから取り除くようにさらに構成されるＣ１１に記載の装置。
［Ｃ１３］  前記第１のワークアイテムの前記結果に基づく前記１つ以上の値を格納するように構成されたカルバッファをさらに備えるＣ１０に記載の装置
［Ｃ１４］  前記カルモジュールは、前記カルバッファに格納された前記１つ以上の値を読み取ることによって前記第２のワークアイテムを実行すべきかどうかを決定するように構成されるＣ１３に記載の装置。
［Ｃ１５］  前記シェーダプロセッサは、第３のワークアイテムを実行し、前記第３のワークアイテムの結果に基づいて１つ以上の値を生成し、及び前記第３のワークアイテムの前記結果に基づいて前記カルバッファに格納された前記１つ以上の値を更新するようにさらに構成され、前記第３のワークアイテムは、前記入力データを処理するための１つ以上の命令を含み、前記１つ以上の値は、前記結果の１つ以上の特徴を表し、前記カルモジュールは、前記１つ以上の値に基づいて第４のワークアイテムを実行すべきかどうかを決定するようにさらに構成されるＣ１３に記載の方法。
［Ｃ１６］  前記１つ以上の値は、前記第２のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記カルモジュールは、前記第２のワークアイテムの前記結果が関係があるデータを含まない場合は前記第２のワークアイテムを実行しないことを決定するように構成されるＣ１０に記載の装置。
［Ｃ１７］  前記第１のワークアイテムは、アプリケーションの第１のカーネルと関連付けられ、前記第２のワークアイテムは、前記アプリケーションの第２のカーネルと関連付けられ、前記第１のワークアイテム及び前記第２のワークアイテムは、前記入力データを処理するように構成されるＣ１０に記載の装置。
［Ｃ１８］  第１のカーネルと関連付けられた第１のワークグループをさらに備え、前記第１のワークグループは、前記第１のワークアイテムと、第２のカーネルと関連付けられた第２のワークグループとを含む複数の命令を備え、前記第２のワークグループは、前記第２のワークアイテムを含む複数の命令を備え、前記シェーダプロセッサは、前記第１のワークグループを実行し及び前記第１のワークグループの結果に基づいて１つ以上の値を生成するようにさらに構成され、前記１つ以上の値は、前記結果の１つ以上の特徴を表し、前記カルモジュールは、前記１つ以上の値に基づいて前記第２のワークグループを実行すべきかどうかを決定するようにさらに構成されるＣ１０に記載の装置。
［Ｃ１９］  前記シェーダプロセッサ及びカルモジュールは、ボータブルなコンピューティングデバイスに含められるＣ１０に記載の装置。
［Ｃ２０］  第１のワークアイテムを実行し、
前記第１のワークアイテムの結果に基づいて１つ以上の値を生成し、及び
前記１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定することをコンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令を用いて符号化されたコンピュータによって読み取り可能な記憶媒体であって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含み、前記１つ以上の値は、前記結果の１つ以上の特徴を表し、前記第２のワークアイテムは、前記入力データを処理するための前記第１のワークアイテムと別個の１つ以上の命令を含む、コンピュータによって読み取り可能な記憶媒体。
［Ｃ２１］  前記決定に基づいて前記第２のワークアイテムを命令ストリームから取り除くことを前記コンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備えるＣ２０に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２２］  前記第２のワークアイテムを前記命令ストリームから取り除くことは、前記第２のワークアイテムが実行されるようにスケジューリングする前に前記第２のワークアイテムを取り除くことをさらに備えるＣ２１に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２３］  前記第１のワークアイテムの前記結果に基づく前記１つ以上の値をバッファに格納することを前記コンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備えるＣ２０に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２４］  前記第２のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記１つ以上の値を読み取ることをさらに備えるＣ２３に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２５］  第３の命令を実行し、
前記第３のワークアイテムの結果に基づいて１つ以上の値を生成し、
前記第３のワークアイテムの前記結果に基づいて前記バッファに格納された前記１つ以上の値を更新し、及び
前記１つ以上の値に基づいて第４のワークアイテムを実行すべきかどうかを決定することを前記コンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備え、前記第３のワークアイテムは、入力データを処理するための１つ以上の命令を含み、前記１つ以上の値は、前記結果の１つ以上の特徴を表すＣ２３に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２６］  前記１つ以上の値は、前記第２のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第２のワークアイテムの前記結果が関係があるデータを含まない場合は前記第２のワークアイテムを実行しないことを決定するＣ２０に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２７］  前記第１のワークアイテムは、アプリケーションの第１のカーネルと関連付けられ、前記第２のワークアイテムは、前記アプリケーションの第２のカーネルと関連付けられ、前記第１のワークアイテム及び前記第２のワークアイテムは、前記入力データを処理するように構成されるＣ２０に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２８］  前記ＧＰＵの前記シェーダプロセッサによって第１のワークグループを実行し、
前記第１のワークグループの結果に基づいて１つ以上の値を生成し、及び
前記１つ以上の値に基づいて第２のワークグループを実行すべきかどうかを決定することを前記コンピューティングデバイスの１つ以上のプログラミング可能なプロセッサに行わせるための命令をさらに備え、前記第１のワークグループは、アプリケーションの第１のカーネルと関連付けられ、前記第１のワークグループは、入力データを処理するための前記第１のワークアイテムを含む複数の命令を備え、前記１つ以上の値は、前記結果の１つ以上の特徴を表し、前記第２のワークグループは、前記アプリケーションの第２のカーネルと関連付けられ、前記第２のワークグループは、前記入力データを処理するための前記第２のワークアイテムを含む複数の命令を備えるＣ２７に記載のコンピュータによって読み取り可能な記憶媒体。
［Ｃ２９］  グラフィックス処理ユニット（ＧＰＵ）を用いてデータを処理するための装置であって、
第１のワークアイテムを実行するための手段であって、前記第１のワークアイテムは、入力データを処理するための１つ以上の命令を含む手段と、
前記第１のワークアイテムの結果に基づいて１つ以上の値を生成するための手段であって、前記１つ以上の値は、前記結果の１つ以上の特徴を表す手段と、
前記１つ以上の値に基づいて第２のワークアイテムを実行すべきかどうかを決定するための手段であって、前記第２のワークアイテムは、前記入力データを処理するための前記第１のワークアイテムと別個の１つ以上の命令を含む手段と、を備える、装置。
［Ｃ３０］  前記決定に基づいて前記第２のワークアイテムを命令ストリームから取り除くための手段をさらに備えるＣ２９に記載の方法。
［Ｃ３１］  前記第２のワークアイテムを前記命令ストリームから取り除くことは、前記第２のワークアイテムが実行されるようにスケジューリングする前に前記第２のワークアイテムを取り除くことをさらに備えるＣ３０に記載の方法。
［Ｃ３２］  前記第１のワークアイテムの前記結果に基づく前記１つ以上の値をバッファに格納するための手段をさらに備えるＣ２９に記載の方法。
［Ｃ３３］  前記第２のワークアイテムを実行すべきかどうかを決定することは、前記バッファに格納された前記１つ以上の値を読み取ることをさらに備えるＣ３２に記載の方法。
［Ｃ３４］  第３のワークアイテムを実行するための手段であって、前記第３のワークアイテムは、前記入力データを処理するための１つ以上の命令を含む手段と、
前記第３のワークアイテムの結果に基づいて１つ以上の値を生成するための手段であって、前記１つ以上の値は、前記結果の１つ以上の特徴を表す手段と、
前記第３のワークアイテムの前記結果に基づいて前記バッファに格納された前記１つ以上の値を更新するための手段と、
前記１つ以上の値に基づいて第４のワークアイテムを実行すべきかどうかを決定するための手段であって、前記第４のワークアイテムは、前記入力データを処理するための１つ以上の命令を含む手段と、をさらに備えるＣ３２に記載の方法。
［Ｃ３５］  前記１つ以上の値は、前記第２のワークアイテムの結果が関係があるデータを含むかどうかを示し、前記第２のワークアイテムの前記結果が関係があるデータを含まない場合は前記第２のワークアイテムを実行しないことを決定するＣ２９に記載の方法。
［Ｃ３６］  前記第１のワークアイテムは、アプリケーションの第１のカーネルと関連付けられ、前記第２のワークアイテムは、前記アプリケーションの第２のカーネルと関連付けられ、前記第１のワークアイテム及び前記第２のワークアイテムは、前記入力データを処理するように構成されるＣ２９に記載の方法。
［Ｃ３７］  前記ＧＰＵの前記シェーダプロセッサによって第１のワークグループを実行するための手段であって、前記第１のワークグループは、アプリケーションの第１のカーネルと関連付けられ、前記第１のワークグループは、入力データを処理するための前記第１のワークアイテムを含む複数の命令を備える手段と、
前記第１のワークグループの結果に基づいて１つ以上の値を生成するための手段であって、前記１つ以上の値は、前記結果の１つ以上の特徴を表す手段と、
前記１つ以上の値に基づいて第２のワークグループを実行すべきかどうかを決定するための手段であって、前記第２のワークグループは、前記アプリケーションの第２のカーネルと関連付けられ、前記第２のワークグループは、前記入力データを処理するための前記第２のワークアイテムを含む複数の命令を備える手段と、をさらに備えるＣ２９に記載の方法。
【図１】
0005778343.tif 000002
【図２】
0005778343.tif 000003
【図３】
0005778343.tif 000004
【図４】
0005778343.tif 000005
【図６】
0005778343.tif 000006
【図７】
0005778343.tif 000007
【図５Ａ】
0005778343.tif 000008
【図５Ｂ】
0005778343.tif 000009
【図５Ｃ】
0005778343.tif 000010