IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士通株式会社の特許一覧

特許7583270情報処理装置、コンパイルプログラムおよびコンパイル方法
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2024-11-06
(45)【発行日】2024-11-14
(54)【発明の名称】情報処理装置、コンパイルプログラムおよびコンパイル方法
(51)【国際特許分類】
   G06F 8/41 20180101AFI20241107BHJP
   G06F 9/32 20180101ALI20241107BHJP
【FI】
G06F8/41 130
G06F9/32 330A
【請求項の数】 8
(21)【出願番号】P 2021041104
(22)【出願日】2021-03-15
(65)【公開番号】P2022140995
(43)【公開日】2022-09-29
【審査請求日】2023-11-09
(73)【特許権者】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002918
【氏名又は名称】弁理士法人扶桑国際特許事務所
(72)【発明者】
【氏名】新幸 智子
【審査官】西間木 祐紀
(56)【参考文献】
【文献】特開2014-228891(JP,A)
【文献】特開2015-194881(JP,A)
【文献】特開2005-222262(JP,A)
【文献】特開2017-041162(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/41
G06F 9/32
(57)【特許請求の範囲】
【請求項1】
コンパイルを行う情報処理装置であって、
処理対象のコードを記憶する記憶部と、
前記コードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、前記レジスタと主記憶装置との間で前記変数の値の入出力を行うメモリ命令の数および前記レジスタに格納された前記変数の値に対する演算命令の数を含むループ情報を取得し、
前記取得したループ情報に基づいて、ループ融合の候補である前記ループの組合せに対応する前記変数の数、前記レジスタの数、前記メモリ命令の数および前記演算命令の数を、前記ループの複数の組合せそれぞれに対して算出し、
前記複数の組合せそれぞれに対して算出した前記変数の数、前記レジスタの数、および、前記メモリ命令の数と前記演算命令の数との比較に基づいて、前記複数の組合せのうち、前記ループ融合を適用する組合せを決定し、
決定した前記組合せに対して前記ループ融合を実行する処理部と、
を有する情報処理装置。
【請求項2】
前記処理部は、前記コードに基づいて、前記ループの制御変数の取り得る値が互いに異なる2以上のループが属する前記組合せを、前記ループ融合の候補として取得する、
請求項1記載の情報処理装置。
【請求項3】
前記処理部は、前記複数の組合せのうち、算出した前記変数の数が多い前記組合せを優先して、前記ループ融合を適用する組合せとして決定する、
請求項1または2記載の情報処理装置。
【請求項4】
前記処理部は、前記複数の組合せのうち、算出した前記レジスタの数が、前記コンパイルにより生成されるオブジェクトコードの実行予定の装置での前記レジスタの使用可能数以下である前記組合せを、前記ループ融合を適用する組合せとして決定する、
請求項1乃至3の何れか1項に記載の情報処理装置。
【請求項5】
前記処理部は、前記複数の組合せのうち、算出した前記メモリ命令の数から所定値を引いた数が前記演算命令の数以上である前記組合せを、前記ループ融合を適用する組合せとして決定する、
請求項1乃至4の何れか1項に記載の情報処理装置。
【請求項6】
前記処理部は、前記コンパイルにより生成されるオブジェクトコードの実行予定の装置により同時実行可能な前記メモリ命令の数に応じて、前記所定値を決定する、
請求項5記載の情報処理装置。
【請求項7】
コンピュータに、
処理対象のコードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、前記レジスタと主記憶装置との間で前記変数の値の入出力を行うメモリ命令の数および前記レジスタに格納された前記変数の値に対する演算命令の数を含むループ情報を取得し、
前記取得したループ情報に基づいて、ループ融合の候補である前記ループの組合せに対応する前記変数の数、前記レジスタの数、前記メモリ命令の数および前記演算命令の数を、前記ループの複数の組合せそれぞれに対して算出し、
前記複数の組合せそれぞれに対して算出した前記変数の数、前記レジスタの数、および、前記メモリ命令の数と前記演算命令の数との比較に基づいて、前記複数の組合せのうち、前記ループ融合を適用する組合せを決定し、
決定した前記組合せに対して前記ループ融合を実行する、
処理を実行させるコンパイルプログラム。
【請求項8】
コンピュータが、
処理対象のコードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、前記レジスタと主記憶装置との間で前記変数の値の入出力を行うメモリ命令の数および前記レジスタに格納された前記変数の値に対する演算命令の数を含むループ情報を取得し、
前記取得したループ情報に基づいて、ループ融合の候補である前記ループの組合せに対応する前記変数の数、前記レジスタの数、前記メモリ命令の数および前記演算命令の数を、前記ループの複数の組合せそれぞれに対して算出し、
前記複数の組合せそれぞれに対して算出した前記変数の数、前記レジスタの数、および、前記メモリ命令の数と前記演算命令の数との比較に基づいて、前記複数の組合せのうち、前記ループ融合を適用する組合せを決定し、
決定した前記組合せに対して前記ループ融合を実行する、
コンパイル方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は情報処理装置、コンパイルプログラムおよびコンパイル方法に関する。
【背景技術】
【0002】
ソフトウェア開発においては、高水準言語で記述されたソースコードを機械語などの低水準言語で記述されたオブジェクトコードに変換するコンパイラを使用することが多い。コンパイラは、ソースコードをオブジェクトコードに変換する過程で、オブジェクトコードの実行効率が向上するように各種の最適化を行うことがある。最適化では、ループ融合、ループ展開およびループ分割などのループ最適化が行われることがある。例えば、ループ融合では、コード中に存在するループの構造を解析して複数のループを融合し、データの局所性、ループの判定回数の削減を図ることで、実行効率が向上され得る。
【0003】
ここで、例えばコンパイラがループを構成する命令語集合から使用するレジスタの数を見積もることで、ループの展開数をレジスタのスピルを起こさない範囲に制限するループ最適化方法の提案がある。
【0004】
また、複数のループ最適化を個々に実施するのではなく、プログラム/ハードウェアの特性をオプティマイズレベルに応じて解析し、当該解析に応じて、ループ最適化の組合せで実施するコンパイラ装置の提案もある。
【0005】
更に、各ループ処理内で実行される演算数とデータ転送数の比率を算出し、当該比率がシステムの性能条件によって特定される基準値を満たすか否かによって、ループ融合の可否を判定するコンパイルプログラムの提案もある。
【先行技術文献】
【特許文献】
【0006】
【文献】特開平7-121381号公報
【文献】特開平8-101776号公報
【文献】特開2014-228891号公報
【発明の概要】
【発明が解決しようとする課題】
【0007】
融合するループの組合せが不適切であると、オブジェクトコードの実行効率の向上を十分に図れない。例えば、融合後のループの処理において、変数の値を格納するレジスタが足りなくなったり、複数の命令に対する複数の演算器の割り当てが非効率になることで演算器を十分に使い切れなくなったりして、オブジェクトコード実行時の処理性能が悪くなることがある。
【0008】
1つの側面では、本発明は、処理性能を向上する情報処理装置、コンパイルプログラムおよびコンパイル方法を提供することを目的とする。
【課題を解決するための手段】
【0009】
1つの態様では、コンパイルを行う情報処理装置が提供される。この情報処理装置は、記憶部および処理部を有する。記憶部は、処理対象のコードを記憶する。処理部は、コードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、レジスタと主記憶装置との間で変数の値の入出力を行うメモリ命令の数およびレジスタに格納された変数の値に対する演算命令の数を含むループ情報を取得し、ループ情報に基づいて、ループ融合の候補であるループの組合せに対応する変数の数、レジスタの数、メモリ命令の数および演算命令の数を、ループの複数の組合せそれぞれに対して算出し、複数の組合せそれぞれに対して算出した変数の数、レジスタの数、および、メモリ命令の数と演算命令の数との比較に基づいて、複数の組合せのうち、ループ融合を適用する組合せを決定し、決定した組合せに対してループ融合を実行する。
【0010】
また、1つの態様では、コンパイルプログラムが提供される。
また、1つの態様では、コンパイル方法が提供される。
【発明の効果】
【0011】
1つの側面では、処理性能を向上できる。
【図面の簡単な説明】
【0012】
図1】第1の実施の形態の情報処理装置を説明する図である。
図2】第2の実施の形態の情報処理装置のハードウェア例を示す図である。
図3】CPUのハードウェア例を示す図である。
図4】情報処理装置の機能例を示す図である。
図5】ループ融合の第1の例を示す図である。
図6】ループ融合の第2の例を示す図である。
図7】リダクションループを観点にしたループ融合判定の例を示す図である。
図8】タイトリを観点にしたループ融合判定の例を示す図である。
図9】タイトリを観点にしたループ融合判定の他の例を示す図である。
図10】データ依存を観点にしたループ融合判定の例を示す図である。
図11】データ依存を観点にしたループ融合判定の他の例を示す図である。
図12】ループ融合の判定対象のコードの例を示す図である。
図13】ループ融合可能リストの例を示す図である。
図14】ループ情報の例を示す図である。
図15】ループ情報の例(続き)を示す図である。
図16】ループ情報の例(続き)を示す図である。
図17】ループ融合候補情報の例を示す図である。
図18】ループ融合候補情報(続き)の例を示す図である。
図19】コンパイルの全体処理の例を示すフローチャートである。
図20】ループ融合可能リスト生成の例を示すフローチャートである。
図21】ループ情報生成の例を示すフローチャートである。
図22】ループ融合候補情報生成の例を示すフローチャートである。
図23】ループ融合候補の項目値算出の例を示すフローチャートである。
図24】融合対象決定の例を示すフローチャートである。
図25】ループ融合対象の決定結果の例を示す図である。
図26】ループ融合の判定対象のコードの他の例を示す図である。
図27】ループ融合後のコードの例を示す図である。
図28】命令スケジューリングの例を示す図である。
図29】命令スケジューリングの比較例を示す図である。
図30】命令スケジューリングの比較例(続き)を示す図である。
【発明を実施するための形態】
【0013】
以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
【0014】
図1は、第1の実施の形態の情報処理装置を説明する図である。
情報処理装置10は、ソースコード20をオブジェクトコード30に変換するコンパイラの機能を有する。情報処理装置10は、記憶部11および処理部12を有する。
【0015】
記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部12は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。処理部12はプログラムを実行するプロセッサでもよい。「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。
【0016】
記憶部11は、処理部12のコンパイルの処理に用いられる情報を記憶する。例えば、記憶部11は、コンパイルの対象であるソースコード20を記憶する。例えば、ソースコード20は、ループ#1,#2,#3,#4の処理の記述を含む。
【0017】
処理部12は、ソースコード20に基づいて、中間語で記述されたコードである中間コード20aを生成し、記憶部11に格納する。中間コードは、コンパイラ内部で利用されるコードである。中間コード20aには、ループ#1~#4に対応する記述が含まれる。
【0018】
処理部12は、中間コード20aに基づいて各ループに対し、当該ループで使用される変数の数、レジスタの数、メモリ命令の数および演算命令の数を含むループ情報21を取得する。ループ情報21は、記憶部11に格納される。
【0019】
メモリ命令とは、中間コード20aに記述されている、レジスタと主記憶装置との間で変数の値の入出力を行う命令である。メモリ命令には、主記憶装置からレジスタに変数の値を格納するLOAD命令や、レジスタから主記憶装置に変数の値を格納するSTORE命令がある。また、演算命令とは、中間コード20aに記述されている、レジスタに格納された変数の値に対する四則演算を行う命令である。演算命令には、ADD命令、SUB命令、MULT命令、DIV命令がある。
【0020】
例えば、変数の数は、ループの制御変数以外の変数の数でもよい。また、レジスタの数は、整数レジスタおよび浮動小数レジスタのように、レジスタの種類ごとに取得されてもよい。例えば、ループ情報21には、ループ#1~#4のそれぞれに対して取得された、変数の数、レジスタ数、メモリ命令数および演算命令数が登録される。
【0021】
処理部12は、ループ情報21に基づいて、ループ融合の候補であるループの組合せに対応する変数の数、レジスタの数、メモリ命令の数および演算命令の数を、ループの複数の組合せそれぞれに対して算出する。処理部12は、算出結果を、ループ融合候補情報22に記録する。ループ融合候補情報22は、ループ融合の候補であるループの組合せごとに算出された変数の数、レジスタの数、メモリ命令の数および演算命令の数が記録される。ループ融合候補情報22は、記憶部11に格納される。
【0022】
ここで、処理部12は、ループ融合の候補となるループの組合せを、リダクションやタイトリなどの各ループの構造やループに含まれる変数間の依存関係によって抽出する。ループ融合の候補となるループの組合せには、ループの制御変数の取り得る値が互いに同じであるループの組合せだけでなく、ループの制御変数の取り得る値が互いに異なるループの組合せが含まれてもよい。
【0023】
例えば、ループ#1~#4に対して、ループ融合の候補の組合せは、(#1,#2)の組合せ、(#2,#3)の組合せ、(#3,#4)の組合せの3つであるとする。処理部12は、ループ情報21に基づいて、該当の組合せに属するループの変数の数、レジスタの数、メモリ命令の数および演算命令の数の各々の和を求めることで、該当の組合せに対応する変数の数、レジスタの数、メモリ命令の数および演算命令の数を得る。
【0024】
例えば、ループ情報21によれば、ループ#1の変数の数はa1であり、ループ#2の変数の数はa2である。したがって、ループ#1,#2の組合せに対する変数の数A1は、A1=a1+a2である。また、例えば、ループ情報21によれば、ループ#1のメモリ命令数はc1であり、ループ#2のメモリ命令数はc2である。したがって、ループ#1,#2の組合せに対するメモリ命令数C1は、C1=c1+c2である。
【0025】
処理部12は、ループの複数の組合せそれぞれに対して算出した変数の数、レジスタの数、および、メモリ命令の数と演算命令の数との比較に基づいて、複数の組合せのうち、ループ融合を適用する組合せを決定する。
【0026】
例えば、処理部12は、融合候補のループの各組合せのうち、変数の数が多い組合せを優先する。また、処理部12は、融合候補のループの各組合せのうち、当該組合せに対応するレジスタ数が、オブジェクトコード30を実行予定である情報処理装置が備えるレジスタ数以下である組合せを、ループ融合を適用する組合せとする。なお、オブジェクトコード30を実行予定である情報処理装置は、情報処理装置10でもよい。
【0027】
更に、処理部12は、メモリ命令の数に比べて演算命令の数が少ない組合せを、ループ融合を適用する組合せとする。例えば、処理部12は、メモリ命令の数から所定値を引いた値が演算命令の数以上である組合せを、ループ融合を適用する組合せとする。当該所定値は、オブジェクトコード30を実行予定である情報処理装置が備える、演算命令を実行する複数の演算器により同時実行可能なメモリ命令の数に応じて決定されてもよい。
【0028】
処理部12は、決定したループの組合せに対してループ融合を実行する。例えば、処理部12は、ループ融合候補情報22に基づいて、融合候補のループの組合せ(#1,#2)、(#2,#3)、(#3,#4)のうち、(#2,#3)にループ融合を適用すると決定する。この場合、処理部12は、融合候補のループの組合せ(#2,#3)に対してループ融合を実行し、ループ融合実行後の中間コード20bを生成する。中間コード20bは、記憶部11に格納される。
【0029】
処理部12は、中間コード20bに基づいて、オブジェクトコード30を生成する。例えば、処理部12は、中間コード20bからアセンブリ言語を生成し、アセンブリ言語からオブジェクトコード30を生成し、オブジェクトコード30を記憶部11に格納する。
【0030】
情報処理装置10によれば、処理対象のコードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、メモリ命令の数および演算命令の数を含むループ情報21が取得される。ループ情報21に基づいて、ループ融合の候補であるループの組合せに対応する変数の数、レジスタの数、メモリ命令の数および演算命令の数が、ループの複数の組合せそれぞれに対して算出される。複数の組合せそれぞれに対して算出された変数の数、レジスタの数、および、メモリ命令の数と演算命令の数との比較に基づいて、複数の組合せのうち、ループ融合を適用する組合せが決定される。決定された組合せに対してループ融合が実行される。
【0031】
これにより、処理性能を向上できる。
ここで、コンパイル時のループ融合による最適化において、融合するループの組合せが不適切であると、オブジェクトコードの実行効率の向上を十分に図れない。例えば、融合後のループの処理において、変数の値を格納するレジスタが足りなくなったり、複数の命令に対する複数の演算器の割り当てが非効率になることで演算器を十分に使い切れなくなったりして、オブジェクトコード実行時の処理性能が悪くなることがある。
【0032】
そこで、情報処理装置10では、融合候補のループの組合せに対する変数の数、レジスタの数、メモリ命令の数および演算命令の数を用いてループ融合を行うループの組合せを決定することで、レジスタ不足によるスピルの抑止や演算器の効率利用を図れる。例えば、前述のように、情報処理装置10は、ループの組合せに対応するレジスタの数が装置に搭載される物理的なレジスタの数以下で、かつ、演算命令の数がメモリ命令の数に基づく基準値以下である組合せのうち、変数の数が多いものを優先的にループ融合する。これにより、物理的なレジスタの数を超過せず、かつ、演算命令とメモリ命令とがバランスよく含まれるループの組合せであって、変数の数が多く演算器を埋められる可能性の高いループの組合せを融合対象に選択できる。
【0033】
その結果、オブジェクトコード30における融合したループの実行時の各サイクルにおいて、複数の演算器の空きが少なくなるように複数の命令を効率的に演算器に割り当てることが可能となり、処理性能を向上できる。例えば、融合したループの処理速度を向上できる。また、レジスタの効率的な利用を図ることもできる。
【0034】
以下では、情報処理装置10におけるコンパイラの機能を更に具体的に説明する。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
【0035】
図2は、第2の実施の形態の情報処理装置のハードウェア例を示す図である。
情報処理装置100は、CPU101、RAM102、HDD103、GPU(Graphics Processing Unit)104、入力インタフェース105、媒体リーダ106およびNIC(Network Interface Card)107を有する。なお、CPU101は、第1の実施の形態の処理部12の一例である。RAM102またはHDD103は、第1の実施の形態の記憶部11の一例である。
【0036】
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、情報処理装置100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
【0037】
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。RAM102は、情報処理装置100の主記憶装置として使用される。主記憶装置をメインメモリまたは単にメモリと呼ぶことがある。なお、情報処理装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
【0038】
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、情報処理装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
【0039】
GPU104は、CPU101からの命令に従って、情報処理装置100に接続されたディスプレイ51に画像を出力する。ディスプレイ51としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
【0040】
入力インタフェース105は、情報処理装置100に接続された入力デバイス52から入力信号を取得し、CPU101に出力する。入力デバイス52としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、情報処理装置100に、複数の種類の入力デバイスが接続されていてもよい。
【0041】
媒体リーダ106は、記録媒体53に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体53として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
【0042】
媒体リーダ106は、例えば、記録媒体53から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体53は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体53やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
【0043】
NIC107は、ネットワーク50に接続され、ネットワーク50を介して他のコンピュータと通信を行うインタフェースである。NIC107は、例えば、スイッチやルータなどの通信装置とケーブルで接続される。
【0044】
図3は、CPUのハードウェア例を示す図である。
CPU101は、演算器群101aおよびレジスタ群101bを有する。演算器群101aは、CPU101が備える演算器のグループである。レジスタ群101bは、CPU101が備える汎用レジスタのグループである。以下では、汎用レジスタを単にレジスタと呼ぶ。レジスタには、整数値が格納される整数レジスタや浮動小数値が格納される浮動小数レジスタがある。レジスタ群101bは、複数の整数レジスタおよび複数の浮動小数レジスタを含む。
【0045】
演算器は、レジスタに格納された値に対する数値演算を行う演算実行回路であり、ALU(Arithmetic and Logic Unit)とも呼ばれる。一例では、CPU101は、4つの演算器を有する。各演算器は、レジスタのデータに対して演算を行い、演算結果をレジスタに書き込む。
【0046】
図4は、情報処理装置の機能例を示す図である。
情報処理装置100は、記憶部110、中間言語記憶部120、制御情報記憶部130、コンパイラ140およびリンカ150を有する。記憶部110、中間言語記憶部120および制御情報記憶部130には、RAM102やHDD103の記憶領域が用いられる。コンパイラ140およびリンカ150は、RAM102に記憶されたプログラムをCPU101が実行することで実現される。
【0047】
記憶部110は、コンパイラ140およびリンカ150の処理に用いられる情報を記憶する。例えば、記憶部110は、ソースプログラム111、オブジェクトファイル112および実行ファイル113を記憶する。
【0048】
ソースプログラム111は、高水準言語で記述されたソースコードを含むファイルである。オブジェクトファイル112は、ソースプログラム111がコンパイラ140によりコンパイルされることで生成されたオブジェクトコードを含むファイルである。オブジェクトコードは、前述のように、機械語などの低水準言語で記述される。実行ファイル113は、オブジェクトファイル112とライブラリファイルとがリンカ150により結合されて生成されたファイルである。
【0049】
中間言語記憶部120は、コンパイラ140により生成された中間言語を記憶する。
制御情報記憶部130は、コンパイラ140の最適化処理に用いられる制御情報を記憶する。
【0050】
コンパイラ140は、ソースプログラム111のコンパイルを行い、コンパイル結果としてオブジェクトファイル112を出力する。コンパイラ140は、ソースプログラム入力部141、入出力制御部142、中間言語生成部143、最適化部144、コード生成部145およびオブジェクトファイル出力部146を有する。
【0051】
ソースプログラム入力部141は、指定されたソースプログラム111をオープンする。例えば、ソースプログラム入力部141は、コンパイル開始が指示されると、記憶部110に記憶されるソースプログラム111を読み込んで入出力制御部142に出力する。
【0052】
入出力制御部142は、オプションやファイルの種別に応じて各種処理の選択を実行する。例えば、入出力制御部142は、ソースプログラム入力部141からソースプログラム111が入力された場合には、ソースプログラム111を中間言語生成部143に出力する。また、入出力制御部142は、コード生成部145からアセンブリ言語が入力された場合に、当該アセンブリ言語をオブジェクトファイル出力部146に出力する。
【0053】
中間言語生成部143は、入出力制御部142から入力されたソースプログラム111から中間言語を生成して、中間言語記憶部120に格納する。具体的には、中間言語生成部143は、ソースプログラム111を最適化部144で利用される中間コード、すなわち、コンパイラ内部で利用するコードに変換する。そして、中間言語生成部143は、変換した中間言語を中間言語記憶部120に格納する。
【0054】
最適化部144は、ソースプログラム111に対応するオブジェクトコードの実行を高速化するために、ソース解析やループ融合を含む最適化を行う。
ソース解析では、最適化部144は、中間言語を解析する。例えば、最適化部144は、中間言語記憶部120から中間言語を読み込み、行再構築、字句解析、構文解析、意味解析などを実行する。
【0055】
最適化部144は、ソース解析の結果から、ソースプログラム111またはソースプログラム111から生成された中間言語に存在する複数のループそれぞれのループ条件に基づいて、融合候補のループの組合せを決定する。例えば、最適化部144は、リダクションやタイトリといったループの構造やループ内のデータ依存に基づいて、融合候補のループの組合せを決定する。最適化部144は、ループの初期値、終値、増分値が同じであるか否かに関わらず、融合候補のループの組合せを決定することができる。
【0056】
最適化部144は、ループ融合による最適化の際に、融合候補のループの組合せごとに、当該組合せに属する各ループの変数の数の和、整数レジスタの数の和、浮動小数レジスタの数の和、メモリ命令の数の和および演算命令の数の和を算出する。最適化部144は、制御情報記憶部130に算出結果を格納する。最適化部144は、融合候補のループの組合せごとに算出した変数の数、整数レジスタの数、浮動小数レジスタの数、および、メモリ命令の数と演算命令の数との比較に基づいて、融合候補のループの組合せのうち、ループ融合を適用する組合せを決定する。最適化部144は、決定したループの組合せに対してループ融合を実行し、ループ融合後の中間言語をコード生成部145に出力する。
【0057】
コード生成部145は、最適化部144によって最適化された中間言語からアセンブリ言語を生成する。コード生成部145は、生成したアセンブリ言語を入出力制御部142に出力する。
【0058】
オブジェクトファイル出力部146は、入出力制御部142からアセンブリ言語が入力されると、当該アセンブリ言語からオブジェクトファイル112を生成して、記憶部110に格納する。
【0059】
リンカ150は、オブジェクトファイル出力部146よって生成されたオブジェクトファイル112を記憶部110から読み込み、オブジェクトファイル112とライブラリファイルとを結合して実行ファイル113を生成する。そして、リンカ150は、生成した実行ファイル113を記憶部110に格納する。
【0060】
次に、最適化部144によるループ融合の例を説明する。
図5は、ループ融合の第1の例を示す図である。
例えば、最適化部144は、コード61におけるループa1とループb1とが融合可能と判定された場合、ループa1における演算式の次にループb1の演算式を挿入することで、コード61をコード62に変換し、1つのループとして処理させる。このようにすることで、ループの判定の繰り返し処理にかかるコストを削減して実行性能を高速化させることができる。なお、ループa1,b1は、両方ともループの制御変数iの初期値が「1」、終値が「10」、増分値が「1」で同一である。ここで、増分値「1」の場合、コード中では記述が省略される。
【0061】
図6は、ループ融合の第2の例を示す図である。
例えば、最適化部144は、コード63におけるループa2とループb2とを融合可能と判定することもできる。ここで、ループa2は、ループの制御変数iの初期値が「1」、終値が「10」、増分値が「2」である。一方、ループb2は、ループの制御変数jの初期値が「3」、終値が「30」、増分値が「1」である。すなわち、ループa2,b2では、ループの制御変数の取り得る値が異なる。
【0062】
この場合、最適化部144は、例えば、マスク変数「mask1(i)」やマスク変数「mask2(i)」を用いてループa2とループb2とを融合することで、コード63をコード64に変換する。マスク変数は、融合後のループにおける分岐命令に使用される。ただし、融合後のループ内にマスク変数を用いたif文が分岐命令として挿入され、効率の良いループ融合とならないこともある。
【0063】
次に、最適化部144によるループ融合判定の例を示す図である。
図7は、リダクションループを観点にしたループ融合判定の例を示す図である。
リダクションまたはリダクション演算とは、ループの反復における累積である。リダクションループとは、リダクションを含むループである。図7の例では、変数aにリダクションの結果が代入される。
【0064】
図7(A)はループ融合可能なループ1a,2aを含むコード71を例示する。コード71では、ループ1aにリダクションはあるが、ループ1aにおけるリダクションの結果が格納されるaは、ループ2aで参照されていない。したがって、最適化部144は、ループ1aとループ2aとを融合可能であると判定する。
【0065】
図7(B)はループ融合不可能なループ1b,2bを含むコード72を例示する。コード72では、ループ1bにリダクションがある。ループ1bにおけるリダクションの結果が格納されるaは、ループ2bで参照されている。したがって、最適化部144は、ループ1bとループ2bとを融合不可能であると判定する。
【0066】
図8は、タイトリを観点にしたループ融合判定の例を示す図である。
タイトリとは、多重ループにおいて、最内ループにのみ演算を所有するループである。途中のループの間に演算を含む場合は、演算を含むループより下のループをタイトとみなす。すなわち、最適化部144は、多重ループにおいて、最内ループにのみ演算を所有するループを融合候補と判定し、途中のループの間に演算を含む場合は、演算を含むループよりも下のループをタイトとみなして、融合候補からは除外する。
【0067】
図(8)(A)はループ融合可能なループ1c,2cを含むコード73を例示する。ループ1c,2cは共にタイトリである。したがって、最適化部144は、ループ1cとループ2cとを融合可能であると判定する。
【0068】
図(8)(B)はループ融合不可能なループ1d,2dを含むコード74を例示する。ループ2dはタイトリである。一方、ループ1dには最内ループ内以外に演算式「c=d*i」が存在するのでタイトリではない。したがって、最適化部144は、ループ1dとループ2dとを融合不可能であると判定する。
【0069】
図9は、タイトリを観点にしたループ融合判定の他の例を示す図である。
コード75は、ループ1e,2e,3e,4eを含む。ループ2e,3eは、ループ1eの内側のループである。ループ1eは、最内ループ内以外に演算式「c=d*x」が存在するのでタイトリではない。したがって、最適化部144は、ループ1eとループ4eとを融合不可能であると判定する。
【0070】
一方、ループ2e,3eは、何れもタイトリである。したがって、最適化部144は、ループ2eとループ3eとを融合可能であると判定する。
図10は、データ依存を観点にしたループ融合判定の例を示す図である。
【0071】
図10(A)はループ融合可能なループ1f,2fを含むコード81を例示する。最適化部144は、ループ1f,2fでは、A(j)とA(j+1)とが依存しているが、順方向の依存であることから、融合してもデータが壊れないと判断する。したがって、最適化部144は、ループ1fとループ2fとをループ融合可能であると判定する。
【0072】
図10(B)はループ融合不可能なループ1g,2gを含むコード82を例示する。最適化部144は、ループ1g,2gでは、A(j+1)とA(j)とが依存しているが、逆方向の依存であることから、融合するとデータが壊れると判断する。したがって、最適化部144は、ループ1gとループ2gとをループ融合不可能であると判定する。
【0073】
図11は、データ依存を観点にしたループ融合判定の他の例を示す図である。
図11(A)はループ融合可能なループ1h,2hを含むコード83を例示する。コード83の例では、最適化部144は、ループ1hとループ2hとの組を融合候補とした場合、ループ3hがループ2hの算出結果を利用しないことから、ループ2hとループ3hとが依存関係にないと判断する。したがって、最適化部144は、ループ1hとループ2hとをループ融合可能と判定する。
【0074】
図11(B)はループ融合不可能なループ1i,2iを含むコード84を例示する。コード84の例では、最適化部144は、ループ1iとループ2iとを融合候補とした場合、ループ3iがループ2iの算出結果を利用することから、ループ2iとループ3iとが依存関係にあると判断する。したがって、最適化部144は、ループ1iとループ2iとをループ融合不可能と判定する。
【0075】
図12は、ループ融合の判定対象のコードの例を示す図である。
ソースコード111aは、ソースプログラム111に含まれるコードの一例である。例えば、ソースコード111aは、ループ1~5の5つのループを含む。最適化部144は、中間言語生成部143が生成したソースコード111aの中間言語から、融合候補のループの組合せを抽出する。ソースコード111aの中間言語の場合、最適化部144は、まずはループ1をトリガーにして候補を抽出し、ループ2,3,4,5をトリガーにして順に判定を行う。なお、中間言語(中間コード)の記述については、特開2014-228891号公報の図12などを参考にすることができる。
【0076】
図13は、ループ融合可能リストの例を示す図である。
ループ融合可能リスト131は、最適化部144により生成され、制御情報記憶部130に格納される。最適化部144は、前述のリダクションループやタイトリといったループの構造に基づいてトリガーのループと他のループとの融合可否を判定し、ループ融合可能リスト131を設定する。
【0077】
ループ融合可能リスト131は、トリガーおよび融合可能ループの項目を含む。トリガーの項目には、トリガーとなるループの番号が登録される。融合可能ループの項目には、トリガーのループに対して融合可能なループの番号が登録される。
【0078】
例えば、ループ融合可能リスト131には、トリガー「1」、融合可能ループ「2,4,5」というレコードが登録されている。このレコードは、ループ1に対してループ2,4,5をそれぞれ融合可能であることを示す。ループ融合可能リスト131には、他のトリガーに対しても、融合可能なループが同様に登録される。
【0079】
図14は、ループ情報の例を示す図である。
ループ情報132は、最適化部144により生成され、制御情報記憶部130に格納される。最適化部144は、ソースコード111aの中間言語に基づいて、各ループにおける変数情報、レジスタ数、ループ形状および命令情報を取得し、ループごとにループ情報132に記録する。
【0080】
変数情報とは、ループで使用される変数の情報である。変数情報は、四則演算に用いられる変数(ループの制御変数以外の変数)と、当該変数が生存する最終ループ(生存ループ)の情報を含む。生存ループの情報は、ループ間の変数の依存関係を確認する際に、確認対象とする変数の識別に用いられる。また、変数情報は、使用される変数と、当該変数がループの制御変数であるか否かを示すフラグ情報を含む。制御変数であるか否かを示すフラグ情報は、「Yes」が制御変数であることを示し、「No」が制御変数でないことを示す。
【0081】
レジスタ数とは、ループで使用される整数レジスタの数および浮動小数レジスタの数の情報である。
ループ形状とは、ループの制御変数の取り得る値を表す初期値、終値、増分値の情報である。
【0082】
命令情報とは、メモリ命令の数および四則演算命令の数の情報である。メモリ命令とは、LOAD命令やSTORE命令である。四則演算命令とは、ADD命令、SUB命令、MULT命令およびDIV命令である。メモリ命令の数および四則演算命令の数としてカウントする数は、ループの制御変数以外の変数に対するメモリ命令の数および四則演算命令の数でもよい。
【0083】
ループ1の例では、最適化部144は、浮動小数点数の四則演算に用いられる変数「a」と、当該変数「a」が生存する最終ループ「ループ3」とをループ情報132に記録する。また、最適化部144は、使用変数名「a」、「i」、「j」に対して、それぞれ制御変数のフラグ情報「No」、「Yes」、「Yes」をループ情報132に記録する。また、最適化部144は、ループ1におけるレジスタ数として、例えば整数レジスタ「2」、浮動小数レジスタ「1」をループ情報132に記録する。また、最適化部144は、ループ1におけるループ形状として、例えば初期値「1」、終値「10」、増分値「1」をループ情報132に記録する。更に、最適化部144は、ループ1における命令情報として、例えばメモリ命令数「-」(なし)、四則演算命令数「1」をループ情報132に記録する。
【0084】
最適化部144は、ループ2に関しても同様に、変数情報、レジスタ数、ループ形状および命令情報を取得し、ループ情報132に記録する。
図15は、ループ情報の例(続き)を示す図である。
【0085】
最適化部144は、ループ3,4に関しても、変数情報、レジスタ数、ループ形状および命令情報を取得し、ループ情報132に記録する。
図16は、ループ情報の例(続き)を示す図である。
【0086】
最適化部144は、ループ5に関しても、変数情報、レジスタ数、ループ形状および命令情報を取得し、ループ情報132に記録する。
図17は、ループ融合候補情報の例を示す図である。
【0087】
ループ融合候補情報133は、ループ融合可能リスト131およびループ情報132に基づいて最適化部144により生成され、制御情報記憶部130に格納される。ループ融合候補情報133は、トリガーのループに対する融合候補のループの組合せごとの、マスク処理の要否、変数の数、レジスタ数、変数の依存関係の有無、メモリ命令数および演算命令数を示す情報である。
【0088】
ここで、最適化部144は、融合候補のループの組合せを、ループ融合可能リスト131に基づいてトリガーごとに抽出し、ループ融合候補情報133に登録する。
ループ融合可能リスト131の例では、トリガー「1」に対して、融合可能ループにループ2,4,5がある。そのため、最適化部144は、ループ「1,2」、「1,4」、「1,5」の組合せを候補としてループ融合候補情報133のループの項目に記録する。
【0089】
次に、最適化部144は、ループ1と組合せたループ2,4,5に対して、次の融合可能ループを探索する。例えば、ループ融合可能リスト131では、トリガー「2」に対して融合可能ループ「3」が記載されている。しかし、トリガー「1」の融合可能ループには、ループ3はない。このため、最適化部144は、トリガー「1」に関して、ループ融合候補情報133のループの項目にループ3を含む組合せを載せない。
【0090】
次に、ループ融合可能リスト131では、トリガー「2」に対して融合可能ループ「4」が記載されている。トリガー「1」の融合可能ループには、ループ4がある。このため、最適化部144は、トリガー「1」に関して、ループ融合候補情報133のループの項目にループ「1,2,4」の組合せを候補として記録する。同様にして、最適化部144は、トリガー「1」に関して、ループ「1,2,5」、「1,4,5」、「1,2,4,5」の組合せを候補としてループ融合候補情報133のループの項目に記録する。最適化部144は、次にトリガー「2」に移って同様に融合候補のループの組合せをループ融合候補情報133に記録し、トリガーが無くなるまで繰り返す。
【0091】
ここで、ループ情報132に基づいてループ融合候補情報133に登録される情報について説明する。
マスク処理の要否とは、融合時にマスク変数を用いたマスク処理の追加が必要であるか否かであり、必要であれば「true」、不要であれば「false」となる。マスク処理は、ループの制御変数の初期値、終値、増分値が異なるループの組合せを融合する際に追加される分岐処理である。
【0092】
変数の数は、該当のループの組合せに属する各ループで使用される変数の数の和である。
レジスタ数は、該当のループの組合せに属する各ループで使用されるレジスタ数の和であり、整数レジスタおよび浮動小数レジスタごとに求められる。図中、レジスタ数を「r1,r2」のように記載する。r1は、整数レジスタの数である。r2は、浮動小数レジスタの数である。
【0093】
変数の依存関係の有無は、該当のループの組合せに属する各ループにおけるループを跨いだ変数の依存関係の有無である。変数の依存関係、すなわち、データ依存の例としては、図10,11で例示した依存関係が考えられる。依存ありは「true」となり、依存なしは「false」となる。
【0094】
メモリ命令数は、該当のループの組合せに属する各ループにおけるメモリ命令数の和である。
演算命令数は、該当のループの組合せに属する各ループにおける演算命令数の和である。
【0095】
例えば、ループ融合候補情報133には、トリガー「1」に対する融合候補のループの組合せ「1,2」に対して、マスク「true」、変数の数「2」、レジスタ数「4,2」、依存「false」、メモリ命令数「2」、演算命令数「2」というレコードが登録されている。このレコードは、ループ「1,2」の組合せを融合する場合、マスク処理の追加が必要であり、ループの制御変数以外の変数の数が「2」、整数レジスタ数が「4」、浮動小数レジスタ数が「2」、メモリ命令数が「2」、演算命令数が「2」であることを示す。また、このレコードは、ループ「1,2」の組合せに属するループ1,2では変数の依存関係がないことを示す。
【0096】
最適化部144は、トリガー「1」に対する他の組合せについても同様に、マスク、変数の数、レジスタ数、依存、メモリ命令数、演算命令数のレコードをループ融合候補情報133に登録する。
【0097】
最適化部144は、トリガー「2」に対する融合候補のループの組合せについても同様に、マスク、変数の数、レジスタ数、依存、メモリ命令数、演算命令数のレコードをループ融合候補情報133に登録する。
【0098】
図18は、ループ融合候補情報(続き)の例を示す図である。
最適化部144は、トリガー「3」、「4」に対する融合候補のループの組合せについても同様に、マスク、変数の数、レジスタ数、依存、メモリ命令数、演算命令数のレコードをループ融合候補情報133に登録する。
【0099】
なお、トリガー「5」については、ループ融合可能リスト131において融合可能ループが存在しない。このため、最適化部144は、トリガー「5」に対する情報を、ループ融合候補情報133に登録しなくてよい。
【0100】
次に、情報処理装置100の処理手順を説明する。
図19は、コンパイルの全体処理の例を示すフローチャートである。
(S10)中間言語生成部143は、ソースプログラム入力部141により入力されたソースプログラム111を入出力制御部142から取得し、ソースプログラム111に対する中間言語を生成する。ソースプログラム111は、例えば、図12で例示したソースコード111aを含む。中間言語生成部143は、生成した中間言語を中間言語記憶部120に格納する。
【0101】
(S11)最適化部144は、中間言語記憶部120に記憶された中間言語に基づいて、ループ融合可能リスト131を生成し、生成したループ融合可能リスト131を制御情報記憶部130に格納する。ループ融合可能リスト生成の詳細は後述される。
【0102】
(S12)最適化部144は、中間言語記憶部120に記憶された中間言語に基づいて、ループ情報132を生成し、生成したループ情報132を制御情報記憶部130に格納する。ループ情報生成の詳細は後述される。
【0103】
(S13)最適化部144は、制御情報記憶部130に記憶されたループ融合可能リスト131およびループ情報132に基づいて、ループ融合候補情報133を生成し、生成したループ融合候補情報133を制御情報記憶部130に格納する。ループ融合候補情報生成の詳細は後述される。
【0104】
(S14)最適化部144は、制御情報記憶部130に記憶されたループ融合候補情報133に基づいて、融合対象のループの組合せを決定する。融合対象決定の詳細は後述される。
【0105】
(S15)最適化部144は、中間言語記憶部120に記憶された中間言語において、ステップS14で決定された融合対象のループの組合せに対してループ融合を行うことで、ループ融合後の中間言語を生成する。なお、ループ融合候補情報133においてマスク「true」であるループの組合せに対してループ融合を行う場合、最適化部144は、ループの初期化処理にマスク処理を追加することで、ループ融合を行う。
【0106】
(S16)コード生成部145は、ループ融合後の中間言語を基にアセンブリ言語を生成し、入出力制御部142に出力する。オブジェクトファイル出力部146は、生成されたアセンブリ言語を入出力制御部142から取得し、アセンブリ言語に基づいてオブジェクトファイル112を生成する。オブジェクトファイル出力部146は、生成したオブジェクトファイル112を記憶部110に格納する。そして、コンパイルが終了する。
【0107】
図20は、ループ融合可能リスト生成の例を示すフローチャートである。
ループ融合可能リスト生成は、ステップS11に相当する。
(S20)最適化部144は、トリガーループ番号Iを初期化する。例えば、最適化部144は、I=1に初期化する。
【0108】
(S21)最適化部144は、ループ融合可能リスト131の雛形である空リストを生成し、制御情報記憶部130に格納する。
(S22)最適化部144は、判定対象ループ番号JをJ=I+1に設定する。
【0109】
(S23)最適化部144は、中間言語に含まれるループIとループJに関して、リダクションループやタイトリといったループ構造を基に、融合可能であるか否かを判定する。融合可能である場合、ステップS24に処理が進む。融合可能でない場合、ステップS25に処理が進む。
【0110】
(S24)最適化部144は、トリガーループ番号Iに対して、融合可能なループJを、ループ融合可能リスト131に追加する。そして、ステップS25に処理が進む。
(S25)最適化部144は、トリガーループ番号Iに対する全判定対象について、融合可否を判定済であるか否かを判定する。判定対象ループ番号Jが最後のループ番号に達した場合に、全判定対象について判定済となる。全判定対象について判定済の場合、ステップS27に処理が進む。全判定対象について判定済でない場合、ステップS26に処理が進む。
【0111】
(S26)最適化部144は、Jをインクリメントする。すなわち、最適化部144は、J=J+1とする。そして、ステップS23に処理が進む。
(S27)最適化部144は、全トリガーループについて処理済であるか否かを判定する。トリガーループ番号Iが最後のループ番号に達した場合に、全トリガーループについて処理済となる。全トリガーループについて処理済である場合、ループ融合可能リスト生成が終了する。全トリガーループについて処理済でない場合、ステップS28に処理が進む。
【0112】
(S28)最適化部144は、Iをインクリメントする。すなわち、最適化部144は、I=I+1とする。そして、ステップS21に処理が進む。
図21は、ループ情報生成の例を示すフローチャートである。
【0113】
ループ情報生成は、ステップS12に相当する。
(S30)最適化部144は、トリガーループ番号Iを初期化する。例えば、最適化部144は、I=1に初期化する。
【0114】
(S31)最適化部144は、ループ情報132の雛形データを生成し、制御情報記憶部130に格納する。
(S32)最適化部144は、中間言語に基づいてループIの変数情報を取得し、ループ情報132に書き込む。
【0115】
(S33)最適化部144は、中間言語に基づいてループIのレジスタ数を取得し、ループ情報132に書き込む。最適化部144は、整数レジスタおよび浮動小数レジスタに分けてレジスタ数を取得する。
【0116】
(S34)最適化部144は、中間言語に基づいてループIのループ形状、すなわち、制御変数の初期値、終値、増分値を取得し、ループ情報132に書き込む。
(S35)最適化部144は、中間言語に基づいてループIの命令情報を取得し、ループ情報132に書き込む。最適化部144は、命令情報として、メモリ命令数および演算命令数を取得する。
【0117】
(S36)最適化部144は、全トリガーループについて処理済であるか否かを判定する。全トリガーループについて処理済である場合、ループ情報生成が終了する。全トリガーループについて処理済でない場合、ステップS37に処理が進む。
【0118】
(S37)最適化部144は、Iをインクリメントする。すなわち、最適化部144は、I=I+1とする。そして、ステップS31に処理が進む。
図22は、ループ融合候補情報生成の例を示すフローチャートである。
【0119】
ループ融合候補情報生成は、ステップS13に相当する。
(S40)最適化部144は、トリガーループ番号Iを初期化する。例えば、最適化部144は、I=1に初期化する。
【0120】
(S41)最適化部144は、トリガーループIに対するループ融合候補情報133の雛形のデータ構造を生成し、制御情報記憶部130に格納する。
(S42)最適化部144は、ループ融合可能リスト131を基に、該当のトリガーループIに対するループ融合候補のループの組合せを抽出し、ループ融合候補情報133のループの項目に追加する。
【0121】
(S43)最適化部144は、全トリガーループに対して処理済であるか否かを判定する。全トリガーループについて処理済である場合、ステップS45に処理が進む。全トリガーループについて処理済でない場合、ステップS44に処理が進む。
【0122】
(S44)最適化部144は、Iをインクリメントする。すなわち、最適化部144は、I=I+1とする。そして、ステップS41に処理が進む。
(S45)最適化部144は、トリガーループ番号Iを初期化する。例えば、最適化部144は、I=1に初期化する。
【0123】
(S46)最適化部144は、トリガーループIに関して、ループ融合候補情報133から融合候補のループの組合せを1つ抽出する。
(S47)最適化部144は、抽出した組合せに属するループの情報を、ループ情報132から取得する。
【0124】
(S48)最適化部144は、ステップS47で取得した情報を基に、ループ融合候補のループの組合せに対して、変数の数、レジスタ数、メモリ命令数および演算命令数を含む項目値を算出し、ループ融合候補情報133に登録する。ループ融合候補の項目値算出の詳細は後述される。
【0125】
(S49)最適化部144は、全トリガーループに対して処理済であるか否かを判定する。全トリガーループについて処理済である場合、ループ融合候補情報生成が終了する。全トリガーループについて処理済でない場合、ステップS50に処理が進む。
【0126】
(S50)最適化部144は、Iをインクリメントする。すなわち、最適化部144は、I=I+1とする。そして、ステップS46に処理が進む。
図23は、ループ融合候補の項目値算出の例を示すフローチャートである。
【0127】
ループ融合候補の項目値算出は、ステップS48に相当する。
(S60)最適化部144は、該当のループの組合せに属する全てのループでループ形状、すなわち、ループの制御変数の初期値、終値、増分値が同じであるか否かを判定する。該当の全てのループでループ形状が同じである場合、ステップS61に処理が進む。少なくとも何れかのループでループ形状が同じでない場合、ステップS62に処理が進む。
【0128】
(S61)最適化部144は、該当のループの組合せに対して、ループ融合候補情報133におけるマスクの項目を「false」に設定する。そして、ステップS63に処理が進む。
【0129】
(S62)最適化部144は、該当のループの組合せに対して、ループ融合候補情報133におけるマスクの項目を「true」に設定する。そして、ステップS63に処理が進む。
【0130】
(S63)最適化部144は、該当のループの組合せに対する変数の数を算出し、ループ融合候補情報133における変数の数の項目に、算出結果を設定する。最適化部144は、ループ情報132から取得した、該当の組合せに属するループにおけるループ制御変数以外の変数の数の和を、当該組合せに対応する変数の数として算出する。
【0131】
(S64)最適化部144は、該当のループの組合せに対するレジスタ数を算出し、ループ融合候補情報133におけるレジスタ数の項目に、算出結果を設定する。最適化部144は、ループ情報132から取得した、該当の組合せに属するループにおける整数レジスタ数の和、および、浮動小数レジスタ数の和を、当該組合せに対応するレジスタ数として算出する。
【0132】
(S65)最適化部144は、該当のループの組合せに変数の依存があるか否かを判定する。変数の依存がある場合、ステップS66に処理が進む。変数の依存がない場合、ステップS67に処理が進む。変数の依存の例としては、図10,11で説明したデータ依存が挙げられる。
【0133】
(S66)最適化部144は、該当のループの組合せに対して、ループ融合候補情報133における依存の項目を「true」に設定する。そして、ステップS68に処理が進む。
【0134】
(S67)最適化部144は、該当のループの組合せに対して、ループ融合候補情報133における依存の項目を「false」に設定する。そして、ステップS68に処理が進む。
【0135】
(S68)最適化部144は、該当のループの組合せに対するメモリ命令数を算出し、ループ融合候補情報133におけるメモリ命令数の項目に、算出結果を設定する。最適化部144は、ループ情報132から取得した、該当の組合せに属するループにおけるメモリ命令数の和を、当該組合せに対応するメモリ命令数として算出する。
【0136】
(S69)最適化部144は、該当のループの組合せに対する演算命令数を算出し、ループ融合候補情報133における演算命令数の項目に、算出結果を設定する。最適化部144は、ループ情報132から取得した、該当の組合せに属するループにおける演算命令数の和を、当該組合せに対応する演算命令数として算出する。そして、ループ融合候補の項目値算出が終了する。
【0137】
図24は、融合対象決定の例を示すフローチャートである。
融合対象決定は、ステップS14に相当する。
(S70)最適化部144は、ループ融合候補情報133のレコード番号Jを初期化する。例えば、最適化部144は、J=0に初期化する。ここで、レコード番号Jは、ループ融合候補情報133における1つの融合候補のループの組合せを識別する。
【0138】
(S71)最適化部144は、ループ融合候補情報133に基づいて、該当のループの組合せに対する依存の項目値が「true」であるか否かを判定する。依存の項目値が「true」の場合、ステップS78に処理が進む。依存の項目値が「false」の場合、ステップS72に処理が進む。
【0139】
(S72)最適化部144は、ループ融合対象として仮決定済の融合候補があるか否かを判定する。仮決定済の融合候補がある場合、ステップS74に処理が進む。仮決定済の融合候補がない場合、ステップS73に処理が進む。
【0140】
(S73)最適化部144は、レコード番号Jの融合候補のループの組合せを、融合対象として仮決定する。そして、ステップS78に処理が進む。
(S74)最適化部144は、ループ融合候補情報133に基づいて、レコード番号Jのループの組合せに対応する変数の数が、仮決定済の融合候補に対応する変数の数よりも多いか否かを判定する。レコード番号Jのループの組合せに対応する変数の数が、仮決定済の融合候補に対応する変数の数よりも多い場合、ステップS75に処理が進む。レコード番号Jのループの組合せに対応する変数の数が、仮決定済の融合候補に対応する変数の数以下の場合、ステップS78に処理が進む。
【0141】
(S75)最適化部144は、ループ融合候補情報133に基づいて、レコード番号Jのループの組合せに対応するレジスタ数が、オブジェクトファイル112を含む実行ファイル113を実行予定の装置におけるレジスタの使用可能数以下であるか否かを判定する。当該組合せに対応するレジスタ数が、使用可能数以下である場合、ステップS76に処理が進む。当該組合せに対応するレジスタ数が、使用可能数より多い場合、ステップS78に処理が進む。
【0142】
ここで、実行ファイル113を実行予定の装置におけるレジスタの使用可能数は、制御情報記憶部130に予め設定される。当該使用可能数は、該当の装置が備える物理的なレジスタの数に応じた数となり、整数レジスタおよび浮動小数レジスタそれぞれに対して設定される。すなわち、最適化部144は、整数レジスタ数および浮動小数レジスタ数それぞれに対して、使用可能数以下であるかを判定し、整数レジスタ数および浮動小数レジスタ数の両方が使用可能数以下の場合に、ステップS76に処理を進める。一方、最適化部144は、整数レジスタ数および浮動小数レジスタ数の少なくとも一方が使用可能数より多い場合に、ステップS78に処理を進める。なお、実行ファイル113を実行予定の装置は、情報処理装置100でもよい。
【0143】
(S76)最適化部144は、ループ融合候補情報133に基づいて、レコード番号Jのループの組合せに対応するメモリ命令数から所定値を減算した数が、当該組合せに対応する演算命令数以上であるか否かを判定する。メモリ命令数から所定値を減算した数が、当該組合せに対応する演算命令数以上である場合、ステップS77に処理が進む。メモリ命令数から所定値を減算した数が、当該組合せに対応する演算命令数よりも少ない場合、ステップS78に処理が進む。
【0144】
ここで、ステップS76で用いられる所定値は、例えば、実行ファイル113を実行予定の装置が備える複数の演算器において同時実行可能なメモリ命令の数に応じて予め定められる。例えば、当該装置が備える複数の演算器において同時実行可能なメモリ命令の数が「2」である場合、ステップS76で用いられる所定値を「2」とすることが考えられる。あるいは、例えば同時実行可能なメモリ命令の数が「1」である場合、ステップS76で用いられる所定値を「1」とすることが考えられる。演算命令を実行するためには、その前にメモリ命令が実行されるため、最適化部144は、ループ融合候補情報133のメモリ命令数から最初に同時実行され得るメモリ命令数を引いた上で、演算命令数と比較する。
【0145】
(S77)最適化部144は、仮決定の融合対象をレコード番号Jの融合候補に置換する。すなわち、最適化部144は、レコード番号Jの融合候補のループの組合せを、融合対象として仮決定し、ステップS77より前に仮決定されていた融合候補については、仮決定を解除する。
【0146】
(S78)最適化部144は、ループ融合候補情報133の全レコードを処理済であるか否かを判定する。レコード番号Jが最後のレコード番号に達した場合に、全レコードについて処理済となる。全レコードについて処理済である場合、最適化部144は、ステップS78の段階で仮決定されているループの組合せを融合対象として決定して、融合対象決定を終了する。全レコードについて処理済でない場合、ステップS79に処理が進む。
【0147】
(S79)最適化部144は、Jをインクリメントする。すなわち、最適化部144は、J=J+1とする。そして、ステップS71に処理が進む。
図25は、ループ融合対象の決定結果の例を示す図である。
【0148】
最適化部144は、図17,18で示したループ融合候補情報133に対して、図24の手順により、例えば、ループ「1,2,4,5」の組合せを、ループ融合対象と決定する。なお、ループ「1,2,4,5」の組合せは、ループ融合候補情報133においてマスク「true」である。したがって、最適化部144は、ループの初期化処理にマスク処理を追加することで、ループ「1,2,4,5」の組合せに対するループ融合を行う。
【0149】
このように、最適化部144は、レジスタ数が使用可能数以下、かつ、メモリ命令数と演算命令数とがバランス良く含まれるループの組合せであって、変数の数がより多い組合せを優先的に、ループ融合対象として決定する。
【0150】
これにより、レジスタ不足によるメモリへのデータ退避/復元(spill/fill)、すなわち、スピル/フィルの抑止や演算器の効率利用を図れる。実行ファイル113における該当のループの実行時の各サイクルにおいて、複数の演算器に複数の命令を効率的に割り当てることが可能となり、処理性能を向上できる。例えば、ループ融合をしないよりも、融合したループの処理速度を向上できる。また、レジスタの効率的な利用を図ることもできる。
【0151】
図26は、ループ融合の判定対象のコードの他の例を示す図である。
ソースコード111bは、ソースプログラム111に含まれるコードの一例である。例えば、ソースコード111bは、ループ1j,2j,3jの3つのループを含む。最適化部144は、中間言語生成部143が生成したソースコード111bの中間言語から、融合候補のループの組合せを抽出する。ループ1j,2jは、ループ形状が同じである。ただし、ループ1j,2jでは、ループ1jで求めているB1をループ2jで使用しており、変数同士の依存関係が強い。ループ1j,3jは、ループ形状が異なる。ループ2j,3jは、ループ形状が異なる。
【0152】
ソースコード111bに対して、例えば、最適化部144は、ループ形状の異なるループ1j,3jの組合せを融合する。
図27は、ループ融合後のコードの例を示す図である。
【0153】
ソースコード111cは、ソースコード111bにおけるループ1j,3jを融合した場合の融合後のコードを、ソースコードベースで示している。最適化部144は、ソースコード111bの中間言語に対してループ融合を適用することにより、ソースコード111cに対応する中間言語を生成する。ソースコード111cには、融合後のループの終値を求める処理や融合後のループに用いられるマスクを生成する処理が追加される例が示されている。
【0154】
次に、図27に示すループ融合が行われた場合における、融合後のループに対する命令スケジューリングの例を説明する。
図28は、命令スケジューリングの例を示す図である。
【0155】
表201は、図27で例示した融合後のループに対する、サイクルごとの各演算器への命令の割り当て例を示す。演算器の数は4個であり、同時実行可能なメモリ命令数は2であるとする。演算器の項目の下に記載された1つの列が1つの演算器に相当する。また、一例として、レジスタからメモリへのロードを行うLOAD命令のレイテンシが8τであり、引き算を行うSUB命令のレイテンシが4τであるとする。ここで、τは、1サイクル当たりの時間である。更に、メモリのアドレス計算は省くものとする。
【0156】
表201における括弧記号で括られた「(1)」などの数値は、該当のサイクルにおいて、1つの演算器に割り当てられる命令に対して実行される処理を表す。例えば、括弧記号で括られた数値は、次の処理となる。
【0157】
(1)1つ目の演算器は、V(k,i,j)をロードする。
(2)2つ目の演算器は、V(k-1,i,j)をロードする。
(3)3つ目の演算器は、(1)の結果から(2)の結果を引く。
【0158】
(4)1つ目の演算器は、V(k+1,i,j)をロードする。
(5)2つ目の演算器は、V(k-2,i,j)をロードする。
(6)3つ目の演算器は、(4)の結果から(5)の結果を引く。
【0159】
(7)3つ目の演算器は、(3)の結果から(6)の結果を引く。
(8)1つ目の演算器は、(7)の結果をA1にストアする。
(9)1つ目の演算器は、A1(k,i,j)をロードする。
【0160】
(17)1つ目の演算器は、D2(k,i,j)をロードする。
(18)2つ目の演算器は、D2(k-1,i,j)をロードする。
(19)4つ目の演算器は、(17)の結果から(18)の結果を引く。
【0161】
(20)1つ目の演算器は、D2(k+1,i,j)をロードする。
(21)2つ目の演算器は、D2(k-2,i,j)をロードする。
(22)4つ目の演算器は、(20)の結果から(21)の結果を引く。
【0162】
(23)4つ目の演算器は、(19)の結果から(22)の結果を引く。
(24)4つ目の演算器は、(23)の結果をD1にストアする。
表201における各処理が実行されるスケジュールは次の通りである。(1)、(2)は、1サイクル目に実行される。(4)、(5)は、2サイクル目に実行される。(17)、(18)は、3サイクル目に実行される。(20)、(21)は、4サイクル目に実行される。(3)は、9サイクル目に実行される。(6)、(19)は、10サイクル目に実行される。(22)は、11サイクル目に実行される。(7)は、14サイクル目に実行される。(23)は、15サイクル目に実行される。(8)は、17サイクル目に実行される。(9)、(24)は、18サイクル目に実行される。図中、19サイクル目以降のB1に関する処理は省略されている。
【0163】
このように、ループ融合により、A1およびD1に関する演算を18サイクルで行うことが可能になり、下記の図29,30の比較例に比べて演算器を有効に使えていることが分かる。
【0164】
次に、ソースコード111bのループ1j,2jを融合した場合における命令スケジューリングの比較例を説明する。
図29は、命令スケジューリングの比較例を示す図である。
【0165】
ソースコード91は、ループ1j,2jを融合した場合のコード例を示す。
表202は、ループ1j,2jを融合した場合の融合後のループに対する、サイクルごとの各演算器への命令の割り当て例を示す。図28と同様に、演算器の数は4個であり、同時実行可能なメモリ命令数は2であるとする。演算器の項目の下に記載された1つの列が1つの演算器に相当する。また、一例として、LOAD命令のレイテンシが8τであり、SUB命令のレイテンシが4τであるとする。表202において、括弧記号で括られた数値は、次の処理となる。
【0166】
(1)1つ目の演算器は、V(k,i,j)をロードする。
(2)2つ目の演算器は、V(k-1,i,j)をロードする。
(3)3つ目の演算器は、(1)の結果から(2)の結果を引く。
【0167】
(4)1つ目の演算器は、V(k+1,i,j)をロードする。
(5)2つ目の演算器は、V(k-2,i,j)をロードする。
(6)3つ目の演算器は、(4)の結果から(5)の結果を引く。
【0168】
(7)3つ目の演算器は、(3)の結果から(6)の結果を引く。
(8)1つ目の演算器は、(7)の結果をA1にストアする。
(9)1つ目の演算器は、A1(k,i,j)をロードする。
【0169】
図中、B1に関する19サイクル目から35サイクル目の処理は省略されている。
図30は、命令スケジューリングの比較例(続き)を示す図である。
(17)1つ目の演算器は、B1(k,i,j)をロードする。
【0170】
(18)2つ目の演算器は、B1(k-1,i,j)をロードする。
(19)3つ目の演算器は、(17)の結果から(18)の結果を引く。
(20)1つ目の演算器は、B1(k+1,i,j)をロードする。
【0171】
(21)2つ目の演算器は、B1(k-2,i,j)をロードする。
(22)3つ目の演算器は、(20)の結果から(21)の結果を引く。
(23)3つ目の演算器は、(19)の結果から(22)の結果を引く。
【0172】
(24)1つ目の演算器は、(23)の結果をC1にストアする。
表202における各処理が実行されるスケジュールは次の通りである。(1)、(2)は、1サイクル目に実行される。(4)、(5)は、2サイクル目に実行される。(3)は、9サイクル目に実行される。(6)は、10サイクル目に実行される。(7)は、14サイクル目に実行される。(8)は、17サイクル目に実行される。(9)は、18サイクル目に実行される。19サイクル目~35サイクル目では、B1に関する処理が実行される。(17)、(18)は、36サイクル目に実行される。(20)、(21)は、37サイクル目に実行される。(19)は、44サイクル目に実行される。(22)は、45サイクル目に実行される。(23)は、49サイクル目に実行される。(24)は、52サイクル目に実行される。なお、B1の処理に要するサイクル数は、図28の場合も図29,30の場合も同等である。
【0173】
このように、ループ1j,2jを融合すると、C1の処理が終わるまでに、52サイクルかかる。ループ1jの演算結果をループ2jで使用しているため、ループ1jの演算が終わるまでループ2jの演算は待つことになり、命令実行の並列度を上げられないループ融合となる。したがって、ループ1j,2jを融合したとしても、各サイクルにおいて演算器の空きが比較的多くなることで演算器を十分に使い切れなくなり、効率的なループ融合を行えないことになる。また、ループ融合したことで、レジスタが足りなくなり、退避や復元のメモリアクセスが増えて、性能が悪化することもある。
【0174】
これに対し、図28で例示したように、情報処理装置100によれば、演算器の利用の効率化を図ることができ、ループ処理の実行時の処理性能を向上することができる。例えば、実際の演算器の数を超える演算が同時に行われないように、ループ1j,3jに対して命令実行の並列度を上げることが可能であり、ループ処理の実行にかかるサイクル数を効率的に短縮できる。また、レジスタが足りなくなることによるスピル/フィルのメモリアクセスを抑制できる。その結果、処理速度を向上できる。
【0175】
また、情報処理装置100によれば、ループ形状が異なる、すなわち、ループの制御変数の初期値、終値、増分値が異なるループの組合せも融合対象にすることができる。ループ形状が異なるループの組合せを融合する場合には、融合後のループ内の演算が肥大化して非効率なループ融合が行われ易いが、情報処理装置100の機能により非効率なループ融合が抑制されるためである。このため、ループ融合を行うループの組合せの自由度が増し、より効率的なループ融合を行える可能性が高まる。
【0176】
また、情報処理装置100のコンパイラの機能は、レジスタの数が比較的少なく、レジスタのサイクル数が比較的長いアーキテクチャに特に有効となる。
なお、第2の実施の形態では、ループ融合を判定するための各種データを中間言語(中間コード)から抽出する例で説明したが、これに限定されるものではない。例えば、コンパイラ140は、ソースプログラム111から当該各種データを抽出することもできる。コンパイラ140は、融合候補のループの組合せの特定についてはソースプログラム111を用いて実行し、ループごとの変数の数、レジスタ数、メモリ命令数および演算命令数などのデータの抽出については中間言語を用いて抽出してもよい。
【0177】
第2の実施の形態で説明した情報処理装置100は、例えば次の処理を実行する。
最適化部144は、中間コードに含まれる複数のループそれぞれに対して、当該ループで使用される変数の数、レジスタの数、メモリ命令の数および演算命令の数を含むループ情報132を取得する。最適化部144は、ループ情報132に基づいて、ループ融合の候補であるループの組合せに対応する変数の数、レジスタの数、メモリ命令の数および演算命令の数を、ループの複数の組合せそれぞれに対して算出する。最適化部144は、複数の組合せそれぞれに対して算出した変数の数、レジスタの数、および、メモリ命令の数と演算命令の数との比較に基づいて、複数の組合せのうち、ループ融合を適用する組合せを決定する。最適化部144は、決定した組合せに対してループ融合を実行する。
【0178】
これにより、ループ融合後の中間コードを用いて生成されたオブジェクトコードを含む実行ファイル113の処理性能を向上できる。
最適化部144は、中間コードに基づいて、ループの制御変数の取り得る値が互いに異なる2以上のループが属する組合せを、ループ融合の候補として取得する。
【0179】
これにより、ループ融合の自由度が増し、より効率的なループ融合を行える可能性が高まる。
最適化部144は、融合候補のループの複数の組合せのうち、算出した変数の数が多い組合せを優先して、ループ融合を適用する組合せとして決定する。
【0180】
これにより、演算の並列度を向上させて演算器を効率的に利用できる可能性が高まる。
最適化部144は、融合候補のループの複数の組合せのうち、算出したレジスタの数が、コンパイルにより生成されるオブジェクトコードの実行予定の装置でのレジスタの使用可能数以下である組合せを、ループ融合を適用する組合せとして決定する。
【0181】
これにより、スピルやフィルが発生する可能性を抑えて、レジスタを効率的に利用できる可能性が高まる。
最適化部144は、融合候補のループの複数の組合せのうち、算出したメモリ命令の数から所定値を引いた数が演算命令の数以上である組合せを、ループ融合を適用する組合せとして決定する。
【0182】
このように、メモリ命令の数に比べて演算命令の数が過大にならないループの組合せに対してループ融合を適用することで、複数の命令を適度に複数の演算器に分散して割り当てることができ、レジスタおよび演算器を効率的に利用できる可能性を高められる。
【0183】
最適化部144は、コンパイルにより生成されるオブジェクトコードの実行予定の装置により同時実行可能なメモリ命令の数に応じて、メモリ命令の数から減算する所定値を決定してもよい。例えば、最適化部144は、該当の装置において、同時実行可能なメモリ命令の数を、当該所定値としてもよい。
【0184】
これにより、メモリ命令の数に対する演算命令の数の比較を適切に行うことができ、ループ融合により、レジスタおよび演算器を効率的に利用できる可能性を一層高められる。
また、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体53に記録できる。
【0185】
例えば、プログラムを記録した記録媒体53を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体53に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。
【符号の説明】
【0186】
10 情報処理装置
11 記憶部
12 処理部
20 ソースコード
20a,20b 中間コード
21 ループ情報
22 ループ融合候補情報
30 オブジェクトコード
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24
図25
図26
図27
図28
図29
図30