説明

演算ユニット及び画像フィルタリング装置

【課題】フィルタ処理を高速に行うことができるプロセッサを提供することにある。
【解決手段】本発明に係る演算ユニットは、フィルタ処理を行うための演算器201を具備する。その演算器201へのデータ供給はフリップフロップで構成された内部レジスタ100にて行う。内部レジスタ100から読み出したデータはシフトレジスタ200へ出力され、サイクル毎にデータを演算器201へ供給する。また、動きベクトルに応じてフィルタの演算方向を変更する機構を具備し、同一命令で水平フィルタや垂直フィルタを行うことにより、分岐命令等による性能低下を防止する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は画像のフィルタリング処理を行う命令、回路を含むプロセッサに関する。
【背景技術】
【0002】
動画像では、フレーム中の物体が動いたり、カメラがパンをしたりすることにより、フレーム間で動きがあり、前のフレームと現在のフレームとは全く同じわけではない。しかし、前後の画像での相関は大きい。
【0003】
動き補償とは、フレーム間予測において、前後のフレームの画像と比較してどの方向へどの程度動いているかというベクトルデータを使用し、画像の解析を行う技術を言う。動き補償により、画像データの圧縮度を高めることに成功している。
【0004】
多くの画像フレーム符号化方式では画像フレームを所定のブロックに分割し処理を行う。このブロックサイズを小さくすれば詳細な予測ができる。一方でブロック数が増加し、これにより、動きベクトル情報自体の数が増え符号量が増える傾向にある。結果大きな処理能力がハードウェアに要求される。
【0005】
また、画像を低ビット・レートで符号化する場合、なんらのフィルタリング処理も行わないと復号画像にブロック歪みが生じたままフレームメモリに格納される。この歪みが生じた画像を参照し次のフレームを復号すると、更に画質の劣化が伝播するという問題がある。この、画質劣化の伝播防止のために、フィルタリング処理がなされブロック歪みの発生を防止することは必要不可欠である。しかし、フィルタリング処理の解決にも大きな処理能力がハードウェアに要求される。
【0006】
従来、画像のフィルタリング処理を行う場合、フィルタを実施するタップ数のクロック周期(サイクル)が必要であり、クロック周期ごとにデータをメモリから供給する必要がある。さらに、動きベクトルによる探査位置により水平フィルタと垂直フィルタが変更され、その都度フィルタ処理の方向を判定し、フィルタ処理にあったプログラムへ分岐させる必要があった。この際、サイクルごとに画素データをメモリから読み出していては読み出しサイクル数を必要以上に消費してしまい、処理性能が低下する。
【0007】
特開2002−8025号公報(以下特許文献1)では、メモリからのデータリードを削減し、入力バッファ等でデータを蓄積し演算器に供給する方法を提示する。
【特許文献1】特開2002−8025号公報
【発明の開示】
【発明が解決しようとする課題】
【0008】
しかし、画像のフィルタリング処理時に画素データをメモリから読み出していたのでは読み出しサイクル数を必要以上に消費してしまい処理性能が低下する。
【0009】
また、動きベクトルに応じて水平フィルタと垂直フィルタを変更する必要があるが、画像イメージの読み出し方も変更する必要がある。そのため分岐処理を要することとなる。
【0010】
近年のプロセッサでは分岐予測により処理性能の低下を防いではいるが、画像処理の場合分岐予測は難しいため性能低下は著しい。
【0011】
更に、回路実装上の問題から、これらのフィルタリング処理に対して、十分な内部レジスタを用意できないことも考えられる。
【0012】
本発明は、上記問題を解決するためになされたもので、その目的はフィルタ処理を高速に行うことができる演算ユニット及び画像フィルタリング装置を提供することにある。
【0013】
本発明の前記並びにその他の目的と新規な特徴は、本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【0014】
本願において開示される発明のうち、代表的なものの概要を簡単に説明すれば、次の通りである。
【0015】
本発明に関わる演算ユニットは、第1の周期で一の特定処理を行う第1の演算処理と、サイクルの異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、命令デコーダを含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定できることを特徴とする。
【0016】
この演算ユニットは更に前記SIMD演算器はシフトレジスタを含み、投入された命令コードに従い命令デコーダはシフトレジスタにデータを投入することを特徴としてもよい。
【0017】
また、この演算ユニットは、更に内部レジスタとインデックス生成器を含み、命令デコーダからの入力により内部レジスタのアドレスを出力し、このアドレスを参照して内部レジスタのデータをシフトレジスタに投入しても良い。
【0018】
また、この演算ユニットの第1の周期は所定数のクロック周期より構成され、第1の周期ごとに第1の演算結果を出力し、第1の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトしても良い。この演算ユニットは、第1の演算結果を内部レジスタに格納してもよい。
【0019】
さらにこの演算ユニットの第2の周期は所定数のクロック周期より構成され、第2の周期ごとに第2の演算結果を出力し、第2の周期中の各クロック周期の終了後にシフトレジスタ中のデータをシフトしても良い。この演算ユニットが第2の演算結果を内部レジスタに格納しても良い。
【0020】
この演算ユニットは第2の演算処理に第1の演算結果を前記データとして投入してもよい。
【0021】
本発明に関わる画像フィルタリング装置は、シフトレジスタと、第1の周期で一の特定処理を行う第1の演算処理と第1の周期と異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、命令デコーダと、内部レジスタと、インデックス生成器と、動きベクトルレジスタを含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定し、投入された命令コードに従い命令デコーダは動きベクトルレジスタに動きベクトルデータを蓄積し、命令デコーダの出力及び動きベクトルデータを参照してインデックス生成器は内部レジスタのアドレスを出力し、アドレスを参照して内部レジスタのデータをシフトレジスタに投入し、SIMD演算器が演算する。
【0022】
本発明に関わる画像フィルタリング装置は、シフトレジスタと、第1の周期で一の特定処理を行う第1の演算処理と第1の周期と異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、複数の動きベクトルデータが蓄積された動きベクトルレジスタと、命令デコーダと、内部レジスタと、インデックス生成器を含み、投入された命令コードに従い命令デコーダは複数の演算器のうち動作する数を規定し、命令デコーダからの出力に従い動きベクトルレジスタは適切な動きベクトルデータをインデックス生成器に出力し、命令デコーダの出力及び前記動きベクトルデータを参照してインデックス生成器は内部レジスタのアドレスを出力し、アドレスを参照して内部レジスタのデータをシフトレジスタに投入し、SIMD演算器が演算する。
【発明の効果】
【0023】
本願において開示される発明のうち、代表的なものによって得られる効果を簡単に説明すれば以下の通りである。
【0024】
本発明にかかわる演算ユニットおよび画像フィルタリング装置は、ハードウェアの構成に関わらず、内部レジスタに画像データを蓄積し、そのデータを演算器に投入することで効率よく処理を実行し、メモリへのデータアクセス削減を図ることができる。
【0025】
また、動きベクトルを考慮したフィルタ処理を行うことで分岐処理をなくし、命令キャッシュへのアクセスを削減する演算ユニットおよび画像フィルタリング装置を提供することができる。
【0026】
更には、メモリへのデータアクセスや命令キャッシュへの命令フェッチアクセスが削減されることで、消費電力を抑えることが可能になり、環境に配慮した演算ユニットおよび画像フィルタリング装置を提供することが可能となる。
【発明を実施するための最良の形態】
【0027】
本発明の実施例について、図面を参照して説明する。
【0028】
(想定する処理について)
まず本発明が想定する動き補償予測処理について説明する。
【0029】
動き補償予測を行う際には参照ピクチャの画素値から整数画素以下の画素精度の信号を補間によって生成するのが一般的である。MPEG−2やMPEG−4では1/2画素精度までの、H.264/AVCでは1/4画素精度までの動き補償が可能なように設計されている。
【0030】
H.264/AVCにおいては1/2単位画素(ハーフペル)を導出する際と、1/4単位画素(クウォータペル)を導出する際とでは導出手順が2段階に分かれる。まず、最初に参照画像のデータから1/2単位画素のデータを計算式で求める(6タップFIRフィルタ処理)。そして、参照画像及び6タップで導出した1/2単位画素から1/4単位画素及び3/4単位画素を導出する(2タップフィルタ処理)。
【0031】
図1は整数画素から6タップFIRフィルタ処理および2タップフィルタ処理の処理内容を表す概念図である。この図では○で表されたA1が導出の対象となる1/2画素であり、□で表されたB1、B2、B3、B4、B5、B6が参照画素(整数画素)である。
【0032】
ここで、1/2単位画素A1を導出する際には前後する整数画素B1、B2、B3、B4、B5、B6の画素から以下の数式を用いて計算する。
【0033】
A1=(B1−5×B2+20×B3+20×B4−5×B5+B6+16)/32
…(式1)
また、2タップ処理では、△で表された1/4単位画素C1を以下のように導出する。
【0034】
C1=(A1+B3+1)/2 …(式2)
以上により、横8画素×縦8画素のデータをクウォータペル単位で取り扱う際には、参照画像として横14画素×縦14画素のデータが処理に必要となる。本発明においてもこれは同様である。
【0035】
ここで、14画素分のデータを一括してメモリに記憶し、処理できれば問題は無いのだが、14画素分(本発明では1画素1バイトを想定)の演算器を用意するのは現実には回路実装規模上の問題から困難な場合が多い。
【0036】
図2は横方向の6タップFIRフィルタ処理により、(−1/2、−1)から(7+1/2、8)までの横9画素、縦10画素の画像を求めるフィルタ処理を示している。
【0037】
前述の通り、画面全体の動き補償に際しては、横14画素×縦14画素のデータを参照画像600として用意する必要がある。しかし、実際には、これらの領域全てを一度のデータ読み出しで取り扱うようにすると、データバス幅等の兼ね合いで実装上問題を生じる場合もある。これに対し、この横方向の6タップFIRフィルタ処理に際しては、(−3、−1)、(10、−1)、(10、8)、(−3、8)で囲まれる横14画素×縦10画素を参照する。従って、これらの画像を内部のレジスタ等にいったん読み込む。
【0038】
8個の演算器を用いてこの横9画素、縦10画素の横方向の1/2単位画素(ハーフペル)画像の計算を行う際に、(0、0)を基点として、(−1/2、−1)、(6+1/2、−1)、(6+1/2、6)、(−1/2、6)で囲まれる画像500(点線で囲まれた範囲)を求める。画像500の導出のためには、入力画像600の(−3、−1)から(9、−1)、(9、6)、(−3、6)で囲まれた画像範囲の整数画素のデータを用いる。つまり、座標(−1/2、−1)は(−3、−1)から(3、−1)までの6画素を式1に代入して算出する。また、(1/2、−1)から(7+1/2、−1)、(7+1/2、6)、(1/2、6)で囲まれた画像範囲501(一点鎖線で囲われた範囲)を求めるためにも、横画素の合計8画素を1ラインとして算出する。
【0039】
同様に、(−1/2、0)を基点とする横8画素×縦8画素の画像502(実線で囲われた範囲)、(1/2、0)を基点とする横8画素×縦8画素の画像503(2点鎖線で囲われた範囲)、(−1/2、1)を基点とする横8画素×縦8画素の画像504(細点線で囲われた範囲)、(1/2、1)を基点とする横8画素×縦8画素の画像505(細実線で囲われた範囲)でも同様の処理を行う。
【0040】
これらの結果から、横9画素、縦10画素の横方向の1/2単位画素(ハーフペル)のデータを求めることができる。
【0041】
図3は縦方向の6タップFIRフィルタ処理を説明するための図面である。(−1、−1/2)から横10画素、縦9画素の画像を求めるフィルタ処理を示している。図2同様に(0、0)を基点とした場合、(−1、−1/2)からの横8画素、縦8画素の画像510(点線で囲われた範囲)を求めるためには、入力画像600の(−1、−3)から(6、−3)、(6、9)、(−1、9)で囲われた画像範囲の整数画素のデータを用いる。すなわち、縦方向においても(−1、−1/2)導出時には(−1、−3)、(−1、−2)、(−1、−1)、(−1、0)、(−1、1)、(−1、2)の6画素分のデータを式1に対して代入する。この(−1、1/2)を基点とする横10画素、縦9画素の画像511(実線で囲われた箇所)を導出するために、縦画素は合計で9画素を1ラインとして算出され、この1ラインのデータはプロセッサ内部のレジスタに格納される。
【0042】
併せて、(0、−1/2)を基点とする画像512(一点鎖線で囲われた箇所)、(0、1/2)を基点とする画像513(二点鎖線で囲われた箇所)、(1、−1/2)を基点とする画像514(細線で囲われた範囲)、(1、1/2)を基点とする画像515(細破線で囲われた範囲)も同様の処理で求め、結果として横9画素、縦10画素の縦方向の1/2単位画素のデータを内部のレジスタに保持する。
【0043】
なお、本例では、後述する斜め方向の1/2単位画素(ハーフペル)をこの縦方向の1/2単位画素(ハーフペル)を用いて導出することから、(−3、−1/2)から(10、−1/2)、(10、7+1/2)、(−3、7+1/2)の画像601を導出している。
【0044】
これらの導出結果を元に、斜め方向に対する画素を算出する。図4はこの斜め方向の6タップFIRフィルタ処理を説明するための図である。この斜め方向の画素を求める場合も6タップFIRフィルタ処理を行うが、図2の横方向のフィルタ処理結果もしくは図3の縦方向のフィルタ処理結果を用いて算出する。
【0045】
斜め方向におけるフィルタ処理で求める画像は(−1/2、−1/2)を基点とする画像520(破線で囲われた箇所)、(1/2、−1/2)を基点とする画像521(細破線で囲われた箇所)、(−1/2、1/2)を基点とする画像522(一点鎖線で囲われた範囲)、(1/2、1/2)を基点とする画像523(実線で囲われた範囲)である。これを合成して斜め方向の横9画素、縦9画素の画像を作成する。この際、縦方向のフィルタ処理結果から求めるために必要な参照画素データは(−3、−1/2)から(10、7+1/2)の画像601である。この画像601に対して、横方向の6タップFIRフィルタ処理を行うことで、斜め方向の横9画素、縦9画素のフィルタ画像を求めることができ、この結果をプロセッサ内部のレジスタに保管する。
【0046】
算出した縦、横、斜め方向の画像データを用いて、1/4単位画素(クウォータペル)の画像を求める。1/4単位画素は式2を用いて算出する。そして動きベクトルによって使用する画像データが決定される。
【0047】
図5は横4画素、縦4画素の結果を得る2回目のフィルタ処理を示す。1回目のフィルタ処理は6タップFIRフィルタ処理であるのに対し、2回目のフィルタ処理は2タップフィルタ処理である。そのため、4×4画素の画像を求めるために9×9画素のデータを使用する。内部レジスタは9バイト幅のデータを1エントリに格納し、計9エントリの内部レジスタに参照画像610を格納する。図5に示す基準となる座標から(1/2、1/2)の位置の画像を得る方法は、参照画像610でエントリ2から5までの画像データ700を使用し、横方向の6タップフィルタを行い、ハーフペル画像611を生成する。また、全てのエントリを使用して縦方向の6タップフィルタを行うが、ハーフペル画像612は左からのバイト位置で3バイト目から6バイト目のみを使用する。ハーフペル画像611、612を使用し、2回目のフィルタ処理である2タップフィルタを行い、クォータペル画像613を生成する。このように内部レジスタへ1ラインのデータを保存しているため、読み出しと演算を容易に実行することが可能となる。
【0048】
本発明はこの一連の処理を限られたハードウェア資源を用いて効率よく行うことを考えているものである。
【0049】
(第1の実施の形態)
図6は本発明に関わる演算ユニット150の基本的なデータフローを表す概略図であり、図7はこの演算ユニット150に送られる命令(コマンド)のデータ形式を表す構成図である。また、図8はこの演算ユニット150を搭載したプロセッサの概略図である。
【0050】
この演算ユニット150は内部レジスタ100、命令デコーダ101、SIMD(Single Instruction Stream、 Multi Data Stream)演算器102、データアライナ103、動きベクトルレジスタ104、インデックス生成器105の各モジュールより構成される。また、この演算ユニット150を用いたプロセッサは、演算ユニット150の他に命令キャッシュ151、データキャッシュ152、メモリI/F153、I/O154、内部バス155より構成される。
【0051】
内部レジスタ100はデータアライナ103によって整列・区分された参照データを、データごとに一時的に保持するためのレジスタ群である。上述の(想定する処理について)で説明したプロセッサ内部のレジスタはここを想定している。従って、本発明においては横方向、縦方向、斜め方向の6タップFIRフィルタ処理を行う際に用いる参照画像データや2タップフィルタ処理を行うための6タップFIRフィルタ処理後の画素データを保管する、などが本レジスタの主な用途である。
【0052】
命令デコーダ101は命令キャッシュより送信されるコマンドを解読し、SIMD演算器102、動きベクトルレジスタ104、インデックス生成器105に対し処理を指示するためのモジュールである。また、ここでコマンドを解析して、動きベクトルレジスタ104にデータを書き込む処理も行う。
【0053】
SIMD演算器102はSIMD処理を扱うための演算器である。ここでSIMD処理とは、一つの命令(コマンドセット)で、複数のデータを扱う処理方式のことを言い、大量のデータに同種の処理を行う際に用いられる。SIMD演算器102はシフトレジスタ200、演算器201、演算結果レジスタ202より構成される。本発明においては、ハーフペルやクウォータペルの導出に、複数の参照画素から、一度に複数の結果を導出する目的で、一つのコマンドで処理を指示することを狙ったものである。
【0054】
本発明においては、SIMD演算器102は上述した式1及び式2を処理できれば良い。ただし、これ以外の機能を持たせ、より多用途を持たせても問題は無い。
【0055】
データアライナ103はデータキャッシュ152又はバスI/Fから送信されるデータを有意のデータに切り分け、内部レジスタ100に記憶させるためのモジュールである。
【0056】
動きベクトルレジスタ104は、命令デコーダ101がコマンド中から動きベクトルの情報を読み出し、それを動きベクトルデータとして一時的に蓄えるためのレジスタである。
【0057】
インデックス生成器105は、内部レジスタ100に蓄えられた参照データのいずれを演算対象とするか、SIMD演算器102のシフトレジスタ200のシフト量をどの程度にするかを指標するインデックスを生成するモジュールである。命令デコーダ101からの出力及び動きベクトルレジスタ104に蓄えられた動きベクトルデータを参酌して内部レジスタ100のアドレスやレジスタ番号を特定して出力する。
【0058】
命令キャッシュ151は内部バス155に接続されており、命令コードは内部バス155を経由して供給される。そして命令キャッシュ151に入力された命令コードは、演算ユニット150に送られる。
【0059】
データキャッシュ152は演算ユニット150が必要とするデータを供給するモジュールである。データキャッシュ152に該当するデータが無い場合にはメモリI/F153を通して外部メモリ(図示せず)から必要とするデータを演算ユニット150が読み出す。
【0060】
メモリI/F153は外部メモリ160から命令コードやデータ等の供給を受けるためのインターフェイス部のことである。
【0061】
I/O154は図示しない外部プロセッサ等との接続を行う際のインターフェイス部のことである。
【0062】
内部バス155はプロセッサ中の各モジュールとの接続を行う共用のデータ通信路のことを言う。
【0063】
以下この構成下での動作について説明する。
【0064】
命令キャッシュ151に格納されているコマンドを命令デコーダ101がフェッチし、そのデコード結果によって、内部レジスタ100に入力するために、参照画像データ(整数画素データ)をデータキャッシュ152や外部メモリからデータアライナ103へ転送する。
【0065】
通常、データキャッシュやバスI/Fからのデータは2の累乗のデータ幅である。しかし、内部レジスタ100のデータ幅やSIMD演算器102の演算器の数は必ずしも2の累乗に限られず、実装条件等によって定められる。命令デコーダ101の制御により、データアライナ103は参照画像データ(整数画素データ)を以下のように取り扱う。
【0066】
内部レジスタ100のデータ幅に満たない場合、データアライナ103は受け取ったデータを指示されたデータ幅となるまで一旦保持し、データキャッシュもしくはバスI/Fからのデータを待つ。命令デコーダ101に指示されたデータ幅となった場合には、データアライナ103は内部レジスタ100へ参照画像データを書き込む。
【0067】
命令デコーダ101によって、内部レジスタ100にアクセスを行うための基準インデックス番号300と、動きベクトルレジスタ104に格納した動きベクトルデータ305により、内部レジスタ100のインデックス番号をインデックス生成器105によって生成する。
【0068】
生成されたインデックス番号によって選択されたデータはSIMD演算器102のシフトレジスタ200が受け取る。さらに命令デコーダ101により演算制御信号301を出力し、SIMD演算器102の演算器201へ送られる。
【0069】
このときのデータは、すでにデータアライナ103で調整された後のものであり、演算器201が演算命令を実行するのに必要なデータ幅に合わせて実装されている。すなわち、本実施の形態のように演算器201が8個あるのであれば、SIMD演算器102に送られるデータも演算器8個分のものが必要となる。
【0070】
なお、この演算器を必要なだけ実装すると回路規模が増大する虞がある。従って、必要性能を考慮して実装数を削減することも考慮しなければならない。この削減によっても必要な性能を出すことが求められるのは言うまでもない。
【0071】
演算器201により演算したライトバックデータ302が2の累乗でないバイト数であったとしても、内部レジスタ100のデータ幅以下であれば、ライトバックデータ3021サイクルで書き込みを行うことが可能である。
【0072】
これにより、演算処理が2の累乗でないデータ幅を必要とした場合でも、演算器201と内部レジスタ100をそのデータ幅に合わせることで処理性能を向上させることが可能である。
【0073】
図7は、図6の演算ユニット150を動作させるための命令コードをニーモニックで書いた場合を示している。命令コードは演算器201の処理方法を示すオペコード400、演算幅401、演算器201に投入する演算データを格納する内部レジスタ100のどこに存在するかを示す第1ソースレジスタ番号402,第2ソースレジスタ番号403、演算した結果を内部レジスタ100のどこに保管するかを示すデスティネーションレジスタ番号404により構成される。
【0074】
この命令コードの特徴的な箇所は、演算の幅を示す演算幅401のフィールドを持つ点である。この演算幅401は演算器201の動作させる個数や、内部レジスタ100のデータ幅を表す属性値である。ただし、この属性値の上限は演算器201の個数や内部レジスタ100のデータ幅に制約されない。この場合、2サイクル以上かけて演算を行い、結果を出力する。
【0075】
本発明のニーモニックはデータ幅を記述する必要があり、それによって命令コードを生成する。ただし、演算幅401は必ずしも記述する必要は無い。オペコード400によって一意に決まる場合には記述する必要は無い。たとえば、8ビットの加算命令を演算幅16バイト、すなわち16演算並列する場合には、add8.w16と記述することで表現することを想定している。
【0076】
図8は図6の演算ユニット150を搭載したプロセッサの概略図である。基本的には演算ユニット150内部のデータアライナ103によってデータの並び順を変更することを想定しているため、演算ユニット150以外の構造は一般的なプロセッサの構造と変わらない。
【0077】
演算した結果をストア命令等により出力する場合、データキャッシュ152にいったん送られるか、内部バス155、メモリI/F153を介して外部メモリで保持される。
【0078】
また、ビデオやオーディオ等の低速デバイス等とのインターフェイスであるI/O154等とのやり取りを内部バス155経由で行うこともできる。
【0079】
図9はデータアライナ103を実現する方法の一つである。外部メモリ160は64ビット幅で、内部レジスタ100は80ビット幅とした場合を示す。
【0080】
命令デコーダ101からのコマンドにより、バイトイネーブル制御部203はアドレス信号を生成する。このアドレス信号により外部メモリ160のアドレスを特定する。外部メモリ160から読み出すデータを内部レジスタ100へ書き込む際、書き込みのタイミングであるイネーブル信号を生成する。アドレスの下位ビットにより一回目の外部メモリ160の読み出しで、内部レジスタ100へ書き込むことのできる位置を判別可能である。
【0081】
すなわち、アラインが取れている外部メモリ上のデータライン1000は、バイトイネーブル制御部203により、内部レジスタデータ1100へ全てのデータを書き込むことが可能である。
【0082】
次のサイクルでは、内部レジスタデータ1100の残りのデータを外部メモリ160のデータライン1001から読み出し、バイトイネーブル制御部203によりバイトイネーブル信号310を生成し、内部レジスタデータ1100へ書き込みを行う。
【0083】
このとき、外部メモリから読み出したデータのうち、内部レジスタ100へ書き込みを行わなかったデータに関しては一時保持するなどにより、次回のアクセスで使用することで読み出しサイクルを削減することも可能である(どのように一次保持するのか図9からは不明)。
【0084】
図10は画像処理として2回のフィルタ処理を行う場合のデータフローを示す。本図では、14バイトのデータを用いて6タップフィルタ処理を行い、縦、横、斜めとも9バイトのハーフペルのデータを生成する。その後、さらにその9バイトのデータをも用いて2タップフィルタ処理を行い、結果8バイトのクウォータペルのデータを生成する。
【0085】
まず、14バイト幅データ500のうち適切否データをSIMD演算器102へ投入する。このとき9バイトの結果を必要とするため、SIMD演算器の8個の演算器201を動作させる。
【0086】
6タップFIRフィルタ処理を行うため、データの投入は6サイクルをかけて行い、サイクル毎に1バイトずつずらしてSIMD演算器102へ投入する。このため、9バイト+6タップ−1のバイト数が必要となり、投入する必要のあるバイト数は14バイトとなる。
【0087】
シフトレジスタ200により1バイトずつ、ずらしたデータをSIMD演算器102へ投入することが可能であり、6サイクル後に9バイトの演算結果を得る。この演算結果は内部レジスタ100へ一旦書き戻され、次の2タップフィルタで再度使用される。このとき、内部レジスタ100のデータ幅が9バイトではなかった場合、9バイト以外の部分はいかなる値でもよい。
【0088】
内部レジスタ100に保存された9バイトのデータを、次の2タップフィルタ処理のために演算器201へ投入する。このとき、演算器201を8個動作させる。2タップフィルタ処理を行うため、1サイクル目は先頭の8バイトを投入し、次のサイクルで1バイトシフトしたデータを投入する。2サイクルの処理が終了した時点で8バイトの結果を得ることができ、その演算結果202は内部レジスタ100へ書き戻される。これにより、6タップフィルタの処理後、2タップフィルタ処理を実現することが可能となる。
【0089】
図11は、内部レジスタ100を10バイト幅で定義した場合の14バイト幅のデータの格納方法を示している。通常は14バイトのデータ幅にあわせて内部レジスタ100のデータ幅を規定するが、最大幅が全処理に対して極端に使用回数が少ない場合は内部レジスタ100の回路規模削減のために複数のレジスタにまたがって格納することで、回路規模を削減することが可能である。もちろん、この場合リードポート数は2となる。
【0090】
レジスタ0とレジスタ1にはデータ1300と1301が保存されており、画素データ1の14バイトを構成する。同様に、レジスタ2とレジスタ3のデータ1302とデータ1303を用いて画素データ2の14バイトを構成する。使用する場合、例えば、レジスタ4をソースとして指定し、データ幅14とニーモニックコードを記述することで、レジスタ4とレジスタ5のデータをシフトレジスタ200へ投入することが可能である。
【0091】
図12は10バイト幅の内部レジスタ100に14バイト幅のデータを格納した場合に演算器でのフィルタ処理を示している。
【0092】
画像圧縮技術で、6タップフィルタ処理を行った後、2タップフィルタ処理を行うような場合、14画素から9画素の画像を生成し、さらに2タップフィルタ処理により8画素の画像を生成する。このような処理の場合、内部レジスタ100に14画素分のデータを保持する必要があり、1ライン目の14画素の画像データ1のうち、上位10バイトをレジスタ0にデータ1300を保存し、下位4バイトはレジスタ1にデータ1301として保存する。これらのデータはSIMD演算器102への投入し、シフトレジスタ200にて整形される。横方向の6タップフィルタ処理は、14画素データの最初の6画素から求められる。そのため、シフトレジスタ200にて各サイクルで1バイトずつ演算器201へ投入することで求めることが可能である。6サイクル後に出力された演算結果202は、内部レジスタ100へライトバックされ、次のフィルタ処理へ投入される。
【0093】
以上のような構成により、演算処理が2の累乗でないデータ幅を必要とした場合であっても、演算器201と内部レジスタ100をそのデータ幅に合わせることで処理性能を向上させることが可能である。
【0094】
(第2の実施の形態)
図13は動きベクトルに応じて投入するデータを変更し、フィルタ処理を1命令で行うことを可能とした演算ユニットのデータフローを示す。
【0095】
第1の実施の形態の演算ユニットと相違する箇所は動きベクトルレジスタ104を動きベクトルレジスタ170に置き換え、想定される動きベクトルの処理をバスI/Fから書き込めるようにしたこと、及び、インデックス生成器105をインデックス生成器171に変更した点である。
【0096】
実際にはH.264では1つのブロックに対する動きベクトルの処理パターンが40−50ぐらいの処理に限られる。
【0097】
従って、この処理パターン(動きベクトル)をデータとして全て動きベクトルレジスタ170に書き込めるようにしておく。そして、この動きベクトルレジスタ170から動きベクトル判定器106が動きベクトルを抽出し、動きベクトル判定器106から適切な処理を行うべく内部レジスタ100のアドレスを設定し、SIMD演算器102のシフトレジスタ200に設定することを可能にする。
【0098】
以下、動きベクトルレジスタ170書き込み後の動作について詳細に述べる。
【0099】
命令デコーダ101によって内部レジスタ100へアクセスを行う為、動きベクトル選択信号304により動きベクトルレジスタ170の中から適切なデータ(動きベクトル305)を選択し、動きベクトル判定器106が適切な動きベクトル305を参照する。
【0100】
また、命令デコーダ101より出力される動きベクトル判定器制御信号308により、参照している動きベクトル305を用いた内部の演算方式を変更する。例えば2段階フィルタ処理の場合であれば、1段階目と2段階目での動きベクトル305の処理方式を変更する為に用いる。
【0101】
動きベクトル判定器106により決定されたオフセット値と、基本インデックス番号300とを加算し、SIMD演算器102へ入力するレジスタデータ303を選択する。選択したデータはシフトレジスタ200が受け取る。その後、さらに命令デコーダ101により演算制御信号301を出力し、SIMD演算器102の演算器201へ演算の種類を通知する。
【0102】
また、動きベクトル判定器106によりシフトレジスタ200に出力される制御信号線309によって、シフトレジスタ200からの出力データの重み付けがなされ、それを用いて演算器201が演算処理を行う。
【0103】
シフトレジスタ200のデータは演算器201へと送られるが、このとき演算器201の実装数は演算命令が必要とするデータ幅に合わせて実装されている。すなわち、演算結果として9個の演算結果が必要であれば、演算器201の実装数も9個となる。この演算器の実装数は、最大数を実装すると回路規模が増大する恐れがあるため、必要性能を考慮し、実装数を削減することも可能である。
【0104】
このようにすることで、演算器201により演算したライトバックデータ302が2の累乗ではないバイト数であったとしても、内部レジスタ100のデータ幅以下であるならばライトバックデータ302は1サイクルで書き込みを行うことが可能である。
【0105】
以上、本発明者によってなされた発明を実施の形態に基づき具体的に説明したが、本発明は前記の実施の形態に限定されるものでなく、その要旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【産業上の利用可能性】
【0106】
本発明は複数回のフィルタ処理を要するデータ処理を行う際に有効である。本書ではH.264AVC等の画像の復号化、符号化を例として上げたが、必ずしもこれにはこだわらず、音声等の処理であっても適用可能である。
【図面の簡単な説明】
【0107】
【図1】6タップFIRフィルタ処理及び2タップフィルタ処理を説明するための概念図である。
【図2】本発明による、横方向6タップFIRフィルタ処理を説明するための概念図である。
【図3】本発明による、縦方向6タップFIRフィルタ処理を説明するための概念図である。
【図4】本発明による、斜め方向6タップFIRフィルタ処理を説明するための概念図である。
【図5】本発明による、2タップフィルタ処理を説明するための概念図である。
【図6】本発明の第1の実施の形態に関わる演算ユニットのデータフローを表す概念図である。
【図7】本発明の第1の実施の形態に関わる演算ユニットへの命令コードの構成を表す構成図である。
【図8】本発明の演算ユニットを用いたプロセッサの構成を表す構成図である。
【図9】本発明の演算ユニットに含まれるデータアライナによるデータの整列を表す図である。
【図10】本発明の第1の実施の形態に関わる演算ユニットの6タップFIRフィルタ処理及び2タップフィルタ処理の流れを示す図である。
【図11】内部レジスタが10バイト幅であるときに本発明の第1の実施の形態に関わる演算ユニットが14バイトのデータを格納することを想定したデータの格納方法を表す概念図である。
【図12】図11のデータを本発明の第1の実施の形態に関わる演算ユニットに投入する方法を示した図である。
【図13】本発明の第2の実施の形態に関わる演算ユニットのデータフローを表す概念図である。
【符号の説明】
【0108】
100…内部レジスタ、101…命令デコーダ、102…SIMD演算器、
103…データアライナ、104…動きベクトルレジスタ、
105…インデックス生成器、
150…演算ユニット、151…命令キャッシュ、152…データキャッシュ、
153…メモリI/F、154…I/O、155…内部バス、
200…シフトレジスタ、201…演算器、202…演算結果レジスタ
400…オペコード、401…演算幅、402…第1ソースレジスタ番号、
403…第2ソースレジスタ番号、404…デスティネーションレジスタ番号

【特許請求の範囲】
【請求項1】
第1の周期で一の特定処理を行う第1の演算処理と、前記第1の周期と異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、命令デコーダを含む演算ユニットにおいて、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定できることを特徴とする演算ユニット。
【請求項2】
請求項1記載の演算ユニットにおいて、更に前記SIMD演算器はシフトレジスタを含み、
投入された命令コードに従い前記命令デコーダは前記シフトレジスタにデータを投入することを特徴とする演算ユニット。
【請求項3】
請求項2記載の演算ユニットにおいて、更に内部レジスタとインデックス生成器を含み、
前記命令デコーダからの入力により前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入することを特徴とする演算ユニット。
【請求項4】
請求項3記載の演算ユニットにおいて、
前記第1の周期は所定数のクロック周期より構成され、前記第1の周期ごとに第1の演算結果を出力し、前記第1の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトすることを特徴とする演算ユニット。
【請求項5】
請求項4記載の演算ユニットにおいて、
前記第1の演算結果を前記内部レジスタに格納することを特徴とする演算ユニット。
【請求項6】
請求項5記載の演算ユニットにおいて、
前記第2の周期は所定数のクロック周期より構成され、前記第2の周期ごとに第2の演算結果を出力し、前記第2の周期中の各クロック周期の終了後に前記シフトレジスタ中のデータをシフトすることを特徴とする演算ユニット。
【請求項7】
請求項6記載の演算ユニットにおいて、
前記第2の演算結果を前記内部レジスタに格納することを特徴とする演算ユニット。
【請求項8】
請求項7記載の演算ユニットにおいて、
前記第2の演算処理に前記第1の演算結果を前記データとして投入することを特徴とする演算ユニット。
【請求項9】
シフトレジスタと、第1の周期で一の特定処理を行う第1の演算処理と前記第1の周期と異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、命令デコーダと、内部レジスタと、インデックス生成器と、動きベクトルレジスタを含む画像フィルタリング装置において、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定し、
投入された命令コードに従い前記命令デコーダは前記動きベクトルレジスタに動きベクトルデータを蓄積しかつ出力し、
前記命令デコーダの出力及び前記動きベクトルデータを参照して前記インデックス生成器は前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入し、前記SIMD演算器が演算することを特徴とする画像フィルタリング装置。
【請求項10】
シフトレジスタと、第1の周期で一の特定処理を行う第1の演算処理とサイクルと異なる第2の周期で他の特定処理を行う第2の演算処理を実行可能な演算器を複数含むSIMD演算器と、複数の動きベクトルデータが蓄積された動きベクトルレジスタと、命令デコーダと、内部レジスタと、インデックス生成器を含む画像フィルタリング装置において、
投入された命令コードに従い前記命令デコーダは前記複数の演算器のうち動作する数を規定し、
前記命令デコーダからの出力に従い前記動きベクトルレジスタは適切な動きベクトルデータを前記インデックス生成器に出力し、
前記命令デコーダの出力及び前記動きベクトルデータを参照して前記インデックス生成器は前記内部レジスタのアドレスを出力し、前記アドレスを参照して前記内部レジスタのデータを前記シフトレジスタに投入し、前記SIMD演算器が演算することを特徴とする画像フィルタリング装置。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate

【図10】
image rotate

【図11】
image rotate

【図12】
image rotate

【図13】
image rotate