(57)【特許請求の範囲】
【請求項１】
ソースプログラムをベクトル化する際にグローバル化を行うコンパイラ装置において、
上記ソースプログラムをベクトル化する手段と、
上記ソースプログラムを解析してループ内にＩＦ文があるか否かを検出する手段と、
上記ループ内にＩＦ文が有りと検出された場合に、必要に応じて、当該ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータを展開する命令を、ループの前に出力する手段と、
上記ループ内にＩＦ文が有りと検出された場合に、当該ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力する手段と
を備えたことを特徴とするコンパイラ装置。
【請求項２】
ソースプログラムをベクトル化する際にグローバル化を行うコンパイラ装置において、
上記ソースプログラムをベクトル化する手段と、
上記ソースプログラムを解析して最内ループ内の繰り返し回数の初期値が外側ループの繰り返しに依存するか否かを検出する手段と、
上記依存すると検出された場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータを展開する命令を、ループの前にそれぞれ出力する手段と、
上記依存すると検出された場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力する手段と
を備えたことを特徴とするコンパイラ装置。
【請求項３】
コンピュータを、
ソースプログラムをベクトル化する手段、
上記ソースプログラムを解析してループ内にＩＦ文があるか否かを検出する手段、
上記ループ内にＩＦ文が有りと検出された場合に、必要に応じて、当該ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータを展開する命令を、ループの前に出力する手段、
上記ループ内にＩＦ文が有りと検出された場合に、当該ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力する手段
として機能させるコンパイラプログラムを記録したコンピュータ読取可能な記録媒体。
【請求項４】
コンピュータを、
ソースプログラムをベクトル化する手段と、
上記ソースプログラムを解析して最内ループ内の繰り返し回数の初期値が外側ループの繰り返しに依存するか否かを検出する手段と、
上記依存すると検出された場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータを展開する命令を、ループの前にそれぞれ出力する手段と、
上記依存すると検出された場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力する手段と
として機能させるコンパイラプログラムを記録したコンピュータ読取可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ソースプログラムをベクトル化する際にグローバル化を行うコンパイラ装置およびコンパイラプログラムを記録したコンピュータ読取可能な記録媒体に関するものである。
【０００２】
【従来の技術】
従来、ベクトル計算機では、メモリ（主記憶）上のデータをベクトルレジスタ上に移動し、ベクトルレジスタ上でベクトル演算を行うことで高速化を実現している。メモリ上のデータをベクトルレジスタ上に移動させる命令、あるいはベクトルレジスタ上のデータをメモリ上に移動させる命令をメモリアクセス命令という。メモリアクセス命令は、以下の２つの欠点がある。
【０００３】
（１）  メモリアクセス命令は、当該命令の立ち上がり時間が遅いために、演算実行するまでに待ち時間が発生してしまう。
（２）  メモリアクセス命令の立ち上がりを含めた実行時間が他の演算命令に比べると遅い（平均４〜５倍遅い）欠点がある。
【０００４】
例えばソースプログラム
0003734658.tif 000002
は、ベクトル命令では図７の（ａ）の下記のように書き替えることができる。
【０００５】
vlvl    n                /nはベクトル長
vload  vr1,  a          /▲１▼
vload  vr2,  b          /▲２▼
vadd  vr3,  vr1,  vr2    /▲３▼
vstore  a,  vr3          /▲４▼
vrはベクトルレジスタを表す。
このときの▲１▼から▲４▼をイメージ的に表すと図７の（ｂ）に示すようになり、▲３▼のベクトル命令演算に比して、▲１▼、▲２▼、▲４▼のメモリアクセス命令の実行時間が非常に遅い（平均４〜５倍遅い）。
【０００６】
このため、ベクトルレジスタのグローバル化、即ち、領域が不変のベクトルデータ（ループが実行されても配列要素内の値が変化しないベクトルデータ）をループの外側に移動して恒久的なレジスタを割り付ける手法がある。このベクトルレジスタのグローバル化を行うことで、主記憶上からの参照、定義の回数を減らし（メモリアクセス命令の実行回数を減らし）、実行効率を向上させることができる。例えば下記のソースプログラム（１）は、下記の（２）、（３）のようにグローバル化を行い、実行効率を向上させることができる。
【０００７】
0003734658.tif 000003
【０００８】
【発明が解決しようとする課題】
しかしながら、従来の上述したベクトルレジスタのグローバル化は、多重ループにおいて、最内ループが１つでベクトル化された場合（ベクトル長が変化しない場合）にのみしかベクトルレジスタのグローバル化を行うことができないという問題があった。例えば下記の理由によりベクトル化ができなかった。
【０００９】
（イ）  最内ループが複数存在しそれぞれが異なったベクトル長である場合に、それぞれのループのデータの依存関係が不明であり、グローバル化できなかった（例えば後述する図４の（ａ）のソースプログラム参照）。
【００１０】
（ロ）  最内ループ中でＩＦ文により異なったベクトル長となる場合に、グローバル化できなかった（例えば後述する図５の（ａ）のソースプログラム参照）。
【００１１】
（ハ）  最内ループの繰り返し回数の初期値が外側ループの繰り返し回数に依存する場合に、最内ループのベクトル長が一定でなく、グローバル化できなかった（例えば後述する図６の（ａ）のソースプログラム参照）。
【００１２】
本発明は、これらの問題を解決するため、コンパイル時に多重ループのループがベクトル化された場合に、そのループ内のベクトル長が変化などしてもベクトルレジスタのグローバル化を行い、実行効率の向上を図ることを目的としている。
【００１３】
【課題を解決するための手段】
図１を参照して課題を解決するための手段を説明する。
図１において、ソースプログラム１は、ベクトル化対象のソースプログラムである。
【００１４】
コンパイラ２は、ソースプログラム１を入力とし、最適化などを行い、実行可能形式のオブジェクトプログラム１０を生成するものであって、ここでは、ベクトル化手段３および最適化手段４などから構成されるものである。
【００１５】
ベクトル化手段３は、ソースプログラムをベクトル化するものである。
最適化手段４は、ソースプログラムをベクトル化した後、最適化を行うものであって、ここでは、最適化実施手段６などから構成されるものである。
【００１６】
最適化実施手段６は、ベクトル化されたプログラムを最適化するものであって、ここでは、参照最適化手段７および定義最適化手段８などから構成されるものである。
【００１７】
参照最適化手段７は、ベクトル化されたプログラムの参照を最適化（グローバル化）するものである。
定義最適化手段８は、ベクトル化されたプログラムの定義を最適化（グローバル化）するものである。
【００１８】
次に、動作を説明する。
ベクトル化手段５がソースプログラム１をベクトル化し、参照最適化手段７がソースプログラム１を解析してループ内に複数のループがあった場合に、当該複数のループについてそれぞれ繰り返し回数をベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータ展開する命令を、ループの前にそれぞれ出力し、定義最適化手段８がループ内に複数のループがあった場合に、複数のループについてそれぞれ繰り返し回数をベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後にそれぞれ出力するようにしている。
【００１９】
また、ベクトル化手段５がソースプログラム１をベクトル化し、参照最適化手段７がソースプログラム１を解析してループ内にＩＦ文があると検出された場合に、必要に応じて、ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータ展開する命令を、ループの前に出力し、定義最適化手段８がループ内にＩＦ文が有る場合に、ＩＦ文の真あるいは偽となる数をベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力するようにしている。
【００２０】
また、ベクトル化手段５がソースプログラム１をベクトル化し、参照最適化手段７がソースプログラムを解析して最内ループの繰り返し回数の初期値が外側ループの繰り返しに依存する場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびメモリ上からグローバルレジスタへデータ展開する命令を、ループの前に出力し、定義最適化手段８が依存すると検出された場合に、外側ループの繰り返し回数を内側ループの終値とし、かつ先頭を固定したベクトル長として実行指示する命令、およびグローバルレジスタの内容をメモリ上へ転送する命令を、ループの後に出力するようにしている。
【００２１】
従って、コンパイル時に多重ループのループがベクトル化された場合にそのループ内でベクトル長が変化などしてもベクトルレジスタのグローバル化を行い、実行効率の向上を図ることが可能となる。
【００２２】
【発明の実施の形態】
次に、図１から図６を用いて本発明の実施の形態および動作を順次詳細に説明する。
【００２３】
図１は、本発明のシステム構成図を示す。
図１において、ソースプログラム１は、ベクトル化対象のソースプログラムであって、例えば後述する図４の（ａ）などのソースプログラムである。
【００２４】
コンパイラ２は、ソースプログラム１を入力とし、最適化などを行い、実行可能形式のオブジェクトプログラム１０を生成するものであって、ここでは、ソースプログラム解析手段３、最適化手段４、コード生成手段９などから構成されるものである。
【００２５】
ソースプログラム解析手段３は、ソースプログラム１を形態素解析、構文解析などを行い、中間言を生成するものである。ここで、実際は、形態素解析および構文解析した情報を付加した中間言をもとに以降説明するベクトル化、最適化などを行うが、説明を分かり易くするために、ソースプログラムをベクトル化、最適化などするとして説明を行う。
【００２６】
最適化手段４は、ソースプログラムの最適化を行うものであって、ここでは、ベクトル化手段５および最適化実施手段６などから構成されるものである。
ベクトル化手段５は、ソースプログラム１をベクトル化するものであって、例えば後述する図４の（ａ）のソースプログラム１をベクトル化して図４の（ｂ）に示すプログラムにするものである。
【００２７】
最適化実施手段６は、ベクトル化されたプログラムを最適化するものであって、ここでは、参照最適化手段７および定義最適化手段８などから構成されるものである。
【００２８】
参照最適化手段７は、ベクトル化されたプログラムの参照を最適化（グローバル化）するものである（図２および図３を用いて後述する）。
定義最適化手段８は、ベクトル化されたプログラムの定義を最適化（グローバル化）するものである（図２および図３を用いて後述する）。
【００２９】
コード生成手段９は、最適化後のプログラムから実行可能形式のオブジェクトプログラム１０を生成するものである。
オブジェクトプログラム１０は、実行可能形式のプログラムである。
【００３０】
次に、図２および図３のフローチャートを用いて図１の構成の動作を詳細に説明する。
（１）  図２および図３は、本発明の動作説明フローチャートを示す。
【００３１】
図２において、Ｓ１は、ソースプログラムの入力を行う。これは、例えば後述する図４の（ａ）のソースプログラム１を図１のコンパイラ１が読み込む。そして、ソースプログラム１の形態素解析、構文解析などを行う。
【００３２】
Ｓ２は、多重ループか判別する。これは、Ｓ１で入力されたソースプログラム１を形態素解析、構文解析などした情報をもとに、当該ソースプログラム中に多重ループの部分があるか判別する。例えば図４の（ａ）のソースプログラムのように、多重ループ（ｄｏ文の多重ループ）があるか判別する。ＹＥＳの場合には、本願発明の処理である、Ｓ３に進む。ＮＯの場合には、終了する。
【００３３】
Ｓ３は、配列要素の参照／定義が存在して、外側ループの添字に依存しているか判別する。ＹＥＳの場合には、Ｓ１３に進む。ＮＯの場合には、Ｓ４からＳ８を実行する。
【００３４】
Ｓ４は、Ｓ３のＮＯと判別され、例えば後述する図４の（ａ）のソースプログラム（配列要素の参照／定義が存在して、外側ループの添字に依存していないプログラム）であるので、図４の（ｂ）のようにベクトル化を行うと共に、ループの繰り返し回数をベクトル長として、実行指示する命令を出力する。例えば後述する図４の（ｃ）の参照（▲１▼、▲２▼のそれぞれ上段の１行の命令）の部分を出力する。
【００３５】
Ｓ５は、メモリ上からグローバルレジスタへデータ展開させる命令を出力する。例えば後述する図４の（ｃ）の参照（▲１▼、▲２▼のそれぞれ下段の１行の命令）の部分を出力する。
【００３６】
Ｓ６は、ループの繰り返し回数をベクトル長として、実行指示する命令を出力する。例えば後述する図４の（ｃ）の定義（▲１▼''、▲２▼''のそれぞれ上段の１行の命令）の部分を出力する。
【００３７】
Ｓ７は、グローバルレジスタの内容をメモリ上へ転送させる命令を出力する。例えば後述する図４の（ｃ）の参照（▲１▼''、▲２▼''のそれぞれ下段の１行の命令）の部分を出力する。
【００３８】
Ｓ８は、終りか判別する。ＹＥＳの場合には、終了する。ＮＯの場合には、Ｓ３に戻り繰り返す。
以上によって、例えば後述する図４の（ａ）のソースプログラム１について、（ｂ）に示すようにベクトル化を行い、（ｃ）の参照（▲１▼、▲２▼）および定義（▲１▼''、▲２▼''）に示すように、ループの外側にメモリアクセス命令を配置してグローバル化を行い、この例では、メモリアクセス回数を１回に削減（（ｎ−１）回分のメモリアクセスを減少）して実行効率を向上させることが可能となった。
【００３９】
（２）  図２において、Ｓ１３は、内側ループの繰り返しが外側ループの繰り返しによって変化するか判別する。ＹＥＳの場合には、図３のＳ２４に進む。ＮＯの場合には、Ｓ１４に進む。
【００４０】
Ｓ１４は、ＩＦ文の真／偽の回数をベクトル長として、実行指示する命令を出力する。例えば後述する図５の（ａ）のソースプログラム（内側ループの繰り返しが外側ループの繰り返しによって変化しないソースプログラム）であるので、図５の（ｂ）のようにベクトル化を行うと共に、ＩＦ文の真／偽の回数をベクトル長として、実行指示する命令を出力する。例えば後述する図５の（ｃ）の参照（▲３▼の上段の１行の命令）の部分を出力する。
【００４１】
Ｓ１５は、メモリ上からグローバルレジスタへデータ展開させる命令を出力する。例えば後述する図５の（ｃ）の参照（▲３▼の下段の１行の命令）の部分を出力する。
【００４２】
Ｓ１６は、ＩＦ文の真／偽の回数をベクトル長として、実行指示する命令を出力する。例えば後述する図５の（ｃ）の参照（▲３▼の上段の１行の命令）の部分を出力する。
【００４３】
Ｓ１７は、グローバルレジスタの内容をメモリ上へ転送させる命令を出力する。例えば後述する図５の（ｃ）の参照（▲３▼''の下段の１行の命令）の部分を出力する。そして、Ｓ８で終りか判別し、ＹＥＳの場合には終了する。ＮＯの場合に、Ｓ３に戻り繰り返す。
【００４４】
以上によって、例えば後述する図５の（ａ）のソースプログラム１について、（ｂ）に示すようにベクトル化を行い、（ｃ）の参照（▲３▼）および定義（▲３▼''）に示すように、ループの外側にメモリアクセス命令を配置してグローバル化を行い、この例では、メモリアクセス回数を１回に削減して実行効率を向上させることが可能となった。
【００４５】
（３）  図３において、Ｓ２４は、外側のループの添字を内側ループの終値とした、先頭を固定したループの繰り返し回数をベクトル長として、実行指示する命令を出力する。例えば後述する図６の（ｃ）の参照（▲４▼の１行の命令）の部分を出力する。
【００４６】
Ｓ２５は、メモリ上からグローバルレジスタへデータ展開させる命令を出力する。例えば後述する図６の（ｃ）の参照（▲４▼の下段の１行の命令）の部分を出力する。
【００４７】
Ｓ２６は、ループの繰り返し回数をベクトル長として、実行指示する命令を出力する。例えば後述する図６の（ｃ）の定義（▲４▼''の上段の１行の命令）の部分を出力する。
【００４８】
Ｓ２７は、グローバルレジスタの内容をメモリ上へ転送させる命令を出力する。例えば後述する図６の（ｃ）の参照（▲４▼''の下段の１行の命令）の部分を出力する。そして、Ｓ８で終りか判別し、ＹＥＳの場合には終了する。ＮＯの場合に、Ｓ３に戻り繰り返す。
【００４９】
以上によって、例えば後述する図６の（ａ）のソースプログラム１について、（ｂ）に示すようにベクトル化を行い、（ｃ）の参照（▲４▼）および定義（▲４▼''）に示すように、ループの外側にメモリアクセス命令を配置してグローバル化を行い、この例では、メモリアクセス回数を１回に削減して実行効率を向上させることが可能となった。
【００５０】
図４は、本発明の説明図（その１）を示す。
図４の（ａ）は、ソースプログラムの例を示す。ループを矢印で示し、１つのループの内部に２つのループが存在する多重ループの例を示す。
【００５１】
図４の（ｂ）は、図４の（ａ）のソースプログラムをベクトル化した例を示す。
図４の（ｃ）は、図４の（ｂ）のベクトル化した後に、グローバル化（最適化）を行った後の状態を示す。ここでは、グローバル化した結果、参照（▲１▼、▲２▼）の部分および定義（▲１▼''、▲２▼''）の部分を出力する。参照の▲１▼、▲２▼の上段の１行がループの繰り返し回数をベクトル長として実行指示する命令を表し、下段の１行がメモリ上のデータをグローバルレジスタ上に展開する命令を表す。また、定義の▲１▼''、▲２▼''の上段の１行がループの繰り返し回数をベクトル長として実行指示する命令を表し、下段の１行がグローバルレジスタ上のデータをメモリ上に転送する命令を表す。
【００５２】
図５は、本発明の説明図（その２）を示す。
図５の（ａ）は、ソースプログラムの例を示す。ループを矢印で示し、１つのループの内部にループが存在する多重ループの例を示し、ここでは、内部のループにＩＦ文が存在するものである。
【００５３】
図５の（ｂ）は、図５の（ａ）のソースプログラムをベクトル化した例を示す。
図５の（ｃ）は、図５の（ｂ）のベクトル化した後に、グローバル化（最適化）を行った後の状態を示す。ここでは、グローバル化した結果、参照（▲３▼）の部分（無くてもよい）および定義（▲３▼''）の部分を出力する。参照の▲３▼の上段の１行がＩＦ文の真あるいは偽の回数をベクトル長として実行指示する命令を表し、下段の１行がメモリ上のデータをグローバルレジスタ上に展開する命令を表す。また、定義の▲３▼''の上段の１行がＩＦ文の真あるいは偽の回数をベクトル長として実行指示する命令を表し、下段の１行がグローバルレジスタ上のデータをメモリ上に転送する命令を表す。
【００５４】
尚、図５の（ａ），（ｂ），（ｃ）中のなみ線の部分を欄外の矩形で囲んだ３つの文にそれぞれ置換すると、図５の（ｃ）の参照▲３▼の部分が不要となる。
図６は、本発明の説明図（その３）を示す。
【００５５】
図６の（ａ）は、ソースプログラムの例を示す。ループを矢印で示し、１つのループの内部にループが存在する多重ループの例を示す。
図６の（ｂ）は、図６の（ａ）のソースプログラムをベクトル化した例を示す。
【００５６】
図６の（ｃ）は、図６の（ｂ）のベクトル化した後に、グローバル化（最適化）を行った後の状態を示す。ここでは、グローバル化した結果、参照（▲４▼）の部分および定義（▲４▼''）の部分を出力する。参照の▲４▼の上段の１行が外側のループの添字を内側のループの終値とした、先頭を固定したループの繰り返し回数をベクトル長として実行指示する命令を表し、下段の１行がメモリ上のデータをグローバルレジスタ上に展開する命令を表す。また、定義の▲４▼''の上段の１行が外側のループの添字を内側のループの終値とした、先頭を固定したループの繰り返し回数をベクトル長として実行指示する命令を表し、下段の１行がグローバルレジスタ上のデータをメモリ上に転送する命令を表す。
【００５７】
【発明の効果】
以上説明したように、本発明によれば、コンパイル時に多重ループのループがベクトル化された場合にそのループ内でベクトル長が変化などしてもベクトルレジスタのグローバル化を行い、実行効率の向上を図ることが可能となる。
【図面の簡単な説明】
【図１】本発明のシステム構成図である。
【図２】本発明の動作説明フローチャート（その１）である。
【図３】本発明の動作説明フローチャート（その２）である。
【図４】本発明の説明図（その１）である。
【図５】本発明の説明図（その２）である。
【図６】本発明の説明図（その３）である。
【図７】従来技術の説明図である。
【符号の説明】
１：ソースプログラム
２：コンパイラ
３：ソースプログラム解析手段
４：最適化手段
５：ベクトル化手段
６：最適化実施手段
７：参照最適化手段
８：定義最適化手段
９：コード生成手段
１０：オブジェクトプログラム
【図１】
0003734658.tif 000004
【図２】
0003734658.tif 000005
【図３】
0003734658.tif 000006
【図４】
0003734658.tif 000007
【図５】
0003734658.tif 000008
【図６】
0003734658.tif 000009
【図７】
0003734658.tif 000010