(57)【特許請求の範囲】
【請求項１】
ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成するコンパイル最適化方法であって、コンピュータが実行する、
中間コードから配列参照を検出する段階と、
検出された配列参照を配列参照情報として第１のリストに登録する段階と、
前記第１のリストに登録された配列参照情報に基づき、配列に対する参照が特定の条件を満たしている配列を抽出して第２のリストに登録する段階と、
前記第２のリストに登録された配列に関し、前記中間コードにおいて当該配列へのメモリアクセスをバッファアクセスに変換する段階と、
を有する、コンパイル最適化方法。
【請求項２】
前記第２のリストに登録する段階は、前記第１のリストに登録された配列参照情報に基づき、２回以上参照されている配列を抽出して前記第２のリストに登録する段階である、請求項１に記載のコンパイル最適化方法。
【請求項３】
前記第２のリストに登録する段階は、前記第１のリストに登録された配列参照情報に基づき、当該配列の定義の直後に当該配列が参照されているような配列を抽出して前記第２のリストに登録する段階である、請求項１に記載のコンパイル最適化方法。
【請求項４】
ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成する処理をコンピュータに実行させるためのコンパイラであって、
前記コンピュータを、
中間コードから配列参照を検出し、検出された配列参照を配列参照情報として配列参照リストに登録する配列参照検出手段、
前記配列参照リストに登録された配列参照情報に基づき、２回以上参照されている配列を抽出してバッファ割り当てリストに登録する参照回数解析手段、及び
前記バッファ割り当てリストに登録された配列に関し、前記中間コードにおいて当該配列へのメモリアクセスをバッファアクセスに変換するメモリアクセス最適化手段、
として機能させるためのコンパイラ。
【請求項５】
ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成する処理をコンピュータに実行させるためのコンパイラであって、
前記コンピュータを、
中間コードから配列参照を検出し、検出された配列参照を配列参照情報として配列参照リストに登録する配列参照検出手段、
前記配列参照リストに登録された配列参照情報に基づき、配列の定義の直後に当該配列が参照されているような配列を抽出して定義参照リストに登録する定義参照解析手段、及び
前記定義参照リストに登録された配列に関し、前記中間コードにおいて当該配列へのメモリアクセスをバッファアクセスに変換するメモリアクセス最適化手段、
として機能させるためのコンパイラ。
【請求項６】
コンピュータに、ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成させる処理を実行させるためのプログラムであって、
中間コードから配列参照を検出する処理と、
検出された配列参照を配列参照情報として第１のリストに登録する処理と、
前記第１のリストに登録された配列参照情報に基づき、配列に対する参照が特定の条件を満たしている配列を抽出して第２のリストに登録する処理と、
前記第２のリストに登録された配列に関し、前記中間コードにおいて当該配列へのメモリアクセスをバッファアクセスに変換する処理と、
を前記コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムから最適化された実行コード（ロードモジュール）を生成するコンパイル最適化方法と、そのような最適化方法を実現するコンパイラとに関する。
【背景技術】
【０００２】
ソースプログラムから実行コードあるいはロードモジュールを生成する際に、計算機上での実行速度が高速化された実行コードを生成するための各種の手法が提案されている。
【０００３】
特許文献１（特開２００２−３２５１０９号公報）には、プログラミング言語Ｆｏｒｔｒａｎ９０の形状引継ぎ配列の刻み幅が１のときに、従来の最適化手法が適用できるようにするため、刻み幅が１かどうかを判定する分岐を追加することが、開示されている。
【０００４】
特許文献２（特開平５−１９７５６４号公報）には、レジスタに割り当てる変数として、ユーザはプログラム中にある関数の引数やグローバル変数に対して“ｒｅｇｉｓｔｅｒ”宣言を追加し、このユーザの指定に基づいてコンパイラが変数をレジスタに割り当てることにより、実行性能の高速化を実現することが開示されている。
【０００５】
特許文献３（特開平７−１４１１９８号公報）には、ループ内の演算順序を変更することにより、ループの繰り返しにまたがったレジスタの参照を行い、メモリアクセスを削減して高速化する技術が開示されている。ここでは、配列の１つの要素をレジスタに保持し、要素ごとに最適化を行うようにしている。
【０００６】
特許文献４（特開平１１−７４４０号公報）には、実行効率が向上するように積和演算の命令コードを発生することが開示されている。具体的には、乗算とデータ読み出しを並列実行し、累積加算とデータ読み出しとを並列実行するようにする。
【特許文献１】特開２００２−３２５１０９号公報
【特許文献２】特開平５−１９７５６４号公報
【特許文献３】特開平７−１４１１９８号公報
【特許文献４】特開平１１−７４４０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００７】
計算機が実際に演算を実行する場合、メモリにアクセスするよりもレジスタにアクセスする方がはるかに速く実行できるので、データはできるだけレジスタに保持するように、実行コードの最適化が行われている。しかしながら、レジスタに格納できるデータ量は限られているので、従来は、限られた変数のみがレジスタに割り当てられており、配列データはメモリに割り当てられるのが一般的である。すなわち、配列データはデータ量が多いので、レジスタには格納しきれない場合には、配列の全体をメモリ上に配置するようにしている。このため、配列データに対する演算を含む実行コードについては、実行性能が低下する、という問題点が生じる。
【０００８】
また、最近の計算機アーキテクチャでは、レジスタとメモリとの間に、データを一時的に格納するバッファ領域が設けられることが多い。このバッファ領域は、複数の要素情報を保持できるものであり、バッファ領域へのアクセスは、レジスタに対するアクセスよりも時間がかかるものの、典型的には、外付けのＤＲＡＭ（ダイナミック・ランダム・アクセス・メモリ）集積回路で構成されるメモリに対するアクセスよりは、十分に速く行えるようになっている。しかしながら、従来のコンパイラでは、このようなバッファ領域へアクセスするためのコードの生成を制御していない。
【０００９】
本発明の目的は、配列データを含む演算を高速に実行できる実行コード（ロードモジュール）を生成できるコンパイル最適化方法およびコンパイラを提供することにある。
【課題を解決するための手段】
【００１０】
本発明のコンパイル最適化方法は、ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成するコンパイル最適化方法であって、コンピュータが実行する、中間コードから配列参照を検出する段階と、検出された配列参照を配列参照情報として第１のリストに登録する段階と、第１のリストに登録された配列参照情報に基づき、配列に対する参照が特定の条件を満たしている配列を抽出して第２のリストに登録する段階と、第２のリストに登録された配列に関し、中間コードにおいてその配列へのメモリアクセスをバッファアクセスに変換する段階と、を有する。
【００１１】
本発明のコンパイル最適化方法において、第２のリストに登録する段階は、例えば、第１のリストに登録された配列参照情報に基づき、２回以上参照されている配列を抽出して第２のリストに登録する段階である。あるいは、第２のリストに登録する段階は、例えば、第１のリストに登録された配列参照情報に基づき、その配列の定義の直後にその配列が参照されているような配列を抽出して第２のリストに登録する段階である。
【００１２】
本発明の第１のコンパイラは、ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成する処理をコンピュータに実行させるためのコンパイラであって、コンピュータを、中間コードから配列参照を検出し、検出された配列参照を配列参照情報として配列参照リストに登録する配列参照検出手段、配列参照リストに登録された配列参照情報に基づき、２回以上参照されている配列を抽出してバッファ割り当てリストに登録する参照回数解析手段、及びバッファ割り当てリストに登録された配列に関し、中間コードにおいてその配列へのメモリアクセスをバッファアクセスに変換するメモリアクセス最適化手段、として機能させる。
【００１３】
本発明の第２のコンパイラは、ソースプログラムから、複数の要素情報を保持することが可能なバッファ領域を持つシステムに適合した実行コードを生成する処理をコンピュータに実行させるためのコンパイラであって、コンピュータを、中間コードから配列参照を検出し、検出された配列参照を配列参照情報として配列参照リストに登録する配列参照検出手段、配列参照リストに登録された配列参照情報に基づき、その配列の定義の直後にその配列が参照されているような配列を抽出して定義参照リストに登録する定義参照解析手段、及び定義参照リストに登録された配列に関し、中間コードにおいてその配列へのメモリアクセスをバッファアクセスに変換するメモリアクセス最適化手段、として機能させる。
【発明の効果】
【００１４】
本発明は、複数の要素情報を保持することが可能なバッファ領域を有するシステムに対する実行コードを生成する際に、配列データをバッファ領域に割り当て、配列データのメモリアクセスをバッファアクセスに変換するので、メモリアクセス回数を削減でき、バッファアクセスの方がメモリアクセスよりも高速に行えることから、実行性能を大幅に向上させることができる、という効果がある。
【発明を実施するための最良の形態】
【００１５】
次に、本発明の好ましい実施の形態について、図面を参照して説明する。
【００１６】
図１は本発明の第１の実施形態のコンパイラの論理的な構成を示すブロック図である。
【００１７】
第１の実施形態のコンパイラは、複数の要素情報を保持することが可能なバッファ領域を有するシステムに対応した実行コード（ロードモジュール）を生成するものである。このコンパイラは、ソースプログラムから中間コードを生成する中間コード生成部１と、生成した中間コードに対して最適化を行う最適化部２と、最適化された中間コードに基づいて実行コード（ロードモジュール）を生成するコード生成部３と、を備えている。最適化部２は、配列参照検出部１０１と、参照回数解析部１０２と、メモリアクセス最適化部１０３と、配列参照リスト１０４と、バッファ割り当てリスト１０５とを備えている。ここで、配列参照検出部１０１は、中間コード生成部１において生成された中間コード内にある配列参照を検出し、参照情報を配列参照リスト１０４に登録するものである。参照回数解析部１０２は、配列参照リスト１０４内に登録された配列の中から、参照回数が２回以上のものをバッファ割り当てリスト１０５に登録するものである。メモリアクセス最適化部１０３は、中間コードにおいて、バッファ割り当てリスト１０５に登録されている配列のメモリアクセスをバッファアクセスに変換し、変換後の中間コードを出力するものである。
【００１８】
次に、第１の実施形態の動作を説明する。図２は、第１の実施形態での最適化部２の処理を示すフローチャートであり、図３〜図５は、ソースプログラムからどのように最適化されたコードが生成するかの実例を説明する図である。
【００１９】
中間コード生成部１がソースプログラムから中間コードを生成すると、配列参照検出部１０１は、ステップＡ１において、中間コード内にある配列参照を検索し、ステップＡ２において、配列参照があるかどうかを判定する。配列参照がなければ、次の中間コードにおいて同様の処理を行うためにステップＡ２に戻り、配列参照があれば、ステップＡ３において、その配列参照情報を配列参照リスト１０４に登録する。その後、ステップＡ４において、プログラム（中間コード）の最後まで到達したかを判定し、最後まで到達していない場合には、次の中間コードにおいて同様の処理を行うためにステップＡ２に戻る。
【００２０】
ステップＡ４において、プログラムの最後に達したと判定したときは、次に、参照回数解析部１０２は、ステップＡ５において配列参照リスト１０４を検索し、ステップＡ６において、検索された配列参照情報において配列の参照回数が２回以上であるかどうかを判定する。参照回数が２回以上でなければ次の配列参照情報について調べるためにステップＡ６に戻り、参照回数が２回以上であれば、参照回数解析部１０２は、ステップＡ７において、その配列参照情報に対応する配列をバッファ割り当てリスト１０５に登録する。その後、ステップＡ８において、配列参照リスト１０４の最後まで到達したかを判定し、最後まで到達していない場合には、次の配列において同様の処理を行うためにステップＡ６に戻る。
【００２１】
ステップＡ８において、配列参照リスト１０４の最後に達したと判定したときは、次に、メモリアクセス最適化部１０３は、ステップＡ９において、参照回数解析部１０２が既にバッファ割り当てリスト１０５に登録した配列を検索し、ステップＡ１０において、未変換のものがあるかどうかを判定し、未変換のものが残っていなければ処理を終了し、未変換のものが残っていれば、ステップＡ１１において、その配列に対するメモリアクセスをバッファアクセスに変換する。
【００２２】
このようにして最適化部２は、配列に対するメモリアクセスをバッファアクセスに変換した中間コードを生成する。その後、コード生成部３は、この最適化された中間コードを実行コード（ロードモジュール）に変換する。
【００２３】
図３は、プログラミング言語Ｆｏｒｔｒａｎによるプログラムの一例を示している。このプログラムに対して上述した処理を実行したとすると、ステップＡ１〜Ａ４において、プログラム中の（１），（２），（３）の行で参照されている配列ｘと配列ｙが検出され、配列参照リスト１０４に登録される。次に、ステップＡ５〜Ａ８において、参照回数が２回以上である配列ｘがバッファ割り当てリスト１０５に登録される。その結果、ステップＡ９〜Ａ１１では、配列ｘへのメモリアクセスがバッファアクセスに変換される。
【００２４】
従来のコンパイラでは、図３のプログラムからは、図４に示すようなコードが生成され、ここで（１１），（２２），（３３）の行では、メモリアクセスが生成されている。これに対して本実施形態によれば、使用可能なバッファの数を“ｍａｘ”、配列ｘが必要とするバッファの数は“ｃｎｔ”とすると、図５に示すように、“ｍａｘ”が“ｃｎｔ”より大きいときときは、（＊）の部分が実行され、“ｍａｘ”が“ｃｎｔ”以下のときは、（＊＊）の部分が実行されるようなコードが生成する。
【００２５】
このように本実施形態では、配列データに対するメモリアクセスをより高速なバッファアクセスに変換しているので、実行性能を向上させることができる。
【００２６】
図６は本発明の第２の実施形態のコンパイラの論理的な構成を示すブロック図である。
【００２７】
第２の実施形態のコンパイラは、複数の要素情報を保持することが可能なバッファ領域を有するシステムに対応した実行コード（ロードモジュール）を生成するものであり、第１の実施形態とは最適化部２の内部構成が異なっている。すなわち第２の実施形態では、最適化部２は、配列参照検出部２０１と、定義参照解析部２０２と、メモリアクセス最適化部２０３と、配列参照リスト２０４と、定義参照リスト２０５とを備えている。ここで、配列参照検出部２０１は、中間コード生成部１において生成された中間コード内にある配列参照を検出し、参照情報を配列参照リスト２０４に登録するものである。定義参照解析部２０２は、配列参照検出部２０１が生成した配列参照リスト２０４内の配列参照の定義位置８を解析し、定義の直後に参照があるものを定義参照リスト２０５に登録するものである。メモリアクセス最適化部２０３は、中間コードにおいて、定義参照リスト２０５に登録されている配列のメモリアクセスをバッファアクセスに変換し、変換後の中間コードを出力するものである。
【００２８】
次に、第２の実施形態の動作を説明する。図７は、第１の実施形態での最適化部２の処理を示すフローチャートであり、図８〜図１０は、ソースプログラムからどのように最適化されたコードが生成するかの実例を説明する図である。
【００２９】
中間コード生成部１がソースプログラムから中間コードを生成すると、配列参照検出部２０１は、ステップＢ１において、中間コード内にある配列参照を検索し、ステップＢ２において、配列参照があるかどうかを判定する。配列参照がなければ、次の中間コードにおいて同様の処理を行うためにステップＢ２に戻り、配列参照があれば、ステップＢ３において、その配列参照情報を配列参照リスト２０４に登録する。その後、ステップＢ４において、プログラム（中間コード）の最後まで到達したかを判定し、最後まで到達していない場合には、次の中間コードにおいて同様の処理を行うためにステップＢ２に戻る。
【００３０】
ステップＢ４において、プログラムの最後に達したと判定したときは、次に、定義参照解析部２０２は、ステップＢ５において配列参照リスト２０４を検索し、ステップＢ６において、配列参照情報を参照し、配列の定義の直後にその配列に対する参照があるかどうかを判定する。定義の直後に参照がない場合には、次の配列参照情報について調べるためにステップＢ６に戻り、定義の直後に参照がある場合には、定義参照解析部２０２は、ステップＢ７において、その配列を定義参照リスト２０５に登録する。その後、ステップＢ８において、配列参照リスト２０４の最後まで到達したかを判定し、最後まで到達していない場合には、次の配列において同様の処理を行うためにステップＢ６に戻る。
【００３１】
ステップＢ８において、配列参照リスト２０４の最後に達したと判定したときは、次に、メモリアクセス最適化部２０３は、ステップＢ９において、定義参照解析部２０２が既に定義参照リスト２０５に登録した配列を検索し、ステップＢ１０において、未変換のものがあるかどうかを判定し、未変換のものが残っていなければ処理を終了し、未変換のものが残っていれば、ステップＢ１１において、その配列に対するメモリアクセスをバッファアクセスに変換する。
【００３２】
このようにして最適化部２は、配列に対するメモリアクセスをバッファアクセスに変換した中間コードを生成する。その後、コード生成部３は、この最適化された中間コードを実行コード（ロードモジュール）に変換する。
【００３３】
図８は、プログラミング言語Ｆｏｒｔｒａｎによるプログラムの一例を示している。このプログラムに対して上述した処理を実行したとすると、ステップＢ１〜Ｂ４において、プログラム中の（１），（２）の行で参照されている配列ｘと配列ａが検出され、配列参照リスト２０４に登録される。次に、ステップＢ５〜Ｂ８において、配列ｘが定義参照リスト２０５に登録される。その結果、ステップＢ９〜Ｂ１１では、配列ｘへのメモリアクセスがバッファアクセスに変換される。
【００３４】
従来のコンパイラでは、図８のプログラムからは、図９に示すようなコードが生成され、ここで（１１），（２２）の行では、メモリアクセスが生成されている。これに対して本実施形態によれば、使用可能なバッファの数を“ｍａｘ”、配列ｘが必要とするバッファの数は“ｃｎｔ”とすると、図５に示すように、“ｍａｘ”が“ｃｎｔ”より大きいときときは、（＊）の部分が実行され、“ｍａｘ”が“ｃｎｔ”以下のときは、（＊＊）の部分が実行されるようなコードが生成する。
【００３５】
このように本実施形態では、配列データに対するメモリアクセスをより高速なバッファアクセスに変換しているので、実行性能を向上させることができる。
【００３６】
以上本発明の好ましい実施形態を説明したが、本発明は、プログラムを翻訳して実行コードやロードモジュールを生成するコンパイラといった用途に適用できる。上述では、プログラミング言語Ｆｏｒｔｒａｎによるプログラムを用いて説明しているが、Ｆｏｒｔｒａｎ以外のＣ、Ｃ＋＋、ＪＡＶＡ（登録商標）言語などのコンパイラにも本発明は適用できる。
【００３７】
上述した本発明のコンパイル最適化方法は、それを実現するための計算機プログラムを、パーソナルコンピュータやワークステーションなどの計算機に読み込ませ、そのプログラムを実行させることによっても実現できる。コンパイル最適化方法を行うためのプログラム（コンパイラプログラム）は、磁気テープやＣＤ−ＲＯＭなどの記録媒体によって、あるいはネットワークを介して、計算機に読み込まれる。このような計算機は、一般に、中央処理装置（ＣＰＵ）と、コンパイラプログラムやデータを格納するためのハードディスク装置と、主メモリと、キーボードやマウスなどの入力装置と、ＣＲＴなどの表示装置と、磁気テープやＣＤ−ＲＯＭ等の記録媒体を読み取る読み取り装置と、ネットワークに接続するための通信インタフェースと、から構成されている。この計算機では、コンパイラプログラムを格納した記録媒体を読み取り装置に装着し記録媒体からコンパイラプログラムを読み出してハードディスク装置に格納し、ハードディスク装置に格納されたプログラムを中央処理装置が実行することにより、あるいは、ネットワークを介してコンパイラプログラムをハードディスク装置にダウンロードし、ハードディスク装置に格納されたプログラムを中央処理装置が実行することにより、上述したコンパイル最適化方法が実行される。
【図面の簡単な説明】
【００３８】
【図１】本発明の第１の実施形態のコンパイラの構成を示すブロック図である。
【図２】第１の実施形態のコンパイラの動作を示すフローチャートである。
【図３】プログラムの一例を示す図である。
【図４】図３に示すプログラムから従来の手法で生成したコードのイメージを示す図である。
【図５】図３に示すプログラムから第１の実施形態の手法で生成したコードのイメージを示す図である。
【図６】本発明の第２の実施形態のコンパイラの構成を示すブロック図である。
【図７】第２の実施形態のコンパイラの動作を示すフローチャートである。
【図８】プログラムの一例を示す図である。
【図９】図８に示すプログラムから従来の手法で生成したコードのイメージを示す図である。
【図１０】図８に示すプログラムから第２の実施形態の手法で生成したコードのイメージを示す図である。
【符号の説明】
【００３９】
１    中間コード生成部
２    最適化部
３    コード生成部
１０１，２０１    配列参照生成部
１０２    参照回数解析部
１０３，２０３    メモリアクセス最適化部
１０４，２０４    配列参照リスト
１０５    バッファ割り当てリスト
２０２    定義参照解析部
２０５    定義参照リスト
【図１】
0004788902.tif 000002
【図２】
0004788902.tif 000003
【図３】
0004788902.tif 000004
【図４】
0004788902.tif 000005
【図５】
0004788902.tif 000006
【図６】
0004788902.tif 000007
【図７】
0004788902.tif 000008
【図８】
0004788902.tif 000009
【図９】
0004788902.tif 000010
【図１０】
0004788902.tif 000011