(57)【要約】【課題】オブジェクトコードの実行時、メモリアクセス命令の適切な追い越し制御が困難であること。【解決手段】ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータは、ループ解析部とコード生成部を含む。ループ解析部は、ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を認識する。コード生成部は、上記ループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳する。その際、コード生成部は、ループ制御文のループの繰返し毎に、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定する。【選択図】図６
2019164704.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータに、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳する処理を行わせ、
前記処理では、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する、
コンパイラ。
【請求項２】
前記算出では、配列の特定の次元目の要素が前記リストベクトルによって指定されている場合、前記ソースプログラムの前記配列の宣言情報から、ベースアドレス、前記配列の１つの要素のサイズ、前記配列の次元数、前記配列の各次元の情報を取得し、該取得した情報に基づいて前記先頭アドレスと前記終端アドレスを算出する、
請求項１に記載のコンパイラ。
【請求項３】
前記処理では、さらに、前記リストベクトル命令の前記命令語に設定した前記先頭アドレスから前記終端アドレスまでのアドレス範囲と前記命令リストに含まれる他のメモリアクセス系命令がアクセスする前記メモリのアドレス範囲との重複の有無を判定し、該判定結果に基づいて、前記命令語中に、メモリアクセスのアドレス領域のプログラム上での重なりの有無に応じて所定の値が設定される追い越しビットを設定する、
請求項１または２に記載のコンパイラ。
【請求項４】
前記判定では、前記リストベクトル命令がベクトルギャザー命令の場合、前記他のメモリアクセス系命令は、前記リストベクトル命令に先行するストア命令である、
請求項３に記載のコンパイラ。
【請求項５】
前記判定では、前記リストベクトル命令がベクトルスキャッター命令の場合、前記他のメモリアクセス系命令は、前記リストベクトル命令の後続のロード命令である、
請求項３に記載のコンパイラ。
【請求項６】
前記処理では、前記算出に必要な情報がコンパイル時に取得できない場合、前記算出に必要な情報を前記オブジェクトプログラムの実行時に取得して前記先頭アドレスと前記終端アドレスを算出して所定のレジスタに格納する命令を生成する、
請求項１乃至５の何れかに記載のコンパイラ。
【請求項７】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータであって、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を認識するループ解析部と、
前記ループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳するコード生成部と、を含み、
前記コード生成部は、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する、
コンピュータ。
【請求項８】
前記コード生成部は、配列の特定の次元目の要素が前記リストベクトルによって指定されている場合、前記ソースプログラムの前記配列の宣言情報から、ベースアドレス、前記配列の１つの要素のサイズ、前記配列の次元数、前記配列の各次元の情報を取得し、該取得した情報に基づいて前記先頭アドレスと前記終端アドレスを算出する、
請求項７に記載のコンピュータ。
【請求項９】
前記コード生成部は、さらに、前記リストベクトル命令の前記命令語に設定した前記先頭アドレスから前記終端アドレスまでのアドレス範囲と前記命令リストに含まれる他のメモリアクセス系命令がアクセスする前記メモリのアドレス範囲との重複の有無を判定し、該判定結果に基づいて、前記命令語中に、メモリアクセスのアドレス領域のプログラム上での重なりの有無に応じて所定の値が設定される追い越しビットを設定する、
請求項７または８に記載のコンピュータ。
【請求項１０】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータが実行するコード生成方法であって、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を認識し、
前記ループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳し、
前記翻訳では、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する、
コンピュータのコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンピュータ、およびコンピュータのコード生成方法に関する。
【背景技術】
【０００２】
一般に、命令処理の高速化を目的としたベクトル計算機（ベクトル処理装置）においては、メモリアクセス命令の追い越し制御が行われている。メモリアクセス命令の追い越し制御は、メモリアクセス系の命令で先行するメモリストア系命令がアクセスする領域に、続いて発行されるメモリロード系命令のアクセス領域が重複していない場合、後続のメモリロード系命令のメモリアクセスを先に実行させることにより実現される。これにより、メモリアクセス性能の向上を図ることができる。対象となるメモリアクセス系の命令は、ベクトルロード命令、ベクトルストア命令の他に、ベクトルスキャッター命令およびベクトルギャザー命令といったリストベクトル命令がある。リストベクトル命令は、複数のアクセス先のアドレスを配列等により間接参照させるリストアドレスにより、アクセス先のアドレスを指定する。
【０００３】
例えば、特許文献１では、リストベクトルを繰り返し処理するループ制御文を含むソースプログラムのコンパイル時、リストベクトル命令によってアクセスする配列の先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定する。そして、ベクトル計算機では、リストベクトル命令の命令語に設定された先頭アドレスおよび終端アドレスを使用して、他のメモリアクセス系命令がアクセスするメモリのアドレス範囲との重複の有無を判定し、追い越し制御の実行を制御している。特許文献２にも、特許文献１と同様の技術が記載されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特許第３６９８０２７号公報
【特許文献２】特許第３７８９３２０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上述したように特許文献１では、リストベクトル命令によってアクセスする配列の先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定している。即ち、リストベクトル命令は、アクセスする配列の全範囲をアクセスするものとしている。しかしながら、リストベクトル命令は配列の一部分だけをアクセスする場合がある。そのため、リストベクトル命令によってアクセスする配列の先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定する構成では、リストベクトル命令によってアクセスするメモリのアドレス範囲が実際よりも広くなる場合がある。そうなると、他のメモリアクセス系命令がリストベクトル命令によってアクセスする配列と同じ配列をアクセスする場合、実際には同じ配列の異なる部分を互いにアクセスしている場合であっても、アクセスするメモリのアドレス範囲が互いに重複すると判定される。その結果、実際には追い越し可能な場合であっても、追い越し不可と判定される場合があった。
【０００６】
本発明の目的は、上述した課題、即ちメモリアクセス命令の適切な追い越し制御が困難である、という課題を解決するコンパイラを提供することにある。
【課題を解決するための手段】
【０００７】
本発明の一形態に係るコンパイラは、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータに、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳する処理を行わせ、
前記処理では、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する。
【０００８】
また本発明の他の形態に係るコンピュータは、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータであって、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を認識するループ解析部と、
前記ループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳するコード生成部と、を含み、
前記コード生成部は、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する。
【０００９】
また本発明の他の形態に係るコンピュータのコード生成方法は、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータが実行するコード生成方法であって、
前記ソースプログラムを解析して、リストベクトルを繰り返し処理するループ制御文を認識し、
前記ループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳し、
前記翻訳では、前記ループ制御文のループの繰返し毎に、前記リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、前記先頭アドレスと前記終端アドレスを前記リストベクトル命令の命令語に設定する。
【発明の効果】
【００１０】
本発明は上述した構成を有することにより、メモリアクセス命令の適切な追い越し制御が可能である。
【図面の簡単な説明】
【００１１】
【図１】本発明の第１の実施形態に係るコンパイラのブロック図である。
【図２】本発明の第１の実施形態に係るコンパイラが生成するリストベクトル命令の命令語の一部を示す図である。
【図３】翻訳対象となるソースプログラムの例を示す図である。
【図４】翻訳結果のオブジェクトプログラムの一部の例を示す図である。
【図５】配列Ａのメモリイメージを示す図である。
【図６】本発明の第１の実施形態に係るコンピュータのブロック図である。
【図７】本発明が解決しようとする課題を説明するためのＤＯループの例を示す図である。
【図８】本発明が解決しようとする課題を説明するためのＤＯループがＪ＝２、３のときの命令列と配列Ａのデータ並びの例を示す図である。
【発明を実施するための形態】
【００１２】
次に本発明の実施の形態について図面を参照して詳細に説明する。
[第１の実施形態]
先ず、本発明の第１の実施形態について説明する。
【００１３】
＜本実施形態の背景＞
一般に、高速なプロセッサ性能と低速なメモリ性能とのギャップが計算機としての実効性能に大きな影響を及ぼしている。メモリ性能については、メモリロード命令のレイテンシが特に重要な要素である。
【００１４】
また、命令処理の高速化を目的としたベクトル処理方式においては、メモリアクセス命令の追い越し制御が行われている。メモリアクセス命令の追い越し制御は、メモリアクセス系の命令で先行するメモリストア系命令がアクセスする領域に、続いて発行されるメモリロード系命令のアクセス領域が重複していない場合、後続のメモリロード系命令のメモリアクセスを先に実行させることにより実現される。これにより、メモリアクセス性能の向上を図ることができる。しかし、リストベクトルによるランダムなアクセスをともなうベクトルギャザー命令、および、ベクトルスキャッター命令は、メモリアクセスに規則性がなくアドレス依存の解析が難しく、効果的な追い越し制御が困難という問題がある。
【００１５】
特許文献１では、ベクトルギャザー命令、および、ベクトルスキャッター命令がアクセスするメモリの先頭アドレスは、リストアドレスが指定された配列がメモリに割り付けられた値とし、その終端アドレスは、その先頭アドレスに配列のサイズを加算した値としている。即ち、リストアドレスの内容によらず配列全体をアクセスする範囲として、命令の追い越しの可否を決めている。このため同一配列へのロードとストアがループ中に混在する場合、決して追い越しが行われない。これに対して、本実施形態ではリストアドレス指定された次元のループの繰返しごとの先頭アドレスから終端アドレスまでをベクトルギャザー命令、および、ベクトルスキャッター命令がアクセスするメモリの範囲と設定することで、リストアドレスによってアクセスされる範囲と重ならない領域にアクセスする命令においては命令の追い越しが可能となり、特許文献１に記載の発明に比べて追い越し可能な命令が増え、メモリアクセス系の処理時間のさらなる改善とプログラムの高速化が見込まれる。
【００１６】
＜本実施形態の特徴＞
本実施形態では、ベクトルギャザー命令、または、ベクトルスキャッター命令がアクセスするアドレス領域を解析し、同一ループ内の他のメモリアクセス系命令がアクセスする領域と重なりのある範囲を判定する機能を有するコンパイラを提供する。ベクトルギャザー命令、ベクトルスキャッター命令にこのコンパイラが判定したメモリアクセスに重なりのある範囲の情報を付与することで、ハードウェアにおけるベクトルギャザー命令、ベクトルスキャッター命令の追い越しの制御を簡単にするとともに、追い越し可能な命令の数を増加させる。これにより、メモリアクセスの処理時間を改善し、プログラムを高速化できる。
【００１７】
＜本実施形態が解決しようとする課題＞
ベクトルギャザー命令やベクトルスキャッター命令では、ベクトルレジスタの各要素を実行アドレスとしてメモリにアクセスするため、メモリアクセスに規則性がなくアドレス依存の解析が難しい。この問題を解決するために、例えば、特許文献１で提案されている追い越し制御機能の場合、ベクトルギャザー命令やベクトルスキャッター命令がアクセスする配列の先頭アドレスから終端アドレスまでを命令のアクセス範囲であるとし、このアクセス範囲が他のメモリアクセス系命令のアクセス範囲と重なりがなければハードウェアは追い越し可能と判定して追い越し制御を行っている。しかし、この方法では、ベクトルギャザー命令やベクトルスキャッター命令によってアクセスするメモリのアドレス範囲が実際よりも広くなって、実際には追い越し可能な場合であっても、追い越し不可と判定されるケースが発生する。
【００１８】
例えば、図７に示すコード例の（１）の式では配列Ａと配列Ｂの間に依存関係はなく、配列Ｂのベクトルギャザー命令は配列Ａのベクトルスキャッター命令を追い越してよいと判断できる。しかし、特許文献１の技術では、（１）と（２）の間では配列Ａの参照定義の依存関係があるため追い越しできないと判断してしまう。
【００１９】
図８に上記の例のコードのＪ＝２のとき、および、Ｊ＝３のときの命令列と、配列Ａのデータ並びを示す。Ｊ＝２のとき、配列Ａのストア命令がアクセスする領域は図８の領域５−２であり、配列Ａのロード命令がアクセスする領域は図８の領域５−１であるため、アクセスする領域に重なりはなく、ストア命令とロード命令の間に依存関係はない。また、Ｊ＝３のときはストア命令がアクセスする領域は領域５−３、ロード命令がアクセスする領域は領域５−２となり、やはりストア命令とロード命令がアクセスする領域に重なりはない。つまり、ＪがＭ（２≦Ｍ≦Ｎ）のとき、（２）でロードする配列Ａ（Ｉ，Ｍ−１）の要素は、（１）のストア先である配列Ａ（Ｌ（Ｉ），Ｍ）とはメモリ上重なりはないため、（２）のロード命令は（１）を追い越すことができる。しかし、特許文献１では上述の通り配列Ａの先頭アドレスから終端アドレスまでをアクセス範囲と設定するため、（１）と（２）がアクセスする領域は同じ配列Ａで重なりありとみなされ、追い越し不可と判定されていた。
【００２０】
＜本実施形態による解決手段＞
まず始めに、本実施形態が必要とするハードウェア、および、コンパイラの要件を述べる。本実施形態は、リストベクトルで指定されたベクトルレジスタの各要素に格納されたメモリ上のアドレスが指し示すデータをロード先のベクトルレジスタにロードするベクトルギャザー命令、および、リストベクトルで指定されたベクトルレジスタの各要素に格納されたメモリ上のストア先のアドレスにベクトルレジスタ上のデータをストアするベクトルスキャッター命令を命令セットに備えたＣＰＵを有するハードウェア（ベクトル計算機）を対象としている。このハードウェアは、ベクトルロード／ストア命令のメモリアクセスの重なりがなければ命令の追い越しを可能とする追い越し制御機能を備えているものとする。また、コンパイラは、配列の宣言情報より配列の次元数や要素数、サイズなどの情報を静的に取得できる機能を有しているものとする。以上が、本実施形態が必要とするハードウェア、およびコンパイラの要件である。これらは従来技術でも用いられているものである。
【００２１】
本実施形態は、リストベクトルでアクセスされる配列、および、リストベクトルに関する情報の解析を行うリストベクトル解析部と、解析で得られたリストアクセスを行うメモリ領域の先頭アドレスと終端アドレスを命令語中にもつベクトルギャザー命令、および、ベクトルスキャッター命令を生成する手段と、命令語にセットしたアドレスを用いて他のメモリアクセス系命令との間にアクセスするメモリ領域に重なりがないかどうかを判定するリストアドレス重なり判定部とを有するコンパイラを提供することにより、リストアクセスを行うベクトル命令の追い越し制御を簡単、かつ効果的にすることで、プログラムを高速化する。
【００２２】
＜本実施形態の構成＞
図１は、本発明の第１の実施形態に係るコンパイラ１００の構成図である。コンパイラ１００は、ソースプログラム１０１を翻訳して命令語１０２を生成する。命令語１０２は、オブジェクトコードとも呼ばれる。命令語１０２は、ベクトル計算機で実行される。このようにコンパイラ１００は、ベクトル計算機に対するオブジェクトプログラムを生成する。
【００２３】
コンパイラ１００は、ループ内命令生成処理部１１０とリストベクトル解析部１２０とを含んで構成されている。またループ内命令生成処理部１１０は、先行命令生成部１１１、ベクトルギャザー／スキャッター命令生成部１１２、後続命令生成部１１３、およびリストアドレス重なり判定部１１４を含んで構成されている。
【００２４】
コンパイラ１００は、ソースプログラム１０１を解析してリストベクトルを繰り返し処理するループ制御文を認識すると、そのループ制御文に対してループ内命令生成処理部１１０とリストベクトル解析部１２０とを適用するように構成されている。
【００２５】
リストベクトル解析部１２０は、ループ制御文のループの繰返しごとにリストベクトルによってアクセスされうるアドレスの先頭アドレスと終端アドレスを算出するように構成されている。
【００２６】
ループ内命令生成処理部１１０は、ループ制御文を、リストベクトル命令（ベクトルギャザー命令またはベクトルスキャッター命令）を含む一連の命令リスト１３０に翻訳するように構成されている。その際、先行命令生成部１１１は、ベクトルギャザー命令またはベクトルスキャッター命令に先行する命令を生成する。また、ベクトルギャザー／スキャッター命令生成部１１２は、ベクトルギャザー命令またはベクトルスキャッター命令を生成する。またベクトルギャザー／スキャッター命令生成部１１２は、生成したベクトルギャザー命令またはベクトルスキャッター命令の命令語に、リストベクトル解析部１２０で算出された先頭アドレスと終端アドレスを格納したレジスタをセットする。また、後続命令生成部１１３は、ベクトルギャザー命令またはベクトルスキャッター命令の後続の命令を生成する。また、リストアドレス重なり判定部１１４は、リストベクトル解析部１２０で算出したリストアドレスの先頭から終端までの範囲をリストベクトル命令（ベクトルギャザー命令、および、ベクトルスキャッター命令）のメモリアクセス範囲とし、ベクトルギャザー命令の場合は先行のストア命令、ベクトルスキャッター命令の場合は後続のロード命令がアクセスするメモリ領域との間に重なりがないかどうかを判定する。そしてリストアドレス重なり判定部１１４は、その判定結果に基づいて、リストベクトル命令の命令語中に、メモリアクセスのアドレス領域のプログラム上での重なりの有無に応じて所定の値が設定される追い越しビットを設定する。
【００２７】
図２は、リストベクトル命令の命令語の一部の構造の一例を示す。この例の命令語は、オペコードＯＰ、追い越しビットＶ、メモリをアクセスするアドレスが格納されているベクトルレジスタを指定するフィールドＶＲ、リストベクトル解析部１２０が算出した先頭アドレスを格納したレジスタを指定するフィールドＳｍｉｎ、リストベクトル解析部１２０が算出した終端アドレスを格納したレジスタを指定するフィールドＳｍａｘを含んで構成されている。コンパイル時に重なりがないことが確定となるリストベクトル命令の場合、追い越しビットＶは“１”になり、それ以外は“０”になる。
【００２８】
従って、上記命令語を実行するハードウェア（ベクトル計算機）では、命令語の追い越しビットＶが“１”のときは無条件で追い越し制御を行う。また、命令語の追い越しビットＶが“０”のときは、ハードウェア（ベクトル計算機）は、重なり範囲の先頭アドレスと終端アドレスを命令語のSmin、Smaxで指定されたレジスタから取得して、命令の追い越しを禁止する範囲を認識する。そのため、ハードウェア（ベクトル計算機）上でリストアドレスの解析を行わずとも命令の追い越し制御が可能となる。
【００２９】
＜本実施形態の動作＞
次に本実施形態の動作を、図３に示したソースプログラムを例にして説明する。
【００３０】
図３に示すソースプログラムは、フォートランソースコードのＤＯループの一例である。式３−１の左辺の配列Ａは、リストベクトルＬによって１次元目の要素が指定されている。コンパイラ１００は、図３に示すソースプログラムを機械語（命令語）レベルに翻訳する。
【００３１】
図４は図３のソースプログラムの翻訳結果の一部を示す。図３の式３−１は、図４の４−１〜４−５のように翻訳され、図３の式３−２は、図４の４−６〜４−７のように翻訳される。
【００３２】
特許文献１では、式３−１に対してベクトルスキャッター命令４−５を生成する際、配列Ａ全体をアクセスする範囲に設定するため、後続の式３−２に対して生成する配列Ａのロード命令４−６とメモリアクセス領域に重なりがあり、追い越し不可と判定する。本実施形態では、式３−１に対してベクトルスキャッター命令４−５を生成する際、リストベクトル解析部１２０は、配列Ａについて以下の解析処理を実施する。
【００３３】
先ず、リストベクトル解析部１２０は、配列の宣言情報から次の情報を取得する。
（ａ）配列のベースアドレス
（ｂ）配列の一つの要素のサイズ
（ｃ）配列の次元数
（ｄ）各次元の情報（要素の数、要素間の距離、下限）
【００３４】
次に、リストベクトル解析部１２０は、上記取得した情報を用いてループの繰返しごとの１次元目の先頭アドレスと終端アドレスを以下のように求める。
先頭アドレス＝ベースアドレス＋（（１次元目の要素数×要素のサイズ）×（２次元目のインデックス−１））
終端アドレス＝先頭アドレス＋（１次元目の要素数×要素のサイズ）
【００３５】
ベクトルギャザー／スキャッター命令生成部１１２は、リストベクトル解析部１２０で算出された先頭アドレスと終端アドレスを、配列Ａに対して生成したベクトルスキャッター命令４−５の命令語にセットする。
【００３６】
図５は、図３の外側ループでＪ＝３のときの配列Ａのメモリイメージを示す。外側ループのＪ＝３の繰返しでリストアクセスを行うメモリ領域は、図５のＡ（Ｌ（Ｉ），３）で指し示した斜線の範囲となる。よって、リストベクトル解析部１２０で算出した先頭アドレスと終端アドレスは、図５の斜線の範囲の先頭と終端のアドレスとなる。図３の式３−２に対して、Ａ（Ｉ，Ｊ−１）のロード命令４−６が生成されるが、Ｊ＝３のとき、ロード命令４−６は、図５のＡ（Ｉ，２）で指し示した点線で囲まれた範囲にアクセスする。リストアクセスされる斜線の範囲と重なりがないため、Ａ（Ｉ，２）のロード命令４−６は、先行するＡ（Ｌ（Ｉ），３）のベクトルスキャッター命令４−５を追い越すことが可能であることが分かる。
【００３７】
リストベクトル解析部１２０は、上記の通りループの繰返しごとにリストアクセスするアドレスの先頭と終端を求め、ベクトルギャザー／スキャッター命令生成部１１２は、それをベクトルスキャッター命令４−５の命令語にセットする。
【００３８】
リストアドレス重なり判定部１１４は、上記セットされた先頭アドレスと終端アドレスをベクトルスキャッター命令４−５の命令語から取得し、その範囲と後続のロード命令４−６がアクセスする範囲との間に重なりがないかどうかの判定を行う。図３のループの場合、図５に示したように式３−２に対応する配列Ａのロード命令４−６のアクセス範囲は配列Ａの２次元目がＪ−１の範囲であり、式３−１に対応するベクトルスキャッター命令４−５は配列Ａの２次元目がＪの範囲である。よって、リストアドレス重なり判定部１１４は、このループにおいて配列Ａの定義参照の依存関係はなく、式３−２に対応するロード命令４−６は、式３−１に対応するベクトルスキャッター命令４−５を追い越すことができると判断する。リストアドレス重なり判定部１１４は、後続のロード命令との間にアクセスするメモリ領域の重なりが見つからなかった場合は、ベクトルスキャッター命令４−５の命令語の追い越しビットＶを“１”にする。リストアドレス重なり判定部１１４は、コンパイル時に静的に取得できる配列情報からアクセス領域の重なりの有無の判別がつかない場合は、命令語の追い越しビットＶを“０”にする。
【００３９】
上記の手法により生成したリストベクトル命令の命令語の情報を用いて、ハードウェア（ベクトル計算機）は追い越し制御を行う。ハードウェアでは、まずコンパイラが命令語にセットした追い越しビットＶを確認し、追い越しビットＶの値が“１”であればその命令に対して無条件で追い越し制御を行う。追い越しビットＶの値が“０”の場合、ハードウェアは命令語のフィールドＳｍｉｎ、Ｓｍａｘにセットされたレジスタからアクセス範囲の先頭アドレスと終端アドレスを取得し、ベクトルスキャッター命令の重なり範囲のアドレスと後続のロード命令がアクセスするアドレスとの比較を行うことで追い越し可否の判断を行い、追い越し可能なとき追い越し制御を行う。
【００４０】
図３に示したソースプログラムを例にベクトルスキャッター命令の場合について説明したが、本発明はベクトルギャザー命令についても同様に処理を実行し、先行するメモリストア系命令の追い越しが可能か否かをコンパイラ１００で判定し、ハードウェアでの判定に必要な情報を命令語にセットすることができる。
【００４１】
＜本実施形態の効果＞
特許文献１では、図３に示したソースプログラムの場合、式３−１に対応するベクトルスキャッター命令４−５は配列Ａの先頭アドレスから終端アドレスまでをアクセス範囲と設定するため、ベクトルスキャッター命令４−５とロード命令４−６がアクセスする領域は同じ配列Ａで重なりありとみなされ、追い越し不可と判定されていた。即ち、実際にはアドレスの重複がない領域にアクセスするにも関わらず追い越し不可と判定していた。これに対して、本実施形態では、ループの繰返し単位でのメモリアクセス範囲の解析機能により、特許文献１で追い越し不可と判定していた命令であっても追い越し制御が可能となる。これにより、ロード命令がストア命令を待ち合わせることによるメモリアクセスの性能低下が軽減され、プログラムの実行が高速化される。また、コンパイラでアドレスの重なりの判定を行うことで、ハードウェアで同様の処理を行う場合に比べハードウェアで消費するリソースを節約できること、および、ハードウェア資源の物理的な制約を受けないというメリットがある。さらに、命令の並べ換えなど命令の順序の変更を伴う最適化の適用が促進される効果もある。
【００４２】
[第２の実施形態]
次に、本発明の第２の実施形態について説明する。
【００４３】
第１の実施形態では、リストベクトル解析部１２０は、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出するために必要な情報を配列の宣言情報から取得した。しかし、フォートランの形状引継ぎ配列など、コンパイル時には配列の情報は不明であり、実行時にならないと分からない場合がある。本実施形態では、必要な情報が得られない場合、コンパイラ１００は、リストベクトル解析部１２０でアクセス領域のアドレスを算出する代わりに、実行時にそれらの値を計算する命令（機械語）を生成し、オブジェクトコードに追加する処理を行う。また、コンパイル時にアドレス値が確定しないため、リストアドレス重なり判定部１１４では追い越しビットＶに“０”をセットする。また、Ｓｍｉｎ、Ｓｍａｘが指し示すレジスタの内容は例えばＮＵＬＬ値としておく。具体的には、段落［００３３］に記載された、（ａ）配列のベースアドレス、（ｂ）配列の一つの要素のサイズ、（ｃ）配列の次元数、（ｄ）各次元の情報（要素の数、要素間の距離、下限）といった配列の構成に関する情報は、実行時には配列記述子というデータ構造に格納されている。そこで、コンパイラ１００のリストベクトル解析部１２０は、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出するために必要な情報を配列記述子から取得し、例えば段落［００３３］に記載した計算式と同様の計算式を使用してリストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、当該リストベクトル命令の命令語のＳｍｉｎ、Ｓｍａｘが指し示すレジスタに格納する命令を生成するように構成されている。
【００４４】
コンパイラ１００がリストベクトル解析部１２０で生成した上記命令により、ベクトル計算機におけるオブジェクトプログラムの実行時にリストベクトル命令がアクセスするメモリの先頭アドレスと終端アドレスが計算され、レジスタに格納される。ベクトル計算機は、追い越し制御装置においてそのレジスタを参照することで、リストベクトル命令のメモリアクセスの範囲を取得して命令の追い越し制御を実施する。これにより、コンパイル時に静的にアクセス領域のアドレスを算出した場合と同様に命令の追い越し制御を行うことが可能となる。
【００４５】
[第３の実施形態]
次に、本発明の第３の実施形態について説明する。
【００４６】
図６は、本実施形態に係るコンピュータのブロック図である。本実施形態に係るコンピュータ２００は、ソースプログラム２０１からベクトル計算機に対するオブジェクトコード２０２を生成するように構成されている。コンピュータ２００は、ループ解析部２１０とコード生成部２２０とを含んで構成される。
【００４７】
ループ解析部２１０は、ソースプログラム２０１を解析して、リストベクトルを繰り返し処理するループ制御文を認識するように構成されている。
【００４８】
コード生成部２２０は、ループ解析部２１０によって認識されたループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳するように構成されている。またコード生成部２２０は、ループ制御文のループの繰返し毎に、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定するように構成されている。
【００４９】
コンピュータ２００は、ＣＰＵ等のプロセッサとメモリとを有し、ハードディスク等に記録されたプログラムを実行することにより、ループ解析部２１０およびコード生成部２２０をコンピュータ上に実現する。
【００５０】
このように構成された本実施形態に係るコンピュータ２００は、以下のように機能する。即ち、ソースプログラム２０１がコンピュータ２００に入力されると、先ず、ループ解析部２１０は、ソースプログラム２０１を解析して、リストベクトルを繰り返し処理するループ制御文を認識する。次に、コード生成部２２０は、ループ解析部２１０によって認識されたループ制御文を、リストベクトル命令を含む一連の命令リストに翻訳する。その際、コード生成部２２０は、ループ制御文のループの繰返し毎に、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定する。
【００５１】
このように本実施形態によれば、適切な追い越し制御が可能である。その理由は、ループ制御文のループの繰返し毎に、リストベクトル命令によってアクセスするメモリの先頭アドレスと終端アドレスを算出し、先頭アドレスと終端アドレスをリストベクトル命令の命令語に設定するためである。
【産業上の利用可能性】
【００５２】
本発明は、コンパイラに適用でき、特にソースプログラムを翻訳してベクトル計算機向けのオブジェクトプログラムを生成するコンパイラに利用できる。
【符号の説明】
【００５３】
１００…コンパイラ
１０１…ソースプログラム
１０２…命令語
１１０…ループ内命令生成処理部
１１１…先行命令生成部
１１２…ベクトルギャザー／スキャッター命令生成部
１１３…後続命令生成部
１１４…リストアドレス重なり判定部
１２０…リストベクトル解析部
１３０…命令リスト
２００…コンピュータ
２０１…ソースプログラム
２０２…オブジェクトコード
２１０…ループ解析部
２２０…コード生成部
ＯＰ…オペコード
Ｖ…追い越しビット
ＶＲ…アドレスを格納したベクトルレジスタを指定するフィールド
Ｓｍｉｎ…先頭アドレスを格納したレジスタを指定するフィールド
Ｓｍａｘ…終端アドレスを格納したレジスタを指定するフィールド
【図１】
2019164704.tif 000003
【図２】
2019164704.tif 000004
【図３】
2019164704.tif 000005
【図４】
2019164704.tif 000006
【図５】
2019164704.tif 000007
【図６】
2019164704.tif 000008
【図７】
2019164704.tif 000009
【図８】
2019164704.tif 000010