(57)【要約】【課題】画像の１行分のデータである行データを対象とした処理指定を含むソースコードから高速な画像処理用ＳＩＭＤ命令シーケンスを自動生成する。【解決手段】翻訳部３は、画像の１行分のデータである行データを単位に行われる処理指定（行単位処理指定、行データ抽出指定、ブロードキャスト指定）を用いて記述されたソースコード１を入力し、構文解析、最適化を行い、ＳＩＭＤ命令セットの利用を考慮した中間形式であるＳＩＭＤマクロコード４を生成する。簡略化部５は、ＳＩＭＤマクロコード４から同一仮想ＳＩＭＤレジスタに対する定義と参照の関係にある一連のコードを一つにまとめた複合マクロコードに変換した簡略化ＳＩＭＤマクロコード６を生成する。マシンコード生成部７は、簡略化ＳＩＭＤマクロコード６からＳＩＭＤ命令を効率良く使用したマシンコード８を生成する。【選択図】  図１
2004164163.tif 000002
【特許請求の範囲】
【請求項１】
画像の１行分のデータである行データを単位に行われる処理指定を用いて記述されたソースコードからＳＩＭＤ命令シーケンスを自動生成することを特徴とするＳＩＭＤ命令シーケンス生成方法。
【請求項２】
前記行データの全要素データに対し同一の単項演算、あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を行う指定である行単位演算指定、及び前記行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する動作を行う指示である行単位近隣要素参照指定、の両方を組合せた行単位処理指定を用いて記述されたソースコードからＳＩＭＤ命令シーケンスを自動生成することを特徴とするＳＩＭＤ命令シーケンス生成方法。
【請求項３】
前記行単位処理指定に加え、行データ内の特定の要素データを参照する行データ抽出指定、特定の単一データであるスカラーデータを行データの全データ要素に代入するブロードキャスト指定、およびスカラーデータに対する処理指定であるスカラー処理指定の３種類の指定を組合せた行単位動作指定を用いて記述されたソースコードからＳＩＭＤ命令シーケンスを自動生成することを特徴とするＳＩＭＤ命令シーケンス生成方法。
【請求項４】
前記行単位動作指定に含まれるスカラー処理指定に対しては、指定通りの動作を行う命令シーケンスを生成し、行単位処理指定に対しては、処理対象の行データを構成する先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ（処理対象画像の横幅画素数）個のデータ要素のうちのＳ×Ｍ個（Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数）を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象とした演算に必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされた連続したアドレスを持つメモリ領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスを生成することを特徴とする請求項１、２または３記載のＳＩＭＤ命令シーケンス生成方法。
【請求項５】
行データの全要素データに対し同一の単項演算、あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を行う指定である行単位演算指定、及び前記行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する動作を行う指示である行単位近隣要素参照指定、の両方を組合せた行単位処理指定、行データ内の特定の要素データを参照する行データ抽出指定、特定の単一データであるスカラーデータを行データの全データ要素に代入するブロードキャスト指定、およびスカラーデータに対する処理指定であるスカラー処理指定を組合せた行単位動作指定を用いて記述されたソースコードを第１の記憶装置から入力し、構文解析、最適化を行い、ＳＩＭＤ命令セットの利用を考慮した中間形式であるＳＩＭＤマクロコードを生成し、第２の記憶装置へ出力する翻訳ステップと、
前記第２の記憶装置から前記ＳＩＭＤマクロコードを入力し、仮想ＳＩＭＤレジスタをオペランドに持つコード全体に対し、仮想ＳＩＭＤレジスタに対する定義と参照の関係を解析し、その解析結果に基づき、同一仮想ＳＩＭＤレジスタに対する定義と参照の関係にある一連のコードを一つにまとめた複合マクロコードに変換した簡略化ＳＩＭＤマクロコードを生成し、第３の記憶装置へ出力する簡略化ステップと、
前記第３の記憶装置から前記簡略化ＳＩＭＤマクロコードを入力し、前記行単位動作指定に含まれるスカラー処理指定に対しては、指定通りの動作を行う命令シーケンスを生成し、行単位処理指定に対しては、処理対象の行データを構成する先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ（処理対象画像の横幅画素数）個のデータ要素のうちのＳ×Ｍ個（Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数）を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象とした演算に必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされた連続したアドレスを持つメモリ領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスを生成するマシンコード生成ステップと、
を含むＳＩＭＤ命令シーケンス生成方法。
【請求項６】
行データの全要素データに対し同一の単項演算、あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を行う指定である行単位演算指定、及び前記行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する動作を行う指示である行単位近隣要素参照指定、の両方を組合せた行単位処理指定、行データ内の特定の要素データを参照する行データ抽出指定、特定の単一データであるスカラーデータを行データの全データ要素に代入するブロードキャスト指定、およびスカラーデータに対する処理指定であるスカラー処理指定を組合せた行単位動作指定を用いて記述されたソースコードを記憶する第１の記憶装置と、前記第１の記憶装置から前記ソースコードを入力し、構文解析、最適化を行い、ＳＩＭＤ命令セットの利用を考慮した中間形式であるＳＩＭＤマクロコードを生成する翻訳手段と、
前記翻訳手段で生成された前記ＳＩＭＤマクロコードを記憶する第２の記憶装置と、
前記第２の記憶装置から前記ＳＩＭＤマクロコードを入力し、仮想ＳＩＭＤレジスタをオペランドに持つコード全体に対し、仮想ＳＩＭＤレジスタに対する定義と参照の関係を解析し、その解析結果に基づき、同一仮想ＳＩＭＤレジスタに対する定義と参照の関係にある一連のコードを一つにまとめた複合マクロコードに変換した簡略化ＳＩＭＤマクロコードを生成する簡略化手段と、
前記簡略化手段で生成された前記簡略化ＳＩＭＤマクロコードを記憶する第３の記憶装置と、
前記第３の記憶装置から前記簡略化ＳＩＭＤマクロコードを入力し、前記行単位動作指定に含まれるスカラー処理指定に対しては、指定通りの動作を行う命令シーケンスを生成し、行単位処理指定に対しては、処理対象の行データを構成する先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ（処理対象画像の横幅画素数）個のデータ要素のうちのＳ×Ｍ個（Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数）を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象とした演算に必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされた連続したアドレスを持つメモリ領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスを生成するマシンコード生成手段と、
前記マシンコード生成手段で生成された命令シーケンスであるマシンコードを記憶する第４の記憶装置と、
を備えることを特徴とするＳＩＭＤ命令シーケンス生成装置。
【請求項７】
コンピュータを、
行データの全要素データに対し同一の単項演算、あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を行う指定である行単位演算指定、及び前記行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する動作を行う指示である行単位近隣要素参照指定、の両方を組合せた行単位処理指定、行データ内の特定の要素データを参照する行データ抽出指定、特定の単一データであるスカラーデータを行データの全データ要素に代入するブロードキャスト指定、およびスカラーデータに対する処理指定であるスカラー処理指定を組合せた行単位動作指定を用いて記述されたソースコードを第１の記憶装置から入力し、構文解析、最適化を行い、ＳＩＭＤ命令セットの利用を考慮した中間形式であるＳＩＭＤマクロコードを生成し、第２の記憶装置へ出力する翻訳手段、
前記第２の記憶装置から前記ＳＩＭＤマクロコードを入力し、仮想ＳＩＭＤレジスタをオペランドに持つコード全体に対し、仮想ＳＩＭＤレジスタに対する定義と参照の関係を解析し、その解析結果に基づき、同一仮想ＳＩＭＤレジスタに対する定義と参照の関係にある一連のコードを一つにまとめた複合マクロコードに変換した簡略化ＳＩＭＤマクロコードを生成し、第３の記憶装置へ出力する簡略化手段、
前記第３の記憶装置から前記簡略化ＳＩＭＤマクロコードを入力し、前記行単位動作指定に含まれるスカラー処理指定に対しては、指定通りの動作を行う命令シーケンスを生成し、行単位処理指定に対しては、処理対象の行データを構成する先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ（処理対象画像の横幅画素数）個のデータ要素のうちのＳ×Ｍ個（Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数）を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象とした演算に必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされた連続したアドレスを持つメモリ領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスを生成するマシンコード生成手段、
として機能させるＳＩＭＤ命令シーケンス生成用プログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、マルチメディア処理を高速化するためにＳＩＭＤ（Ｓｉｎｇｌｅ  Ｉｎｓｔｒｕｃｔｉｏｎ  Ｍｕｌｔｉ  Ｄａｔａ）命令と呼ばれる拡張された命令セットを有する計算機を対象に、ＳＩＭＤ命令シーケンスを生成する方法および装置ならびにＳＩＭＤ命令シーケンスを生成するプログラムに関する。
【０００２】
【従来の技術】
画像などのマルチメディアデータに対する処理では、固定的なフォーマットのデータに対して同じ種類の演算を繰り返し適用することが多い。そこで、１つの命令で多量のデータに対して同じ種類の演算を一斉に行うようにして、計算機全体のデータ処理能力を高めるためにＳＩＭＤ命令と呼ばれる命令を備えるようにした計算機が実用化されている。
【０００３】
ＳＩＭＤで扱われるデータの形式や命令セットは、計算機のアーキテクチャ毎に異なるが、一般的には、１命令で６４ビットや１２８ビットのデータに対して、一度に処理を行うことができるようになっている。このデータ幅の中に、８ビット、１６ビット、３２ビットの整数型データか、３２ビット、６４ビットの浮動小数点型データを複数詰め込み、１命令ですべてのデータに対して同時に処理を行う。例えば、８ビットの整数型データなら１２８ビットの中に１６個格納できるので、画像処理ソフトウェアなどでは、一度に１６画素分の処理ができ、ＳＩＭＤ命令の使用は特に画像処理の高速化に対して有効である。ＳＩＭＤで実行可能な命令としては、加減乗除算、アンドやオアなどの論理演算、マスク演算、飽和演算、積和演算、内積演算、最大／最小値、絶対値、平均値などがある。
【０００４】
代表的なＳＩＭＤ命令セットの例としては、Ｐｅｎｔｉｕｍ（登録商標）アーキテクチャにおけるＭＭＸテクノロジーやＳｔｒｅａｍｉｎｇ  ＳＩＭＤ命令、ＡＭＤ  Ｋ６／Ｋ７における３Ｄｎｏｗ！、ＰｏｗｅｒＰＣアーキテクチャのＡｌｔｉＶｅｃ、ＭＩＰＳプロセッサにおけるＭＤＭＸ、ＳＰＡＲＣアーキテクチャのＶＩＳなどがある。
【０００５】
ＳＩＭＤ命令セットを有する計算機向けのプログラムを能率的に開発するには、ＳＩＭＤ命令を含んだプロセッサ命令シーケンスの生成が必要である。このために後述する特許文献１では、複数の配列データに対する演算処理が逐次的に記述されたソースプログラムからＳＩＭＤ化可能なループ構造を抽出し、それらをＳＩＭＤ命令を用いたループ構造に変換することで、ＳＩＭＤ命令セットを用いて各配列要素を演算処理するような目的プログラムを生成するコンパイラ（ＳＩＭＤ化コンパイラ）が提案されている。
【０００６】
【特許文献１】
特開平１０−２２８３８２号公報
【０００７】
【発明が解決しようとする課題】
特許文献１に記載されるコンパイラによれば、Ｃ言語等の高級言語で記述された逐次処理プログラムからＳＩＭＤ命令セットを有する計算機向けの目的プログラムを自動的に生成することができる。しかし、逐次処理プログラムを解析してＳＩＭＤ化可能な部分を機械的に抽出する技術は未だ成熟しておらず、限界がある。このため、特に画像のフィルタ処理など複雑な処理が含まれる逐次処理プログラムをＳＩＭＤ化コンパイラにかけても充分なＳＩＭＤ化が行われず、ＳＩＭＤ命令セットを効率良く利用した目的プログラムを生成することができない。このようなことから、ＳＩＭＤ命令セットを利用した目的プログラムの生成は、手作業でのアセンブリ言語による作成に頼っているのが現状である。
【０００８】
しかし手作業でのアセンブリ言語作成は高い熟練度と長い時間を必要とし、かつ命令シーケンス内にエラーが導入されてしまう可能性が高いといった問題点が存在していた。また手作業でアセンブリ指定を作成する方法は、異なるタイプのプロセッサ（例えばインテルのペンティアム（登録商標）ＩＩ、ＩＩＩ、４、ＡＭＤのＫ−６、Ｋ−７など）では各々に異なるＳＩＭＤ命令セットを使用する（例えばＭＭＸ，ＳＳＥ，３ＤＮｏｗ等）ため、ターゲットプロセッサが代わる度に別個のアセンブリ指定を用意しなければならないという問題点も存在していた。
【０００９】
【発明の目的】
本発明はこのような事情に鑑みて提案されたものであり、その目的は、高級言語による画像処理指定から、効率のよい画像処理用ＳＩＭＤ命令シーケンスを生成する方法と装置を提供することにある。
【００１０】
【課題を解決するための手段】
本発明は、画像の１行分のデータである行データを単位に行われる処理指定を用いて記述されたソースコードからＳＩＭＤ命令シーケンスを自動生成することを基本とする。より具体的には、先頭が２のべき乗値にアラインされた連続アドレスに存在するＰ個のデータ要素を行データ、１つの行データの全要素データに対し同一の単項演算あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を実施する指定を行単位演算指定、行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する指定を行単位近隣要素参照指定、行単位演算指定および行単位近隣要素参照指定の両方をまとめて行単位処理記述、行データの特定の要素データを参照する指定を行データ抽出指定、特定の単一データであるスカラーデータを行データの全データ要素に代入する指定をブロードキャスト指定、従来からのスカラーデータに対する処理指定をスカラー処理指定と呼び、また、行単位処理指定、行データ抽出指定、ブロードキャスト指定、そしてスカラー処理指定の４種類を組合せた動作指定方法を行単位動作指定と呼び、そしてＳＩＭＤ命令が演算に用いるワークレジスタをＳＩＭＤレジスタと呼ぶとき、本発明では、行単位動作指定を用いてソースコードが記述されており、本発明のＳＩＭＤ命令シーケンス生成方法および装置では、かかるソースコードから、ターゲットマシンが有するＳＩＭＤ命令セットを利用したＳＩＭＤ命令シーケンスを自動生成するコンパイル処理を行う。
【００１１】
このコンパイル処理では、行単位動作指定に含まれるスカラー処理指定に対しては、従来法で指定通りの動作を行う命令シーケンスＡを生成し、行単位動作指定に含まれる行単位処理指定に対しては、処理対象の行データを構成し、先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ個のデータ要素のうちのＳ×Ｍ個を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象に演算を行う必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされたメモリ上の連続したアドレス領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスＢを生成するように動作する。但しＰは処理対象画像の横幅画素数、Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でありＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数である。
【００１２】
さらに本発明においては、行単位動作指定に含まれる行データ抽出指定に対しては、ＳＩＭＤ命令シーケンスＢ内で定義したデータを命令シーケンスＡ内で参照する動作を指定する命令シーケンスＣを、そしてブロードキャスト指定に対しては、命令シーケンスＡ内で定義したデータを命令シーケンスＢ内で参照する動作を指定する命令シーケンスＤを、それぞれ生成するように動作する。
【００１３】
【作用】
本発明にあっては、画像の１行分のデータである行データを単位に行われる処理指定、具体的には行単位処理指定、行データ抽出指定、ブロードキャスト指定を用いて記述されたソースコードから、ＳＩＭＤ命令シーケンスを生成する。従って、利用者は、行単位処理指定、行データ抽出指定、ブロードキャスト指定を用いてＳＩＭＤ化可能な部分を明示したソースコードを作成するだけで、ＳＩＭＤ命令セットを効率良く利用した目的プログラムを生成することができる。
【００１４】
【発明の実施の形態】
次に、本発明の実施の形態について図面を参照して詳細に説明する。
【００１５】
図１は本発明の画像処理用ＳＩＭＤ命令シーケンスの生成方法を実施する計算機の実施の形態の全体構成を示すブロック図である。図１に示すように、本実施の形態にかかる計算機は、プログラム制御によって動作する処理装置１０１と、この処理装置１０１に接続された主記憶や補助記憶装置で構成される記憶装置１０２、記憶装置１０３および記憶装置１０４と、記録媒体１０５とを備えている。
【００１６】
記憶装置１０３にはソースコード１が記憶されている。ソースコード１は、Ｃ言語などの汎用的な高級プログラミング言語の仕様を一部拡張し、画像の１行分のデータである行データを単位に行われる処理指定を追加した言語で記述されている。ここで、行データは、先頭が２のべき乗値にアラインされた連続アドレスに存在するＰ個のデータ要素を意味する。追加された処理指定は、行単位処理指定、行データ抽出指定、ブロードキャスト指定の３種類に大別され、行単位処理指定はさらに行単位演算指定と行単位近隣要素参照指定とに分けられる。
【００１７】
行単位演算指定は、１つの行データの全要素データに対し同一の単項演算あるいは２つの行データそれぞれの対応データ要素ペアの全てに対し同一の二項演算を実施する指定である。行単位近隣要素参照指定は、行データの全データ要素について個々の位置からみて左側あるいは右側から指定要素数だけ離れたデータ要素を参照する指定である。行データ抽出指定は、行データの特定の要素データを参照する指定である。ブロードキャスト指定は、特定の単一データであるスカラーデータを行データの全データ要素に代入する指定である。行単位処理指定、行データ抽出指定およびブロードキャスト指定と、従来からのスカラーデータに対する処理指定であるスカラー処理指定との４種類の指定を組合せた動作指定方法を行単位動作指定と呼び、ソースコード１は行単位動作指定を用いて記述されている。
【００１８】
図２に行単位動作指定を用いたソースコード１の一例として、画像処理で良く行われるフィルタ処理を記述した例を示す。図２に示すソースコード１は、従来のＣ言語の文法に、行データであるかどうかを宣言するためのキーワードｓｅｐを追加した文法のものを用いている。１行から３行ではｓｒｃとｄｓｔという、それぞれソース画像、結果画像を格納するための行データ配列の先頭を指すポインタを、関数ｔｓｔの引数として宣言している。４行のｌｉｎｅｓは処理行数を表す符号無しのＳＨＯＲＴ型（２バイト）のスカラー値であり、関数ｔｓｔの３番目の引数として与えられている。６行では２バイトの整数型変数ｉを宣言し、８行では、差の絶対値を求める関数＿ａｓｕｂの引数と戻り値を宣言し、９行〜１０行において符号無し１バイトのキャラクタ型行データである変数ｐ１、ｐ４、そしてｐｐを宣言している。１２行から１７行では、従来のＣ言語の文法と同様のＦＯＲ文によるループ動作を指定し、ループ本体は行データの配列であるｓｒｃと行データであるｐ１、ｐ４を用いた演算を指定している。例えば１３行は行データの配列ｓｒｃの第ｉ−１番目の行データをｐ１に代入する動作を指定し、１４行は行データの配列ｓｒｃの第ｉ＋１番目の行データをｐ４に代入する動作を指定し、１５行ではｐ１、ｐ４の２つの行データを引数に、行データを戻り値とする関数＿ａｓｕｂを呼出し、結果を行データ変数ｐｐに格納する動作を指定している。
【００１９】
そして、図２の１６行には、行単位近隣要素参照指定と行単位演算指定とが用いられている。１６行中の、：＞、：＜が行単位近隣要素参照指定の一形式であり、例えば、：＞ＰＰ、：＜ＰＰはそれぞれ、行データ変数ＰＰの全要素データについて、一つ左隣、一つ右隣の要素データへの参照を意味する。一つ隣の場合は指定要素数は１なので省略してあるが、２つ以上離れた要素データを参照する場合には、何個離れた要素データを参照するかを指定要素数で指定する。また、：＞ＰＰ＋：＜ＰＰにおける＋、：＜ＰＰ＋（ＰＰ＜＜１）における＋、＜＜（シフト演算）が行単位演算指定になる。ここでは、加算とシフト演算が例示されているが、行単位演算指定のできる演算の種類はそれらに限定されない。
【００２０】
また１９行はブロードキャスト指定であり、ｌｉｎｅｓの値を行データ配列ｄｓｔの第０行目と第ｌｉｎｅｓ−１行目の全要素データに代入する端部処理の動作を意味する。
【００２１】
更に２０行は行データ抽出指定であり、ソース画像が格納されている行データ配列ｓｒｃの第２行目の３つ目の要素データへの参照を指定し、参照した結果をｒｅｔｕｒｎ文のパラメータとして用いるよう指定している。
【００２２】
再び図１を参照すると、記録媒体１０５は、ＣＤ−ＲＯＭや磁気ディスクなどのコンピュータ読み取り可能な記録媒体であり、ＳＩＭＤ命令シーケンス生成プログラムを記録する。記録媒体１０５に記録されたＳＩＭＤ命令シーケンス生成プログラムは、処理装置１０１によって読み取られ、処理装置１０１の動作を制御することにより、処理装置１０１上にコンパイラ２を実現する。
【００２３】
コンパイラ２は、行単位動作指定を用いたソースコード１を記憶装置１０３から入力し、ターゲットマシンが有するＳＩＭＤ命令セットを利用したＳＩＭＤ命令シーケンスを自動生成する。この際コンパイラ２は、ソースコード１に含まれる行単位動作指定に関しては概ね以下のような処理を行う。
【００２４】
コンパイラ２は、ソースコード１に含まれるスカラー処理指定に対しては、従来法で指定通りの動作を行う命令シーケンスＡを生成する。
【００２５】
コンパイラ２は、ソースコード１に含まれる行単位処理指定に対しては、処理対象の行データを構成し、先頭が２のべき乗値にアラインされたメモリ上の連続アドレスに存在するＰ個のデータ要素のうちのＳ×Ｍ個を、Ｍ個のＳＩＭＤレジスタにロードするためのＭ個のＳＩＭＤロード命令と、続けて当該Ｍ個のＳＩＭＤレジスタを対象に演算を行う必要数だけのＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果データを格納したＭ個のＳＩＭＤレジスタの内容を、先頭が２のべき乗値にアラインされたメモリ上の連続したアドレス領域にライトするためのＭ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定するＳＩＭＤ命令シーケンスＢを生成する。ここで、ＳＩＭＤレジスタとはＳＩＭＤ命令が演算に用いるワークレジスタを意味する。また、Ｐは処理対象画像の横幅画素数、Ｓは一つのＳＩＭＤ命令が同時に処理できる要素データ数でありＰよりも小さい値、Ｍはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上の整数である。行単位処理指定に対してこのようなＳＩＭＤ命令シーケンスを生成するのは、一つのＳＩＭＤ命令はＳ個の単位データを並列に処理でき、そのＳ個の単位データは一つのＳＩＭＤレジスタに格納されており、ＳＩＭＤレジスタをループ本体内でＭ個用いているので、（Ｓ×Ｍ）個の単位データを１回の繰り返しで処理でき、従って、全単位データ数がＰなので、Ｐ÷（Ｓ×Ｍ）回繰り返すことで、全単位データ数に対する処理が完了するからである。
【００２６】
またコンパイラ２は、ソースコード１に含まれる行データ抽出指定に対しては、ＳＩＭＤ命令シーケンスＢ内で定義したデータを命令シーケンスＡ内で参照する動作を指定する命令シーケンスＣを、そしてブロードキャスト指定に対しては、命令シーケンスＡ内で定義したデータを命令シーケンスＢ内で参照する動作を指定する命令シーケンスＤを、それぞれ生成する。
【００２７】
以下、コンパイラ２の詳細な構成と動作を説明する。
【００２８】
コンパイラ２は、記録装置１０３に記憶されたソースコード１を入力し、最終的にＳＩＭＤ命令シーケンスを含む目的プログラムであるマシンコード８に変換して、記憶装置１０４に出力する。このためにコンパイラ２は、記憶装置１０３からソースコード１を入力し、このソースコード１をＳＩＭＤ命令シーケンス生成用の中間形式であるＳＩＭＤマクロコード４に変換して、記憶装置１０２の記憶部１０８に出力する翻訳部３と、記憶部１０８からＳＩＭＤマクロコード４を入力し、このＳＩＭＤマクロコード４に対し最適化を実施して、最適化されたＳＩＭＤマクロコードである簡略化ＳＩＭＤマクロコード６を生成し、記憶装置１０２の記憶部１０９に出力する簡略化部５と、記憶部１０９から簡略化ＳＩＭＤマクロコード６を入力し、この簡略化ＳＩＭＤマクロコード６を目的プログラムであるマシンコード８に変換して記憶装置１０４に出力するマシンコード生成部７とを含んで構成されている。
【００２９】
また翻訳部３は、記憶装置１０３からソースコード１を入力し、その構文を解析して中間言語コード１１−１に変換し、記憶装置１０２の記憶部１０６に出力する構文解析部１０と、記憶部１０６から中間言語コード１１−１を入力し、定数伝搬、複写伝搬、演算強度軽減、そして共通部分式削除などの既存の最適化手法を適用し、最適化された中間言語コード１１−２を記憶装置１０２の記憶部１０７に出力する最適化処理部１２と、記憶部１０７から最適化された中間言語コード１１−２を入力し、ＳＩＭＤ命令セットの利用を考慮した中間形式であるＳＩＭＤマクロコード４に変換して記憶部１０８に出力するマクロコード生成部１３とを含んで構成されている。
【００３０】
図３はコンパイラ２の全体処理の流れを示すフローチャートである。以下、図３に示される流れに沿ってコンパイラ２の動作を説明する。
【００３１】
コンパイラ２は、翻訳部３の構文解析部１０により、記憶装置１０３からソースコード１を入力して構文解析し、中間言語コード１１−１を生成して記憶部１０６に格納する（Ｓ１０１）。次に、最適化処理部１２により、記憶部１０６から中間言語コード１１−１を入力して、定数伝搬、複写伝搬、演算強度軽減、共通部分式削除などの既知の最適化手法を適用し、最適化された中間言語コード１１−２を記憶部１０７に保存する（Ｓ１０２）。
【００３２】
図４に、図２のソースコード１を入力とした場合に翻訳部３内の最適化処理部１２を経た後に生成された中間言語コード１１−２を示す。なお、以下では中間言語コード１１−２内の各コードを単に中間コードと記す。図４において、１行などのｌｉｎｅで始まる中間コードは、後続の中間コードが図２のソースコード１の何行目辺りに対して生成されたものかを示すデバッグ用である。７行などのｌａｂｅｌで始まる中間コードは、飛び先のアドレスを示すものである。３行、９行などに現れているｔ＜番号＞やＴ＜番号＞は一時的な変数を表す記号、１７行などに現れている＿＜番号＞は、関数の第＜番号＞目の引数を表す記号、２行などに現れている＿＜識別子＞はユーザ変数＜識別子＞を表す記号である。行データであるかどうかを宣言するためのキーワードｓｅｐはソースコード１に引き続き中間コードでも使用されており、ｓｅｐが付いている中間コードは行単位処理指定、行データ抽出指定、ブロードキャスト指定に対応する中間コードであり、ｓｅｐが無い中間コードはスカラー処理指定になる。また、ソースコード１で使用された行単位近隣要素参照指定の形式（：＞ＰＰ、：＜ＰＰなど）がそのまま使用されている。例えば、２４行、２７行は、ｓｅｐがあり、行単位近隣要素参照指定の形式が存在するので、行単位近隣要素参照指定に対応する中間コードである。また、例えば１１行、１２行は、ｓｅｐがあり右辺に演算子を持つため、行単位演算指定に対応する中間コードである。また、例えば４２行はｓｅｐがあり、行データにデータを代入しているので、ブロードキャスト指定に対応する中間コードである。また、例えば５０行はｓｅｐがあり、行データを参照しているので、行データ抽出指定に対応する中間コードである。
【００３３】
次にコンパイラ２は、マクロコード生成部１３により、記憶部１０７から中間言語コード１１−２を入力し、ＳＩＭＤマクロコード４を生成して、記憶部１０８に格納する（Ｓ１０３）。図５にマクロコード生成部１３の処理例を示す。マクロコード生成部１３は、入力である中間言語コード１１−２から１つの中間コードを入力し（Ｓ２０１）、解析する（Ｓ２０２）。中間コードがスカラー処理指定に対応するものであれば（Ｓ２０３でＹＥＳ）、ターゲットマシンが有する汎用レジスタに対応した仮想汎用レジスタのみをオペランドに持つマクロコードを生成する（Ｓ２０４）。中間コードが行単位処理指定、行データ抽出指定あるいはブロードキャスト指定に対応するものであれば（Ｓ２０５でＹＥＳ）、２のべき乗値にアラインされた先頭アドレスを持つ行データの先頭要素データのアドレス、あるいは実際ではアラインされた先頭アドレスを持つメモリ上の連続アドレスにその実体がありＰ個の要素データをまとめて格納できる仮想的なＳＩＭＤレジスタである仮想ＳＩＭＤレジスタをオペランドに持つマクロコードを生成する（Ｓ２０６）。中間コードがデバッグ用や飛び先アドレスを示すものなど他のコードであれば（Ｓ２０５でＮＯ）、それに応じたマクロコードを生成する（Ｓ２０７）。１つの中間コードの処理を終えると、中間言語コード１１−２に未処理の中間コードが残っていれば（Ｓ２０８でＹＥＳ）、ステップＳ２０１に戻って上述した処理と同様の処理を未処理の中間コードに対して実施する。中間言語コード１１−２のすべての中間コードを処理し終えると（Ｓ２０８でＮＯ）、ステップＳ２０４、Ｓ２０６、Ｓ２０７で生成した一連のマクロコードをＳＩＭＤマクロコード４として記憶部１０８に出力し（Ｓ２０９）、処理を終える。
【００３４】
マクロコード生成部１３が図４の中間言語コード１１−２を入力とした場合に生成するＳＩＭＤマクロコード４の一例を、図６の１行から６１行に示す。なお、以下ではＳＩＭＤマクロコード４内の各コードを単にマクロコードと記す。図６において、／／＊＊＊で始まる行は、後続のマクロコードが図４の中間言語コード１１−２の何行目辺りに対して生成されたものかを示すコメント行である。マクロコードの読み方は以下の通りである。
【００３５】
マクロコードの名前はＭ＿で始まり、続いて、１）当該マクロコードの動作の種類（演算の種類など）を表す１〜２のフィールド、２）ソースデータが符号付きかどうか、行単位演算かどうか（行データの操作を含むマクロコードの場合は＿Ｍ＿の文字列を含む）、操作対象バイト数などを表す１〜２のフィールド、３）結果データが符号付きかどうか、何バイトかを示す１〜２のフィールド、そして、４）レジスタに関する情報（本例では、ｒで始まる識別子が仮想ＳＩＭＤレジスタ、ｅで始まる識別子が仮想汎用レジスタを表す）が続く。
【００３６】
例えば２４行にあるＭ＿ＣＡＳＴ＿Ｍ＿１Ｕ＿Ｍ＿２  ｒｂ１４，ｒ１のマクロコードは、マクロコードであることを表す共通フィールドＭ＿に続いてＣＡＳＴが置かれているので、演算の種類はキャスト演算であることを示す。続くＭ＿１Ｕは、キャスト元データに関する情報を示し、Ｍが付いているのでデータは行単位データであること、１なのでデータのサイズは１バイト、Ｕなので符号無しのデータであることを示す。続くＭ＿２は、キャスト結果データに関する情報を示し、Ｍが付いているのでデータは行単位データであること、２なのでデータのサイズは２バイト、符号については指定されていないのでソースデータと同じであることを示す。ｒｂ１４はソースレジスタであり、ｒが付いているので仮想ＳＩＭＤレジスタであることを示す。ｒ１は結果格納レジスタであり、同じくｒが付いているので仮想ＳＩＭＤレジスタであることを示す。結局、２４行のマクロコードは、１バイトの仮想ＳＩＭＤレジスタｒｂ１４の内容を２バイトの仮想ＳＩＭＤレジスタｒ１の内容に変換する動作を指定している。また、２７行のＭ＿ＡＤＤ＿Ｍ＿２  ｒ０，ｒ０，ｒ２は、２バイトの行単位データｒ０とｒ０の加算を行い、結果をｒ２に格納することを意味する。その他、２１行のＭ＿ＰＥ＿ＲＩＧＨＴ＿Ｍ＿１、２３行のＭ＿ＰＥ＿ＬＥＦＴ＿Ｍ＿１の名前を持つマクロコードは、それぞれ図２の１６行にある「行単位近隣要素参照指定」、あるいは図４の中間コードの２４行、２６行に対応して生成されたものである。同様に、４７行および４８行のマクロコードは、第１オペランドの仮想汎用レジスタが示すアドレスと、第２オペランドが示すオフセットを加算した結果のアドレスに存在するスカラーデータを、第３オペランドの仮想ＳＩＭＤレジスタの全要素データにロードする動作、すなわち図２の「行単位動作指定」の１９行にある「ブロードキャスト指定」、あるいは図４の４２行の中間コードに対応して生成されたものであり、また５１行〜５４行のマクロコードは図２の２０行の「行データ抽出指定」、あるいは図４の４８行から５０行にかけての中間コードに対応して生成されたものであり、対応する動作を指定するものである。以下に図６に現れているその他の演算の種類を示す指定子を列挙しておく。
【００３７】
ＳＵＢ      減算
ＭＵＬ      乗算
ＬＤ＿Ｄ      データメモリからのメモリリード
ＬＤ＿Ｉ      画像メモリからのメモリリード
ＳＴ＿Ｄ      データメモリへのメモリストア
ＳＴ＿Ｉ      画像メモリへのメモリストア
ＢＲＯＡＤＣＡＳＴ＿＊    データブロードキャスト関連マクロコード
ＣＯＰＹ      データ複製
ＣＭＰ        比較を行う（減算し、フラグをセットする）
ＢＲ＿ＧＥ      フラグをみて、直前のＣＭＰ演算の結果がＧｒｅａｔｅｒ  ｏｒ  ＥｑｕａｌならＢｒａｎｃｈせよ
ＰＥ＿ＬＥＦＴ    左隣データ参照
ＰＥ＿ＲＩＧＨＴ  右隣データ参照
【００３８】
再び図３を参照すると、ステップＳ１０３の処理に引き続いて、コンパイラ２は簡略化部５により、入力であるＳＩＭＤマクロコード４内にある、仮想ＳＩＭＤレジスタをオペランドに持つコード全体に対し、仮想ＳＩＭＤレジスタに対する定義と参照の関係を解析し、その解析結果に基づき、同一仮想ＳＩＭＤレジスタに対する定義と参照の関係にある一連のコードを、できるだけ一つにまとめた複合コードに変換し、実体がメモリ上にある仮想ＳＩＭＤレジスタに対する定義および参照の回数をできるだけ無くし冗長さを減らしたＳＩＭＤマクロコードである簡略化ＳＩＭＤマクロコード６を生成する（Ｓ１０４）。
【００３９】
例えば図６の１行〜６１行のＳＩＭＤマクロコード４を入力とした場合、簡略化部５は、２４行と２５行のマクロコードを２５−１行に示されるＭ＿ＣＯＮＴの名前で始まる複合マクロコードに置き換える。また、２６行〜２９行および３４行のマクロコードを３４−１行に示されるＭ＿ＣＯＮＴの名前で始まる複合マクロコードに置き換える。
【００４０】
２４行と２５行のマクロコードを２５−１行の複合マクロコードに置き換えるのは次のような理由による。２４行では、ｒｂ１４内の１バイト仮想レジスタ内のデータと、ｒ１という２バイト仮想レジスタ内のデータとを加算し、結果をｒ１に格納するように指定している。他方、２５行では、ｒ０という２バイト仮想レジスタ内のデータと、ｒ１という２４行で生成した２バイト仮想レジスタ内のデータとを加算し、結果をｒ１に格納するように指定している。２４行、２５行そのままでコード生成すると、２４行の処理結果を一度ｒ１に格納するようなコードが生成される。そこで、２５−１では、ｒｂ１４からの変換結果を一度ｒ１に格納せずに、そのままｒ０と加算し、結果だけをｒ１に格納するような動作を指定している。仮想レジスタへのアクセス（リードとライト）は所詮、単なるメモリアクセスであり、通常はＳＩＭＤレジスタアクセスよりは数十倍処理が遅いため、このような簡略化処理を行うことにより、できるだけ仮想レジスタへのリードとライトの回数を削減した形式のマクロ表現を得ることができる。
【００４１】
２６行〜２９行および３４行のマクロコードを３４−１行の複合マクロコードに置き換えるのは次のような理由による。２６行〜２９行および３４行のマクロコードでは、以下のように多数のメモリ参照、メモリライト動作が行われる。
ａ）  ｒ０  ＜−  （ｃａｓｔ）ｔｂ１
ｂ）  ｒ２  ＜−  ｒ０＋ｒ０
ｃ）  ｒ０  ＜−  ｒ１＋ｒ２
ｄ）  ｒｂ０  ＜−  （ｃａｓｔ）ｒ０
ｅ）  ｍｅｍ（ｅｄｘ）  ＜−  ｒｂ０
そこで、３４−１のマクロコードは、２６行〜２９行および３４行のマクロコードを、ｍｅｍ（ｅｄｘ）  ＜−（ｒｂ１をキャスト後２倍した後ｒ１と加算した結果を再度キャストする）というマクロコードに凝縮することにより、前述した多数のメモリ参照、メモリライト動作を省略した形の動作を指定している。
【００４２】
再び図３を参照すると、最後にコンパイラ２は、マシンコード生成部７により、簡略化ＳＩＭＤマクロコード６をマシンコード８に変換し、記憶装置１０４へ出力する（Ｓ１０５）。マシンコード生成部７の処理例を図７のフローチャートに示す。マシンコード生成部７は、入力である簡略化ＳＩＭＤマクロコード６から１つのマクロコードを入力し（Ｓ３０１）、解析する（Ｓ３０２）。マクロコードが仮想汎用レジスタのみをオペランドに持つコードの場合（Ｓ３０３でＹＥＳ）、ターゲットマシンが有する通常のスカラー命令、シーケンス制御命令、および汎用レジスタセット等を用いて指定動作を行う目的コードシーケンスを生成する（Ｓ３０４）。マクロコードが行データの先頭要素データへのアドレスあるいは仮想ＳＩＭＤレジスタをオペランドに持つコードの場合（Ｓ３０５でＹＥＳ）、その動作指定方法を判別し（Ｓ３０６）、その判別結果に応じた処理Ｓ３０７、Ｓ３０８、Ｓ３０９へと分岐する。なお、入力したコードがデバッグ用など他のコードであれば（Ｓ３０５でＮＯ）、それに応じた処理を行う（Ｓ３１０）。
【００４３】
動作指定方法が行単位処理指定であるマクロコードに対応する目的コードシーケンスを生成する処理Ｓ３０７では、指定した行データの先頭アドレスから始まるＰ個のデータ要素、あるいは仮想ＳＩＭＤレジスタの内容であるＰ個の要素データ、のうちのＳ×Ｍ個をＭ個のＳＩＭＤレジスタ（但しＭはターゲットマシンが有するＳＩＭＤレジスタ数以下１以上）にロードするためのＭ個のＳＩＭＤロード命令、続けて当該Ｍ個のＳＩＭＤレジスタを対象に演算を行うＳＩＭＤ演算命令と、続けて前記ＳＩＭＤ演算命令の結果を格納したＭ個のＳＩＭＤレジスタの内容を、指定された仮想ＳＩＭＤレジスタ、あるいは行データの先頭アドレスから始まるメモリ上の連続領域にライトするための、Ｍ個のＳＩＭＤライト命令とを本体に持つループを、Ｐ÷（Ｓ×Ｍ）回だけ繰り返すループ動作を指定する目的コードシーケンスを生成する。
【００４４】
動作指定方法が行データ抽出指定であるマクロコードに対応する目的コードシーケンスを生成する処理Ｓ３０８では、指定の行データの先頭アドレスから始まるＰ個の要素データ、あるいは仮想ＳＩＭＤレジスタ内のＰ個の要素データのうちの、指定された一つの位置の要素データを、別途に指定された一つの仮想汎用レジスタに対応する実汎用レジスタあるいはメモリ位置に書き込む動作を指定する目的コードシーケンスを生成する。
【００４５】
動作指定方法がブロードキャスト指定であるマクロコードに対応する目的コードシーケンスを生成する処理Ｓ３０９では、指定された仮想汎用レジスタに対応する実汎用レジスタあるいはメモリ位置にあるスカラーデータを、指定の行データの先頭アドレスから始まる、あるいは仮想ＳＩＭＤレジスタに対応する、メモリ上の連続アドレス領域に存在するＰ個のデータ要素領域に書き込む動作を指定する目的コードシーケンスを生成する。
【００４６】
１つのマクロコードの処理を終えると、簡略化ＳＩＭＤマクロコード６に未処理のマクロコードが残っていれば（Ｓ３１１でＹＥＳ）、ステップＳ３０１に戻って上述した処理と同様の処理を未処理のマクロコードに対して実施する。簡略化ＳＩＭＤマクロコード６のすべてのマクロコードを処理し終えると（Ｓ３１１でＮＯ）、ステップＳ３０４、Ｓ３０７〜Ｓ３０９で生成した一連の目的コードシーケンスをマシンコード８として記憶部１０４に出力し（Ｓ３１２）、処理を終える。
【００４７】
図８〜図１０に、図６の簡略化ＳＩＭＤマクロコード６を入力、インテル社のペンティアム（登録商標）４をターゲットマシンとし、処理対象画像の横幅画素数Ｐを２５６、ペンティアム（登録商標）４が持つＳＩＭＤ命令の一種であるＭＭＸ／ＳＳＥ命令を用いた場合は一つのＳＩＭＤ命令が同時に処理できる要素データ数Ｓが８に対しＭを８、ペンティアム（登録商標）４が持つＳＩＭＤ命令の一種であるＳＳＥ２命令を用いた場合はＳが１６に対しＭを４とした場合のマシンコード生成部７が生成するマシンコード８の例の一部を示す。図８が図６の（２５−１）行、図９が図６の（３４−１）行、のそれぞれの複合マクロコードに対して生成されたマシンコード例である。また図１０が図６の２３行のＭ＿ＰＥ＿ＬＥＦＴ＿Ｍ＿１マクロコードに対して生成されたマシンコード例である。
【００４８】
図８ではｍｏｖｄｑａ、ｐｕｎｐｃｋｌｂｗ、ｐｕｎｐｃｋｈｂｗ、そしてｐａｄｄｗの４種類のＳＳＥ２命令を用い、図６の（２５−１）行の複合マクロコードの指定する、１バイトの仮想ＳＩＭＤレジスタの内容を２バイトにキャストしてから別の２バイトの仮想ＳＩＭＤレジスタの内容との加算を行い、結果を仮想ＳＩＭＤレジスタ上に得るという動作を、１回の繰り返し毎に３２要素データを処理し、計８回繰り返すことで、結果である２５６個の要素データ、すなわち１行分の要素データを一つの仮想ＳＩＭＤレジスタに得ている。
【００４９】
図９では、ｍｏｖｄｑａ、ｐｕｎｐｃｋｌｂｗ、ｐｕｎｐｃｋｈｂｗ、ｐｓｌｌｗ、ｐａｄｄｗの５種類のＳＳＥ２命令を用い、図６の（３４−１）行の複合マクロコードの指定する、１バイトの仮想ＳＩＭＤレジスタを２バイトにキャストしてから１ビット左シフトを行い、その後別の２バイトの仮想ＳＩＭＤレジスタとの加算を行った結果を、行データの実体が存在するメモリ領域にライトする動作を、１回の繰り返し毎に１６要素データを処理し、計１６回繰り返すことで、結果である２５６個の要素データを行データの実体が存在するメモリ領域にライトしている。ここで、図８と異なり、最後のメモリへのライトの動作を実現するコードとして、書き戻す際にｍｒという特殊な行データを参照し、各要素データに対応するｍｒの要素データが０ならば、当該要素データの書き戻しを行わないように動作するコードを生成した例を示している。このようにメモリへの書き戻しに際し行データの各要素データのライト動作を実行するか否かを指定する必要がある場合は、本例に示すようにｍｒという特殊な行データを別途定義した上で本例が示すようなコードを生成することで、当該動作を実現することができる。
【００５０】
図１０では、図２の１６行にある「行単位近隣要素参照指定」のうちの：＞ｐｐが指定する行データｐｐの一つ左隣のデータ要素への参照の動作を実現するための、図６の２３行のＭ＿ＰＥ＿ＬＥＦＴ＿Ｍ＿１の名前のマクロコードが指定する、１バイトの仮想ＳＩＭＤレジスタの内容を１要素データ分だけ全体的に左に回転させる動作を主にｍｏｖｑというＭＭＸ命令を用いて実現するコードを示している。なお図１１に示すように、このデータの回転移動は、最後の１データ要素分のみが、非連続なアドレスへの移動であるために、それを実現するコード例としては、１回の繰り返し毎に８×８個の要素データを移動先へ移す処理を、計３回実施することで１９２要素データ分の移動を行うコードをまず生成し、次に８ｘ７個の要素データを移動するコードを生成した後に、一つのＳＩＭＤレジスタ内に入っている残り８個の要素データのうちの７個分の要素データの移動を行うコードを生成してから、最後の１個の要素データをアドレスが非連続な移動先に移すコードを生成することで、図６の２３行のマクロコードＭ＿ＰＥ＿ＬＥＦＴ＿Ｍ＿１が指定する動作を実現している。
【００５１】
インテル社のペンティアム（登録商標）シリーズプロセッサをターゲットとし、幾つかの画像処理演算を表現した行単位動作指定を入力とした場合に、本発明の手法で生成したＳＩＭＤ命令シーケンスを含んだマシンコードと、同じ処理を人手によりアセンブリ指定等でできるだけ効率よく実装したと考えられるインテル社の公開画像処理ライブラリ（ＩＰＬ）内の所定ルーチンとの処理時間を比べた結果を図１２に示す。図１２は、本発明の手法で生成したＳＩＭＤ命令シーケンスが、手作業によるアセンブリ指定と比べて遜色のない処理性能を持つという効果を示している。
【００５２】
こうした効果が得られる主な理由は、行単位動作指定形式の入力と、本発明のコンパイル手段との組合せが、高速なＳＩＭＤ命令シーケンスの生成を可能にしているためである。
【００５３】
高速なＳＩＭＤ命令シーケンスを生成できる一つの理由は、ＳＩＭＤ命令は通常、先頭が２のべき乗値にアラインされた連続アドレス上にある一連のデータでないと効率よく並列に処理できないが、画像の１行分に相当した一連のデータを対象に動作指定を行う行単位動作指定では、要素データが常に先頭が２のべき乗値にアラインされたアドレスを持つ行データに対し処理を指定するようになっているため、コンパイラ２は、行単位動作指定に対しルールベースでその動作をＳＩＭＤ命令シーケンスに簡単に変換できるようになり、高速な目的コードの生成が容易である。
【００５４】
高速なＳＩＭＤ命令シーケンスを生成できるもう一つの理由は、画像処理でよく用いられるフィルタ処理が有するフィルタカーネル係数の対称性の利用により、通常よりも少ない演算量で同じ処理を実現するＳＩＭＤ命令シーケンスを生成できるためである。例えば図２の「行単位動作指定」で指定している画像フィルタ処理のカーネル係数は図１３に示すように上下対称であるが、まずこの上下対称性を利用するような動作指定となっているのが、図２の１６行の「行単位近隣要素参照指定」による、左隣の演算結果と右隣の演算結果を利用した上で結果データを求めるという動作の指定である。こうした「行単位近隣要素参照指定」に対しコンパイラ２は、図１０のＳＩＭＤ命令シーケンス生成例のように、一連のＳＩＭＤリード命令と一連のＳＩＭＤライト命令からなる本体を持つループ構造の目的コードを生成し、指定の動作を効率よく実現することで、当該画像フィルタ処理におけるカーネル係数の対称性を考慮した高速なＳＩＭＤ命令シーケンスの生成を実現している。
【００５５】
【発明の効果】
以上説明したように本発明によれば、高級言語による画像処理指定から、効率のよい画像処理用ＳＩＭＤ命令シーケンスを生成する方法と装置を提供することができる。
【図面の簡単な説明】
【図１】本発明の画像処理用ＳＩＭＤ命令シーケンスの生成方法を実施する計算機の実施の形態の全体構成を示すブロック図である。
【図２】本発明による行単位動作指定を用いたソースコードの一例を示す図である。
【図３】本発明の実施例にかかるコンパイラの全体処理の流れを示すフローチャートである
【図４】本発明の実施例における最適化処理部が出力する中間言語コードの例を示す図である。
【図５】本発明の実施例におけるマクロコード生成部の処理例を示すフローチャートである。
【図６】本発明の実施例におけるＳＩＭＤマクロコードおよび簡略化ＳＩＭＤマクロコードの例を示す図である。
【図７】本発明の実施例におけるマシンコード生成部の処理例を示すフローチャートである。
【図８】本発明の実施例によって生成されたＳＩＭＤ命令シーケンスコードの一部を示す図である。
【図９】本発明の実施例によって生成されたＳＩＭＤ命令シーケンスコードの一部を示す図である。
【図１０】本発明の実施例によって生成されたＳＩＭＤ命令シーケンスコードの一部を示す図である。
【図１１】本発明の実施例によるＳＩＭＤマクロコードの一つであるＭ＿ＰＥ＿ＬＥＦＴ＿Ｍ＿１の動作を示す図である。
【図１２】本発明の実施の形態の効果を示す図である。
【図１３】画像フィルタ処理で使われるカーネル係数の上下対称性の説明図である。
【符号の説明】
１  行単位動作指定を用いたソースコード
２  コンパイラ
３  翻訳部
４  ＳＩＭＤマクロコード
５  簡略化部
６  簡略化ＳＩＭＤマクロコード
７  マシンコード生成部
８  マシンコード
１０  構文解析部
１１−１、１１−２  中間言語コード
１２  最適化処理部
１３  マクロコード生成部
１０１  処理装置
１０２、１０３、１０４  記憶装置
１０５  記録媒体
１０６  １０７  １０８  １０９  記憶部
【図１】
2004164163.tif 000003
【図２】
2004164163.tif 000004
【図３】
2004164163.tif 000005
【図４】
2004164163.tif 000006
【図５】
2004164163.tif 000007
【図６】
2004164163.tif 000008
【図７】
2004164163.tif 000009
【図８】
2004164163.tif 000010
【図９】
2004164163.tif 000011
【図１０】
2004164163.tif 000012
【図１１】
2004164163.tif 000013
【図１２】
2004164163.tif 000014
【図１３】
2004164163.tif 000015