(57)【特許請求の範囲】
【請求項１】
ソースプログラムに基づいてオブジェクトプログラムを生成するコンパイラを実行する処理装置であって、
ソースプログラムをコンパイルしたアセンブラ表現の中間言列の演算パターンを認識する演算パターン認識手段と、
前記演算パターン認識手段で認識した演算パターンのベクトルデータとスカラデータの加算命令について、ベクトルデータとスカラデータの加算命令により生成される間接アドレスが他の命令で使用されていない場合に該スカラ演算命令に変更可能と判定し、それ以外の場合は命令変更不可能と判定する命令変更可否判定手段と、
前記命令変更可否判定手段でスカラ演算命令に変更可能と判定したベクトル演算命令について、該ベクトル演算命令に代わるスカラ演算命令を作成して置き換える演算パターン変更手段と、
を備えることを特徴とする処理装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は，ソースプログラムをコンパイルして得られる中間言列（アセンブラ表現等）のベクトル演算を最適化する処理装置に関する。
【０００２】
ソースプログラムのループ命令等はコンパイラによりベクトル演算命令列に変換し，高速に処理することができるが，ベクトル演算はスカラ演算より１命令あたりの実行時間が長いのでより高速化することが望まれる。
【０００３】
本発明は，ソースプログラムをコイパイルして生成されるベクトル演算命令の処理を高速にする処理装置を提供するものである。
【０００４】
【従来の技術】
図６，図７は従来技術の説明図である。
図６ (a)はソースプログラムの例であって，メモリ領域の８バイトの実数データの配列Ｂ（Ｂ（１００））をメモリ領域の配列Ａ（Ａ（１００））に転送するプログラムの記述である。配列Ｃ（Ｃ（１００））は４バイトの整数データである。ｍはスカラの整数データである。配列Ｃとｍをインデックスとした配列Ｂのデータを配列Ａに転送するための間接アドレスを生成する。ＤＯループにより順次指定される間接アドレスにより，配列Ｂのデータが取り出されて配列Ａに転送される。
【０００５】
図６ (b)は，図６ (a)のソースプログラムをコンパイルして得られるアセンブラ表現である。
図７により，図６ (b)の処理について説明する。
【０００６】
図７において，
１１８はメモリ領域であって，配列Ｃのデータを保持するものである。
１１９はメモリ領域であって，ｍを保持するものである。
【０００７】
１２０はベクトルレジスタ（ｖｔ３）であって，配列Ｃをロードするものである。
１２１はレジスタ（ｔ１）であって，ｍをロードするものである。
【０００８】
１２２はベクトルレジスタ（ｖｔ４）であって，（Ｃ（Ｉ）＋ｍ）（Ｉ＝１〜Ｎ）の演算結果を保持するものである。
１２３はメモリ領域であって，配列Ｂを保持するものである。
【０００９】
１２４はベクトルレジスタ（ｖｔ５）であって，間接アドレスにより配列Ｂのデータを取り出して保持するものである。
１２５はメモリ領域であって，配列Ａである。
【００１０】
メモリ領域１１８には配列ＣのデータＣ(1) ，Ｃ(2) ，・・・，Ｃ（100)が保持されている。例えば，Ｃ(1) ＝１，Ｃ(2) ＝４，Ｃ(3) ＝８，・・・とする。メモリ領域１１９にｍが保持されている。例えば，ｍ＝３とする。
【００１１】
ＶＬ命令によりメモリ領域１１８の配列Ｃがベクトルレジスタｖｔ３（１２０）にロードされる。
次に，Ｌ命令によりメモリ領域１１９のｍがレジスタｔ１（１２１）にロードされる。
【００１２】
ＶＡＳ命令により，ベクトルレジスタｖｔ３（１２０）のＣ(1) ，Ｃ(2) ，Ｃ(3) ，・・・の値とレジスタｔ１（１２１）のｍが加算され，ベクトルレジスタｖｔ４（１２２）に保持される。ベクトルレジスタｖｔ４（１２２）の内容が間接アドレスを与える。例えば，ｍ＝３，Ｃ(1) ＝１，Ｃ(2) ＝４，Ｃ(3) ＝８，・・・の場合，間接アドレスは４，８，１１，・・・となる。
【００１３】
ＶＩＬ命令は，配列Ｂの基本アドレス（メモリ領域１２３の配列Ｂの先頭アドレス）から数えて，ベクトルレジスタｖｔ４に保持される間接アドレスＣ(1) ＋ｍ，Ｃ(2) ＋ｍ，Ｃ(3) ＋ｍ，・・・だけ変位したメモリ領域１２３のアドレスの配列Ｂを取り出し，順次ベクトルレジスタ１２４にロードする。例えば，Ｃ(1) ＋ｍ＝４なので，配列Ｂの４番目のデータＢ（４）を一番目のベクトルレジスタｖｔ５にロードする。Ｃ(2) ＋ｍ＝７なので，メモリ領域１２３の配列Ｂの７番目のデータＢ（７）を２番目のベクトルレジスタｖｔ５にロードする。同様に，Ｃ(3) ＋ｍ＝１１なので，メモリ領域１２３の配列Ｂの１１番目のデータＢ（１１）を３番目のベクトルレジスタｖｔ５にロードする。Ｃ(4) ＋ｍ以降についても同様の処理を行う。
【００１４】
ベクトルレジスタｖｔ５（１２４）に保持されたデータはその配列順に配列Ａの配列に対応する。そして，ＶＳＴ命令により，それぞれメモリ領域１２５の配列Ａに転送される。
【００１５】
【発明が解決しようとする課題】
従来の技術では，ソースプログラムのＤＯループ等をコンパイルしてベクトル演算により処理する場合には，間接アドレスを生成するための（Ｃ（Ｉ）＋ｍ）（Ｉ＝１〜Ｎ）等の演算を必要として演算回数が多くなり，処理に時間を要するものであった。
【００１６】
本発明は，コンパイルにより生成されるベクトル演算命令の命令数を少なくして，ベクトル演算命令を最適にコンパイルして高速に処理する処理装置を提供することを目的とする。
【００１７】
【課題を解決するための手段】
図６ (b)のＶＡＳ命令の演算結果（間接アドレス）は，次のＶＩＬ命令で使用されるだけであり，しかも，その演算結果（Ｃ（Ｉ）＋ｍ）（Ｉ＝１〜Ｎ）はベクトルレジスタｖｔ３（１２０）の値にそれぞれｍを加えたものである。従って，このような場合には，Ｃ（Ｉ）＋ｍの演算をいちいち行う必要はなく，ｍに対して配列（Ｂ）のＢ（ｍ）の位置からＣ（Ｉ）の値だけシフト位置の配列Ｂのデータを取り出せば良いことを意味する。すなわち，Ｂ（ｍ）を指定するアドレスを求めるスカラ演算だけにベクトル演算ＶＡＳを置き換えることが可能である。
【００１８】
本発明は，ベクトル演算命令をスカラ命令で置き換えられる場合には，ベクトル命令をスカラ命令に置き換えるようにした。
図１は本発明の基本構成を示す。
【００１９】
図１において，
１はソースプログラムである。
２はコンパイラであって，ソースプログラム１をコンパイルしてオブジェクトプログラム３を生成するものである。
【００２０】
３はソースプログラム１のオブジェクトプログラムである。
１０は演算パターン認識部であって，ソースプログラム１をコンパイルして得られる中間言列（例えばアセンブラ表現等）の演算パターンを認識するものである。
【００２１】
１１は，命令変更可否判定部であって，ベクトル演算命令の演算結果の他の命令に対する依存関係を調べ，他の命令との依存関係によりベクトル演算命令をスカラ命令に置き換えられるかを判定するものである。
【００２２】
１２は，スカラ演算命令作成部であって，スカラ演算命令に置き換えるベクトル演算命令に対してスカラ演算命令を作成するものである。
１３は演算パターン変更部であって，スカラ演算命令作成部１２で求めたスカラ演算命令でベクトル演算命令を置き換えるものである。
【００２３】
【作用】
図１の本発明の基本構成の動作を説明する。
コンパイラ２はソースプログラム１を入力し，アセンブラ表現等の中間言列に変換する。演算パターン認識部１０はコンパイルされた中間言列の演算パターンを分析する。命令変更可否判定部１１はベクトル演算命令の演算結果と他の命令との依存関係を調べ，依存関係がなければ，スカラ演算命令作成部１２にベクトル演算命令に代わるスカラ演算命令の作成を指示する。例えば，図６ (a)の場合ベクトル演算命令ＶＡＳの演算結果は，ＶＩＬ命令を実行するための間接アドレスとしてだけ使用されているので，他のスカラ演算命令に置き換えることが可能である。スカラ演算命令作成部１２は変更可能なベクトル演算命令に代わるスカラ演算命令を作成する。例えば，中間言列が図６ (b)のような場合，ベクトル演算命令ＶＡＳに置き換えるスカラ演算命令を作成する。演算パターン変更部１３は，変更するベクトル演算命令，例えばＶＡＳ命令を削除し，スカラ演算命令作成部１２の作成したスカラ演算命令を中間言列に組み込み，オブジェクトプログラム３を作成して出力する。
【００２４】
本発明によれば，ベクトル演算命令を少なくして高速に演算処理できるようにコンパイルを最適化することができる。
【００２５】
【実施例】
図２は本発明の実施例を示す。
図２ (a)は，ソースプログラムであって，図６ (a)と同じものである。従って説明は省略する。
【００２６】
図２ (b)は，ソースプログラム３０を本発明のコンパイラによりコンパイルして得られる結果のアセンブラ表現３１である。図６ (b)との相違点は，図６ (b)のＶＡＳ命令が削除され，かわりにスカラ演算命令であるＡＤＤＲ命令，ＭＵＬＴ命令，ＡＤＤ命令が付け加えられている点である。
【００２７】
図２ (b)の処理を図３により説明する。
図３は本発明の実施例の動作説明図である。
図３において，
４１はメモリ領域であって，ｍを保持するものである。
【００２８】
４２はメモリ領域であって，配列Ｃを保持するものである。
４３はベクトルレジスタｖｔ６であって，配列Ｃを保持するものである。
４４はレジスタｔ１であって，配列Ｂのメモリの先頭領域のアドレスＸを保持するものである。
【００２９】
４５はレジスタであって，ｍを保持するものである。
４６はレジスタであって，８×ｍの演算結果を計算するものである（本実施例では，倍精度で計算する場合について説明しているので，ｍを８倍する。単精度の場合には４倍である）。
【００３０】
４７はレジスタであって，（配列Ｂの先頭アドレス（Ｘ）＋８×ｍ）を計算して得られる配列Ｂのｍ番目のデータＢ（ｍ）のアドレスを保持するものである。
５０はメモリ領域であって，配列Ｂを保持するものである。
【００３１】
５１はベクトルレジスタｖｔ７であって，配列Ｂから取り出して配列Ａに転送するデータを保持するものである。
５２はメモリ領域であって，配列Ａを保持するものである。
【００３２】
図３を参照して図２ (b)のアセンブラ表現３１の動作を説明する。
ＡＤＤＲ命令により配列Ｂの先頭アドレスＸをレジスタｔ１（４４）にロードする。
【００３３】
Ｌ命令により，ｍをレジスタｔ２（４５）にロードする。
ＭＵＬＴ命令により，レジスタｔ２（４５）の内容を８倍し，レジスタｔ３（４６）に保持する。
【００３４】
ＡＤＤ命令により，レジスタｔ１（４４）の内容（Ｘ）とレジスタｔ３（４６）の内容（８ｍ）を加算し，結果をレジスタｔ４（４７）に保持する。
ＶＬ命令により，メモリ領域４２の配列Ｃをベクトルレジスタｖｔ６（４３）にロードする。
【００３５】
ＶＩＬ命令により，Ｂ（ｍ）のアドレスからレジスタｖｔ６（４３）のＣ（Ｉ）（Ｉ＝１〜Ｎ）の値だけ変位した配列Ｂを取り出し，ベクトルレジスタｖｔ７（５１）に転送する。配列ＢのデータＢ（ｍ）の位置はレジスタｔ４（４７）の値により計算する。
【００３６】
例えば，ｍ＝３，Ｃ（１）＝１，Ｃ（２）＝４，Ｃ（３）＝８，・・・とする。配列ＢのＢ（３）（＝Ｂ（ｍ））は，レジスタｔ４（４７）の値から求まる。そこで，Ｂ（３）を基準にして，ベクトルレジスタｖｔ６（４３）の値（配列Ｃ）を参照し，配列Ｂ（３）からＣ（１）＝１だけ変位した位置にあるＢ（４）を求め，ベクトルレジスタｖｔ７（５１）に転送する。また，配列Ｂ（３）からＣ（２）＝４だけ変位した位置にあるＢ（７）を求め，ベクトルレジスタｖｔ７（５１）に転送する。配列Ｂ（３）からＣ（３）＝８だけ変位した位置にあるＢ（１１）を求め，ベクトルレジスタｖｔ７（５１）に転送する。同様に，Ｃ（４）以後に対応する配列Ｂのデータを取り出し，それぞれ対応するベクトルレジスタｖｔ７（５１）に転送する。
【００３７】
ＶＳＴ命令により，ベクトルレジスタｖｔ７のデータをそれぞれの対応する配列Ａのメモリ領域５２に転送する。
以上のように，図２ (b)のアセンブラ表現３１では，図６ (b)のベクトル演算命令であるＶＡＳ命令がない代わりにＡＤＤＲ命令，ＭＵＬＴ命令，ＡＤＤ命令の３命令が付け加えられているが，それらはスカラ命令であるので，ＶＡＳ命令の実行時間より短時間で処理することができる。そのため，図２ (b)のアセンブラ表現は，図６ (b)のアセンブラ表現より高速に処理することが可能である。
【００３８】
図４は本発明の実施例構成を示す。
図４において，
６０はソースプログラムである。
【００３９】
６１は処理装置であって，ＣＰＵとメモリにより構成されるものである。
６２はオブジェクトプログラムである。
６５はコンパイラである。
【００４０】
６６はプログラム入力部であって，ソースプログラム６０を入力するものである。
６６’はプログラム分析部であって，ソースプログラムの内容を分析し，ベクトル化する部分とそれ以外のスカラ処理をする部分を求めるものである。
【００４１】
６７はベクトル化処理部であって，ソースプログラムの内容のうち，ベクトル化できる部分をベクトル化してコンパイルするものである。
６７’はスカラ処理部であって，スカラ処理のコンパイルをするものである。
【００４２】
６８は命令スケジューリング部であって，生成された命令のスケジューリングを行うものである。
６９はオブジェクト生成部であって，最終的な中間言列（アセンブラ表現）を機械語に変換し，オブジェクトプログラム６２を生成するものである。
【００４３】
７０は演算パターン処理部であって，演算パターンの作成，変更等を行うものである。
７１は演算パターン認識部であって，ソースプログラム６０をコンパイルして得られる中間言列の演算パターンを認識するものである。
【００４４】
７２は命令変更可否判定部であって，中間言列のベクトル演算命令をスカラ演算命令に変更可能であるかどうかの判定を行うものである。
７３はスカラ演算命令作成部であって，ベクトル演算命令をスカラ演算命令に変更できる場合に変更するためのスカラ演算命令を作成するものである。
【００４５】
７４は演算パターン変更部であって，スカラ演算命令に変更するベクトル演算命令を削除し，代わりのスカラ演算命令を挿入し，最終的な演算パターン（最終的な中間言列）を生成するものである。
【００４６】
図５の構成の動作を説明する。
プログラム入力部６６はソースプログラム６０を入力する。プログラム分析部６６’はソースプログラムの内容を分析し，ベクトル化処理する部分とそれ以外のスカラ処理する部分に切り分ける。ベクトル化処理部６７はソースプログラムのうちベクトル化できる部分をベクトル演算命令によりコンパイルしてアセンブラ表現に変換する。スカラ処理部６７’はソースプログラムの内容のうちスカラ処理する部分をコンパイルしてアセンブラ表現に変換する。演算パターン認識部７１はコンパイルされたアセンブラ表現の内容を分析し，演算パターンを認識する。命令変更可否判定部７２は，演算パターンのベクトル演算命令に着目し，例えば，ベクトル演算命令がＶＡＳ命令の場合には，そこで使用されている間接アドレスが他の命令で使用されているかどうか等を分析し，他のスカラ演算命令に置き換えることが可能かどうかを判定する。スカラ演算命令作成部７３はスカラ演算命令に置き換えることのできるベクトル演算命令に対して，置き換えるためのスカラ演算命令を作成する。演算パターン変更部は，スカラ演算命令に変更するベクトル演算命令を削除し，置き換えるスカラ演算命令を挿入する。オブジェクト生成部６９は演算パターン変更部７４の作成した最終的な中間言列（アセンブラ表現）を機械言のオブジェクトプログラムに変換し出力する。
【００４７】
図５は，本発明の演算パターン処理部のフローチャートの例である。
Ｓ１  演算パターン認識部７１はベクトル化処理部６７とスカラ処理部６７’のコンパイルにより生成された中間言列（アセンブラ表現）からベクトルデータとスカラデータの加算があるかを検索する。
【００４８】
Ｓ２  命令変更可否判定部７２は，Ｓ１の演算結果が，ベクトルロード命令（ＶＩＬ）の間接アドレス配列として使用されているかを検索する。
Ｓ３  命令変更可否判定部７２により，ベクトルロード命令（ＶＩＬ）の間接アドレスとして使用されていると認識された場合には，ＶＩＬ命令の基本アドレス部分に使用するスカラデータにＳ１のスカラデータを組み込むために，スカラ演算命令を作成し，命令列に挿入する。
【００４９】
Ｓ４  演算パターン変更部７４は，Ｓ３の演算結果をベクトルロード命令（ＶＩＬ命令）の基本アドレス部分に組み込む。
Ｓ５  演算パターン変更部７４は，Ｓ１のベクトルデータとスカラデータの加算命令（ＶＡＳ）を削除する。
【００５０】
【発明の効果】
本発明の処理装置によれば，生成されるオブジェクトプログラムのベクトル演算命令が少なくなる。そのため，ベクトル演算が高速化され，最適化されたコンパイルを行うことができる。
【図面の簡単な説明】
【図１】本発明の基本構成を示す図である。
【図２】本発明の実施例を示す図である。
【図３】本発明の実施例の動作説明図である。
【図４】本発明の実施例構成を示す図である。
【図５】本発明の演算パターン処理部のフローチャートてある。
【図６】従来技術の説明図である。
【図７】従来技術の説明図である。
【符号の説明】
１  ：ソースプログラム
２  ：コンパイラ
３  ：オブジェクトプログラム
１０：演算パターン認識部
１１：命令変更可否判定部
１２：スカラ演算命令作成部
１３：演算パターン変更部
【図１】
0003730675.tif 000002
【図２】
0003730675.tif 000003
【図３】
0003730675.tif 000004
【図４】
0003730675.tif 000005
【図５】
0003730675.tif 000006
【図６】
0003730675.tif 000007
【図７】
0003730675.tif 000008