【文献】
Thibaut Lutz 外2名,"Helium: A Transparent Inter-kernel Optimizer for OpenCL",Proceedings of the 8th Workshop on General Purpose Processing using GPUs,米国,ACM,2015年 2月 7日,pp.70-80
(58)【調査した分野】(Int.Cl.,DB名)
前記カーネルの水平融合は、第1の融合されたカーネルが第2の融合されたカーネルに先行するようにプログラムフローを連結することをさらに含む、請求項1に記載の方法。
前記カーネルの水平融合は、前記第1および第2の融合されたカーネルのうちの少なくとも一方について完了ごとに消費される呼び出しを修正することをさらに含む、請求項2に記載の方法。
前記修正することは、別の融合されたカーネルよりも完了ごとに消費されるサイクルの数が少ないとして特徴づけられる融合されたカーネルに1つ以上のループを追加することをさらに含む、請求項3に記載の方法。
前記遅延させることを課すことにより、前記垂直融合されたカーネルを実行する処理コアの前記二次元実行レーンアレイ回路構造の外側にあるレジスタ空間のハロー領域が、前記消費する融合されたカーネルが依存するデータを含むことを保証する、請求項5に記載の方法。
前記空間的区分は、前記複数の空間的に区分されたカーネルがそれらのそれぞれの画像部分を参照するように、前記複数の空間的に区分されたカーネル内において前記カーネルのX、Y座標値を調整することをさらに含む、請求項1〜7のいずれか1項に記載の方法。
前記カーネルの水平融合は、第1の融合されたカーネルが第2の融合されたカーネルに先行するようにプログラムフローを連結することをさらに含む、請求項11に記載の方法。
前記カーネルの1つの、複数のカーネルへの分裂は、さらに、前記複数のカーネルのうちの1つの出力においてデータのシートを格納する命令および/またはコマンドを追加することを含み、前記データのシートは、前記複数のカーネルのうちの前記1つを実行する処理コアの二次元シフトレジスタアレイ構造によって提供され、前記カーネルの1つの、
複数のカーネルへの分裂はさらに、前記複数のカーネルのうちの別の1つの入力においてデータのシートをロードする命令および/またはコマンドを追加することを含み、前記データのシートは、前記複数のカーネルのうちの前記別の1つを実行する処理コアの二次元シフトレジスタアレイ構造にロードされる、請求項11〜請求項13のいずれか1項に記載の方法。
前記空間的区分は、前記複数の空間的に区分されたカーネルがそれらのそれぞれの画像部分を参照するように、前記複数の空間的に区分されたカーネル内において前記カーネルのX、Y座標値を調整することをさらに含む、請求項11〜請求項14のいずれか1項に記載の方法。
前記有向非循環グラフの複数の有向非循環グラフへの分割は、結果として得られるより小さいプログラムのうちの1つの出力において前記画像プロセッサの外部のメモリにデータを格納する命令および/またはコマンドを追加することと、結果として得られるより小さなプログラムのうちの別の1つの入力において前記画像プロセッサの外部のメモリからデータをロードする命令および/またはコマンドを追加することとをさらに含む、請求項11〜請求項15のいずれか1項に記載の方法。
前記空間的区分は、前記複数の空間的に区分されたカーネルがそれらのそれぞれの画像部分を参照するように、前記複数の空間的に区分されたカーネル内において前記カーネルのX、Y座標値を調整することをさらに含む、請求項17に記載の方法。
前記画像プロセッサは、異なる処理コア上で実行される作成カーネルと消費カーネルとの間で画像データを格納および転送するためのラインバッファユニットを備え、複数の有向非循環グラフは、前記画像プロセッサ内の、前記ラインバッファユニットのうちの、それら自身のそれぞれのラインバッファユニットに書き込むように構成される、請求項19に記載の方法。
【発明を実施するための形態】
【0011】
詳細な記載
a.画像プロセッサハードウェアアーキテクチャおよび動作
図1は、ハードウェアで実現される画像プロセッサのためのアーキテクチャ100の実施形態を示す。画像プロセッサは、例えば、シミュレートされた環境内で仮想プロセッサ用に書かれたプログラムコードを、ハードウェアプロセッサによって実際に実行されるプログラムコードに変換するコンパイラによって対象とされてもよい。
図4に示すように、アーキテクチャ100は、複数のラインバッファユニット101_1〜101_Mを含み、それらは、複数のステンシルプロセッサユニット102_1〜102_Nおよび対応するシート生成部ユニット103_1〜103_Nに、ネットワーク104(例えば、ネットワークオンチップ(NOC)(オンチップスイッチネットワーク、オンチップリングネットワークまたは他の種類のネットワークを含む))を介して相互接続される。一実施形態では、どのラインバッファユニットが、ネットワーク104を介してどのシート生成部および対応するステンシルプロセッサに接続してもよい。
【0012】
一実施形態では、プログラムコードはコンパイルされ、対応するステンシルプロセッサ102にロードされて、ソフトウェア開発者によって以前に定義された画像処理動作を実行する(プログラムコードは、例えば、設計および実装に応じて、ステンシルプロセッサの関連のシート生成部103にもロードされてもよい)。少なくともいくつかの例では、画像処理パイプラインを、第1のパイプラインステージ用の第1のカーネルプログラムを第1のステンシルプロセッサ102_1にロードし、第2のパイプラインステージ用の第2のカーネルプログラムを第2のステンシルプロセッサ102_2にロードするなどして、実現することができ、第1のカーネルはパイプラインの第1ステージの機能を実行し、第2のカーネルはパイプラインの第2ステージの機能を実行し、追加の制御フロー方法がインストールされて、出力画像データをパイプラインの1つのステージからの次のステージに渡す。
【0013】
他の構成では、画像プロセッサは、同じカーネルプログラムコードを動作させる2つ以上のステンシルプロセッサ102_1,102_2を有する並列マシンとして実現することができる。例えば、画像データの高密度かつ高データレートのストリームが、各々が同じ機能を実行する複数のステンシルプロセッサにわたってフレームを広げることによって処理されてもよい。
【0014】
さらに他の構成では、カーネルの本質的に任意のDAGのハードウェアプロセッサへのロードを、それぞれのステンシルプロセッサをそれら自身のプログラムコードのカーネルとともに構成し、適切な制御フローフックをハードウェアに構成して、出力画像をDAG設計における1つのカーネルから次のカーネルの入力に向けることによって、行なってもよい。
【0015】
一般的なフローとして、画像データのフレームは、マクロI/Oユニット105で受信され、フレーム単位でラインバッファユニット101の1つ以上に渡される。特定のラインバッファユニットは、それの画像データのフレームを、「ライングループ」と呼ばれる画像データのより小さな領域に解析し、次いでライングループをネットワーク104を介して特定のシート生成部に渡す。ある完全な(full)単数のライングループを、例えば、フレームの複数の連続した完全な行または列のデータで構成することができる(簡単にするために、本明細書では主に連続した行と称する)。シート生成部は、画像データのライングループを「シート」と呼ばれる画像データのより小さな領域にさらに解析し、そのシートを対応するステンシルプロセッサに提示する。
【0016】
単一入力の画像処理パイプラインやDAGフローの場合、一般に、入力フレームは、同じラインバッファユニット101_1に向けられ、それは、画像データをライングループに解析し、ライングループを対応するシート生成部103_1(対応するステンシルプロセッサ102_1はパイプライン/DAGにおいて第1のカーネルのコードを実行している)に向ける。ステンシルプロセッサ102_1による、それが処理するライングループでの動作が終了した後、シート生成部103_1は、出力ライングループを「下流」のラインバッファユニット101_2に送信する(ある使用例では、出力ライングループは、先に入力ライングループを送信したのと同じラインバッファ装置101_1に送り返すことができる)。
【0017】
自身のそれぞれの他のシート生成部およびステンシルプロセッサ(例えば、シート生成部103_2およびステンシルプロセッサ102_2)上で実行されるパイプライン/DAGにおける次のステージ/動作を表す1つ以上の「消費側」カーネルは、下流ラインバッファユニット101_2から、第1のステンシルプロセッサ102_1によって生成された画像データを受信する。このようにして、第1のステンシルプロセッサ上で動作する「作成側」カーネルは、その出力データが、第2のステンシルプロセッサ上で動作する「消費側」カーネルに転送され、消費側カーネルは、パイプラインまたはDAG全体の設計と整合する作成側カーネルの後に次のタスクのセットを実行する。
【0018】
ステンシルプロセッサ102は、画像データの複数の重なり合うステンシル上で同時に動作するように設計されている。複数の重なり合うステンシルおよびステンシルプロセッサの内部ハードウェア処理能力は、シートのサイズを効果的に決定する。ここでは、ステンシルプロセッサ102内で、実行レーンのアレイが一致して動作して、複数の重なり合うステンシルによってカバーされる画像データ表面領域を同時に処理する。
【0019】
以下でより詳細に説明するように、様々な実施形態において、画像データのシートは、ステンシルプロセッサ102内において二次元レジスタアレイ構造にロードされる。シートおよび二次元レジスタアレイ構造の使用は、大量のデータを、大量のレジスタ空間に、例えば、処理タスクが実行レーンアレイによってその直後に直接データ上で実行される単一のロード動作として移動することによって、電力消費の改善を効果的に提供すると考えられている。さらに、実行レーンアレイおよび対応するレジスタアレイの使用は、容易にプログラマブル/設定可能な異なるステンシルサイズを提供する。
【0020】
図2a〜
図2eは、ラインバッファユニット101の解析アクティビティ、およびシート生成部ユニット103のより微細な粒子の解析アクティビティ、ならびにシート生成部103に結合されるステンシルプロセッサ102のステンシル処理アクティビティの両方のハイレベルの実施形態を示す。
【0021】
図2aは、画像データ201の入力フレームの一実施形態を示す。
図2aはまた、ステンシルプロセッサが動作するように設計された3つの重なり合うステンシル202(各々3ピクセル×3ピクセルの寸法を有する)の概要を示す。各ステンシルがそれぞれ出力画像データを生成する出力ピクセルは、ベタ黒で強調表示される。簡略化のために、3つの重なり合うステンシル202は、垂直方向にのみ重なるように示されている。実際には、ステンシルプロセッサは、垂直方向および水平方向の両方に重なるステンシルを有するように設計されてもよいことを認識することが適切である。
【0022】
図2aに見られるように、ステンシルプロセッサ内の垂直に重なり合うステンシル202のために、フレーム内に単一のステンシルプロセッサが動作することができる画像データの広い帯域が存在する。以下でより詳細に説明するように、一実施形態では、ステンシルプロセッサは、データを、それらの重なり合うステンシル内で、左から右への態様で、画像データにわたって処理する(そして、次のラインのセットに対して、上から下の順序で繰り返す)。このように、ステンシルプロセッサがそれらの動作を前方に進めるにつれて、ベタ黒出力ピクセルブロックの数は、水平方向に右に成長する。上述したように、ラインバッファユニット101は、ステンシルプロセッサが今後の拡張された数のサイクルにわたって動作するのに十分な入来フレームからの入力画像データのライングループを解析することを担う。ライングループの例示的な図示は、陰影領域203として示されている。一実施形態では、ラインバッファユニット101は、ライングループをシート生成部との間で送受信するための異なるダイナミクスを理解することができる。例えば、「完全なグループ」と呼ばれる1つのモードによれば、画像データの完全な全幅のラインが、ラインバッファユニットとシート生成部との間で渡される。「仮想的に高い」と呼ばれる第2のモードによれば、ライングループは最初に全幅行のサブセットと共に渡される。その後、残りの行は、より小さい(全幅未満の)片で順番に渡される。
【0023】
入力画像データのライングループ203がラインバッファユニットによって画定され、シート生成部ユニットに渡されると、シート生成部ユニットはさらに、ライングループを、ステンシルプロセッサのハードウェア制限に、より正確に適合する、より微細なシートに、解析する。より具体的には、以下でさらに詳細に説明するように、一実施形態では、各ステンシルプロセッサは、二次元シフトレジスタアレイからなる。二次元シフトレジスタアレイは、本質的に、画像データを実行レーンのアレイの「真下」にシフトし、シフトのパターンは、各実行レーンをそれ自身のステンシル内においてデータに対して動作させる(すなわち、各実行レーンは、それ自身の情報のステンシル上で処理して、そのステンシルの出力を生成する)。一実施形態では、シートは、二次元シフトレジスタアレイを「満たす」か、さもなければ二次元シフトレジスタアレイにロードされる入力画像データの表面領域である。
【0024】
以下でより詳細に説明するように、様々な実施形態では、実際には、任意のサイクルでシフト可能な二次元レジスタデータの複数の層が存在する。便宜上、本記載の多くは、「二次元シフトレジスタ」などの用語を、シフト可能な二次元レジスタデータの1つ以上のそのような層を有する構造を指すために単純に使用する。
【0025】
したがって、
図2bに見られるように、シート生成部は、ライングループ203から最初のシート204を解析し、それをステンシルプロセッサに供給する(ここで、データのシートは、参照番号204によって全体的に識別される陰影領域に対応する)。
図2cおよび
図2dに示すように、ステンシルプロセッサは、重なるステンシル202をシート上で左から右へ効果的に移動させることによって、入力画像データのシートに対して動作する。
図2dのように、シート内のデータから出力値を計算することができるピクセル数が使い果たされる(他のピクセル位置は、シート内の情報から決定される出力値を有することができない)。簡単にするために、画像の境界領域は無視されている。
【0026】
図2eにおいて見られるように、シート生成部は次いで、ステンシルプロセッサが動作を継続する次のシート205を提供する。ステンシルが次のシートに対して動作を開始するときのステンシルの初期位置は、(先に
図2dに示されている)最初のシート上の消耗点から右への次の進行であることに留意されたい。新たなシート205で、ステンシルプロセッサが最初のシートの処理と同じ態様で新たなシートに対して動作するにつれ、ステンシルは単に右に移動し続ける。
【0027】
出力ピクセル位置を取り囲むステンシルの境界領域のために、第1のシート204のデータと第2のシート205のデータとの間にいくらかの重なりがあることに留意されたい。重なりは、シート生成部が重なり合うデータを2回再送信することによって簡単に処理することができる。別の実現例では、次のシートをステンシルプロセッサに供給するために、シート生成部は、ステンシルプロセッサに新たなデータを送るだけに進んでもよく、ステンシルプロセッサは、前のシートからの重なり合うデータを再利用する。
【0028】
b.ステンシルプロセッサ設計および動作
図3は、ステンシルプロセッサ300の実施形態を示す。
図3において見られるように、ステンシルプロセッサは、データ計算ユニット301、スカラープロセッサ302および関連するメモリ303およびI/Oユニット304を含む。データ計算ユニット301は、実行レーンのアレイ305、二次元シフトアレイ構造306、およびアレイの特定の行または列に関連する別個のランダムアクセスメモリ307を含む。
【0029】
I/Oユニット304は、シート生成部から受け取ったデータの「入力」シートをデータ計算ユニット301にロードし、ステンシルプロセッサからのデータの「出力」シートをシート生成部に格納する役割を果たす。一実施形態では、データ計算ユニット301へのシートデータのロードは、受け取ったシートを画像データの行/列に解析し、画像データの行/列を二次元シフトレジスタ構造306または実行レーンアレイの行/列のそれぞれのランダムアクセスメモリ307にロードすることを必要とする(以下でより詳細に説明する)。シートが最初にメモリ307にロードされる場合、実行レーンアレイ305内の個々の実行レーンは、適宜、ランダムアクセスメモリ307からシートデータを二次元シフトレジスタ構造306にロードすることができる(例えば、シートのデータ上での動作のすぐ前のロード命令として)。データのシートのレジスタ構造306へのロード(シート生成部からの直接的であろうとまたはメモリ307からであろうと)が完了すると、実行レーンアレイ305の実行レーンはデータに対して動作し、最終的に、完成したデータをシートとしてシート生成部に、またはランダムアクセスメモリ307に「書き戻す」。後者の場合、I/Oユニット304はランダムアクセスメモリ307からデータをフェッチして出力シートを形成し、出力シートはシート生成部に転送される。
【0030】
スカラープロセッサ302は、スカラーメモリ303からステンシルプロセッサのプログラムコードの命令を読み出し、実行レーンアレイ305の実行レーンに命令を発行するプログラムコントローラ309を含む。一実施形態では、データ計算ユニット301からSIMDのような動作を実行するために、単一の同じ命令がアレイ305内のすべての実行レーンにブロードキャストされる。一実施形態では、スカラーメモリ303から読み出され、実行レーンアレイ305の実行レーンに発行される命令の命令フォーマットは、命令当たり2つ以上のオペコードを含む非常に長い命令語(VLIW)タイプのフォーマットを含む。さらなる実施形態では、VLIWフォーマットは、(以下に説明するように、一実施形態では2つ以上の従来のALU動作を指定することができる)各実行レーンのALUによって実行される数学的機能を指示するALUオペコードと、(特定の実行レーンまたは実行レーンのセットに対してメモリ操作を指示する)メモリオペコードとの両方を含む。
【0031】
「実行レーン」という用語は、命令を実行することができる1つ以上の実行ユニットのセット(例えば、命令を実行することができる論理回路系)を指す。実行レーンは、しかしながら、様々な実施形態では、単なる実行ユニットを超えた、よりプロセッサに似た機能を含むことができる。例えば、1つ以上の実行ユニットに加えて、実行レーンは、受信された命令をデコードする論理回路系、または、よりMIMDのような設計の場合、命令をフェッチおよびデコードする論理回路系を含むことができる。MIMDのようなアプローチに関しては、ここでは集中プログラム制御アプローチが主に記載されているが、より分散型のアプローチが様々な代替実施形態(例えば、アレイ305の各実行レーン内のプログラムコードおよびプログラムコントローラを含む)において実施されてもよい。
【0032】
実行レーンアレイ305、プログラムコントローラ309および二次元シフトレジスタ構造306の組み合わせは、広範囲のプログラマブルな機能のための幅広く適応可能/設定可能なハードウェアプラットフォームを提供する。例えば、アプリケーションソフトウェア開発者は、個々の実行レーンが多種多様な機能を実行することができ、任意の出力アレイ位置に近接した入力画像データに容易にアクセスすることができれば、寸法(例えばステンシルサイズ)だけでなく幅広い異なる機能能力を有するカーネルをプログラミングすることができる。
【0033】
実行レーンアレイ305によって操作される画像データのためのデータ記憶装置として機能することとは別に、ランダムアクセスメモリ307は、1つ以上のルックアップテーブルを保持することもできる。様々な実施形態では、1つ以上のスカラールックアップテーブルをスカラーメモリ303内でインスタンス化することもできる。
【0034】
スカラールックアップは、同じルックアップテーブルからの同じインデックスからの同じデータ値を実行レーンアレイ305内の各実行レーンに渡すことを含む。様々な実施形態では、上述のVLIW命令フォーマットは、スカラープロセッサによって実行されるルックアップ動作をスカラールックアップテーブルに向けるスカラーオペコードを含むようにも拡張される。オペコードとともに使用するために指定されたインデックスは、即値オペランドでもよいし、他のデータ記憶位置からフェッチされてもよい。いずれにせよ、一実施形態では、スカラーメモリ内のスカラールックアップテーブルからのルックアップは、基本的に同じクロックサイクル中に実行レーンアレイ305内のすべての実行レーンに同じデータ値をブロードキャストすることを含む。ルックアップテーブルの使用および動作に関する追加の詳細は、以下でさらに説明する。
【0035】
図3bは、上述のVLIW命令ワードの実施形態を要約したものである。
図3bにおいて見られるように、VLIW命令ワードフォーマットは、3つの別個の命令、すなわち、1)スカラープロセッサによって実行されるスカラー命令351、2)実行レーンアレイ内でそれぞれのALUによってSIMD方式でブロードキャストされ実行されるALU命令352、および3)部分的SIMD方式でブロードキャストされ実行されるメモリ命令353に対するフィールドを含む(例えば、実行レーンアレイ内において同じ行に沿った実行レーンが同じランダムアクセスメモリを共有する場合、異なる行の各々からの1つの実行レーンが実際に命令を実行する(メモリ命令353のフォーマットは、各行からのどの実行レーンが命令を実行するかを識別するオペランドを含むことができる)。
【0036】
1つ以上の即時オペランドに対するフィールド354も含まれる。命令351,352,353のどれが、どの即時オペランド情報を用いるかは命令フォーマットで識別されてもよい。命令351,352,353の各々は、また、それら自身のそれぞれの入力オペランドおよび結果情報(例えば、ALU演算用のローカルレジスタならびにメモリアクセス命令用のローカルレジスタおよびメモリアドレス)を含む。一実施形態では、スカラー命令351は、実行レーンアレイ内の実行レーンが他の2つの命令352,353のいずれかを実行する前にスカラープロセッサによって実行される。すなわち、VLIWワードの実行は、スカラー命令351が実行される第1のサイクルと、続いて他の命令352,353が実行されてもよい第2のサイクルとを含む。(様々な実施形態では、命令352,353は並列して実行されてもよい)。
【0037】
一実施形態では、スカラープロセッサによって実行されるスカラー命令は、シートをデータ計算ユニットのメモリもしくは2Dシフトレジスタからロードまたはそれに格納するようシート生成部に発行されるコマンドを含む。ここで、シート生成部の動作は、ラインバッファユニットの動作またはスカラープロセッサによって発行されたコマンドをシート生成部が完了するのに要するサイクル数のプレランタイムの理解を妨げる他の変数に依存し得る。したがって、一実施形態では、スカラー命令351がシート生成部に発行されるべきコマンドに対応するか、さもなければコマンドをシート生成部に発行させるVLIWワードは、他の2つの命令フィールド352,353に無操作(NOOP)命令を含む。次に、プログラムコードは、シート生成部がデータ計算ユニットに対するそのロードまたはデータ計算ユニットからのその格納を完了するまで、命令フィールド352,353についてNOOP命令のループに入る。ここで、シート生成部にコマンドを発行すると、スカラープロセッサは、シート生成部がコマンドの完了時にリセットするインターロックレジスタのビットをセットしてもよい。NOOPループの間、スカラープロセッサはインターロックビットのビットを監視する。スカラープロセッサが、シート生成部がそのコマンドを完了したことを検出すると、通常の実行が再び開始される。
【0038】
図4は、データ計算コンポーネント401の一実施形態を示す。
図4において見られるように、データ計算コンポーネント401は、二次元シフトレジスタアレイ構造406「の上に」論理的に位置決めされる実行レーンのアレイ405を含む。上述したように、様々な実施形態では、シート生成部によって提供される画像データのシートが二次元シフトレジスタ406にロードされる。実行レーンは、レジスタ構造406からのシートデータに対して動作する。
【0039】
実行レーンアレイ405およびシフトレジスタ構造406は、互いに対して適所に固定される。しかし、シフトレジスタアレイ406内のデータは、戦略的かつ調整された態様でシフトして、実行レーンアレイ内の各実行レーンがデータ内で異なるステンシルを処理するようにする。したがって、各実行レーンは、生成されている出力シートにおいて異なるピクセルに対する出力画像値を決定する。
図4のアーキテクチャから、実行レーンアレイ405が垂直に近接する実行レーンおよび水平に近接する実行レーンを含むので、重なり合うステンシルが垂直に配置されるだけでなく水平にも配置されることは明らかである。
【0040】
データ計算ユニット401のいくつかの注目すべきアーキテクチャ上の特徴には、実行レーンアレイ405よりも広い寸法を有するシフトレジスタ構造406が含まれる。すなわち、実行レーンアレイ405の外側にレジスタ409の「ハロー」が存在する。ハロー409は、実行レーンアレイの2つの側に存在するように示されているが、実現例に応じて、実行レーンアレイ405の2つ未満(1つ)またはそれ以上(3つまたは4つ)の側に存在してもよい。ハロー405は、データが実行レーン405の「下で」シフトしているときに、実行レーンアレイ405の境界の外側にこぼれ出るデータのための「スピルオーバ」空間を提供する働きをする。単純なケースとして、実行レーンアレイ405の右端を中心とする5×5のステンシルは、ステンシルの最も左側のピクセルが処理されるとき、さらに右側に4つのハローレジスタ位置を必要とすることになる。図面を簡単にするために、
図4は、名目上の実施例において、どちらの側(右、底)のレジスタでも水平方向接続および垂直方向接続の両方を有するであろうとき、ハローの右側のレジスタを、水平方向シフト接続を有するだけとして、およびハローの底側のレジスタを、垂直方向シフト接続を有するだけとして示す。様々な実施形態では、ハロー領域は、画像処理命令を実行するための対応する実行レーン論理を含まない(例えば、ALUは存在しない)。しかしながら、個々のメモリアクセスユニット(M)が各ハロー領域位置に存在し、個々のハローレジスタ位置はメモリからデータを個別にロードし、データをメモリに格納できる。
【0041】
アレイの各行および/もしくは各列またはその一部分に結合されるランダムアクセスメモリ407によって追加のスピルオーバールームが提供される(例えば、ランダムアクセスメモリは、4つの実行レーン行状と2つの実行レーン列状にまたがる実行レーンアレイの「領域」に割り当てられてもよい。簡略化のために、アプリケーションの残りの部分は、主に、行および/または列に基づく割り当てスキームを指す)。ここで、実行レーンのカーネル動作が、それが(一部の画像処理ルーチンが必要とする場合がある)二次元シフトレジスタアレイ406の外にあるピクセル値を処理することを必要とする場合、画像データの面は、ハロー領域409からランダムアクセスメモリ407にさらにこぼれ出ることができる。例えば、ハードウェアが実行レーンアレイの右端の実行レーンの右側にわずか4つの記憶素子のハロー領域を含む場合の6X6ステンシルを考える。この場合、ステンシルを完全に処理するために、データをハロー409の右端からさらに右側にシフトする必要があるであろう。ハロー領域409の外側にシフトされたデータは、ランダムアクセスメモリ407にこぼれ出る。ランダムアクセスメモリ407および
図3のステンシルプロセッサの他の適用例を以下でさらに説明する。
【0042】
図5aないし
図5kは、上述のように実行レーンアレイ「の下で」二次元シフトレジスタアレイ内で画像データがシフトされる態様の実施例を示す。
図5aにおいて見られるように、二次元シフトアレイのデータ内容は第1のアレイ507に示され、実行レーンアレイはフレーム505によって示される。また、実行レーンアレイ内の2つの近隣の実行レーン510が簡略化して示されている。この簡単な図示510では、各実行レーンは、シフトレジスタからデータを受け付け、ALU出力からデータを受け付け(例えば、サイクルにわたってアキュムレータとして動作する)、または出力データを出力先に書き込むことができるレジスタR1を含む。
【0043】
各実行レーンはまた、ローカルレジスタR2において、二次元シフトアレイにおけるそれ「の下の」内容が利用可能である。したがって、R1は実行レーンの物理レジスタであり、R2は二次元シフトレジスタアレイの物理レジスタである。実行レーンは、R1および/またはR2によって提供されるオペランドに対して動作可能なALUを含む。さらに詳細に後述するように、一実施形態では、シフトレジスタは、実際にはアレイ位置ごとに複数の(ある「深さ」の)記憶/レジスタ素子で実現されるが、シフト動作は記憶素子の1つの面に限られる(例えば、記憶素子の1つの面のみがサイクルごとにシフトすることができる)。
図5aないし
図5kは、それぞれの実行レーンから結果のXを格納するために使用されるとしてこれらのより深いレジスタ位置の1つを示している。例示を容易にするために、より深い結果のレジスタは、その対応するレジスタR2の下ではなく、その横に図示されている。
【0044】
図5a〜
図5kは、実行レーンアレイ内に示された実行レーン位置511の対に中心位置が整列された2つのステンシルの計算に焦点を当てている。例示を容易にするために、実行レーン510の対は、実際には、以下の例によれば、それらが垂直方向の近隣実行レーンである場合に、水平方向の近隣実行レーンとして図示されている。
【0045】
図5aで最初に見られるように、実行レーンはそれらの中央のステンシル位置上に中心を配される。
図5bは、両方の実行レーンによって実行されるオブジェクトコードを示す。
図5bにおいて見られるように、両方の実行レーンのプログラムコードは、シフトレジスタアレイ内のデータを、1つの位置だけ下にシフトさせ、1つの位置だけ右にシフトさせる。これにより、両方の実行レーンがそれらのそれぞれのステンシルの左上隅に整列される。次に、プログラムコードは、(R2において)それらのそれぞれの位置にあるデータをR1にロードさせる。
【0046】
図5cに示すように、次にプログラムコードは、実行レーンの対に、シフトレジスタアレイ内のデータを1単位だけ左にシフトさせ、各実行レーンのそれぞれの位置の右の値を各実行レーンの位置にシフトさせる。R1の値(以前の値)は、次いで、(R2における)実行レーンの位置にシフトした新しい値とともに加算される。結果はR1に書き込まれる。
図5dで見られるように、
図5cについて上述したのと同じプロセスが繰り返され、結果のR1に対して、今度は上側実行レーンにおける値A+B+C、および下側実行レーンにおけるF+G+H値を含ませるようにする。この時点で、両方の実行レーンはそれらのそれぞれのステンシルの上側の行を処理している。(左側に存在する場合には)実行レーンアレイの左側でハロー領域に、またはハロー領域が存在しない場合にはランダムアクセスメモリにこぼれ出ることは、実行レーンアレイの左側には存在しないことに注目されたい。
【0047】
図5eに示すように、次に、プログラムコードは、シフトレジスタアレイ内のデータを1単位だけ上にシフトさせ、両方の実行レーンをそれらのそれぞれのステンシルの中間行の右端に整列される。両方の実行レーンのレジスタR1は、現在、ステンシルの最上行および中間行の一番右の値の合計を含む。
図5fおよび
図5gは、両方の実行レーンのステンシルの中間行にわたって左方向に移動する継続的な進行を示す。累積加算は、
図5gの処理の終了時に、両方の実行レーンがそれらのそれぞれのステンシルの最上行の値と中間行の値との合計を含むように、継続する。
【0048】
図5hは、各実行レーンをそれの対応するステンシルの最下行に整列させる別のシフトを示す。
図5iおよび
図5jは、両方の実行レーンのステンシルの過程にわたって処理を完了するための継続的なシフトを示す。
図5kは、各実行レーンをデータアレイにおいてそれの正しい位置に整列させ、その結果をそこに書き込むための追加のシフトを示す。
【0049】
図5a〜
図5kの例では、シフト動作のためのオブジェクトコードは、(X、Y)座標で表されるシフトの方向および大きさを識別する命令フォーマットを含むことができることに留意されたい。例えば、1つの位置分の上方向シフトのためのオブジェクトコードは、オブジェクトコードでSHIFT0,+1として表現されてもよい。別の例として、1つの位置分の右方向へのシフトは、オブジェクトコードでSHIFT+1,0として表現されてもよい。様々な実施形態では、より大きい大きさのシフトも、オブジェクトコードで指定することができる(例えば、シフト0,+2)。ここで、2Dシフトレジスタハードウェアが1サイクルにつき1つの位置だけしかシフトをサポートしない場合、命令は機械によって複数のサイクル実行を要求するように解釈されてもよく、または2Dシフトレジスタハードウェアは、1サイクルにつき2つ以上の位置分シフトをサポートするように設計されてもよい。後者の実施形態はより詳細にさらに下に記載される。
【0050】
図6は、アレイ実行レーンおよびシフトレジスタ構造の単位セルの別のより詳細な図を示す(ハロー領域のレジスタは、対応する実行レーンを含まない)。実行レーンおよび実行レーンアレイの各位置に関連するレジスタ空間は、一実施形態では、実行レーンアレイの各ノードで、
図6に示す回路系をインスタンス化することによって実施される。
図6に示すように、単位セルは、4つのレジスタR2〜R5からなるレジスタファイル602に結合される実行レーン601を含む。任意のサイクルの間、実行レーン601は、レジスタR1〜R5のいずれかから読み書きすることができる。2つの入力オペランドを必要とする命令の場合、実行レーンはR1〜R5のいずれかからオペランドの両方を取り出すことができる。
【0051】
一実施形態では、二次元シフトレジスタ構造は、近隣のレジスタファイル間のシフトが同じ方向にあるように(例えば、すべての実行レーンは左にシフトする、すべての実行レーンは右にシフトするなど)、それの近隣のレジスタファイルが入力マルチプレクサ604を介する場合に、単一のサイクルの間に、レジスタR2〜R4のいずれか(ただ)1つの内容が、出力マルチプレクサ603を介してその近隣のレジスタファイルの1つにシフト「アウト」され、対応するものからシフト「イン」される内容でレジスタR2〜R4のいずれか(ただ)1つの内容が置き換えられることによって、実現される。同じレジスタがその内容がシフトアウトされて同じサイクルでシフトインされる内容で置き換えられるのが一般的であるかもしれないが、マルチプレクサ構成603,604は、同じサイクル中に同じレジスタファイル内で異なるシフトソースおよびシフトターゲットレジスタを可能にする。
【0052】
図6に示すように、シフトシーケンスの間、実行レーンは、内容をそのレジスタファイル602からその左、右、上および下の近隣のレジスタファイルにシフトアウトする。同じシフトシーケンスと関連して、実行レーンは、さらに、内容をその左、右、上および下の近隣のレジスタファイルの特定のものからそれのレジスタファイルにシフトする。再び、シフトアウトターゲットおよびシフトインソースは、すべての実行レーンについて同じシフト方向と整合しなければならない(例えば、シフトアウトが右隣に対する場合、シフトインは左隣からでなければならない)。
【0053】
一実施形態では、1サイクルにつき1つの実行レーンにつき1つのレジスタの内容だけをシフトすることが許されるが、他の実施形態では、2つ以上のレジスタの内容をシフトイン/アウトすることが許されてもよい。例えば、
図6に示されたマルチプレクサ回路系603,604の第2の例が
図6の設計に組み込まれる場合、同じサイクルの間に2つのレジスタの内容がシフトアウト/インされてもよい。もちろん、1つのレジスタの内容だけがサイクルごとにシフトされることが許される実施形態では、数学的演算間のシフトのためにより多くのクロックサイクルを消費することによって、複数のレジスタからのシフトが数学的演算間に起こってもよい(例えば、2つのレジスタの内容が、数学的演算間で2つのシフト演算を消費することによって数学的演算間でシフトされてもよい)。
【0054】
実行レーンのレジスタファイルのすべての内容未満がシフトシーケンス中にシフトアウトされる場合、各実行レーンのシフトアウトされないレジスタの内容は適所に残る(シフトしない)ことに留意されたい。したがって、シフトインされる内容と置き換えられないシフトされない内容は、シフトサイクルにわたって実行レーンにローカルに維持される。各実行レーンで見られるメモリユニット(「M」)は、データを、実行レーンアレイ内の実行レーンの行および/または列に関連付けられるランダムアクセスメモリ空間からロードまたはそれに格納するために使用される。ここで、Mユニットは、実行レーンの自身のレジスタ空間からロードまたはそれに格納できないデータをロード/格納するためによく使用されるという点で、標準的なMユニットとして機能する。様々な実施形態では、Mユニットの主な動作は、ローカルレジスタからメモリにデータを書き込み、メモリからデータを読み出してそれをローカルレジスタに書き込むことである。
【0055】
ハードウェア実行レーン601のALUユニットによってサポートされるISAオペコードに関して、様々な実施形態において、ハードウェアALUによってサポートされる数学的オペコードは、仮想実行レーンによってサポートされる数学的オペコード(例えば、ADD、SUB、MOV、MUL、MAD、ABS、DIV、SHL、SHR、MIN/MAX、SEL、AND、OR、XOR、NOT)と一体的に結び付けられる(例えば実質的に同じである)。上述のように、メモリアクセス命令は、実行レーン601によって実行され、データをそれらの関連付けられるランダムアクセスメモリからフェッチまたはそれに格納することができる。さらに、ハードウェア実行レーン601は、シフト演算命令(右、左、上、下)をサポートし、二次元シフトレジスタ構造内でデータをシフトする。上述したように、プログラム制御命令は主にステンシルプロセッサのスカラープロセッサによって実行される。
【0056】
c.画像プロセッサおよびラインバッファユニット動作の構成
図7は、仮想画像処理環境701と、実際の画像処理ハードウェア703と、仮想処理環境701のために書かれたよりハイレベルのコードを、実際のハードウェア703が物理的に実行するオブジェクトコードに変換するためのコンパイラ702とを含む、画像プロセッサ技術プラットフォームのハイレベル図である。以下でより詳細に説明するように、仮想処理環境701は、アプリケーションの構成プロセスの容易な視覚化のために開発および調整できるアプリケーションの点で、広く汎用性が高い。開発者704によるプログラムコード開発努力が完了すると、コンパイラ702は、仮想処理環境701内で書かれたコードを、実際のハードウェア703に対して対象とされるオブジェクトコードに変換する。
【0057】
様々な実施形態において、ハードウェアプラットフォーム用に書かれたプログラムコードは、その命令フォーマットが入力および出力アレイ位置、例えば、X、Y座標を特定するロードおよびストア命令を有する命令セットを含む一意的な仮想コードで書かれる。様々な実施態様において、X、Y座標情報は実際にはハードウェアプラットフォームにプログラミングされ、そのコンポーネントの様々なものによって認識/理解される。これは、例えば、X、Y座標を(例えばコンパイラ内で)異なる情報に変換することとは別である。例えば、ステンシルプロセッサ内の二次元シフトレジスタ構造の場合、X、Y座標情報はレジスタシフト移動に変換される。対照的に、ハードウェアプラットフォームの他の部分は、元はより高い仮想コードレベルで表現されるX、Y座標情報を具体的に受け取り、理解してもよい。
【0058】
図8で見られるように、プログラムコード開発者は、データ位置を、X、Y座標として、特殊な命令フォーマットが仮想コードレベルにある状態で、表現する(801)。コンパイル段階の間に、仮想コードは、ハードウェアによって実際に処理されるプログラムコード(オブジェクトコード)と、ハードウェアの構成(例えばレジスタ)空間にロードされる対応する構成情報とに変換される。
図8に示すように、一実施形態では、特定のカーネルのためのオブジェクトコードが、ステンシルプロセッサのスカラープロセッサ805のプログラム空間にロードされる。
【0059】
構成プロセスの一部として、スカラープロセッサ805上で実行される構成ソフトウェアは、適切な構成情報811,812を、ステンシルプロセッサ802に結合されるシート生成部ユニット803と、ステンシルプロセッサ802のために新たなシートを生成して、ステンシルプロセッサ802によって生成された処理済みシートに対して動作するかまたはそれを受取るラインバッファユニット801との両方にロードする。ここで、一般的に、シートを依然として全体画像のX、Y座標に関して企図することができる。すなわち、一旦画像またはフレームが(例えば、行当たりのピクセル数、行数、列当たりのピクセル数および列数に関して)規定されても、画像のどの部分または位置も、依然としてX、Y座標で言及され得る。
【0060】
このように、様々な実施形態では、シート生成部ユニット803およびラインバッファユニット801のいずれかまたは両方は、情報811,812が、画像またはフレームの特定の位置および/または領域(例えば、ライングループ、シート)がX、Y座標で識別される情報プラットフォームを確立するそれらのそれぞれの構成空間806,807内にある状態で、構成されている。様々な実現例/用途において、X、Y座標は、仮想コードレベルで表現される同じX、Y座標であってもよい。
【0061】
このような情報の例は、例えば、ラインバッファユニットにおけるアクティブなライングループの数、各ライングループについての画像サイズ(例えば、4つのX、Y座標のセット(各角に1つ)またはX、Y座標の対(1つは下側のより近くの角に、もう1つは上側のより遠い角に)として)または絶対画像幅および画像高さ、ステンシルサイズ(単一のステンシルのサイズおよび/またはステンシルプロセッサの重なり合うステンシルの領域を定義するX、Y値として表される)、シートおよび/またはライングループサイズ(例えば、画像サイズと同じ点で指定されるが、より小さい寸法を有する)などを含む。さらに、ラインバッファユニット701は、少なくともラインバッファユニット801によって管理されるライングループを書き込む作成側カーネルの数および読み取る消費側カーネルの数などの追加の構成情報でプログラミングされてもよい。画像データに関連するチャネルの数および/または寸法も、典型的には、構成情報として含まれる。
【0062】
図9aは、画像内でライングループを一例として定義するX、Y座標の使用を示す。ここで、N個のライングループ901_1,901_2,…901_Nが画像901内で見ることができる。
図9aから分かるように、各ライングループは、例えばライングループの角の点の1つ以上を規定する画像内のX、Y座標を参照することによって容易に規定することができる。したがって、様々な実施形態では、特定のライングループを規定するために使用されるライングループの名称または他のデータ構造は、そのライングループを特に識別するためにそれに関連付けられたX、Y座標位置を含むことができる。
【0063】
図8を簡単に参照すると、
図8は、ランタイム中、シート生成部803は、例えば、所望のデータ領域を規定するX、Y座標情報を含むことによって、ラインバッファユニット801から「次の」ライングループ(またはライングループの一部)を要求することができることを示す。
図9aは、画像データの完全な行のみからなる名目上「全幅」のライングループを示す。「仮想的に高い」と呼ばれる代替構成では、ラインバッファユニット801は、最初に画像データの全幅の行としてライングループの第1の上側部分のみを通過させる。ライングループの後続の下側の行が、次いで、全幅の行よりも小さい連続した塊でシート生成部によって具体的に要求され、別個に要求される。したがって、完全なライングループを得るために、シート生成部によって複数の要求が行われる。ここで、各そのような要求は、次の下側部分に起因するX、Y座標によって次の部分を規定してもよい。
【0064】
図9bに示すように、ラインバッファユニットは、ライングループ902_1〜902_Nが格納されるメモリ901(例えば、スタティックまたはダイナミックランダムアクセスメモリ(SRAMまたはDRAM))を含む。メモリ901は、ラインバッファユニット(ならびに例えばシート生成部およびステンシルプロセッサ)を実現する同じ回路系と共にオンチップで、またはオフチップで実現されてもよい。
図9bは、メモリ901内において特定の画像/フレームについてライングループ902_1〜902_Nを作成および消費する様々なカーネル間のアクティビティを示す。
【0065】
図9bで見られるように、作成側カーネルK1は、別々の時間インスタンスP1、P2〜PNにわたって、新たなライングループをメモリ901における格納のためにラインバッファユニット901に送信する。作成側カーネルK1は、新たなデータシートを生成するステンシルプロセッサ上で実行される。ステンシルプロセッサに結合されるシート生成部はシートを集積してライングループを形成し、ライングループをラインバッファユニットに転送し、ラインバッファユニットはそれらをメモリに格納する。
【0066】
また、
図9bに示すように、作成側カーネルK1によって生成されたライングループ902_1〜902_Nに対して動作する2つの消費側カーネルK2、K3が存在する。ここで、消費側カーネルK2およびK3は、それぞれ時間C21およびC31で第1のライングループ902_1を受け取る。明らかに、時間C21およびC31は時間P1の後に生じる。他の制約は存在しなくてもよい。例えば、時間C21および/または時間C31は、時間P2からPNのいずれかの前または後に生じてもよい。ここで、カーネルK2およびK3のためのそれぞれのシート生成部は、それらのそれぞれのカーネルに適した時間に次のライングループを要求する。カーネルK2、K3のいずれかが時間P1の前にライングループ902_1を要求すると、ライングループ902_1が実際にメモリ901に書き込まれるまで、要求はアイドル状態にされる。
【0067】
おそらく、全てのライングループ902_1〜902_Nに対するカーネルK2およびK3の一方または両方からの要求は、時間P1の前に到着し得る。したがって、ライングループは、いつでも消費側カーネルによって要求され得る。しかしながら、消費側カーネルがライングループを要求すると、ライングループは、作成側カーネルK1がそれらを生成することができるレートを条件として、消費側カーネルに転送される。様々な実施形態では、消費側カーネルは順番にライングループを要求し、同様にそれらを順番に受け取る(カーネルK2は、ライングループ902_2〜902_Nを時間C22〜C2Nでシーケンスで受け取る)。簡略化のために、特定のライングループに対して1つの作成側カーネルしか示されていない。異なる作成側が同じライングループに書き込むことができるように様々な実施形態を設計することが考えられる(例えば、すべての作成側がライングループに書き込んでしまうまで消費側にサービスを提供することが許可されていない場合など)。
【0068】
(消費側カーネルがプロセッサのDAG処理フローにおける最初のカーネルであるため)作成側カーネルが存在しない場合、画像データのフレームは、メモリ901に(例えば、ダイレクトメモリアクセス(DMA)を介して、またはカメラから)転送され、ライングループに解析されてもよい。(作成側カーネルがプロセッサの全体的なプログラムフローの最後のカーネルであるため)消費側カーネルが存在しない場合、結果のライングループを組み合わせて出力フレームを形成してもよい。
【0069】
d.カーネルの適用および構造
図10aは、仮想環境内で書かれたアプリケーションソフトウェアが取ることができる構造および形態の例を示す。
図10aにおいて見られるように、プログラムコードは、入力画像データ1001の1つ以上のフレームを処理して、入力画像データ1001上で何らかの全体的な変換を行い得る。変換は、開発者によって明示されたオーケストレーションされたシーケンスで入力画像データに対して動作するプログラムコード1002の1つ以上のカーネルの動作によって実現される。
【0070】
例えば、
図10aにおいて見られるように、最初に第1のカーネルK1で各入力画像を処理することによって全体の変換が行われる。カーネルK1によって生成された出力画像は、カーネルK2によって操作される。カーネルK2によって生成された出力画像の各々は、カーネルK3_1またはK3_2によって操作され、カーネルK3_1/K3_2によって生成された出力画像は、カーネルK4によって操作される。カーネルK3_1およびK3_2は、K3ステージで並列処理を課すことによって全体の処理を高速化するように設計された同一のカーネルであってもよいし、異なるカーネルであってもよい(例えば、カーネルK3_1は第1の特定タイプの入力画像で動作し、カーネルK3_2は第2の異なるタイプの入力画像で動作する)。
【0071】
このように、全体的な画像処理シーケンスが大きくなると、画像処理パイプラインまたは有向非循環グラフ(DAG)の形を取り得、開発環境は、開発されているプログラムコードのそのようなものとしての表現を実際に開発者に提示するよう備えられてもよい(ここでは、パイプラインはDAGの一形態であると理解される)。カーネルは、開発者によって個々に開発されてもよく、ならびに/または任意の基礎となる技術を供給するエンティティ(実際の信号プロセッサハードウェアおよび/もしくはその設計など)および/もしくは第三者(例えば、開発環境向けに作成されたカーネルソフトウェアのベンダー)によって提供されてもよい。したがって、名目上の開発環境には、開発者がより大きな開発努力の全体的な流れに影響するよう様々な方法で自由に「つなぐ」ことができるカーネルの「ライブラリ」が含まれることが期待される。そのようなライブラリの一部であると予想されるいくつかの基本的なカーネルは、以下の基本的な画像処理タスク:畳み込み、ノイズ除去、色空間変換、エッジおよびコーナー検出、シャープニング、ホワイトバランス、γ補正、トーンマッピング、行列乗算、画像レジストレーション、ピラミッド構築、ウェーブレット変換、ブロック状離散コサイン、およびフーリエ変換のうちの1つ以上を提供するようカーネルを含んでもよい。
【0072】
上述したように、様々な実施形態において、各カーネルはそれ自体のステンシルプロセッサ上で動作する。例えば、
図10aを参照すると、カーネルK1は第1のステンシルプロセッサ上で動作し、カーネルK2は第2のステンシルプロセッサ上で動作する。さらに、上述したように、作成側カーネルおよび消費側カーネルはラインバッファユニットを介してインタフェースする。
【0073】
図10bは、
図10aのDAGフローを実現すべくどのように画像プロセッサを構成することができるかを示している。
図10bに示すように、ラインバッファユニット1001_1(LBU_1)は、入力画像ストリームを受信し、受信したフレームをライングループに解析する。スイッチングネットワークは、ライングループを、LBU_1から、カーネルK1が実行される第1のステンシルプロセッサ1002_1にルーティングするように構成される。カーネルK1からの出力画像はライングループにフォーマットされ、第2のラインバッファユニット1001_2(LBU_2)に転送される。これらのライングループは、次いで、カーネルK2が実行される第2のステンシルプロセッサに転送される。
【0074】
図10aから、画像情報は、カーネルK2からカーネルK3_1またはK3_2のいずれかに「分割」され得る。ここで、例えば、カーネルK3_1およびK3_2は、処理されている全体画像に関連付けられる異なるチャネルを処理してもよい。例えば、カーネルK3_1は赤(R)画像を処理し、カーネルK3_2は緑(G)および青(B)画像を処理することができる。代替的に、K3_1は視覚画像を処理することができ、カーネルK3_2は(例えば、視覚画像と共に飛行時間深度撮像カメラから取得される)深度画像を処理することができる。いずれにせよ、画像のすべてのチャネルはカーネルK1およびK2によって処理されるが、画像の異なるチャネルは異なるカーネルK3_1およびK3_2で処理される。さらに、カーネルK3_1およびK3_2は、同じ(例えば、非常に数値的に集中的な)プログラムコードの別個のインスタンスであってもよく、2つのステンシルプロセッサを用いて、K3機能の処理を、それを並列に実行することによって高速化する。
【0075】
いずれにせよ、前述の「分割」により、カーネルK2からの一部のライングループ画像情報が第3のラインバッファユニット1001_3(LBU_3)にバッファリングされ、カーネルK2からの他のライングループ画像情報が第4のラインバッファユニット1001_4(LBU_4)にバッファリングされる。LBU_3ラインバッファユニットにバッファリングされるライングループは、カーネルK3_1が実行される第3のステンシルプロセッサ1002_3に転送される。LBU_4ラインバッファユニットにバッファリングされるライングループは、カーネルK3_2が実行される第4のステンシルプロセッサ1002_4に転送される。カーネルK3_1およびK3_2からの出力ライングループは、第5および第6のラインバッファユニット1001_4(LBU_5)、1001_5(LBU_6)にそれぞれバッファリングされる。次に、LBU_5およびLBU_6ラインバッファユニットからのライングループは、カーネルK4を実行する第5のステンシルプロセッサ1002_5に渡される。分割されたライングループは、第5のステンシルプロセッサ1002_5で再びマージされることに留意されたい。
【0076】
図11aおよび
図11bは、各ステンシルプロセッサが直前のステージからライングループを受け取り、直後のステージのために提供する、より直接的なパイプライン手法に関する。具体的には、ラインバッファユニット1101_1(LBU_1)、1101_2(LBU_2)、1101_3(LBU_3)、1101_4(LBU_4)は、それぞれカーネルK1、K2、K3、K4を実行するステンシルプロセッサ1102_1,1102_2,1102_3,1102_4にそれぞれ供給を行なう。ステンシルプロセッサ1102_1,1102_2,1102_3,1102_4も、それぞれラインバッファユニット1101_2(LBU_2)、1101_3(LBU_3)、1101_4(LBU_4)、1101_5(LBU_5)に供給を行なう。
【0077】
図11cは、本質的に2つのパイプラインを並列(K1−K3−…)および(K2−K4−…)で実行する別のパイプライン手法を示す。この構成を用いてパイプラインを並列実行で高速化できる(例えば、カーネルK1およびK2は同じであり、カーネルK3およびK4は同じである)か、または画像データコンテキストに応じて2つの異なるパイプラインが使用される(例えば、1つのパイプラインは1種類のチャネルを処理し、他のパイプラインは他の種類のチャネルを処理する)。
【0078】
図11a、
図11b、
図11cの各図において、ステンシルプロセッサをソースライングループおよびシンクライングループに適切な態様で接続するために接続ネットワーク1004/1104に行われる必要がある異なる構成に注目されたい。
【0079】
様々な実施形態では、画像プロセッサは適切な構成空間を含み(例えば、構成レジスタおよび/またはランダムアクセスメモリ(スカラープロセッサのスカラーメモリなど)で実現される)、無数の様々な構成(例えば、DAG、画像処理パイプライン)のいずれかを実現するための構成情報をそこに保持する。いくつかの例示的な構成パラメータには、以下が含まれる:1)ソース画像の数(例えば、カメラまたはより大きなコンピュータシステムのメインメモリからシステムに流入するソース画像フレームの数);2)ライングループの数(システムにおいてラインバッファユニット内で構成されるライングループの総数)。3)アクティブなステンシルプロセッサの数(システムにおいてアクティブなステンシルプロセッサの総数);4)ステンシルプロセッサごとの入力ライングループの数(1つのステンシルプロセッサは2つ以上の入力画像フレームを処理でき、Num_Input_LGs_perStencilは本質的にステンシルプロセッサが処理する異なる入力画像フレームの数を示す);5)ステンシルプロセッサごとの出力ライングループの数(1つのステンシルプロセッサは2つ以上の出力画像フレームを処理でき、Num_Output_LGs_perStencilは本質的にステンシルプロセッサが処理する異なる出力画像フレームの数を示す);6)ライングループごとの消費側数(各ラインバッファユニットにおいて構成される各ライングループについて、Num_Cons_per_LGはライングループの消費側数を示す)。他のタイプの構成情報が、上述のシステムの任意の特徴、構造、または動作に基づいてシステムによって受け入れられてもよい。
【0080】
e.自動化されたDAG/コードライン再構成プロセス
前述の画像プロセッサの構成および動作の基本原理を前節で説明したが、本節では、カーネルのDAGのより効率的な全体的な実装を行うために、コンパイラがDAGに対して実行できる、ある再構成プロセスについて説明する。上記で示唆したように、パイプラインはDAGの一形態であると理解される。
【0081】
ここで、コンパイラは、ある非効率的なDAG構造または問題のあるDAG構造を認識し、自動的にDAGを再構成して、非効率性を低減し、および/または問題を排除するようにプログラムすることができる。様々な実施形態では、ソフトウェアプログラム開発ツールによって、プログラム開発者は、コンパイラが非効率性に対処するために以下にさらに記載されるプログラムコードへの1つ以上の変換を実行するために使用することができるヒントを提供することができる。
【0082】
コンパイラによって検出され応答され得るDAGにおける非効率性または問題の例としては、(1)DAGにおける他のカーネルと比較して特に計算上複雑なカーネル、(2)画像プロセッサ内のステンシルプロセッサよりも多いまたは少ないカーネルを含むDAG、(3)限定されたラインバッファユニットメモリ空間および/または限定された命令メモリ空間、が含まれるが、それらに限定はされない。
図12/a/b/cから
図16は、コンパイラがこれらの非効率性/問題に対応して実施するように設計されてもよい再構成のいくつかを説明している。
【0083】
図12aおよび
図12bは、「水平融合」コード再構成を対象としている。水平融合の場合、
図12aに示されるように、例えば同じカーネルから各々流れるDAGの複数のカーネルが単一のカーネルにマージされる。ここで、
図12aは、元のコードシーケンス1201が別々のK2およびK3カーネルを有するのを示す。コンパイラによる再構成の後、カーネルK2およびK3が単一のカーネルK2/K3に結合される新しいコードシーケンス1202が作成される。
【0084】
水平融合は、例えば、他のカーネルと比較して、DAG/パイプラインにおける、より小さいカーネルの存在に応答して、コンパイラによって実行されてもよい。ここで、カーネルの融合は、他のカーネルと比べてサイズ/演算負荷がより匹敵する、より大きなカーネルを生成する。代替的に、または組み合わせて、コンパイラは、ステンシルプロセッサよりも元のDAG内により多くのカーネルが存在することに応答して、水平方向の融合を実行することができる。ここで、融合は、DAG内のカーネルの総数を低減することになる(理想的には、画像プロセッサ内のステンシルプロセッサの数をもはや超えないようにする)。
【0085】
様々な実施形態では、水平融合は、互いに独立した複数のカーネルのプログラムコードをマージする(例えば、マージされる2つのカーネルのうち、第1のカーネルは第2のカーネルによって生成された情報を入力として受け入れない)。さらに、水平に融合されたカーネルは、同じカーネルからの入力情報を受け入れ、および/または同じカーネルによって消費される出力情報を提供することができる。前者は
図12aに示されており、融合されたカーネルK2およびK3は共にカーネルK1からの入力情報を受け入れる。
【0086】
図12bは、水平融合の実現例の実施形態を示す。ここで、新しく構築されたK2/K3カーネルは、融合されているカーネルの連結として設計される。すなわち、
図12bの実施形態では、新たなカーネルK2/K3は、カーネルK2に対するプログラムコードが1203を実行した直後に実行を開始するカーネルK3に対するプログラムコードから構成される。特に、新たなカーネルK2/K3は、カーネルK2とK3との組み合わせと同じ入力情報を受け入れ、カーネルK2とK3との組み合わせと同じ出力情報を提供する。再び、入力は、同じまたは異なるラインバッファユニットから受信されてもよく、出力は、それらのそれぞれの出力を同じまたは異なるラインバッファユニットに提供してもよい。
【0087】
ここで、
図12aを参照すると、カーネルK1が2つの異なるラインバッファユニット(K2に供給する第1のラインバッファユニットおよびK3に供給する第2のラインバッファユニット)に対してラインバッファデータを生成する場合、プログラムフローの変更は必要ない(カーネルK2/K3のK2部分は、K2のために生成するラインバッファユニットから読み出し、カーネルK2/K3のK3部分は、K3のために生成するラインバッファから読み出す)。両方のカーネルK2およびK3がカーネルK1からの同じデータの消費側である場合(すなわち、カーネルK1が1つのラインバッファユニットにのみ書き込みを行い、そのラインバッファユニットからK2およびK3の両方が読み出す場合)も、プログラムのデータフローを変更する必要はない。この場合、カーネルK2/K3のK2部分およびK3部分は、同じラインバッファユニットから消費する。カーネルK2/K3の出力ラインバッファユニットにも同様のアナロジーが適用される。
【0088】
様々な実施形態において、コンパイラは、融合されたカーネルが従って動作する空間率(カーネル呼び出しごとに処理されるピクセル)を意識すべきである。ここで、融合されているカーネルは、必ずしも最初に書き込まれたのと同じ率で動作しなくてもよい。例えば、画像解像度の違いにより、それらはそれらのそれぞれのアルゴリズムを実行する際に同じサイクル数を消費しなくてもよい。例えば、ダウンサンプリングカーネルは、ダウンサンプリングしない他のカーネルよりも多くの二次元シフトレジスタシフト動作を必要とする、より広い画像領域にわたって動作しなければならなくてもよい。
【0089】
結果として、ダウンサンプリングカーネルは、それが完了する前に、ダウンサンプリングしないカーネルよりも多くの呼び出しを消費する。例えば、ダウンサンプリングカーネルは、それが完了する前に16サイクルを消費してもよく、非ダウンサンプリングカーネルは、それが完了する前に4サイクルしか消費しなくてもよい。完了率の違いは、1つの完了あたりのサイクルがカーネル全体のランレングスにわたって一定であることを期待するラインバッファユニットとタイミング問題を引き起こす可能性がある。したがって、コンパイラは、カーネルが、それらのそれぞれのアルゴリズムを完全に実行するのにほぼ同数のサイクルを消費するように、カーネルのコードを修正する。このようにすることで、ラインバッファは、中間カーネル実行中に劇的に異なるカーネルアルゴリズム完了率に調整する必要がなくなる。
【0090】
したがって、一実施形態では、コンパイラは、1つの完了につき、より少ないサイクルを消費するカーネルに1つ以上のループを追加して、たとえば、そのカーネルが、1つの完了につき、より多くのサイクルを消費するカーネルと同じ数のサイクルを消費するようにする。例えば、上記の例では、非ダウンサンプリングカーネルは、それが完了する前にそれのアルゴリズムの4つのループを通して実行されるように修正されることになる。1回の実行ランに対するそれの元のバージョンに比べて、4回、データが、修正されたカーネルによって作成されるが、修正されたカーネルはそれが完了する前に16サイクルを消費することになり、それはダウンサンプリングカーネルと同じである。おそらく、コンパイラは、複数のカーネルの率を変更して、すべてのカーネルが率を一致させることができる、サイクルを共通に支配するものに到達すると考えられる。
【0091】
図13a〜
図13cは垂直融合に関する。垂直融合の場合、
図13aで見られるように、融合されているカーネル間に作成側/消費側関係が存在する。例えば、
図13aで見られるように、カーネルK1はカーネルK2に対する作成側である(カーネルK2はカーネルK1の消費側である)。カーネルによる再構成の後、融合されたカーネルK1およびK2の機能を実行する新たなカーネルK1/K2が生成される。
【0092】
図13bは新たなカーネルの構成を示す。ここで、消費カーネルK2は、カーネルK1の後に連結され、正しい作成側/消費側関係をもたらす。新たなカーネルK1/K2に対する入力はカーネルK1に対する入力に対応し、新たなカーネルK1/K2の出力はカーネルK2の出力に対応する。コンパイラは、例えば、融合されるカーネルがDAGにおける他のカーネルよりも計算上複雑でないこと、および/または画像プロセッサ内のステンシルプロセッサよりもDAGにおいてより多くのカーネルあることに応答して、垂直融合を課すことを決定することができる。
【0093】
垂直融合の場合において、垂直に融合されたカーネルの消費カーネル部分がそのタスクを実行するためにハロー領域を必要とする場合、問題が生じる可能性がある。様々な実施形態において、ステンシルプロセッサ内の二次元シフトレジスタの寸法は、出力ピクセル値が格納される領域の外側に延びるハロー領域409に対応し得ることを、上記の
図4の議論から想起されたい。
【0094】
ここで、垂直に融合されたカーネルの消費カーネル部分がハロー領域内のコンテンツを必要とする場合、それは、作成カーネル部分の出力に対して直ちに動作することはできない。つまり、作成側によって生成された出力データは実行レーンの「下」に保持され、ハロー領域に拡張しないことになる。消費カーネル部分がハロー領域内の画像データを必要とする場合、消費カーネル部分が、作成側からの結果の出力での動作を、それが生成された直後に開始する場合、ハローデータは利用できないことになる。
【0095】
解決策は、消費カーネル部分の開始を遅延させて、消費カーネルが動作を開始するまでに、ハロー領域データが作成側カーネル部分によって確実に生成されるようにすることである。
図13cは、解決策の例示的な図を示す。ここで、縁取りされた領域1301は作成側カーネル部分の実行レーン領域に対応し、縁取りされた領域1302は作成側カーネル部分の実行レーン領域1301の外部に存在するハロー領域に対応する。
【0096】
対照的に、縁取りされた領域1303は、作成側カーネル部分が領域1301内の出力を生成した後に消費カーネル部分が動作している実行レーン領域に対応する。縁取りされた領域1304は、消費側カーネル部分の実行レーン領域1303の周りに存在するハロー領域に対応する。
図13cは、ステンシル処理が同じ行のシートに沿って左から右への態様でシートに対して動作し、そのシートの行に対する処理が完了すると、次のシートの行に対して処理が開始される、と仮定する。
【0097】
領域1301と1303との間に存在するオフセットまたは位相差は、消費カーネル部分に利用可能であり、
図13cに見られる相対的な位置決めオフセットを有する出力が作成カーネル部分によって生成されるまで、消費カーネル部分の開始を遅らせることによって、慎重に課される。注目すべきは、このオフセットで、作成側カーネルによって生成され、消費カーネル部分に利用可能な画像データ出力は、消費カーネル部分の実行レーン領域1303だけでなく、それのハロー領域1304も「充填」する。このように、消費カーネル部分は、領域1303についての出力値を適切に計算するためにそれが必要なデータを有し、K1にK2が続く連結演算の後にK1の次の実行が試みられることが許容される。
【0098】
公称の実施形態では、作成側カーネルはその出力データをラインバッファユニットに書き込み、消費カーネルはその同じラインバッファユニットからデータを読み出す。しかしながら、作成カーネル部分をおよび消費カーネル部分が今融合され同じステンシルプロセッサ上で実行される結果として、作成カーネル部分によって生成された出力データは、ラインバッファユニットに書き戻されるのではなく、ステンシルプロセッサにローカルに(例えばステンシルプロセッサRAM407および/またはシート生成部メモリ内に)留まり得る。したがって、ラインバッファユニットからデータを読み出すのではなく、消費カーネル部分は、代わりに、ステンシルプロセッサにローカルなメモリから出力データを読み出す。
【0099】
したがって、ステンシルプロセッサとラインバッファユニットとの間の書き込み/読み出しシーケンス全体を回避することができる。作成カーネル部分の出力を消費するが、その作成カーネル部分とは融合されなかった他の消費側が存在する実施形態では、作成カーネル部分の出力はラインバッファユニットに外部的に書き込まれ、外部の消費カーネルは作成側のデータを受け取ることができる。
【0100】
図13cは、同様の理由により、ステンシルプロセッサによって実際に処理される画像データの寸法が、処理されている画像の寸法を超えていることも示している。具体的には、追加の空間領域1305,1306が作成側カーネル部分によって処理され、作成側カーネル部分は消費側カーネル部分によって必要とされるハローデータを生成することができる。
【0101】
図14は、「カーネル分裂分割」と呼ぶことができる別の制限を示す。カーネル分裂分割の場合、より大きなカーネルは複数のより小さなカーネルに分解される。例えば、
図14に示すように、サブグラフA〜Fを有する大きな初期カーネルKは、2つのカーネルK1およびK2に分解され、新たなカーネルK1はサブグラフA〜Dを含み、新たなカーネルK2はサブグラフEおよびFを含む。カーネル分裂分割がコンパイラによって課され得るのは、たとえば、分割されるカーネルKがDAG内の他のカーネルよりも演算負荷が大きい場合、および/またはその命令フットプリントが大きすぎてステンシルプロセッサ命令メモリに収まらない場合である。
【0102】
再構成の一環として、「store_sheet(シート格納)」コマンド/命令および「load_sheet(シートロード)」コマンド/命令が、より大きいカーネルコードが分割された分割部で、コード全体に新たに挿入されることに注意されたい。具体的には、
図14の例から、より大きなカーネルKが分割部1401で分割されていることを観察すると、サブグラフDの出力は情報のシートを格納するように修正され、サブグラフEの入力は、情報のシートをロードするように修正されることに注目されたい。
【0103】
前述のように、ステンシルプロセッサ内に二次元シフトレジスタアレイが存在するため、画像データのシートはカーネルのための基本的な入力データ構造および出力データ構造である。したがって、カーネルがデータのシート上で動作するには、まず、データのシートをステンシルプロセッサの二次元レジスタ空間にロードしなければならない。同様に、カーネルがそれのコアアルゴリズムの1つの実行を終えると、カーネルはそれのデータの出力シートを二次元シフトレジスタからステンシルプロセッサRAMおよび/またはシート生成部RAMに書き込む。
【0104】
これらの基本的なデータ構造要件と一致して、カーネル分裂分割を課すことの一部は、新たに生成されたカーネル出力(
図14のサブグラフDの出力)および新たに生成されたカーネル入力(
図14のサブグラフEの入力)である。前者は二次元シフトレジスタアレイから出力データのシートを書き込むためにシート格納コマンドを必要とし、前者は入力データのシートを二次元シフトレジスタアレイに読み込むためにシートロードコマンドを必要とする。Store_SheetコマンドおよびLoad_Sheetコマンドは、カーネルとラインバッファユニットとの間の通信にも対応する(ラインバッファは複数のシートで構成されている)。したがって、カーネル分裂前はサブグラフDはラインバッファユニットに直接供給しなかったが、分裂後にはそうする。同様に、カーネル分裂前はサブグラフEはラインバッファユニットからは直接受け取らなかったが、融合後にはそうすることになる。
【0105】
一実施形態では、コンパイラは、新たに生成された別個のカーネルK1、K2がサイズ/演算負荷においておおよそ等しくなるように、ある領域またはより大きなカーネルKに分割部1401を課すように設計される。場合によっては、これにより、コンパイラは、反復ループを介して分割部1401を課し得る。例えば、サブグラフDおよびEは、プログラムフローがサブグラフEからサブグラフDに流れて戻るループを、ループが完了するまで実施してもよい。
【0106】
分割部1401がループを切断する場合、コンパイラは、ループ自体が分割されるようにプログラムコードをさらに修正する。ここで、
図14で観測されたカーネル分裂分割1401は、本質的に、作成側/消費側関係を有する新たなカーネルを生成することに留意されたい。すなわち、新しく作成されたカーネルK2は、カーネルK1がそれを出力ラインバッファを書き込むラインバッファユニットからカーネルK1によって作成されたラインバッファを読み出す。したがって、ループの先行の反復はK1によって実行され、ループの後続の反復はK2によって実行される。
【0107】
別の実施形態では、コンパイラは、前の反復と次の反復との間にデータ依存性を有するループを分割しようとせず、ループの全体を同じカーネル内に保持する。したがって、ループが存在すると、コンパイラが分割部1401を(ループを通る代わりにそれらの周りに)課すべく選択する場所に影響を与える可能性がある。
【0108】
図15は、「空間的区分」と呼ばれる別のコンパイラ再構成プロセスを示す。
図15で見られるように、空間的区分は、もとは、より大きい画像上で動作するように設計されたカーネルを、その画像の一部分のみで動作するように設計された、同じコアアルゴリズムの複数のカーネルに複製することを伴う。
【0109】
ここで、
図15の例示的な図示では、元のカーネルK1は、画像1501全体で動作するように設計されている。コンパイラは、DAGがK1のコードの2つのインスタンスであるK1_1およびK1_2を含むように、本質的にカーネルK1を複製する。コンパイラはさらに、新しく生成されたカーネルのベースK1コードを、それらが処理することになっている画像の部分のみを参照するように修正する。
図15の例では、カーネルK1_1は画像1501の左半分1501_1でのみ動作し、カーネルK1_2は画像1501の右半分1501_2でのみ動作する。
【0110】
したがって、コンパイラは、画像1501の左半分1501_1内に存在するラインバッファデータのみを要求するように、カーネルK1_1のカーネルコードを再構築し、画像1501の右半分1501_2内に存在するラインバッファデータのみを要求するように、カーネルK1_2のカーネルコードを再構築する。カーネルソフトウェアがラインバッファをそのX、Y座標によって参照することによって要求できることを想起すると、様々な実施形態では、コンパイラのカーネルK1およびK2の再構築は、カーネルが処理するはずの画像の部分に対応する座標を指定するためにラインバッファ要求を再フォーマットすることを伴う。
【0111】
例えば、カーネルK1_1は、画像の左半分1501_1を処理するのに十分な入力ラインバッファデータが受信されると、画像全体の幅を横切って亘る座標を要求するのを避け、代わりに画像データの次の下位行を要求する。同様に、処理するラインバッファデータの次の下位行を開始するとき、カーネルK1_2は、画像の半分に対応するX軸オフセットを有することになる(例えば、座標0,Yで次の下位のラインバッファを要求する代わりに、カーネルは、座標W/2,Yで次の下位のラインバッファを要求し、ここで、WはX軸に沿った画像1501全体の幅である)。
【0112】
要求されたラインバッファデータの座標値を微調整する前述の原理に従って、他の画像区分構成が可能である。
【0113】
典型的な実施形態では、元のカーネルK1は、単一のラインバッファユニットから画像全体を読み出し、その出力データを別の単一のラインバッファユニットに書き込むように設計された。空間的区分の後、カーネルK1_1およびK1_2の両方は、画像データが存在する単一のソースラインバッファユニットを参照し得る(または、カーネルK1_1、K2_2に対する入力画像の作成側カーネルは、カーネルKl_1およびKl_2が別々に読み出す2つの別々のラインバッファユニットに画像の2つのコピーを書き込むように再構成される)。しかしながら、
図15で見られるように、一実施形態では、カーネルK1_1およびK1_2の各々は、それらの出力データを2つの別々のラインバッファユニットLB_1およびLB_2に書き込む。
【0114】
一実施形態では、この制限が課されるのは、
図9aおよび9bに関して上述したように、ラインバッファユニットは複数の消費側に仕えることができるが、1つの作成側しか扱うことができないからである。したがって、単一のラインバッファユニットはカーネルK1_1およびK2_2の両方からの出力を処理することはできない(各カーネルはそれ自身のラインバッファユニットに書き込まなければならない)。したがって、
図15で見られるように、消費カーネルK2も、2つの異なるラインバッファユニットからそれが画像の2つの異なる半分について所望する画像データを読み取るために、空間的区分再構成の一部として再構成される(LB_1は左側の画像データを保持し、LB_2は右側の画像データを保持する)。すなわちカーネルK2は、左側の画像を望む場合にはLB_1に要求を出し、右側の画像データを望む場合にはLB_2に要求を出すように再構成される。例えば、K2のアルゴリズムが画像全体上で動作する場合には、K2を再構成して、画像半分を単一の画像に併合することもできる。
【0115】
図16は、「グラフ分割」と呼ばれる別のコード再構成プロセスに関する。グラフ分割の場合、DAGによって処理されるデータの量は、画像プロセッサの内部メモリ要件を超える。したがって、DAGは複数のDAGに分割されなければならず、各DAGは画像プロセッサの内部記憶空間の限界内にある量のデータを処理する。ここで、様々な実施形態において、ラインバッファユニット、シート生成部およびステンシルプロセッサは、各々、関連付けられるメモリを有する。単一のDAGの記憶要件がこれらのメモリの1つ以上の容量を超えると、複数のDAGが作成される。
【0116】
非常に大きな入力画像1601をはるかにより小さな、より低密度の出力画像1607にまで繰り返しダウンサンプリングすることを目的とするDAG1608が作成される例を
図16に示す。DAG/パイプライン1608は、6つのカーネルK1〜K6から構成され、各カーネルはより大きな入力画像をより小さい出力画像にダウンサンプリングする(例えば、カーネルK1はより大きな入力画像1601をより小さい画像1602に、カーネルK2は画像1602をより小さい画像1603に、カーネルK3は画像1603をより小さい画像1604ダウンサンプリングする等)。
【0117】
例えば、初期入力画像1601が非常に大きい実現例では、画像プロセッサの内部メモリ空間にすべてのデータ/命令/コンテキストを適合させることができない場合がある。したがって、それに応じて、コンパイラは、カーネルK1〜K6のメモリリソース要求を分析し、初期のより大きなDAG/パイプライン1608を、シーケンスで動作し、各々、画像プロセッサ内で利用可能なものより多くの内部メモリリソースを必要としない、より小さいDAG/パイプライン1609,1610,1611のグループに解析する。
【0118】
図1の議論から、DAGは外部メモリからラインバッファユニットへの入力データのロードで始まり、ラインバッファユニットから外部メモリへの出力データの書き込みで閉じることを想起されたい。したがって、
図16の最初のDAG/パイプライン1608は、外部メモリからの入力データをカーネルK1への入力でラインバッファユニットに転送するためのコマンド/命令を含み、ラインバッファユニットからの出力データをカーネルK6の出力で外部メモリに転送するコマンド/命令も含んだ。
【0119】
コンパイラは、元の、より大きいDAG/パイプライン1608を、より小さいDAG/パイプライン1609,1610,1611に解析した後、外部メモリからの入力データをカーネルK2およびK4の入力において(すなわち、新たな、より小さいDAG/パイプライン1610および1611の入力において)ラインバッファユニットにロードするコマンド/命令を追加的に挿入することになる。コンパイラはまた、カーネルK1およびK3の出力(すなわち、より小さい新たなDAG/パイプライン1609および1610の出力)でラインバッファユニットからの出力データを外部メモリにロードするコマンド/命令を挿入することになる。これらの新たなコマンド/命令の挿入がある場合、元のDAG/パイプライン1608は外部メモリではなくラインバッファユニットへの/からのデータの書き込み/読み出しを指定した(なぜならば、同じDAG/パイプライン内のカーネルはラインバッファユニットを介して互いを供給先/供給元とするからである)ことに注目されたい。したがって、これらの元のコマンド/命令はコンパイラによって削除されることになる。
【0120】
説明された再構成の様々なものは、上記の非効率性のいずれかに応答して最終的に実行され得ることに留意されたい。例えば、一連の融合の後、コンパイラは最終的にグラフ分割を実行することができる。
【0121】
前述の議論では、カーネルそれら自体は、最終的にオブジェクトコードにコンパイルされるとき、コードの多くの分岐および関連付けられる基本ブロックで構成される大きな複雑なソフトウェアルーチンであり得ることに注目されたい。したがって、カーネル内のサブグラフも、それら自体、最終的にオブジェクトコードにコンパイルされるとき、オブジェクトコードの複数の分岐および基本ブロックから構成され得る。
【0122】
図17aは、上述したように、例えばコンパイラによって実行される方法を示す。
図17aで見られるように、この方法は、それぞれの二次元実行レーンおよびシフトレジスタ回路構造からなるプログラマブルステンシルプロセッサを有する画像プロセッサの対象とされるプログラムコードをコンパイルすること1701を含み、このプログラムコードは、有向非循環グラフを実現し、前記ステンシルプロセッサのそれぞれで実行される複数のカーネルからなり、前記コンパイルすることは、画像プロセッサ内のステンシルプロセッサとは異なる数のカーネルがプログラムコード内に存在することを認識すること、カーネルのうちの少なくとも1つが、カーネルのうちの別のカーネルよりも演算負荷が高いことを認識すること、およびプログラムコードが画像プロセッサのメモリ容量を超えるリソース要件を有することを認識すること、のいずれかを含む。この方法はまた、上記認識のいずれかに応答して、カーネルの水平融合、カーネルの垂直融合、カーネルの1つの、複数のカーネルへの分裂、カーネルの、複数の空間的に区分されたカーネルへの空間的区分、有向非循環グラフの、より小さなグラフへの分割、のいずれかを実行すること1702を含む。
【0123】
図17bは、上述のハードウェア機能のいずれかを有する画像プロセッサなどの画像プロセッサ上で実行するためのプログラムコードをコンパイルするときに、前述のコンパイラプロセスのいずれかと共に使用することができるアプリケーションソフトウェア開発およびシミュレーション環境1721を示す。ここで、開発者は、全体的な意図された画像変換と整合する戦略的シーケンスでカーネルを配置することによって、包括的な画像処理機能(例:各ステージが専用の画像処理タスクを実行する画像処理パイプライン、他のDAG規定のルーチンセットなど)を開発することができる。カーネルはライブラリ1722から呼び出されてもよく、および/または開発者が1つ以上のカスタムカーネルを開発してもよい。
【0124】
ライブラリ1722内のカーネルは、カーネルの第三者ベンダおよび/または任意の基礎をなす技術のプロバイダによって提供されてもよい(例えば、対象とされるハードウェア画像プロセッサを含むハードウェアプラットフォームのベンダまたは対象とされるハードウェア画像プロセッサのベンダ(例えば、その設計として、または実際のハードウェアとして提供される))。
【0125】
カスタム開発されたカーネルの場合、多くの状況において、開発者は、単一のスレッド1723についてプログラムコードを書くだけでよい。つまり、開発者は、単一の出力ピクセル値を、(例えば、前述の位置相対メモリアクセス命令フォーマットで)出力ピクセル位置に対する入力ピクセル値を参照することによって決定するプログラムコードを書くだけでよい。単一スレッド1723の動作を満足すると、開発環境は、スレッドコードの複数のインスタンスをそれぞれの仮想プロセッサ上で自動的にインスタンス化して、画像表面領域上で動作するプロセッサのアレイ上でカーネルを実行することができる。画像表面領域は、画像フレームのセクション(ライングループなど)であってもよい。
【0126】
様々な実施形態では、カスタムスレッドプログラムコードは、仮想プロセッサISAのオブジェクトコード(または仮想プロセッサISAオブジェクトコードにコンパイルされる高級言語)で書かれる。カスタムカーネルのプログラムコードの実行のシミュレーションは、メモリモデルに従って編成されたメモリにアクセスする仮想プロセッサを含むシミュレートされた実行時環境において実行されてもよい。ここで、仮想プロセッサのソフトウェアモデル(オブジェクト指向型またはその他)1724およびそのモデルを組み込んだメモリ1725がインスタンス化される。
【0127】
仮想プロセッサモデル1724は、次いで、スレッドコード1723の実行をシミュレートする。スレッド、それのより大きなカーネル、およびそのカーネルが属する任意のより大きな機能の実行を満足すると、その全体が、基礎となるハードウェアの実際のオブジェクトコードにコンパイルされる。シミュレーション環境1721の全体は、コンピュータシステム(例えば、ワークステーション)1726上で実行されるソフトウェアとして実現されてもよい。
【0128】
f.実現例の実施形態
上述した様々な画像プロセッサアーキテクチャの特徴は、必ずしも従来の意味での画像処理に限定されず、したがって、画像プロセッサを再特徴付けしてもよい(またはしなくてもよい)他のアプリケーションに適用することができることを指摘することが適切である。例えば、実際のカメラ画像の処理とは対照的に、アニメーションの作成および/または生成および/またはレンダリングにおいて上述した様々な画像プロセッサアーキテクチャの特徴のいずれかが使用される場合、画像プロセッサはグラフィックス処理ユニットとして徳経づけられてもよい。さらに、上述した画像プロセッサアーキテクチャの特徴は、ビデオ処理、視覚処理、画像認識および/または機械学習などの他の技術的用途にも適用することができる。このように適用されて、画像プロセッサは、より汎用的なプロセッサ(例えば、コンピューティングシステムのCPUの一部であるか、またはその一部である)と(例えばコプロセッサとして)一体化されてもよく、またはコンピューティングシステム内のスタンドアロンプロセッサであってもよい。
【0129】
上述したハードウェア設計の実施形態は、半導体チップ内において、および/または最終的に半導体製造プロセスに向けての回路設計の記述として実施することができる。後者の場合、そのような回路記述は、(例えばVHDLもしくはVerilog)レジスタ転送レベル(RTL)回路記述、ゲートレベル回路記述、トランジスタレベル回路記述もしくはマスク記述、またはそれらの様々な組み合わせの形態をとってもよい。回路記述は、典型的には、コンピュータ可読記憶媒体(例えばCD−ROMまたは他のタイプの記憶技術)上に実施される。
【0130】
先のセクションから、上記の画像プロセッサは、(例えば、ハンドヘルド装置のカメラからのデータを処理するハンドヘルド装置のシステムオンチップ(SOC)の一部として)コンピュータシステム上のハードウェアで実施できることを認識することに関係する。画像プロセッサがハードウェア回路として実施される場合、画像プロセッサによって処理される画像データはカメラから直接受信されてもよいことに留意されたい。ここで、画像プロセッサは、別体のカメラの一部であってもよいし、一体化されたカメラを有するコンピューティングシステムの一部であってもよい。後者の場合、画像データは、カメラから直接、またはコンピューティングシステムのシステムメモリから受信することができる(例えば、カメラは、その画像データを画像プロセッサではなくシステムメモリに送信する)。先のセクションで説明した機能の多くは、(アニメーションをレンダリングする)グラフィックスプロセッサユニットにも適用可能であることにも留意されたい。
【0131】
図18は、コンピューティングシステムの例示的な図である。以下に説明するコンピューティングシステムのコンポーネントの多くは、一体化されたカメラおよび関連する画像プロセッサ(例えば、スマートフォンまたはタブレットコンピュータなどのハンドヘルドデバイス)を有するコンピューティングシステムに適用可能である。当業者は、2つの間の範囲を容易に定めることができるであろう。さらに、
図18のコンピューティングシステムは、
図17cに関して上述した開発環境を実現するために使用されるワークステーションのような高性能コンピューティングシステムの多くの特徴も含む。
【0132】
図18に見られるように、基本的なコンピューティングシステムは、中央処理ユニット1801(例えば、マルチコアプロセッサまたはアプリケーションプロセッサ上に配置された複数の汎用処理コア1815_1〜1215_Nおよびメインメモリコントローラ1817を含み得る)、システムメモリ1802、ディスプレイ1803(例えばタッチスクリーン、フラットパネル)、ローカル有線ポイントツーポイントリンク(例えばUSB)インタフェース1804、様々なネットワークI/O機能1805(イーサネット(登録商標)インタフェースおよび/またはセルラーモデムサブシステムなど)、無線ローカルエリアネットワーク(例えばWiFi)インタフェース1806、ワイヤレスポイントツーポイントリンク(例えばブルートゥース(登録商標))インタフェース1807およびグローバルポジショニングシステムインタフェース1808、様々なセンサ1209_1〜1809_N、1つ以上のカメラ1810、バッテリ1811、電力管理制御ユニット1812、スピーカおよびマイクロホン1813、ならびに音声コーダ/デコーダ1814を含んでもよい。
【0133】
アプリケーションプロセッサまたはマルチコアプロセッサ1850は、そのCPU1201内における1つ以上の汎用処理コア1815、1つ以上のグラフィカル処理ユニット1816、メモリ管理機能1817(例えばメモリコントローラ)、I/O制御機能1818および画像処理ユニット1819を含んでもよい。汎用処理コア1815は、典型的には、コンピューティングシステムのオペレーティングシステムおよびアプリケーションソフトウェアを実行する。グラフィックス処理ユニット1816は、典型的には、ディスプレイ1803上に提示されるグラフィックス情報を生成するために、グラフィックス集中型機能を実行する。メモリ制御機能1817は、システムメモリ1802とインタフェースして、システムメモリ1802との間でデータの書込/読出を行う。電力管理制御ユニット1812は、システム1800の電力消費を全体的に制御する。
【0134】
画像処理ユニット1819は、先のセクションで説明した画像処理ユニットの実施形態のいずれかに従って実現することができる。代替的にまたは組み合わせて、IPU1819は、GPU1816およびCPU1801のいずれかまたは両方にそのコプロセッサとして結合されてもよい。さらに、様々な実施形態では、GPU1816は、上で説明した画像プロセッサの特徴のいずれかを用いて実現することができる。
【0135】
タッチスクリーンディスプレイ1803、通信インタフェース1804〜1807、GPSインタフェース1808、センサ1809、カメラ1810、およびスピーカ/マイクコーデック1813,1814の各々はすべて、適切な場合には、一体化された周辺装置(例えば1つ以上のカメラ1810)も含むコンピューティングシステム全体に対して様々な形態のI/O(入力および/または出力)として見ることができる。実現例によっては、これらのI/Oコンポーネントの様々なものは、アプリケーションプロセッサ/マルチコアプロセッサ1850上に統合されてもよく、またはアプリケーションプロセッサ/マルチコアプロセッサ1850のダイから離れて、またはそのパッケージ外に配置されてもよい。
【0136】
一実施形態では、1つ以上のカメラ1810は、カメラとその視野内の対象との間の深度を測定することができる深度カメラを含む。アプリケーションプロセッサまたは他のプロセッサの汎用CPUコア(もしくはプログラムコードを実行するために命令実行パイプラインを有する他の機能ブロック)上で実行されるアプリケーションソフトウェア、オペレーティングシステムソフトウェア、デバイスドライバソフトウェアおよび/またはファームウェアは、上記の機能のいずれかを実行してもよい。
【0137】
本発明の実施形態は、上述したような様々なプロセスを含むことができる。これらのプロセスは、機械実行可能命令で実施されてもよい。これらの命令は、汎用または特殊目的のプロセッサに特定のプロセスを実行させるために使用できる。代替的に、これらのプロセスは、プロセスを実行するためのハードワイヤードおよび/またはプログラマブル論理を含む特定のハードウェアコンポーネントによって、またはプログラミングされたコンピュータコンポーネントとカスタムハードウェアコンポーネントとの任意の組み合わせによって実行されてもよい。
【0138】
本発明の要素はまた、機械実行可能命令を記憶するための機械可読媒体として提供されてもよい。機械可読媒体は、フロッピー(登録商標)ディスク、光ディスク、CD−ROM、および光磁気ディスク、フラッシュメモリ、ROM、RAM、EPROM、EEPROM、磁気もしくは光カード、伝搬媒体、または電子命令を記憶するのに適した他のタイプの媒体/機械可読媒体を含むが、それらに限定はされない。例えば、本発明は、搬送波または通信リンク(例えばモデムもしくはネットワーク接続)を介する他の伝搬媒体で実施されたデータ信号によって、遠隔のコンピュータ(例えばサーバ)から要求側コンピュータ(例えばクライアント)に転送され得るコンピュータプログラムとしてダウンロードすることができる。
【0139】
前述の明細書では、本発明をその特定の例示的な実施形態を参照して説明した。しかしながら、特許請求の範囲に記載される本発明のより広い精神および範囲から逸脱することなく、様々な修正および変更がなされ得ることは明らかであろう。したがって、明細書および図面は、限定的ではなく例示的なものとみなされるべきである。