(57)【要約】【課題】フレームメモリを利用するように記述されたソースファイルから処理遅延量及び必要なラインメモリのサイズ抽出することで開発効率を向上することができるコンパイル装置を提供する。【解決手段】コンパイル装置１は、ソースファイル１０７に記述されている複数の処理タスク２１ａ〜２１ｄ間の処理遅延量を各処理タスク２１ａ〜２１ｄが処理する各画素の処理状態に応じて算出する処理遅延量解析部１６と、各処理タスク２１ａ〜２１ｄの読み込み先のフレームメモリのアクセス範囲に基づいて、各処理タスク２１ａ〜２１ｄ毎に必要となるラインメモリのサイズを算出するラインメモリ量判定部１７とを有する。そして、コンパイル装置１は、処理遅延量及び必要となるラインメモリのサイズに基づいて、複数の処理タスク２１ａ〜２１ｄをパイプライン実行可能な命令コードに変換するパイプライン化部１８を有する。【選択図】図２
2011118752.tif 000002
【特許請求の範囲】
【請求項１】
フレームメモリを用いるように記述されたソースプログラムをコンパイルするコンパイル装置であって、
前記ソースプログラム内の複数の処理タスク間の処理遅延量を、各処理タスクが処理する各画素の処理状態に応じて算出する処理遅延量算出部と、
前記各処理タスクの読み込み先のフレームメモリのアクセス範囲に基づいて、前記各処理タスク毎に必要となるラインメモリのサイズを算出するラインメモリ量算出部と、
前記処理遅延量及び前記必要となるラインメモリのサイズに基づいて、前記複数の処理タスクをパイプライン実行可能な命令コードに変換する命令コード変換部と、
を有することを特徴とするコンパイル装置。
【請求項２】
前記複数のフレームメモリに対する前記複数の処理タスクのアクセス状態に基づいて、前記複数の処理タスクのノードと、前記複数のフレームメモリのノードとを有向のエッジで接続した有向グラフを生成する有向グラフ生成部を有することを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記複数の処理タスクが、読み込み先のフレームメモリに対し、ある周期でアクセスするアクセス範囲を抽出するアクセス範囲抽出部と、
前記アクセス範囲抽出部が抽出した前記アクセス範囲を対応する前記有向のエッジのラベルに付加するアクセス範囲付加部と、
を有することを特徴とする請求項２に記載のコンパイル装置。
【請求項４】
パイプライン実行する際に、最も遅れて実行される処理タスク、あるいは、最も遅れて書き込まれるフレームメモリを基準ノードに決定し、決定した前記基準ノードに基準となる画素位置の情報を設定する基準ノード決定部と、
前記基準ノード決定部で設定された前記基準となる画素位置の情報に基づいて、各フレームメモリに書き込まれるデータの画素位置の情報及び各処理タスクが処理を実行する画素位置の情報を算出し、それぞれ対応するフレームメモリ及び処理タスクに前記画素位置の情報を付加する画素位置算出付加部と、
を有することを特徴とする請求項３に記載のコンパイル装置。
【請求項５】
前記処理遅延量算出部は、前記複数の処理タスクのそれぞれに付加された前記画素位置の情報の差分を算出することにより、前記複数の処理タスク間の前記処理遅延量を算出することを特徴とする請求項４に記載のコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル装置に関し、特に、フレームメモリを用いるように記述されたソースプログラムをパイプライン実行可能な命令コードに変換するコンパイル装置に関する。
【背景技術】
【０００２】
従来、入力画像データにデジタル信号処理を施す画像処理では、例えば、カメラ等のセンサ入力から入力画像データを受け取り、入力画像データの全体に欠陥画素補正の処理を行う。そして、画像処理プロセッサは、欠陥画素補正の処理を実行後に得られた出力画像データとしての中間画像データを後段の処理、例えば、シェーディング補正への入力とし、シェーディング補正の処理を実行後に得られる出力画像データを、さらに後段の処理の入力として利用するといったように、画像データを処理間の中間データとして各処理を施すことなどがある。
【０００３】
このように、欠陥画素補正及びシェーディング補正等の各処理タスクが、入力画像データを受け取り、入力画像データのデータサイズと同一のデータサイズのデータを出力画像データとして出力し、後段の処理がその結果を受けて処理を行う場合、各処理タスクのプログラミング記述は、入力画像データのサイズ分だけのデータを確保されたメモリ領域（フレームメモリ）を利用するように記述して実装するとプログラミングが容易であり、処理の開発、改変がし易い。
【０００４】
しかしながら、各処理タスク間において入力画像データのサイズ分のデータを授受する場合には、入力画像データのサイズ分のデータを保持するフレームメモリが必要になる。具体的には、入力画像データのサイズが２０MByteの場合、入力画像データを保持するために、２０MByteのフレームメモリを必要とし、さらに中間画像データを保持するために、２０MByteのフレームメモリを必要とし、処理全体では、合計で４０MByteのメモリ領域が必要となる。
【０００５】
そこで、組み込み機器等にこのような処理を実装する場合には、各処理タスクがある画素位置のデータを算出するために、入力データの限定的な範囲のデータを参照することを利用し、各処理タスクをパイプライン実行するように変更し、各処理間に滞留させるデータ量を必要最低限にする方法が一般的に用いられる。
【０００６】
例えば、ライン処理をパイプライン制御で行う複数の画像処理手段を有する画像処理装置が提案されている（例えば、特許文献１参照）。
【０００７】
このように、処理タスクをパイプライン実行するように変更する場合、例えば、欠陥画素補正を行う処理タスクが、中間画像データの垂直方向座標がｖ及び水平方向座標がｈの位置に書き込むデータを演算するために、入力画像データの垂直方向座標のｖ−１〜ｖ＋１及び水平方向座標のｈ−１〜ｈ＋１の矩形範囲のデータを読み込み、読み込んだデータに演算を行い、出力データを書き込むという処理を行うとする。一般に、このようなパイプライン実行を行う場合、あるタイミングで書き込まれる入力画像データの垂直方向座標をVin、水平方向座標をHinで表し、欠陥画素補正の処理タスクが演算する中間画像のデータの画像中の垂直方向座標の位置をVa、水平方向座標の位置をHaで表すときに、欠陥画素補正の処理タスクが読み込むデータの範囲に応じ、Vin及びHinと、Va及びHaとの間に垂直方向座標に−１、水平方向座標に−１の相対的な座標位置の差、即ち、処理に遅延を設ける必要がある。この相対的に座標位置の差を処理遅延量という。そしてVin及びHinの座標位置の入力画像データの書き込みを行うたびに、Vin及びHinをラスタスキャン順になるようにインクリメントし、欠陥画素補正の処理タスクのVa及びHa位置のデータの演算を行い、Va及びHaもラスタスキャン順となるようにインクリメントする。
【０００８】
この入力画像データの書き込みと処理タスクの実行処理を１つの実行周期として、１画素ずつラスタスキャン順に各画素位置をインクリメントしつつ、処理を繰り返す場合、各処理タスクに適切な処理遅延量を設ける必要がある。
【０００９】
ここで、ラスタスキャン順とは、入力画像データの左上を基準にし、水平方向座標を進めるようにインクリメントし、入力画像データの右端までインクリメントされると、垂直方向座標を１増加し、水平方向座標を０にリセットすることにより、垂直方向座標、水平方向座標を増加させる処理である。
【００１０】
また、このようにパイプライン実行を行う場合、ある実行周期αで、欠陥画素補正の処理タスクがある垂直方向座標Vaα、水平方向座標Haαの処理を実行するためには、入力画像の（Vaα−１,，Haα−１）〜（Vaα＋１，Haα＋１）の矩形範囲データを必要とする。この矩形範囲データは、（Vinα−２， Hinα−２）〜（Vinα，Hinα）の矩形範囲と等価である。
【００１１】
次の実行周期α＋１では、欠陥画素補正の処理タスクは、入力画像の（Vaα−１，Haα）〜（Vaα＋１，Haα＋２）の矩形範囲データを必要とする。実行周期α＋１でアクセスする矩形範囲データは、（Vinα−２，Hinα−１）〜（Vinα，Hinα＋１）の矩形範囲となる。
【００１２】
このため、実行周期αでは、入力画像の（Vinα−２，Hinα−２）の位置のデータがアクセスされるが、実行周期α＋１では、（Vinα−２，Hinα−２）の位置のデータは不要となり、代わりに（Vinα，Hinα＋１）の位置のデータが新たに必要となる。
【００１３】
このため、パイプライン実行した場合には、ある実行周期γでは、入力画像上での（Vaγ−１，Haγ−１）〜（Vaγ＋１，Haγ＋１）の座標相当の領域のデータ、即ち、入力画像の（Vinγ−２，Hinγ−２）〜（Vinγ，Hinγ）の領域のデータ分、つまり、２ライン+３画素相当のデータを格納する領域をメモリ上に確保しておけば、欠陥画素補間の処理タスを実行することが可能となる。このようにパイプライン実行する場合、各処理間のデータ受け渡しを入力画像データ一枚分のメモリ領域を確保する場合と比較し、処理実行時に必要なメモリ量を大幅に削減する事が可能となる。
【００１４】
なお、このようにパイプライン実行する処理タスク間でのデータ授受に利用される複数ライン＋複数画素分のデータのみを保持するメモリ領域を、以下ではラインメモリという。
【００１５】
しかしながら、このように、パイプライン実行し、メモリ量を削減する場合、ユーザは、ラインメモリを利用するように処理タスクを記述する必要がある。ユーザは、処理タスク間のデータアクセスの関係性を考慮し、各処理に適切な処理遅延量を付加するとともに、必要なラインメモリのサイズを意識しながらソースファイル内に処理タスクを記述する必要があり、開発効率が低下するという問題がある。
【００１６】
また、ユーザは、処理タスクの処理内容を変更した場合、その変更内容に応じて、処理遅延量及び必要なラインメモリのサイズを変更する必要があり、変更のための処理遅延量及び必要なラインメモリのサイズを再度算出するために、開発効率が低下するという問題がある。さらに、ユーザが、処理遅延量及び必要なラインメモリのサイズの判定を間違えた場合、問題の発見が容易でないという問題がある。特に実装する処理が複雑な場合、即ち、各処理間でのデータの受け渡しが複雑な場合、これらの問題は顕著となる。
【００１７】
このように、ラインメモリを利用するように処理タスクを記述する場合、フレームメモリを利用するように処理タスクを記述する場合に比べ、開発効率が低下してしまうという問題があった。
【先行技術文献】
【特許文献】
【００１８】
【特許文献１】特開２００５−１１３８０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１９】
本発明は、フレームメモリを利用するように記述されたソースファイルから処理遅延量及び必要なラインメモリのサイズ抽出することで開発効率を向上することができるコンパイル装置を提供することを目的とする。
【課題を解決するための手段】
【００２０】
本発明の一態様によれば、フレームメモリを用いるように記述されたソースプログラムをコンパイルするコンパイル装置であって、前記ソースプログラム内の複数の処理タスク間の処理遅延量を、各処理タスクが処理する各画素の処理状態に応じて算出する処理遅延量算出部と、前記各処理タスクの読み込み先のフレームメモリのアクセス範囲に基づいて、前記各処理タスク毎に必要となるラインメモリのサイズを算出するラインメモリ量算出部と、前記処理遅延量及び前記必要となるラインメモリのサイズに基づいて、前記複数の処理タスクをパイプライン実行可能な命令コードに変換する命令コード変換部と、を有することを特徴とするコンパイラ装置を提供することができる。
【発明の効果】
【００２１】
本発明のコンパイラ装置によれば、フレームメモリを利用するように記述されたソースファイルから処理遅延量及び必要なラインメモリのサイズ抽出することで開発効率を向上することができる。
【図面の簡単な説明】
【００２２】
【図１】本発明の第１の実施の形態に係る情報処理システムの構成を示すブロック図である。
【図２】コンパイル装置の構成を示すブロック図である。
【図３Ａ】ソースファイルに記述される処理タスクの例を説明するための説明図である。
【図３Ｂ】ソースファイルに記述される処理タスクの例を説明するための説明図である。
【図４】接続関係グラフ生成部によって生成される有向グラフの例を説明するための説明図である。
【図５】図４の有向グラフにアクセス範囲の情報を付加した例を説明するための説明図である。
【図６】画素位置の情報を算出する処理の例を説明するためのフローチャートである。
【図７】図５に対して図６のフローチャートを実行した結果を説明するための説明図である。
【図８】処理タスクの読み込み画素位置と書き込み画素位置との関係を説明するための説明図である。
【図９】必要となるラインメモリのサイズについて説明するための説明図である。
【図１０】パイプライン化部の処理の流れの例を説明するためのフローチャートである。
【図１１】第２の実施の形態に係る画像処理プロセッサの構成を示すブロック図である。
【発明を実施するための形態】
【００２３】
以下、図面を参照して本発明の実施の形態について詳細に説明する。  
（第１の実施の形態）
まず、図１に基づき、本実施の形態に係る情報処理システムの構成を説明する。図１は、本発明の第１の実施の形態に係る情報処理システムの構成を示すブロック図である。
【００２４】
図１に示すように、情報処理システム１００は、本体装置１０１と、各種データを記憶する記憶装置１０２と、各種データを表示する表示装置１０３とを有して構成されている。本体装置１０１は、パーソナルコンピュータ等のコンピュータ装置本体であり、ＣＰＵ１０１ａ、図示しない主メモリなどを搭載している。また、本体装置１０１は、入力装置として、キーボード１０４及びマウス１０５が接続されている。本体装置１０１は、これらの入力装置からの指示に基づいて、各種プログラムを実行する。
【００２５】
記憶装置１０２には、コンパイル機能のプログラムを有するコンパイラ１０６と、例えば、Ｃ言語等のプログラミング言語により記述されたソースプログラムとしてのソースファイル１０７とが記憶されている。
【００２６】
ユーザは、このソースファイル１０７を入力とし、コンパイラ１０６を本体装置１０１上において実行することにより、後述するオブジェクトファイル１０８を得ることができる。このオブジェクトファイル１０８は、図示を省略しているが、記憶装置１０２に記憶される。このように、本体装置１０１上で実行されるコンパイラ１０６が、本実施の形態のコンパイル装置を構成する。なお、コンパイラ１０６、ソースファイル１０７及びオブジェクトファイル１０８のそれぞれは、記憶装置１０２に記憶されるが、他の記憶媒体に記憶されてもよい。
【００２７】
ここで、このように構成されるコンパイル装置の構成について説明する。図２は、コンパイル装置の構成を示すブロック図である。図２に示すように、コンパイル装置１は、接続関係グラフ生成部１１と、アクセス範囲抽出部１２と、アクセス範囲情報付加部１３と、基準ノード決定部１４と、画素位置解析／付加部１５と、処理遅延量解析部１６と、ラインメモリ量判定部１７と、パイプライン化部１８とを有して構成されている。
【００２８】
コンパイラ装置１は、フレームメモリを利用するように記述されたソースファイル１０７を受け取り、パイプライン実行可能なオブジェクトファイル１０８を生成する。
【００２９】
ここで、コンパイラ装置１に入力されるソースファイル１０７に記述される処理タスクについて説明する。
【００３０】
図３A及び図３Bは、ソースファイルに記述される処理タスクの例を説明するための説明図である。
【００３１】
図３A及び図３Bの処理タスクは、それぞれフレームメモリを利用するように記述されている。ソースファイル１０７は、図３A及び図３Bに示す処理タスクを複数有して構成されている。各処理タスクは、それぞれ０及び１行目において、垂直方向座標及び水平方向座標をラスタスキャン順に走査するようにインクリメントする２重ループが記述され、２行目〜５行目において、この２重ループの中で各処理タスクの垂直方向座標がｖ及び水平方向座標がｈの位置での処理が記述されている。
【００３２】
２重ループの中の処理では、１個以上のフレームメモリを入力として受け取り、入力フレームに対し、（ｖ，ｈ）を中心とし、その周辺をアクセスする。アクセス先は、コンパイル時に静的に決定される。
【００３３】
例えば、図３Aの３行目では、入力フレームとして“inFrame”の（ｖ，ｈ）を中心に、垂直方向に−１及び水平方向に−１ずれた位置のデータと、垂直方向に＋１及び水平方向に＋１ずれた位置のデータとをアクセスする。
【００３４】
また、２重ループの中の処理では、１つ以上のフレームメモリを入力フレームとして受け取り、出力フレームの（ｖ，ｈ）の位置にデータを１回だけ書き込む。例えば、図３Aでは、入力フレームとして“inFrame”という１つのフレームメモリを受け取り、図３Bでは、入力フレームとして“inAFrame”及び“inBFrame”という２つのフレームメモリを受け取っている。
【００３５】
なお、処理タスクは、Ｃ言語による記述として説明しているが、上述した処理を実行するように記述されていれば、他の言語によって記述されていてもよい。
【００３６】
このように記述されたソースファイル１０７は、コンパイラ装置１の接続関係グラフ生成部１１に入力される。
【００３７】
有向グラフ生成部としての接続関係グラフ生成部１１は、図３A及び図３Bに示す処理タスクの記述を含むソースファイル１０７を入力として受け取り、図４に示す有向グラフを生成する。
【００３８】
図４は、接続関係グラフ生成部によって生成される有向グラフの例を説明するための説明図である。
【００３９】
まず、接続関係グラフ生成部１１は、ソースファイル１０７の記述から処理タスクの単位を抽出し、抽出した各処理タスクをノードとする。
【００４０】
次に、接続関係グラフ生成部１１は、各処理タスクがアクセスするフレームメモリを抽出し、抽出した各フレームメモリをノードとする。そして、接続関係グラフ生成部１１は、各処理タスクのノードと、その処理タスクがデータを読み出すフレームメモリのノードとを接続する有向のエッジを生成し、接続する。同様に、接続関係グラフ生成部１１は、各処理タスクのノードと、その処理タスクがデータを書き込むフレームメモリのノードとを接続する有向のエッジを生成し、接続する。さらに、接続関係グラフ生成部１１は、生成したエッジにそれぞれ異なるラベルを付加する。
【００４１】
例えば、図４では、処理タスクのノードとして、処理タスク２１ａ〜２１ｄが抽出され、フレームメモリのノードとして、フレームメモリ２２ａ〜２２ｅが抽出されている。そして、処理タスク２１ａ〜２１ｄ及びフレームメモリ２２ａ〜２２ｅのアクセス関係から、エッジ２３ａ〜２３ｊが生成され、接続されている。エッジ２３ａ〜２３ｊには、それぞれラベルａ〜ｊが付加されている。
【００４２】
次に、アクセス範囲抽出部１２は、各処理タスクについて、読み込み先のフレームメモリ毎に、その処理タスクがある周期で処理する画素（Vx，Hx）を中心に、どの範囲でアクセスするかを解析し、アクセスする範囲の最大値及び最小値を、それぞれ最大アクセス範囲及び最小アクセス範囲として抽出する。
【００４３】
例えば、図３Aの記述の処理タスクでは、フレームメモリ“inFrame”に対し最大で垂直方向に＋１、水平方向に＋１のデータをアクセスし、最小で垂直方向に−１、水平方向に−１のデータをアクセスする。これにより、この処理タスクのフレームメモリ“inFrame”に対する最大アクセス範囲は（１，１）、最小アクセス範囲は（−１，−１）となる。なお、（ｘ，ｙ）の記述において、ｘ及びｙは、それぞれ垂直方向及び水平方向のアクセス範囲を示している。
【００４４】
また、図３Bの記述の処理タスクでは、フレームメモリ“inAFrame”に対し最大で垂直方向に＋１、水平方向に＋１のデータをアクセスし、最小で垂直方向に−１、水平方向に−１のデータをアクセスする。また、この処理タスクは、フレームメモリ“inBFrame”に対し最大で垂直方向に＋１、水平方向に−１のデータを、最小で垂直方向に−１、水平方向に＋１のデータをアクセスする。これにより、この処理タスクのフレームメモリ“inAFrame”に対する最大アクセス範囲は（１、１）、最小アクセス範囲は（−１，−１）となり、フレームメモリ“inBFrame”に対する最大アクセス範囲は（１，−１）、最小アクセス範囲は（−１，１）となる。
【００４５】
次に、アクセス範囲情報付加部１３は、アクセス範囲抽出部１２によって抽出された最大アクセス範囲及び最小アクセス範囲の情報を、接続関係グラフ生成部１１によって生成された有向グラフの対応するエッジのラベルに付加する。
【００４６】
図５は、図４の有向グラフにアクセス範囲の情報を付加した例を説明するための説明図である。アクセス範囲が付加されるエッジは、フレームメモリのノードから処理タスクへのノードに接続されたエッジのみとなる。即ち、図５の例では、アクセス範囲が付加されるエッジは、エッジ２３ｃ、２３ｄ、２３ｆ、２３ｈ及び２３ｉとなる。
【００４７】
例えば、図４の処理タスク２１ｃがある画素位置（Vx，Hx）においては、フレームメモリ２２ａに対して、（Vx，Hx）を中心に、最小で垂直方向に−２、水平方向に−２の位置から、最大で垂直方向に＋２、水平方向に＋２の位置までアクセスする場合、図５に示すように、アクセス範囲情報付加部１３は、対応するエッジ２３ｆのラベルｆに、最大アクセス範囲（図５では最大と略す）として（２，２）を付加し、最小アクセス範囲（図５では最小と略す）として（−２，−２）を付加する。
【００４８】
次に、基準ノード決定部１４は、パイプライン実行する際に、最も遅れて実行される処理タスク、あるいは、最も遅れて書き込まれるフレームメモリを基準ノードに決定する。そして、基準ノード決定部１４は、その処理タスクが書き込みを行う画素位置、あるいは、フレームメモリに書き込まれるデータの画素位置を（０，０）として、この画素位置の情報を画素位置情報として基準ノードに設定する。具体的には、基準ノード決定部１４は、出次数が０のノード、即ち、書き込みを行わない処理タスクのノード、あるいは、読み込みが行われないフレームメモリのノードに対し、画素位置情報として（０，０）を設定する。（０，０）の値は、順に垂直方向の座標位置、水平方向の座標位置を表わす。
【００４９】
図５の例では、出次数が０のノードは、読み込みが行われないフレームメモリ２２ｅとなる。基準ノード決定部１４は、フレームメモリ２２ｅを基準ノードに決定し、このフレームメモリ２２ｅのノードに対し、画素位置情報として（０，０）を設定する。
【００５０】
次に、画素位置算出付加部としての画素位置解析／付加部１５は、基準ノード決定部１４で設定した値、即ち、画素位置情報を基準に、パイプライン実行される際に、各フレームメモリに書き込まれるデータの画素位置の情報及び各処理タスクが処理を実行する画素位置の情報を算出し、対応するフレームメモリ及び処理タスクに画素位置の情報を付加する。 
具体的には、画素位置解析／付加部１５は、出次数が０のノードをノードxとし、ノードｘに入力されるエッジをエッジαとし、エッジαを出力しているノードをノードｙとし、ノードx、エッジα及びノードｙに対し、図６に示す処理を行う。即ち、図５の例では、フレームメモリ２２ｅがノードｘ、エッジ２３ｊがエッジα、処理タスク２１ｄがノードｙとなる。
【００５１】
図６は、画素位置の情報を算出する処理の例を説明するためのフローチャートである。また、図７は、図５に対して図６のフローチャートを実行した結果を説明するための説明図である。
【００５２】
まず、終点にノードｘを持つエッジαについて、エッジαのラベルにノードｘの画素位置情報が付加される（ステップＳ１）。図７の例では、エッジ２３ｊのラベルｊにフレームメモリ２２ｅの画素位置情報である（０，０）が付加される。次に、エッジαの始点のノードｙに、画素位置情報が設定されているか否かが判定される（ステップＳ２）。この処理では、処理タスク２１ｄに画素位置情報が設定されているか否かが判定される。画素位置情報が設定されていないと判定された場合、NOとなり、ノードｙが処理タスクか否かが判定される（ステップＳ３）。ノードｙが処理タスクの場合、YESとなり、エッジαの画素位置情報をノードｙの画素位置情報として設定する（ステップＳ４）。図７の例では、エッジ２３ｊの画素位置情報である（０，０）が処理タスク２１ｄの画素位置情報として設定される。
【００５３】
次に、ノードｙを始点に持つエッジβについて、エッジβの画素位置情報が、ノードｙの画素位置情報よりも大きければ、ノードｙの画素位置情報を、エッジβに設定し、かつ、エッジβの画素位置情報を、エッジβの終点に接続されるノードｚの画素位置情報に設定する（ステップＳ５）。ノードｙを始点に持つエッジβについて全て処理されたか否かが判定される（ステップＳ６）。全て処理されてない場合、NOとなり、ステップＳ５に戻り同様の処理を繰り返す。一方、全て処理された場合、YESとなり、ノードｙの入力次数が１以上か否かが判定される（ステップＳ７）。入力次数が１以上の場合、YESとなり、ノードｙをノードｘに置き換えて（ステップＳ８）、ステップＳ１に戻り、同様の処理を繰り返す。即ち、ノードｘが処理タスク２１ｄ、エッジαがエッジ２３ｈ、ノードｙがフレームメモリ２２ｃとなる。
【００５４】
この場合、ステップＳ１において、エッジ２３ｈに処理タスク２１ｄの画素位置情報が付加され、ステップＳ３において、ノードｙがフレームメモリ２２ａのため、NOと判定される。ステップＳ３において、NOと判定された場合、エッジαの画素位置情報から最大アクセス範囲の値を引いた値がノードｙの画素位置情報として設定され（ステップＳ９）、ステップＳ７に進む。図７では、エッジ２３ｈの画素位置情報の（０，０）から最大アクセス範囲の（１，１）を引いた値である（−１，−１）がフレームメモリ２２ｃの画素位置情報として設定される。
【００５５】
一方、ステップＳ２において、画素位置情報が設定されていると判定された場合、YESとなり、ノードｙが処理タスクか否かが判定される（ステップＳ１０）。ノードｙが処理タスクと判定された場合、YESとなり、エッジαの画素位置情報と、ノードｙの設定済み画素位置情報とを比較し、小さい方の値がノードｙの画素位置情報として設定され（ステップＳ１１）、ステップＳ５に進む。一方、ノードｙが処理タスクでないと判定された場合、NOとなり、エッジαの画素位置情報から最大アクセス範囲の値を引いた値と、ノードｙの設定済みの画素位置情報とを比較し、小さい方の値がノードｙの画素位置情報として設定され、ステップＳ７に進む。ステップＳ７において、ノードｙの入力次数１以上でないと判定された場合、処理を終了する。同様の処理を処理タスク２１ａまで実行すると、入力次数が０となり、処理を終了する。
【００５６】
図７において、フレームメモリ２２ａの画素位置情報は、処理タスク２１ｃの画素位置情報（−１，０）と、エッジ２３ｆの最大アクセス範囲（２，２）とに基づいて、（−３，−２）になる。しかし、処理タスク２１ａの画素位置情報は、フレームメモリ２２ｂ及びエッジ２３ｂの画素位置情報に基づいて、（−３，−３）になる。そのため、ステップＳ５の処理により、フレームメモリ２２ａ及びエッジ２３ａの画素位置情報は、それぞれ（−３，−３）に設定される。
【００５７】
この図６の処理は、例えば、図８に示す処理タスクが読み込みを行う画素位置と、処理タスクが書き込みを行う画素位置との関係性を、起点となる処理タスクを基準に求めていく処理である。
【００５８】
図８は、処理タスクの読み込み画素位置と書き込み画素位置との関係を説明するための説明図である。図８の例では、処理タスクの書き込み先のフレームメモリの画素位置 （Vaγ，Haγ）が（−２，−２）である時、処理タスクから、フレームメモリへのエッジの画素位置も、（−２，−２）となり、処理タスクの画素位置も（−２，−２）となる。さらに処理タスクからその入力エッジについて辿り、そのエッジの画素位置も（−２，−２）となる。そのエッジを出力しているノード、即ち、フレームメモリの画素位置は、（−２，−２）からエッジの最大アクセス範囲（１，１）を引き、図８に向かって左側のフレームメモリの画素位置（Vinγ，Hinγ）は、（−３，−３）と判定される。
【００５９】
このように、ある２つの処理タスク間の処理遅延量は、それぞれの対応する処理タスクのノードの画素位置の情報の差分に相当する。例えば、図７の処理タスク２１ｂの画素位置は（−１，−１）、処理タスク２１ｄの画素位置は（０，０）となっている。このため、処理タスク２１ｂと２１ｄとの間の処理遅延量は（１，１）となり、処理タスク２１ｂが、例えば、垂直方向座標が１０及び水平方向座標が１２の画素位置のデータを処理するパイプライン処理の周期では、処理タスク２１ｄは、それぞれ垂直方向座標が９及び水平方向座標が１１の画素位置のデータを処理するように実行すればよい。即ち、処理タスク２１ｄは、その処理中に画像位置（９，１１）から（＋１，＋１）の画素位置のデータを取得するが、取得するデータは、処理タスク２１ｂによって書き込み済みとなる。
【００６０】
次に、処理遅延量算出部としての処理遅延量解析部１６は、各処理タスク間の処理遅延量を各処理タスクが処理する各画素の状況に応じて判定する。具体的には、まず、入力次数が０のノード、つまり、読み込みを行わない処理タスクのノード、あるいは、書き込みが行われないフレームメモリのノードのうち、最小の画素位置情報を持つノードの画素位置を求める。図７の例では、入力次数が０のノードは、処理タスク２１ａのみで、その画素位置情報は、（−３，−３）である。そして、この画素位置情報と、次に実行される処理タスクの画素位置情報から、次に実行される処理タスクの処理遅延量を決定する。具体的には、処理遅延量解析部１６は、ある処理タスクの画素位置情報から次に実行される処理タスクの画素位置情報を減算して処理遅延量を算出する。
【００６１】
例えば、パイプライン実行する際の処理タスク２１ｂの処理遅延量は、処理タスク２１ａの画素位置情報（−３，−３）から処理タスク２１ｂの画素位置情報（−１，−１）を減算して得られる（−２，−２）となる。即ち、処理タスク２１ｂは、処理タスク２１ａが処理を実行する画素位置から、垂直座標方向に−２、 水平座標方向に−２ずれた画素位置を処理すればよいことになる。
【００６２】
次に、ラインメモリ量算出部としてのラインメモリ量判定部１７は、各フレームメモリをラインメモリとして確保した場合に必要となるラインメモリのサイズを算出する。このラインメモリ量判定部１７は、各処理タスクが読み込み先のフレームメモリのアクセス範囲に基づいて、各処理タスク毎に必要となるラインメモリのサイズを算出する。
【００６３】
図９は、必要となるラインメモリのサイズについて説明するための説明図である。必要となるラインメモリのサイズは、フレームメモリに設定された画素位置情報と、そのフレームメモリに対する読み込みエッジがもっとも遅れてアクセスする画素位置情報との差分から算出される。具体的には、以下のように求める。
【００６４】
算出するフレームメモリに対してアクセスされる最大の画素位置情報を得る。これはパイプライン実行する際にもっとも遅れて実行する処理タスクから、どれだけ先の画素位置のデータをメモリに保存しておく必要があるかを算出する手順となる。具体的には、フレームメモリのノードの全ての出力エッジについて、画素位置情報から最小アクセス範囲を減算し、その結果の最大値を求める。
【００６５】
図９の例では、フレームメモリ２２ａのエッジ２３ｆについては、画素位置情報（−１，０）から最小アクセス範囲（−２，−２）を減算し（１，２）を得る。また、フレームメモリ２２ａのエッジ２３ｃについては、画素位置情報（−１，−１）から最小アクセス範囲（−１，−１）を減算し（０，０）を得る。この結果、最大値は、（１，２）となる。
【００６６】
そして、ラインメモリ量判定部１７は、対応するフレームメモリ２２ａの画素位置情報と、この最大値の結果の差分を求める。図９例では、（１，２）−（−３，−３）により、（４，５）を得る。
【００６７】
この結果の垂直方向座標の値が必要なライン数となり、水平方向座標の値に１を足した値が必要な画素数となる。図９の例では、フレームメモリ２２ａの必要なラインメモリのサイズは４ラインと６画素分になる。
【００６８】
このように、接続関係グラフ生成部１１〜ラインメモリ量判定部１７の各処理により、各処理タスクをパイプライン実行する際の各処理タスク間の処理遅延量、各処理タスク間で授受されるデータを格納するラインメモリのサイズが判定される。命令コード変換部としてのパイプライン化部１８は、これらの処理遅延量及びラインメモリのサイズに基づいて、各処理タスクがパイプライン実行されるような命令コードを生成する。
【００６９】
具体的には、各処理タスクがパイプライン実行されない場合、ある処理タスクを全画素について実行した後、次の処理タスクを実行する処理を、図１０に示す処理に変更する。
【００７０】
図１０は、パイプライン化部の処理の流れの例を説明するためのフローチャートである。
【００７１】
まず、各処理タスクが処理を実行する画素位置（Ｖ，Ｈ）が適切に初期化される（ステップＳ２１）。ここで、画素位置が適切に初期化されるとは、処理遅延量解析部１６によって得られた処理遅延量を画素位置に付加することである。次に、（Ｖｘ，Ｈｘ）の画素位置について、処理タスクｘの処理が実行され（ステップＳ２２）、（Ｖｙ，Ｈｙ）の画素位置について、処理タスクｙの処理が実行される（ステップＳ２３）。なお、ステップＳ２２及びＳ２３では、各処理タスクが処理を実行する画素位置が適切な位置、ここでは、画像サイズ内に収まっている時にのみ実行するようにする。
【００７２】
次に、各処理タスクが処理を実行する画素位置（Ｖ，Ｈ）がラスタスキャン順にインクリメントされる（ステップＳ２４）。最後に、全処理タスクの処理の実行が終了したか否かが判定される（ステップＳ２５）。全処理タスクの処理の実行が終了していないと判定された場合、NOとなり、ステップＳ２２に戻り、同様の処理を繰り返す。一方、全処理タスクの処理の実行が終了したと判定された場合、YESとなり、処理を終了する。 
なお、図１０のフローチャートでは、２つの処理タスクをパイプライン実行する場合について説明したが、３つ以上の処理タスクをパイプライン実行するようにしてもよい。この場合、３つ以上の処理タスクの実行をステップＳ２１とステップＳ２４の間に入れるように図１０のフローチャートを変更すればよい。
【００７３】
また、パイプライン化部１８は、フレームメモリとして確保されていた領域を、それぞれ、ラインメモリとして確保するように変更する。各ラインメモリのサイズは、対応するフレームメモリのノードにおいて、ラインメモリ量判定部１７により判定されたサイズを確保する。 
そして、パイプライン化部１８は、各処理タスクがフレームメモリへ書き込むデータアクセスを、確保した対応するラインメモリに対し行うようにストア先アドレスを変更する。
【００７４】
ラインメモリ中のどのアドレスに書き込むかは、以下のように判定する。フレームメモリを利用している場合に処理タスクｘがデータを書き込むアドレスは、フレームメモリの先頭から （Vx×画像の横幅＋Hx）×１画素あたりのバイト数だけ進んだアドレス、即ち、フレームメモリでのオフセットアドレスの位置となる。
【００７５】
ラインメモリのサイズは、NラインとM画素のサイズで確保されている場合、（N×画像の横幅 + M）×１画素あたりのバイト数となる。
【００７６】
ラインメモリを利用する場合の書き込み先のアドレスは、フレームメモリでのオフセットアドレスをラインメモリのサイズで割った余りの値となる。
【００７７】
また、パイプライン化部１８は、各処理タスクがフレームメモリから読み込むデータアクセスも、確保した対応するラインメモリに対し行うようにロード先アドレスを変更する。
【００７８】
ラインメモリ中のどのアドレスから読み込むかは、以下のように判定する。フレームメモリを利用している場合に処理タスクｘが、Voffset,Hoffset位置だけVx、Hxからずれた位置のデータを読み込む場合、そのアドレスは、フレームメモリの先頭から（（Vx＋Voffset）×画像の横幅 + （Hx＋Hoffset））×１画素あたりのバイト数だけ進んだアドレス、即ち、フレームメモリでのオフセットアドレスの位置となる。
【００７９】
ラインメモリのサイズは、NラインとM画素のサイズで確保されている場合、（N×画像の横幅＋M）×１画素あたりのバイト数となる。
【００８０】
ラインメモリを利用する場合に読み込むアドレスは、フレームメモリでのオフセットアドレスをラインメモリのサイズで割った余りの値となる。
【００８１】
以上のように、コンパイル装置１は、フレームメモリを利用するように記述されたソースファイルから処理遅延量及び必要なラインメモリのサイズを算出し、パイプライン実行するオブジェクトファイルを生成するようにした。この結果、ユーザは、パイプライン実行を行なう際に必要となる処理遅延量及び必要なラインメモリを算出する必要がなくなる。
【００８２】
よって、本実施の形態のコンパイル装置によれば、フレームメモリを利用するように記述されたソースファイルから処理遅延量及び必要なラインメモリのサイズ抽出することで開発効率を向上することができる。
【００８３】
（第２の実施の形態）
次に、第２の実施の形態について説明する。第２の実施の形態では、第１の実施の形態のコンパイル装置１によって得られる各処理タスクの実行内容のみを含む命令列、処理遅延量及び必要なラインメモリのサイズを受け取り、処理を実行する画像処理プロセッサについて説明する。
【００８４】
図１１は、第２の実施の形態に係る画像処理プロセッサの構成を示すブロック図である。  
図１１に示すように、画像処理プロセッサ３１は、画像入力ユニット４１と、命令メモリ４２と、相対位置レジスタ４３と、命令フェッチ／デコードユニット４４と、メモリアクセスユニット４５と、データメモリ４６と、演算器４７とを有する。また、画像入力ユニット４１は、画像入力位置カウンタ４８を有する。命令フェッチ／デコードユニット４４は、画素位置計算ユニット４９と、命令デコーダ５０とを有する。
【００８５】
本実施の形態の画像処理プロセッサ３１は、第１の実施の形態の処理遅延量解析部１６によって得られた処理遅延量を相対位置レジスタ４３に設定する。また、本実施の形態の画像処理プロセッサ３１は、第１の実施の形態のラインメモリ量判定部によって得られたラインメモリのサイズに応じ、データメモリ４６上に必要な領域を確保する。
【００８６】
画像入力ユニット４１には、図示しない入力センサ等から入力画像データが供給される。画像入力ユニット４１の画像入力位置カウンタ４８は、入力画像データおける画素位置をカウントし、このカウント値を画素位置計算ユニット４９に出力する。また、画像入力位置カウンタ４８は、入力画像データに応じ画素位置をラスタスキャン順にインクリメントする。
【００８７】
命令メモリ４２には、第１の実施の形態のコンパイル装置１によって得られる各処理タスクの実行内容のみを含む命令列が格納される。ラインメモリ領域へのロード命令は、各命令が処理する画素位置を中心に、どの位置だけずれた値を参照するかによってアクセス先が指定されている。また、ラインメモリ領域へのストア命令は、アクセス先のラインメモリ領域を一意に決めるラインメモリ領域情報を含む。書き込み先のアドレスは、画素位置計算ユニット４９によって算出された画素位置となる。なお、図１０のステップＳ２１、Ｓ２４及びＳ２５の処理は、画像処理プロセッサ３１で自動に行うため、この命令列には、図１０のステップＳ２２及びＳ２２の処理のみが含まれる。
【００８８】
命令メモリ４２に格納される各命令列は、相対位置レジスタ４３を参照するためのレジスタ番号を有している。このレジスタ番号は、相対位置レジスタ４３に入力され、レジスタ番号によって指定された処理遅延量が画素位置計算ユニット４９に入力される。
【００８９】
命令フェッチ／デコードユニット４４は、命令メモリ４２に格納されている命令をフェッチする。画素位置計算ユニット４９は、画像入力位置カウンタ４８の値から相対位置レジスタ４３の値を引いて、その命令が処理する画素位置（Vx，Hx）を算出する。画素位置計算ユニット４９は、この画素位置（Vx，Hx）の情報をメモリアクセスユニット４５に出力する。
【００９０】
命令デコーダ５０は、命令メモリから入力される命令をデコードし、デコードした命令及びロードストアアクセス情報をそれぞれ演算器４７及びメモリアクセスユニット４５に出力する。
【００９１】
メモリアクセスユニット４５は、命令デコーダ５０から入力されるロードストアアクセス情報の内容に基づいて、第１の実施の形態のパイプライン化部１８で行っているストア先アドレスへの変換を行い、ストアデータをデータメモリ４６に書き込む。また、メモリアクセスユニット４５は、命令デコーダ５０から入力されるロードストアアクセス情報の内容に基づいて、第１の実施の形態のパイプライン化部１８で行なっているロード先アドレスへの変換を行い、データメモリ４６からデータを読み出し演算器４７に出力する。
【００９２】
演算器４７は、メモリアクセスユニット４５からのロードデータに命令デコーダから出力された命令を実行し、実行結果をストアデータとしてメモリアクセスユニット４５に出力する。
【００９３】
以上の構成により、画像処理プロセッサ３１は、第１の実施の形態のコンパイル装置１によって得られる各処理タスクの実行内容のみを含む命令列、処理遅延量及び必要なラインメモリのサイズを受け取り、処理を実行することができる。
【００９４】
なお、本明細書におけるフローチャート中の各ステップは、その性質に反しない限り、実行順序を変更し、複数同時に実行し、あるいは実行毎に異なった順序で実行してもよい。
【００９５】
また、以上説明した動作を実行するプログラムは、コンピュータプログラム製品として、フレキシブルディスク、ＣＤ−ＲＯＭ等の可搬媒体や、ハードディスク等の記憶媒体に、その全体あるいは一部が記録され、あるいは記憶されている。そのプログラムがコンピュータにより読み取られて、動作の全部あるいは一部が実行される。あるいは、そのプログラムの全体あるいは一部を通信ネットワークを介して流通または提供することができる。利用者は、通信ネットワークを介してそのプログラムをダウンロードしてコンピュータにインストールしたり、あるいは記録媒体からコンピュータにインストールすることで、容易に本発明のコンパイル装置を実現することができる。
【００９６】
本発明は、上述した実施の形態に限定されるものではなく、本発明の要旨を変えない範囲において、種々の変更、改変等が可能である。
【符号の説明】
【００９７】
１…コンパイル装置、１１…接続関係グラフ生成部、１２…アクセス範囲抽出部、１３…アクセス範囲情報付加部、１４…基準ノード決定部、１５…画素位置解析／付加部、１６…処理遅延量解析部、１７…ラインメモリ量判定部、１８…パイプライン化部、２１ａ〜２１ｄ…処理タスク、２２ａ〜２２ｅ…フレームメモリ、２３ａ〜２３ｊ…エッジ、３１…画像処理プロセッサ、４１…画像入力ユニット、４２…命令メモリ、４３…相対位置アドレス、４４…命令フェッチ／デコードユニット、４５…メモリアクセスユニット、４６…データメモリ、４７…演算器、４８…画像入力位置カウンタ、４９…画素位置計算ユニット、５０…命令デコーダ、１００…情報処理システム、１０１…本体装置、１０２…記憶装置、１０３…表示装置、１０４…キーボード、１０５…マウス、１０６…コンパイラ、１０７…ソースファイル、１０８…オブジェクトファイル。
【図１】
2011118752.tif 000003
【図２】
2011118752.tif 000004
【図３Ａ】
2011118752.tif 000005
【図３Ｂ】
2011118752.tif 000006
【図４】
2011118752.tif 000007
【図５】
2011118752.tif 000008
【図６】
2011118752.tif 000009
【図７】
2011118752.tif 000010
【図８】
2011118752.tif 000011
【図９】
2011118752.tif 000012
【図１０】
2011118752.tif 000013
【図１１】
2011118752.tif 000014