【文献】
Rehan Hameed,"BALANCING EFFICIENCY AND FLEXIBILITY IN SPECIALIZED COMPUTING",Thesis,米国,Stanford University,2012年12月31日,pp.50-60,URL,https://web.stanford.edu/~kozyraki/students.html
【文献】
NAKANO Koji,"Optimal Parallel Algorithms for Computing the Sum, the Prefix-Sums, and the Summed Area Table on the Memory Machine Models",IEICE Transactions on Information and Systems,日本,The Institute of Electronics, Information and Communication Engineers,2013年12月 1日,Vol.E96-D, No.12,pp.2626-2634,URL,https://www.jstage.jst.go.jp/article/transinf/E96.D/12/E96.D_2626/_article/
【文献】
佐藤 由香、外3名,“3入力演算器を搭載した2Dアレイプロセッサの提案”,情報処理学会研究報告,日本,社団法人情報処理学会,2007年10月26日,Vol.2007, No.105,pp.7-12
(58)【調査した分野】(Int.Cl.,DB名)
前記二次元シフトレジスタアレイは、前記二次元シフトレジスタアレイの端部から前記二次元シフトレジスタアレイの反対側の端部にデータをラップするように構成される、請求項1または2に記載のプロセッサ。
【発明を実施するための形態】
【0010】
詳細な記載
i.導入
以下の説明は、広く汎用性のあるアプリケーションソフトウェア開発環境を提供する新たな画像処理技術プラットフォームに関する多数の実施形態を記載するものであり、それは改善された電力効率を提供するために、より大きなデータのブロック(例えば、以下にさらに説明するようなライングループおよびシート)を使用する。
【0011】
1.0 アプリケーションソフトウェア開発環境
a.カーネルの用途および構造
図1は、仮想画像処理環境101と、実際の画像処理ハードウェア103と、仮想処理環境101のために書かれたよりハイレベルのコードを、実際のハードウェア103が物理的に実行するオブジェクトコードに変換するためのコンパイラ102とを含む、画像プロセッサ技術プラットフォームのハイレベル図である。以下でより詳細に説明するように、仮想処理環境101は、アプリケーションの構成プロセスの容易な視覚化のために開発および調整できるアプリケーションの点で、広く汎用性が高い。開発者104によるプログラムコード開発努力が完了すると、コンパイラ102は、仮想処理環境101内で書かれたコードを、実際のハードウェア103に対して対象とされるオブジェクトコードに変換する。
【0012】
図2aは、仮想環境内で書かれたアプリケーションソフトウェアが取ることができる構造および形態の例を示す。
図2aにおいて見られるように、プログラムコードは、入力画像データ201の1つ以上のフレームを処理して、入力画像データ201上で何らかの全体的な変換を行うことが期待される。変換は、開発者によって明示されたオーケストレーションされたシーケンスで入力画像データに対して動作するプログラムコード202の1つ以上のカーネルの動作によって実現される。
【0013】
例えば、
図2aにおいて見られるように、最初に第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の異なるタイプの入力画像で動作する)。
【0014】
このように、全体的な画像処理シーケンスが大きくなると、画像処理パイプラインまたは有向非循環グラフ(DAG)の形を取り得、開発環境は、開発されているプログラムコードのそのようなものとしての表現を実際に開発者に提示するよう備えられてもよい。カーネルは、開発者によって個々に開発されてもよく、ならびに/または任意の基礎となる技術を供給するエンティティ(実際の信号プロセッサハードウェアおよび/もしくはその設計など)および/もしくは第三者(例えば、開発環境向けに作成されたカーネルソフトウェアのベンダー)によって提供されてもよい。したがって、名目上の開発環境には、開発者がより大きな開発努力の全体的な流れを達成するために様々な方法で自由に「つなぐ」ことができるカーネルの「ライブラリ」が含まれることが期待される。そのようなライブラリの一部であると予想されるいくつかの基本的なカーネルは、以下の基本的な画像処理タスク:畳み込み、ノイズ除去、色空間変換、エッジおよびコーナー検出、シャープニング、ホワイトバランス、γ補正、トーンマッピング、行列乗算、画像レジストレーション、ピラミッド構築、ウェーブレット変換、ブロック状離散コサイン、およびフーリエ変換のうちの1つ以上を提供するようカーネルを含んでもよい。
【0015】
図2bは、開発者が構想することができるカーネル203の構造の例示的な図を示す。
図2bにおいて見られるように、カーネル203は、それぞれの下位プロセッサ205上で各々動作しているプログラムコード204のいくつかの並列スレッド(「スレッド」)として見ることができ、各プロセッサ205は、出力アレイ206における特定の位置(カーネルが生成している出力画像内の特定のピクセル位置など)に向けられる。簡略化のために、3つのプロセッサおよび対応するスレッドのみが
図2bに示されている。様々な実施形態では、図示された各出力アレイ位置は、それ自身の専用プロセッサおよび対応するスレッドを有するであろう。すなわち、別個のプロセッサおよびスレッドを出力アレイの各ピクセルに割り当てることができる。代替の手法では、同じスレッドが出力ピクセルよりも多くについてデータを生成してもよく、および/または2つの異なるスレッドが(例えば、ある限定されたケースにおいて)同じ出力ピクセルのためのデータの生成に関して協力してもよい。
【0016】
以下でより詳細に説明するように、様々な実施形態では、実際の基礎となるハードウェアにおいて、実行レーンのアレイおよび対応するスレッドが一致して(例えば、単一命令複数データ(SIMD)のような態様において)動作して、現在処理中のフレームの「ライングループ」の一部のために出力画像データを生成する。ライングループは、画像フレームの連続したサイズ決め可能な部分である。様々な実施形態では、開発者は、ハードウェアがライングループに対して動作することを意識し得、または、開発環境は、例えば、出力フレーム内のすべてのピクセル(例えば、それ自身の専用プロセッサおよびスレッドによって生成された出力フレームにおけるすべてのピクセル)に対して別個のプロセッサおよびスレッドが存在する抽象化を提示し得る。いずれにせよ、様々な実施形態において、開発者は、各出力ピクセルについて個々のスレッドを含むようにカーネルを理解する(出力アレイが出力フレーム全体またはその一部として視覚化されているかどうか)。
【0017】
以下でより詳細に説明するように、一実施形態では、仮想環境内で開発者に提示されるプロセッサ205は、標準(例えばRISC)オペコードをサポートするだけでなく、開発者が実行されているピクセル毎の処理を容易に視覚化することを可能にするフォーマットされたデータアクセス命令も含む命令セットアーキテクチャ(ISA)を有する。従来の数学的およびプログラム制御オペコードのISA全体と組み合わせて任意の入力アレイ位置を容易に定義/視覚化する能力は、理想的には、任意のサイズの画像表面上で実行されるべき任意の所望の機能をアプリケーションプログラム開発者が定義することを本質的に可能にする非常に汎用性の高いプログラミング環境を可能にする。例えば理想的には、任意の数学演算を任意のステンシルサイズに適用するように容易にプログラミングすることができる。
【0018】
データアクセス命令に関して、一実施形態では、仮想プロセッサのISA(「仮想ISA」)は、特殊なデータロード命令および特殊なデータストア命令を含む。データロード命令は、画像データの入力アレイ内の任意の位置から読み出しできる。データストア命令は、画像データの出力アレイ内の任意の位置に書き込むことができる。後者の命令は、同じプロセッサの複数のインスタンスを異なる出力ピクセル位置に簡単に割り当てることを可能にする(各プロセッサは出力アレイ内の異なるピクセルに書き込む)。したがって、例えば、ステンシルサイズ自体(例えば、ピクセルの幅およびピクセルの高さとして表現される)を、容易にプログラマブルな特徴にすることができる。処理操作の視覚化は、特殊なロードおよびストア命令の各々が特殊な命令フォーマットを有して、更に単純化され、これにより、ターゲットアレイ位置がXおよびY座標として単純に指定される。
【0019】
いずれにせよ、出力アレイ内の複数の位置各々に対して別個のプロセッサをインスタンス化することにより、プロセッサはそれぞれのスレッドを並列に実行し、例えば出力アレイ内のすべての位置に対するそれぞれの値が同時に生成される。多くの画像処理ルーチンは、典型的には、同じ出力画像の異なるピクセル上で同じ操作を実行することは注目に値する。このように、開発環境の一実施形態では、各プロセッサは同一であると推定され、同じスレッドプログラムコードを実行する。したがって、仮想化された環境は、ロックステップで同一のコードを各々実行する同一のプロセッサなどの二次元アレイからなる一種の二次元(2D)SIMDプロセッサとして見ることができる。
【0020】
図3は、出力アレイ内の2つの異なるピクセル位置について同一のコードを処理している2つの仮想プロセッサのための処理環境のより詳細な例を示す。
図3は、生成されている出力画像に対応する出力アレイ304を示す。ここでは、第1の仮想プロセッサがスレッド301のコードを処理して出力アレイ304の位置X1に出力値を生成し、第2の仮想プロセッサがスレッド302のコードを処理して出力アレイ304の位置X2に出力値を生成している。再び、様々な実施形態において、開発者は、出力アレイ304内の各ピクセル位置について別個のプロセッサおよびスレッドが存在することを理解するであろう(単純にするため、
図3はそのうちの2つのみを示す)。しかしながら、様々な実施形態で、開発者は、(マシンのSIMDのような性質のため、)1つのプロセッサおよびスレッドに対してコードを開発するだけでよい。
【0021】
当技術分野で知られているように、出力ピクセル値は、しばしば、対応する出力ピクセル位置を含みそれを囲む入力アレイのピクセルを処理することによって決定される。例えば、
図3からわかるように、出力アレイ304の位置X1は、入力アレイ303の位置Eに対応する。したがって、出力値X1を決定するために処理されるであろう入力アレイ303のピクセル値のステンシルは、入力値ABCDEFGHIに対応するであろう。同様に、出力値X2を決定するために処理される入力アレイピクセルのステンシルは、入力値DEFGHIJKLに対応するであろう。
【0022】
図3は、出力値X1およびX2をそれぞれ計算するために使用され得るスレッド301,302の対に対する対応する仮想環境プログラムコードの例を示す。
図3の例では、両方のコード対が同一であり、9つの入力アレイ値のステンシルを平均して、対応する出力値を決定する。2つのスレッドの唯一の違いは、入力アレイから呼び出される変数および書き込まれる出力アレイの位置である。具体的には、出力位置X1に書き込むスレッドは、ステンシルABCDEFGHIで動作し、出力位置X2に書き込むスレッドはステンシルDEFGHIJKLで動作する。
【0023】
スレッド301,302の対からのそれぞれのプログラムコードからわかるように、各仮想プロセッサは、少なくとも内部レジスタR1およびR2を含み、少なくとも以下の命令をサポートする:1)入力アレイからR1へのLOAD(ロード)命令;2)入力アレイからR2へのLOAD命令;3)R1およびR2の内容を加算して結果をR2に入れるADD(加算)命令;4)R2内の値を即値オペランド9で除算するDIV(除算)命令;および5)スレッドの専用の出力アレイ位置にR2の内容を格納するSTORE(格納)命令。ここでもまた、
図3には2つの出力アレイ位置ならびに2つのスレッドおよび対応するプロセッサしか描かれていないが、おそらく、出力アレイ内のすべての位置にこれらの機能を実行する仮想プロセッサおよび対応するスレッドを割り当てることができる。様々な実施形態では、処理環境のSIMDのような性質にしたがって、複数のスレッドが互いに独立して実行される。つまり、仮想プロセッサ間にスレッド間通信は存在しない(1つのSIMDチャネルが別のSIMDチャネルと交差しないようにしている)。
【0024】
b.仮想プロセッサメモリモデル
様々な実施形態において、仮想プロセッサの関連する特徴は、それらのメモリモデルである。当該技術分野で理解されるように、プロセッサは、メモリからデータを読み出し、そのデータを操作し、新たなデータをメモリに書き戻す。メモリモデルは、プロセッサが有する、データがメモリ内に編成される方法のパースペクティブまたはビューである。
図4a〜
図4cは、開発環境の仮想プロセッサ用のメモリモデルの一実施形態に関する。例として、3つの仮想プロセッサおよび対応するスレッド401のみを含む単純化された環境が使用されている。以下により詳細に説明されるように、仮想プロセッサのメモリモデルはSIMDセマンティクスを保存するように注意を払いながら、同時に、各仮想プロセッサに対してスカラー演算およびプライベート中間値記憶空間を規定する。
【0025】
図4aに見られるように、一実施形態では、各仮想プロセッサが動作するメモリ領域420は、格納される情報の種類に基づいて6つの異なる区画に編成される。具体的には、次のものが存在する:1)プライベートスクラッチパッド領域402;2)グローバル入力データアレイ領域403;3)グローバル出力データアレイ領域404;4)グローバルルックアップテーブル情報領域405;5)グローバルアトミック統計領域406;および6)グローバル定数テーブル情報領域407。
【0026】
図4aに示すような区画は、全体的な処理環境のSIMDのような性質に合わせて、仮想プロセッサ間で共有される、すなわち「グローバル」なメモリ領域を視覚化することを試みる。同様に、
図4aはまた、仮想プロセッサ間で共有されていない、つまり特定の仮想プロセッサにとって「プライベート」である他のメモリ領域を視覚化することを試みる。具体的には、
図4aに見られるように、各仮想プロセッサにプライベートなスクラッチパッド領域402を除いて、すべてのメモリ区画はグローバルである。異なるメモリ領域のいくつかは、以下でさらに説明されるように、異なるメモリアドレス指定スキームも有する。
【0027】
スクラッチパッド領域402に関しては、洗練された画像処理アルゴリズムの実行中に中間情報を一時的に記憶すること(例えば、その後その情報を読み戻して後で使用すること)は珍しくない。さらに、そのような情報がスレッド間で異なることは珍しくない(異なる入力値は異なる中間値をもたらし得る)。したがって、メモリモデルは、プロセッサごとに、各仮想プロセッサの対応するスレッドによるそのような中間情報の記憶のためのプライベートなスクラッチパッド領域402を含む。一実施形態では、特定のプロセッサのスクラッチパッド領域は、典型的な(例えば、線形の)ランダムアクセスメモリアドレスを通じてそのプロセッサによってアクセスされ(409)、メモリの読み書き領域である(すなわち、仮想プロセッサは、プライベートメモリから情報を読出すことおよびプライベートメモリに情報を書き込むことの両方が可能である)。スクラッチパッド領域にアクセスするための仮想プロセッサISA命令フォーマットの実施形態は、以下でさらに詳細に説明される。
【0028】
入力アレイ部403は、出力データを生成するためにスレッドの組に呼び込まれる(408)入力データの組を含む。典型的な状況では、入力アレイは、各スレッドがその上またはその中で動作している画像(たとえばフレーム)または画像のセクションに対応する。入力画像は、カメラによって提供されるピクセル情報などの真の入力、またはより大きな全体的な画像処理シーケンスにおいて前のカーネルによって提供される情報などの何らかの形式の中間画像であってもよい。仮想プロセッサは、同じサイクルの間に入力画像データの異なるピクセル位置で動作するので、通常、同じ入力データ項目について競合しない。
【0029】
一実施形態では、新規なメモリアドレス指定方式を使用して、入力アレイ403からどの特定の入力値が呼び込まれるかを規定する。具体的には、従来の線形メモリアドレスではなく、X、Y座標で所望の入力データを定義する「位置相対的」アドレス指定方式が使用される。このように、仮想プロセッサのISAのロード命令は、X成分とY成分とで入力アレイ内の特定のメモリ位置を識別する命令フォーマットを含む。このように、二次元座標系を使用して、入力アレイ403から読み出される入力値に対してメモリをアドレス指定する。
【0030】
位置相対的メモリアドレス指定アプローチの使用は、仮想プロセッサが動作している画像の領域が、開発者にとってより容易に識別可能であることを可能にする。上記したように、従来の数学的およびプログラム制御オペコードのISA全体と組み合わせて任意の入力アレイ位置を容易に定義/視覚化する能力は、理想的には、任意のサイズの画像表面上で実行されるべき任意の所望の機能をアプリケーションプログラム開発者が容易に定義することを本質的に可能にする非常に汎用性の高いプログラミング環境を可能にする。位置相対的アドレス指定方式を採用する命令のための様々な命令フォーマットの実施形態が、サポートされるISAの他の特徴の実施形態とならんで、以下により詳細に説明される。
【0031】
出力アレイ404には、スレッドが生成を担う出力画像データが含まれる。出力画像データは、全体の画像処理シーケンスに従うディスプレイ上に提示される実際の画像データなどの最終画像データであってもよいし、全体の画像処理シーケンスの次のカーネルがその入力画像データ情報として使用する中間画像データであってもよい。ここでも、典型的には、仮想プロセッサは、同じサイクル中に出力画像データの異なるピクセル位置に書き込むので、同じ出力データ項目に対して競合しない。
【0032】
一実施形態では、位置相対的アドレス指定方式は、出力アレイへの書込にも使用される。そのため、各仮想プロセッサに対するISAは、その命令フォーマットが、従来のランダムアクセスメモリアドレスではなく、二次元のX、Y座標としてメモリ内の目標とされる書込位置を規定するストア命令を含む。仮想ISAの位置相対命令の実施形態に関するさらなる詳細は、以下にさらに示される。
【0033】
図4aはまた、各仮想プロセッサが、ルックアップテーブルメモリ領域405内に保持されているルックアップテーブル411へのルックアップ410を実行するのを示す。ルックアップテーブルは、画像処理タスクによってしばしば使用されて、例えば、異なるアレイ位置に対するフィルタまたは変換係数を取得し、ルックアップテーブルが入力インデックス値のために出力される関数を提供する複雑な関数(例えば、ガンマ曲線、正弦、余弦)を実施するなどする。ここで、SIMD画像処理シーケンスはしばしば同じクロックサイクルの間に同じルックアップテーブルへのルックアップを実行することが予想される。したがって、入力および出力アレイメモリ領域403、404と同様に、ルックアップテーブル領域405は、任意の仮想プロセッサによってグローバルにアクセス可能である。
図4aは同様に、3つの仮想プロセッサの各々が、ルックアップテーブルメモリ領域405に保持されている同じルックアップテーブル411から情報を効果的にルックアップするのを示す。
【0034】
一実施形態では、インデックス値は、典型的には、所望のルックアップテーブルエントリを定義するために使用されるので、ルックアップテーブル情報領域は、通常の線形アクセススキームを使用してアクセスされる。一実施形態では、メモリのルックアップ領域は読み取り専用である(すなわち、プロセッサはルックアップテーブル内の情報を変更することはできず、そこから情報を読み出すことのみが許可されている)。簡単にするために、
図4aは、ルックアップテーブル領域405内に1つのルックアップテーブルしか常駐しないことを示唆するが、仮想環境は、シミュレートされたランタイム中に複数の異なるルックアップテーブルが常駐することを可能にする。ルックアップテーブルへのルックアップを実行する命令のための仮想ISA命令フォーマットの実施形態が、以下にさらに示される。
【0035】
図4bは、3つの仮想プロセッサの各々がアトミック統計領域406に書き込み413するのを示す。画像処理が出力情報を「更新」または適度に変更することは珍しくない。更新された情報は次いで、更新された情報を利用する他の下流のプロセスのために使用されてもよい。そのような更新または適度な変更の例には、出力データへの固定オフセットの単純な追加、出力データに対する被乗数の単純な乗算、または何らかのしきい値に対する出力データの最小値もしくは最大値の比較が含まれる。
【0036】
これらのシーケンスでは、
図4bに見られるように、個々のスレッド401によって計算されたばかりの出力データが操作され、その結果がアトミック統計領域406に書き込まれてもよい(413)。実装セマンティクスに応じて、アトミック動作によって操作される出力データは、後で
図4bで示すように、プロセッサによって内部に保持されてもよいし、または出力アレイから呼び出されてもよい(412)。様々な実施形態において、出力データ上で実行され得るアトミック動作は、加算、乗算、最小、および最大を含む。一実施形態では、出力データへの更新が同じ二次元アレイにおいて出力データそれ自体として論理的に編成されることを考えると、アトミック統計領域406は(入力および出力アレイアクセスと同様に)位置相対アドレス指定スキームを使用してアクセスされる。出力データに対してアトミック動作を実行し、その結果を統計領域406に書き込むための仮想ISA命令フォーマットの実施形態は、以下でさらに詳細に説明される。
【0037】
図4cは、仮想プロセッサの各々が、定数メモリ領域407内の定数ルックアップテーブル415から定数値を読み出す(414)のを示す。ここで、例えば、異なるスレッド401が同じクロックサイクル上で同じ定数または他の値(たとえば、画像全体に対して適用されるべき特定の乗数)を必要とし得ることが予想される。したがって、定数ルックアップテーブル415へのアクセスは、
図4cに示されるように、各仮想プロセッサに同じスカラー値を返す。ルックアップテーブルは典型的にはインデックス値でアクセスされるので、一実施形態では、定数ルックアップテーブルメモリ領域は線形ランダムアクセスメモリアドレスでアクセスされる。一実施形態では、メモリの定数領域は読み取り専用である(すなわち、プロセッサは、定数テーブル内の情報を変更することはできず、そこから情報を読み取ることのみが許可されている)。簡単にするために、
図4cは、定数メモリ領域407内の単一の定数ルックアップテーブル415のみを示す。スレッドはそのようなテーブルを複数利用してもよいので、メモリ領域407は必要とされる/使用されるのと同じ数の定数テーブルを保持するのに十分な大きさになるように構成される。
【0038】
c.仮想プロセッサISA
上で複数の例で示唆したように、仮想プロセッサISAはいくつかの関連機能を含むことができる。これらのうちのいくつかはすぐ下に詳細に説明される。
【0039】
様々な実施形態において、各仮想プロセッサのISAの命令フォーマットは、以下の各々に対してX、Y座標を定義するために相対位置決めアプローチを使用する:1)入力画像データを入力アレイメモリ領域から読み出すLOAD命令;2)出力画像データを出力アレイに書き込むSTORE命令;および3)メモリの統計領域に対するアトミック更新。
【0040】
従来のデータアクセス、数学的、およびプログラム制御オペコードのISA全体と組み合わせて任意の入力アレイ位置を容易に定義する能力は、アプリケーションプログラム開発者が理想的には任意のサイズの画像面で実行されるべき任意の所望の関数を定義することを本質的に可能にする極めて多用途のプログラミング環境を可能にする。例えば、理想的には、任意の数学的演算を任意のステンシルサイズに適用するように容易にプログラムすることができる。
【0041】
一実施形態では、入力/出力アレイから/へのロード/ストアのための命令は、以下のフォーマットを有する。
【0042】
[OPCODE] LINEGROUP_(name)[(((X*XS + X0)/XD);((Y*YS + Y0)/YD); Z]
ここで、[OPCODE]は特定の操作の種類であり(入力アレイからのLOAD、出力アレイへのSTORE)、LINEGROUP_(name)は入力または出力アレイメモリ領域内の特定の画像の特定のセクション(たとえば、画像データのフレームのライングループ)に割り当てられた名前である。ここでは、異なるライングループは別々に操作されるので、異なるライングループには異なる名前が与えられ、それらは一意に識別/アクセスされることができる(例えば、LINEGROUP_1, LINEGROUP_2など)。入力アレイメモリ領域および出力アレイメモリ領域の両方に同じ名前のライングループが存在してもよい。任意のライングループの原点は、例えば、それの適切なメモリ領域内の、それの左下隅であってもよい。
【0043】
アトミック統計テーブル上で更新を実行する命令の場合、一実施形態では、命令フォーマットは以下の類似の構造をとる。
【0044】
[OPCODE] STATS_(name)[(((X*XS + X0)/XD);((Y*YS + Y0)/YD); Z]
注目すべき違いは、入力オペランド情報が、入力または出力アレイ内の特定のライングループではなく、特定の統計テーブル(STATS_(name))内の位置を定義することである。 ライングループと同様に、スレッドがその動作の過程で異なる統計テーブル上で一意に動作できるように、異なる統計テーブルに異なる名前が付けられる。[OPCODE]は、実行されるべき特定のアトミック動作を指定する(例えば、STAT_ADD; STAT_MUL; STAT_MIN; STAT_MAX)。
【0045】
入出力アレイアクセスまたはアトミック統計テーブルアクセスのどちらの場合も、命令のZオペランドは、名前付きライングループまたは統計テーブルのどのチャネルが命令のターゲットになるかを定義する。ここでは、典型的には、単一の画像に複数のチャネルがある。例えば、映像は、典型的には、ビデオストリームの同じフレームに対して、赤チャネル(R)、緑チャネル(G)、および青チャネル(B)を有する。ある意味、完全な画像は、互いの上に積み重ねられた別々のR、G、およびBチャネル画像として見ることができる。Zオペランドは、これらのうちのどれが命令によってターゲットとされるかを定義する(例えば、Z=0は赤チャネルに対応し、Z=1は青チャネルに対応し、Z=2は緑チャネルに対応する)。したがって、各ライングループおよび統計テーブルは、処理されている特定の画像について各チャネルの内容を含むように構成される。
【0046】
(X*XS + X0)/XDオペランドは、命令のターゲットとなる名前付きライングループまたは統計テーブル内のX位置を定義し、(Y*YS + Y0)/YDオペランドは命令のターゲットとなる名前付きライングループまたは統計テーブル内のY位置を定義する。X位置に関するXS項およびXD項、ならびにy位置に関するYS項およびYD項は、異なるピクセル密度を有する入力画像と出力画像との間のスケーリングに使用される。スケーリングは、以下でさらに詳細に説明される。
【0047】
最も単純な場合では、入力画像と出力画像との間にスケーリングはなく、命令フォーマットのX成分およびY成分は単にX + X0およびY + Y0の形をとり、ここで、X0およびY0はスレッドの位置に対する位置オフセットである。スレッドは、それの出力値が書き込まれる出力アレイライングループ内の位置に割り当てられていると見なされる。対応する同じ位置が、入力アレイライングループおよび任意の統計テーブルで容易に識別で可能である。
【0048】
例として、スレッドが出力アレイLINEGROUP_1において特定のX, Y位置を割り当てられる場合、命令
LOAD LINEGROUP_1[(X-1);(Y-1);Z]
は、LINEGROUP_1から、入力アレイ内の同じX, Y位置から左に1ピクセル、下に1ピクセルの位置にある値をロードするであろう。
【0049】
したがって、
図5aに示すように、X, Y位置のピクセル値をその左右の隣接ピクセル値と共に平均する単純なぼけカーネルを擬似コードで書くことができる。
図5aに見られるように、位置((X);(Y))は、出力アレイに書き込んでいる仮想プロセッサの位置に対応する。上記の擬似コードでは、LOADは入力アレイからのロードのためのオペコードに対応し、STOREは出力アレイへのストアのためのオペコードに対応する。入力アレイにLINEGROUP_1、出力アレイにLINEGROUP_1が存在することに注意されたい。
【0050】
図5bは、相対位置決めロードおよびストア命令フォーマットのスケーリング機能を説明するためのスケーリングされた画像を示す。ダウンサンプリングとは、入力画像に存在するピクセルのすべてよりも少ないピクセルを出力画像に与えることによって、より高い解像度の画像をより低い解像度の画像に変換することを指す。アップサンプリングとは、入力画像に存在するよりも多くのピクセルを出力画像に作成することによって、より低い解像度の画像をより高い解像度の画像に変換することを指す。
【0051】
例えば、
図5bを参照すると、画像501が入力画像を表し、画像502が出力画像を表す場合、出力画像は入力画像よりもピクセルが少ないので、ダウンサンプリングが行われる。ここで、出力画像内の各ピクセルについて、出力ピクセルについての出力値を決定する入力画像内の関連ピクセルは、出力画像においていずれかの軸に沿って移動して出力ピクセル位置から「より遠くに」進行する。たとえば、3:1のダウンサンプリング比の場合、出力画像におけるいずれかの軸に沿った第1のピクセルは、入力画像における同じ軸に沿った第1、第2および第3のピクセルに対応し、出力画像の第2のピクセルは、入力画像の第4、第5および第6のピクセルに対応する、などとなる。したがって、第1の出力ピクセルは第3の位置に関連ピクセルを有し、第2の出力ピクセルは第6の位置に関連ピクセルを有する。
【0052】
したがって、相対位置決め命令フォーマットのXSおよびYSの被乗数項は、ダウンサンプリングを実行するために使用される。
図5aのぼけ疑似コードが両方の軸に沿って3:1のダウンサンプリングのために書き換えられる場合、コードは以下のように書き換えられるであろう。
【0053】
R1 <= LOAD LINEGROUP_1[((3X)-1);3(Y);0]
R2 <= LOAD LINEGROUP_1[3(X);3(Y);0]
R3 <= LOAD LINEGROUP_1[((3X)+1);3(Y);0]
R2 <= ADD R1, R2
R2 <= ADD R2, R3
R2 <= DIV R2, 3
STORE LINEGROUP_1[(X);(Y);(0)]; R2
対照的に、1:3アップサンプリングの場合(例えば、画像502は入力画像であり、画像501は出力画像である)、XDおよびYD除数はいずれかの軸に沿って各入力ピクセルに対して3つの出力ピクセルを生成するために使用されるであろう。したがって、ぼけコードは次のように書き直されるであろう。
【0054】
R1 <= LOAD LINEGROUP_1[(X-1)/3;(Y)/3;0]
R2 <= LOAD LINEGROUP_1[(X)/3;(Y)/3;0]
R3 <= LOAD LINEGROUP_1[(X+1)/3;(Y)/3;0]
R2 <= ADD R1, R2
R2 <= ADD R2, R3
R2 <= DIV R2, 3
STORE LINEGROUP_1[(X);(Y);(0)]; R2
様々な実施形態では、メモリのプライベート部分、定数部分、およびルックアップ部分にアクセスする命令の命令フォーマットはまた、a*b + cの形式をとり、式中、aはベース位置であり、bはスケーリング項であり、cはオフセットである。ただし、ここでは、a*b + cという項が、ターゲットとされるテーブルに適用される線形インデックスに本質的に対応する、線形アドレス指定アプローチが採用される。これらの各命令はまた、オペコードおよびアクセスされているメモリ領域の識別子を含む。例えば、ルックアップテーブルメモリ領域からルックアップを実行する命令は、次のように表すことができる。
【0055】
LOAD LKUP_(name)[(A*B + C)]
ここで、LOADはロード操作を識別するオペコードであり、LKUP_(name)はアクセスされているルックアップテーブルメモリ領域内のルックアップテーブルの名前を指定する。ここでも、複数のルックアップテーブルがスレッドによって使用されてもよく、したがって、ルックアップテーブルメモリ領域に存在する2つ以上のうちの適切な1つを識別するために、命名スキームが使用される。
【0056】
同様の指向のオペコードを伴う同様のフォーマットを、定数メモリ領域およびプライベートメモリ領域をターゲットとする命令に利用できる(例えば、LOAD CNST_(name)[(A*B + C)]; LOAD PRVT_(name)[(A*B +C)]。一実施形態では、ルックアップテーブルアクセスおよび定数テーブルアクセスは読み取り専用である(プロセッサはそこに配置されたデータを変更することはできない)。そのため、これらのメモリ領域に対するSTORE命令はない。一実施形態では、メモリのプライベート領域はリード/ライトである。したがって、そのメモリ領域に対してはstore命令が存在する(例えば、STORE PRVT[(A*B + C)]。
【0057】
様々な実施形態において、各仮想プロセッサは、整数値、浮動小数点値または固定小数点値を含み得る汎用レジスタを含む。さらに、汎用レジスタは、8、16または32ビット値などの構成可能なビット幅のデータ値を含み得る。したがって、入力アレイまたは出力アレイの各ピクセル位置の画像データは、8、16または32ビットのデータサイズを有することができる。ここで、ある仮想プロセッサは、汎用レジスタ内の値のビットサイズおよび数値フォーマットを確立する実行モード用に設定できる。命令は即値オペランド(入力値が、指定されたレジスタにおいて見いだされるのではなく、命令自体で直接表現される、入力オペランド)も指定できる。即値オペランドは、構成可能な8、16、または32ビット幅を有することもできる。
【0058】
拡張された実施形態では、各仮想プロセッサはそれ自体の内部のスカラーモードまたはSIMDモードで動作することもできる。すなわち、特定のアレイ位置内のデータは、スカラー値、または複数の要素を有するベクトルと見なすことができる。例えば、第1の構成は、各画像アレイ位置がスカラー8ビット値を保持する8ビットのスカラー演算を確立することができる。対照的に、他の構成は、各画像アレイ位置がアレイ位置当たり32ビットの総データサイズに対して4つの8ビット値を保持すると仮定される、32ビットの並列/SIMD演算を確立することができる。
【0059】
様々な実施形態では、各仮想プロセッサは述語値を保持するためのレジスタも含む。単一の述語値はたいていわずか1ビットの長さであり、既存のデータに対して真/偽または大なり/小なりテストを実行するオペコードからの結果を表す。述語値は、例えば、実行中にコードを通る分岐方向を決定するために使用される(したがって、条件付き分岐命令のオペランドとして使用される)。述語値は、命令内の即値オペランドとして表すこともできる。
【0060】
様々な実施形態において、各仮想プロセッサはスカラー値を保持するためのレジスタを含む。ここで、スカラー値は、(
図4cに関して上述したように)定数のために予約されているメモリモデルの区画空間に格納され、そこから読み出される。ここで、同じ画像を処理している仮想プロセッサのグループの各仮想プロセッサは、定数メモリ空間から同じスカラー値を使用する。拡張された実施形態では、スカラー述語も存在する。これらは、述語およびスカラーの両方の定義を満たす、レジスタ空間に保持されている値である。
【0061】
様々な実施形態において、各仮想プロセッサは、サポートされている算術命令オペコードが以下のいずれかの実行可能な組み合わせを含むRISCのような命令セットとして設計されている:1)ADD(オペランドAおよびBの加算);2)SUB(オペランドAおよびBの減算);3)MOV(オペランドをあるレジスタから別のレジスタに移動する);4)MUL(オペランドAおよびBを乗算する);5)MAD(オペランドAおよびBを乗算し、結果にCを加算する);6)ABS(オペランドAの絶対値を返す);7)DIV(オペランドAをオペランドBで除算する);8)SHL(オペランドAを左にシフトする);9)SHR(オペランドAを右にシフトする);10)MIN/MAX (オペランドAおよびBのどちらか大きい方を返す);11)SEL(オペランドAの指定されたバイトを選択する);12)AND(オペランドAおよびBの論理積を返す);13)OR(オペランドAおよびBの論理和を返す);14)XOR(オペランドAおよびBの論理排他的論理和を返す);15)NOT(オペランドAの論理反転を返す)。
【0062】
命令セットには、次のような標準の述語演算も含まれる。1)SEQ(AがBと等しい場合は1を返す);2)SNE(AがBと等しくない場合は1を返す);3)SLT(AがBより小さい場合は1を返す);4)SLE(AがB以下の場合は1を返す)。JMP(ジャンプ)およびBRANCHのような制御フロー命令もまた含まれ、それらの各々は名目上の変数または述語をオペランドとして含み得る。
【0063】
d.アプリケーションソフトウェア開発およびシミュレーション環境
図6は、アプリケーションソフトウェア開発およびシミュレーション環境601を示す。
図2に関して上述したように、開発者は、全体的な意図された画像変換と整合する戦略的シーケンスでカーネルを配置することによって、包括的な画像処理機能(例:各段が専用の画像処理タスクを実行する画像処理パイプライン、他のDAG規定のルーチンセットなど)を開発することができる。カーネルはライブラリ602から呼び出されてもよく、および/または開発者が1つ以上のカスタムカーネルを開発してもよい。
【0064】
ライブラリ602内のカーネルは、カーネルの第三者ベンダおよび/または任意の基礎をなす技術のプロバイダによって提供されてもよい(例えば、対象とされるハードウェア画像プロセッサを含むハードウェアプラットフォームのベンダまたは対象とされるハードウェア画像プロセッサのベンダ(例えば、その設計として、または実際のハードウェアとして提供される))。
【0065】
カスタム開発されたカーネルの場合、多くの状況において、開発者は、単一のスレッド603についてプログラムコードを書くだけでよい。すなわち、開発者は、(例えば、前述の位置相対メモリアクセス命令フォーマットで)出力ピクセル位置に対する入力ピクセル値を参照することによって単一の出力ピクセル値を判断するプログラムコードを書くだけでよい。単一スレッド603の動作を満足すると、開発環境は、スレッドコードの複数のインスタンスをそれぞれの仮想プロセッサ上で自動的にインスタンス化して、画像表面領域上で動作するプロセッサのアレイ上でカーネルを実行することができる。画像表面領域は、画像フレームのセクション(ライングループなど)であってもよい。
【0066】
様々な実施形態では、カスタムスレッドプログラムコードは、仮想プロセッサISAのオブジェクトコード(または仮想プロセッサISAオブジェクトコードにコンパイルされる高級言語)で書かれる。カスタムカーネルのプログラムコードの実行のシミュレーションは、メモリモデルに従って編成されたメモリにアクセスする仮想プロセッサを含むシミュレートされた実行時環境において実行されてもよい。ここで、仮想プロセッサのソフトウェアモデル(オブジェクト指向型またはその他)604およびそのモデルを組み込んだメモリ605がインスタンス化される。
【0067】
仮想プロセッサモデル604は、次いで、スレッドコード603の実行をシミュレートする。スレッド、それのより大きなカーネル、およびそのカーネルが属する任意のより大きな関数の実行を満足すると、その全体が、基礎となるハードウェアの実際のオブジェクトコードにコンパイルされる。シミュレーション環境601の全体は、コンピュータシステム(例えば、ワークステーション)606上で実行されるソフトウェアとして実現されてもよい。
【0068】
2.0 ハードウェアアーキテクチャの実施形態
a.画像プロセッサハードウェアアーキテクチャおよび動作
図7は、ハードウェアで実現される画像プロセッサのためのアーキテクチャ700の実施形態を示す。画像プロセッサは、例えば、シミュレートされた環境内で仮想プロセッサ用に書かれたプログラムコードを、ハードウェアプロセッサによって実際に実行されるプログラムコードに変換するコンパイラによって対象とされてもよい。
図7に示すように、アーキテクチャ700は、複数のラインバッファユニット701_1〜701_M(以下、「ラインバッファ」、「ラインバッファユニット」など)を含み、それらは、複数のステンシルプロセッサユニット702_1〜702_N(以下、「ステンシルプロセッサ」、「ステンシルプロセッサユニット」など)および対応するシート生成部ユニット703_1〜703_N(以下、「シート生成部」、「シート生成部ユニット」など)に、ネットワーク704(例えば、ネットワークオンチップ(NOC)(オンチップスイッチネットワーク、オンチップリングネットワークまたは他の種類のネットワークを含む))を介して相互接続される。一実施形態では、どのラインバッファユニットが、ネットワーク704を介してどのシート生成部および対応するステンシルプロセッサに接続してもよい。
【0069】
一実施形態では、プログラムコードはコンパイルされ、対応するステンシルプロセッサ702にロードされて、ソフトウェア開発者によって以前に定義された画像処理動作を実行する(プログラムコードは、例えば、設計および実装に応じて、ステンシルプロセッサの関連のシート生成部703にもロードされてもよい)。少なくともいくつかの例では、画像処理パイプラインを、第1のパイプラインステージ用の第1のカーネルプログラムを第1のステンシルプロセッサ702_1にロードし、第2のパイプラインステージ用の第2のカーネルプログラムを第2のステンシルプロセッサ702_2にロードするなどして、実現することができ、第1のカーネルはパイプラインの第1ステージの機能を実行し、第2のカーネルはパイプラインの第2ステージの機能を実行し、追加の制御フロー方法がインストールされて、出力画像データをパイプラインの1つのステージからの次のステージに渡す。
【0070】
他の構成では、画像プロセッサは、同じカーネルプログラムコードを動作させる2つ以上のステンシルプロセッサ702_1,702_2を有する並列マシンとして実現することができる。例えば、画像データの高密度かつ高データレートのストリームが、各々が同じ機能を実行する複数のステンシルプロセッサにわたってフレームを広げることによって処理されてもよい。
【0071】
さらに他の構成では、カーネルの本質的に任意のDAGのハードウェアプロセッサへのロードを、それぞれのステンシルプロセッサをそれら自身のプログラムコードのカーネルとともに構成し、適切な制御フローフックをハードウェアに構成して、出力画像をDAG設計における1つのカーネルから次のカーネルの入力に向けることによって、行なってもよい。
【0072】
一般的なフローとして、画像データのフレームは、マクロI/Oユニット705で受信され、フレーム単位でラインバッファユニット701の1つ以上に渡される。特定のラインバッファユニットは、それの画像データのフレームを、「ライングループ」と呼ばれる画像データのより小さな領域に解析し、次いでライングループをネットワーク704を介して特定のシート生成部に渡す。ある完全な(full)単数のライングループを、例えば、フレームの複数の連続した完全な行または列のデータで構成することができる(簡単にするために、本明細書では主に連続した行と称する)。シート生成部は、画像データのライングループを「シート」と呼ばれる画像データのより小さな領域にさらに解析し、そのシートを対応するステンシルプロセッサに提示する。
【0073】
単一入力の画像処理パイプラインやDAGフローの場合、一般に、入力フレームは、同じラインバッファユニット701_1に向けられ、それは、画像データをライングループに解析し、ライングループを対応するシート生成部703_1(対応するステンシルプロセッサ702_1はパイプライン/DAGにおいて第1のカーネルのコードを実行している)に向ける。ステンシルプロセッサ702_1による、それが処理するライングループでの動作が終了した後、シート生成部703_1は、出力ライングループを「下流」のラインバッファユニット701_2に送信する(ある使用例では、出力ライングループは、先に入力ライングループを送信したのと同じラインバッファ装置701_1に送り返すことができる)。
【0074】
自身のそれぞれの他のシート生成部およびステンシルプロセッサ(例えば、シート生成部703_2およびステンシルプロセッサ702_2)上で実行されるパイプライン/DAGにおける次のステージ/動作を表す1つ以上の「消費側」カーネルは、下流ラインバッファユニット701_2から、第1のステンシルプロセッサ702_1によって生成された画像データを受信する。このようにして、第1のステンシルプロセッサ上で動作する「作成側」カーネルは、その出力データが、第2のステンシルプロセッサ上で動作する「消費側」カーネルに転送され、消費側カーネルは、パイプラインまたはDAG全体の設計と整合する作成側カーネルの後に次のタスクのセットを実行する。
【0075】
ステンシルプロセッサ702は、画像データの複数の重なり合うステンシル上で同時に動作するように設計されている。複数の重なり合うステンシルおよびステンシルプロセッサの内部ハードウェア処理能力は、シートのサイズを効果的に決定する。ここでは、ステンシルプロセッサ702内で、実行レーンのアレイが一致して動作して、複数の重なり合うステンシルによってカバーされる画像データ表面領域を同時に処理する。
【0076】
以下でより詳細に説明するように、様々な実施形態において、画像データのシートは、ステンシルプロセッサ702内において二次元レジスタアレイ構造にロードされる。シートおよび二次元レジスタアレイ構造の使用は、大量のデータを、大量のレジスタ空間に、例えば、処理タスクが実行レーンアレイによってその直後に直接データ上で実行される単一のロード動作として移動することによって、電力消費の改善を効果的に提供すると考えられている。さらに、実行レーンアレイおよび対応するレジスタアレイの使用は、容易にプログラマブル/設定可能な異なるステンシルサイズを提供する。
【0077】
図8a〜
図8eは、ラインバッファユニット701の解析アクティビティ、およびシート生成部ユニット703のより微細な粒子の解析アクティビティ、ならびにシート生成部703に結合されるステンシルプロセッサ702のステンシル処理アクティビティの両方のハイレベルの実施形態を示す。
【0078】
図8aは、画像データ801の入力フレームの一実施形態を示す。
図8aはまた、ステンシルプロセッサが動作するように設計された3つの重なり合うステンシル802(各ステンシルは3ピクセル×3ピクセルの寸法を有する)の概要を示す。各ステンシルがそれぞれ出力画像データを生成する出力ピクセルは、ベタ黒で強調表示される。簡略化のために、3つの重なり合うステンシル802は、垂直方向にのみ重なるように示されている。実際には、ステンシルプロセッサは、垂直方向および水平方向の両方に重なるステンシルを有するように設計されてもよいことを認識することが適切である。
【0079】
図8aに見られるように、ステンシルプロセッサ内の垂直に重なり合うステンシル802のために、フレーム内に単一のステンシルプロセッサが動作することができる画像データの広い帯域が存在する。以下でより詳細に説明するように、一実施形態では、ステンシルプロセッサは、データを、それらの重なり合うステンシル内で、左から右への態様で、画像データにわたって処理する(そして、次のラインのセットに対して、上から下の順序で繰り返す)。このように、ステンシルプロセッサがそれらの動作を前方に進めるにつれて、ベタ黒出力ピクセルブロックの数は、水平方向に右に成長する。上述したように、ラインバッファユニット701は、ステンシルプロセッサが今後の拡張された数のサイクルにわたって動作するのに十分な入来フレームからの入力画像データのライングループを解析することを担う。ライングループの例示的な図示は、陰影領域803として示されている。一実施形態では、以下にさらに記載されるように、ラインバッファユニット701は、ライングループをシート生成部との間で送受信するための異なるダイナミクスを理解することができる。例えば、「完全なグループ」と呼ばれる1つのモードによれば、画像データの完全な全幅のラインが、ラインバッファユニットとシート生成部との間で渡される。「仮想的に高い」と呼ばれる第2のモードによれば、ライングループは最初に全幅行のサブセットと共に渡される。その後、残りの行は、より小さい(全幅未満の)片で順番に渡される。
【0080】
入力画像データのライングループ803がラインバッファユニットによって画定され、シート生成部ユニットに渡されると、シート生成部ユニットはさらに、ライングループを、ステンシルプロセッサのハードウェア制限に、より正確に適合する、より微細なシートに、解析する。より具体的には、以下でさらに詳細に説明するように、一実施形態では、各ステンシルプロセッサは、二次元シフトレジスタアレイからなる。二次元シフトレジスタアレイは、本質的に、画像データを実行レーンのアレイの「真下」にシフトし、シフトのパターンは、各実行レーンをそれ自身のステンシル内においてデータに対して動作させる(すなわち、各実行レーンは、それ自身の情報のステンシル上で処理して、そのステンシルの出力を生成する)。一実施形態では、シートは、二次元シフトレジスタアレイを「満たす」か、さもなければ二次元シフトレジスタアレイにロードされる入力画像データの表面領域である。
【0081】
したがって、
図8bに見られるように、シート生成部は、ライングループ803から最初のシート804を解析し、それをステンシルプロセッサに供給する(ここで、例示のデータのシートは、参照番号804によって全体的に識別される5×5の陰影領域に対応する)。
図8cおよび
図8dに示すように、ステンシルプロセッサは、重なるステンシル802をシート上で左から右へ効果的に移動させることによって、入力画像データのシートに対して動作する。
図8dのように、シート内のデータから出力値を計算することができるピクセル数(暗くされた3×3アレイの9個)が使い果たされる(他のピクセル位置は、シート内の情報から決定される出力値を有することができない)。簡単にするために、画像の境界領域は無視されている。
【0082】
図8eにおいて見られるように、シート生成部は次いで、ステンシルプロセッサが動作を継続する次のシート805を提供する。ステンシルが次のシートに対して動作を開始するときのステンシルの初期位置は、(先に
図8dに示されている)最初のシート上の消耗点から右への次の進行であることに留意されたい。新たなシート805で、ステンシルプロセッサが最初のシートの処理と同じ態様で新たなシートに対して動作するにつれ、ステンシルは単に右に移動し続ける。
【0083】
出力ピクセル位置を取り囲むステンシルの境界領域のために、第1のシート804のデータと第2のシート805のデータとの間にいくらかの重なりがあることに留意されたい。重なりは、シート生成部が重なり合うデータを2回再送信することによって簡単に処理することができる。別の実現例では、次のシートをステンシルプロセッサに供給するために、シート生成部は、ステンシルプロセッサに新たなデータを送るだけに進んでもよく、ステンシルプロセッサは、前のシートからの重なり合うデータを再利用する。
【0084】
b.ステンシルプロセッサ設計および動作
図9aは、ステンシルプロセッサユニットアーキテクチャ900の実施形態を示す。
図9aにおいて見られるように、ステンシルプロセッサは、データ計算ユニット901、スカラープロセッサ902および関連するメモリ903およびI/Oユニット904を含む。データ計算ユニット901は、実行レーンのアレイ905、二次元シフトアレイ構造906、およびアレイの特定の行または列に関連する別個のそれぞれのランダムアクセスメモリ907を含む。
【0085】
I/Oユニット904は、シート生成部から受け取ったデータの「入力」シートをデータ計算ユニット901にロードし、ステンシルプロセッサからのデータの「出力」シートをシート生成部に格納する役割を果たす。一実施形態では、データ計算ユニット901へのシートデータのロードは、受け取ったシートを画像データの行/列に解析し、画像データの行/列を二次元シフトレジスタ構造906または実行レーンアレイの行/列のそれぞれのランダムアクセスメモリ907にロードすることを必要とする(以下でより詳細に説明する)。シートが最初にメモリ907にロードされる場合、実行レーンアレイ905内の個々の実行レーンは、適宜、ランダムアクセスメモリ907からシートデータを二次元シフトレジスタ構造906にロードすることができる(例えば、シートのデータ上での動作のすぐ前のロード命令として)。データのシートのレジスタ構造906へのロード(シート生成部からの直接的であろうとまたはメモリ907からであろうと)が完了すると、実行レーンアレイ905の実行レーンはデータに対して動作し、最終的に、完成したデータをシートとしてシート生成部に、またはランダムアクセスメモリ907に「書き戻す」。実行レーンがランダムアクセスメモリ907に書き戻す場合、I/Oユニット904はランダムアクセスメモリ907からデータをフェッチして出力シートを形成し、出力シートはシート生成部に転送される。
【0086】
スカラープロセッサ902は、スカラーメモリ903からステンシルプロセッサのプログラムコードの命令を読み出し、実行レーンアレイ905の実行レーンに命令を発行するプログラムコントローラ909を含む。一実施形態では、データ計算ユニット901から単一命令複数データ(SIMD)のような動作を実行するために、単一の同じ命令がアレイ905内のすべての実行レーンにブロードキャストされる。一実施形態では、スカラーメモリ903から読み出され、実行レーンアレイ905の実行レーンに発行される命令の命令フォーマットは、命令当たり2つ以上のオペコードを含む非常に長い命令語(VLIW)タイプのフォーマットを含む。さらなる実施形態では、VLIWフォーマットは、(以下に説明するように、一実施形態では2つ以上の従来のALU動作を指定することができる)各実行レーンのALUによって実行される数学的機能を指示するALUオペコードと、(特定の実行レーンまたは実行レーンのセットに対してメモリ操作を指示する)メモリオペコードとの両方を含む。
【0087】
「実行レーン」という用語は、命令を実行することができる1つ以上の実行ユニットのセット(例えば、命令を実行することができる論理回路系)を指す。実行レーンは、しかしながら、様々な実施形態では、単なる実行ユニットを超えた、よりプロセッサに似た機能を含むことができる。例えば、1つ以上の実行ユニットに加えて、実行レーンは、受信された命令をデコードする論理回路系、または、より単一命令複数データ(SIMD)のような設計の場合、命令をフェッチおよびデコードする論理回路系を含むことができる。MIMDのようなアプローチに関しては、ここでは集中プログラム制御アプローチが主に記載されているが、より分散型のアプローチが様々な代替実施形態(例えば、アレイ905の各実行レーン内のプログラムコードおよびプログラムコントローラを含む)において実施されてもよい。
【0088】
実行レーンアレイ905、プログラムコントローラ909および二次元シフトレジスタ構造906の組み合わせは、広範囲のプログラマブルな機能のための幅広く適応可能/設定可能なハードウェアプラットフォームを提供する。例えば、アプリケーションソフトウェア開発者は、個々の実行レーンが多種多様な機能を実行することができ、任意の出力アレイ位置に近接した入力画像データに容易にアクセスすることができれば、寸法(例えばステンシルサイズ)だけでなく幅広い異なる機能能力を有するカーネルをプログラミングすることができる。
【0089】
実行レーンアレイ905によって操作される画像データのためのデータ記憶装置として機能することとは別に、ランダムアクセスメモリ907は、セクション1.0で説明した仮想処理メモリのルックアップテーブル成分に保持される任意のルックアップテーブルなどのような1つ以上のルックアップテーブルを保持することもできる。様々な実施形態では、1つ以上のスカラールックアップテーブルをスカラーメモリ903内でインスタンス化することもできる。1つ以上のスカラールックアップテーブルは、セクション1.0で上述したメモリモデルのスカラールックアップテーブル成分に保持される任意のスカラールックアップテーブルであってもよい。
【0090】
スカラールックアップは、同じルックアップテーブルからの同じインデックスからの同じデータ値を実行レーンアレイ905内の各実行レーンに渡すことを含む。様々な実施形態では、上述のVLIW命令フォーマットは、スカラープロセッサによって実行されるルックアップ動作をスカラールックアップテーブルに向けるスカラーオペコードを含むようにも拡張される。オペコードとともに使用するために指定されたインデックスは、即値オペランドでもよいし、他のデータ記憶位置からフェッチされてもよい。いずれにせよ、一実施形態では、スカラーメモリ内のスカラールックアップテーブルからのルックアップは、基本的に同じクロックサイクル中に実行レーンアレイ905内のすべての実行レーンに同じデータ値をブロードキャストすることを含む。ルックアップテーブルの使用および動作に関する追加の詳細は、以下でさらに説明する。
【0091】
図9bは、上述のVLIW命令ワードの実施形態を要約したものである。
図9bにおいて見られるように、VLIW命令ワードフォーマットは、3つの別個の命令、すなわち、1)スカラープロセッサによって実行されるスカラー命令951、2)実行レーンアレイ内でそれぞれのALUによってSIMD方式でブロードキャストされ実行されるALU命令952、および3)部分的SIMD方式でブロードキャストされ実行されるメモリ命令953に対するフィールドを含む(例えば、実行レーンアレイ内において同じ行に沿った実行レーンが同じランダムアクセスメモリを共有する場合、異なる行の各々からの1つの実行レーンが実際に命令を実行する(メモリ命令953のフォーマットは、各行からのどの実行レーンが命令を実行するかを識別するオペランドを含むことができる)。
【0092】
1つ以上の即時オペランドに対するフィールド954も含まれる。命令951,952,953のどれが、どの即時オペランド情報を用いるかは命令フォーマットで識別されてもよい。命令951,952,953の各々は、また、それ自身のそれぞれの入力オペランドおよび結果情報(例えば、ALU演算用のローカルレジスタならびにメモリアクセス命令用のローカルレジスタおよびメモリアドレス)を含む。一実施形態では、スカラー命令951は、実行レーンアレイ内の実行レーンが他の2つの命令952,953のいずれかを実行する前にスカラープロセッサによって実行される。すなわち、VLIWワードの実行は、スカラー命令951が実行される第1のサイクルと、続いて他の命令952,953が実行されてもよい第2のサイクルとを含む。(様々な実施形態では、命令952,953は並列して実行されてもよい)。
【0093】
一実施形態では、スカラープロセッサ902によって実行されるスカラー命令は、シートをデータ計算ユニット901のメモリもしくは2Dシフトレジスタ906からロードまたはそれに格納するようシート生成部703に発行されるコマンドを含む。ここで、シート生成部の動作は、ラインバッファユニット701の動作またはスカラープロセッサ902によって発行されたコマンドをシート生成部703が完了するのに要するサイクル数のプレランタイムの理解を妨げる他の変数に依存し得る。したがって、一実施形態では、スカラー命令951がシート生成部に発行されるべきコマンドに対応するか、さもなければコマンドをシート生成部703に発行させるVLIWワードは、他の2つの命令フィールド952,953に無操作(NOOP)命令を含む。次に、プログラムコードは、シート生成部がデータ計算ユニットに対するそのロードまたはデータ計算ユニットからのその格納を完了するまで、命令フィールド952,953についてNOOP命令のループに入る。ここで、シート生成部にコマンドを発行すると、スカラープロセッサは、シート生成部がコマンドの完了時にリセットするインターロックレジスタのビットをセットしてもよい。NOOPループの間、スカラープロセッサはインターロックビットのビットを監視する。スカラープロセッサが、シート生成部がそのコマンドを完了したことを検出すると、通常の実行が再び開始される。
【0094】
図10は、データ計算ユニット1001の一実施形態を示す。
図10において見られるように、データ計算ユニット1001は、二次元シフトレジスタアレイ構造1006「の上に」論理的に位置決めされる実行レーンのアレイ1005を含む。上述したように、様々な実施形態では、シート生成部によって提供される画像データのシートが二次元シフトレジスタ1006にロードされる。実行レーンは、レジスタ構造1006からのシートデータに対して動作する。
【0095】
実行レーンアレイ1005およびシフトレジスタ構造1006は、互いに対して適所に固定される。しかし、シフトレジスタアレイ1006内のデータは、戦略的かつ調整された態様でシフトして、実行レーンアレイ内の各実行レーンがデータ内で異なるステンシルを処理するようにする。したがって、各実行レーンは、生成されている出力シートにおいて異なるピクセルに対する出力画像値を決定する。
図10のアーキテクチャから、実行レーンアレイ1005が垂直に近接する実行レーンおよび水平に近接する実行レーンを含むので、重なり合うステンシルが垂直に配置されるだけでなく水平にも配置されることは明らかである。
【0096】
データ計算ユニット1001のいくつかの注目すべきアーキテクチャ上の特徴には、実行レーンアレイ1005よりも広い寸法を有するシフトレジスタ構造1006が含まれる。すなわち、実行レーンアレイ1005の外側にレジスタ1009の「ハロー」が存在する。ハロー1009は、実行レーンアレイの2つの側に存在するように示されているが、実現例に応じて、実行レーンアレイ1005の2つ未満(1つ)またはそれ以上(3つまたは4つ)の側に存在してもよい。ハロー1005は、データが実行レーン1005の「下で」シフトしているときに、実行レーンアレイ1005の境界の外側にこぼれ出るデータのための「スピルオーバ」空間を提供する働きをする。単純なケースとして、実行レーンアレイ1005の右端を中心とする5×5のステンシルは、ステンシルの最も左側のピクセルが処理されるとき、さらに右側に4つのハローレジスタ位置を必要とすることになる。図面を簡単にするために、
図10は、名目上の実施例において、どちらの側(右、底)のレジスタでも水平方向接続および垂直方向接続の両方を有するであろうとき、ハローの右側のレジスタを、水平方向シフト接続を有するだけとして、およびハローの底側のレジスタを、垂直方向シフト接続を有するだけとして示す。
【0097】
アレイの各行および/もしくは各列またはその一部分に結合されるランダムアクセスメモリ1007によって追加のスピルオーバールームが提供される(例えば、ランダムアクセスメモリは、4つの実行レーン行状と2つの実行レーン列状にまたがる実行レーンアレイの「領域」に割り当てられてもよい。簡略化のために、アプリケーションの残りの部分は、主に、行および/または列に基づく割り当てスキームを指す)。ここで、実行レーンのカーネル動作が、それが(一部の画像処理ルーチンが必要とする場合がある)二次元シフトレジスタアレイ1006の外にあるピクセル値を処理することを必要とする場合、画像データの面は、ハロー領域1009からランダムアクセスメモリ1007にさらにこぼれ出ることができる。例えば、ハードウェアが実行レーンアレイの右端の実行レーンの右側にわずか4つの記憶素子のハロー領域を含む場合の6X6ステンシルを考える。この場合、ステンシルを完全に処理するために、データをハロー1009の右端からさらに右側にシフトする必要があるであろう。ハロー領域1009の外側にシフトされたデータは、ランダムアクセスメモリ1007にこぼれ出る。ランダムアクセスメモリ1007および
図3のステンシルプロセッサの他の適用例を以下でさらに説明する。
【0098】
図11aないし
図11kは、上述のように実行レーンアレイ「の下で」二次元シフトレジスタアレイ内で画像データがシフトされる態様の実施例を示す。
図11aにおいて見られるように、二次元シフトアレイのデータ内容は第1のアレイ1107に示され、実行レーンアレイはフレーム1105によって示される。また、実行レーンアレイ内の2つの近隣の実行レーン1110が簡略化して示されている。この簡単な図示1110では、各実行レーンは、シフトレジスタからデータを受け付け、ALU出力からデータを受け付け(例えば、サイクルにわたってアキュムレータとして動作する)、または出力データを出力先に書き込むことができるレジスタR1を含む。
【0099】
各実行レーンはまた、ローカルレジスタR2において、二次元シフトアレイにおけるそれ「の下の」内容が利用可能である。したがって、R1は実行レーンの物理レジスタであり、R2は二次元シフトレジスタアレイの物理レジスタである。実行レーンは、R1および/またはR2によって提供されるオペランドに対して動作可能なALUを含む。さらに詳細に後述するように、一実施形態では、シフトレジスタは、実際にはアレイ位置ごとに複数の(ある「深さ」の)記憶/レジスタ素子で実現されるが、シフト動作は記憶素子の1つの面に限られる(例えば、記憶素子の1つの面のみがサイクルごとにシフトすることができる)。
図11aないし
図11kは、それぞれの実行レーンから結果のXを格納するために使用されるとしてこれらのより深いレジスタ位置の1つを示している。例示を容易にするために、より深い結果のレジスタは、その対応するレジスタR2の下ではなく、その横に図示されている。
【0100】
図11a〜
図11kは、実行レーンアレイ1105内に示された実行レーン位置1111の対に中心位置が整列された2つのステンシルの計算に焦点を当てている。例示を容易にするために、実行レーン1110の対は、実際には、以下の例によれば、それらが垂直方向の近隣実行レーンである場合に、水平方向の近隣実行レーンとして図示されている。
【0101】
図11aで最初に見られるように、実行レーン1111はそれらの中央のステンシル位置上に中心を配される。
図11bは、両方の実行レーン1111によって実行されるオブジェクトコードを示す。
図11bにおいて見られるように、両方の実行レーン1111のプログラムコードは、シフトレジスタアレイ1107内のデータを、1つの位置だけ下にシフトさせ、1つの位置だけ右にシフトさせる。これにより、両方の実行レーン1111がそれらのそれぞれのステンシルの左上隅に整列される。次に、プログラムコードは、(R2において)それらのそれぞれの位置にあるデータをR1にロードさせる。
【0102】
図11cに示すように、次にプログラムコードは、実行レーン1111の対に、シフトレジスタアレイ1107内のデータを1単位だけ左にシフトさせ、各実行レーンのそれぞれの位置の右の値を各実行レーンの位置にシフトさせる。R1の値(以前の値)は、次いで、(R2における)実行レーンの位置にシフトした新しい値とともに加算される。結果はR1に書き込まれる。
図11dで見られるように、
図11cについて上述したのと同じプロセスが繰り返され、結果のR1に対して、今度は上側実行レーンにおける値A+B+C、および下側実行レーンにおけるF+G+H値を含ませるようにする。この時点で、両方の実行レーン1111はそれらのそれぞれのステンシルの上側の行を処理している。(左側に存在する場合には)実行レーンアレイ1105の左側でハロー領域に、またはハロー領域が存在しない場合にはランダムアクセスメモリにこぼれ出ることは、実行レーンアレイ1105の左側には存在しないことに注目されたい。
【0103】
図11eに示すように、次に、プログラムコードは、シフトレジスタアレイ内のデータを1単位だけ上にシフトさせ、両方の実行レーン1111をそれらのそれぞれのステンシルの中間行の右端に整列される。両方の実行レーン1111のレジスタR1は、現在、ステンシルの最上行および中間行の一番右の値の合計を含む。
図11fおよび
図11gは、両方の実行レーンのステンシルの中間行にわたって左方向に移動する継続的な進行を示す。累積加算は、
図11gの処理の終了時に、両方の実行レーン1111がそれらのそれぞれのステンシルの最上行の値と中間行の値との合計を含むように、継続する。
【0104】
図11hは、各実行レーンをそれの対応するステンシルの最下行に整列させる別のシフトを示す。
図11iおよび
図11jは、両方の実行レーンのステンシルの過程にわたって処理を完了するための継続的なシフトを示す。
図11kは、各実行レーンをデータアレイにおいてそれの正しい位置に整列させ、その結果をそこに書き込むための追加のシフトを示す。
【0105】
図11a〜
図11kの例では、シフト動作のためのオブジェクトコードは、(X、Y)座標で表されるシフトの方向および大きさを識別する命令フォーマットを含むことができることに留意されたい。例えば、1つの位置分の上方向シフトのためのオブジェクトコードは、オブジェクトコードでSHIFT0,+1として表現されてもよい。別の例として、1つの位置分の右方向へのシフトは、オブジェクトコードでSHIFT+1,0として表現されてもよい。様々な実施形態では、より大きい大きさのシフトも、オブジェクトコードで指定することができる(例えば、シフト0,+2)。ここで、2Dシフトレジスタハードウェアが1サイクルにつき1つの位置だけしかシフトをサポートしない場合、命令は機械によって複数のサイクル実行を要求するように解釈されてもよく、または2Dシフトレジスタハードウェアは、1サイクルにつき2つ以上の位置分シフトをサポートするように設計されてもよい。後者の実施形態はより詳細にさらに下に記載される。
【0106】
図12は、アレイ実行レーンおよびシフトレジスタ構造の単位セルの別のより詳細な図を示す(ハロー領域のレジスタは、対応する実行レーンを含まない)。実行レーンおよび実行レーンアレイの各位置に関連するレジスタ空間は、一実施形態では、実行レーンアレイの各ノードで、
図12に示す回路系をインスタンス化することによって実施される。
図12に示すように、単位セルは、4つのレジスタR2〜R5からなるレジスタファイル1202に結合される実行レーン1201を含む。任意のサイクルの間、実行レーン1201は、レジスタR1〜R5のいずれかから読み書きすることができる。2つの入力オペランドを必要とする命令の場合、実行レーンはR1〜R5のいずれかからオペランドの両方を取り出すことができる。
【0107】
一実施形態では、二次元シフトレジスタ構造は、近隣のレジスタファイル間のシフトが同じ方向にあるように(例えば、すべての実行レーンは左にシフトする、すべての実行レーンは右にシフトするなど)、それの近隣のレジスタファイルが入力マルチプレクサ1204を介する場合に、単一のサイクルの間に、レジスタR2〜R4のいずれか(ただ)1つの内容が、出力マルチプレクサ1203を介してその近隣のレジスタファイルの1つにシフト「アウト」され、対応するものからシフト「イン」される内容でレジスタR2〜R4のいずれか(ただ)1つの内容が置き換えられることによって、実現される。同じレジスタがその内容がシフトアウトされて同じサイクルでシフトインされる内容で置き換えられるのが一般的であるかもしれないが、マルチプレクサ構成1203,1204は、同じサイクル中に同じレジスタファイル内で異なるシフトソースおよびシフトターゲットレジスタを可能にする。
【0108】
図12に示すように、シフトシーケンスの間、実行レーンは、内容をそのレジスタファイル1202からその左、右、上および下の近隣のレジスタファイルにシフトアウトする。同じシフトシーケンスと関連して、実行レーンは、さらに、内容をその左、右、上および下の近隣のレジスタファイルの特定のものからそれのレジスタファイルにシフトする。再び、シフトアウトターゲットおよびシフトインソースは、すべての実行レーンについて同じシフト方向と整合しなければならない(例えば、シフトアウトが右隣に対する場合、シフトインは左隣からでなければならない)。
【0109】
一実施形態では、1サイクルにつき1つの実行レーンにつき1つのレジスタの内容だけをシフトすることが許されるが、他の実施形態では、2つ以上のレジスタの内容をシフトイン/アウトすることが許されてもよい。例えば、
図12に示されたマルチプレクサ回路系1203,1204の第2の例が
図12の設計に組み込まれる場合、同じサイクルの間に2つのレジスタの内容がシフトアウト/インされてもよい。もちろん、1つのレジスタの内容だけがサイクルごとにシフトされることが許される実施形態では、数学的演算間のシフトのためにより多くのクロックサイクルを消費することによって、複数のレジスタからのシフトが数学的演算間に起こってもよい(例えば、2つのレジスタの内容が、数学的演算間で2つのシフト演算を消費することによって数学的演算間でシフトされてもよい)。
【0110】
実行レーンのレジスタファイルのすべての内容未満がシフトシーケンス中にシフトアウトされる場合、各実行レーンのシフトアウトされないレジスタの内容は適所に残る(シフトしない)ことに留意されたい。したがって、シフトインされる内容と置き換えられないシフトされない内容は、シフトサイクルにわたって実行レーンにローカルに維持される。各実行レーンで見られるメモリユニット(「M」)は、データを、実行レーンアレイ内の実行レーンの行および/または列に関連付けられるランダムアクセスメモリ空間からロードまたはそれに格納するために使用される。ここで、Mユニットは、実行レーンの自身のレジスタ空間からロードまたはそれに格納できないデータをロード/格納するためによく使用されるという点で、標準的なMユニットとして機能する。様々な実施形態では、Mユニットの主な動作は、ローカルレジスタからメモリにデータを書き込み、メモリからデータを読み出してそれをローカルレジスタに書き込むことである。
【0111】
ハードウェア実行レーン1201のALUユニットによってサポートされるISAオペコードに関して、様々な実施形態において、ハードウェアALUによってサポートされる数学的オペコードは、仮想実行レーンによってサポートされる数学的オペコード(例えば、ADD、SUB、MOV、MUL、MAD、ABS、DIV、SHL、SHR、MIN/MAX、SEL、AND、OR、XOR、NOT)と一体的に結び付けられる(例えば実質的に同じである)。上述のように、メモリアクセス命令は、実行レーン1201によって実行され、データをそれらの関連付けられるランダムアクセスメモリからフェッチまたはそれに格納することができる。さらに、ハードウェア実行レーン1201は、シフト演算命令(右、左、上、下)をサポートし、二次元シフトレジスタ構造内でデータをシフトする。上述したように、プログラム制御命令は主にステンシルプロセッサのスカラープロセッサによって実行される。
【0112】
3.0 画像プロセッサにおいて実現されるブロック処理
a.行/列合計演算
図13および
図14a、
図14bは、行/列合計演算に関する。行/合計列演算は、統計計算、ノイズ抑制、および大規模ダウンサンプリングに特に有用である。行合計演算および/または列合計演算は、先のセクションで上述した画像プロセッサの実施形態などの、二次元実行レーンアレイおよび対応する二次元シフトレジスタアレイを有する画像プロセッサ上で実施することができる。
【0113】
図13に見られるように、行合計演算はアレイの同じ行内のすべての値を加算し、列合計演算はアレイの同じ列内のすべての値を加算する。さらに、図示のように、行合計演算で、すべての行の値をそれらのそれぞれの行内で同時に加算することができる。同様に、列合計演算で、すべての列の値をそれぞれの列内で同時に加算できる。しかしながら、シフトレジスタアレイの多用途性のため、すべての行または列にわたる合計は必要条件ではない。すなわち、アレイ内のすべての行より少ない行が同時に合計されてもよく、またはアレイ内のすべての列より少ない列が同時に合計されてもよい。
【0114】
図14a〜
図14dは、行合計演算を実施するためのマシンレベル演算の実施形態を示す図である。単純化のため、単一行のみを示す。読者は、
図14a〜
図14dに示された演算が列にも適用され得ることを理解するであろう。さらに、行演算または列演算の両方について、
図14a〜
図14dのシーケンスは、アレイ内の複数の行または列に対して同時に実行することもできる。加えて、行の次元は8つの位置の幅であるよう示されているだけである(が、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは16×16以上であってもよい)。
【0115】
一実装形態では、
図14aに見られるように、二次元シフトレジスタアレイは、アレイ1401の両端の間の直接論理シフトをサポートするように設計されている。すなわち、シフトレジスタは、行軸に沿ってシフトを実行するときに、その内容を右端のアレイ列と左端のアレイ列の間で「ロール」もしくは「ループ」もしくは「ラップ」することができ、および/または列軸に沿ってシフトを実行するときに、その内容を一番上のアレイ行と一番下のアレイ行との間でロールもしくはループすることができる。さらに、様々な実施形態において、シフトレジスタは単一の命令において複数のレジスタ位置ホップをサポートすることができる(例えば、シフト命令に関連付けられるオペコードおよび/または変数は、シフト量が水平軸および/または垂直軸に沿って+/-1, +/-2, +/-3または+/-4であるかどうかを指定する)。ハードウェアでサポートされていないシフト距離は、コンパイラによってエミュレートされ得る。
【0116】
図14aに見られるように、最初に、行に、データ値A0〜A7が、各実行レーンのそれぞれのR0およびR1レジスタ位置にロードされる。
図14bに見られるように、マシン演算の1回目の反復において、R1レジスタ空間位置は次いで1位置左にシフトされ、各実行レーンのR1およびR0の内容が合計されてその結果がR0およびR1に書き戻される。これにより、R1内に第1の累積部分和が生成され、これは、以下の説明でより明らかにされるように、総和演算のための累積器として機能する。
【0117】
図14cに示すマシン演算の次の反復では、R1レジスタ空間位置が2つの位置だけ左にシフトされ、各実行レーンのR1およびR0の内容が合計される。結果は再びR0およびR1に保持される。最後に、
図14dに示されるマシン演算の3回目の反復において、R1レジスタ空間位置は4つの位置だけ左にシフトされ、その結果はレジスタ位置R0およびR1の一方または両方に書き込まれる。したがって、
図14b、
図14c、および
図14dの合計演算の反復を見ると、シフト量は各反復で2倍になり、完全な結果はわずか3回の反復後に(すなわち、
図14cのように)すべてのレーンに存在することに留意されたい。幅16の行の場合、シフト量は4回目の反復に対して8つの位置になり、4回目の反復後に演算は完了する。
【0118】
b.行/列プレフィックス合計演算
図15および
図16a〜
図16dは、同様に、二次元実行レーンアレイおよび対応する二次元シフトレジスタを有する画像プロセッサ上で実行できる行/列プレフィックス合計演算に関する。行/列プレフィックス合計演算は、積分画像、ボックスフィルタの加速、および圧縮演算のためのアドレスの計算に特に有用である。
図15を参照すると、単純化のため、単一の行のみが示されている。ただし、列に対して演算を実行することもできる。また、1行しか描かれていないが、様々な実現例において、すぐ上で論じた行/列合計演算と同様に、(すべての行/列を含む)レジスタアレイ内の任意の数の行(または列)を同時に合計することができる。加えて、
図15の行の次元は8つの位置の幅であるよう示されているだけであるが、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは16×16以上であってもよい。
【0119】
図15で見られるように、行内の任意の位置に対する行プレフィックス演算の結果は、その位置に至るまでの値の合計である。同様に、列内の任意の位置に対する列プレフィックス演算の値は、その位置に至るまでの値の合計である。
【0120】
図16a〜
図16dは行プレフィックス演算のためのマシンレベル演算の実施例を示す。前のセクションで詳細に論じた行合計演算と同様に、行プレフィックス演算は、アレイ端位置間1601でシフトをロールすることができる二次元シフトレジスタを使用する。
【0121】
図16aに見られるように、最初に、行に、データ値A0〜A7が、各実行レーンのそれぞれのR0レジスタ位置にロードされる。また、各実行レーンのR2レジスタ空間にヌル(「0」)がロードされる。
【0122】
図16bに示されるマシンレベル演算の1回目の反復において、R0レジスタ空間位置は、目的地位置のR1レジスタ空間へと1つの位置右にシフトされる。後続のADD演算は、反復回数に対するレーンの位置に応じて、R0内容をR1内容またはR2内容のいずれかと加算する。具体的には、1番目の行位置は、R2内のヌルを選択し(R1内のシフトされた内容を選択しない)、なぜならば、その位置(0)は2
N−1以下(ここで、Nは反復回数(2
0−1=0)であるからであり、そのヌルをR0の内容に加算し、その結果をR0に格納する。したがって、1番目の行位置はR0にA0の値を維持する。
【0123】
対照的に、他の行位置の各々は、それらの位置が2
N−1より大きいため、(R2内のヌル値ではなく)R1内のシフトされた内容を選択し、それをR0内の内容に加算して、その結果をR0に格納する。したがって、1番目の行位置以外の各行位置は、それの元の内容とそれの最も左隣との合計をR0に保持し、1番目の行位置は単にそれの元の内容のみをR0に保持する。
【0124】
図16cに示されるマシンレベル演算の2回目の反復において、R0レジスタ空間位置の内容は目的地のR1レジスタ空間内へと2つの位置右にシフトされる。したがって、すぐ上で説明した行/列演算と同様に、マシン演算の次の反復ごとに、シフト量は2倍になる。1番目の反復と同様に、後続のADD演算は、現在の反復回数に対するレーンの位置に応じて、R0の内容をR1の内容またはR2の内容のいずれかと加算する。この場合、第1および第2の行位置はR2内のヌルを選択し(R1内のシフトされた内容を選択しない)、なぜならば、それらの位置(0,1)は2
N−1(2
1−1=1)以下であるからである。したがって、これらのレーンはヌル値をR0の内容に加算し、その結果をR0に格納し戻す。したがって、1番目の行位置はそれの値A0をR0に維持し、2番目の行位置はA0+A1の値をR0に維持する。
【0125】
対照的に、他の行位置の各々は、それらの位置が2
N−1より大きいため、(R2内のヌル値ではなく)R1内のシフトされた内容を選択し、R1の内容をR0内の内容に加算して、その結果をR0に格納する。したがって、1番目および2番目の行位置以外の各行位置は、それの元の内容と内容がシフトされたそれの総計とに基づいた累積合計を、R0に保持する。
【0126】
図16dに示されるマシンレベル演算の3回目の反復では、R0レジスタ空間位置は目的地のR1レジスタ空間へと4つの位置右にシフトされる。したがって、やはり、マシン演算の次の反復ごとに、シフト量は2倍になる。以前の反復と同様に、後続のADD演算は、現在の反復回数に対するレーンの位置に応じて、R0の内容をR1の内容またはR2の内容のいずれかと加算する。この場合、第1〜第4番目の行位置(0〜3)はR2内のヌルを選択し(R1内のシフトされた内容を選択しない)、なぜならば、それらの位置は2
N−1(2
2−1=3)以下であるからである。したがって、これらのレーンの各々はヌル値をR0の内容に加算し、その結果をR0に格納し戻す。したがって、1番目の行位置はそれの元の値A0をR0に維持し、2番目の行位置はA0+A1の値をR0に維持し、3番目の行位置はA0+A1+A2の値をR0に維持し、4番目の行位置はA0+A1+A2+A3の値をR0に維持する。
【0127】
対照的に、他の行位置の各々は、それらの位置が2
N−1より大きいままであるため、(R2内のヌル値ではなく)R1内のシフトされた内容を選択し、R1の内容をR0内の内容に加算して、その結果をR0に格納する。したがって、1番目、2番目および3番目の行位置以外の各行位置は、それの元の内容と内容がシフトされたそれの総計とに基づいた累積合計を保持する。
【0128】
3回目の反復の後、プレフィックス合計演算は完了する。行が16次元であれば、16個の実行レーンすべてにおいて16個の異なる位置すべてに一意の合計を累積するのに、R1レジスタの内容を8つの位置だけシフトするわずかもう1セットの演算だけが必要となるであろう。
【0129】
c.行/列最小値発見演算
図17および
図18a〜
図18dは、二次元実行レーンアレイおよび対応する二次元シフトレジスタを有する画像プロセッサ上で同じく実行可能な行/列最小値発見演算に関する。行/列最小値発見演算は、統計計算およびブロックマッチングの後処理に特に役立つ。
【0130】
図17を参照すると、単純化のため、単一の行のみが示されている。しかしながら、実際の実施では、列最小値発見演算を、行最小値発見演算を実施するのと同じプロセッサ上で実施することができる。さらに、ある行(または列)の最小値を、(最大ですべての行/列を含む)レジスタアレイにおける任意の数の行(または列)について同時に見つけることができる。加えて、行/列の次元は8つの位置の幅であるよう示されているだけであるが、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは16×16以上であってもよい。
【0131】
図17に見られるように、行最小値発見演算の結果は、同じ行内のすべての値のうちの最小値およびその行内のそれの場所/位置(それのインデックスとも呼ばれる)に対応する。同様に、列最小値発見演算の結果は、同じ列内のすべての値のうちの最小値およびその列内のそれの場所/位置に対応する。先のセクションで詳細に論じた行合計演算およびプレフィックス合計演算と同様に、行/列最小値発見演算は、アレイ端位置間1701でシフトをロールすることができる二次元シフトレジスタを使用する。
【0132】
図18a〜
図18dは行プレフィックス演算のためのマシンレベル演算の実施例を示す。最初に、
図18aに見られるように、行に、データ値A0〜A7が、各実行レーンのそれぞれのR0レジスタ位置にロードされる。また、各行位置のインデックスが各実行レーンのR1レジスタ空間にロードされる。
【0133】
図18bに示されるマシンレベル演算の1回目の反復において、R0およびR1レジスタ位置の内容は、近隣の実行レーンのレジスタ空間のR2およびR3レジスタ空間に1単位シフトされる。次いで、R0レジスタおよびR2レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、R0およびR1のレジスタ空間に格納される。つまり、R0値がR2値より小さければ、R0およびR1のレジスタはそれらの元の内容を維持する。一方、R2値がR0値より小さければ、R2値はR0に書き込まれ、R3値はR1に書き込まれる。これには、比較の最小値をR0に、それのインデックスをR1に保持するという効果がある。
【0134】
図18cに示されるマシンレベル演算の2回目の反復において、R0およびR1レジスタ位置の内容は、下流の実行レーンのR2およびR3レジスタ空間へと2単位シフトされる。したがって、やはり、シフト量は次の反復で2倍になる。次いで、R0レジスタおよびR2レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、R0およびR1のレジスタ空間に格納される。これは、各実行レーンで実行された両方の比較から見られる最小値をR0に、それのインデックスをR1に保持する効果がある。
【0135】
図18dに示されるマシンレベル演算の3回目の反復において、R0およびR1レジスタ位置の内容は、下流の実行レーンのR2およびR3レジスタ空間へと4単位シフトされる。次いで、R0レジスタおよびR2レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、R0およびR1のレジスタ空間に格納される。これは、各実行レーンで実行されたすべての3つの比較から見られる最小値をR0に、それのインデックスをR1に保持する効果がある。
【0136】
3回目の反復の後、各実行レーンは、行全体の最小値をそれのR0レジスタ空間に、それの対応するインデックスをそれのR1レジスタ空間に有することになるため、最小値発見演算は完了する(最初に最小値が与えられた行位置は、それ自身の行位置がそれのR1レジスタ空間において識別されるのを知ることになる)。仮に行が16次元である場合、シフトレジスタにおいてR0およびR1レジスタの内容を下流に8つの位置だけシフトすることに基づくわずかもう1つの演算セットだけが、16の実行レーンすべてにおいて16の異なる位置すべてのうちの最小値を与えるために必要となるであろう。
【0137】
最大値発見演算も、コアの数学的演算が最小値を見つけるのではなく最大値を見つけることを含むことを除いて、上記と同じ原理を使用して実施することができることに留意されたい。
【0138】
d.行列乗算
図19a、
図19bおよび
図20は行列乗算に関する。行列乗算は、離散フーリエ変換またはコサイン変換(圧縮およびフィルタ処理の一般的な基本要素である)に対して、およびより大きな行列/乗算演算(一般に画像認識で使用される)を表現する場合に、特に便利である。2つの行列AおよびBの行列乗算は、結果における各行列座標位置について、座標位置の行内の要素と座標位置の列内のそれらの対応する要素との積を合計することによって実行される。
図19bは、
図19aの行列AおよびBの行列倍数について得られた行列Xを示す。ここで、結果として得られる行列C内の2つの座標位置1901、1902に対する行列AおよびBの関連付けられる部分積項が特別に示されている。
【0139】
特に、例えば、
図19bの、結果として得られる行列C内の座標位置c12に対する、結果として得られる積は、
(a11*b11) + (a12*b21) + (a13*b31) + (a14*b41)
であり、これは、
図19aの行列Aの行1901の要素が行列Bの列1902の対応する要素で乗算されるのに対応する。
【0140】
同様に、
図19bの、結果として得られる行列Cにおける座標位置c22に対する、結果として得られる積は、
(a21*b12) + (a22*b22) + (a23*b32) + (a24*b42)
であり、これは、
図19aの行列Aの行1903の要素が行列Bの列1902の対応する要素で乗算されるのに対応する。これら2つの例からわかるように、結果として得られる行列C内の任意の座標位置x、yについての結果は、次のように表すことができる:
Σ
k = 1 to 4 (a
x,k)*(b
k,y)
図20a〜
図20eは、二次元実行レーンアレイ、および対応する二次元シフトレジスタアレイの独自のシフト利点を使用する行列乗算演算の実施形態を示す。
【0141】
図20aに見られるように、最初に、2つの行列AおよびBが二次元シフトレジスタアレイにロードされる。例えば、行列Aの値を二次元シフトレジスタのR0レジスタ空間にロードし、行列Bの値を二次元シフトレジスタアレイのR1レジスタ空間にロードして、各行列座標が、異なる実行レーンの、関連付けられるレジスタ空間に対応するようにすることができる。再び、説明を容易にするために、4×4行列が描かれているが、実際の実装では、より大きな行列を、対応する、より大きな次元のシフトレジスタアレイと乗算することができる。
【0142】
図20bに見られるように、回転剪断アルゴリズムシフトが両方の行列に適用され、行方向回転剪断アルゴリズムシフトシーケンスが行列Aに適用され、列方向回転剪断アルゴリズムシフトシーケンスが行列Bに適用される。当技術分野で知られているように、回転剪断アルゴリズムは、シフト量をN−1だけ増加させ、ここで、Nは行列内の位置である。
【0143】
したがって、
図20bに見られるように、行列Aの第1の行は全くシフトされず、行列Aの第2の行は1単位シフトされ、行列Aの第3の行は2単位シフトされ、行列Aの第4の行は3単位シフトされる。同様に、行列Bの第1の列は全くシフトされず、行列Bの第2の列は1単位シフトされ、行列Bの第3の列は2単位シフトされ、行列Bの第4の列は3単位シフトされる。ここで、二次元シフトレジスタアレイは、行方向シフトと列方向シフトとの両方について、アレイ端で要素をロールさせることができると理解される。
【0144】
なお、二次元シフトレジスタアレイおよび対応する実行レーンアレイが有する、各実行レーンによって実行されるそれぞれのシフト命令が異なる入力オペランドデータを指定することができるという多用途性のため、二次元シフトレジスタアレイは、同時に同じ行列についてすべての実行レーンにわたって同時にシフト命令を実行しながら、異なる行を異なる水平シフト量だけ、および異なる列を異なる垂直シフト量だけシフトすることができる(様々な実施形態において、同じ行内のレーンに対して同じ水平シフト量を指定しなければならず、同じ列内のレーンに対して同じ垂直シフト量を指定しなければならない)。したがって、おそらく、A行列およびB行列の両方の剪断は、わずか2サイクルで完了することができる(すなわち、シフトレジスタが単一サイクルで複数のホップシフトを実現できると仮定して、1つの行列に対するすべてのシフトが1サイクルで実行される)。
【0145】
図20bに見られるように、行列AおよびB内のデータが剪断アルゴリズムから再整列されると、各実行レーンはそれの対応する二次元シフトレジスタ空間内のA値およびB値を乗算する乗算演算が実行される。ここで、A値は、例えばR0空間に保持され、B値はR1空間に保持されることを思い出されたい。乗算結果はローカルのR2空間に格納される。初期条件としてナル値がR3空間にロードされ、R2での乗算の結果がR3の内容に加算される。合計の結果はR3に格納し戻される。以下の教示から明らかになるように、R3は行列乗算演算の過程にわたって部分積項の合計を累積する累積器のロールを引き受ける。
【0146】
理解を容易にするために、
図20bは、もともと
図19bに示された、結果として得られる行列C内の座標位置c11およびc22についての1回目の反復後の、結果として得られるR3空間内の内容を明示的に示している。ここで、
図20bの1回目の反復の後、位置C11でのR3レジスタ空間は部分積項a11*b11を含み、位置C22でのR3レジスタ空間は部分積項(a21*b12)を含む。
【0147】
図20cに見られるように、次の反復で、行列Aデータを含むR0レジスタは次いで1単位水平方向にシフトされ、行列Bデータを含むR1レジスタは1単位垂直方向にシフトされる。次いで、
図20bに関して直ぐ上に説明した数学的演算が繰り返される。しかしながら、ここで、各レーンのR3レジスタ空間は最初に1回目の反復の部分積項(例えば、位置c11のR3のa11*b11および位置c22のR3のa21*b12)を含む。このように、反復の終わりに、レジスタR3はこれまでに計算された両方の部分積の累積和を含むことになる。すなわち、位置c11のR3は合計(a11*b11)+(a12*b21)を有し、位置c22のR3は合計(a21*b12)+(a22*b22)を有することになる。
【0148】
図20dおよび
図20eで見られるように、両方の行列について単一の単位シフトをさらに2回繰り返した後に積和が続いた後、行列乗算は、各レジスタアレイ位置がそれのローカルR3レジスタ空間内に部分積の正しい合計を有して完了する。
【0149】
e.二次元離散フーリエ変換(2D DFT)
図21は、二次元DFT(2D DFT)を示す。2D DFTは、ノイズの低減および畳み込みの高速化に特に役立つ。
図21に見られるように、2D DFTは、2つの複素項2101、2102の積の二次元空間にわたる合計として表すことができる。複素項の第1のもの2101は、大きさおよび位相が時間および周波数の関数であるフェーザに対応する。実現例において、第1の複素項2101は、係数の第1の行列として明示的に計算される。複素項の第2のもの2102は、空間領域から周波数領域に変換されている信号に対応する。
【0150】
簡単にするために、
図21は、第1の複素項2101をRe1 + jIm1として表し、第2の複素項2102をRe2 + jIm2として表す。当技術分野で知られているように、(Re1 + jIm1)*(Re2 + jIm2)の実部は(Re1*Re2) - (Im1*Im2)として表すことができ、虚部はj((Re1*Im2) + (Re2*Im1))として表すことができる。2D空間にわたる2D DFTの合計は、まさに上で詳細に説明した行列乗算と同様に、座標位置の行内の要素の、座標位置の列内の対応する要素による積を、加算する。
【0151】
したがって、DFT結果の実部は、Re1値のアレイおよびRe2値のアレイ上において行列乗算を実行し、結果として得られるアレイからIm1値およびIm2値のアレイ上における行列乗算の結果を減算することによって、計算することができる。同様に、DFT結果の虚部は、Re1値のアレイおよびIm2値のアレイ上において行列乗算を実行し、結果として得られるアレイをRe2値およびIm1値のアレイ上の行列乗算の結果に加算することによって計算できる。
【0152】
図22aは、DFTの実部を計算するためのマシン演算を示す。
図22aに見られるように、Re1値のアレイは二次元シフトレジスタアレイのR0レジスタ空間にロードされ、Re2値のアレイは二次元シフトレジスタアレイのR1レジスタ空間にロードされ、Im1値のアレイは二次元シフトレジスタアレイのR2レジスタ空間にロードされ、Im2値のアレイは二次元シフトレジスタアレイのR3レジスタ空間にロードされる。
図22bで見られるように、回転剪断アルゴリズムが次いでアレイ値の各々に適用され、Re1値およびIm1値は水平方向に剪断され、Re2値およびIm2値は垂直方向に剪断される。
【0153】
図22cで見られるように、Re1*Re2行列乗算およびIm1*Im2行列乗算が次いで実行され、結果はそれぞれR0およびR2レジスタ空間に保持される。次いで、R2レジスタ空間の内容がR0レジスタ空間から減算され、その減算結果は
図22dに見られるようにR0レジスタ空間内にDFT変換の実部を残す。
【0154】
一実施形態では、R0レジスタ空間における実部結果は、R4レジスタ空間(それが存在する場合)に移動されるか、またはシフトレジスタアレイに結合されるローカルメモリに書き出される。次いで、元のRe1値およびIm1値が(例えば、同じローカルメモリから)R0およびR1レジスタ空間に再び書き戻され、水平方向に剪断されて、
図22aのレジスタ内容が二次元シフトレジスタアレイに再現される。
【0155】
次いで、Re1*Im2行列乗算およびRe2*Im1行列乗算が実行され、結果がそれぞれR0およびR2レジスタ空間に保持される。すなわち、R0およびR3の内容に対して行列乗算を行い、その結果をR0に書き戻し、R2およびR1の内容に対して行列乗算を行い、その内容をR2に書き込む。R0およびR2における、結果として得られた行列を、
図22eに示す。次いで、R0レジスタ空間の内容がR2レジスタ空間の内容に加算され、R0に書き戻される。これにより、
図22fに示すように、DFT変換の虚部がR0レジスタ空間に残る。
【0156】
f.FFTバタフライ
当技術分野で知られているように、高速フーリエ変換(FFT)は、DFTに対する、より高速で、より計算量が少ないアプローチである。FFTは、時間領域または空間領域のデータを周波数領域のデータに迅速に変換するために、特別な効率的なアルゴリズムに依存する。そのようなアルゴリズムの重要な要素はバタフライアルゴリズムである。例示的なバタフライアルゴリズムを
図23に示す。ここで、バタフライ演算は、特定の段が同じ行または列の要素間で発生するスワッピングの量を決定する段によって定義される。当技術分野で知られているように、完全なFFTは、バタフライ演算間で、複数の異なる段のバタフライ演算のスワップされた内容上で数学的演算を実行することを含む。
【0157】
図23は、1段、2段、4段の各バタフライ演算を示している。1段バタフライの場合、隣接する要素がスワップされる。2段バタフライの場合、隣接する対の要素がスワップされる。4段バタフライの場合、4つの隣接要素のグループがスワップされる。二次元FFTの場合、信号データの第1のアレイ内の要素は、スワップされた信号データ要素に対して実行される数学的演算を用いて、複数のバタフライ段の各々に従ってスワップされる。
【0158】
図24aは、二次元R0レジスタ空間に記憶されている信号データのアレイにわたって1段1バタフライを達成するために使用することができるマシンレベルシフト演算を示す。簡単にするために、1行だけを示す。二次元シフトレジスタ内のアレイの複数の(例えばすべての)行または列を、見られる特定の行に従って、同時に処理できることを認識することが適切である。
【0159】
ここで、シフトレジスタは、最初に、それの各行にわたってそれのR0レジスタ空間においてA0からA7までロードされる。次いで、シフトレジスタはR0レジスタの内容を1単位右にシフトし、各実行レーンはシフトされたばかりのデータをそれのR1レジスタ空間におけるそれの位置に格納する。次いで、シフトレジスタはR0レジスタの内容を2単位左にシフトする(その結果はR0’とラベル付けされる)。次いで、各実行レーンは、選択操作を実行し、それのローカルR0内容またはそれのローカルR1内容のいずれかを、そのレーンの位置に応じて、R0に格納する(すなわち、R0が選択される場合、R0の内容は変更されないままである)。
図24aの特定の実施形態では、偶数レーンはR0を選択し、奇数レーンはR1を選択する。選択後、正しくスワップされた値は(R0”とラベル付けされる)各実行レーンのR0レジスタ空間にある。
【0160】
図24bおよび
図24cは、2段および4段のバタフライ演算を示す。2段のバタフライの場合、シフトレジスタアレイはR0レジスタの内容を2単位右にシフトし、次いで4単位左にシフトすることを除いて、処理は、すぐ前に説明した1段バタフライ演算と同様である。1つおきの偶数レーンおよびそれの最も右隣のレーンは、R1およびR0”の一方から選択し、他の偶数レーンおよびそれらの最も右隣のレーンは、R1およびR0”の他方から選択する。
図25cに示す4段バタフライの場合、シフトレジスタアレイは、R0の内容を4単位右にシフトし、次いで、すべての値を、それらが(R0’とラベル付けされている)R0に存在するので、選択する。
【0161】
g.ブロックマッチ
図25はブロックマッチングの図を示す。ブロックマッチングは、動き推定(例えば、ビデオ圧縮に対して)、画像安定化、および画像融合アルゴリズム(例えば、露出融合、および時間ノイズ融合)に特に有用である。ここで、第1のベース(例えば、前の)画像における特定の特徴が、代替の(例えば、後の)画像において探される。
図26の例では、ベース画像に存在するブロックABCDが代替画像に見い出される必要がある。
【0162】
図26a〜
図26dは、二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上でブロックマッチングを実行する方法を示す。ここで、代替画像のピクセルは、二次元シフトレジスタのR0レジスタ空間に保持される。探されているベース画像内の特徴の第1のピクセル(例えば「A」)はすべての実行レーンにブロードキャストされ、R0レジスタ空間の内容と値「A」とにおいて絶対差が取られ、その結果がR1に格納される(簡単にするため、代替画像内の他のどのピクセルも、探される特徴の値(A、B、C、D)のいずれも持たないと仮定する。代替画像内のピクセル値がブロードキャストされたピクセル値Aと一致する(またはほぼ一致する)場合、R1の結果はゼロ(またはほぼゼロ)になるはずである。R1における他のすべての結果は、実質的に非ゼロであるはずである。
【0163】
図26bを参照すると、代替画像は次いで二次元シフトレジスタ内で1単位シフトされ、探されている特徴内の次のピクセル値「B」がすべての実行レーンにブロードキャストされ、絶対差が再び取られてR1に格納される。ここで、2つの連続するピクセル一致を有した特定の実行レーンアレイ位置2601は、R1において最も低い結果値を有するはずである。この特定の実行レーン位置は、ブロードキャストされているピクセル値の特定の順序が、シフトレジスタアレイのR0における代替画像の特定の走査/シフト動作と整列する位置である。
【0164】
図26cおよび
図26dで見られるように、プロセスは、次の各反復が、次のピクセル値をブロードキャストし、代替の画像データを特定の走査順序でシフトする状態で、継続する。すべての捜し求められる画像ピクセルをブロードキャストし、それに対応して、探される画像のサイズに対応する領域にわたってR0内の代替画像をシフトするのに充分な数の反復の後、理想的には、実行レーンアレイ内の1つの位置2601だけがすべての反復サイクルで一致を経験したことになる。したがって、この特定のアレイ位置2601は、すべての反復が完了した後に、そのR1レジスタ空間内にゼロまたはゼロに近い値(または少なくとも他の実行レーンよりも小さい値)を維持することができるはずである。
【0165】
上述のようなfindmin演算は、アレイ内のすべての行にわたってR1レジスタ空間上で実行される。次いで、各行における最も低い対応する値が、それの行の各位置に保持されることになる。次いで、アレイ内のすべての列にわたってR1レジスタ空間に対してfindmin演算が実行される。結果は、すべての反復ごとにベース画像と一致したピクセルを識別するはずであり、次いで、これを使用して、代替アレイにおいて、探される画像の正確な位置を識別できる。
【0166】
4.0 ローレベルプログラムコードの構築
図27は、プログラマーがハイレベル画像処理機能を設計する実行時前開発環境を示し、(
図1から
図6に関して上記で詳細に説明した仮想ISA環境を含むことができる)アプリケーション開発環境は、開発者が最初から前述のすべての特別な演算のいずれか/すべてを書く必要がないように、それらを提供する。
【0167】
ここで、開発者は、上で詳細に論じた演算のうちの任意のものを具体的に呼び出すことができ、および/または開発環境はそれに応じてライブラリ2701からそれらを自動的に提供する。代替的に、または組み合わせて、そのような演算に対する開発者のニーズが暗示または推測されてもよく(2D DFTの場合の行列乗算など)、開発環境は(例えばコンパイルプロセスの一部として)これらの機能を実行するプログラムコードをライブラリ2701から自動的に挿入する。
【0168】
したがって、上記の演算またはその代替実施形態を実行するプログラムコードは、よりハイレベルの(たとえば仮想ISA)プログラムコードまたはよりローレベルのオブジェクトコードで表現することができる。様々な実施形態では、よりハイレベルの仮想ISAコードは、x、yアドレス座標を有するメモリ読出として処理されるべきデータ値を指定し得るが、オブジェクトコードは、代わりにこれらのデータアクセスを二次元シフトレジスタ演算(上記のシフト演算の任意のものまたは同様の実施形態など)として理解し得る。コンパイラは、開発環境でのx,y読出を、指定されたオブジェクトコードである、二次元シフトレジスタの対応するシフトに変換することができる(例えば、開発環境におけるx,y座標(+2,+2)を有する読出は、オブジェクトコードでは、左への2つの空間のシフトおよび2つの空間のシフトダウンとして実現されてもよい)。環境に応じて、開発者はこれらのレベルの両方(または、例えば、より高いVISAレベルだけ)への可視化を有してもよい。さらに他の実施形態では、そのような予め書かれたルーチンが、実行時前ではなく実行時中に(例えばジャストインタイムコンパイラによって)呼び出されてもよい。
【0169】
5.0 おわりに
前のセクションから、セクション1.0で上述した仮想環境がコンピュータシステム上でインスタンス化され得ることを認識することが適切である。同様に、セクション2.0で上述したような画像プロセッサが、(例えば、携帯装置のカメラからのデータを処理する携帯装置のシステムオンチップ(SOC)の一部として)コンピュータシステム上のハードウェアにおいて具現化されてもよい。
【0170】
上述した様々な画像プロセッサアーキテクチャの特徴は、必ずしも従来の意味での画像処理に限定されず、したがって、画像プロセッサを再特徴付けしてもよい(またはしなくてもよい)他のアプリケーションに適用することができることを指摘することが適切である。例えば、実際のカメラ画像の処理とは対照的に、アニメーションの作成および/または生成および/またはレンダリングにおいて上述した様々な画像プロセッサアーキテクチャの特徴のいずれかが使用される場合、画像プロセッサはグラフィックス処理ユニットとして徳経づけられてもよい。さらに、上述した画像プロセッサアーキテクチャの特徴は、ビデオ処理、視覚処理、画像認識および/または機械学習などの他の技術的用途にも適用することができる。このように適用されて、画像プロセッサは、より汎用的なプロセッサ(例えば、コンピューティングシステムのCPUの一部であるか、またはその一部である)と(例えばコプロセッサとして)一体化されてもよく、またはコンピューティングシステム内のスタンドアロンプロセッサであってもよい。
【0171】
上述したハードウェア設計の実施形態は、半導体チップ内において、および/または最終的に半導体製造プロセスに向けての回路設計の記述として実施することができる。後者の場合、そのような回路記述は、(例えばVHDLもしくはVerilog)レジスタ転送レベル(RTL)回路記述、ゲートレベル回路記述、トランジスタレベル回路記述もしくはマスク記述、またはそれらの様々な組み合わせの形態をとってもよい。回路記述は、典型的には、コンピュータ可読記憶媒体(例えばCD−ROMまたは他のタイプの記憶技術)上に実施される。
【0172】
先のセクションから、上記の画像プロセッサは、(例えば、ハンドヘルド装置のカメラからのデータを処理するハンドヘルド装置のシステムオンチップ(SOC)の一部として)コンピュータシステム上のハードウェアで実施できることを認識することに関係する。画像プロセッサがハードウェア回路として実施される場合、画像プロセッサによって処理される画像データはカメラから直接受信されてもよいことに留意されたい。ここで、画像プロセッサは、別体のカメラの一部であってもよいし、一体化されたカメラを有するコンピューティングシステムの一部であってもよい。後者の場合、画像データは、カメラから直接、またはコンピューティングシステムのシステムメモリから受信することができる(例えば、カメラは、その画像データを画像プロセッサではなくシステムメモリに送信する)。先のセクションで説明した機能の多くは、(アニメーションをレンダリングする)グラフィックスプロセッサユニットにも適用可能であることにも留意されたい。
【0173】
図28は、コンピューティングシステムの例示的な図である。以下に説明するコンピューティングシステムのコンポーネントの多くは、一体化されたカメラおよび関連する画像プロセッサ(例えば、スマートフォンまたはタブレットコンピュータなどのハンドヘルドデバイス)を有するコンピューティングシステムに適用可能である。当業者は、2つの間の範囲を容易に定めることができるであろう。
【0174】
図28に見られるように、基本的なコンピューティングシステムは、中央処理ユニット2801(例えば、マルチコアプロセッサまたはアプリケーションプロセッサ上に配置された複数の汎用処理コア2815_1〜2815_Nおよびメインメモリコントローラ2817を含み得る)、システムメモリ2802、ディスプレイ2803(例えばタッチスクリーン、フラットパネル)、ローカル有線ポイントツーポイントリンク(例えばUSB)インタフェース2804、様々なネットワークI/O機能2805(イーサネット(登録商標)インタフェースおよび/またはセルラーモデムサブシステムなど)、無線ローカルエリアネットワーク(例えばWiFi)インタフェース2806、ワイヤレスポイントツーポイントリンク(例えばブルートゥース(登録商標))インタフェース2807およびグローバルポジショニングシステムインタフェース2808、様々なセンサ2809_1〜2809_N、1つ以上のカメラ2810、バッテリ2811、電力管理制御ユニット2824、スピーカおよびマイクロホン2813、ならびに音声コーダ/デコーダ2814を含んでもよい。
【0175】
アプリケーションプロセッサまたはマルチコアプロセッサ2850は、そのCPU2801内における1つ以上の汎用処理コア2815、1つ以上のグラフィカル処理ユニット2816、メモリ管理機能2817(例えばメモリコントローラ)、I/O制御機能2818および画像処理ユニット2819を含んでもよい。汎用処理コア2815は、典型的には、コンピューティングシステムのオペレーティングシステムおよびアプリケーションソフトウェアを実行する。グラフィックス処理ユニット2816は、典型的には、ディスプレイ2803上に提示されるグラフィックス情報を生成するために、グラフィックス集中型機能を実行する。メモリ制御機能2817は、システムメモリ2802とインタフェースして、システムメモリ2802との間でデータの書込/読出を行う。電力管理制御ユニット2824は、システム2800の電力消費を全体的に制御する。
【0176】
画像処理ユニット2819は、先のセクションで説明した画像処理ユニットの実施形態のいずれかに従って実現することができる。代替的にまたは組み合わせて、IPU2819は、GPU2816およびCPU2801のいずれかまたは両方にそのコプロセッサとして結合されてもよい。さらに、様々な実施形態では、GPU2816は、上で説明した画像プロセッサの特徴のいずれかを用いて実現することができる。
【0177】
タッチスクリーンディスプレイ2803、通信インタフェース2804〜2807、GPSインタフェース2808、センサ2809、カメラ2810、およびスピーカ/マイクコーデック2813,2814の各々はすべて、適切な場合には、一体化された周辺装置(例えば1つ以上のカメラ2810)も含むコンピューティングシステム全体に対して様々な形態のI/O(入力および/または出力)として見ることができる。実現例によっては、これらのI/Oコンポーネントの様々なものは、アプリケーションプロセッサ/マルチコアプロセッサ2850上に統合されてもよく、またはアプリケーションプロセッサ/マルチコアプロセッサ2850のダイから離れて、またはそのパッケージ外に配置されてもよい。
【0178】
一実施形態では、1つ以上のカメラ2810は、カメラとその視野内の対象との間の深度を測定することができる深度カメラを含む。アプリケーションプロセッサまたは他のプロセッサの汎用CPUコア(もしくはプログラムコードを実行するために命令実行パイプラインを有する他の機能ブロック)上で実行されるアプリケーションソフトウェア、オペレーティングシステムソフトウェア、デバイスドライバソフトウェアおよび/またはファームウェアは、上記の機能のいずれかを実行してもよい。
【0179】
本発明の実施形態は、上述したような様々なプロセスを含むことができる。これらのプロセスは、機械実行可能命令で実施されてもよい。これらの命令は、汎用または特殊目的のプロセッサに特定のプロセスを実行させるために使用できる。代替的に、これらのプロセスは、プロセスを実行するためのハードワイヤード論理を含む特定のハードウェアコンポーネントによって、またはプログラミングされたコンピュータコンポーネントとカスタムハードウェアコンポーネントとの任意の組み合わせによって実行されてもよい。
【0180】
本発明の要素はまた、機械実行可能命令を記憶するための機械可読媒体として提供されてもよい。機械可読媒体は、フロッピー(登録商標)ディスク、光ディスク、CD−ROM、および光磁気ディスク、フラッシュメモリ、ROM、RAM、EPROM、EEPROM、磁気もしくは光カード、伝搬媒体、または電子命令を記憶するのに適した他のタイプの媒体/機械可読媒体を含むが、それらに限定はされない。例えば、要素は、搬送波または通信リンク(例えばモデムもしくはネットワーク接続)を介する他の伝搬媒体で実施されたデータ信号によって、遠隔のコンピュータ(例えばサーバ)から要求側コンピュータ(例えばクライアント)に転送されるコンピュータプログラムとしてダウンロードすることができる。
【0181】
前述の明細書では、特定の例示的な実施形態を説明した。しかしながら、特許請求の範囲に記載される本発明のより広い精神および範囲から逸脱することなく、様々な修正および変更がなされ得ることは明らかであろう。したがって、明細書および図面は、限定的ではなく例示的なものとみなされるべきである。