(57)【特許請求の範囲】
【請求項１】
１つ以上のコンピュータによって実行される方法であって、前記方法は、
複数のステンシルプロセッサを有するデバイス上で実行される画像処理アプリケーションプログラムの最終カーネル割り当てを計算することを求める要求を受けるステップを含み、前記画像処理アプリケーションプログラムは、複数のカーネルを含む画像処理パイプラインを定義し、
複数の候補カーネル割り当てを生成するステップを含み、各カーネル割り当ては、前記画像処理パイプラインの各カーネルを、前記複数のステンシルプロセッサのうちの対応する１つのステンシルプロセッサに割り当て、前記複数の候補カーネル割り当てを生成するステップは、
前記画像処理パイプライン内のすべてのカーネルが前記複数のステンシルプロセッサのうちの対応するステンシルプロセッサに割り当てられるまで、前記画像処理パイプライン内のカーネルを、前記画像処理パイプライン内のカーネルがまだ割り当てられていない利用可能なステンシルプロセッサに順次割り当てるステップを含み、前記方法は、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当ての総重みを計算するステップを含み、前記各候補カーネル割り当ての総重みは、データ転送効率の尺度を表し、カーネル間で転送されるデータぞれぞれの転送サイズと、前記複数のステンシルプロセッサを接続するネットワークに沿うそれぞれの転送距離とに基づいており、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当てについて計算した前記総重みに従い、データ転送効率が最高である候補カーネル割り当てを選択するステップと、
前記選択した候補カーネル割り当てに従い、前記複数のカーネルのうちのカーネルを、対応するステンシルプロセッサに割り当てるステップとを含む、方法。
【請求項２】
前記デバイスは複数のラインバッファユニットをさらに含み、
前記方法は、どのラインバッファユニットがどのカーネルをソースするかを判断しどのラインバッファユニットがどのカーネルをシンクするかを判断するステップをさらに含む、請求項１に記載の方法。
【請求項３】
どのラインバッファユニットがどのカーネルをシンクするかを判断するステップは、
特定のステンシルプロセッサに割り当てられた特定の作成カーネルに対し、前記特定のステンシルプロセッサからの転送距離に基づいてソートされたラインバッファユニットのリストを生成するステップと、
前記特定の作成カーネルに、前記特定の作成カーネルが生成したデータをバッファするのに十分なメモリを有する最も近いラインバッファユニットを割り当てるステップとを含む、請求項２に記載の方法。
【請求項４】
前記転送距離は、対応する、前記ネットワーク内のカーネル間のノーダルホップの数に基づく、請求項１に記載の方法。
【請求項５】
前記転送距離は、前記ネットワークのネットワークリングに沿う距離に基づく、請求項１に記載の方法。
【請求項６】
１つ以上のコンピュータによって実行されると前記１つ以上のコンピュータに動作を実行させるコンピュータプログラム命令を備えるコンピュータプログラムであって、前記動作は、
複数のステンシルプロセッサを有するデバイス上で実行される画像処理アプリケーションプログラムの最終カーネル割り当てを計算することを求める要求を受けることを含み、前記画像処理アプリケーションプログラムは、複数のカーネルを含む画像処理パイプラインを定義し、
複数の候補カーネル割り当てを生成することを含み、各カーネル割り当ては、前記画像処理パイプラインの各カーネルを、前記複数のステンシルプロセッサのうちの対応する１つのステンシルプロセッサに割り当て、前記複数の候補カーネル割り当てを生成することは、
前記画像処理パイプライン内のすべてのカーネルが前記複数のステンシルプロセッサのうちの対応するステンシルプロセッサに割り当てられるまで、前記画像処理パイプライン内のカーネルを、前記画像処理パイプライン内のカーネルがまだ割り当てられていない利用可能なステンシルプロセッサに順次割り当てることを含み、前記動作は、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当ての総重みを計算することを含み、前記各候補カーネル割り当ての総重みは、データ転送効率の尺度を表し、カーネル間で転送されるデータぞれぞれの転送サイズと、前記複数のステンシルプロセッサを接続するネットワークに沿うそれぞれの転送距離とに基づいており、前記動作は、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当てについて計算した前記総重みに従い、データ転送効率が最高である候補カーネル割り当てを選択することと、
前記選択した候補カーネル割り当てに従い、前記複数のカーネルのうちのカーネルを、対応するステンシルプロセッサに割り当てることとを含む、コンピュータプログラム。
【請求項７】
前記デバイスは、複数のラインバッファユニットをさらに含み、
どのラインバッファユニットがどのカーネルをソースするかを判断しどのラインバッファユニットがどのカーネルをシンクするかを判断することをさらに含む、請求項６に記載のコンピュータプログラム。
【請求項８】
どのラインバッファユニットがどのカーネルをシンクするかを判断することは、
特定のステンシルプロセッサに割り当てられた特定の作成カーネルに対し、前記特定のステンシルプロセッサからの転送距離に基づいてソートされたラインバッファユニットのリストを生成することと、
前記特定の作成カーネルに、前記特定の作成カーネルが生成したデータをバッファするのに十分なメモリを有する最も近いラインバッファユニットを割り当てることとを含む、請求項７に記載のコンピュータプログラム。
【請求項９】
前記転送距離は、対応する、前記ネットワーク内のカーネル間のノーダルホップの数に基づく、請求項６に記載のコンピュータプログラム。
【請求項１０】
前記転送距離は、前記ネットワークのネットワークリングに沿う距離に基づく、請求項６に記載のコンピュータプログラム。
【請求項１１】
各ステンシルプロセッサは、実行レーンアレイと、二次元シフトレジスタアレイとを含む、請求項６に記載のコンピュータプログラム。
【請求項１２】
コンピューティングシステムであって、
１つ以上のコンピュータと命令を格納する１つ以上の記憶装置とを備え、前記命令は、前記１つ以上のコンピュータによって実行されると前記１つ以上のコンピュータに動作を実行させるように作用し、前記動作は、
複数のステンシルプロセッサを有するデバイス上で実行される画像処理アプリケーションプログラムの最終カーネル割り当てを計算することを求める要求を受けることを含み、前記画像処理アプリケーションプログラムは、複数のカーネルを含む画像処理パイプラインを定義し、
複数の候補カーネル割り当てを生成することを含み、各カーネル割り当ては、前記画像処理パイプラインの各カーネルを、前記複数のステンシルプロセッサのうちの対応する１つのステンシルプロセッサに割り当て、前記複数の候補カーネル割り当てを生成することは、
前記画像処理パイプライン内のすべてのカーネルが前記複数のステンシルプロセッサのうちの対応するステンシルプロセッサに割り当てられるまで、前記画像処理パイプライン内のカーネルを、前記画像処理パイプライン内のカーネルがまだ割り当てられていない利用可能なステンシルプロセッサに順次割り当てることを含み、前記動作は、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当ての総重みを計算することを含み、前記各候補カーネル割り当ての総重みは、データ転送効率の尺度を表し、カーネル間で転送されるデータぞれぞれの転送サイズと、前記複数のステンシルプロセッサを接続するネットワークに沿うそれぞれの転送距離とに基づいており、前記動作は、
前記複数の候補カーネル割り当てのうちの各候補カーネル割り当てについて計算した前記総重みに従い、データ転送効率が最高である候補カーネル割り当てを選択することと、
前記選択した候補カーネル割り当てに従い、前記複数のカーネルのうちのカーネルを、対応するステンシルプロセッサに割り当てることとを含む、コンピューティングシステム。
【請求項１３】
前記デバイスは、複数のラインバッファユニットをさらに含み、
どのラインバッファユニットがどのカーネルをソースするかを判断しどのラインバッファユニットがどのカーネルをシンクするかを判断することをさらに含む、請求項１２に記載のコンピューティングシステム。
【請求項１４】
どのラインバッファユニットがどのカーネルをシンクするかを判断することは、
特定のステンシルプロセッサに割り当てられた特定の作成カーネルに対し、前記特定のステンシルプロセッサからの転送距離に基づいてソートされたラインバッファユニットのリストを生成することと、
前記特定の作成カーネルに、前記特定の作成カーネルが生成したデータをバッファするのに十分なメモリを有する最も近いラインバッファユニットを割り当てることとを含む、請求項１３に記載のコンピューティングシステム。
【請求項１５】
前記転送距離は、対応する、前記ネットワーク内のカーネル間のノーダルホップの数に基づく、請求項１２に記載のコンピューティングシステム。
【請求項１６】
前記転送距離は、前記ネットワークのネットワークリングに沿う距離に基づく、請求項１２に記載のコンピューティングシステム。
【請求項１７】
各ステンシルプロセッサは、実行レーンアレイと、二次元シフトレジスタアレイとを含む、請求項１２に記載のコンピューティングシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の分野
本発明の分野は、概してコンピューティング・サイエンスに関し、より具体的には、マルチコア画像プロセッサ上のアプリケーションソフトウェアの構成に関する。
【背景技術】
【０００２】
背景
画像処理は、典型的には、アレイに編成されたピクセル値の処理を含む。ここで、空間的に編成された二次元アレイは、画像の二次元的性質を捕捉する（追加の次元は、時間（たとえば二次元画像のシーケンス）およびデータタイプ（たとえば色）を含み得る）。典型的なケースでは、アレイ化されたピクセル値は、静止画像または動きの画像を捕捉するためにフレームのシーケンスを生成したカメラによって提供される。伝統的な画像プロセッサは、典型的には、２つの極端な側面のいずれかに分類される。
【０００３】
第１の極端な側面は、汎用プロセッサまたは汎用状プロセッサ（たとえばベクトル命令拡張を備えた汎用プロセッサ）上で実行されるソフトウェアプログラムとして画像処理タスクを実行する。第１の極端な側面は、一般的に非常に汎用性の高いアプリケーションソフトウェア開発プラットフォームを提供するが、関連するオーバヘッド（たとえば、命令フェッチおよびデコード、オンチップおよびオフチップデータの処理、投機的実行）と組み合わされたより精細な粒子のデータ構造の使用は、究極的には、プログラムコードの実行中に、データの単位あたり、より多くのエネルギーが消費される結果となる。
【０００４】
第２の逆の極端な側面は、固定機能のハードワイヤード回路系をはるかに大きなデータブロックに適用する。カスタム設計された回路に直接適用される、（粒度の細かいブロックとは対照的な）より大きなデータブロックの使用は、データ単位あたりの消費電力を大幅に削減する。しかしながら、カスタム設計された固定機能回路系の使用は、一般に、プロセッサが実行することができるタスクのセットが限られる結果となる。このように、（第１の極端な側面に関連する）幅広く汎用性の高いプログラミング環境は第２の極端な側面においては欠けている。
【０００５】
高度に汎用性の高いアプリケーションソフトウェア開発の機会と、データ単位あたりの電力効率の向上とを両立させた技術プラットフォームは、依然として望ましいが欠けている解決策である。
【発明の概要】
【課題を解決するための手段】
【０００６】
概要
ある方法について説明する。この方法は、画像プロセッサ上で実行する複数のカーネルを有するプログラムのカーネル間接続のデータ転送メトリックを計算するステップを含む。画像プロセッサは、複数の処理コアと、複数の処理コアを接続するネットワークとを備える。カーネル間接続は各々、複数の処理コアのうちの１つの処理コア上で実行する作成カーネル（producing kernel）と、複数の処理コアのうちの別の処理コア上で実行する消費カーネル（consuming kernel）とを含む。消費カーネルは、作成カーネルが生成したデータに対して動作する。この方法はまた、計算したデータ転送メトリックに基づいて、複数のカーネルのうちのカーネルを、複数の処理コアのうちの対応する処理コアに割り当てるステップを含む。
【０００７】
したがって、汎用性がより高いアプリケーション処理を、計算およびエネルギー効率が改善された状態で使用することができる。
【０００８】
カーネル間接続は、カーネル間でデータを送るルートであってもよく、データ転送メトリックはたとえば、カーネル間の速度、周波数、インターフェイス（たとえばホップ）の数、および／またはカーネル間で転送されるデータのタイプを説明するものであってもよい。
【０００９】
任意で、画像プロセッサは複数のバッファユニットをさらに備え、バッファユニットは、カーネル間接続のデータを格納および転送する。
【００１０】
任意で、バッファユニットはさらに、カーネル間接続の画像のラインのグループを格納および転送するラインバッファユニットを含む。
【００１１】
任意で、データ転送メトリックを計算するステップはさらに、作成カーネルと消費カーネルとの間の、ネットワーク内のノーダルホップの数に基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００１２】
任意で、データ転送メトリックを計算するステップはさらに、ネットワークを介して作成カーネルと消費カーネルとの間で転送される画像のサイズに基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００１３】
任意で、カーネルを複数の処理コアのうちの対応する処理コアに割り当てるステップはさらに、プログラムの各種構成の重みを計算するステップを含み、プログラムの各構成は、複数の処理コアに対するカーネル割り当ての異なるセットを含み、特定の構成の重みの計算は、特定の構成の特定のカーネル間接続について計算したデータ転送メトリックのサブセットに基づいており、割り当てるステップはさらに、上記構成の中から、最適な重みを有する構成を選択するステップを含む。
【００１４】
他の局面に従い、コンピューティングシステムによって処理されるとこのコンピューティングシステムに方法を実行させるプログラムコードを含む非一時的なマシン読取可能記憶媒体が提供され、この方法は、画像プロセッサ上で実行する複数のカーネルを含むプログラムのカーネル間接続のデータ転送メトリックを計算するステップを含み、画像プロセッサは、複数の処理コアと、複数の処理コアを接続するネットワークとを備え、カーネル間接続は各々、複数の処理コアのうちの１つの処理コア上で実行する作成カーネルと、複数の処理コアのうちの別の処理コア上で実行する消費カーネルとを含み、消費カーネルは、作成カーネルが生成したデータに対して動作し、この方法はさらに、計算したデータ転送メトリックに基づいて、複数のカーネルのうちのカーネルを、複数の処理コアのうちの対応する処理コアに割り当てるステップを含む。
【００１５】
任意で、画像プロセッサは複数のバッファユニットを備え、バッファユニットは、カーネル間接続のデータを格納および転送する。
【００１６】
任意で、バッファユニットはさらに、カーネル間接続の画像のラインのグループを格納および転送するラインバッファユニットを含む。
【００１７】
任意で、データ転送メトリックを計算するステップはさらに、作成カーネルと消費カーネルとの間の、ネットワーク内のノーダルホップの数に基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００１８】
任意で、データ転送メトリックを計算するステップはさらに、ネットワークを介して作成カーネルと消費カーネルとの間で転送される画像のサイズに基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００１９】
任意で、カーネルを複数の処理コアのうちの対応する処理コアに割り当てるステップはさらに、プログラムの各種構成の重みを計算するステップを含み、プログラムの各構成は、複数の処理コアに対するカーネル割り当ての異なるセットを含み、特定の構成の重みの計算は、特定の構成の特定のカーネル間接続について計算したデータ転送メトリックのサブセットに基づいており、割り当てるステップはさらに、構成の中から、最適な重みを有する構成を選択するステップを含む。
【００２０】
任意で、処理コアは、実行レーンアレイと、二次元シフトレジスタアレイとを含む。
さらに他の局面に従い、コンピューティングシステムが提供され、コンピューティングシステムは、複数の汎用処理コアと、システムメモリと、システムメモリと複数の汎用処理コアとの間のメモリコントローラと、コンピューティングシステムによって処理されるとコンピューティングシステムに方法を実行させるプログラムコードを含む非一時的なマシン読取可能記憶媒体とを備え、この方法は、画像プロセッサ上で実行する複数のカーネルを含むプログラムのカーネル間接続のデータ転送メトリックを計算するステップを含み、画像プロセッサは、複数の処理コアと、複数の処理コアを接続するネットワークとを備え、カーネル間接続は各々、複数の処理コアのうちの１つの処理コア上で実行する作成カーネルと、複数の処理コアのうちの別の処理コア上で実行する消費カーネルとを含み、消費カーネルは、作成カーネルが生成したデータに対して動作し、この方法はさらに、計算したデータ転送メトリックに基づいて、複数のカーネルのうちのカーネルを、複数の処理コアのうちの対応する処理コアに割り当てるステップを含む。
【００２１】
任意で、画像プロセッサは複数のバッファユニットを備え、バッファユニットは、カーネル間接続のデータを格納および転送する。
【００２２】
任意で、バッファユニットはさらに、カーネル間接続の画像のラインのグループを格納および転送するラインバッファユニットを含む。
【００２３】
任意で、データ転送メトリックを計算するステップはさらに、作成カーネルと消費カーネルとの間の、ネットワーク内のノーダルホップの数に基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００２４】
任意で、データ転送メトリックを計算するステップはさらに、ネットワークを介して作成カーネルと消費カーネルとの間で転送される画像のサイズに基づいて、重みをカーネル間接続に割り当てるステップを含む。
【００２５】
任意で、カーネルを複数の処理コアのうちの対応する処理コアに割り当てるステップはさらに、プログラムの各種構成の重みを計算するステップを含み、プログラムの各構成は、複数の処理コアに対するカーネル割り当ての異なるセットを含み、特定の構成の重みの計算は、特定の構成の特定のカーネル間接続について計算したデータ転送メトリックのサブセットに基づいており、割り当てるステップはさらに、構成の中から、最適な重みを有する構成を選択するステップを含む。
【００２６】
任意で、処理コアは、実行レーンアレイと、二次元シフトレジスタアレイとを含む。
なお、上記特徴のうちのいずれかの特徴を、本発明のいずれかの特定の局面または実施形態のために使用してもよい。
【００２７】
図面
以下の説明および添付の図面を用いて本発明の実施形態を明らかにする。
【図面の簡単な説明】
【００２８】
【図１】ステンシルプロセッサアーキテクチャのハイレベル図を示す。
【図２】画像プロセッサアーキテクチャのより詳細な図を示す。
【図３】画像プロセッサアーキテクチャのさらに詳細な図を示す。
【図４】画像プロセッサが実行可能なアプリケーションソフトウェアプログラムを示す図である。
【図５】図４のアプリケーションソフトウェアプログラムを画像プロセッサ上で実行するための構成を決定する実施形態を示す図である。
【図６】図４のアプリケーションソフトウェアプログラムを画像プロセッサ上で実行するための構成を決定する実施形態を示す図である。
【図７】アプリケーションソフトウェアプログラムを画像プロセッサ上で実行するための構成を決定する方法を示す図である。
【図８ａ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す図である。
【図８ｂ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す図である。
【図８ｃ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す図である。
【図８ｄ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す図である。
【図８ｅ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す図である。
【図９ａ】ステンシルプロセッサの実施形態を示す図である。
【図９ｂ】ステンシルプロセッサの命令ワードの実施形態を示す図である。
【図１０】ステンシルプロセッサ内のデータ計算ユニットの一実施形態を示す図である。
【図１１ａ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｂ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｃ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｄ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｅ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｆ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｇ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｈ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｉ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｊ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１１ｋ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す図である。
【図１２】統合された実行レーンアレイおよび二次元シフトアレイのための単位セルの実施形態を示す図である。
【図１３】典型的なコンピューティングシステムを示す図である。
【発明を実施するための形態】
【００２９】
詳細な説明
１．０  固有画像プロセッサアーキテクチャ
当該技術において知られているように、プログラムコードを実行するための基本回路構造は、実行段とレジスタ空間とを含む。実行段は命令を実行するための実行ユニットを含む。命令を実行するための入力オペランドが、レジスタ空間から実行段に与えられる。実行段が命令を実行したことによって生成された結果は、レジスタ空間に書き戻される。
【００３０】
従来のプロセッサ上でソフトウェアスレッドを実行するには、実行段を通して一連の命令を順次実行する必要がある。演算は、１つの入力オペランドセットから１つの結果が生成されるという意味において「スカラー」である、というのが最も一般的である。しかしながら、「ベクトル」プロセッサの場合は、実行段が命令を実行すると、入力オペランドのベクトルから、結果のベクトルが生成される。
【００３１】
図１は、二次元シフトレジスタアレイ１０２に結合された実行レーンのアレイ１０１を含む固有画像プロセッサアーキテクチャ１００のハイレベル図を示す。ここで、実行レーンアレイにおける各レーンは、プロセッサ１００がサポートする命令セットを実行するのに必要な実行ユニットを含む離散実行段とみなすことができる。各種実施形態において、各実行レーンは、同一のマシンサイクルにおいて、実行すべき同一の命令を受け、プロセッサは、二次元のシングルインストラクションマルチプルデータ（ＳＩＭＤ）プロセッサとして動作する。
【００３２】
各実行レーンは、二次元シフトレジスタアレイ１０２内の対応する位置において、自身の専用レジスタ空間を有する。たとえば、コーナーの実行レーン１０３は、コーナーシフトレジスタ位置１０４において自身の専用レジスタ空間を有し、コーナーの実行レーン１０５は、コーナーシフトレジスタ位置１０６において自身の専用レジスタ空間を有し、他も同様である。
【００３３】
加えて、シフトレジスタアレイ１０２は、その内容をシフトすることにより、各実行レーンが、自身のレジスタ空間から、前のマシンサイクル中において別の実行レーンのレジスタ空間内にあった値に対して直接動作できるようにすることが可能である。たとえば、水平方向に＋１シフトすると、各実行レーンのレジスタ空間は、その左端に隣接するレジスタ空間から値を受ける。水平方向軸に沿って値を左右両方向にシフトすることが可能でありかつ鉛直方向軸に沿って値を上下両方向にシフトすることが可能であることで、プロセッサは画像データのステンシルを効率良く処理することができる。
【００３４】
ここで、当該技術において知られているように、ステンシルは、基本データ単位として使用される、画像表面領域のスライスである。たとえば、出力画像内の特定の画素位置の新たな値は、この特定の画素位置が中心にある入力画像領域内の画素値の平均として計算することができる。たとえば、ステンシルの寸法が３画素×３画素である場合、この特定の画素位置は３×３画素アレイの中央画素に対応していればよく、平均はこの３×３画素アレイ内の９画素すべてについて計算すればよい。
【００３５】
図１のプロセッサ１００の各種動作の実施形態に従うと、実行レーンアレイ１０１の各実行レーンは、出力画像内の特定の位置の画素値を計算する役割を果たす。したがって、上記３×３ステンシルの平均の例を続けると、入力画素データが最初にロードされ、シフトレジスタ内における８つのシフト動作からなる連系シフトシーケンスの後に、実行レーンアレイ内の各実行レーンは、そのローカルレジスタ空間内に、対応する画素位置に対応する平均を計算するのに必要な９画素値すべてを収容していることになる。すなわち、プロセッサは、たとえばそれぞれが隣り合う出力画像画素位置を中心とする、重なり合う複数のステンシルを、同時に処理することができる。図１のプロセッサアーキテクチャは、特に画像ステンシルの処理に長けているので、ステンシルプロセッサと呼ぶこともできる。
【００３６】
図２は、複数のステンシルプロセッサ２０２＿１〜２０２＿Ｎを有する画像プロセッサのアーキテクチャ２００のある実施形態を示す。図２からわかるように、アーキテクチャ２００は、複数のステンシルプロセッサユニット２０２＿１〜２０２＿Ｎおよび対応するシート生成ユニット２０３＿１〜２０３＿Ｎに、ネットワーク２０４（たとえば、ネットワークオンチップ（ＮＯＣ）（オンチップスイッチネットワーク、オンチップリングネットワークまたはその他の種類のネットワークを含む））を介して相互接続された、複数のラインバッファユニット２０１＿１〜２０１＿Ｍを含む。ある実施形態において、いずれのラインバッファユニット２０１＿１〜２０１＿Ｍも、ネットワーク２０４を介していずれかのシート生成部２０３＿１〜２０３＿Ｎおよび対応するステンシルプロセッサ２０２＿１〜２０２＿Ｎに接続し得る。
【００３７】
プログラムコードがコンパイルされ対応するステンシルプロセッサ２０２にロードされて、ソフトウェア開発者によって以前に定義された画像処理動作を実行する（プログラムコードは、たとえば、設計および実装に応じて、このステンシルプロセッサに関連するシート生成部２０３にロードされてもよい）。したがって、各ステンシルプロセッサ２０２＿１〜２０２＿Ｎは、より一般的に、処理コア、プロセッサコア、コア等として特徴付けることができ、画像プロセッサ全体は、マルチコア画像プロセッサとして特徴付けることができる。少なくともいくつかの例では、画像処理パイプラインを、第１のパイプラインステージ用の第１のカーネルプログラムを第１のステンシルプロセッサ２０２＿１にロードし、第２のパイプラインステージ用の第２のカーネルプログラムを第２のステンシルプロセッサ２０２＿２にロードするなどして、実現することができ、たとえば第１のカーネルはパイプラインの第１ステージの機能を実行し第２のカーネルはパイプラインの第２ステージの機能を実行し、追加の制御フロー方法がインストールされて、出力画像データをパイプラインの１つのステージから次のステージに渡す。
【００３８】
他の構成では、画像プロセッサは、同じカーネルプログラムコードを実行する２つ以上のステンシルプロセッサ２０２＿１，２０２＿２を有する並列マシンとして実現することができる。たとえば、画像データの高密度かつ高データレートのストリームが、各々が同じ機能を実行する複数のステンシルプロセッサにフレームを分散させることによって処理されてもよい。
【００３９】
さらに他の構成では、カーネルの本質的に任意の有向非巡回グラフ（ＤＡＧ）の画像プロセッサへのロードを、それぞれのステンシルプロセッサをそれら自身のプログラムコードのカーネルで構成し、適切な制御フローフックをハードウェアに構成して、出力画像をＤＡＧ設計における１つのカーネルから次のカーネルの入力に向けることによって、行ってもよい。
【００４０】
一般的なフローとして、画像データのフレームは、マクロＩ／Ｏユニット２０５で受信され、フレーム単位でラインバッファユニット２０１のうちの１つ以上に渡される。特定のラインバッファユニットは、その画像データのフレームを、「ライングループ」と呼ばれる画像データのより小さな領域に解析し、次いでライングループをネットワーク２０４を介して特定のシート生成部に渡す。ある完全な（ｆｕｌｌ）単数のライングループを、たとえば、フレームの複数の連続した完全な行または列のデータで構成することができる（簡潔にするために、本明細書では主に連続した行を意味する）。シート生成部は、画像データのライングループを、「シート」と呼ばれる画像データのより小さな領域にさらに解析し、そのシートを対応するステンシルプロセッサに提示する。
【００４１】
単一入力の画像処理パイプラインやＤＡＧフローの場合、一般に、入力フレームは、同じラインバッファユニット２０１＿１に向けられ、それは、画像データをライングループに解析し、ライングループをシート生成部２０３＿１（対応するステンシルプロセッサ２０２＿１はパイプライン／ＤＡＧにおいて第１のカーネルのコードを実行している）に向ける。ステンシルプロセッサ２０２＿１による、それが処理するライングループでの動作が終了した後、シート生成部２０３＿１は、出力ライングループを「下流」ラインバッファユニット２０１＿２に送信する（ある使用例では、出力ライングループは、先に入力ライングループを送信したのと同じラインバッファユニット２０１＿１に送り返すことができる）。
【００４２】
自身のそれぞれの他のシート生成部およびステンシルプロセッサ（たとえば、シート生成部２０３＿２およびステンシルプロセッサ２０２＿２）上で実行されるパイプライン／ＤＡＧにおける次のステージ／動作を表す１つ以上の「消費側（consumer）」カーネルは、下流ラインバッファユニット２０１＿２から、第１のステンシルプロセッサ２０２＿１によって生成された画像データを受信する。このようにして、第１のステンシルプロセッサ上で実行される「作成側（producer）」カーネルは、その出力データが、第２のステンシルプロセッサ上で実行される「消費側」カーネルに転送され、消費側カーネルは、パイプラインまたはＤＡＧ全体の設計と整合する作成側カーネルの後に次のタスクのセットを実行する。
【００４３】
先に図１に関して示唆したように、各ステンシルプロセッサ２０１＿１〜２０２＿Ｎは、画像データの複数の重なり合うステンシルを同時に扱うように設計されている。複数の重なり合うステンシルおよびステンシルプロセッサの内部ハードウェア処理能力は、シートのサイズを効果的に決定する。ここでも、先に述べたように、ステンシルプロセッサ２０２＿１〜２０２＿Ｎのうちのいずれかのステンシルプロセッサ内で、実行レーンのアレイが一斉に動作して、複数の重なり合うステンシルによってカバーされている画像データ表面領域を同時に処理する。
【００４４】
加えて、各種実施形態において、画像データのシートが、ステンシルプロセッサ２０２の二次元シフトレジスタアレイに、このステンシルプロセッサに対応する（たとえばローカル）シート生成部２０３によってロードされる。シートおよび二次元シフトレジスタアレイ構造の使用は、大量のデータを、大量のレジスタ空間に、たとえば、処理タスクが実行レーンアレイによってその直後に直接データ上で実行される単一のロード動作として移動することによって、電力消費の改善を効果的に提供すると考えられている。さらに、実行レーンアレイおよび対応するレジスタアレイの使用は、容易にプログラマブル／設定可能な異なるステンシルサイズを提供する。ラインバッファユニット、シート生成部、およびステンシルプロセッサに関するその他の詳細をさらに以下のセクション３．０において示す。
【００４５】
図３は、図２の画像プロセッサの具体的なハードウェア実装例のより詳細な実施形態を示す。図３からわかるように、図２のネットワーク２０４はリングトポロジー３０４で実現されており、ラインバッファユニット３０１とシート生成部／ステンシルプロセッサコア３０２との間の各交差部に４×４ネットワークノード３１４がある。簡潔にするために、図３は、ラインバッファユニット３０１＿４とシート生成部／ステンシルプロセッサコア３０２＿４との間にあるネットワークノードのみに符号３１４を付している。
【００４６】
ここで、シート生成部／ステンシルプロセッサコア３０２＿１〜３０２＿８は各々、ステンシルプロセッサおよびそれに対応するシート生成部双方を含むものと理解される。簡潔にするために、シート生成部／ステンシルプロセッサコア３０２＿１〜３０２＿８各々を、以下簡単にステンシルプロセッサコアまたはコアと呼ぶ。８つのラインバッファユニット３０１＿１〜３０１＿８および８つのコア３０２＿１〜３０２＿８が図３の特定の実施形態に示されているが、ラインバッファユニットおよび／またはコアの数が異なる各種アーキテクチャも可能であることが理解されるはずである。リングトポロジー以外のネットワークトポロジーも可能である。
【００４７】
図３の画像プロセッサに関して、リングネットワーク３０４は、１）Ｉ／Ｏユニット３０５が入力データを任意のラインバッファユニット３０１＿１〜３０１＿８（または任意のコア３０２＿１〜３０２＿８）に送ることを可能にし、２）任意のラインバッファユニット３０１＿１〜３０１＿８がライングループを任意のコア３０２＿１〜３０２＿８に転送することを可能にし、３）任意のコア３０２＿１〜３０２＿８がその出力データを任意のラインバッファユニット３０１＿１〜３０１＿８に送ることを可能にし、かつ、４）任意のラインバッファユニット３０１＿１〜３０１＿８が画像プロセッサの出力データをＩ／Ｏユニット３０５に送ることを可能にする。このため、豊富な各種ソフトウェアカーネルロードオプションおよび内部ネットワーク構成が可能である。すなわち、理論上は、複数のカーネルからなる任意のソフトウェアアプリケーションをプロセッサの各種コア３０２上で実行するために、任意のカーネルを任意のコアにロードすることができ、任意のラインバッファユニットを、入力／出力データを任意のコアにソースする／からシンクするように構成することができる。
【００４８】
２．０  画像プロセッサ上のアプリケーションソフトウェアの構成
図４は、図３の画像プロセッサにロードすることができる典型的なアプリケーションソフトウェアプログラムまたはその一部を示す。図４からわかるように、プログラムコードは、入力画像データ４０１の１つ以上のフレームを処理することにより、入力画像データ４０１に対して何らかの全変換を実現すると予想することができる。この変換は、アプリケーションソフトウェア開発者によって表現された調整されたシーケンスで入力画像データに対して動作するプログラムコード４０２の１つ以上のカーネルの動作によって実現される。
【００４９】
図４の例において、全変換は、まず各入力画像を第１のカーネルＫ１で処理することによって実現される。次に、カーネルＫ１が生成した出力画像がカーネルＫ２によって処理される。次に、カーネルＫ２が生成した出力画像がそれぞれカーネルＫ３＿１〜Ｋ３＿２によって処理される。次に、カーネルＫ３＿１／Ｋ３＿２が生成した出力画像がカーネルＫ４によって処理される。図３の特定の例において、カーネルＫ３＿１およびＫ３＿２は、たとえば、異なる画像処理動作を実行する異なるカーネルであってもよい（たとえば、カーネルＫ３＿１は第１の特定タイプの入力画像に対して動作し、カーネルＫ３＿２は異なる第２のタイプの入力画像に対して動作する）。
【００５０】
簡潔にするために、４つのカーネルＫ１〜Ｋ４のみを示している。図３の画像プロセッサハードウェアアーキテクチャの実施形態に関して、各カーネルが異なるステンシルプロセッサ上で動作する基本構成においては、おそらく、プロセッサのすべてのコア４０２があるカーネルを実行する前に、４以上のカーネルがカーネルＫ４から流れる可能性があることに注意する（図４の４カーネルフローは、図３のプロセッサのコアの２分の１しか利用していない）。
【００５１】
また、図４は、異なる画像サイズがさまざまなカーネル入力／出力に対応付けられる場合があることを示す。ここで、先に述べたように、画像プロセッサは一連の入力フレーム４０１を受ける。入力フレーム各々のサイズ（たとえば、いずれか１つのフレーム内の画素の総数）は、正規化された単位元のサイズ（１．０）として示されている。カーネルＫ１は、入力フレーム４０１を処理することにより、各々が入力フレームの４倍のサイズを有する出力フレーム４１１を生成する（カーネルＫ１の出力フレームサイズはサイズ４．０として示されている）。画像サイズの増大は、たとえば、カーネルＫ１が入力画像フレーム４０１に対してアップサンプリングを実行にすることによって実現できる。
【００５２】
カーネルＫ２は、カーネルＫ１が生成した（より大きな）出力画像フレーム４１１を処理し、各々が単位元サイズ（１．０）を有するより小さな出力画像フレーム４１２＿１および４１２＿２を生成する。サイズの減少は、たとえば、カーネルＫ２がカーネルＫ１の出力画像４１１に対してダウンサンプリングを実行することによって実現できる。カーネルＫ３−１は、フレーム４１２＿１を処理することにより、正規化サイズ４．０を有するより大きな出力フレームを生成し、カーネルＫ３＿２は、フレーム４１２＿２を処理することにより、正規化サイズ５．０を有するさらに大きな出力フレームを生成する。カーネルＫ４は、カーネルＫ３＿１およびＫ３＿２の出力画像４１３＿１および４１３＿２を処理することにより、単位元サイズ１．０の出力フレームを生成する。
【００５３】
図４の例からわかるように、たとえば、消費カーネルによって処理されるフレームであって、作成カーネルによって生成されたフレームのサイズに応じて、量が異なるデータをカーネル間で送ることができる。ここで、再び図３の典型的なハードウェア実装例を参照すると、これは、大量のデータを互いに送る作成カーネルおよび消費カーネルを、隣り合うまたは少なくとも互いに近接するステンシルプロセッサ上に置いて、全体的なプロセッサ効率を改善することで、大量のデータをリング３０４に沿って長距離にわたって送ることを回避する。
【００５４】
したがって、先に図３について述べたように、プロセッサの実装例３００は、カーネルとコアのさまざまな配置およびこれがサポートできるカーネル間の相互接続という点において、極めて汎用性が高いことから、プロセッサ３００上で実行されるように構成されるアプリケーションソフトウェアプログラムのデータフローを解析して、そのカーネルを特定のコア上に配置しそのラインバッファを特定のカーネル／コアをソース／シンクするように構成して、より大きなサイズのデータフローがネットワーク３０４に沿って経由するホップを少なくすることができ、たとえば、サイズがより小さいデータフローはネットワーク３０４に沿ってより多くのホップを経由することができるようにすることが、適切である。
【００５５】
図５および図６は、アフィニティマッパー（affinity mapper）ソフトウェアプログラムの計算の一部を図示する。これは、アプリケーションソフトウェアプログラムを解析し、その特定のカーネルを特定のコアにマッピングして、プロセッサ内で効率的なデータフローが実現されるようにする。説明し易くするために、図５および図６は、図４のアプリケーションソフトウェアフローの代表的な計算を示す。以下の説明からより明らかになるように、アフィニティマッパーは、アプリケーションソフトウェアプログラムの各カーネルを特定の処理コアにマッピングする、より最適な全体構成を特定するために、可能な各種のカーネル−コア配置の組み合わせを経由する。
【００５６】
これらの計算の一部として、マッパーは、特定の接続が実装された場合にそれが如何に非効率または高負担であるかを示す、各種接続のメトリックを判断する。各種実施形態において、このマッパーは、解析されている各種接続に重みを割り当てる。ネットワークリングに沿って経由するノーダルホップ（nodal hop）がより多いおよび／またはより長い距離にわたる、より大きなデータ転送にはより大きな重みを割り当て、ネットワークリングに沿って経由するノーダルホップがより少ないおよび／またはより短い距離にわたる、より小さなデータ転送には、より小さな重みを割り当てる。その他可能なファクタは、例として、たとえばより遅いまたはより速い転送速度による、接続に沿うより大きなまたはより小さな伝搬遅延を含み得る。
【００５７】
したがって、より一般的には、重みがより大きいことは、内部プロセッサデータ転送効率がより低いことおよび／またはデータ移送の負担がより大きいことに相当する。各種実施形態において、全体の重みが最も小さくなる構成が、最終的にプロセッサの正しい構成として選択される。これに代わる実施形態は、負担がより小さいデータ転送に対してより大きな重みを割り当てて合計の重みが最も大きくなる構成を見出そうとすることを選択できる。説明し易くするために、本明細書の残りの部分では、効率がより低いまたは負担がより大きい接続に対してより大きな重みを割り当てる手法を主に説明する。それとは関係なく、各種実施形態において、完全な構成は、１）どのカーネルがどのコア上で動作するか、２）どのラインバッファがどのカーネルにソース（フィード）するか、および３）どのラインバッファがどのカーネルからシンクする（どのカーネルからの出力データを受ける）かを特定することに相当する。
【００５８】
簡潔にするために、図５および図６の典型的なアフィニティマッピングプロセスは、Ｉ／Ｏユニット３０５と、入力フレームを第１のカーネルＫ１にフィードするラインバッファユニットとの間の接続には対処していない。図５は、図４のＫ１からＫ２へのカーネル接続に関する典型的な一組の計算の概要を示す。ここで、先に述べたように、第１の「作成」カーネル（Ｋ１）は、第１のコア上で動作し、その出力データをラインバッファユニットに転送する。そうすると、ラインバッファユニットは、第１のカーネル（Ｋ１）から受けたこのデータを、第２の「消費」カーネル（Ｋ２）に転送する。
【００５９】
ある実施形態において、含まれる探索空間のサイズを保つとともに、ラインバッファユニットのメモリリソースの割り当てを単純化するために、カーネル間接続を、介在するラインバッファユニットを考慮せずに、マッピングアルゴリズムによってモデル化する。すなわち、実際には作成カーネルから消費カーネルへのデータ転送は本来、介在するラインバッファユニットによって待ち行列に入れられるが、ラインバッファユニットの存在は、まずマッピングアルゴリズムによって無視される。
【００６０】
図５は、カーネルＫ１がその出力データをその消費カーネルＫ２に送る各種構成の重み割り当てを示す。この特定の接続を図５では「Ｋ１−＞Ｋ２」で示す。第１のテーブル５０１（「Ｋ１−＞Ｋ２」で示される）は、カーネルＫ１と消費カーネルＫ２との間の、利用できる／可能な接続のセットを示す。ここで、図３のプロセッサ実装形態をターゲットアーキテクチャとして使用すると、すべての接続が可能である。すなわち、第１の作成カーネルＫ１が、処理コア３０２＿１〜３０２＿８のうちの特定の１つにマッピングされると仮定すると、その対応する消費カーネルＫ２は、残り７つの処理コアのうちのいずか１つに配置することができる。
【００６１】
テーブル５０１に記載されている、「Ｐａｔｈ＿１」および「Ｐａｔｈ＿２」でそれぞれ示された第１および第２の接続は、カーネルＫ１がその出力データをその隣接コアのうちのいずれか１つに送ることに相当する（消費カーネルＫ２が動作する場合）。たとえば、図３を参照して、カーネルＫ１がコア３０２＿２上で動作している場合、Ｐａｔｈ＿１は、カーネルＫ２がコア３０２＿１上で動作していることに相当し、Ｐａｔｈ＿２は、カーネルＫ２がコア３０２＿３上で動作していることに相当する。２つ以上の経路、Ｐａｔｈ＿３およびＰａｔｈ＿４は、カーネルＫ１の出力データが、Ｋ１のコアに隣接するコアの反対側にある処理コアのうちの１つに送られていることに相当する。たとえば、カーネルＫ１がコア３０２＿２上で動作していると再び仮定すると、Ｐａｔｈ＿３はカーネルＫ２がコア３０２＿４上で動作していることに相当し、Ｐａｔｈ＿４はカーネルＫ２がコア３０２＿８上で動作していることに相当する。
【００６２】
ここで、Ｐａｔｈ＿１およびＰａｔｈ＿２各々にノーダルホップ距離１．０が割り当てられていることに注目する。ノーダルホップ距離の１単位は、ネットワークリング３０４に沿う１論理単位長に相当する。すなわち、あるコアから、このコアの真隣のコアのうちのいずれかまでの距離に、ノーダルホップ距離１．０が割り当てられる。Ｐａｔｈ＿１およびＰａｔｈ＿２はいずれも、Ｋ１の出力データをその隣接コアのうちの一方に送るので、これらの経路はいずれも、ノーダルホップ距離１．０が割り当てられる。これに対し、Ｐａｔｈ＿３およびＰａｔｈ＿４は各々、テーブル５０１のノーダルホップ距離２．０を有する。なぜなら、先に述べたように、Ｐａｔｈ＿３およびＰａｔｈ＿４は、カーネルＫ１のデータが、カーネルＫ１が動作するコアから、リングに沿って２つのコア位置分転送されることに相当するからである。
【００６３】
引き続きこの手法の場合、Ｐａｔｈ＿５およびＰａｔｈ＿６は、Ｋ１の出力データを、Ｋ１のコアから３ノーダルホップ分離れたコアのうちのいずれかに転送することに相当する（これらの経路のノーダルホップ距離は３．０）。最後に、Ｐａｔｈ＿７は、ノーダルホップ距離が４．０であり、ネットワークリング上においてＫ１のコアと反対側に位置する（１つの）経路に相当する。たとえば、カーネルＫ１がコア３０２＿２上で動作している例を再び使用すると、Ｐａｔｈ＿８は、カーネルＫ１の出力データがコア３０２＿６に転送されることに相当する。
【００６４】
テーブル５０１に記載されている経路は各々、ノーダルホップ距離の倍数に相当する、対応付けられた重みと、この接続に沿って転送されている画像データのサイズとを有する。Ｋ１からＫ２への接続の場合、図４のアプリケーションソフトウェアプログラムの記述から、画像データのサイズは４．０である。したがって、図４に記載されている特定の経路の各ノーダルホップ距離を４．０で乗算することにより、この経路の総重みを求める。よって、Ｋ１−＞Ｋ２テーブル５０１は、カーネルＫ１から、Ｋ１がそのデータを送ることができる、プロセッサ内の他の各種コアまでの、可能なすべての経路の総重みを示す。
【００６５】
次に、引き続きＫ１−＞Ｋ２接続の可能な各種経路を示すＫ１−＞Ｋ２テーブル５０１を用いると、図５は、これらの経路のうちの１つについてアフィニティマッパーが実行する次のレベルの解析をさらに示す。ここで、Ｋ２−＞Ｋ３＿１テーブル５０２は、Ｋ１−＞Ｋ２テーブル５０１のＰａｔｈ＿１について、Ｋ２−＞Ｋ３＿１接続（Ｋ２の出力データをＫ３＿１カーネルに送る）に使用できる、残りの利用可能な接続を示す。Ｐａｔｈ＿１は、Ｋ１がその出力データをカーネルＫ１を実行しているコアに隣接するコアに転送する構成に相当する、と先に述べたことからわかるように、Ｋ２−＞Ｋ３＿１テーブル５０２は、この特定の構成が機能している場合の、残りの経路の選択肢を示す。
【００６６】
ここで、Ｋ２−＞Ｋ３＿１テーブル５０２において、経路Ｐａｔｈ＿１１が、ノーダルホップが１である唯一の経路であることに注目する。これは、ノーダルホップ１に相当するコアのうちの一方が、既にカーネルＫ１の実行のために消費されているので、カーネルＫ２からのデータを受けるために利用できないことが原因である（この例は、異なるカーネルを異なるコア上で実行することを想定している）。言い換えると、図５のこの特定のＫ２−＞Ｋ３＿１テーブル５０２の目的は、カーネルＫ１を実行しているコアを利用できないことを認識した上で、カーネルＫ３＿１を、利用できるコア上に有効配置することである。
【００６７】
ここで、Ｐａｔｈ＿１１は、カーネルＫ２を実行しているコアの真隣の、利用できる残り１つのコア上に、カーネルＫ３＿１が配置されることに相当する。再びＰａｔｈ＿１の例、すなわち、カーネルＫ１が図３のコア３０２＿２上で実行されカーネルＫ１がその出力データを、コア３０１＿２上で動作するカーネルＫ２に転送する例において、Ｐａｔｈ＿１１は、カーネルＫ２がその出力データを、Ｋ３＿１が動作するコア３０１＿３に送ることに相当する。同様に、Ｐａｔｈ＿１２およびＰａｔｈ＿１３は、Ｋ３＿１が、コアＫ２が動作するコアから２ホップ分離れたコアのうちの一方で動作することに相当する。再び、図５のＰａｔｈ＿１が、たとえば、カーネルＫ１がコア３０２＿１上で動作しカーネルＫ２がコア３０２＿２上で動作することに相当すると認識すると、Ｐａｔｈ＿１２は、カーネルＫ３＿１がコア３０２＿４上で動作することに相当し得るものであり、Ｐａｔｈ＿１３は、カーネルＫ３＿１がコア３０２＿８上で動作することに相当し得るものである。残りの経路Ｐａｔｈ＿１４〜Ｐａｔｈ＿１６は、カーネルＫ３＿１が動作するコアが、ネットワークリング上においてカーネルＫ２が動作するコアからより遠くに移動するときの、対応するノーダルホップを示す。なお、図４において、Ｋ２からＫ３＿１への接続は画像サイズ１．０を維持しており、そのため、テーブル５０１の各経路の総重みは、ノーダルホップ距離に等しい（ノーダルホップ距離を単位元によって因数分解することにより経路の総重量を求める）。
【００６８】
ここで、各固有経路名は、プロセッサを通る固有経路に対応する。Ｋ２−＞Ｋ３＿１テーブル５０２に記載されているすべての経路は、Ｋ１−＞Ｋ２テーブル５０１のＰａｔｈ＿１から始まっているので、Ｋ２−＞Ｋ３＿１テーブル５０２に記載されている各経路は、必然的に、カーネルＫ１がその出力データを、Ｋ２が動作する隣接コアのうちの１つに転送することを含んでいる。したがって、Ｐａｔｈ＿１１は、この接続だけでなく、Ｋ２が動作するコアの真隣の、残っている唯一の利用できるコアへの接続も含み得る。同様に、Ｐａｔｈ＿１２は、Ｋ１からＫ２への１ホップ接続と、Ｋ２のコアから２ホップ分離れたコアのうちの１つへの接続を含むものとして定義することができる（また、Ｐａｔｈ＿１２はこのようなコアのうちの他方への経路として定義される）。なお、どの特定のコアでＫ１が動作するかを明確に定義する必要はない。なぜなら、この構成は、（最後にどのコアで終わることになるとしても）リング上におけるＫ１のコアの位置からのオフセットとして定義できるからである。
【００６９】
図５に示されるＫ２−＞Ｋ３＿１テーブル５０２は、テーブル５０１のＰａｔｈ＿１が有効であるときに利用できる接続のみを示す。各種実施形態において、アフィニティマッパーは、Ｋ１−＞Ｋ２テーブル５０１に示される経路各々について同様の次の解析を実行する。すなわち、Ｋ１−＞Ｋ２テーブル５０１が７つの異なる経路を示すことに注目し、アフィニティマッパーは、Ｋ２−＞Ｋ３＿１テーブル５０２と同様の、７つのテーブルを有効に計算するであろう。しかしながら、これらのテーブルは、比較的多様なノーダルホップおよび重みの値を含むことで、テーブル５０１に反映されている、対応する異なる基本経路をそれぞれ反映するであろう。たとえば、Ｋ２−＞Ｋ３＿１テーブル５０２は、１．０ノーダルホップを１つだけ含んでいるが、その理由は、Ｋ２が動作しているコアに隣接するあるコアは（Ｋ１がそこで動作しているので）、Ｋ２のデータの消費に利用できないからである。しかしながら、Ｋ１−＞Ｋ２テーブル５０１の、Ｐａｔｈ＿１以外の経路のいずれかの経路から生成された、任意の次のテーブルでは、２つの１．０ノーダルホップを利用できるであろう。
【００７０】
図６は、図５のＰａｔｈ＿１１が有効であるときに適用される、アフィニティマッパーが実行するより深い次のレベルの計算の一例を示す。ここで、上述のように、Ｐａｔｈ＿１１は、Ｋ１がその出力データを真隣のコアのうちの１つ（Ｋ２が動作するコア）に転送しＫ２がその出力データを残りの利用できる唯一の隣接コア（Ｋ３＿１が動作するコア）に転送する構成に、対応する。たとえば、Ｋ１が図３のコア３０２＿２上で動作しＫ２がコア３０２＿３上で動作する場合、Ｐａｔｈ＿１１は必然的に、コア３０２＿４上で動作するＫ３＿１を含む。図６のＫ２−＞Ｋ３＿２テーブル６０１として示される、計算の次のレベルは、Ｐａｔｈ＿１１が有効である場合、Ｋ２がそのデータをＫ３＿２による消費のためにどのコアに転送するかを決定する。テーブル６０１を参照して、ノーダルホップが１．０である経路は利用できないことに注目する。ここで、Ｐａｔｈ＿１１の構成において、Ｋ２のコアに隣接するコアはどちらも利用されている（一方はＫ１の実行のため、他方はＫ３＿１の実行のため）。このため、最も近いコアは、２．０ノーダルホップ分離れている。テーブル６０１の総重みも、単位元によって因数分解される。なぜなら、図４によると、カーネルＫ２からカーネルＫ３＿２に送られる画像フレームのサイズも１．０であるからである。
【００７１】
Ｋ３＿１−＞Ｋ４テーブル６０２は、テーブル６０１のＫ２−＞Ｋ３＿２経路のＰａｔｈ＿１１２が有効である場合に可能な経路および対応する総重みを示す。ここで、Ｐａｔｈ＿１１２は、Ｋ１およびＫ３＿１が、Ｋ２のコアの真隣のコア上で動作しＫ３＿２がＫ１の真隣のコアまたはＫ３＿１のコアの真隣のコア上で動作する構成に、対応する。Ｐａｔｈ＿１１２が、Ｋ３＿２がＫ１のコアの次のコア上で動作する構成に対応すると想定すると、Ｋ４が動作するコアは、４つ残っていることになる。これら４つのコアは、Ｋ３＿１のコアから１ホップ分離れているコア、Ｋ３＿１のコアから２ホップ分離れているコア、Ｋ３＿１のコアから３ホップ分離れているコア、および、Ｋ３＿１のコアから４ホップ分離れているコアである。たとえば、Ｋ１がコア３０２＿２上で動作し、Ｋ２がコア３０２＿３上で動作し、Ｋ３＿１がコア３０２＿４上で動作し、Ｋ３＿２がコア３０２＿１上で動作する場合、Ｋ４は、Ｋ３＿１のコア（３０２＿４）からそれぞれ１．０、２．０、３．０、および４．０ノーダルホップ分離れている、コア３０２＿５、３０２＿６、３０２＿７、および３０２＿８のうちのいずれかに置くことができる。テーブル６０４は、これらのオプションを適切な重みで反映する。Ｋ４を置くことで、図４のアプリケーション構造におけるカーネルからコアへのマッピングは終了する。
【００７２】
なお、図５から図６までの各レベルの計算を経ることで、利用できる経路の数は連続的に減少し、連続的に深くなる計算のスレッドによって表される特定の構成に対するコアの現在のコミットメントを反映する。再び、各種実施形態において、アフィニティマッパーは、可能なすべての接続からすべてのレベルを調査／計算する。各種レベルを経由する固有の計算の各スレッドは、特定のコア上の特定のカーネルの異なる構成に対応する。各スレッドは、総重みを、選択された経路からなる特定のセットに沿って蓄積し、結果として、完全なスレッド／構成の最終的な重みが得られる。総重みが最も小さいスレッドを、プロセッサのアプリケーションソフトウェアプログラムの構成として選択する。
【００７３】
各種実施形態において、カーネルからコアへのマッピングが定められた後に、バッファ（待ち行列）がラインバッファユニットに割り当てられる。図２および図３に関して先に述べたように、ラインバッファユニットは、たとえば、作成カーネルから送られた画像データのライングループを受け、これらのライングループを、消費カーネルに転送する前に待ち行列に入れる。ここで、１つの作成側／消費側接続のために待ち行列に入れること（queuing）を、「バッファ」と呼ぶ場合がある。バッファは、対応する待ち行列を実現するために消費する、対応するラインバッファユニットメモリ空間量を有する。ここで、１つのラインバッファユニットを、複数のバッファを実現するように構成することができる。ある実施形態において、ラインバッファユニットは各々、メモリ空間量が限られているので、特定のラインバッファユニットに割り当てられるすべてのバッファの合計サイズは、ラインバッファユニットのメモリリソースの内部に適合するものでなければならない。
【００７４】
ある実施形態において、アプリケーションソフトウェアプログラムにおける各バッファ、およびその対応するメモリ消費フットプリントを定める。次に、バッファごとに、マッピングアルゴリズムは、バッファの作成コアまでの距離を基準として分類されたラインバッファユニットのリストを作成する（ここでは、バッファの作成カーネルのコアに最も近いラインバッファユニットをリストの一番目にし、バッファの作成カーネルのコアから最も遠いラインバッファユニットをリストの最後にする）。次に、このアルゴリズムは、バッファを、このバッファを収容するメモリ空間を有する、リスト上で最もランクが高いラインバッファユニットに、割り当てる。マッピングアルゴリズムは、すべてのバッファが考慮されラインバッファユニットに割り当てられるまで、このプロセスに従い各バッファを順次処理する。
【００７５】
カーネルマッピングおよびバッファ割り当ては、たとえば、より高いレベルのアプリケーションソフトウェアプログラムコードをより低いレベルのオブジェクト（実行可能な）プログラムコードにコンパイルするコンパイラによって実行することができる。コンパイラは、たとえば、可能なすべての内部カーネル構成および接続を表す可能なすべてのスレッドの総重みを計算することで、最も低いスレッド／構成を特定できるようにし、どのバッファがどのラインバッファユニットに割り当てられるかを定める。そうすることにより、コンパイラは、どの特定のラインバッファユニットに、特定のコア上の各作成カーネルがその出力データを送るかを特定し、どのコア上のどの消費カーネルに、各ラインバッファユニットがその待ち行列に入れたデータを転送するかを特定する。この特定は、どのカーネルをどのコア上で実行するか（または少なくともカーネル相互の位置オフセット）を調整することを含む。選択された構成を、たとえば、コンパイルされたアプリケーションソフトウェアに付随するメタデータに記録する。次に、このメタデータを使用して、たとえば、特定の値をカーネルおよび／またはプロセッサの構成レジスタ空間に入力することにより、選択した構成を、アプリケーションソフトウェアプログラムを実行のために画像プロセッサにロードすることの一部として、物理的に有効にする。
【００７６】
上記図５および図６の手法は、データを格納し接続の経路を通して転送するラインバッファユニットの存在を無視するカーネル間接続に重みを割り当てることに向けられているが、その他の実施形態は、さらに細分化して、作成カーネルからラインバッファユニットまでの重みを決定し、ラインバッファユニットから消費カーネルまでの重みを決定するようにしてもよい。しかしながら、このような手法は、図５および図６の手法と比較すると、探索空間を大幅に拡大する。バッファ割り当てをこのような接続に割り当ててもよく、そうすると探索空間のオーバヘッドを増す可能性がある。
【００７７】
図５および図６の説明は、図３の画像プロセッサアーキテクチャを有するハードウェアプラットフォームのためのアプリケーションソフトウェアプログラムを決定することに向けられているが、上記教示はその他代替の各種実施形態に適用できることに注目する。たとえば、図３の画像プロセッサの実装例は、同一数のラインバッファユニットおよびコアを備える。その他の実装形態ではラインバッファユニットおよびコアの数が異なっていてもよい。
【００７８】
またさらに、先に述べたように、ラインバッファユニット３０１は、画像のラインのグループを転送する。代替の実装形態は、必ずしも特にライングループを受けて転送する必要はない。また、図３の画像プロセッサはリングネットワーク３０４を含むが、その他のタイプのネットワークを使用することもできる（たとえば、スイッチドネットワーク、従来のマルチドロップバスなど）。さらに、コアは、二次元実行レーンアレイまたは二次元シフトレジスタアレイを有するシートプロセッサまたはステンシルプロセッサを含む必要はない。
【００７９】
図７は上述の方法を示す。この方法は、画像プロセッサ７０１上で実行する複数のカーネルを有するプログラムのカーネル間接続のデータ転送メトリックを計算することを含む。画像プロセッサは、複数の処理コアと、これら複数の処理コアを接続するネットワークとを含む。カーネル間接続は各々、複数の処理コアのうちの１つの処理コア上で実行する作成カーネルと、複数の処理コアのうちの別の処理コア上で実行する消費カーネルとを含む。消費カーネルは、作成カーネルが生成したデータに対して動作する。この方法はまた、計算したデータ転送メトリックに基づいて、複数のカーネルのうちのカーネルを、上記複数の処理コアのうちの対応する処理コアに割り当てることを含む。
【００８０】
３．０  画像プロセッサ実装の実施形態
図８ａ〜図８ｅから図１２は、本明細書において先に詳細に説明した画像プロセッサおよび関連するステンシルプロセッサの各種実施形態の動作および設計に関するさらに他の詳細を示す。図２のラインバッファユニットがライングループをステンシルプロセッサに関連するシート生成部に与えるという上記説明を再び参照して、図８ａ〜図８ｅは、ラインバッファユニット２０１の解析アクティビティ、およびシート生成部ユニット２０３のより微細な粒子の解析アクティビティ、ならびにシート生成部ユニット２０３に結合されるステンシルプロセッサのステンシル処理アクティビティの両方のハイレベルの実施形態を示す。
【００８１】
図８ａは、画像データ８０１の入力フレームの一実施形態を示す。図８ａはまた、ステンシルプロセッサが動作するように設計された３つの重なり合うステンシル８０２（各々３ピクセル×３ピクセルの寸法を有する）の概要を示す。各ステンシルがそれぞれ出力画像データを生成する出力ピクセルは、ベタ黒で強調表示される。簡潔にするために、３つの重なり合うステンシル８０２は、垂直方向にのみ重なるように示されている。実際には、ステンシルプロセッサは、垂直方向および水平方向の両方に重なるステンシルを有するように設計されてもよいことを認識することが適切である。
【００８２】
図８ａに見られるように、ステンシルプロセッサ内の垂直に重なり合うステンシル８０２のために、フレーム内に単一のステンシルプロセッサが動作することができる画像データの広い帯域が存在する。以下でより詳細に説明するように、一実施形態では、ステンシルプロセッサは、データを、それらの重なり合うステンシル内で、左から右への態様で、画像データにわたって処理する（そして、次のラインのセットに対して、上から下の順序で繰り返す）。このように、ステンシルプロセッサがそれらの動作を前方に進めるにつれて、ベタ黒出力ピクセルブロックの数は、水平方向に右に成長する。上述したように、ラインバッファユニット２０１は、ステンシルプロセッサが今後の拡張された数のサイクルにわたって動作するのに十分な入来フレームからの入力画像データのライングループを解析することを担う。ライングループの例示的な図示は、陰影領域８０３として示されている。一実施形態では、ラインバッファユニット２０１は、ライングループをシート生成部との間で送受信するための異なるダイナミクスを理解することができる。たとえば、「完全なグループ」と呼ばれる１つのモードによれば、画像データの完全な全幅のラインが、ラインバッファユニットとシート生成部との間で渡される。「仮想的に高い」と呼ばれる第２のモードによれば、ライングループは最初に全幅行のサブセットとともに渡される。その後、残りの行は、より小さい（全幅未満の）片で順番に渡される。
【００８３】
入力画像データのライングループ８０３がラインバッファユニットによって画定され、シート生成部ユニットに渡されると、シート生成部ユニットはさらに、ライングループを、ステンシルプロセッサのハードウェア制限に、より正確に適合する、より微細なシートに、解析する。より具体的には、以下でさらに詳細に説明するように、一実施形態では、各ステンシルプロセッサは、二次元シフトレジスタアレイからなる。二次元シフトレジスタアレイは、本質的に、画像データを実行レーンのアレイの「真下」にシフトし、シフトのパターンは、各実行レーンをそれ自身のステンシル内においてデータに対して動作させる（すなわち、各実行レーンは、それ自身の情報のステンシル上で処理して、そのステンシルの出力を生成する）。一実施形態では、シートは、二次元シフトレジスタアレイを「満たす」か、さもなければ二次元シフトレジスタアレイにロードされる入力画像データの表面領域である。
【００８４】
以下でより詳細に説明するように、さまざまな実施形態では、実際には、任意のサイクルでシフト可能な二次元レジスタデータの複数の層が存在する。便宜上、本記載の多くは、「二次元シフトレジスタ」などの用語を、シフト可能な二次元レジスタデータの１つ以上のそのような層を有する構造を指すために単純に使用する。
【００８５】
したがって、図８ｂに見られるように、シート生成部は、ライングループ８０３から最初のシート８０４を解析し、それをステンシルプロセッサに供給する（ここで、データのシートは、参照番号８０４によって全体的に識別される陰影領域に対応する）。図８ｃおよび図８ｄに示すように、ステンシルプロセッサは、重なるステンシル８０２をシート上で左から右へ効果的に移動させることによって、入力画像データのシートに対して動作する。図８ｄのように、シート内のデータから出力値を計算することができるピクセル数が使い果たされる（他のピクセル位置は、シート内の情報から決定される出力値を有することができない）。簡単にするために、画像の境界領域は無視されている。
【００８６】
図８ｅにおいて見られるように、シート生成部は次いで、ステンシルプロセッサが動作を継続する次のシート８０５を提供する。ステンシルが次のシートに対して動作を開始するときのステンシルの初期位置は、（先に図８ｄに示されている）最初のシート上の消耗点から右への次の進行であることに留意されたい。新たなシート８０５で、ステンシルプロセッサが最初のシートの処理と同じ態様で新たなシートに対して動作するにつれ、ステンシルは単に右に移動し続ける。
【００８７】
出力ピクセル位置を取り囲むステンシルの境界領域のために、第１のシート８０４のデータと第２のシート８０５のデータとの間にいくらかの重なりがあることに留意されたい。重なりは、シート生成部が重なり合うデータを２回再送信することによって簡単に処理することができる。別の実現例では、次のシートをステンシルプロセッサに供給するために、シート生成部は、ステンシルプロセッサに新たなデータを送るだけに進んでもよく、ステンシルプロセッサは、前のシートからの重なり合うデータを再利用する。
【００８８】
図９は、ステンシルプロセッサユニットアーキテクチャ９００の実施形態を示す。図９において見られるように、ステンシルプロセッサは、データ計算ユニット９０１、スカラープロセッサ９０２および関連するメモリ９０３およびＩ／Ｏユニット９０４を含む。データ計算ユニット９０１は、実行レーンのアレイ９０５、二次元シフトアレイ構造９０６、およびアレイの特定の行または列に関連する別個のランダムアクセスメモリ９０７を含む。
【００８９】
Ｉ／Ｏユニット９０４は、シート生成部から受け取ったデータの「入力」シートをデータ計算ユニット９０１にロードし、ステンシルプロセッサからのデータの「出力」シートをシート生成部に格納する役割を果たす。一実施形態では、データ計算ユニット９０１へのシートデータのロードは、受け取ったシートを画像データの行／列に解析し、画像データの行／列を二次元シフトレジスタ構造９０６または実行レーンアレイの行／列のそれぞれのランダムアクセスメモリ９０７にロードすることを必要とする（以下でより詳細に説明する）。シートが最初にメモリ９０７にロードされる場合、実行レーンアレイ９０５内の個々の実行レーンは、適宜、ランダムアクセスメモリ９０７からシートデータを二次元シフトレジスタ構造９０６にロードすることができる（たとえば、シートのデータ上での動作のすぐ前のロード命令として）。データのシートのレジスタ構造９０６へのロード（シート生成部からの直接的であろうとまたはメモリ９０７からであろうと）が完了すると、実行レーンアレイ９０５の実行レーンはデータに対して動作し、最終的に、完成したデータをシートとしてシート生成部に、またはランダムアクセスメモリ９０７に「書き戻す」。Ｉ／Ｏユニット９０４は後にランダムアクセスメモリ９０７からデータをフェッチして出力シートを形成し、出力シートはシート生成部に転送される。
【００９０】
スカラープロセッサ９０２は、スカラーメモリ９０３からステンシルプロセッサのプログラムコードの命令を読み出し、実行レーンアレイ９０５の実行レーンに命令を発行するプログラムコントローラ９０９を含む。一実施形態では、データ計算ユニット９０１からＳＩＭＤのような動作を実行するために、単一の同じ命令がアレイ９０５内のすべての実行レーンにブロードキャストされる。一実施形態では、スカラーメモリ９０３から読み出され、実行レーンアレイ９０５の実行レーンに発行される命令の命令フォーマットは、命令当たり２つ以上のオペコードを含む非常に長い命令語（ＶＬＩＷ）タイプのフォーマットを含む。さらなる実施形態では、ＶＬＩＷフォーマットは、（以下に説明するように、一実施形態では２つ以上の従来のＡＬＵ動作を指定することができる）各実行レーンのＡＬＵによって実行される数学的機能を指示するＡＬＵオペコードと、（特定の実行レーンまたは実行レーンのセットに対してメモリ操作を指示する）メモリオペコードとの両方を含む。
【００９１】
「実行レーン」という用語は、命令を実行することができる１つ以上の実行ユニットのセット（たとえば、命令を実行することができる論理回路系）を指す。実行レーンは、しかしながら、さまざまな実施形態では、単なる実行ユニットを超えた、よりプロセッサに似た機能を含むことができる。たとえば、１つ以上の実行ユニットに加えて、実行レーンは、受信された命令をデコードする論理回路系、または、よりＭＩＭＤのような設計の場合、命令をフェッチおよびデコードする論理回路系も含むことができる。ＭＩＭＤのようなアプローチに関しては、ここでは集中プログラム制御アプローチが主に記載されているが、より分散型のアプローチがさまざまな代替実施形態（たとえば、アレイ９０５の各実行レーン内のプログラムコードおよびプログラムコントローラを含む）において実施されてもよい。
【００９２】
実行レーンアレイ９０５、プログラムコントローラ９０９および二次元シフトレジスタ構造９０６の組み合わせは、広範囲のプログラマブルな機能のための幅広く適応可能／設定可能なハードウェアプラットフォームを提供する。たとえば、アプリケーションソフトウェア開発者は、個々の実行レーンが多種多様な機能を実行することができ、任意の出力アレイ位置に近接した入力画像データに容易にアクセスすることができれば、寸法（たとえばステンシルサイズ）だけでなく幅広い異なる機能能力を有するカーネルをプログラミングすることができる。
【００９３】
実行レーンアレイ９０５によって操作される画像データのためのデータ記憶装置として機能することとは別に、ランダムアクセスメモリ９０７は、１つ以上のルックアップテーブルを保持することもできる。さまざまな実施形態では、１つ以上のスカラールックアップテーブルをスカラーメモリ９０３内でインスタンス化することもできる。
【００９４】
スカラールックアップは、同じルックアップテーブルからの同じインデックスからの同じデータ値を実行レーンアレイ９０５内の各実行レーンに渡すことを含む。さまざまな実施形態では、上述のＶＬＩＷ命令フォーマットは、スカラープロセッサによって実行されるルックアップ動作をスカラールックアップテーブルに向けるスカラーオペコードを含むようにも拡張される。オペコードとともに使用するために指定されたインデックスは、即値オペランドでもよいし、他のデータ記憶位置からフェッチされてもよい。いずれにせよ、一実施形態では、スカラーメモリ内のスカラールックアップテーブルからのルックアップは、基本的に同じクロックサイクル中に実行レーンアレイ９０５内のすべての実行レーンに同じデータ値をブロードキャストすることを含む。ルックアップテーブルの使用および動作に関する追加の詳細は、以下でさらに説明する。
【００９５】
図９ｂは、上述のＶＬＩＷ命令ワードの実施形態を要約したものである。図９ｂにおいて見られるように、ＶＬＩＷ命令ワードフォーマットは、３つの別個の命令、すなわち、１）スカラープロセッサによって実行されるスカラー命令９５１、２）実行レーンアレイ内でそれぞれのＡＬＵによってＳＩＭＤ方式でブロードキャストされ実行されるＡＬＵ命令９５２、および３）部分的ＳＩＭＤ方式でブロードキャストされ実行されるメモリ命令９５３に対するフィールドを含む（たとえば、実行レーンアレイ内において同じ行に沿った実行レーンが同じランダムアクセスメモリを共有する場合、異なる行の各々からの１つの実行レーンが実際に命令を実行する（メモリ命令９５３のフォーマットは、各行からのどの実行レーンが命令を実行するかを識別するオペランドを含むことができる）。
【００９６】
１つ以上の即値オペランドに対するフィールド９５４も含まれる。命令９５１，９５２，９５３のどれが、どの即値オペランド情報を用いるかは命令フォーマットで識別されてもよい。命令９５１，９５２，９５３の各々は、また、それら自身のそれぞれの入力オペランドおよび結果情報（たとえば、ＡＬＵ演算用のローカルレジスタならびにメモリアクセス命令用のローカルレジスタおよびメモリアドレス）を含む。一実施形態では、スカラー命令９５１は、実行レーンアレイ内の実行レーンが他の２つの命令９５２，９５３のいずれかを実行する前にスカラープロセッサによって実行される。すなわち、ＶＬＩＷワードの実行は、スカラー命令９５１が実行される第１のサイクルと、続いて他の命令９５２，９５３が実行されてもよい第２のサイクルとを含む。（さまざまな実施形態では、命令９５２，９５３は並列して実行されてもよい）。
【００９７】
一実施形態では、スカラープロセッサによって実行されるスカラー命令は、シートをデータ計算ユニットのメモリもしくは２Ｄシフトレジスタからロードまたはそれに格納するようシート生成部に発行されるコマンドを含む。ここで、シート生成部の動作は、ラインバッファユニットの動作またはスカラープロセッサによって発行されたコマンドをシート生成部が完了するのに要するサイクル数のプレランタイムの理解を妨げる他の変数に依存し得る。したがって、一実施形態では、スカラー命令９５１がシート生成部に発行されるべきコマンドに対応するか、さもなければコマンドをシート生成部に発行させるＶＬＩＷワードは、他の２つの命令フィールド９５２，９５３に無操作（ＮＯＯＰ）命令も含む。次に、プログラムコードは、シート生成部がデータ計算ユニットに対するそのロードまたはデータ計算ユニットからのその格納を完了するまで、命令フィールド９５２，９５３についてＮＯＯＰ命令のループに入る。ここで、シート生成部にコマンドを発行すると、スカラープロセッサは、シート生成部がコマンドの完了時にリセットするインターロックレジスタのビットをセットしてもよい。ＮＯＯＰループの間、スカラープロセッサはインターロックビットのビットを監視する。スカラープロセッサが、シート生成部がそのコマンドを完了したことを検出すると、通常の実行が再び開始される。
【００９８】
図１０は、データ計算コンポーネント１００１の一実施形態を示す。図１０において見られるように、データ計算コンポーネント１００１は、二次元シフトレジスタアレイ構造１００６「の上に」論理的に位置決めされる実行レーンのアレイ１００５を含む。上述したように、さまざまな実施形態では、シート生成部によって提供される画像データのシートが二次元シフトレジスタ１００６にロードされる。実行レーンは、レジスタ構造１００６からのシートデータに対して動作する。
【００９９】
実行レーンアレイ１００５およびシフトレジスタ構造１００６は、互いに対して適所に固定される。しかし、シフトレジスタアレイ１００６内のデータは、戦略的かつ調整された態様でシフトして、実行レーンアレイ内の各実行レーンがデータ内で異なるステンシルを処理するようにする。したがって、各実行レーンは、生成されている出力シートにおいて異なるピクセルに対する出力画像値を決定する。図１０のアーキテクチャから、実行レーンアレイ１００５が垂直に近接する実行レーンおよび水平に近接する実行レーンを含むので、重なり合うステンシルが垂直に配置されるだけでなく水平にも配置されることは明らかである。
【０１００】
データ計算ユニット１００１のいくつかの注目すべきアーキテクチャ上の特徴には、実行レーンアレイ１００５よりも広い寸法を有するシフトレジスタ構造１００６が含まれる。すなわち、実行レーンアレイ１００５の外側にレジスタ１００９の「ハロー」が存在する。ハロー１００９は、実行レーンアレイの２つの側に存在するように示されているが、実現例に応じて、実行レーンアレイ１００５の２つ未満（１つ）またはそれ以上（３つまたは４つ）の側に存在してもよい。ハロー１００５は、データが実行レーン１００５の「下に」シフトしているときに、実行レーンアレイ１００５の境界の外側にこぼれ出るデータのための「スピルオーバ」空間を提供する働きをする。単純なケースとして、実行レーンアレイ１００５の右端を中心とする５×５のステンシルは、ステンシルの最も左側のピクセルが処理されるとき、さらに右側に４つのハローレジスタ位置を必要とすることになる。図面を簡単にするために、図１０は、名目上の実施形態において、どちらの側（右、底）のレジスタでも水平方向接続および垂直方向接続の両方を有するであろうとき、ハローの右側のレジスタを、水平方向シフト接続を有するだけとして、およびハローの底側のレジスタを、垂直方向シフト接続を有するだけとして示す。各種実施形態において、ハロー領域は、画像処理命令を実行するための対応する実行レーンを含まない（たとえば、ＡＬＵは存在しない）。しかしながら、個々のメモリアクセスユニット（Ｍ）は、各ハロー領域位置に存在し、よって、個々のハローレジスタ位置は、個々にデータをメモリからロードしデータをメモリに格納することができる。
【０１０１】
アレイの各行および／もしくは各列またはその一部分に結合されるランダムアクセスメモリ１００７によって追加のスピルオーバールームが提供される（たとえば、ランダムアクセスメモリは、４つの実行レーン行状と２つの実行レーン列状にまたがる実行レーンアレイの「領域」に割り当てられてもよい。簡略化のために、アプリケーションの残りの部分は、主に、行および／または列に基づく割り当てスキームを指す）。ここで、実行レーンのカーネル動作が、それが（一部の画像処理ルーチンが必要とする場合がある）二次元シフトレジスタアレイ１００６の外にあるピクセル値を処理することを必要とする場合、画像データの面は、たとえばハロー領域１００９からランダムアクセスメモリ１００７にさらにこぼれ出ることができる。たとえば、ハードウェアが実行レーンアレイの右端の実行レーンの右側にわずか４つの記憶素子のハロー領域を含む場合の６×６ステンシルを考える。この場合、ステンシルを完全に処理するために、データをハロー１００９の右端からさらに右側にシフトする必要があるであろう。ハロー領域１００９の外側にシフトされたデータは、ランダムアクセスメモリ１００７にこぼれ出る。ランダムアクセスメモリ１００７および図９のステンシルプロセッサの他の適用例を以下でさらに説明する。
【０１０２】
図１１ａ〜図１１ｋは、上述のように実行レーンアレイ「の下で」二次元シフトレジスタアレイ内で画像データがシフトされる態様の実施例を示す。図１１ａにおいて見られるように、二次元シフトアレイのデータ内容は第１のアレイ１１０７に示され、実行レーンアレイはフレーム１１０５によって示される。また、実行レーンアレイ内の２つの近隣の実行レーン１１１０が簡略化して示されている。この簡単な図示１１１０では、各実行レーンは、シフトレジスタからデータを受け付け、ＡＬＵ出力からデータを受け付け（たとえば、サイクルにわたってアキュムレータとして動作する）、または出力データを出力先に書き込むことができるレジスタＲ１を含む。
【０１０３】
各実行レーンはまた、ローカルレジスタＲ２において、二次元シフトアレイにおけるそれ「の下の」内容が利用可能である。したがって、Ｒ１は実行レーンの物理レジスタであり、Ｒ２は二次元シフトレジスタアレイの物理レジスタである。実行レーンは、Ｒ１および／またはＲ２によって提供されるオペランドに対して動作可能なＡＬＵを含む。さらに詳細に後述するように、一実施形態では、シフトレジスタは、実際にはアレイ位置ごとに複数の（ある「深さ」の）記憶／レジスタ素子で実現されるが、シフト動作は記憶素子の１つの面に限られる（たとえば、記憶素子の１つの面のみがサイクルごとにシフトすることができる）。図１１ａ〜図１１ｋは、それぞれの実行レーンから結果のＸを格納するために使用されるとしてこれらのより深いレジスタ位置の１つを示している。例示を容易にするために、より深い結果のレジスタは、その対応するレジスタＲ２の下ではなく、その横に図示されている。
【０１０４】
図１１ａ〜図１１ｋは、実行レーンアレイ内に示された実行レーン位置１１１１の対に中心位置が整列された２つのステンシルの計算に焦点を当てている。例示を容易にするために、実行レーン１１１０の対は、実際には、以下の例によれば、それらが垂直方向の近隣実行レーンである場合に、水平方向の近隣実行レーンとして図示されている。
【０１０５】
図１１ａで最初に見られるように、実行レーンはそれらの中央のステンシル位置上に中心を配される。図１１ｂは、両方の実行レーンによって実行されるオブジェクトコードを示す。図１１ｂにおいて見られるように、両方の実行レーンのプログラムコードは、シフトレジスタアレイ内のデータを、１つの位置だけ下にシフトさせ、１つの位置だけ右にシフトさせる。これにより、両方の実行レーンがそれらのそれぞれのステンシルの左上隅に整列される。次に、プログラムコードは、（Ｒ２において）それらのそれぞれの位置にあるデータをＲ１にロードさせる。
【０１０６】
図１１ｃに示すように、次にプログラムコードは、実行レーンの対に、シフトレジスタアレイ内のデータを１単位だけ左にシフトさせ、各実行レーンのそれぞれの位置の右の値を各実行レーンの位置にシフトさせる。Ｒ１の値（以前の値）は、次いで、（Ｒ２における）実行レーンの位置にシフトした新しい値とともに加算される。結果はＲ１に書き込まれる。図１１ｄで見られるように、図１１ｃについて上述したのと同じプロセスが繰り返され、結果のＲ１に対して、今度は上側実行レーンにおける値Ａ＋Ｂ＋Ｃ、および下側実行レーンにおけるＦ＋Ｇ＋Ｈ値を含ませるようにする。この時点で、両方の実行レーンはそれらのそれぞれのステンシルの上側の行を処理している。（左側に存在する場合には）実行レーンアレイの左側でハロー領域に、またはハロー領域が存在しない場合にはランダムアクセスメモリにこぼれ出ることは、実行レーンアレイの左側には存在しないことに注目されたい。
【０１０７】
図１１ｅに示すように、次に、プログラムコードは、シフトレジスタアレイ内のデータを１単位だけ上にシフトさせ、両方の実行レーンをそれらのそれぞれのステンシルの中間行の右端に整列される。両方の実行レーンのレジスタＲ１は、現在、ステンシルの最上行および中間行の一番右の値の合計を含む。図１１ｆおよび図１１ｇは、両方の実行レーンのステンシルの中間行にわたって左方向に移動する継続的な進行を示す。累積加算は、図１１ｇの処理の終了時に、両方の実行レーンがそれらのそれぞれのステンシルの最上行の値と中間行の値との合計を含むように、継続する。
【０１０８】
図１１ｈは、各実行レーンをそれの対応するステンシルの最下行に整列させる別のシフトを示す。図１１ｉおよび図１１ｊは、両方の実行レーンのステンシルの過程にわたって処理を完了するための継続的なシフトを示す。図１１ｋは、各実行レーンをデータアレイにおいてそれの正しい位置に整列させ、その結果をそこに書き込むための追加のシフトを示す。
【０１０９】
図１１ａ〜図１１ｋの例では、シフト動作のためのオブジェクトコードは、（Ｘ、Ｙ）座標で表されるシフトの方向および大きさを識別する命令フォーマットを含むことができることに留意されたい。たとえば、１つの位置分の上方向シフトのためのオブジェクトコードは、オブジェクトコードでＳＨＩＦＴ０，＋１として表現されてもよい。別の例として、１つの位置分の右方向へのシフトは、オブジェクトコードでＳＨＩＦＴ＋１，０として表現されてもよい。さまざまな実施形態では、より大きい大きさのシフトも、オブジェクトコードで指定することができる（たとえば、ＳＨＩＦＴ０，＋２）。ここで、２Ｄシフトレジスタハードウェアが１サイクルにつき１つの位置だけしかシフトをサポートしない場合、命令は機械によって複数のサイクル実行を要求するように解釈されてもよく、または２Ｄシフトレジスタハードウェアは、１サイクルにつき２つ以上の位置分シフトをサポートするように設計されてもよい。後者の実施形態はより詳細にさらに下に記載される。
【０１１０】
図１２は、実行レーンおよび対応するシフトレジスタ構造の単位セルの別のより詳細な図を示す（ハロー領域のレジスタは、対応する実行レーンを含まないが、各種実施形態ではメモリユニットを含む）。実行レーンおよび実行レーンアレイの各位置に関連するレジスタ空間は、一実施形態では、実行レーンアレイの各ノードで、図１２に示す回路系をインスタンス化することによって実施される。図１２に示すように、単位セルは、４つのレジスタＲ２〜Ｒ５からなるレジスタファイル１２０２に結合される実行レーン１２０１を含む。任意のサイクルの間、実行レーン１２０１は、レジスタＲ１〜Ｒ５のいずれかから読み書きすることができる。２つの入力オペランドを必要とする命令の場合、実行レーンはＲ１〜Ｒ５のいずれかからオペランドの両方を取り出すことができる。
【０１１１】
一実施形態では、二次元シフトレジスタ構造は、近隣のレジスタファイル間のシフトが同じ方向にあるように（たとえば、すべての実行レーンは左にシフトする、すべての実行レーンは右にシフトするなど）、それの近隣のレジスタファイルが入力マルチプレクサ１２０４を介する場合に、単一のサイクルの間に、レジスタＲ２〜Ｒ４のいずれか（ただ）１つの内容が、出力マルチプレクサ１２０３を介してその近隣のレジスタファイルの１つにシフト「アウト」され、対応するものからシフト「イン」される内容でレジスタＲ２〜Ｒ４のいずれか（ただ）１つの内容が置き換えられることによって、実現される。同じレジスタがその内容がシフトアウトされて同じサイクルでシフトインされる内容で置き換えられるのが一般的であるかもしれないが、マルチプレクサ構成１２０３，１２０４は、同じサイクル中に同じレジスタファイル内で異なるシフトソースおよびシフトターゲットレジスタを可能にする。
【０１１２】
図１２に示すように、シフトシーケンスの間、実行レーンは、内容をそのレジスタファイル１２０２からその左、右、上および下の近隣のレジスタファイルにシフトアウトする。同じシフトシーケンスと関連して、実行レーンは、さらに、内容をその左、右、上および下の近隣のレジスタファイルの特定のものからそれのレジスタファイルにシフトする。再び、シフトアウトターゲットおよびシフトインソースは、すべての実行レーンについて同じシフト方向と整合しなければならない（たとえば、シフトアウトが右隣に対する場合、シフトインは左隣からでなければならない）。
【０１１３】
一実施形態では、１サイクルにつき１つの実行レーンにつき１つのレジスタの内容だけをシフトすることが許されるが、他の実施形態では、２つ以上のレジスタの内容をシフトイン／アウトすることが許されてもよい。たとえば、図１２に示されたマルチプレクサ回路系１２０３，１２０４の第２の例が図１２の設計に組み込まれる場合、同じサイクルの間に２つのレジスタの内容がシフトアウト／インされてもよい。もちろん、１つのレジスタの内容だけがサイクルごとにシフトされることが許される実施形態では、数学的演算間のシフトのためにより多くのクロックサイクルを消費することによって、複数のレジスタからのシフトが数学的演算間に起こってもよい（たとえば、２つのレジスタの内容が、数学的演算間で２つのシフト演算を消費することによって数学的演算間でシフトされてもよい）。
【０１１４】
実行レーンのレジスタファイルのすべての内容未満がシフトシーケンス中にシフトアウトされる場合、各実行レーンのシフトアウトされないレジスタの内容は適所に残る（シフトしない）ことに留意されたい。したがって、シフトインされる内容と置き換えられないシフトされない内容は、シフトサイクルにわたって実行レーンにローカルに維持される。各実行レーンで見られるメモリユニット（「Ｍ」）は、データを、実行レーンアレイ内の実行レーンの行および／または列に関連付けられるランダムアクセスメモリ空間からロードまたはそれに格納するために使用される。ここで、Ｍユニットは、実行レーンの自身のレジスタ空間からロードまたはそれに格納できないデータをロード／格納するためによく使用されるという点で、標準的なＭユニットとして機能する。さまざまな実施形態では、Ｍユニットの主な動作は、ローカルレジスタからメモリにデータを書き込み、メモリからデータを読み出してそれをローカルレジスタに書き込むことである。
【０１１５】
ハードウェア実行レーン１２０１のＡＬＵユニットによってサポートされるＩＳＡオペコードに関して、さまざまな実施形態において、ハードウェアＡＬＵによってサポートされる数学的オペコードは、（たとえば、ＡＤＤ、ＳＵＢ、ＭＯＶ、ＭＵＬ、ＭＡＤ、ＡＢＳ、ＤＩＶ、ＳＨＬ、ＳＨＲ、ＭＩＮ／ＭＡＸ、ＳＥＬ、ＡＮＤ、ＯＲ、ＸＯＲ、ＮＯＴ）を含む。上述のように、メモリアクセス命令は、実行レーン１２０１によって実行され、データをそれらの関連付けられるランダムアクセスメモリからフェッチまたはそれに格納することができる。さらに、ハードウェア実行レーン１２０１は、シフト演算命令（右、左、上、下）をサポートし、二次元シフトレジスタ構造内でデータをシフトする。上述したように、プログラム制御命令は主にステンシルプロセッサのスカラープロセッサによって実行される。
【０１１６】
４．０  実装実施形態
上述したさまざまな画像プロセッサアーキテクチャの特徴は、必ずしも従来の意味での画像処理に限定されず、したがって、画像プロセッサを再特徴付けしてもよい（またはしなくてもよい）他のアプリケーションに適用することができることを指摘することが適切である。たとえば、実際のカメラ画像の処理とは対照的に、アニメーションの作成および／または生成および／またはレンダリングにおいて上述した様々な画像プロセッサアーキテクチャの特徴のいずれかが使用される場合、画像プロセッサはグラフィックス処理ユニットとして特徴付けられてもよい。さらに、上述した画像プロセッサアーキテクチャの特徴は、ビデオ処理、視覚処理、画像認識および／または機械学習などの他の技術的用途にも適用することができる。このように適用されて、画像プロセッサは、より汎用的なプロセッサ（たとえば、コンピューティングシステムのＣＰＵであるか、またはその一部である）と（たとえばコプロセッサとして）一体化されてもよく、またはコンピューティングシステム内のスタンドアロンプロセッサであってもよい。
【０１１７】
上述したハードウェア設計の実施形態は、半導体チップ内において、および／または最終的に半導体製造プロセスに向けての回路設計の記述として実施することができる。後者の場合、そのような回路記述は、（たとえばＶＨＤＬまたはＶｅｒｉｌｏｇ）レジスタ転送レベル（ＲＴＬ）回路記述、ゲートレベル回路記述、トランジスタレベル回路記述もしくはマスク記述またはそれらのさまざまな組み合わせの形態をとってもよい。回路記述は、典型的には、コンピュータ可読記憶媒体（たとえばＣＤ−ＲＯＭまたは他のタイプの記憶技術）上に実施される。
【０１１８】
先のセクションから、上記の画像プロセッサは、（たとえば、ハンドヘルド装置のカメラからのデータを処理するハンドヘルド装置のシステムオンチップ（ＳＯＣ）の一部として）コンピュータシステム上のハードウェアで実施できることを認識することに関係する。画像プロセッサがハードウェア回路として実施される場合、画像プロセッサによって処理される画像データはカメラから直接受信されてもよいことに留意されたい。ここで、画像プロセッサは、別体のカメラの一部であってもよいし、一体化されたカメラを有するコンピューティングシステムの一部であってもよい。後者の場合、画像データは、カメラから直接、またはコンピューティングシステムのシステムメモリから受信することができる（たとえば、カメラは、その画像データを画像プロセッサではなくシステムメモリに送信する）。先のセクションで説明した機能の多くは、（アニメーションをレンダリングする）グラフィックスプロセッサユニットにも適用可能であることにも留意されたい。
【０１１９】
図１３は、コンピューティングシステムの例示的な図である。以下に説明するコンピューティングシステムのコンポーネントの多くは、一体化されたカメラおよび関連する画像プロセッサ（たとえば、スマートフォンまたはタブレットコンピュータなどのハンドヘルドデバイス）を有するコンピューティングシステムに適用可能である。当業者は、２つの間の範囲を容易に定めることができるであろう。加えて、図１３のコンピューティングシステムはまた、ワークステーションまたはスーパーコンピュータといった高性能コンピューティングシステムの多くの特徴を含む。
【０１２０】
図１３に見られるように、基本的なコンピューティングシステムは、中央処理ユニット１３０１（たとえば、マルチコアプロセッサまたはアプリケーションプロセッサ上に配置された複数の汎用処理コア１３１５＿１〜１３１５＿Ｎおよびメインメモリコントローラ１３１７を含み得る）、システムメモリ１３０２、ディスプレイ１３０３（たとえばタッチスクリーン、フラットパネル）、ローカル有線ポイントツーポイントリンク（たとえばＵＳＢ）インタフェース１３０４、さまざまなネットワークＩ／Ｏ機能１３０５（イーサネット（登録商標）インタフェースおよび／またはセルラーモデムサブシステムなど）、無線ローカルエリアネットワーク（たとえばＷｉＦｉ）インタフェース１３０６、ワイヤレスポイントツーポイントリンク（たとえばブルートゥース（登録商標））インタフェース１３０７およびグローバルポジショニングシステムインタフェース１３０８、さまざまなセンサ１３０９＿１〜１３０９＿Ｎ、１つ以上のカメラ１３１０、バッテリ１３１１、電力管理制御ユニット１３１２、スピーカおよびマイクロホン１３１３、ならびに音声コーダ／デコーダ１３１４を含んでもよい。
【０１２１】
アプリケーションプロセッサまたはマルチコアプロセッサ１３５０は、そのＣＰＵ１２０１内における１つ以上の汎用処理コア１３１５、１つ以上のグラフィカル処理ユニット１３１６、メモリ管理機能１３１７（たとえばメモリコントローラ）、Ｉ／Ｏ制御機能１３１８および画像処理ユニット１３１９を含んでもよい。汎用処理コア１３１５は、典型的には、コンピューティングシステムのオペレーティングシステムおよびアプリケーションソフトウェアを実行する。グラフィックス処理ユニット１３１６は、典型的には、たとえばディスプレイ１３０３上に提示されるグラフィックス情報を生成するために、グラフィックス集中型機能を実行する。メモリ制御機能１３１７は、システムメモリ１３０２とインタフェースして、システムメモリ１３０２との間でデータの書込／読出を行う。電力管理制御ユニット１３１２は、システム１３００の電力消費を全体的に制御する。
【０１２２】
画像処理ユニット１３１９は、先のセクションで説明した画像処理ユニットの実施形態のいずれかに従って実現することができる。代替的にまたは組み合わせて、ＩＰＵ１３１９は、ＧＰＵ１３１６およびＣＰＵ１３０１のいずれかまたは両方にそのコプロセッサとして結合されてもよい。さらに、さまざまな実施形態では、ＧＰＵ１３１６は、上で説明した画像プロセッサの特徴のいずれかを用いて実現することができる。画像処理ユニット１３１９は、先に詳述したようにアプリケーションソフトウェアで構成することができる。加えて、図１３のコンピューティングシステムのようなコンピューティングシステムは、画像プロセッサ上のアプリケーションソフトウェアプログラムの構成を決定する上記計算を行うプログラムコードを実行することができる。
【０１２３】
タッチスクリーンディスプレイ１３０３、通信インタフェース１３０４〜１３０７、ＧＰＳインタフェース１３０８、センサ１３０９、カメラ１３１０、およびスピーカ／マイクコーデック１３１３，１３１４の各々はすべて、適切な場合には、一体化された周辺装置（たとえば１つ以上のカメラ１３１０）も含むコンピューティングシステム全体に対してさまざまな形態のＩ／Ｏ（入力および／または出力）として見ることができる。実現例によっては、これらのＩ／Ｏコンポーネントのさまざまなものは、アプリケーションプロセッサ／マルチコアプロセッサ１３５０上に統合されてもよく、またはアプリケーションプロセッサ／マルチコアプロセッサ１３５０のダイから離れて、またはそのパッケージ外に配置されてもよい。
【０１２４】
一実施形態では、１つ以上のカメラ１３１０は、カメラとその視野内の対象との間の深度を測定することができる深度カメラを含む。アプリケーションプロセッサまたは他のプロセッサの汎用ＣＰＵコア（もしくはプログラムコードを実行するために命令実行パイプラインを有する他の機能ブロック）上で実行されるアプリケーションソフトウェア、オペレーティングシステムソフトウェア、デバイスドライバソフトウェアおよび／またはファームウェアは、上記の機能のいずれかを実行してもよい。
【０１２５】
本発明の実施形態は、上述したようなさまざまなプロセスを含むことができる。これらのプロセスは、機械実行可能命令で実施されてもよい。これらの命令は、汎用または特殊目的のプロセッサに特定のプロセスを実行させるために使用できる。代替的に、これらのプロセスは、プロセスを実行するためのハードワイヤードおよび／またはプログラマブル論理を含む特定のハードウェアコンポーネントによって、またはプログラミングされたコンピュータコンポーネントとカスタムハードウェアコンポーネントとの任意の組み合わせによって実行されてもよい。
【０１２６】
本発明の要素はまた、機械実行可能命令を記憶するための機械可読媒体として提供されてもよい。機械可読媒体は、フロッピー（登録商標）ディスク、光ディスク、ＣＤ−ＲＯＭ、および光磁気ディスク、フラッシュメモリ、ＲＯＭ、ＲＡＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気もしくは光カード、伝搬媒体、または電子命令を記憶するのに適した他のタイプの媒体／機械可読媒体を含むが、それらに限定はされない。たとえば、本発明は、搬送波または通信リンク（たとえばモデムもしくはネットワーク接続）を介する他の伝搬媒体で実施されたデータ信号によって、遠隔のコンピュータ（たとえばサーバ）から要求側コンピュータ（たとえばクライアント）に転送され得るコンピュータプログラムとしてダウンロードすることができる。
【０１２７】
前述の明細書では、本発明をその特定の例示的な実施形態を参照しながら説明した。しかしながら、特許請求の範囲に記載される本発明のより広い精神および範囲から逸脱することなく、さまざまな修正および変更がなされ得ることは明らかであろう。したがって、明細書および図面は、限定的ではなく例示的なものとみなされるべきである。
【図１】
0006820428.tif 000002
【図２】
0006820428.tif 000003
【図３】
0006820428.tif 000004
【図４】
0006820428.tif 000005
【図５】
0006820428.tif 000006
【図６】
0006820428.tif 000007
【図７】
0006820428.tif 000008
【図８ａ】
0006820428.tif 000009
【図８ｂ】
0006820428.tif 000010
【図８ｃ】
0006820428.tif 000011
【図８ｄ】
0006820428.tif 000012
【図８ｅ】
0006820428.tif 000013
【図９ａ】
0006820428.tif 000014
【図９ｂ】
0006820428.tif 000015
【図１０】
0006820428.tif 000016
【図１１ａ】
0006820428.tif 000017
【図１１ｂ】
0006820428.tif 000018
【図１１ｃ】
0006820428.tif 000019
【図１１ｄ】
0006820428.tif 000020
【図１１ｅ】
0006820428.tif 000021
【図１１ｆ】
0006820428.tif 000022
【図１１ｇ】
0006820428.tif 000023
【図１１ｈ】
0006820428.tif 000024
【図１１ｉ】
0006820428.tif 000025
【図１１ｊ】
0006820428.tif 000026
【図１１ｋ】
0006820428.tif 000027
【図１２】
0006820428.tif 000028
【図１３】
0006820428.tif 000029