(57)【要約】  二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサにおいて、二次元シフトレジスタアレイの複数の行または列の同時シフト量を次の反復ごとに２倍にすることを備える方法が記載される。この方法は、反復のシフト間で、二次元実行レーンアレイのそれぞれのレーン内で１つ以上の命令を実行することも備える。二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上で、実行レーンアレイのそれぞれのレーン内で１つ以上の命令を繰り返し実行して、二次元シフトレジスタアレイ内の複数のデータの行または列の繰り返される同時シフト間で、同じアレイ位置の異なるレジスタ内のコンテンツ間で選択を行う、別の方法が記載される。
2019519863.tif 000002
【特許請求の範囲】
【請求項１】
二次元実行レーンアレイおよび二次元シフトレジスタアレイを含む画像プロセッサによって処理されると、前記画像プロセッサに方法を実行させるプログラムコードを含む機械可読記憶媒体であって、前記方法は、
前記二次元シフトレジスタアレイの複数の行または列の同時シフト量を次の反復ごとに２倍にすることと、
反復のシフト間で、前記二次元実行レーンアレイのそれぞれのレーン内で１つ以上の命令を実行することとを備える、機械可読記憶媒体。
【請求項２】
前記方法は、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列の合計演算である、請求項１に記載の機械可読記憶媒体。
【請求項３】
前記方法は、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列のプレフィックス合計演算である、請求項１に記載の機械可読記憶媒体。
【請求項４】
前記方法は、データのアレイの複数のそれぞれの行または列に対して同時に実行され、それぞれの行または列にわたって最小値または最大値のインデックス値を繰り返す、最小値または最大値発見演算である、請求項１に記載の機械可読記憶媒体。
【請求項５】
前記二次元シフトレジスタアレイをシフトすることは、前記二次元レジスタアレイの内容を前記二次元シフトレジスタアレイの両端の周りにラップすることを含む、請求項１〜４のいずれか１項に記載の機械可読記憶媒体。
【請求項６】
前記方法は、
ａ）統計を計算する；
ｂ）ノイズを抑制する；
ｃ）ダウンサンプリング；
ｄ）積分画像を判断する；
ｅ）ボックスフィルタを加速する；
ｆ）ブロックマッチングアルゴリズムを後処理する、のいずれかを実行する、請求項１に記載の機械可読記憶媒体。
【請求項７】
二次元実行レーンアレイおよび二次元シフトレジスタアレイを含む画像プロセッサによって処理されると、前記画像プロセッサに方法を実行させるプログラムコードを含む機械可読記憶媒体であって、前記方法は、
前記実行レーンアレイのそれぞれのレーン内で１つ以上の命令を繰り返し実行して、前記二次元シフトレジスタアレイ内の複数のデータの行または列の繰り返される同時シフト間で、同じアレイ位置の異なるレジスタ内のコンテンツ間で選択を行うことを備える、機械可読記憶媒体。
【請求項８】
前記方法は、前記同時シフト距離を繰り返し２倍にすることをさらに備える、請求項７に記載の機械可読記憶媒体。
【請求項９】
前記方法は、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列のプレフィックス合計演算である、請求項７または８に記載の機械可読記憶媒体。
【請求項１０】
前記方法は、データのアレイの複数のそれぞれの行または列に対して同時に実行され、それぞれの行または列にわたって最小値または最大値のインデックス値を繰り返す、最小値または最大値発見演算である、請求項７または８に記載の機械可読記憶媒体。
【請求項１１】
前記方法は高速フーリエ変換のためのバタフライ演算である、請求項７に記載の機械可読記憶媒体。
【請求項１２】
前記方法は、
ａ）積分画像を判断する；
ｂ）ボックスフィルタを加速する；
ｃ）統計を計算する；
ｄ）ブロックマッチングアルゴリズムを後処理する、のいずれかを実行する、請求項７に記載の機械可読記憶媒体。
【請求項１３】
処理ユニットによって処理されると方法が実行されるプログラムコードを含む機械可読記憶媒体であって、
ｘ，ｙ座標においてメモリ位置を特定する命令フォーマットを有するメモリ読出書込命令でデータにアクセスする、よりハイレベルのプログラムコードで方法を表現することを含み、前記よりハイレベルのプログラムコードは、二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上で実行可能なオブジェクトコードにコンパイルされ、前記オブジェクトコードは前記画像プロセッサに、
前記二次元シフトレジスタアレイの複数の行または列の同時シフト量を次の反復ごとに２倍にさせ、
反復のシフト間で、前記二次元実行レーンアレイのそれぞれのレーン内で１つ以上の命令を実行させる、機械可読記憶媒体。
【請求項１４】
前記オブジェクトコードは、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列の合計演算を実現するよう構成される、請求項１３に記載の機械可読記憶媒体。
【請求項１５】
前記オブジェクトコードは、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列のプレフィックス合計演算を実現するよう構成される、請求項１３に記載の機械可読記憶媒体。
【請求項１６】
前記オブジェクトコードは、データのアレイの複数のそれぞれの行または列に対して同時に実行され、それぞれの行または列にわたって最小値または最大値のインデックス値を繰り返す、最小値または最大値発見演算である、請求項１３に記載の機械可読記憶媒体。
【請求項１７】
前記オブジェクトコードは、
ａ）統計を計算する；
ｂ）ノイズを抑制する；
ｃ）ダウンサンプリング；
ｄ）積分画像を判断する；
ｅ）ボックスフィルタを加速する；
ｆ）ブロックマッチングアルゴリズムを後処理する、のいずれかを実行するよう構成される、請求項１３に記載の機械可読記憶媒体。
【請求項１８】
処理ユニットによって処理されると方法が実行されるプログラムコードを含む機械可読記憶媒体であって、
ｘ，ｙ座標においてメモリ位置を特定する命令フォーマットを有するメモリ読出書込命令でデータにアクセスする、よりハイレベルのプログラムコードで方法を表現することを含み、前記よりハイレベルのプログラムコードは、二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上で実行可能なオブジェクトコードにコンパイルされ、前記オブジェクトコードは前記画像プロセッサに、
前記実行レーンアレイのそれぞれのレーン内で１つ以上の命令を繰り返し実行させて、前記二次元シフトレジスタアレイ内の複数のデータの行または列の繰り返される同時シフト間で、同じアレイ位置の異なるレジスタ内のコンテンツ間で選択を行わせる、機械可読記憶媒体。
【請求項１９】
前記オブジェクトコードは、前記同時シフト距離を繰り返し２倍にするよう構成される、請求項１８に記載の機械可読記憶媒体。
【請求項２０】
前記オブジェクトコードは、データのアレイの複数のそれぞれの行または列に対して同時に実行される行または列のプレフィックス合計演算を実現するよう構成される、請求項１８または１９に記載の機械可読記憶媒体。
【請求項２１】
前記オブジェクトコードは、データのアレイの複数のそれぞれの行または列に対して同時に実行され、それぞれの行または列にわたって最小値または最大値のインデックス値を繰り返す、最小値または最大値発見演算を実現するよう構成される、請求項１８または１９に記載の機械可読記憶媒体。
【請求項２２】
前記オブジェクトコードは高速フーリエ変換のためのバタフライ演算を実現するよう構成される、請求項１８に記載の機械可読記憶媒体。
【請求項２３】
前記オブジェクトコードは、
ａ）積分画像を判断する；
ｂ）ボックスフィルタを加速する；
ｃ）統計を計算する；
ｄ）ブロックマッチングアルゴリズムを後処理する、のいずれかを実行するよう構成される、請求項１８に記載の機械可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
発明の分野
本発明の分野は、一般に画像処理に関し、より具体的には、二次元実行レーンアレイおよび二次元シフトレジスタを有する画像プロセッサ上でのブロック処理のためのコアプロセスに関する。
【背景技術】
【０００２】
背景
画像処理は、典型的には、アレイに編成されたピクセル値の処理を含む。ここで、空間的に編成された二次元アレイは、画像の二次元的性質を捕捉する（追加の次元は、時間（例えば二次元画像のシーケンス）およびデータタイプ（例えば色）を含み得る。典型的なケースでは、アレイ化されたピクセル値は、静止画像または動きの画像を捕捉するためにフレームのシーケンスを生成したカメラによって提供される。伝統的な画像プロセッサは、典型的には、２つの極端な側面のいずれかに分類される。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
第１の極端な側面は、汎用プロセッサまたは汎用状プロセッサ（例えばベクトル命令拡張を備えた汎用プロセッサ）上で実行されるソフトウェアプログラムとして画像処理タスクを実行する。第１の極端な側面は、一般的に非常に汎用性の高いアプリケーションソフトウェア開発プラットフォームを提供するが、関連するオーバーヘッド（例えば、命令フェッチおよびデコード、オンチップおよびオフチップデータの処理、投機的実行）と組み合わされたより精細な粒子のデータ構造の使用は、究極的には、プログラムコードの実行中に、データの単位あたり、より多くのエネルギーが消費される結果となる。
【０００４】
第２の逆の極端な側面は、固定機能のハードワイヤード回路系をはるかに大きなデータブロックに適用する。カスタム設計された回路に直接適用される、（粒度の細かいブロックとは対照的な）より大きなデータブロックの使用は、データ単位あたりの消費電力を大幅に削減する。しかしながら、カスタム設計された固定機能回路系の使用は、一般に、プロセッサが実行することができるタスクのセットが限られる結果となる。このように、（第１の極端な側面に関連する）幅広く汎用性の高いプログラミング環境は第２の極端な側面においては欠けている。
【０００５】
高度に汎用性の高いアプリケーションソフトウェア開発の機会と、データ単位あたりの電力効率の向上とを両立させた技術プラットフォームは、依然として望ましいが、欠けている解決策である。
【課題を解決するための手段】
【０００６】
概要
二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサにおいて、二次元シフトレジスタアレイの複数の行または列の同時シフト量を次の反復ごとに２倍にすることを備える方法が記載される。この方法は、反復のシフト間で、二次元実行レーンアレイのそれぞれのレーン内で１つ以上の命令を実行することも備える。 二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上で、実行レーンアレイのそれぞれのレーン内で１つ以上の命令を繰り返し実行して、二次元シフトレジスタアレイ内の複数のデータの行または列の繰り返される同時シフト間で、同じアレイ位置の異なるレジスタ内のコンテンツ間で選択を行う、別の方法が記載される。
【０００７】
二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサにおいて、二次元シフトレジスタアレイの複数の行または列の同時シフト量を次の反復ごとに２倍にするための手段を備える装置が記載される。この装置は、反復のシフト間で、二次元実行レーンアレイのそれぞれのレーン内で１つ以上の命令を実行するための手段も備える。二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上で、実行レーンアレイのそれぞれのレーン内で１つ以上の命令を繰り返し実行して、二次元シフトレジスタアレイ内の複数のデータの行または列の繰り返される同時シフト間で、同じアレイ位置の異なるレジスタ内のコンテンツ間で選択を行うための手段を備える、別の装置が記載される。
【０００８】
図面のリスト
以下の説明および添付の図面は、本発明の様々な実施形態を例示するために使用される。
【図面の簡単な説明】
【０００９】
【図１】技術プラットフォームの様々なコンポーネントを示す。
【図２ａ】カーネルとともに構築されたアプリケーションソフトウェアの実施形態を示す。
【図２ｂ】カーネルの構造の実施形態を示す。
【図３】カーネルの動作の実施形態を示す。
【図４ａ】よりハイレベルのアプリケーションソフトウェア開発環境においてカーネルスレッドを開発するための、仮想プロセッサのメモリモデルの様々な局面を示す。
【図４ｂ】よりハイレベルのアプリケーションソフトウェア開発環境においてカーネルスレッドを開発するための、仮想プロセッサのメモリモデルの様々な局面を示す。
【図４ｃ】よりハイレベルのアプリケーションソフトウェア開発環境においてカーネルスレッドを開発するための、仮想プロセッサのメモリモデルの様々な局面を示す。
【図５ａ】位置相対フォーマットを有するロード命令で書かれるスレッドの実施形態を示す。
【図５ｂ】異なるピクセル密度を有する画像を示す。
【図６】アプリケーションソフトウェア開発およびシミュレーション環境の実施形態を示す。
【図７】画像プロセッサハードウェアアーキテクチャの実施形態を示す。
【図８ａ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す。
【図８ｂ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す。
【図８ｃ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す。
【図８ｄ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す。
【図８ｅ】画像データのライングループへの解析、ライングループのシートへの解析、および重なり合うステンシルでシート上で実行される操作を示す。
【図９ａ】ステンシルプロセッサの実施形態を示す。
【図９ｂ】ステンシルプロセッサの命令ワードの実施形態を示す図である。
【図１０】ステンシルプロセッサ内のデータ計算ユニットの一実施形態を示す図である。
【図１１ａ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｂ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｃ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｄ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｅ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｆ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｇ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｈ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｉ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｊ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１１ｋ】二次元シフトアレイおよび実行レーンアレイを使用して、重なり合うステンシルで近隣の出力ピクセル値の対を決定する例を示す。
【図１２】統合された実行レーンアレイおよび二次元シフトアレイのための単位セルの実施形態を示す図である。
【図１３】二次元行／列合計演算を示す。
【図１４ａ】二次元行合計演算の実施のためのローレベル演算を示す。
【図１４ｂ】二次元行合計演算の実施のためのローレベル演算を示す。
【図１４ｃ】二次元行合計演算の実施のためのローレベル演算を示す。
【図１４ｄ】二次元行合計演算の実施のためのローレベル演算を示す。
【図１５】二次元プレフィックス合計演算に関する図である。
【図１６ａ】プレフィックス合計演算を実施するためのローレベル演算を示す図である。
【図１６ｂ】プレフィックス合計演算を実施するためのローレベル演算を示す図である。
【図１６ｃ】プレフィックス合計演算を実施するためのローレベル演算を示す図である。
【図１６ｄ】プレフィックス合計演算を実施するためのローレベル演算を示す図である。
【図１７】二次元最小値発見演算に関する。
【図１８ａ】二次元最小値発見演算の実施のためのローレベル演算を示す。
【図１８ｂ】二次元最小値発見演算の実施のためのローレベル演算を示す。
【図１８ｃ】二次元最小値発見演算の実施のためのローレベル演算を示す。
【図１８ｄ】二次元最小値発見演算の実施のためのローレベル演算を示す。
【図１９ａ】行列乗算演算を示す。
【図１９ｂ】行列乗算演算を示す。
【図２０ａ】二次元シフトレジスタで行列乗算演算を実施するためのローレベル演算を示す。
【図２０ｂ】二次元シフトレジスタで行列乗算演算を実施するためのローレベル演算を示す。
【図２０ｃ】二次元シフトレジスタで行列乗算演算を実施するためのローレベル演算を示す。
【図２０ｄ】二次元シフトレジスタで行列乗算演算を実施するためのローレベル演算を示す。
【図２０ｅ】二次元シフトレジスタで行列乗算演算を実施するためのローレベル演算を示す。
【図２１】ＤＦＴ演算を示す。
【図２２ａ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２２ｂ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２２ｃ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２２ｄ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２２ｅ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２２ｆ】二次元シフトレジスタを用いてＤＦＴ演算を実行するためのローレベル演算を示す。
【図２３】バタフライ演算を示す。
【図２４ａ】二次元シフトレジスタで実施されるバタフライ演算を示す。
【図２４ｂ】二次元シフトレジスタで実施されるバタフライ演算を示す。
【図２４ｃ】二次元シフトレジスタで実施されるバタフライ演算を示す。
【図２５】ブロック画像を有するベース画像および代替画像を示す。
【図２６ａ】ブロックマッチングアルゴリズムの実行のためのローレベル演算を示す。
【図２６ｂ】ブロックマッチングアルゴリズムの実行のためのローレベル演算を示す。
【図２６ｃ】ブロックマッチングアルゴリズムの実行のためのローレベル演算を示す。
【図２６ｄ】ブロックマッチングアルゴリズムの実行のためのローレベル演算を示す。
【図２７】二次元実行レーンアレイおよび二次元シフトレジスタアレイを有するハードウェアプラットフォームにターゲット化されるプログラムコードを生成するための環境を示す。
【図２８】コンピューティングシステムの実施形態を示す。
【発明を実施するための形態】
【００１０】
詳細な記載
ｉ．導入
以下の説明は、広く汎用性のあるアプリケーションソフトウェア開発環境を提供する新たな画像処理技術プラットフォームに関する多数の実施形態を記載するものであり、それは改善された電力効率を提供するために、より大きなデータのブロック（例えば、以下にさらに説明するようなライングループおよびシート）を使用する。
【００１１】
１．０  アプリケーションソフトウェア開発環境
ａ．カーネルの用途および構造
図１は、仮想画像処理環境１０１と、実際の画像処理ハードウェア１０３と、仮想処理環境１０１のために書かれたよりハイレベルのコードを、実際のハードウェア１０３が物理的に実行するオブジェクトコードに変換するためのコンパイラ１０２とを含む、画像プロセッサ技術プラットフォームのハイレベル図である。以下でより詳細に説明するように、仮想処理環境１０１は、アプリケーションの構成プロセスの容易な視覚化のために開発および調整できるアプリケーションの点で、広く汎用性が高い。開発者１０４によるプログラムコード開発努力が完了すると、コンパイラ１０２は、仮想処理環境１０１内で書かれたコードを、実際のハードウェア１０３に対して対象とされるオブジェクトコードに変換する。
【００１２】
図２ａは、仮想環境内で書かれたアプリケーションソフトウェアが取ることができる構造および形態の例を示す。図２ａにおいて見られるように、プログラムコードは、入力画像データ２０１の１つ以上のフレームを処理して、入力画像データ２０１上で何らかの全体的な変換を行うことが期待される。変換は、開発者によって明示されたオーケストレーションされたシーケンスで入力画像データに対して動作するプログラムコード２０２の１つ以上のカーネルの動作によって実現される。
【００１３】
例えば、図２ａにおいて見られるように、最初に第１のカーネルＫ１で各入力画像を処理することによって全体の変換が行われる。カーネルＫ１によって生成された出力画像は、カーネルＫ２によって操作される。カーネルＫ２によって生成された出力画像の各々は、カーネルＫ３＿１またはＫ３＿２によって操作され、カーネルＫ３＿１／Ｋ３＿２によって生成された出力画像は、カーネルＫ４によって操作される。カーネルＫ３＿１およびＫ３＿２は、Ｋ３ステージで並列処理を課すことによって全体の処理を高速化するように設計された同一のカーネルであってもよいし、異なるカーネルであってもよい（例えば、カーネルＫ３＿１は第１の特定タイプの入力画像で動作し、カーネルＫ３＿２は第２の異なるタイプの入力画像で動作する）。
【００１４】
このように、全体的な画像処理シーケンスが大きくなると、画像処理パイプラインまたは有向非循環グラフ（ＤＡＧ）の形を取り得、開発環境は、開発されているプログラムコードのそのようなものとしての表現を実際に開発者に提示するよう備えられてもよい。カーネルは、開発者によって個々に開発されてもよく、ならびに／または任意の基礎となる技術を供給するエンティティ（実際の信号プロセッサハードウェアおよび／もしくはその設計など）および／もしくは第三者（例えば、開発環境向けに作成されたカーネルソフトウェアのベンダー）によって提供されてもよい。したがって、名目上の開発環境には、開発者がより大きな開発努力の全体的な流れを達成するために様々な方法で自由に「つなぐ」ことができるカーネルの「ライブラリ」が含まれることが期待される。そのようなライブラリの一部であると予想されるいくつかの基本的なカーネルは、以下の基本的な画像処理タスク：畳み込み、ノイズ除去、色空間変換、エッジおよびコーナー検出、シャープニング、ホワイトバランス、γ補正、トーンマッピング、行列乗算、画像レジストレーション、ピラミッド構築、ウェーブレット変換、ブロック状離散コサイン、およびフーリエ変換のうちの１つ以上を提供するようカーネルを含んでもよい。
【００１５】
図２ｂは、開発者が構想することができるカーネル２０３の構造の例示的な図を示す。図２ｂにおいて見られるように、カーネル２０３は、それぞれの下位プロセッサ２０５上で各々動作しているプログラムコード２０４のいくつかの並列スレッド（「スレッド」）として見ることができ、各プロセッサ２０５は、出力アレイ２０６における特定の位置（カーネルが生成している出力画像内の特定のピクセル位置など）に向けられる。簡略化のために、３つのプロセッサおよび対応するスレッドのみが図２ｂに示されている。様々な実施形態では、図示された各出力アレイ位置は、それ自身の専用プロセッサおよび対応するスレッドを有するであろう。すなわち、別個のプロセッサおよびスレッドを出力アレイの各ピクセルに割り当てることができる。代替の手法では、同じスレッドが出力ピクセルよりも多くについてデータを生成してもよく、および／または２つの異なるスレッドが（例えば、ある限定されたケースにおいて）同じ出力ピクセルのためのデータの生成に関して協力してもよい。
【００１６】
以下でより詳細に説明するように、様々な実施形態では、実際の基礎となるハードウェアにおいて、実行レーンのアレイおよび対応するスレッドが一致して（例えば、単一命令複数データ（ＳＩＭＤ）のような態様において）動作して、現在処理中のフレームの「ライングループ」の一部のために出力画像データを生成する。ライングループは、画像フレームの連続したサイズ決め可能な部分である。様々な実施形態では、開発者は、ハードウェアがライングループに対して動作することを意識し得、または、開発環境は、例えば、出力フレーム内のすべてのピクセル（例えば、それ自身の専用プロセッサおよびスレッドによって生成された出力フレームにおけるすべてのピクセル）に対して別個のプロセッサおよびスレッドが存在する抽象化を提示し得る。いずれにせよ、様々な実施形態において、開発者は、各出力ピクセルについて個々のスレッドを含むようにカーネルを理解する（出力アレイが出力フレーム全体またはその一部として視覚化されているかどうか）。
【００１７】
以下でより詳細に説明するように、一実施形態では、仮想環境内で開発者に提示されるプロセッサ２０５は、標準（例えばＲＩＳＣ）オペコードをサポートするだけでなく、開発者が実行されているピクセル毎の処理を容易に視覚化することを可能にするフォーマットされたデータアクセス命令も含む命令セットアーキテクチャ（ＩＳＡ）を有する。従来の数学的およびプログラム制御オペコードのＩＳＡ全体と組み合わせて任意の入力アレイ位置を容易に定義／視覚化する能力は、理想的には、任意のサイズの画像表面上で実行されるべき任意の所望の機能をアプリケーションプログラム開発者が定義することを本質的に可能にする非常に汎用性の高いプログラミング環境を可能にする。例えば理想的には、任意の数学演算を任意のステンシルサイズに適用するように容易にプログラミングすることができる。
【００１８】
データアクセス命令に関して、一実施形態では、仮想プロセッサのＩＳＡ（「仮想ＩＳＡ」）は、特殊なデータロード命令および特殊なデータストア命令を含む。データロード命令は、画像データの入力アレイ内の任意の位置から読み出しできる。データストア命令は、画像データの出力アレイ内の任意の位置に書き込むことができる。後者の命令は、同じプロセッサの複数のインスタンスを異なる出力ピクセル位置に簡単に割り当てることを可能にする（各プロセッサは出力アレイ内の異なるピクセルに書き込む）。したがって、例えば、ステンシルサイズ自体（例えば、ピクセルの幅およびピクセルの高さとして表現される）を、容易にプログラマブルな特徴にすることができる。処理操作の視覚化は、特殊なロードおよびストア命令の各々が特殊な命令フォーマットを有して、更に単純化され、これにより、ターゲットアレイ位置がＸおよびＹ座標として単純に指定される。
【００１９】
いずれにせよ、出力アレイ内の複数の位置各々に対して別個のプロセッサをインスタンス化することにより、プロセッサはそれぞれのスレッドを並列に実行し、例えば出力アレイ内のすべての位置に対するそれぞれの値が同時に生成される。多くの画像処理ルーチンは、典型的には、同じ出力画像の異なるピクセル上で同じ操作を実行することは注目に値する。このように、開発環境の一実施形態では、各プロセッサは同一であると推定され、同じスレッドプログラムコードを実行する。したがって、仮想化された環境は、ロックステップで同一のコードを各々実行する同一のプロセッサなどの二次元アレイからなる一種の二次元（２Ｄ）ＳＩＭＤプロセッサとして見ることができる。
【００２０】
図３は、出力アレイ内の２つの異なるピクセル位置について同一のコードを処理している２つの仮想プロセッサのための処理環境のより詳細な例を示す。図３は、生成されている出力画像に対応する出力アレイ３０４を示す。ここでは、第１の仮想プロセッサがスレッド３０１のコードを処理して出力アレイ３０４の位置Ｘ１に出力値を生成し、第２の仮想プロセッサがスレッド３０２のコードを処理して出力アレイ３０４の位置Ｘ２に出力値を生成している。再び、様々な実施形態において、開発者は、出力アレイ３０４内の各ピクセル位置について別個のプロセッサおよびスレッドが存在することを理解するであろう（単純にするため、図３はそのうちの２つのみを示す）。しかしながら、様々な実施形態で、開発者は、（マシンのＳＩＭＤのような性質のため、）１つのプロセッサおよびスレッドに対してコードを開発するだけでよい。
【００２１】
当技術分野で知られているように、出力ピクセル値は、しばしば、対応する出力ピクセル位置を含みそれを囲む入力アレイのピクセルを処理することによって決定される。例えば、図３からわかるように、出力アレイ３０４の位置Ｘ１は、入力アレイ３０３の位置Ｅに対応する。したがって、出力値Ｘ１を決定するために処理されるであろう入力アレイ３０３のピクセル値のステンシルは、入力値ＡＢＣＤＥＦＧＨＩに対応するであろう。同様に、出力値Ｘ２を決定するために処理される入力アレイピクセルのステンシルは、入力値ＤＥＦＧＨＩＪＫＬに対応するであろう。
【００２２】
図３は、出力値Ｘ１およびＸ２をそれぞれ計算するために使用され得るスレッド３０１，３０２の対に対する対応する仮想環境プログラムコードの例を示す。図３の例では、両方のコード対が同一であり、９つの入力アレイ値のステンシルを平均して、対応する出力値を決定する。２つのスレッドの唯一の違いは、入力アレイから呼び出される変数および書き込まれる出力アレイの位置である。具体的には、出力位置Ｘ１に書き込むスレッドは、ステンシルＡＢＣＤＥＦＧＨＩで動作し、出力位置Ｘ２に書き込むスレッドはステンシルＤＥＦＧＨＩＪＫＬで動作する。
【００２３】
スレッド３０１，３０２の対からのそれぞれのプログラムコードからわかるように、各仮想プロセッサは、少なくとも内部レジスタＲ１およびＲ２を含み、少なくとも以下の命令をサポートする：１）入力アレイからＲ１へのＬＯＡＤ（ロード）命令；２）入力アレイからＲ２へのＬＯＡＤ命令；３）Ｒ１およびＲ２の内容を加算して結果をＲ２に入れるＡＤＤ（加算）命令；４）Ｒ２内の値を即値オペランド９で除算するＤＩＶ（除算）命令；および５）スレッドの専用の出力アレイ位置にＲ２の内容を格納するＳＴＯＲＥ（格納）命令。ここでもまた、図３には２つの出力アレイ位置ならびに２つのスレッドおよび対応するプロセッサしか描かれていないが、おそらく、出力アレイ内のすべての位置にこれらの機能を実行する仮想プロセッサおよび対応するスレッドを割り当てることができる。様々な実施形態では、処理環境のＳＩＭＤのような性質にしたがって、複数のスレッドが互いに独立して実行される。つまり、仮想プロセッサ間にスレッド間通信は存在しない（１つのＳＩＭＤチャネルが別のＳＩＭＤチャネルと交差しないようにしている）。
【００２４】
ｂ．仮想プロセッサメモリモデル
様々な実施形態において、仮想プロセッサの関連する特徴は、それらのメモリモデルである。当該技術分野で理解されるように、プロセッサは、メモリからデータを読み出し、そのデータを操作し、新たなデータをメモリに書き戻す。メモリモデルは、プロセッサが有する、データがメモリ内に編成される方法のパースペクティブまたはビューである。図４ａ〜図４ｃは、開発環境の仮想プロセッサ用のメモリモデルの一実施形態に関する。例として、３つの仮想プロセッサおよび対応するスレッド４０１のみを含む単純化された環境が使用されている。以下により詳細に説明されるように、仮想プロセッサのメモリモデルはＳＩＭＤセマンティクスを保存するように注意を払いながら、同時に、各仮想プロセッサに対してスカラー演算およびプライベート中間値記憶空間を規定する。
【００２５】
図４ａに見られるように、一実施形態では、各仮想プロセッサが動作するメモリ領域４２０は、格納される情報の種類に基づいて６つの異なる区画に編成される。具体的には、次のものが存在する：１）プライベートスクラッチパッド領域４０２；２）グローバル入力データアレイ領域４０３；３）グローバル出力データアレイ領域４０４；４）グローバルルックアップテーブル情報領域４０５；５）グローバルアトミック統計領域４０６；および６）グローバル定数テーブル情報領域４０７。
【００２６】
図４ａに示すような区画は、全体的な処理環境のＳＩＭＤのような性質に合わせて、仮想プロセッサ間で共有される、すなわち「グローバル」なメモリ領域を視覚化することを試みる。同様に、図４ａはまた、仮想プロセッサ間で共有されていない、つまり特定の仮想プロセッサにとって「プライベート」である他のメモリ領域を視覚化することを試みる。具体的には、図４ａに見られるように、各仮想プロセッサにプライベートなスクラッチパッド領域４０２を除いて、すべてのメモリ区画はグローバルである。異なるメモリ領域のいくつかは、以下でさらに説明されるように、異なるメモリアドレス指定スキームも有する。
【００２７】
スクラッチパッド領域４０２に関しては、洗練された画像処理アルゴリズムの実行中に中間情報を一時的に記憶すること（例えば、その後その情報を読み戻して後で使用すること）は珍しくない。さらに、そのような情報がスレッド間で異なることは珍しくない（異なる入力値は異なる中間値をもたらし得る）。したがって、メモリモデルは、プロセッサごとに、各仮想プロセッサの対応するスレッドによるそのような中間情報の記憶のためのプライベートなスクラッチパッド領域４０２を含む。一実施形態では、特定のプロセッサのスクラッチパッド領域は、典型的な（例えば、線形の）ランダムアクセスメモリアドレスを通じてそのプロセッサによってアクセスされ（４０９）、メモリの読み書き領域である（すなわち、仮想プロセッサは、プライベートメモリから情報を読出すことおよびプライベートメモリに情報を書き込むことの両方が可能である）。スクラッチパッド領域にアクセスするための仮想プロセッサＩＳＡ命令フォーマットの実施形態は、以下でさらに詳細に説明される。
【００２８】
入力アレイ部４０３は、出力データを生成するためにスレッドの組に呼び込まれる（４０８）入力データの組を含む。典型的な状況では、入力アレイは、各スレッドがその上またはその中で動作している画像（たとえばフレーム）または画像のセクションに対応する。入力画像は、カメラによって提供されるピクセル情報などの真の入力、またはより大きな全体的な画像処理シーケンスにおいて前のカーネルによって提供される情報などの何らかの形式の中間画像であってもよい。仮想プロセッサは、同じサイクルの間に入力画像データの異なるピクセル位置で動作するので、通常、同じ入力データ項目について競合しない。
【００２９】
一実施形態では、新規なメモリアドレス指定方式を使用して、入力アレイ４０３からどの特定の入力値が呼び込まれるかを規定する。具体的には、従来の線形メモリアドレスではなく、Ｘ、Ｙ座標で所望の入力データを定義する「位置相対的」アドレス指定方式が使用される。このように、仮想プロセッサのＩＳＡのロード命令は、Ｘ成分とＹ成分とで入力アレイ内の特定のメモリ位置を識別する命令フォーマットを含む。このように、二次元座標系を使用して、入力アレイ４０３から読み出される入力値に対してメモリをアドレス指定する。
【００３０】
位置相対的メモリアドレス指定アプローチの使用は、仮想プロセッサが動作している画像の領域が、開発者にとってより容易に識別可能であることを可能にする。上記したように、従来の数学的およびプログラム制御オペコードのＩＳＡ全体と組み合わせて任意の入力アレイ位置を容易に定義／視覚化する能力は、理想的には、任意のサイズの画像表面上で実行されるべき任意の所望の機能をアプリケーションプログラム開発者が容易に定義することを本質的に可能にする非常に汎用性の高いプログラミング環境を可能にする。位置相対的アドレス指定方式を採用する命令のための様々な命令フォーマットの実施形態が、サポートされるＩＳＡの他の特徴の実施形態とならんで、以下により詳細に説明される。
【００３１】
出力アレイ４０４には、スレッドが生成を担う出力画像データが含まれる。出力画像データは、全体の画像処理シーケンスに従うディスプレイ上に提示される実際の画像データなどの最終画像データであってもよいし、全体の画像処理シーケンスの次のカーネルがその入力画像データ情報として使用する中間画像データであってもよい。ここでも、典型的には、仮想プロセッサは、同じサイクル中に出力画像データの異なるピクセル位置に書き込むので、同じ出力データ項目に対して競合しない。
【００３２】
一実施形態では、位置相対的アドレス指定方式は、出力アレイへの書込にも使用される。そのため、各仮想プロセッサに対するＩＳＡは、その命令フォーマットが、従来のランダムアクセスメモリアドレスではなく、二次元のＸ、Ｙ座標としてメモリ内の目標とされる書込位置を規定するストア命令を含む。仮想ＩＳＡの位置相対命令の実施形態に関するさらなる詳細は、以下にさらに示される。
【００３３】
図４ａはまた、各仮想プロセッサが、ルックアップテーブルメモリ領域４０５内に保持されているルックアップテーブル４１１へのルックアップ４１０を実行するのを示す。ルックアップテーブルは、画像処理タスクによってしばしば使用されて、例えば、異なるアレイ位置に対するフィルタまたは変換係数を取得し、ルックアップテーブルが入力インデックス値のために出力される関数を提供する複雑な関数（例えば、ガンマ曲線、正弦、余弦）を実施するなどする。ここで、ＳＩＭＤ画像処理シーケンスはしばしば同じクロックサイクルの間に同じルックアップテーブルへのルックアップを実行することが予想される。したがって、入力および出力アレイメモリ領域４０３、４０４と同様に、ルックアップテーブル領域４０５は、任意の仮想プロセッサによってグローバルにアクセス可能である。図４ａは同様に、３つの仮想プロセッサの各々が、ルックアップテーブルメモリ領域４０５に保持されている同じルックアップテーブル４１１から情報を効果的にルックアップするのを示す。
【００３４】
一実施形態では、インデックス値は、典型的には、所望のルックアップテーブルエントリを定義するために使用されるので、ルックアップテーブル情報領域は、通常の線形アクセススキームを使用してアクセスされる。一実施形態では、メモリのルックアップ領域は読み取り専用である（すなわち、プロセッサはルックアップテーブル内の情報を変更することはできず、そこから情報を読み出すことのみが許可されている）。簡単にするために、図４ａは、ルックアップテーブル領域４０５内に１つのルックアップテーブルしか常駐しないことを示唆するが、仮想環境は、シミュレートされたランタイム中に複数の異なるルックアップテーブルが常駐することを可能にする。ルックアップテーブルへのルックアップを実行する命令のための仮想ＩＳＡ命令フォーマットの実施形態が、以下にさらに示される。
【００３５】
図４ｂは、３つの仮想プロセッサの各々がアトミック統計領域４０６に書き込み４１３するのを示す。画像処理が出力情報を「更新」または適度に変更することは珍しくない。更新された情報は次いで、更新された情報を利用する他の下流のプロセスのために使用されてもよい。そのような更新または適度な変更の例には、出力データへの固定オフセットの単純な追加、出力データに対する被乗数の単純な乗算、または何らかのしきい値に対する出力データの最小値もしくは最大値の比較が含まれる。
【００３６】
これらのシーケンスでは、図４ｂに見られるように、個々のスレッド４０１によって計算されたばかりの出力データが操作され、その結果がアトミック統計領域４０６に書き込まれてもよい（４１３）。実装セマンティクスに応じて、アトミック動作によって操作される出力データは、後で図４ｂで示すように、プロセッサによって内部に保持されてもよいし、または出力アレイから呼び出されてもよい（４１２）。様々な実施形態において、出力データ上で実行され得るアトミック動作は、加算、乗算、最小、および最大を含む。一実施形態では、出力データへの更新が同じ二次元アレイにおいて出力データそれ自体として論理的に編成されることを考えると、アトミック統計領域４０６は（入力および出力アレイアクセスと同様に）位置相対アドレス指定スキームを使用してアクセスされる。出力データに対してアトミック動作を実行し、その結果を統計領域４０６に書き込むための仮想ＩＳＡ命令フォーマットの実施形態は、以下でさらに詳細に説明される。
【００３７】
図４ｃは、仮想プロセッサの各々が、定数メモリ領域４０７内の定数ルックアップテーブル４１５から定数値を読み出す（４１４）のを示す。ここで、例えば、異なるスレッド４０１が同じクロックサイクル上で同じ定数または他の値（たとえば、画像全体に対して適用されるべき特定の乗数）を必要とし得ることが予想される。したがって、定数ルックアップテーブル４１５へのアクセスは、図４ｃに示されるように、各仮想プロセッサに同じスカラー値を返す。ルックアップテーブルは典型的にはインデックス値でアクセスされるので、一実施形態では、定数ルックアップテーブルメモリ領域は線形ランダムアクセスメモリアドレスでアクセスされる。一実施形態では、メモリの定数領域は読み取り専用である（すなわち、プロセッサは、定数テーブル内の情報を変更することはできず、そこから情報を読み取ることのみが許可されている）。簡単にするために、図４ｃは、定数メモリ領域４０７内の単一の定数ルックアップテーブル４１５のみを示す。スレッドはそのようなテーブルを複数利用してもよいので、メモリ領域４０７は必要とされる／使用されるのと同じ数の定数テーブルを保持するのに十分な大きさになるように構成される。
【００３８】
ｃ．仮想プロセッサＩＳＡ
上で複数の例で示唆したように、仮想プロセッサＩＳＡはいくつかの関連機能を含むことができる。これらのうちのいくつかはすぐ下に詳細に説明される。
【００３９】
様々な実施形態において、各仮想プロセッサのＩＳＡの命令フォーマットは、以下の各々に対してＸ、Ｙ座標を定義するために相対位置決めアプローチを使用する：１）入力画像データを入力アレイメモリ領域から読み出すＬＯＡＤ命令；２）出力画像データを出力アレイに書き込むＳＴＯＲＥ命令；および３）メモリの統計領域に対するアトミック更新。
【００４０】
従来のデータアクセス、数学的、およびプログラム制御オペコードのＩＳＡ全体と組み合わせて任意の入力アレイ位置を容易に定義する能力は、アプリケーションプログラム開発者が理想的には任意のサイズの画像面で実行されるべき任意の所望の関数を定義することを本質的に可能にする極めて多用途のプログラミング環境を可能にする。例えば、理想的には、任意の数学的演算を任意のステンシルサイズに適用するように容易にプログラムすることができる。
【００４１】
一実施形態では、入力／出力アレイから／へのロード／ストアのための命令は、以下のフォーマットを有する。
【００４２】
[OPCODE] LINEGROUP_(name)[(((X*XS + X0)/XD);((Y*YS + Y0)/YD); Z]
ここで、[OPCODE]は特定の操作の種類であり（入力アレイからのLOAD、出力アレイへのSTORE）、LINEGROUP_(name)は入力または出力アレイメモリ領域内の特定の画像の特定のセクション（たとえば、画像データのフレームのライングループ）に割り当てられた名前である。ここでは、異なるライングループは別々に操作されるので、異なるライングループには異なる名前が与えられ、それらは一意に識別／アクセスされることができる（例えば、LINEGROUP_1, LINEGROUP_2など）。入力アレイメモリ領域および出力アレイメモリ領域の両方に同じ名前のライングループが存在してもよい。任意のライングループの原点は、例えば、それの適切なメモリ領域内の、それの左下隅であってもよい。
【００４３】
アトミック統計テーブル上で更新を実行する命令の場合、一実施形態では、命令フォーマットは以下の類似の構造をとる。
【００４４】
[OPCODE] STATS_(name)[(((X*XS + X0)/XD);((Y*YS + Y0)/YD); Z]
注目すべき違いは、入力オペランド情報が、入力または出力アレイ内の特定のライングループではなく、特定の統計テーブル(STATS_(name))内の位置を定義することである。 ライングループと同様に、スレッドがその動作の過程で異なる統計テーブル上で一意に動作できるように、異なる統計テーブルに異なる名前が付けられる。[OPCODE]は、実行されるべき特定のアトミック動作を指定する(例えば、STAT_ADD; STAT_MUL; STAT_MIN; STAT_MAX)。
【００４５】
入出力アレイアクセスまたはアトミック統計テーブルアクセスのどちらの場合も、命令のＺオペランドは、名前付きライングループまたは統計テーブルのどのチャネルが命令のターゲットになるかを定義する。ここでは、典型的には、単一の画像に複数のチャネルがある。例えば、映像は、典型的には、ビデオストリームの同じフレームに対して、赤チャネル（Ｒ）、緑チャネル（Ｇ）、および青チャネル（Ｂ）を有する。ある意味、完全な画像は、互いの上に積み重ねられた別々のＲ、Ｇ、およびＢチャネル画像として見ることができる。Ｚオペランドは、これらのうちのどれが命令によってターゲットとされるかを定義する（例えば、Ｚ＝０は赤チャネルに対応し、Ｚ＝１は青チャネルに対応し、Ｚ＝２は緑チャネルに対応する）。したがって、各ライングループおよび統計テーブルは、処理されている特定の画像について各チャネルの内容を含むように構成される。
【００４６】
(X*XS + X0)/XDオペランドは、命令のターゲットとなる名前付きライングループまたは統計テーブル内のX位置を定義し、(Y*YS + Y0)/YDオペランドは命令のターゲットとなる名前付きライングループまたは統計テーブル内のY位置を定義する。X位置に関するXS項およびXD項、ならびにy位置に関するYS項およびYD項は、異なるピクセル密度を有する入力画像と出力画像との間のスケーリングに使用される。スケーリングは、以下でさらに詳細に説明される。
【００４７】
最も単純な場合では、入力画像と出力画像との間にスケーリングはなく、命令フォーマットのＸ成分およびＹ成分は単にX + X0およびY + Y0の形をとり、ここで、X0およびY0はスレッドの位置に対する位置オフセットである。スレッドは、それの出力値が書き込まれる出力アレイライングループ内の位置に割り当てられていると見なされる。対応する同じ位置が、入力アレイライングループおよび任意の統計テーブルで容易に識別で可能である。
【００４８】
例として、スレッドが出力アレイLINEGROUP_1において特定のX, Y位置を割り当てられる場合、命令
LOAD LINEGROUP_1[(X-1);(Y-1);Z]
は、LINEGROUP_1から、入力アレイ内の同じX, Y位置から左に１ピクセル、下に１ピクセルの位置にある値をロードするであろう。
【００４９】
したがって、図５ａに示すように、X, Y位置のピクセル値をその左右の隣接ピクセル値と共に平均する単純なぼけカーネルを擬似コードで書くことができる。図５ａに見られるように、位置((X);(Y))は、出力アレイに書き込んでいる仮想プロセッサの位置に対応する。上記の擬似コードでは、LOADは入力アレイからのロードのためのオペコードに対応し、STOREは出力アレイへのストアのためのオペコードに対応する。入力アレイにLINEGROUP_1、出力アレイにLINEGROUP_1が存在することに注意されたい。
【００５０】
図５ｂは、相対位置決めロードおよびストア命令フォーマットのスケーリング機能を説明するためのスケーリングされた画像を示す。ダウンサンプリングとは、入力画像に存在するピクセルのすべてよりも少ないピクセルを出力画像に与えることによって、より高い解像度の画像をより低い解像度の画像に変換することを指す。アップサンプリングとは、入力画像に存在するよりも多くのピクセルを出力画像に作成することによって、より低い解像度の画像をより高い解像度の画像に変換することを指す。
【００５１】
例えば、図５ｂを参照すると、画像５０１が入力画像を表し、画像５０２が出力画像を表す場合、出力画像は入力画像よりもピクセルが少ないので、ダウンサンプリングが行われる。ここで、出力画像内の各ピクセルについて、出力ピクセルについての出力値を決定する入力画像内の関連ピクセルは、出力画像においていずれかの軸に沿って移動して出力ピクセル位置から「より遠くに」進行する。たとえば、３：１のダウンサンプリング比の場合、出力画像におけるいずれかの軸に沿った第１のピクセルは、入力画像における同じ軸に沿った第１、第２および第３のピクセルに対応し、出力画像の第２のピクセルは、入力画像の第４、第５および第６のピクセルに対応する、などとなる。したがって、第１の出力ピクセルは第３の位置に関連ピクセルを有し、第２の出力ピクセルは第６の位置に関連ピクセルを有する。
【００５２】
したがって、相対位置決め命令フォーマットのXSおよびYSの被乗数項は、ダウンサンプリングを実行するために使用される。図５ａのぼけ疑似コードが両方の軸に沿って３：１のダウンサンプリングのために書き換えられる場合、コードは以下のように書き換えられるであろう。
【００５３】
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
対照的に、１：３アップサンプリングの場合（例えば、画像５０２は入力画像であり、画像５０１は出力画像である）、XDおよびYD除数はいずれかの軸に沿って各入力ピクセルに対して３つの出力ピクセルを生成するために使用されるであろう。したがって、ぼけコードは次のように書き直されるであろう。
【００５４】
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という項が、ターゲットとされるテーブルに適用される線形インデックスに本質的に対応する、線形アドレス指定アプローチが採用される。これらの各命令はまた、オペコードおよびアクセスされているメモリ領域の識別子を含む。例えば、ルックアップテーブルメモリ領域からルックアップを実行する命令は、次のように表すことができる。
【００５５】
LOAD LKUP_(name)[(A*B + C)]
ここで、LOADはロード操作を識別するオペコードであり、LKUP_(name)はアクセスされているルックアップテーブルメモリ領域内のルックアップテーブルの名前を指定する。ここでも、複数のルックアップテーブルがスレッドによって使用されてもよく、したがって、ルックアップテーブルメモリ領域に存在する２つ以上のうちの適切な１つを識別するために、命名スキームが使用される。
【００５６】
同様の指向のオペコードを伴う同様のフォーマットを、定数メモリ領域およびプライベートメモリ領域をターゲットとする命令に利用できる（例えば、LOAD CNST_(name)[(A*B + C)]; LOAD PRVT_(name)[(A*B +C)]。一実施形態では、ルックアップテーブルアクセスおよび定数テーブルアクセスは読み取り専用である（プロセッサはそこに配置されたデータを変更することはできない）。そのため、これらのメモリ領域に対するSTORE命令はない。一実施形態では、メモリのプライベート領域はリード／ライトである。したがって、そのメモリ領域に対してはstore命令が存在する（例えば、STORE PRVT[(A*B + C)]。
【００５７】
様々な実施形態において、各仮想プロセッサは、整数値、浮動小数点値または固定小数点値を含み得る汎用レジスタを含む。さらに、汎用レジスタは、８、１６または３２ビット値などの構成可能なビット幅のデータ値を含み得る。したがって、入力アレイまたは出力アレイの各ピクセル位置の画像データは、８、１６または３２ビットのデータサイズを有することができる。ここで、ある仮想プロセッサは、汎用レジスタ内の値のビットサイズおよび数値フォーマットを確立する実行モード用に設定できる。命令は即値オペランド（入力値が、指定されたレジスタにおいて見いだされるのではなく、命令自体で直接表現される、入力オペランド）も指定できる。即値オペランドは、構成可能な８、１６、または３２ビット幅を有することもできる。
【００５８】
拡張された実施形態では、各仮想プロセッサはそれ自体の内部のスカラーモードまたはＳＩＭＤモードで動作することもできる。すなわち、特定のアレイ位置内のデータは、スカラー値、または複数の要素を有するベクトルと見なすことができる。例えば、第１の構成は、各画像アレイ位置がスカラー８ビット値を保持する８ビットのスカラー演算を確立することができる。対照的に、他の構成は、各画像アレイ位置がアレイ位置当たり３２ビットの総データサイズに対して４つの８ビット値を保持すると仮定される、３２ビットの並列／ＳＩＭＤ演算を確立することができる。
【００５９】
様々な実施形態では、各仮想プロセッサは述語値を保持するためのレジスタも含む。単一の述語値はたいていわずか１ビットの長さであり、既存のデータに対して真／偽または大なり／小なりテストを実行するオペコードからの結果を表す。述語値は、例えば、実行中にコードを通る分岐方向を決定するために使用される（したがって、条件付き分岐命令のオペランドとして使用される）。述語値は、命令内の即値オペランドとして表すこともできる。
【００６０】
様々な実施形態において、各仮想プロセッサはスカラー値を保持するためのレジスタを含む。ここで、スカラー値は、（図４ｃに関して上述したように）定数のために予約されているメモリモデルの区画空間に格納され、そこから読み出される。ここで、同じ画像を処理している仮想プロセッサのグループの各仮想プロセッサは、定数メモリ空間から同じスカラー値を使用する。拡張された実施形態では、スカラー述語も存在する。これらは、述語およびスカラーの両方の定義を満たす、レジスタ空間に保持されている値である。
【００６１】
様々な実施形態において、各仮想プロセッサは、サポートされている算術命令オペコードが以下のいずれかの実行可能な組み合わせを含むＲＩＳＣのような命令セットとして設計されている：１）ADD（オペランドＡおよびＢの加算）；２）SUB（オペランドＡおよびＢの減算）；３）MOV（オペランドをあるレジスタから別のレジスタに移動する）；４）MUL（オペランドＡおよびＢを乗算する）；５）MAD（オペランドＡおよびＢを乗算し、結果にＣを加算する）；６）ABS（オペランドＡの絶対値を返す）；７）DIV（オペランドＡをオペランドＢで除算する）；８）SHL（オペランドＡを左にシフトする）；９）SHR（オペランドＡを右にシフトする）；１０）MIN/MAX （オペランドＡおよびＢのどちらか大きい方を返す）；１１）SEL（オペランドＡの指定されたバイトを選択する）；１２）AND（オペランドＡおよびＢの論理積を返す）；１３）OR（オペランドＡおよびＢの論理和を返す）；１４）XOR（オペランドＡおよびＢの論理排他的論理和を返す）；１５）NOT（オペランドＡの論理反転を返す）。
【００６２】
命令セットには、次のような標準の述語演算も含まれる。１）SEQ（ＡがＢと等しい場合は１を返す）；２）SNE（ＡがＢと等しくない場合は１を返す）；３）SLT（ＡがＢより小さい場合は１を返す）；４）SLE（ＡがＢ以下の場合は１を返す）。JMP（ジャンプ）およびBRANCHのような制御フロー命令もまた含まれ、それらの各々は名目上の変数または述語をオペランドとして含み得る。
【００６３】
ｄ．アプリケーションソフトウェア開発およびシミュレーション環境
図６は、アプリケーションソフトウェア開発およびシミュレーション環境６０１を示す。図２に関して上述したように、開発者は、全体的な意図された画像変換と整合する戦略的シーケンスでカーネルを配置することによって、包括的な画像処理機能（例：各段が専用の画像処理タスクを実行する画像処理パイプライン、他のＤＡＧ規定のルーチンセットなど）を開発することができる。カーネルはライブラリ６０２から呼び出されてもよく、および／または開発者が１つ以上のカスタムカーネルを開発してもよい。
【００６４】
ライブラリ６０２内のカーネルは、カーネルの第三者ベンダおよび／または任意の基礎をなす技術のプロバイダによって提供されてもよい（例えば、対象とされるハードウェア画像プロセッサを含むハードウェアプラットフォームのベンダまたは対象とされるハードウェア画像プロセッサのベンダ（例えば、その設計として、または実際のハードウェアとして提供される））。
【００６５】
カスタム開発されたカーネルの場合、多くの状況において、開発者は、単一のスレッド６０３についてプログラムコードを書くだけでよい。すなわち、開発者は、（例えば、前述の位置相対メモリアクセス命令フォーマットで）出力ピクセル位置に対する入力ピクセル値を参照することによって単一の出力ピクセル値を判断するプログラムコードを書くだけでよい。単一スレッド６０３の動作を満足すると、開発環境は、スレッドコードの複数のインスタンスをそれぞれの仮想プロセッサ上で自動的にインスタンス化して、画像表面領域上で動作するプロセッサのアレイ上でカーネルを実行することができる。画像表面領域は、画像フレームのセクション（ライングループなど）であってもよい。
【００６６】
様々な実施形態では、カスタムスレッドプログラムコードは、仮想プロセッサＩＳＡのオブジェクトコード（または仮想プロセッサＩＳＡオブジェクトコードにコンパイルされる高級言語）で書かれる。カスタムカーネルのプログラムコードの実行のシミュレーションは、メモリモデルに従って編成されたメモリにアクセスする仮想プロセッサを含むシミュレートされた実行時環境において実行されてもよい。ここで、仮想プロセッサのソフトウェアモデル（オブジェクト指向型またはその他）６０４およびそのモデルを組み込んだメモリ６０５がインスタンス化される。
【００６７】
仮想プロセッサモデル６０４は、次いで、スレッドコード６０３の実行をシミュレートする。スレッド、それのより大きなカーネル、およびそのカーネルが属する任意のより大きな関数の実行を満足すると、その全体が、基礎となるハードウェアの実際のオブジェクトコードにコンパイルされる。シミュレーション環境６０１の全体は、コンピュータシステム（例えば、ワークステーション）６０６上で実行されるソフトウェアとして実現されてもよい。
【００６８】
２．０  ハードウェアアーキテクチャの実施形態
ａ．画像プロセッサハードウェアアーキテクチャおよび動作
図７は、ハードウェアで実現される画像プロセッサのためのアーキテクチャ７００の実施形態を示す。画像プロセッサは、例えば、シミュレートされた環境内で仮想プロセッサ用に書かれたプログラムコードを、ハードウェアプロセッサによって実際に実行されるプログラムコードに変換するコンパイラによって対象とされてもよい。図７に示すように、アーキテクチャ７００は、複数のラインバッファユニット７０１＿１〜７０１＿Ｍ（以下、「ラインバッファ」、「ラインバッファユニット」など）を含み、それらは、複数のステンシルプロセッサユニット７０２＿１〜７０２＿Ｎ（以下、「ステンシルプロセッサ」、「ステンシルプロセッサユニット」など）および対応するシート生成部ユニット７０３＿１〜７０３＿Ｎ（以下、「シート生成部」、「シート生成部ユニット」など）に、ネットワーク７０４（例えば、ネットワークオンチップ（ＮＯＣ）（オンチップスイッチネットワーク、オンチップリングネットワークまたは他の種類のネットワークを含む））を介して相互接続される。一実施形態では、どのラインバッファユニットが、ネットワーク７０４を介してどのシート生成部および対応するステンシルプロセッサに接続してもよい。
【００６９】
一実施形態では、プログラムコードはコンパイルされ、対応するステンシルプロセッサ７０２にロードされて、ソフトウェア開発者によって以前に定義された画像処理動作を実行する（プログラムコードは、例えば、設計および実装に応じて、ステンシルプロセッサの関連のシート生成部７０３にもロードされてもよい）。少なくともいくつかの例では、画像処理パイプラインを、第１のパイプラインステージ用の第１のカーネルプログラムを第１のステンシルプロセッサ７０２＿１にロードし、第２のパイプラインステージ用の第２のカーネルプログラムを第２のステンシルプロセッサ７０２＿２にロードするなどして、実現することができ、第１のカーネルはパイプラインの第１ステージの機能を実行し、第２のカーネルはパイプラインの第２ステージの機能を実行し、追加の制御フロー方法がインストールされて、出力画像データをパイプラインの１つのステージからの次のステージに渡す。
【００７０】
他の構成では、画像プロセッサは、同じカーネルプログラムコードを動作させる２つ以上のステンシルプロセッサ７０２＿１，７０２＿２を有する並列マシンとして実現することができる。例えば、画像データの高密度かつ高データレートのストリームが、各々が同じ機能を実行する複数のステンシルプロセッサにわたってフレームを広げることによって処理されてもよい。
【００７１】
さらに他の構成では、カーネルの本質的に任意のＤＡＧのハードウェアプロセッサへのロードを、それぞれのステンシルプロセッサをそれら自身のプログラムコードのカーネルとともに構成し、適切な制御フローフックをハードウェアに構成して、出力画像をＤＡＧ設計における１つのカーネルから次のカーネルの入力に向けることによって、行なってもよい。
【００７２】
一般的なフローとして、画像データのフレームは、マクロＩ／Ｏユニット７０５で受信され、フレーム単位でラインバッファユニット７０１の１つ以上に渡される。特定のラインバッファユニットは、それの画像データのフレームを、「ライングループ」と呼ばれる画像データのより小さな領域に解析し、次いでライングループをネットワーク７０４を介して特定のシート生成部に渡す。ある完全な（ｆｕｌｌ）単数のライングループを、例えば、フレームの複数の連続した完全な行または列のデータで構成することができる（簡単にするために、本明細書では主に連続した行と称する）。シート生成部は、画像データのライングループを「シート」と呼ばれる画像データのより小さな領域にさらに解析し、そのシートを対応するステンシルプロセッサに提示する。
【００７３】
単一入力の画像処理パイプラインやＤＡＧフローの場合、一般に、入力フレームは、同じラインバッファユニット７０１＿１に向けられ、それは、画像データをライングループに解析し、ライングループを対応するシート生成部７０３＿１（対応するステンシルプロセッサ７０２＿１はパイプライン／ＤＡＧにおいて第１のカーネルのコードを実行している）に向ける。ステンシルプロセッサ７０２＿１による、それが処理するライングループでの動作が終了した後、シート生成部７０３＿１は、出力ライングループを「下流」のラインバッファユニット７０１＿２に送信する（ある使用例では、出力ライングループは、先に入力ライングループを送信したのと同じラインバッファ装置７０１＿１に送り返すことができる）。
【００７４】
自身のそれぞれの他のシート生成部およびステンシルプロセッサ（例えば、シート生成部７０３＿２およびステンシルプロセッサ７０２＿２）上で実行されるパイプライン／ＤＡＧにおける次のステージ／動作を表す１つ以上の「消費側」カーネルは、下流ラインバッファユニット７０１＿２から、第１のステンシルプロセッサ７０２＿１によって生成された画像データを受信する。このようにして、第１のステンシルプロセッサ上で動作する「作成側」カーネルは、その出力データが、第２のステンシルプロセッサ上で動作する「消費側」カーネルに転送され、消費側カーネルは、パイプラインまたはＤＡＧ全体の設計と整合する作成側カーネルの後に次のタスクのセットを実行する。
【００７５】
ステンシルプロセッサ７０２は、画像データの複数の重なり合うステンシル上で同時に動作するように設計されている。複数の重なり合うステンシルおよびステンシルプロセッサの内部ハードウェア処理能力は、シートのサイズを効果的に決定する。ここでは、ステンシルプロセッサ７０２内で、実行レーンのアレイが一致して動作して、複数の重なり合うステンシルによってカバーされる画像データ表面領域を同時に処理する。
【００７６】
以下でより詳細に説明するように、様々な実施形態において、画像データのシートは、ステンシルプロセッサ７０２内において二次元レジスタアレイ構造にロードされる。シートおよび二次元レジスタアレイ構造の使用は、大量のデータを、大量のレジスタ空間に、例えば、処理タスクが実行レーンアレイによってその直後に直接データ上で実行される単一のロード動作として移動することによって、電力消費の改善を効果的に提供すると考えられている。さらに、実行レーンアレイおよび対応するレジスタアレイの使用は、容易にプログラマブル／設定可能な異なるステンシルサイズを提供する。
【００７７】
図８ａ〜図８ｅは、ラインバッファユニット７０１の解析アクティビティ、およびシート生成部ユニット７０３のより微細な粒子の解析アクティビティ、ならびにシート生成部７０３に結合されるステンシルプロセッサ７０２のステンシル処理アクティビティの両方のハイレベルの実施形態を示す。
【００７８】
図８ａは、画像データ８０１の入力フレームの一実施形態を示す。図８ａはまた、ステンシルプロセッサが動作するように設計された３つの重なり合うステンシル８０２（各ステンシルは３ピクセル×３ピクセルの寸法を有する）の概要を示す。各ステンシルがそれぞれ出力画像データを生成する出力ピクセルは、ベタ黒で強調表示される。簡略化のために、３つの重なり合うステンシル８０２は、垂直方向にのみ重なるように示されている。実際には、ステンシルプロセッサは、垂直方向および水平方向の両方に重なるステンシルを有するように設計されてもよいことを認識することが適切である。
【００７９】
図８ａに見られるように、ステンシルプロセッサ内の垂直に重なり合うステンシル８０２のために、フレーム内に単一のステンシルプロセッサが動作することができる画像データの広い帯域が存在する。以下でより詳細に説明するように、一実施形態では、ステンシルプロセッサは、データを、それらの重なり合うステンシル内で、左から右への態様で、画像データにわたって処理する（そして、次のラインのセットに対して、上から下の順序で繰り返す）。このように、ステンシルプロセッサがそれらの動作を前方に進めるにつれて、ベタ黒出力ピクセルブロックの数は、水平方向に右に成長する。上述したように、ラインバッファユニット７０１は、ステンシルプロセッサが今後の拡張された数のサイクルにわたって動作するのに十分な入来フレームからの入力画像データのライングループを解析することを担う。ライングループの例示的な図示は、陰影領域８０３として示されている。一実施形態では、以下にさらに記載されるように、ラインバッファユニット７０１は、ライングループをシート生成部との間で送受信するための異なるダイナミクスを理解することができる。例えば、「完全なグループ」と呼ばれる１つのモードによれば、画像データの完全な全幅のラインが、ラインバッファユニットとシート生成部との間で渡される。「仮想的に高い」と呼ばれる第２のモードによれば、ライングループは最初に全幅行のサブセットと共に渡される。その後、残りの行は、より小さい（全幅未満の）片で順番に渡される。
【００８０】
入力画像データのライングループ８０３がラインバッファユニットによって画定され、シート生成部ユニットに渡されると、シート生成部ユニットはさらに、ライングループを、ステンシルプロセッサのハードウェア制限に、より正確に適合する、より微細なシートに、解析する。より具体的には、以下でさらに詳細に説明するように、一実施形態では、各ステンシルプロセッサは、二次元シフトレジスタアレイからなる。二次元シフトレジスタアレイは、本質的に、画像データを実行レーンのアレイの「真下」にシフトし、シフトのパターンは、各実行レーンをそれ自身のステンシル内においてデータに対して動作させる（すなわち、各実行レーンは、それ自身の情報のステンシル上で処理して、そのステンシルの出力を生成する）。一実施形態では、シートは、二次元シフトレジスタアレイを「満たす」か、さもなければ二次元シフトレジスタアレイにロードされる入力画像データの表面領域である。
【００８１】
したがって、図８ｂに見られるように、シート生成部は、ライングループ８０３から最初のシート８０４を解析し、それをステンシルプロセッサに供給する（ここで、例示のデータのシートは、参照番号８０４によって全体的に識別される５×５の陰影領域に対応する）。図８ｃおよび図８ｄに示すように、ステンシルプロセッサは、重なるステンシル８０２をシート上で左から右へ効果的に移動させることによって、入力画像データのシートに対して動作する。図８ｄのように、シート内のデータから出力値を計算することができるピクセル数（暗くされた３×３アレイの９個）が使い果たされる（他のピクセル位置は、シート内の情報から決定される出力値を有することができない）。簡単にするために、画像の境界領域は無視されている。
【００８２】
図８ｅにおいて見られるように、シート生成部は次いで、ステンシルプロセッサが動作を継続する次のシート８０５を提供する。ステンシルが次のシートに対して動作を開始するときのステンシルの初期位置は、（先に図８ｄに示されている）最初のシート上の消耗点から右への次の進行であることに留意されたい。新たなシート８０５で、ステンシルプロセッサが最初のシートの処理と同じ態様で新たなシートに対して動作するにつれ、ステンシルは単に右に移動し続ける。
【００８３】
出力ピクセル位置を取り囲むステンシルの境界領域のために、第１のシート８０４のデータと第２のシート８０５のデータとの間にいくらかの重なりがあることに留意されたい。重なりは、シート生成部が重なり合うデータを２回再送信することによって簡単に処理することができる。別の実現例では、次のシートをステンシルプロセッサに供給するために、シート生成部は、ステンシルプロセッサに新たなデータを送るだけに進んでもよく、ステンシルプロセッサは、前のシートからの重なり合うデータを再利用する。
【００８４】
ｂ．ステンシルプロセッサ設計および動作
図９ａは、ステンシルプロセッサユニットアーキテクチャ９００の実施形態を示す。図９ａにおいて見られるように、ステンシルプロセッサは、データ計算ユニット９０１、スカラープロセッサ９０２および関連するメモリ９０３およびＩ／Ｏユニット９０４を含む。データ計算ユニット９０１は、実行レーンのアレイ９０５、二次元シフトアレイ構造９０６、およびアレイの特定の行または列に関連する別個のそれぞれのランダムアクセスメモリ９０７を含む。
【００８５】
Ｉ／Ｏユニット９０４は、シート生成部から受け取ったデータの「入力」シートをデータ計算ユニット９０１にロードし、ステンシルプロセッサからのデータの「出力」シートをシート生成部に格納する役割を果たす。一実施形態では、データ計算ユニット９０１へのシートデータのロードは、受け取ったシートを画像データの行／列に解析し、画像データの行／列を二次元シフトレジスタ構造９０６または実行レーンアレイの行／列のそれぞれのランダムアクセスメモリ９０７にロードすることを必要とする（以下でより詳細に説明する）。シートが最初にメモリ９０７にロードされる場合、実行レーンアレイ９０５内の個々の実行レーンは、適宜、ランダムアクセスメモリ９０７からシートデータを二次元シフトレジスタ構造９０６にロードすることができる（例えば、シートのデータ上での動作のすぐ前のロード命令として）。データのシートのレジスタ構造９０６へのロード（シート生成部からの直接的であろうとまたはメモリ９０７からであろうと）が完了すると、実行レーンアレイ９０５の実行レーンはデータに対して動作し、最終的に、完成したデータをシートとしてシート生成部に、またはランダムアクセスメモリ９０７に「書き戻す」。実行レーンがランダムアクセスメモリ９０７に書き戻す場合、Ｉ／Ｏユニット９０４はランダムアクセスメモリ９０７からデータをフェッチして出力シートを形成し、出力シートはシート生成部に転送される。
【００８６】
スカラープロセッサ９０２は、スカラーメモリ９０３からステンシルプロセッサのプログラムコードの命令を読み出し、実行レーンアレイ９０５の実行レーンに命令を発行するプログラムコントローラ９０９を含む。一実施形態では、データ計算ユニット９０１から単一命令複数データ（ＳＩＭＤ）のような動作を実行するために、単一の同じ命令がアレイ９０５内のすべての実行レーンにブロードキャストされる。一実施形態では、スカラーメモリ９０３から読み出され、実行レーンアレイ９０５の実行レーンに発行される命令の命令フォーマットは、命令当たり２つ以上のオペコードを含む非常に長い命令語（ＶＬＩＷ）タイプのフォーマットを含む。さらなる実施形態では、ＶＬＩＷフォーマットは、（以下に説明するように、一実施形態では２つ以上の従来のＡＬＵ動作を指定することができる）各実行レーンのＡＬＵによって実行される数学的機能を指示するＡＬＵオペコードと、（特定の実行レーンまたは実行レーンのセットに対してメモリ操作を指示する）メモリオペコードとの両方を含む。
【００８７】
「実行レーン」という用語は、命令を実行することができる１つ以上の実行ユニットのセット（例えば、命令を実行することができる論理回路系）を指す。実行レーンは、しかしながら、様々な実施形態では、単なる実行ユニットを超えた、よりプロセッサに似た機能を含むことができる。例えば、１つ以上の実行ユニットに加えて、実行レーンは、受信された命令をデコードする論理回路系、または、より単一命令複数データ（ＳＩＭＤ）のような設計の場合、命令をフェッチおよびデコードする論理回路系を含むことができる。ＭＩＭＤのようなアプローチに関しては、ここでは集中プログラム制御アプローチが主に記載されているが、より分散型のアプローチが様々な代替実施形態（例えば、アレイ９０５の各実行レーン内のプログラムコードおよびプログラムコントローラを含む）において実施されてもよい。
【００８８】
実行レーンアレイ９０５、プログラムコントローラ９０９および二次元シフトレジスタ構造９０６の組み合わせは、広範囲のプログラマブルな機能のための幅広く適応可能／設定可能なハードウェアプラットフォームを提供する。例えば、アプリケーションソフトウェア開発者は、個々の実行レーンが多種多様な機能を実行することができ、任意の出力アレイ位置に近接した入力画像データに容易にアクセスすることができれば、寸法（例えばステンシルサイズ）だけでなく幅広い異なる機能能力を有するカーネルをプログラミングすることができる。
【００８９】
実行レーンアレイ９０５によって操作される画像データのためのデータ記憶装置として機能することとは別に、ランダムアクセスメモリ９０７は、セクション１．０で説明した仮想処理メモリのルックアップテーブル成分に保持される任意のルックアップテーブルなどのような１つ以上のルックアップテーブルを保持することもできる。様々な実施形態では、１つ以上のスカラールックアップテーブルをスカラーメモリ９０３内でインスタンス化することもできる。１つ以上のスカラールックアップテーブルは、セクション１．０で上述したメモリモデルのスカラールックアップテーブル成分に保持される任意のスカラールックアップテーブルであってもよい。
【００９０】
スカラールックアップは、同じルックアップテーブルからの同じインデックスからの同じデータ値を実行レーンアレイ９０５内の各実行レーンに渡すことを含む。様々な実施形態では、上述のＶＬＩＷ命令フォーマットは、スカラープロセッサによって実行されるルックアップ動作をスカラールックアップテーブルに向けるスカラーオペコードを含むようにも拡張される。オペコードとともに使用するために指定されたインデックスは、即値オペランドでもよいし、他のデータ記憶位置からフェッチされてもよい。いずれにせよ、一実施形態では、スカラーメモリ内のスカラールックアップテーブルからのルックアップは、基本的に同じクロックサイクル中に実行レーンアレイ９０５内のすべての実行レーンに同じデータ値をブロードキャストすることを含む。ルックアップテーブルの使用および動作に関する追加の詳細は、以下でさらに説明する。
【００９１】
図９ｂは、上述のＶＬＩＷ命令ワードの実施形態を要約したものである。図９ｂにおいて見られるように、ＶＬＩＷ命令ワードフォーマットは、３つの別個の命令、すなわち、１）スカラープロセッサによって実行されるスカラー命令９５１、２）実行レーンアレイ内でそれぞれのＡＬＵによってＳＩＭＤ方式でブロードキャストされ実行されるＡＬＵ命令９５２、および３）部分的ＳＩＭＤ方式でブロードキャストされ実行されるメモリ命令９５３に対するフィールドを含む（例えば、実行レーンアレイ内において同じ行に沿った実行レーンが同じランダムアクセスメモリを共有する場合、異なる行の各々からの１つの実行レーンが実際に命令を実行する（メモリ命令９５３のフォーマットは、各行からのどの実行レーンが命令を実行するかを識別するオペランドを含むことができる）。
【００９２】
１つ以上の即時オペランドに対するフィールド９５４も含まれる。命令９５１，９５２，９５３のどれが、どの即時オペランド情報を用いるかは命令フォーマットで識別されてもよい。命令９５１，９５２，９５３の各々は、また、それ自身のそれぞれの入力オペランドおよび結果情報（例えば、ＡＬＵ演算用のローカルレジスタならびにメモリアクセス命令用のローカルレジスタおよびメモリアドレス）を含む。一実施形態では、スカラー命令９５１は、実行レーンアレイ内の実行レーンが他の２つの命令９５２，９５３のいずれかを実行する前にスカラープロセッサによって実行される。すなわち、ＶＬＩＷワードの実行は、スカラー命令９５１が実行される第１のサイクルと、続いて他の命令９５２，９５３が実行されてもよい第２のサイクルとを含む。（様々な実施形態では、命令９５２，９５３は並列して実行されてもよい）。
【００９３】
一実施形態では、スカラープロセッサ９０２によって実行されるスカラー命令は、シートをデータ計算ユニット９０１のメモリもしくは２Ｄシフトレジスタ９０６からロードまたはそれに格納するようシート生成部７０３に発行されるコマンドを含む。ここで、シート生成部の動作は、ラインバッファユニット７０１の動作またはスカラープロセッサ９０２によって発行されたコマンドをシート生成部７０３が完了するのに要するサイクル数のプレランタイムの理解を妨げる他の変数に依存し得る。したがって、一実施形態では、スカラー命令９５１がシート生成部に発行されるべきコマンドに対応するか、さもなければコマンドをシート生成部７０３に発行させるＶＬＩＷワードは、他の２つの命令フィールド９５２，９５３に無操作（ＮＯＯＰ）命令を含む。次に、プログラムコードは、シート生成部がデータ計算ユニットに対するそのロードまたはデータ計算ユニットからのその格納を完了するまで、命令フィールド９５２，９５３についてＮＯＯＰ命令のループに入る。ここで、シート生成部にコマンドを発行すると、スカラープロセッサは、シート生成部がコマンドの完了時にリセットするインターロックレジスタのビットをセットしてもよい。ＮＯＯＰループの間、スカラープロセッサはインターロックビットのビットを監視する。スカラープロセッサが、シート生成部がそのコマンドを完了したことを検出すると、通常の実行が再び開始される。
【００９４】
図１０は、データ計算ユニット１００１の一実施形態を示す。図１０において見られるように、データ計算ユニット１００１は、二次元シフトレジスタアレイ構造１００６「の上に」論理的に位置決めされる実行レーンのアレイ１００５を含む。上述したように、様々な実施形態では、シート生成部によって提供される画像データのシートが二次元シフトレジスタ１００６にロードされる。実行レーンは、レジスタ構造１００６からのシートデータに対して動作する。
【００９５】
実行レーンアレイ１００５およびシフトレジスタ構造１００６は、互いに対して適所に固定される。しかし、シフトレジスタアレイ１００６内のデータは、戦略的かつ調整された態様でシフトして、実行レーンアレイ内の各実行レーンがデータ内で異なるステンシルを処理するようにする。したがって、各実行レーンは、生成されている出力シートにおいて異なるピクセルに対する出力画像値を決定する。図１０のアーキテクチャから、実行レーンアレイ１００５が垂直に近接する実行レーンおよび水平に近接する実行レーンを含むので、重なり合うステンシルが垂直に配置されるだけでなく水平にも配置されることは明らかである。
【００９６】
データ計算ユニット１００１のいくつかの注目すべきアーキテクチャ上の特徴には、実行レーンアレイ１００５よりも広い寸法を有するシフトレジスタ構造１００６が含まれる。すなわち、実行レーンアレイ１００５の外側にレジスタ１００９の「ハロー」が存在する。ハロー１００９は、実行レーンアレイの２つの側に存在するように示されているが、実現例に応じて、実行レーンアレイ１００５の２つ未満（１つ）またはそれ以上（３つまたは４つ）の側に存在してもよい。ハロー１００５は、データが実行レーン１００５の「下で」シフトしているときに、実行レーンアレイ１００５の境界の外側にこぼれ出るデータのための「スピルオーバ」空間を提供する働きをする。単純なケースとして、実行レーンアレイ１００５の右端を中心とする５×５のステンシルは、ステンシルの最も左側のピクセルが処理されるとき、さらに右側に４つのハローレジスタ位置を必要とすることになる。図面を簡単にするために、図１０は、名目上の実施例において、どちらの側（右、底）のレジスタでも水平方向接続および垂直方向接続の両方を有するであろうとき、ハローの右側のレジスタを、水平方向シフト接続を有するだけとして、およびハローの底側のレジスタを、垂直方向シフト接続を有するだけとして示す。
【００９７】
アレイの各行および／もしくは各列またはその一部分に結合されるランダムアクセスメモリ１００７によって追加のスピルオーバールームが提供される（例えば、ランダムアクセスメモリは、４つの実行レーン行状と２つの実行レーン列状にまたがる実行レーンアレイの「領域」に割り当てられてもよい。簡略化のために、アプリケーションの残りの部分は、主に、行および／または列に基づく割り当てスキームを指す）。ここで、実行レーンのカーネル動作が、それが（一部の画像処理ルーチンが必要とする場合がある）二次元シフトレジスタアレイ１００６の外にあるピクセル値を処理することを必要とする場合、画像データの面は、ハロー領域１００９からランダムアクセスメモリ１００７にさらにこぼれ出ることができる。例えば、ハードウェアが実行レーンアレイの右端の実行レーンの右側にわずか４つの記憶素子のハロー領域を含む場合の６Ｘ６ステンシルを考える。この場合、ステンシルを完全に処理するために、データをハロー１００９の右端からさらに右側にシフトする必要があるであろう。ハロー領域１００９の外側にシフトされたデータは、ランダムアクセスメモリ１００７にこぼれ出る。ランダムアクセスメモリ１００７および図３のステンシルプロセッサの他の適用例を以下でさらに説明する。
【００９８】
図１１ａないし図１１ｋは、上述のように実行レーンアレイ「の下で」二次元シフトレジスタアレイ内で画像データがシフトされる態様の実施例を示す。図１１ａにおいて見られるように、二次元シフトアレイのデータ内容は第１のアレイ１１０７に示され、実行レーンアレイはフレーム１１０５によって示される。また、実行レーンアレイ内の２つの近隣の実行レーン１１１０が簡略化して示されている。この簡単な図示１１１０では、各実行レーンは、シフトレジスタからデータを受け付け、ＡＬＵ出力からデータを受け付け（例えば、サイクルにわたってアキュムレータとして動作する）、または出力データを出力先に書き込むことができるレジスタＲ１を含む。
【００９９】
各実行レーンはまた、ローカルレジスタＲ２において、二次元シフトアレイにおけるそれ「の下の」内容が利用可能である。したがって、Ｒ１は実行レーンの物理レジスタであり、Ｒ２は二次元シフトレジスタアレイの物理レジスタである。実行レーンは、Ｒ１および／またはＲ２によって提供されるオペランドに対して動作可能なＡＬＵを含む。さらに詳細に後述するように、一実施形態では、シフトレジスタは、実際にはアレイ位置ごとに複数の（ある「深さ」の）記憶／レジスタ素子で実現されるが、シフト動作は記憶素子の１つの面に限られる（例えば、記憶素子の１つの面のみがサイクルごとにシフトすることができる）。図１１ａないし図１１ｋは、それぞれの実行レーンから結果のＸを格納するために使用されるとしてこれらのより深いレジスタ位置の１つを示している。例示を容易にするために、より深い結果のレジスタは、その対応するレジスタＲ２の下ではなく、その横に図示されている。
【０１００】
図１１ａ〜図１１ｋは、実行レーンアレイ１１０５内に示された実行レーン位置１１１１の対に中心位置が整列された２つのステンシルの計算に焦点を当てている。例示を容易にするために、実行レーン１１１０の対は、実際には、以下の例によれば、それらが垂直方向の近隣実行レーンである場合に、水平方向の近隣実行レーンとして図示されている。
【０１０１】
図１１ａで最初に見られるように、実行レーン１１１１はそれらの中央のステンシル位置上に中心を配される。図１１ｂは、両方の実行レーン１１１１によって実行されるオブジェクトコードを示す。図１１ｂにおいて見られるように、両方の実行レーン１１１１のプログラムコードは、シフトレジスタアレイ１１０７内のデータを、１つの位置だけ下にシフトさせ、１つの位置だけ右にシフトさせる。これにより、両方の実行レーン１１１１がそれらのそれぞれのステンシルの左上隅に整列される。次に、プログラムコードは、（Ｒ２において）それらのそれぞれの位置にあるデータをＲ１にロードさせる。
【０１０２】
図１１ｃに示すように、次にプログラムコードは、実行レーン１１１１の対に、シフトレジスタアレイ１１０７内のデータを１単位だけ左にシフトさせ、各実行レーンのそれぞれの位置の右の値を各実行レーンの位置にシフトさせる。Ｒ１の値（以前の値）は、次いで、（Ｒ２における）実行レーンの位置にシフトした新しい値とともに加算される。結果はＲ１に書き込まれる。図１１ｄで見られるように、図１１ｃについて上述したのと同じプロセスが繰り返され、結果のＲ１に対して、今度は上側実行レーンにおける値Ａ＋Ｂ＋Ｃ、および下側実行レーンにおけるＦ＋Ｇ＋Ｈ値を含ませるようにする。この時点で、両方の実行レーン１１１１はそれらのそれぞれのステンシルの上側の行を処理している。（左側に存在する場合には）実行レーンアレイ１１０５の左側でハロー領域に、またはハロー領域が存在しない場合にはランダムアクセスメモリにこぼれ出ることは、実行レーンアレイ１１０５の左側には存在しないことに注目されたい。
【０１０３】
図１１ｅに示すように、次に、プログラムコードは、シフトレジスタアレイ内のデータを１単位だけ上にシフトさせ、両方の実行レーン１１１１をそれらのそれぞれのステンシルの中間行の右端に整列される。両方の実行レーン１１１１のレジスタＲ１は、現在、ステンシルの最上行および中間行の一番右の値の合計を含む。図１１ｆおよび図１１ｇは、両方の実行レーンのステンシルの中間行にわたって左方向に移動する継続的な進行を示す。累積加算は、図１１ｇの処理の終了時に、両方の実行レーン１１１１がそれらのそれぞれのステンシルの最上行の値と中間行の値との合計を含むように、継続する。
【０１０４】
図１１ｈは、各実行レーンをそれの対応するステンシルの最下行に整列させる別のシフトを示す。図１１ｉおよび図１１ｊは、両方の実行レーンのステンシルの過程にわたって処理を完了するための継続的なシフトを示す。図１１ｋは、各実行レーンをデータアレイにおいてそれの正しい位置に整列させ、その結果をそこに書き込むための追加のシフトを示す。
【０１０５】
図１１ａ〜図１１ｋの例では、シフト動作のためのオブジェクトコードは、（Ｘ、Ｙ）座標で表されるシフトの方向および大きさを識別する命令フォーマットを含むことができることに留意されたい。例えば、１つの位置分の上方向シフトのためのオブジェクトコードは、オブジェクトコードでＳＨＩＦＴ０，＋１として表現されてもよい。別の例として、１つの位置分の右方向へのシフトは、オブジェクトコードでＳＨＩＦＴ＋１，０として表現されてもよい。様々な実施形態では、より大きい大きさのシフトも、オブジェクトコードで指定することができる（例えば、シフト０，＋２）。ここで、２Ｄシフトレジスタハードウェアが１サイクルにつき１つの位置だけしかシフトをサポートしない場合、命令は機械によって複数のサイクル実行を要求するように解釈されてもよく、または２Ｄシフトレジスタハードウェアは、１サイクルにつき２つ以上の位置分シフトをサポートするように設計されてもよい。後者の実施形態はより詳細にさらに下に記載される。
【０１０６】
図１２は、アレイ実行レーンおよびシフトレジスタ構造の単位セルの別のより詳細な図を示す（ハロー領域のレジスタは、対応する実行レーンを含まない）。実行レーンおよび実行レーンアレイの各位置に関連するレジスタ空間は、一実施形態では、実行レーンアレイの各ノードで、図１２に示す回路系をインスタンス化することによって実施される。図１２に示すように、単位セルは、４つのレジスタＲ２〜Ｒ５からなるレジスタファイル１２０２に結合される実行レーン１２０１を含む。任意のサイクルの間、実行レーン１２０１は、レジスタＲ１〜Ｒ５のいずれかから読み書きすることができる。２つの入力オペランドを必要とする命令の場合、実行レーンはＲ１〜Ｒ５のいずれかからオペランドの両方を取り出すことができる。
【０１０７】
一実施形態では、二次元シフトレジスタ構造は、近隣のレジスタファイル間のシフトが同じ方向にあるように（例えば、すべての実行レーンは左にシフトする、すべての実行レーンは右にシフトするなど）、それの近隣のレジスタファイルが入力マルチプレクサ１２０４を介する場合に、単一のサイクルの間に、レジスタＲ２〜Ｒ４のいずれか（ただ）１つの内容が、出力マルチプレクサ１２０３を介してその近隣のレジスタファイルの１つにシフト「アウト」され、対応するものからシフト「イン」される内容でレジスタＲ２〜Ｒ４のいずれか（ただ）１つの内容が置き換えられることによって、実現される。同じレジスタがその内容がシフトアウトされて同じサイクルでシフトインされる内容で置き換えられるのが一般的であるかもしれないが、マルチプレクサ構成１２０３，１２０４は、同じサイクル中に同じレジスタファイル内で異なるシフトソースおよびシフトターゲットレジスタを可能にする。
【０１０８】
図１２に示すように、シフトシーケンスの間、実行レーンは、内容をそのレジスタファイル１２０２からその左、右、上および下の近隣のレジスタファイルにシフトアウトする。同じシフトシーケンスと関連して、実行レーンは、さらに、内容をその左、右、上および下の近隣のレジスタファイルの特定のものからそれのレジスタファイルにシフトする。再び、シフトアウトターゲットおよびシフトインソースは、すべての実行レーンについて同じシフト方向と整合しなければならない（例えば、シフトアウトが右隣に対する場合、シフトインは左隣からでなければならない）。
【０１０９】
一実施形態では、１サイクルにつき１つの実行レーンにつき１つのレジスタの内容だけをシフトすることが許されるが、他の実施形態では、２つ以上のレジスタの内容をシフトイン／アウトすることが許されてもよい。例えば、図１２に示されたマルチプレクサ回路系１２０３，１２０４の第２の例が図１２の設計に組み込まれる場合、同じサイクルの間に２つのレジスタの内容がシフトアウト／インされてもよい。もちろん、１つのレジスタの内容だけがサイクルごとにシフトされることが許される実施形態では、数学的演算間のシフトのためにより多くのクロックサイクルを消費することによって、複数のレジスタからのシフトが数学的演算間に起こってもよい（例えば、２つのレジスタの内容が、数学的演算間で２つのシフト演算を消費することによって数学的演算間でシフトされてもよい）。
【０１１０】
実行レーンのレジスタファイルのすべての内容未満がシフトシーケンス中にシフトアウトされる場合、各実行レーンのシフトアウトされないレジスタの内容は適所に残る（シフトしない）ことに留意されたい。したがって、シフトインされる内容と置き換えられないシフトされない内容は、シフトサイクルにわたって実行レーンにローカルに維持される。各実行レーンで見られるメモリユニット（「Ｍ」）は、データを、実行レーンアレイ内の実行レーンの行および／または列に関連付けられるランダムアクセスメモリ空間からロードまたはそれに格納するために使用される。ここで、Ｍユニットは、実行レーンの自身のレジスタ空間からロードまたはそれに格納できないデータをロード／格納するためによく使用されるという点で、標準的なＭユニットとして機能する。様々な実施形態では、Ｍユニットの主な動作は、ローカルレジスタからメモリにデータを書き込み、メモリからデータを読み出してそれをローカルレジスタに書き込むことである。
【０１１１】
ハードウェア実行レーン１２０１のＡＬＵユニットによってサポートされるＩＳＡオペコードに関して、様々な実施形態において、ハードウェアＡＬＵによってサポートされる数学的オペコードは、仮想実行レーンによってサポートされる数学的オペコード（例えば、ＡＤＤ、ＳＵＢ、ＭＯＶ、ＭＵＬ、ＭＡＤ、ＡＢＳ、ＤＩＶ、ＳＨＬ、ＳＨＲ、ＭＩＮ／ＭＡＸ、ＳＥＬ、ＡＮＤ、ＯＲ、ＸＯＲ、ＮＯＴ）と一体的に結び付けられる（例えば実質的に同じである）。上述のように、メモリアクセス命令は、実行レーン１２０１によって実行され、データをそれらの関連付けられるランダムアクセスメモリからフェッチまたはそれに格納することができる。さらに、ハードウェア実行レーン１２０１は、シフト演算命令（右、左、上、下）をサポートし、二次元シフトレジスタ構造内でデータをシフトする。上述したように、プログラム制御命令は主にステンシルプロセッサのスカラープロセッサによって実行される。
【０１１２】
３．０  画像プロセッサにおいて実現されるブロック処理
ａ．行／列合計演算
図１３および図１４ａ、図１４ｂは、行／列合計演算に関する。行／合計列演算は、統計計算、ノイズ抑制、および大規模ダウンサンプリングに特に有用である。行合計演算および／または列合計演算は、先のセクションで上述した画像プロセッサの実施形態などの、二次元実行レーンアレイおよび対応する二次元シフトレジスタアレイを有する画像プロセッサ上で実施することができる。
【０１１３】
図１３に見られるように、行合計演算はアレイの同じ行内のすべての値を加算し、列合計演算はアレイの同じ列内のすべての値を加算する。さらに、図示のように、行合計演算で、すべての行の値をそれらのそれぞれの行内で同時に加算することができる。同様に、列合計演算で、すべての列の値をそれぞれの列内で同時に加算できる。しかしながら、シフトレジスタアレイの多用途性のため、すべての行または列にわたる合計は必要条件ではない。すなわち、アレイ内のすべての行より少ない行が同時に合計されてもよく、またはアレイ内のすべての列より少ない列が同時に合計されてもよい。
【０１１４】
図１４ａ〜図１４ｄは、行合計演算を実施するためのマシンレベル演算の実施形態を示す図である。単純化のため、単一行のみを示す。読者は、図１４ａ〜図１４ｄに示された演算が列にも適用され得ることを理解するであろう。さらに、行演算または列演算の両方について、図１４ａ〜図１４ｄのシーケンスは、アレイ内の複数の行または列に対して同時に実行することもできる。加えて、行の次元は８つの位置の幅であるよう示されているだけである（が、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは１６×１６以上であってもよい）。
【０１１５】
一実装形態では、図１４ａに見られるように、二次元シフトレジスタアレイは、アレイ１４０１の両端の間の直接論理シフトをサポートするように設計されている。すなわち、シフトレジスタは、行軸に沿ってシフトを実行するときに、その内容を右端のアレイ列と左端のアレイ列の間で「ロール」もしくは「ループ」もしくは「ラップ」することができ、および／または列軸に沿ってシフトを実行するときに、その内容を一番上のアレイ行と一番下のアレイ行との間でロールもしくはループすることができる。さらに、様々な実施形態において、シフトレジスタは単一の命令において複数のレジスタ位置ホップをサポートすることができる（例えば、シフト命令に関連付けられるオペコードおよび／または変数は、シフト量が水平軸および／または垂直軸に沿って+/-1, +/-2, +/-3または+/-4であるかどうかを指定する）。ハードウェアでサポートされていないシフト距離は、コンパイラによってエミュレートされ得る。
【０１１６】
図１４ａに見られるように、最初に、行に、データ値Ａ０〜Ａ７が、各実行レーンのそれぞれのＲ０およびＲ１レジスタ位置にロードされる。図１４ｂに見られるように、マシン演算の１回目の反復において、Ｒ１レジスタ空間位置は次いで１位置左にシフトされ、各実行レーンのＲ１およびＲ０の内容が合計されてその結果がＲ０およびＲ１に書き戻される。これにより、Ｒ１内に第１の累積部分和が生成され、これは、以下の説明でより明らかにされるように、総和演算のための累積器として機能する。
【０１１７】
図１４ｃに示すマシン演算の次の反復では、Ｒ１レジスタ空間位置が２つの位置だけ左にシフトされ、各実行レーンのＲ１およびＲ０の内容が合計される。結果は再びＲ０およびＲ１に保持される。最後に、図１４ｄに示されるマシン演算の３回目の反復において、Ｒ１レジスタ空間位置は４つの位置だけ左にシフトされ、その結果はレジスタ位置Ｒ０およびＲ１の一方または両方に書き込まれる。したがって、図１４ｂ、図１４ｃ、および図１４ｄの合計演算の反復を見ると、シフト量は各反復で２倍になり、完全な結果はわずか３回の反復後に（すなわち、図１４ｃのように）すべてのレーンに存在することに留意されたい。幅１６の行の場合、シフト量は４回目の反復に対して８つの位置になり、４回目の反復後に演算は完了する。
【０１１８】
ｂ.行／列プレフィックス合計演算
図１５および図１６ａ〜図１６ｄは、同様に、二次元実行レーンアレイおよび対応する二次元シフトレジスタを有する画像プロセッサ上で実行できる行／列プレフィックス合計演算に関する。行／列プレフィックス合計演算は、積分画像、ボックスフィルタの加速、および圧縮演算のためのアドレスの計算に特に有用である。図１５を参照すると、単純化のため、単一の行のみが示されている。ただし、列に対して演算を実行することもできる。また、１行しか描かれていないが、様々な実現例において、すぐ上で論じた行／列合計演算と同様に、（すべての行／列を含む）レジスタアレイ内の任意の数の行（または列）を同時に合計することができる。加えて、図１５の行の次元は８つの位置の幅であるよう示されているだけであるが、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは１６×１６以上であってもよい。
【０１１９】
図１５で見られるように、行内の任意の位置に対する行プレフィックス演算の結果は、その位置に至るまでの値の合計である。同様に、列内の任意の位置に対する列プレフィックス演算の値は、その位置に至るまでの値の合計である。
【０１２０】
図１６ａ〜図１６ｄは行プレフィックス演算のためのマシンレベル演算の実施例を示す。前のセクションで詳細に論じた行合計演算と同様に、行プレフィックス演算は、アレイ端位置間１６０１でシフトをロールすることができる二次元シフトレジスタを使用する。
【０１２１】
図１６ａに見られるように、最初に、行に、データ値Ａ０〜Ａ７が、各実行レーンのそれぞれのＲ０レジスタ位置にロードされる。また、各実行レーンのＲ２レジスタ空間にヌル（「０」）がロードされる。
【０１２２】
図１６ｂに示されるマシンレベル演算の１回目の反復において、Ｒ０レジスタ空間位置は、目的地位置のＲ１レジスタ空間へと１つの位置右にシフトされる。後続のADD演算は、反復回数に対するレーンの位置に応じて、Ｒ０内容をＲ１内容またはＲ２内容のいずれかと加算する。具体的には、１番目の行位置は、Ｒ２内のヌルを選択し（Ｒ１内のシフトされた内容を選択しない）、なぜならば、その位置（０）は２Ｎ−１以下（ここで、Ｎは反復回数（２０−１＝０）であるからであり、そのヌルをＲ０の内容に加算し、その結果をＲ０に格納する。したがって、１番目の行位置はＲ０にＡ０の値を維持する。
【０１２３】
対照的に、他の行位置の各々は、それらの位置が２Ｎ−１より大きいため、（Ｒ２内のヌル値ではなく）Ｒ１内のシフトされた内容を選択し、それをＲ０内の内容に加算して、その結果をＲ０に格納する。したがって、１番目の行位置以外の各行位置は、それの元の内容とそれの最も左隣との合計をＲ０に保持し、１番目の行位置は単にそれの元の内容のみをＲ０に保持する。
【０１２４】
図１６ｃに示されるマシンレベル演算の２回目の反復において、Ｒ０レジスタ空間位置の内容は目的地のＲ１レジスタ空間内へと２つの位置右にシフトされる。したがって、すぐ上で説明した行／列演算と同様に、マシン演算の次の反復ごとに、シフト量は２倍になる。１番目の反復と同様に、後続のADD演算は、現在の反復回数に対するレーンの位置に応じて、Ｒ０の内容をＲ１の内容またはＲ２の内容のいずれかと加算する。この場合、第１および第２の行位置はＲ２内のヌルを選択し（Ｒ１内のシフトされた内容を選択しない）、なぜならば、それらの位置（０，１）は２Ｎ−１（２１−１＝１）以下であるからである。したがって、これらのレーンはヌル値をＲ０の内容に加算し、その結果をＲ０に格納し戻す。したがって、１番目の行位置はそれの値Ａ０をＲ０に維持し、２番目の行位置はＡ０＋Ａ１の値をＲ０に維持する。
【０１２５】
対照的に、他の行位置の各々は、それらの位置が２Ｎ−１より大きいため、（Ｒ２内のヌル値ではなく）Ｒ１内のシフトされた内容を選択し、Ｒ１の内容をＲ０内の内容に加算して、その結果をＲ０に格納する。したがって、１番目および２番目の行位置以外の各行位置は、それの元の内容と内容がシフトされたそれの総計とに基づいた累積合計を、Ｒ０に保持する。
【０１２６】
図１６ｄに示されるマシンレベル演算の３回目の反復では、Ｒ０レジスタ空間位置は目的地のＲ１レジスタ空間へと４つの位置右にシフトされる。したがって、やはり、マシン演算の次の反復ごとに、シフト量は２倍になる。以前の反復と同様に、後続のＡＤＤ演算は、現在の反復回数に対するレーンの位置に応じて、Ｒ０の内容をＲ１の内容またはＲ２の内容のいずれかと加算する。この場合、第１〜第４番目の行位置（０〜３）はＲ２内のヌルを選択し（Ｒ１内のシフトされた内容を選択しない）、なぜならば、それらの位置は２Ｎ−１（２２−１＝３）以下であるからである。したがって、これらのレーンの各々はヌル値をＲ０の内容に加算し、その結果をＲ０に格納し戻す。したがって、１番目の行位置はそれの元の値Ａ０をＲ０に維持し、２番目の行位置はＡ０＋Ａ１の値をＲ０に維持し、３番目の行位置はＡ０＋Ａ１＋Ａ２の値をＲ０に維持し、４番目の行位置はＡ０＋Ａ１＋Ａ２＋Ａ３の値をＲ０に維持する。
【０１２７】
対照的に、他の行位置の各々は、それらの位置が２Ｎ−１より大きいままであるため、（Ｒ２内のヌル値ではなく）Ｒ１内のシフトされた内容を選択し、Ｒ１の内容をＲ０内の内容に加算して、その結果をＲ０に格納する。したがって、１番目、２番目および３番目の行位置以外の各行位置は、それの元の内容と内容がシフトされたそれの総計とに基づいた累積合計を保持する。
【０１２８】
３回目の反復の後、プレフィックス合計演算は完了する。行が１６次元であれば、１６個の実行レーンすべてにおいて１６個の異なる位置すべてに一意の合計を累積するのに、Ｒ１レジスタの内容を８つの位置だけシフトするわずかもう１セットの演算だけが必要となるであろう。
【０１２９】
ｃ.行／列最小値発見演算
図１７および図１８ａ〜図１８ｄは、二次元実行レーンアレイおよび対応する二次元シフトレジスタを有する画像プロセッサ上で同じく実行可能な行／列最小値発見演算に関する。行／列最小値発見演算は、統計計算およびブロックマッチングの後処理に特に役立つ。
【０１３０】
図１７を参照すると、単純化のため、単一の行のみが示されている。しかしながら、実際の実施では、列最小値発見演算を、行最小値発見演算を実施するのと同じプロセッサ上で実施することができる。さらに、ある行（または列）の最小値を、（最大ですべての行／列を含む）レジスタアレイにおける任意の数の行（または列）について同時に見つけることができる。加えて、行／列の次元は８つの位置の幅であるよう示されているだけであるが、実際の実施においては、実行レーンアレイおよびシフトレジスタアレイは１６×１６以上であってもよい。
【０１３１】
図１７に見られるように、行最小値発見演算の結果は、同じ行内のすべての値のうちの最小値およびその行内のそれの場所／位置（それのインデックスとも呼ばれる）に対応する。同様に、列最小値発見演算の結果は、同じ列内のすべての値のうちの最小値およびその列内のそれの場所／位置に対応する。先のセクションで詳細に論じた行合計演算およびプレフィックス合計演算と同様に、行／列最小値発見演算は、アレイ端位置間１７０１でシフトをロールすることができる二次元シフトレジスタを使用する。
【０１３２】
図１８ａ〜図１８ｄは行プレフィックス演算のためのマシンレベル演算の実施例を示す。最初に、図１８ａに見られるように、行に、データ値Ａ０〜Ａ７が、各実行レーンのそれぞれのＲ０レジスタ位置にロードされる。また、各行位置のインデックスが各実行レーンのＲ１レジスタ空間にロードされる。
【０１３３】
図１８ｂに示されるマシンレベル演算の１回目の反復において、Ｒ０およびＲ１レジスタ位置の内容は、近隣の実行レーンのレジスタ空間のＲ２およびＲ３レジスタ空間に１単位シフトされる。次いで、Ｒ０レジスタおよびＲ２レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、Ｒ０およびＲ１のレジスタ空間に格納される。つまり、Ｒ０値がＲ２値より小さければ、Ｒ０およびＲ１のレジスタはそれらの元の内容を維持する。一方、Ｒ２値がＲ０値より小さければ、Ｒ２値はＲ０に書き込まれ、Ｒ３値はＲ１に書き込まれる。これには、比較の最小値をＲ０に、それのインデックスをＲ１に保持するという効果がある。
【０１３４】
図１８ｃに示されるマシンレベル演算の２回目の反復において、Ｒ０およびＲ１レジスタ位置の内容は、下流の実行レーンのＲ２およびＲ３レジスタ空間へと２単位シフトされる。したがって、やはり、シフト量は次の反復で２倍になる。次いで、Ｒ０レジスタおよびＲ２レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、Ｒ０およびＲ１のレジスタ空間に格納される。これは、各実行レーンで実行された両方の比較から見られる最小値をＲ０に、それのインデックスをＲ１に保持する効果がある。
【０１３５】
図１８ｄに示されるマシンレベル演算の３回目の反復において、Ｒ０およびＲ１レジスタ位置の内容は、下流の実行レーンのＲ２およびＲ３レジスタ空間へと４単位シフトされる。次いで、Ｒ０レジスタおよびＲ２レジスタのそれぞれの値が各実行レーン内で比較される。比較の最小値およびそれの対応するインデックスは、Ｒ０およびＲ１のレジスタ空間に格納される。これは、各実行レーンで実行されたすべての３つの比較から見られる最小値をＲ０に、それのインデックスをＲ１に保持する効果がある。
【０１３６】
３回目の反復の後、各実行レーンは、行全体の最小値をそれのＲ０レジスタ空間に、それの対応するインデックスをそれのＲ１レジスタ空間に有することになるため、最小値発見演算は完了する（最初に最小値が与えられた行位置は、それ自身の行位置がそれのＲ１レジスタ空間において識別されるのを知ることになる）。仮に行が１６次元である場合、シフトレジスタにおいてＲ０およびＲ１レジスタの内容を下流に８つの位置だけシフトすることに基づくわずかもう１つの演算セットだけが、１６の実行レーンすべてにおいて１６の異なる位置すべてのうちの最小値を与えるために必要となるであろう。
【０１３７】
最大値発見演算も、コアの数学的演算が最小値を見つけるのではなく最大値を見つけることを含むことを除いて、上記と同じ原理を使用して実施することができることに留意されたい。
【０１３８】
ｄ.行列乗算
図１９ａ、図１９ｂおよび図２０は行列乗算に関する。行列乗算は、離散フーリエ変換またはコサイン変換（圧縮およびフィルタ処理の一般的な基本要素である）に対して、およびより大きな行列／乗算演算（一般に画像認識で使用される）を表現する場合に、特に便利である。２つの行列ＡおよびＢの行列乗算は、結果における各行列座標位置について、座標位置の行内の要素と座標位置の列内のそれらの対応する要素との積を合計することによって実行される。図１９ｂは、図１９ａの行列ＡおよびＢの行列倍数について得られた行列Ｘを示す。ここで、結果として得られる行列Ｃ内の２つの座標位置１９０１、１９０２に対する行列ＡおよびＢの関連付けられる部分積項が特別に示されている。
【０１３９】
特に、例えば、図１９ｂの、結果として得られる行列Ｃ内の座標位置ｃ１２に対する、結果として得られる積は、
(a11*b11) + (a12*b21) + (a13*b31) + (a14*b41)
であり、これは、図１９ａの行列Ａの行１９０１の要素が行列Ｂの列１９０２の対応する要素で乗算されるのに対応する。
【０１４０】
同様に、図１９ｂの、結果として得られる行列Ｃにおける座標位置ｃ２２に対する、結果として得られる積は、
(a21*b12) + (a22*b22) + (a23*b32) + (a24*b42)
であり、これは、図１９ａの行列Ａの行１９０３の要素が行列Ｂの列１９０２の対応する要素で乗算されるのに対応する。これら２つの例からわかるように、結果として得られる行列Ｃ内の任意の座標位置ｘ、ｙについての結果は、次のように表すことができる：
Σk = 1 to 4 (ax,k)*(bk,y)
図２０ａ〜図２０ｅは、二次元実行レーンアレイ、および対応する二次元シフトレジスタアレイの独自のシフト利点を使用する行列乗算演算の実施形態を示す。
【０１４１】
図２０ａに見られるように、最初に、２つの行列ＡおよびＢが二次元シフトレジスタアレイにロードされる。例えば、行列Ａの値を二次元シフトレジスタのＲ０レジスタ空間にロードし、行列Ｂの値を二次元シフトレジスタアレイのＲ１レジスタ空間にロードして、各行列座標が、異なる実行レーンの、関連付けられるレジスタ空間に対応するようにすることができる。再び、説明を容易にするために、４×４行列が描かれているが、実際の実装では、より大きな行列を、対応する、より大きな次元のシフトレジスタアレイと乗算することができる。
【０１４２】
図２０ｂに見られるように、回転剪断アルゴリズムシフトが両方の行列に適用され、行方向回転剪断アルゴリズムシフトシーケンスが行列Ａに適用され、列方向回転剪断アルゴリズムシフトシーケンスが行列Ｂに適用される。当技術分野で知られているように、回転剪断アルゴリズムは、シフト量をＮ−１だけ増加させ、ここで、Ｎは行列内の位置である。
【０１４３】
したがって、図２０ｂに見られるように、行列Ａの第１の行は全くシフトされず、行列Ａの第２の行は１単位シフトされ、行列Ａの第３の行は２単位シフトされ、行列Ａの第４の行は３単位シフトされる。同様に、行列Ｂの第１の列は全くシフトされず、行列Ｂの第２の列は１単位シフトされ、行列Ｂの第３の列は２単位シフトされ、行列Ｂの第４の列は３単位シフトされる。ここで、二次元シフトレジスタアレイは、行方向シフトと列方向シフトとの両方について、アレイ端で要素をロールさせることができると理解される。
【０１４４】
なお、二次元シフトレジスタアレイおよび対応する実行レーンアレイが有する、各実行レーンによって実行されるそれぞれのシフト命令が異なる入力オペランドデータを指定することができるという多用途性のため、二次元シフトレジスタアレイは、同時に同じ行列についてすべての実行レーンにわたって同時にシフト命令を実行しながら、異なる行を異なる水平シフト量だけ、および異なる列を異なる垂直シフト量だけシフトすることができる（様々な実施形態において、同じ行内のレーンに対して同じ水平シフト量を指定しなければならず、同じ列内のレーンに対して同じ垂直シフト量を指定しなければならない）。したがって、おそらく、Ａ行列およびＢ行列の両方の剪断は、わずか２サイクルで完了することができる（すなわち、シフトレジスタが単一サイクルで複数のホップシフトを実現できると仮定して、１つの行列に対するすべてのシフトが１サイクルで実行される）。
【０１４５】
図２０ｂに見られるように、行列ＡおよびＢ内のデータが剪断アルゴリズムから再整列されると、各実行レーンはそれの対応する二次元シフトレジスタ空間内のＡ値およびＢ値を乗算する乗算演算が実行される。ここで、Ａ値は、例えばＲ０空間に保持され、Ｂ値はＲ１空間に保持されることを思い出されたい。乗算結果はローカルのＲ２空間に格納される。初期条件としてナル値がＲ３空間にロードされ、Ｒ２での乗算の結果がＲ３の内容に加算される。合計の結果はＲ３に格納し戻される。以下の教示から明らかになるように、Ｒ３は行列乗算演算の過程にわたって部分積項の合計を累積する累積器のロールを引き受ける。
【０１４６】
理解を容易にするために、図２０ｂは、もともと図１９ｂに示された、結果として得られる行列Ｃ内の座標位置ｃ１１およびｃ２２についての１回目の反復後の、結果として得られるＲ３空間内の内容を明示的に示している。ここで、図２０ｂの１回目の反復の後、位置Ｃ１１でのＲ３レジスタ空間は部分積項ａ１１＊ｂ１１を含み、位置Ｃ２２でのＲ３レジスタ空間は部分積項（ａ２１＊ｂ１２）を含む。
【０１４７】
図２０ｃに見られるように、次の反復で、行列Ａデータを含むＲ０レジスタは次いで１単位水平方向にシフトされ、行列Ｂデータを含むＲ１レジスタは１単位垂直方向にシフトされる。次いで、図２０ｂに関して直ぐ上に説明した数学的演算が繰り返される。しかしながら、ここで、各レーンのＲ３レジスタ空間は最初に１回目の反復の部分積項（例えば、位置ｃ１１のＲ３のａ１１＊ｂ１１および位置ｃ２２のＲ３のａ２１＊ｂ１２）を含む。このように、反復の終わりに、レジスタＲ３はこれまでに計算された両方の部分積の累積和を含むことになる。すなわち、位置ｃ１１のＲ３は合計（ａ１１＊ｂ１１）＋（ａ１２＊ｂ２１）を有し、位置ｃ２２のＲ３は合計（ａ２１＊ｂ１２）＋（ａ２２＊ｂ２２）を有することになる。
【０１４８】
図２０ｄおよび図２０ｅで見られるように、両方の行列について単一の単位シフトをさらに２回繰り返した後に積和が続いた後、行列乗算は、各レジスタアレイ位置がそれのローカルＲ３レジスタ空間内に部分積の正しい合計を有して完了する。
【０１４９】
ｅ.二次元離散フーリエ変換（２Ｄ  ＤＦＴ）
図２１は、二次元ＤＦＴ（２Ｄ  ＤＦＴ）を示す。２Ｄ  ＤＦＴは、ノイズの低減および畳み込みの高速化に特に役立つ。図２１に見られるように、２Ｄ  ＤＦＴは、２つの複素項２１０１、２１０２の積の二次元空間にわたる合計として表すことができる。複素項の第１のもの２１０１は、大きさおよび位相が時間および周波数の関数であるフェーザに対応する。実現例において、第１の複素項２１０１は、係数の第１の行列として明示的に計算される。複素項の第２のもの２１０２は、空間領域から周波数領域に変換されている信号に対応する。
【０１５０】
簡単にするために、図２１は、第１の複素項２１０１をRe1 + jIm1として表し、第２の複素項２１０２をRe2 + jIm2として表す。当技術分野で知られているように、(Re1 + jIm1)*(Re2 + jIm2)の実部は(Re1*Re2) - (Im1*Im2)として表すことができ、虚部はj((Re1*Im2) + (Re2*Im1))として表すことができる。２Ｄ空間にわたる２Ｄ  ＤＦＴの合計は、まさに上で詳細に説明した行列乗算と同様に、座標位置の行内の要素の、座標位置の列内の対応する要素による積を、加算する。
【０１５１】
したがって、ＤＦＴ結果の実部は、Re1値のアレイおよびRe2値のアレイ上において行列乗算を実行し、結果として得られるアレイからIm1値およびIm2値のアレイ上における行列乗算の結果を減算することによって、計算することができる。同様に、ＤＦＴ結果の虚部は、Re1値のアレイおよびIm2値のアレイ上において行列乗算を実行し、結果として得られるアレイをRe2値およびIm1値のアレイ上の行列乗算の結果に加算することによって計算できる。
【０１５２】
図２２ａは、ＤＦＴの実部を計算するためのマシン演算を示す。図２２ａに見られるように、Re1値のアレイは二次元シフトレジスタアレイのＲ０レジスタ空間にロードされ、Re2値のアレイは二次元シフトレジスタアレイのＲ１レジスタ空間にロードされ、Im1値のアレイは二次元シフトレジスタアレイのＲ２レジスタ空間にロードされ、Im2値のアレイは二次元シフトレジスタアレイのＲ３レジスタ空間にロードされる。図２２ｂで見られるように、回転剪断アルゴリズムが次いでアレイ値の各々に適用され、Re1値およびIm1値は水平方向に剪断され、Re2値およびIm2値は垂直方向に剪断される。
【０１５３】
図２２ｃで見られるように、Re1*Re2行列乗算およびIm1*Im2行列乗算が次いで実行され、結果はそれぞれＲ０およびＲ２レジスタ空間に保持される。次いで、Ｒ２レジスタ空間の内容がＲ０レジスタ空間から減算され、その減算結果は図２２ｄに見られるようにＲ０レジスタ空間内にＤＦＴ変換の実部を残す。
【０１５４】
一実施形態では、Ｒ０レジスタ空間における実部結果は、Ｒ４レジスタ空間（それが存在する場合）に移動されるか、またはシフトレジスタアレイに結合されるローカルメモリに書き出される。次いで、元のRe1値およびIm1値が（例えば、同じローカルメモリから）Ｒ０およびＲ１レジスタ空間に再び書き戻され、水平方向に剪断されて、図２２ａのレジスタ内容が二次元シフトレジスタアレイに再現される。
【０１５５】
次いで、Re1*Im2行列乗算およびRe2*Im1行列乗算が実行され、結果がそれぞれＲ０およびＲ２レジスタ空間に保持される。すなわち、Ｒ０およびＲ３の内容に対して行列乗算を行い、その結果をＲ０に書き戻し、Ｒ２およびＲ１の内容に対して行列乗算を行い、その内容をＲ２に書き込む。Ｒ０およびＲ２における、結果として得られた行列を、図２２ｅに示す。次いで、Ｒ０レジスタ空間の内容がＲ２レジスタ空間の内容に加算され、Ｒ０に書き戻される。これにより、図２２ｆに示すように、ＤＦＴ変換の虚部がＲ０レジスタ空間に残る。
【０１５６】
ｆ．ＦＦＴバタフライ
当技術分野で知られているように、高速フーリエ変換（ＦＦＴ）は、ＤＦＴに対する、より高速で、より計算量が少ないアプローチである。ＦＦＴは、時間領域または空間領域のデータを周波数領域のデータに迅速に変換するために、特別な効率的なアルゴリズムに依存する。そのようなアルゴリズムの重要な要素はバタフライアルゴリズムである。例示的なバタフライアルゴリズムを図２３に示す。ここで、バタフライ演算は、特定の段が同じ行または列の要素間で発生するスワッピングの量を決定する段によって定義される。当技術分野で知られているように、完全なＦＦＴは、バタフライ演算間で、複数の異なる段のバタフライ演算のスワップされた内容上で数学的演算を実行することを含む。
【０１５７】
図２３は、１段、２段、４段の各バタフライ演算を示している。１段バタフライの場合、隣接する要素がスワップされる。２段バタフライの場合、隣接する対の要素がスワップされる。４段バタフライの場合、４つの隣接要素のグループがスワップされる。二次元ＦＦＴの場合、信号データの第１のアレイ内の要素は、スワップされた信号データ要素に対して実行される数学的演算を用いて、複数のバタフライ段の各々に従ってスワップされる。
【０１５８】
図２４ａは、二次元Ｒ０レジスタ空間に記憶されている信号データのアレイにわたって１段１バタフライを達成するために使用することができるマシンレベルシフト演算を示す。簡単にするために、１行だけを示す。二次元シフトレジスタ内のアレイの複数の（例えばすべての）行または列を、見られる特定の行に従って、同時に処理できることを認識することが適切である。
【０１５９】
ここで、シフトレジスタは、最初に、それの各行にわたってそれのＲ０レジスタ空間においてＡ０からＡ７までロードされる。次いで、シフトレジスタはＲ０レジスタの内容を１単位右にシフトし、各実行レーンはシフトされたばかりのデータをそれのＲ１レジスタ空間におけるそれの位置に格納する。次いで、シフトレジスタはＲ０レジスタの内容を２単位左にシフトする（その結果はＲ０’とラベル付けされる）。次いで、各実行レーンは、選択操作を実行し、それのローカルＲ０内容またはそれのローカルＲ１内容のいずれかを、そのレーンの位置に応じて、Ｒ０に格納する（すなわち、Ｒ０が選択される場合、Ｒ０の内容は変更されないままである）。図２４ａの特定の実施形態では、偶数レーンはＲ０を選択し、奇数レーンはＲ１を選択する。選択後、正しくスワップされた値は（Ｒ０”とラベル付けされる）各実行レーンのＲ０レジスタ空間にある。
【０１６０】
図２４ｂおよび図２４ｃは、２段および４段のバタフライ演算を示す。２段のバタフライの場合、シフトレジスタアレイはＲ０レジスタの内容を２単位右にシフトし、次いで４単位左にシフトすることを除いて、処理は、すぐ前に説明した１段バタフライ演算と同様である。１つおきの偶数レーンおよびそれの最も右隣のレーンは、Ｒ１およびＲ０”の一方から選択し、他の偶数レーンおよびそれらの最も右隣のレーンは、Ｒ１およびＲ０”の他方から選択する。図２５ｃに示す４段バタフライの場合、シフトレジスタアレイは、Ｒ０の内容を４単位右にシフトし、次いで、すべての値を、それらが（Ｒ０’とラベル付けされている）Ｒ０に存在するので、選択する。
【０１６１】
ｇ．ブロックマッチ
図２５はブロックマッチングの図を示す。ブロックマッチングは、動き推定（例えば、ビデオ圧縮に対して）、画像安定化、および画像融合アルゴリズム（例えば、露出融合、および時間ノイズ融合）に特に有用である。ここで、第１のベース（例えば、前の）画像における特定の特徴が、代替の（例えば、後の）画像において探される。図２６の例では、ベース画像に存在するブロックＡＢＣＤが代替画像に見い出される必要がある。
【０１６２】
図２６ａ〜図２６ｄは、二次元実行レーンアレイおよび二次元シフトレジスタアレイを有する画像プロセッサ上でブロックマッチングを実行する方法を示す。ここで、代替画像のピクセルは、二次元シフトレジスタのＲ０レジスタ空間に保持される。探されているベース画像内の特徴の第１のピクセル（例えば「Ａ」）はすべての実行レーンにブロードキャストされ、Ｒ０レジスタ空間の内容と値「Ａ」とにおいて絶対差が取られ、その結果がＲ１に格納される（簡単にするため、代替画像内の他のどのピクセルも、探される特徴の値（Ａ、Ｂ、Ｃ、Ｄ）のいずれも持たないと仮定する。代替画像内のピクセル値がブロードキャストされたピクセル値Ａと一致する（またはほぼ一致する）場合、Ｒ１の結果はゼロ（またはほぼゼロ）になるはずである。Ｒ１における他のすべての結果は、実質的に非ゼロであるはずである。
【０１６３】
図２６ｂを参照すると、代替画像は次いで二次元シフトレジスタ内で１単位シフトされ、探されている特徴内の次のピクセル値「Ｂ」がすべての実行レーンにブロードキャストされ、絶対差が再び取られてＲ１に格納される。ここで、２つの連続するピクセル一致を有した特定の実行レーンアレイ位置２６０１は、Ｒ１において最も低い結果値を有するはずである。この特定の実行レーン位置は、ブロードキャストされているピクセル値の特定の順序が、シフトレジスタアレイのＲ０における代替画像の特定の走査／シフト動作と整列する位置である。
【０１６４】
図２６ｃおよび図２６ｄで見られるように、プロセスは、次の各反復が、次のピクセル値をブロードキャストし、代替の画像データを特定の走査順序でシフトする状態で、継続する。すべての捜し求められる画像ピクセルをブロードキャストし、それに対応して、探される画像のサイズに対応する領域にわたってＲ０内の代替画像をシフトするのに充分な数の反復の後、理想的には、実行レーンアレイ内の１つの位置２６０１だけがすべての反復サイクルで一致を経験したことになる。したがって、この特定のアレイ位置２６０１は、すべての反復が完了した後に、そのＲ１レジスタ空間内にゼロまたはゼロに近い値（または少なくとも他の実行レーンよりも小さい値）を維持することができるはずである。
【０１６５】
上述のようなfindmin演算は、アレイ内のすべての行にわたってＲ１レジスタ空間上で実行される。次いで、各行における最も低い対応する値が、それの行の各位置に保持されることになる。次いで、アレイ内のすべての列にわたってＲ１レジスタ空間に対してfindmin演算が実行される。結果は、すべての反復ごとにベース画像と一致したピクセルを識別するはずであり、次いで、これを使用して、代替アレイにおいて、探される画像の正確な位置を識別できる。
【０１６６】
４．０  ローレベルプログラムコードの構築
図２７は、プログラマーがハイレベル画像処理機能を設計する実行時前開発環境を示し、（図１から図６に関して上記で詳細に説明した仮想ＩＳＡ環境を含むことができる）アプリケーション開発環境は、開発者が最初から前述のすべての特別な演算のいずれか／すべてを書く必要がないように、それらを提供する。
【０１６７】
ここで、開発者は、上で詳細に論じた演算のうちの任意のものを具体的に呼び出すことができ、および／または開発環境はそれに応じてライブラリ２７０１からそれらを自動的に提供する。代替的に、または組み合わせて、そのような演算に対する開発者のニーズが暗示または推測されてもよく（２Ｄ  ＤＦＴの場合の行列乗算など）、開発環境は（例えばコンパイルプロセスの一部として）これらの機能を実行するプログラムコードをライブラリ２７０１から自動的に挿入する。
【０１６８】
したがって、上記の演算またはその代替実施形態を実行するプログラムコードは、よりハイレベルの（たとえば仮想ＩＳＡ）プログラムコードまたはよりローレベルのオブジェクトコードで表現することができる。様々な実施形態では、よりハイレベルの仮想ＩＳＡコードは、ｘ、ｙアドレス座標を有するメモリ読出として処理されるべきデータ値を指定し得るが、オブジェクトコードは、代わりにこれらのデータアクセスを二次元シフトレジスタ演算（上記のシフト演算の任意のものまたは同様の実施形態など）として理解し得る。コンパイラは、開発環境でのｘ，ｙ読出を、指定されたオブジェクトコードである、二次元シフトレジスタの対応するシフトに変換することができる（例えば、開発環境におけるｘ，ｙ座標（＋２，＋２）を有する読出は、オブジェクトコードでは、左への２つの空間のシフトおよび２つの空間のシフトダウンとして実現されてもよい）。環境に応じて、開発者はこれらのレベルの両方（または、例えば、より高いＶＩＳＡレベルだけ）への可視化を有してもよい。さらに他の実施形態では、そのような予め書かれたルーチンが、実行時前ではなく実行時中に（例えばジャストインタイムコンパイラによって）呼び出されてもよい。
【０１６９】
５．０  おわりに
前のセクションから、セクション１．０で上述した仮想環境がコンピュータシステム上でインスタンス化され得ることを認識することが適切である。同様に、セクション２．０で上述したような画像プロセッサが、（例えば、携帯装置のカメラからのデータを処理する携帯装置のシステムオンチップ（ＳＯＣ）の一部として）コンピュータシステム上のハードウェアにおいて具現化されてもよい。
【０１７０】
上述した様々な画像プロセッサアーキテクチャの特徴は、必ずしも従来の意味での画像処理に限定されず、したがって、画像プロセッサを再特徴付けしてもよい（またはしなくてもよい）他のアプリケーションに適用することができることを指摘することが適切である。例えば、実際のカメラ画像の処理とは対照的に、アニメーションの作成および／または生成および／またはレンダリングにおいて上述した様々な画像プロセッサアーキテクチャの特徴のいずれかが使用される場合、画像プロセッサはグラフィックス処理ユニットとして徳経づけられてもよい。さらに、上述した画像プロセッサアーキテクチャの特徴は、ビデオ処理、視覚処理、画像認識および／または機械学習などの他の技術的用途にも適用することができる。このように適用されて、画像プロセッサは、より汎用的なプロセッサ（例えば、コンピューティングシステムのＣＰＵの一部であるか、またはその一部である）と（例えばコプロセッサとして）一体化されてもよく、またはコンピューティングシステム内のスタンドアロンプロセッサであってもよい。
【０１７１】
上述したハードウェア設計の実施形態は、半導体チップ内において、および／または最終的に半導体製造プロセスに向けての回路設計の記述として実施することができる。後者の場合、そのような回路記述は、（例えばＶＨＤＬもしくはVerilog）レジスタ転送レベル（ＲＴＬ）回路記述、ゲートレベル回路記述、トランジスタレベル回路記述もしくはマスク記述、またはそれらの様々な組み合わせの形態をとってもよい。回路記述は、典型的には、コンピュータ可読記憶媒体（例えばＣＤ−ＲＯＭまたは他のタイプの記憶技術）上に実施される。
【０１７２】
先のセクションから、上記の画像プロセッサは、（例えば、ハンドヘルド装置のカメラからのデータを処理するハンドヘルド装置のシステムオンチップ（ＳＯＣ）の一部として）コンピュータシステム上のハードウェアで実施できることを認識することに関係する。画像プロセッサがハードウェア回路として実施される場合、画像プロセッサによって処理される画像データはカメラから直接受信されてもよいことに留意されたい。ここで、画像プロセッサは、別体のカメラの一部であってもよいし、一体化されたカメラを有するコンピューティングシステムの一部であってもよい。後者の場合、画像データは、カメラから直接、またはコンピューティングシステムのシステムメモリから受信することができる（例えば、カメラは、その画像データを画像プロセッサではなくシステムメモリに送信する）。先のセクションで説明した機能の多くは、（アニメーションをレンダリングする）グラフィックスプロセッサユニットにも適用可能であることにも留意されたい。
【０１７３】
図２８は、コンピューティングシステムの例示的な図である。以下に説明するコンピューティングシステムのコンポーネントの多くは、一体化されたカメラおよび関連する画像プロセッサ（例えば、スマートフォンまたはタブレットコンピュータなどのハンドヘルドデバイス）を有するコンピューティングシステムに適用可能である。当業者は、２つの間の範囲を容易に定めることができるであろう。
【０１７４】
図２８に見られるように、基本的なコンピューティングシステムは、中央処理ユニット２８０１（例えば、マルチコアプロセッサまたはアプリケーションプロセッサ上に配置された複数の汎用処理コア２８１５＿１〜２８１５＿Ｎおよびメインメモリコントローラ２８１７を含み得る）、システムメモリ２８０２、ディスプレイ２８０３（例えばタッチスクリーン、フラットパネル）、ローカル有線ポイントツーポイントリンク（例えばＵＳＢ）インタフェース２８０４、様々なネットワークＩ／Ｏ機能２８０５（イーサネット（登録商標）インタフェースおよび／またはセルラーモデムサブシステムなど）、無線ローカルエリアネットワーク（例えばＷｉＦｉ）インタフェース２８０６、ワイヤレスポイントツーポイントリンク（例えばブルートゥース（登録商標））インタフェース２８０７およびグローバルポジショニングシステムインタフェース２８０８、様々なセンサ２８０９＿１〜２８０９＿Ｎ、１つ以上のカメラ２８１０、バッテリ２８１１、電力管理制御ユニット２８２４、スピーカおよびマイクロホン２８１３、ならびに音声コーダ／デコーダ２８１４を含んでもよい。
【０１７５】
アプリケーションプロセッサまたはマルチコアプロセッサ２８５０は、そのＣＰＵ２８０１内における１つ以上の汎用処理コア２８１５、１つ以上のグラフィカル処理ユニット２８１６、メモリ管理機能２８１７（例えばメモリコントローラ）、Ｉ／Ｏ制御機能２８１８および画像処理ユニット２８１９を含んでもよい。汎用処理コア２８１５は、典型的には、コンピューティングシステムのオペレーティングシステムおよびアプリケーションソフトウェアを実行する。グラフィックス処理ユニット２８１６は、典型的には、ディスプレイ２８０３上に提示されるグラフィックス情報を生成するために、グラフィックス集中型機能を実行する。メモリ制御機能２８１７は、システムメモリ２８０２とインタフェースして、システムメモリ２８０２との間でデータの書込／読出を行う。電力管理制御ユニット２８２４は、システム２８００の電力消費を全体的に制御する。
【０１７６】
画像処理ユニット２８１９は、先のセクションで説明した画像処理ユニットの実施形態のいずれかに従って実現することができる。代替的にまたは組み合わせて、ＩＰＵ２８１９は、ＧＰＵ２８１６およびＣＰＵ２８０１のいずれかまたは両方にそのコプロセッサとして結合されてもよい。さらに、様々な実施形態では、ＧＰＵ２８１６は、上で説明した画像プロセッサの特徴のいずれかを用いて実現することができる。
【０１７７】
タッチスクリーンディスプレイ２８０３、通信インタフェース２８０４〜２８０７、ＧＰＳインタフェース２８０８、センサ２８０９、カメラ２８１０、およびスピーカ／マイクコーデック２８１３，２８１４の各々はすべて、適切な場合には、一体化された周辺装置（例えば１つ以上のカメラ２８１０）も含むコンピューティングシステム全体に対して様々な形態のＩ／Ｏ（入力および／または出力）として見ることができる。実現例によっては、これらのＩ／Ｏコンポーネントの様々なものは、アプリケーションプロセッサ／マルチコアプロセッサ２８５０上に統合されてもよく、またはアプリケーションプロセッサ／マルチコアプロセッサ２８５０のダイから離れて、またはそのパッケージ外に配置されてもよい。
【０１７８】
一実施形態では、１つ以上のカメラ２８１０は、カメラとその視野内の対象との間の深度を測定することができる深度カメラを含む。アプリケーションプロセッサまたは他のプロセッサの汎用ＣＰＵコア（もしくはプログラムコードを実行するために命令実行パイプラインを有する他の機能ブロック）上で実行されるアプリケーションソフトウェア、オペレーティングシステムソフトウェア、デバイスドライバソフトウェアおよび／またはファームウェアは、上記の機能のいずれかを実行してもよい。
【０１７９】
本発明の実施形態は、上述したような様々なプロセスを含むことができる。これらのプロセスは、機械実行可能命令で実施されてもよい。これらの命令は、汎用または特殊目的のプロセッサに特定のプロセスを実行させるために使用できる。代替的に、これらのプロセスは、プロセスを実行するためのハードワイヤード論理を含む特定のハードウェアコンポーネントによって、またはプログラミングされたコンピュータコンポーネントとカスタムハードウェアコンポーネントとの任意の組み合わせによって実行されてもよい。
【０１８０】
本発明の要素はまた、機械実行可能命令を記憶するための機械可読媒体として提供されてもよい。機械可読媒体は、フロッピー（登録商標）ディスク、光ディスク、ＣＤ−ＲＯＭ、および光磁気ディスク、フラッシュメモリ、ＲＯＭ、ＲＡＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、磁気もしくは光カード、伝搬媒体、または電子命令を記憶するのに適した他のタイプの媒体／機械可読媒体を含むが、それらに限定はされない。例えば、要素は、搬送波または通信リンク（例えばモデムもしくはネットワーク接続）を介する他の伝搬媒体で実施されたデータ信号によって、遠隔のコンピュータ（例えばサーバ）から要求側コンピュータ（例えばクライアント）に転送されるコンピュータプログラムとしてダウンロードすることができる。
【０１８１】
前述の明細書では、特定の例示的な実施形態を説明した。しかしながら、特許請求の範囲に記載される本発明のより広い精神および範囲から逸脱することなく、様々な修正および変更がなされ得ることは明らかであろう。したがって、明細書および図面は、限定的ではなく例示的なものとみなされるべきである。
【図１】
2019519863.tif 000003
【図２ａ】
2019519863.tif 000004
【図２ｂ】
2019519863.tif 000005
【図３】
2019519863.tif 000006
【図４ａ】
2019519863.tif 000007
【図４ｂ】
2019519863.tif 000008
【図４ｃ】
2019519863.tif 000009
【図５ａ】
2019519863.tif 000010
【図５ｂ】
2019519863.tif 000011
【図６】
2019519863.tif 000012
【図７】
2019519863.tif 000013
【図８ａ】
2019519863.tif 000014
【図８ｂ】
2019519863.tif 000015
【図８ｃ】
2019519863.tif 000016
【図８ｄ】
2019519863.tif 000017
【図８ｅ】
2019519863.tif 000018
【図９ａ】
2019519863.tif 000019
【図９ｂ】
2019519863.tif 000020
【図１０】
2019519863.tif 000021
【図１１ａ】
2019519863.tif 000022
【図１１ｂ】
2019519863.tif 000023
【図１１ｃ】
2019519863.tif 000024
【図１１ｄ】
2019519863.tif 000025
【図１１ｅ】
2019519863.tif 000026
【図１１ｆ】
2019519863.tif 000027
【図１１ｇ】
2019519863.tif 000028
【図１１ｈ】
2019519863.tif 000029
【図１１ｉ】
2019519863.tif 000030
【図１１ｊ】
2019519863.tif 000031
【図１１ｋ】
2019519863.tif 000032
【図１２】
2019519863.tif 000033
【図１３】
2019519863.tif 000034
【図１４ａ】
2019519863.tif 000035
【図１４ｂ】
2019519863.tif 000036
【図１４ｃ】
2019519863.tif 000037
【図１４ｄ】
2019519863.tif 000038
【図１５】
2019519863.tif 000039
【図１６ａ】
2019519863.tif 000040
【図１６ｂ】
2019519863.tif 000041
【図１６ｃ】
2019519863.tif 000042
【図１６ｄ】
2019519863.tif 000043
【図１７】
2019519863.tif 000044
【図１８ａ】
2019519863.tif 000045
【図１８ｂ】
2019519863.tif 000046
【図１８ｃ】
2019519863.tif 000047
【図１８ｄ】
2019519863.tif 000048
【図１９ａ】
2019519863.tif 000049
【図１９ｂ】
2019519863.tif 000050
【図２０ａ】
2019519863.tif 000051
【図２０ｂ】
2019519863.tif 000052
【図２０ｃ】
2019519863.tif 000053
【図２０ｄ】
2019519863.tif 000054
【図２０ｅ】
2019519863.tif 000055
【図２１】
2019519863.tif 000056
【図２２ａ】
2019519863.tif 000057
【図２２ｂ】
2019519863.tif 000058
【図２２ｃ】
2019519863.tif 000059
【図２２ｄ】
2019519863.tif 000060
【図２２ｅ】
2019519863.tif 000061
【図２２ｆ】
2019519863.tif 000062
【図２３】
2019519863.tif 000063
【図２４ａ】
2019519863.tif 000064
【図２４ｂ】
2019519863.tif 000065
【図２４ｃ】
2019519863.tif 000066
【図２５】
2019519863.tif 000067
【図２６ａ】
2019519863.tif 000068
【図２６ｂ】
2019519863.tif 000069
【図２６ｃ】
2019519863.tif 000070
【図２６ｄ】
2019519863.tif 000071
【図２７】
2019519863.tif 000072
【図２８】
2019519863.tif 000073
【手続補正書】
【提出日】平成31年3月8日(2019.3.8)
【手続補正１】
【補正対象書類名】特許請求の範囲
【補正対象項目名】全文
【補正方法】変更
【補正の内容】
【特許請求の範囲】
【請求項１】
プロセッサであって、
二次元シフトレジスタアレイと、
処理要素の二次元アレイとを備え、前記二次元シフトレジスタアレイの各シフトレジスタは前記処理要素のうちの１つに専用であり、
前記プロセッサは、前記二次元シフトレジスタアレイの行または列に格納されるすべての値を合計する累積演算を実行するように命令を実行するよう構成され、前記命令は、前記プロセッサに、前記二次元シフトレジスタアレイ内のデータの行または列に格納される値に対して複数の反復を繰り返し実行させ、各反復は演算を含み、前記演算は、
１つ以上の処理要素の各処理要素が、更新された累積結果を、（１）前の累積結果と（２）前記処理要素に専用のシフトレジスタ内の値との合計として計算することと、
前記二次元シフトレジスタアレイ内のデータを、前の反復に対して２倍になるシフト量で、前記行または前記列に沿って特定の方向にシフトすることとを、
前記行または列のすべてのデータが前記更新された累積結果に加算されるまで行なうことを含む、プロセッサ。
【請求項２】
前記二次元シフトレジスタアレイは、複数のシフトレジスタ面を有し、各シフトレジスタ面は別途の二次元シフトレジスタアレイを含み、
前記命令は、各処理要素に、前記更新された累積結果を、各反復間でシフトされる前記シフトレジスタ面とは異なるシフトレジスタ面に専用のシフトレジスタに格納させる、請求項１に記載のプロセッサ。
【請求項３】
前記二次元シフトレジスタアレイは、前記二次元シフトレジスタアレイの端部から前記二次元シフトレジスタアレイの反対側の端部にデータをラップするように構成される、請求項１または２に記載のプロセッサ。
【請求項４】
前記二次元シフトレジスタアレイは、単一の命令または単一のサイクルで、複数のホップでデータをシフトするように構成される、請求項１〜３のいずれか１項に記載のプロセッサ。
【請求項５】
前記命令は、前記プロセッサに、前記二次元シフトレジスタアレイの複数の行または複数の列上で累積演算を並列で実行させる、請求項１〜４のいずれか１項に記載のプロセッサ。
【請求項６】
前記処理要素の二次元アレイは少なくとも８×８の処理要素のアレイを含む、請求項１〜５のいずれか１項に記載のプロセッサ。
【請求項７】
プロセッサであって、
処理要素の二次元アレイを備え、各処理要素は、前記処理要素の二次元アレイの第１の次元に沿ってそれぞれの位置に関連付けられ、前記プロセッサはさらに、
二次元シフトレジスタアレイを備え、前記二次元シフトレジスタアレイは複数のシフトレジスタ面を有し、各シフトレジスタ面は別途の二次元シフトレジスタアレイを含み、前記二次元シフトレジスタアレイの各シフトレジスタは前記処理要素のうちの１つに専用であり、
前記プロセッサは、第１の値のシーケンスから第２の値のシーケンスを生成するプレフィックス演算を実行するように命令を実行するよう構成され、前記第２の値のシーケンスにおける各位置における各結果値は（ｉ）前記第１の値のシーケンス内の対応する位置における初期値と（ｉｉ）前記第１の値のシーケンス内の前記対応する位置の前に生ずるすべての値との合計であり、
前記複数のシフトレジスタ面のうちの第１のシフトレジスタ面および第２のシフトレジスタ面は、最初に、前記第１の値のシーケンスのデータを有し、
前記命令は、前記プロセッサに、０からＭまでの複数の反復を実行させ、各反復Ｎは、演算を含み、前記演算は、
第２のシフトレジスタ面内のデータを前記第１の値のシーケンスに沿って特定の方向に２Ｎのシフト量だけシフトすることと、
各処理要素が、（１）前記第１のシフトレジスタ面における前記処理要素に専用のシフトレジスタ内の第１の値と、（２）前記第２のシフトレジスタ面における前記処理要素に専用のシフトレジスタ内の第２の値との合計を、前記処理要素の位置が２Ｎ−１よりも大きい場合およびその場合に限って計算することとを含む、プロセッサ。
【請求項８】
前記二次元シフトレジスタアレイは、前記二次元シフトレジスタアレイの端部から前記二次元シフトレジスタアレイの反対側の端部にデータをラップするように構成される、請求項７に記載のプロセッサ。
【請求項９】
前記二次元シフトレジスタアレイは、単一の命令または単一のサイクルで、複数のホップでデータをシフトするように構成される、請求項７または８に記載のプロセッサ。
【請求項１０】
前記命令は、前記プロセッサに、前記二次元シフトレジスタアレイの複数の行または複数の列上でプレフィックス演算を並列で実行させる、請求項７〜９のいずれか１項に記載のプロセッサ。
【請求項１１】
前記処理要素の二次元アレイは少なくとも８×８の処理要素のアレイを含む、請求項７〜１０のいずれか１項に記載のプロセッサ。
【請求項１２】
プロセッサであって、
処理要素の二次元アレイを備え、各処理要素は、前記処理要素の二次元アレイの第１の次元に沿ってそれぞれの位置に関連付けられ、前記プロセッサはさらに、
二次元シフトレジスタアレイを備え、前記二次元シフトレジスタアレイは複数のシフトレジスタ面を有し、各シフトレジスタ面は別途の二次元シフトレジスタアレイを含み、前記二次元シフトレジスタアレイの各シフトレジスタは前記処理要素のうちの１つに専用であり、
前記プロセッサは、前記二次元シフトレジスタアレイの行または列に格納される第１の値のシーケンスから、前記第１の値のシーケンスのどの値が前記第１の値のシーケンスの他のすべての値よりも小さいかを計算する最小値発見（find-min）演算を実行するように命令を実行するよう構成され、
前記複数のシフトレジスタ面のうちの第１のシフトレジスタ面は最初に前記第１の値のシーケンスのデータを有し、前記複数のシフトレジスタ面のうちの第２のシフトレジスタ面は最初に前記第１の値のシーケンス内の各値のそれぞれのインデックス値を有し、
前記複数のシフトレジスタ面のうちの第３のシフトレジスタ面は、最初に、１つの位置だけシフトされた前記第１の値のシーケンスのデータを有し、前記複数のシフトレジスタ面のうちの第４のシフトレジスタ面は、最初に、前記第２のシフトレジスタ面における各値のそれぞれのインデックス値を有し、
前記命令は、前記プロセッサに、複数の反復を実行させ、各反復は演算を含み、前記演算は、
（ｉ）前記処理要素に属する前記第１のシフトレジスタ面上のシフトレジスタと（ｉｉ）前記処理要素に属する前記第３のシフトレジスタ面上のシフトレジスタとの間で、より小さい値を計算することと、
前記より小さい値を前記第１のシフトレジスタ面上のシフトレジスタに格納し、対応するインデックス値を前記第２のシフトレジスタ面上のシフトレジスタに格納することと、
前記二次元シフトレジスタアレイ内のデータを、前の反復に対して２倍になるシフト量で、前記行または列に沿って特定の方向にシフトすることとを、
前記二次元シフトレジスタアレイの前記行または前記列のすべてのデータが処理されるまで行うことを含む、プロセッサ。
【請求項１３】
前記演算はさらに、
ブロックマッチングプロセスを実行して、第１のシフトレジスタ面に格納される第１のブロックについて、第２のシフトレジスタ面に格納されるマッチングブロックの位置を識別することをさらに含み、前記第１のブロックは複数のデータ値を含み、前記第１のブロック内の前記複数のデータ値の各データ値に対して演算を実行することを含み、前記演算は、
前記データ値を前記処理要素の各々にブロードキャストすること、
各処理要素が、（ｉ）前記データ値と（ｉｉ）前記処理要素に属する前記第２のシフトレジスタ面のシフトレジスタ内のデータとの間の差を計算すること、および
前記第１のブロックを有する前記第１のシフトレジスタ面を特定の方向に１単位シフトすることであり、
前記最小値発見演算を実行することは、前記第２のシフトレジスタ面に格納されているマッチングブロックの位置を識別する、請求項１２に記載のプロセッサ。
【請求項１４】
前記二次元シフトレジスタアレイは、前記二次元シフトレジスタアレイの端部から前記二次元シフトレジスタアレイの反対側の端部にデータをラップするように構成される、請求項１２または１３に記載のプロセッサ。
【請求項１５】
前記二次元シフトレジスタアレイは、単一の命令または単一のサイクルで、複数のホップでデータをシフトするように構成される、請求項１２〜１４のいずれか１項に記載のプロセッサ。
【請求項１６】
前記命令は、前記プロセッサに、前記二次元シフトレジスタアレイの複数の行または複数の列上で最小値発見演算を並列で実行させる、請求項１２〜１５のいずれか１項に記載のプロセッサ。
【請求項１７】
前記処理要素の二次元アレイは少なくとも８×８の処理要素のアレイを含む、請求項１２〜１６のいずれか１項に記載のプロセッサ。
【国際調査報告】
2019519863.tif 000074
2019519863.tif 000075
2019519863.tif 000076