(57)【特許請求の範囲】
【請求項１】
入力受付手段と演算処理手段とを有し、Ｎ重ループ(Ｎは自然数)と、Ｍ重ループ(Ｍは自然数)とを含むソースプログラムに対しストリップマイニング処理を実行して、内側ループと外側ループとする情報処理システムであって、
前記ソースプログラムには、前記N重ループを構成するループと、前記M重ループを構成するループとの各々の、ループの繰り返し回数を示す制御値が含まれ、さらに、前記N重ループと前記M重ループとを含むストリップマイニング処理対象範囲を示す第１指示文が含まれており、
ストリップマイニング後の内側ループのループ回数を示す設定値と、前記Ｎ重ループ及び前記Ｍ重ループ各々の、何重目のループかを示すレベル情報とが、前記入力受付手段から入力される、または、前記ソースプログラムに含まれており、
前記情報処理システムは、
前記入力受付手段が、ソースプログラムの識別情報の入力を受け付け、
前記演算処理手段が、
前記入力受付手段が受け付けた前記識別情報に対応するソースプログラムについて、前記第１指示文に示される範囲内において、前記N重ループを構成するループのうち該N重ループの前記レベル情報に示されるループ（以下、第１ストリップマイニング対象ループ）の制御値、および、前記M重ループを構成するループのうち該Ｍ重ループの前記レベル情報に示されるループ（以下、第２ストリップマイニング対象ループ）の制御値を、前記設定値で置き換え、該制御値を置き換えた第１ストリップマイニング対象ループおよび第２ストリップマイニング対象ループを２つの内側ループとし、さらに、当該２つの内側ループを含み、かつ、前記第１指示文で示される範囲を、前記設定値分のステップ数の外側ループで囲む変換処理を行うことを特徴とする情報処理システム。
【請求項２】
請求項１記載の情報処理システムであって、
前記第１指示文は、
前記設定値、及び、前記Ｍ重ループ及び前記Ｎ重ループ各々の前記レベル情報の少なくとも一方を指定情報として含み、
前記演算処理手段は、前記第１指示文に含まれた前記指定情報を用いて前記第１指示文で示される範囲における前記変換を実行することを特徴とする情報処理システム。
【請求項３】
請求項１又は２に記載の情報処理システムであって、
前記ソースプログラムは、前記第１及び第２のストリップマイニング対象ループとなるループをそれぞれ指定する第２指示文を含み、
前記設定値が、前記入力受付手段から入力される、または、前記ソースプログラムに含まれており、
前記演算処理手段は、前記第２指示文で指示される前記第１ストリップマイニング対象ループの制御値、および、前記第２指示文で指示される前記第２ストリップマイニング対象ループの制御値を、前記設定値で置き換えることを特徴とする情報処理システム。
【請求項４】
入力受付手段と演算処理手段とを有する情報処理装置に、Ｎ重ループ(Ｎは自然数)と、Ｍ重ループ(Ｍは自然数)とを含むソースプログラムに対しストリップマイニング処理を実行させて、内側ループと外側ループとするプログラムであって、
前記ソースプログラムには、前記N重ループを構成するループと、前記M重ループを構成するループとの各々の、ループの繰り返し回数を示す制御値が含まれ、さらに、前記N重ループと前記M重ループとを含むストリップマイニング処理対象範囲を示す第１指示文が含まれており、
ストリップマイニング後の内側ループのループ回数を示す設定値と、前記Ｎ重ループ及び前記Ｍ重ループの各々の、何重目のループかを示すレベル情報とが、前記入力受付手段から入力される、または、前記ソースプログラムに含まれており、
前記演算処理手段に、
前記入力受付手段から、ソースプログラムの識別情報の入力を受け付ける入力受付け処理と、
前記入力受付手段が受け付けた前記識別情報に対応するソースプログラムについて、前記第１指示文に示される範囲内において、前記N重ループを構成するループのうち該N重ループの前記レベル情報に示されるループ（以下、第１ストリップマイニング対象ループ）の制御値、および、前記M重ループを構成するループのうち該Ｍ重ループの前記レベル情報に示されるループ（以下、第２ストリップマイニング対象ループ）の制御値を、前記設定値で置き換え、該制御値を置き換えた第１ストリップマイニング対象ループおよび第２ストリップマイニング対象ループを２つの内側ループとし、さらに、当該２つの内側ループを含み、かつ、前記第１指示文で示される範囲を、前記設定値分のステップ数の外側ループで囲むループ変換処理と、を実行させること
を特徴とするプログラム。
【請求項５】
請求項４記載のプログラムであって、
前記第１指示文は、
前記設定値、及び、前記Ｍ重ループ及び前記Ｎ重ループ各々の前記レベル情報の少なくとも一方を指定情報として含み、
前記ループ変換処理において、前記演算処理手段に、前記第１指示文に含まれる前記指定情報を用いて前記第１指示文で示される範囲における前記変換を実行させることを特徴とするプログラム。
【請求項６】
請求項４又は５に記載のプログラムであって、
前記ソースプログラムは、前記第１及び第２のストリップマイニング対象ループを指定する第２指示文を含み、
前記設定値が、前記入力受付手段から入力される、または、前記ソースプログラムに含まれており、
前記ループ変換処理において、前記演算処理手段に、前記第２指示文で指示される前記第１ストリップマイニング対象ループの制御値、および、前記第２指示文で指示される前記第２ストリップマイニング対象ループの制御値を、前記設定値で置き換えさせること
を特徴とするプログラム。
【請求項７】
請求項４、５及び６のうちいずれか１項に記載のプログラムが記録されたことを特徴とする、コンピュータ読み取り可能な記憶媒体。
【請求項８】
入力受付手段と演算処理手段とを有する情報処理装置に、Ｎ重ループ(Ｎは自然数)と、Ｍ重ループ(Ｍは自然数)とを含むソースプログラムに対しストリップマイニング処理を実行させて、内側ループと外側ループとするコード生成方法であって、
前記N重ループを構成するループと、前記M重ループを構成するループとの各々には、ループの繰り返し回数を示す制御値が設定され、前記N重ループと前記M重ループとを含むストリップマイニング処理対象範囲が、第１指示文で示されており、
ストリップマイニング後の内側ループのループ回数を示す設定値と、前記Ｎ重ループ及び前記Ｍ重ループの各々の、何重目のループかを示すレベル情報とが、前記入力受付手段から入力される、または、前記ソースプログラムに含まれており、
前記演算処理手段が、
前記入力受付手段からの、ソースプログラムの識別情報の入力を受け付ける入力受付け処理と、
前記入力受付手段が受け付けた前記識別情報に対応するソースプログラムについて、前記第１指示文に示される範囲内において、前記N重ループを構成するループのうち該N重ループの前記レベル情報に示されるレベルのループ（以下、第１ストリップマイニング対象ループ）の制御値、および、前記M重ループを構成するループのうち該Ｍ重ループの前記レベル情報に示されるレベルのループ（以下、第２ストリップマイニング対象ループ）の制御値を、前記設定値で置き換え、該制御値を置き換えた第１ストリップマイニング対象ループおよび第２ストリップマイニング対象ループを２つの内側ループとし、さらに、当該２つの内側ループを含み、かつ、前記第１指示文で示される範囲を、前記設定値分のステップ数の外側ループで囲むループ変換処理と、を実行すること
を特徴とするコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースプログラムに含まれる複数のループのストリップマイニング処理の効率化を図る技術に関する。
【背景技術】
【０００２】
非特許文献１の３５０〜３５２頁には、単一のループを二重ループに変換するストリップマイニングが記載されている。
【０００３】
一方、非特許文献２には、複数のループを「２５６」でストリップマインする技術が記載されている。このストリップマイニングによれば、繰返し数を「２５６」とした全ループを囲む、ステップ２５６の外側ループが生成され、キャッシュヒットの可能性の向上、及び、参照される配列サイズの抑制が図れる。
【０００４】
【非特許文献１】Michael Wolfe: High Performance Compilers for Parallel Computing, AddisonWesley Publishing Company, 1996.
【０００５】
【非特許文献２】Cray T3E Fortran Optimization Guide, Cray Research Inc.,  Document Number 004-2518-002, 1999, p.98.
【発明の開示】
【発明が解決しようとする課題】
【０００６】
ところが、ソースプログラムに複数のループが含まれていると、コンパイラが、そのソースプログラムの解析結果に基づきストリップマイニングを実行しても、その結果は、必ずしも、ユーザの意図通りであるとは限らない。
【０００７】
そこで、本発明は、情報処理システムにおいて、複数のループに対するストリップマイニングを、ユーザの意図通りに効率的に実行させることを目的とする。
【課題を解決するための手段】
【０００８】
上記課題を解決するため、本発明においては、第１ストリップマイニング対象ループを有するＮ重ループ(Ｎは自然数)と第２ストリップマイニング対象ループを有するＭ重ループ(Ｍは自然数)とを含むストリップマイニング適用範囲を示す第１指示文をソースプログラムに含ませておき、情報処理システムにおいて、そのソースプログラムについて、第１指示文が示すストリップマイニング適用範囲が、Ｎ重及びＭ重ループ内において第１及び第２のストリップマイニング対象ループの繰返し回数を設定値で置き換えた２つの内側ループと、これら２つの内側ループを囲む、設定数分のステップ数の外側ループとに変換されるようにした。
【発明の効果】
【０００９】
本発明によれば、情報処理システムにおいて、複数のループに対するストリップマイニングを、ユーザの意図通りに効率的に実行することができる。
【発明を実施するための最良の形態】
【００１０】
以下、添付の図面を参照しながら、本発明に係る実施の形態について説明する。
【００１１】
最初に、本実施の形態に係るコンパイル処理の対象となるソースプログラムについて説明しておく。ここでは、Fortran言語により記述されたソースプログラムを具体例としてあげる。
【００１２】
図４(ａ)に、ソースプログラム２０６の記述例を示す。このソースプログラム２０６には、ストリップマイニングの適用範囲を指定するための１対のストリップマイニング指示文４０１,４０２が記述されている。
【００１３】
これらのストリップマイニング指示文４０１,４０２のうち、一方のストリップマイニング指示文４０１「*option STRIPMINE_START(100)」は、ストリップマイニングの適用範囲の開始位置を指定するものであり、ストリップマイニングの適用範囲の直前に挿入されている。ここで、start指示文中の括弧内に指定されているパラメータ値「１００」は、ストリップマイニング後の内側ループのループ回数(以下、ブロックサイズと呼ぶ)であり、ストリップマイニング後の内側ループにおいて参照されるメモリサイズがキャッシュサイズ以下となるように定められている。以下、このようなストリップマイニング指示文をstart指示文と呼ぶ。
【００１４】
他方のストリップマイニング指示文４０２「*option STRIPMINE_END」は、ストップマイニング範囲の終了位置を指定するものであり、ストリップマイニング適用範囲の直後に挿入されている。以下、このようなストリップマイニング指示文をend指示文と呼ぶ。
【００１５】
なお、ここでは、以下の説明の便宜上、１対のstart指示文４０１及びend指示文４０２が記述されたプログラム例を挙げたが、本実施の形態に係るコンパイル処理の対象となるソースプログラムには、start指示文及びend指示文を１対以上含めることもできる。
【００１６】
つぎに、図２により、本実施の形態に係るコンパイル処理を実行する計算機システムの構成を説明する。
【００１７】
本計算機システムは、情報処理装置２００、ユーザから入力されたコマンド(コンパイル処理の対象となるソースプログラム名を含むコンパイラ起動命令等)を情報処理装置２００に与えるキーボード等の入力装置２０３、情報処理装置２００の出力情報(コンパイラ終了メッセージ、エラーメッセージ等)を表示するディスプレイ装置２０２、を有している。
【００１８】
情報処理装置２００は、コンパイラ２０８がインストールされた外部記憶装置２０５、主記憶装置２０４、外部記憶装置２０５から主記憶装置２０４にロードしたコンパイラ２０８を実行するＣＰＵ２０１、入力装置２０３及び表示装置２０２が接続される入出力インタフェース２１２、光ディスク等の記憶媒体とのデータ転送を制御するドライブ(不図示)、ネットワークインタフェース等を有している。
【００１９】
コンパイラ２０８によるコンパイル処理の対象となる前述のソースプログラム２０６は、通常、外部記憶装置２０５に格納されている。そして、コンパイル処理の実行中には、ソースプログラム２０６のコンパイル過程で生成されるデータ(中間コード２０９、ループ表２１０、ストリップマイニング登録表２１１)が主記憶装置２０４上に保存され、コンパイル処理が終了すると、コンパイル処理により生成されたオブジェクトプログラム２０７が外部記憶装置２０５に格納される。
【００２０】
なお、コンパイラ２０８は、記憶媒体から外部記憶装置２０５にインストールされたものであってもよいし、ネットワークを介して外部記憶装置２０５にインストールされたものであってもよい。
【００２１】
つぎに、図２の計算機システムにおいて、コンパイラ２０８の実行により実現するコンパイル処理について説明する。
【００２２】
図３は、コンパイラ２０８が実行するコンパイル処理のフローチャートである。
【００２３】
起動されたコンパイラ２０８は、まず、ユーザにより指定されたソースプログラム２０６を外部記憶装置２０５から読み出して、そのソースプログラム２０６の構文解析を行い、解析結果に基づいて中間コード２０９を生成する(Ｓ３０１)。これにより生成される中間コード２０９は、ソースプログラムにおける制御の流れを表す制御フローグラフとして表現される。図４(ａ)のソースプログラム２０６から生成された制御フローグラフを図５に示す。この制御フローグラフは、分岐及び合流のない基本ブロック(先頭から順次実行される一連のコード文)Ｂ０〜Ｂ１１をノードとして、各ノード間の遷移経路をエッジ５００により表したグラフである。なお、以降の処理の説明を簡略化するため、図５の制御フローグラフにおいては、end指示文を含む基本ブロックＢ２とstart指示文を含む基本ブロックＢ１０とには他のコード文を含めていない。
【００２４】
つぎに、コンパイラ２０８は、この中間コード２０９を最適化するストリップマイニング最適化処理(Ｓ３０２)、最適化した中間コード２０９の各ノードにレジスタを割り付けるレジスタ割り付け処理(Ｓ３０３)、レジスタ割付後の中間コード２０９をオブジェクトプログラム２０７に変換するコード生成処理(Ｓ３０４)を、順次実行する。
【００２５】
これら一連の処理のうち、ストリップマイニング最適化処理Ｓ３０２において、コンパイラ２０８は、図１に示す処理Ｓ１０１〜Ｓ１０３を実行する。具体的には、(１)中間コード２０９に含まれているループの集合を求め、各ループに関する情報をループ表２１０に記録するループ解析処理(Ｓ１０１)、(２)ストリップマイニング指示文を解析することによってストリップマイニング登録表２１１を生成するストリップマイニング指示解析処理(Ｓ１０２)、(３)ストリップマイニング登録表２１１に基づくストリップマイニング変換処理(Ｓ１０３)、が実行される。以下、これら各処理Ｓ１０１〜Ｓ１０３の詳細について説明する。
(１)ループ解析処理(Ｓ１０１)
コンパイラ２０８は、例えば、非特許文献１の第６７頁に記載されているループ解析方法にしたがって中間コード２０９のループ解析を行い、その解析結果をループ表２１０に登録する。ループ表２１０のデータ構造例として、図５の中間コードの解析により得られたループ表を図６に示す。このループ表には、図５の中間コードに含まれる２つのループ１,２について、それぞれ、ループ識別情報６０１、ループ入口の基本ブロック(以下、ループヘッダブロック)の識別情報(ループヘッダ情報)６０２、ループレベルを表すループレベル情報(最内側ループから数えて何重目のループであるかを表す情報：例えば、最内側ループならループレベル「１」、２重ループの外側ループならループレベル「２」)６０３、ループの制御変数(以下、第１ループ制御変数と呼ぶ)の初期化文６０４、第１ループ制御変数の増分値６０５、第１ループ制御変数の初期値６０６、第１ループ制御変数の上限値６０７が登録されている。
(２)ストリップマイニング指示解析処理(Ｓ１０２)
ストリップマイニング指示解析処理Ｓ１０２の詳細な処理のフローチャートを図８に示す。ここでは、コンパイラ２０８は、中間コード２０９内の基本ブロックを、先頭基本ブロックから順番に処理対象基本ブロックとしていくこととする。
【００２６】
コンパイラ２０８は、中間コード２０９に未処理の基本ブロックが残されているか否かをチェックし(Ｓ８０１)、中間コード２０９に未処理の基本ブロックが存在していなければ、ストリップマイニング変換処理(Ｓ１０３)を実行する。一方、中間コード２０９に未処理の基本ブロックが存在していたら、コンパイラ２０８は、前回の処理対象ブロックのつぎの基本ブロックを処理対象基本ブロックとして中間コード２０９から取り出し(Ｓ８０２)、この処理対象基本ブロックにstart指示文が含まれているか否かを調べる(Ｓ８０３)。
【００２７】
その結果、処理対象基本ブロックにstart指示文が含まれていなかった場合には、コンパイラ２０８は、Ｓ８０１以降の処理を再度実行する。
【００２８】
また、処理対象基本ブロックにstart指示文が含まれていた場合には、コンパイラ２０８は、処理対象基本ブロックと等価な基本ブロックを後方に向かって順に辿って、処理対象基本ブロックのstart指示文と対になるend指示文を検索する(Ｓ８０４)。ここで、処理対象基本ブロックＡと等価な基本ブロックＢとは、中間コードの入口から基本ブロックＢに至る全パスが処理対象基本ブロックＡを通り、かつ、処理対象基本ブロックＡから中間コード出口に至る全パスが基本ブロックＢを通る、という条件を満たす基本ブロックのことである。
【００２９】
さて、処理対象基本ブロックのstart指示文と対になるend指示文が得られたら、コンパイラ２０８は、さらに、以下の処理を実行する。
【００３０】
まず、コンパイラ２０８は、ストリップマイニング登録表２１１に新たなエントリを追加する。このとき、ストリップマイニング表が存在していなければ、コンパイラ２０６は、ストリップマイニング表を生成する。ストリップマイニング表のエントリには、図７に示すように、エントリ番号が登録されるフィールド７０１、start指示文を含む基本ブロックの識別情報が登録されるフィールド７０２、end指示文を含む基本ブロックの識別情報が登録されるフィールド７０３、ストリップマイニング適用範囲に含まれるループの識別情報が登録されるフィールド７０４、start指示文のパラメータ値(ブロックサイズ)が登録されるフィールド７０５が含まれている。
【００３１】
つぎに、コンパイラ２０８は、ストリップマイニング表の新たなエントリのフィールド７０１〜７０３,７０５に、新たなエントリ番号、処理対象基本ブロックの識別情報、Ｓ８０４で得られたend指示文を含む基本ブロックの識別情報、処理対象基本ブロックのstart指示文のパラメータ値(ブロックサイズ)を登録する(Ｓ８０５)。
【００３２】
つぎに、コンパイラ２０８は、処理対象基本ブロックと、Ｓ８０４で得られたend指示文を含む基本ブロックとの間の基本ブロックのうち、ループヘッダブロックであるか否かのチェック対象となっていない基本ブロックを１つ抽出し(Ｓ８０６)、その基本ブロックの識別情報が、ループ表２１０にループヘッダ情報として登録されているか否か、すなわち、その基本ブロックがループヘッダブロックであるか否かをチェックする(Ｓ８０７)。
【００３３】
その結果、Ｓ８０６で抽出した基本ブロックの識別情報がループ表２１０にループヘッダ情報として登録されていなければ、コンパイラ２０８は、処理対象基本ブロックと、Ｓ８０４で得られたend指示文を含むとの間に、ループヘッダブロックであるか否かのチェック対象となっていない基本ブロックが存在しているか否かをチェックする(Ｓ８１２)。コンパイラ２０８は、そのような基本ブロックが存在していれば、その基本ブロックがループヘッダブロックであるか否かをチェックするため、Ｓ８０６以降の処理を再度実行し、その反対に、そのような基本ブロックが存在していなければ、次のstart指示文を探すため、Ｓ８０１以降の処理を再度実行する。
【００３４】
一方、Ｓ８０６で抽出した基本ブロックの識別情報がループ表２１０にループヘッダ情報として登録されていれば、コンパイラ２０８は、そのループヘッダ情報に対応付けられたループレベル情報をループ表２１０から読み出し、そのループレベル情報が、ストリップマイニング対象ループのループレベルとして予め定められ値(以下、ストリップマイニング対象レベルと呼ぶ)を示しているか否かをチェックする(Ｓ８０８)。例えば、ストリップマイニング対象レベルが「１」である場合には、ここで、コンパイラ２０８は、ループ表２１０から読み出したループレベル情報が「１」であるか否かをチェックする。
【００３５】
そして、ループ表２１０から読み出したループレベル情報がストリップマイニング対象レベルを示していない場合、すなわち、Ｓ８０６で抽出した基本ブロックをヘッダとするループのループレベルがストリップマイニング対象レベルではない場合には、コンパイラ２０８は、処理対象基本ブロックと、Ｓ８０４で得られたend指示文を含む基本ブロックとの間に、ループヘッダブロックであるか否かのチェック対象となっていない基本ブロックが存在しているか否かをチェックするため、Ｓ８１２以降の処理を実行する。
【００３６】
これとは反対に、ループ表２１０から読み出したループレベル情報がストリップマイニング対象レベルを示している場合、すなわち、Ｓ８０６で抽出した基本ブロックをヘッダとするループのループレベルがストリップマイニング対象レベルである場合には、コンパイラ２０８は、そのループが他のストリップマイニング適用条件を満たすか否かをチェックする(Ｓ８０９)。例えば、ストリップマイニング適用条件が「第１ループ制御変数の増分値＝１」である場合には、Ｓ８０６で抽出した基本ブロックの識別情報に対応付けられた増分値をループ表２１０から読み出し、その増分値が「第１ループ制御変数の増分値＝１」を満たしているか否かをチェックする。また、他のストリップマイニング対象ループとの依存条件、他のストリップマイニング対象ループとの第１ループ制御変数の初期値または上限値の一致等がストリップマイニング適用条件として定められている場合には、それらの条件を満たすか否かをチェックする。
【００３７】
その結果、Ｓ８０６で抽出した基本ブロックをヘッダとするループがストリップマイニング適用条件を満たしていない場合には、Ｓ８０３及びＳ８０４で得られたstart指示文及びend指示文で指定されたストップマイニング適用範囲にストリップマイニングを適用することができないため、コンパイラ２０８は、Ｓ８１０で新たに追加したエントリをストリップマイニング登録表２１１から削除してから(Ｓ８１０)、次のstart指示文を探すべく、Ｓ８０１以降の処理を再度実行する。
【００３８】
また、Ｓ８０６で抽出した基本ブロックをヘッダとするループがストリップマイニング適用条件を満たしている場合には、コンパイラ２０８は、Ｓ８０６で抽出した基本ブロックの識別情報に対応付けられたループ識別情報をループ表２１０から取り出して、そのループ識別情報を、Ｓ８０５でストリップマイニング登録表２１１に追加したエントリのフィールド７０４に登録してから(Ｓ８１１)、Ｓ８１２以降の処理を再度実行する。
【００３９】
このようなストリップマイニング指示解析処理Ｓ１０２において、図５の中間コードは、以下のように処理される。なお、ストリップマイニング対象ループのループレベルは「１」、ストリップマイニング適用条件は「第１ループ制御変数の増分値＝1」とする。
【００４０】
まず、Ｓ８０１〜Ｓ８０３の繰り返し処理によって、基本ブロックＢ０から順番に基本ブロック内のコード文が順次チェックされ、基本ブロックＢ２のチェックでstart指示文が見つけられる。つぎに、基本ブロックＢ２と等価な基本ブロックＢ３,Ｂ７，Ｂ１０内のコード文が順次チェックされ、その結果、基本ブロックＢ２のstart指示文に対応するend指示文が、基本ブロックＢ１０のチェックで見つけられる(Ｓ８０４)。つぎに、ストリップマイニング登録表２１１にエントリが追加され、このエントリのフィールド７０１〜７０３,７０５に、新たなエントリ番号「１」、start指示文を含む基本ブロックの識別情報「Ｂ２」、指示文を含む基本ブロックの識別情報「Ｂ１０」、start指示文内のパラメータ値(ブロックサイズ)「１００」が登録される(Ｓ８０４)。
【００４１】
その後、Ｓ８０６〜Ｓ８１２の繰り返し処理によって、基本ブロックＢ２,Ｂ１０間の基本ブロックＢ３〜Ｂ９のうち、まず、基本ブロックＢ５をヘッダとするループが、ストリップマイニング適用条件を満たすストリップマイニング対象ループであると判定され、このループの識別情報「ループ１」が、ストリップマイニング登録表２１１に追加されたエントリのフィールド７０４に登録される。つぎに、基本ブロックＢ８をヘッダとするループが、ストリップマイニング適用条件を満たすストリップマイニング対象ループであると判定され、このループの識別情報「ループ２」が、ストリップマイニング登録表２１１に追加されたエントリのフィールド７０４に追加登録される。
【００４２】
図５の中間コードにはストリップマイニング指示文が１組しか含まれていないため、Ｓ８０１〜Ｓ８０２の繰返し処理が実行された後、ストリップマイニング指示解析処理Ｓ１０２は終了して、ストリップマイニング変換処理(Ｓ１０３)が実行される。
(３)ストリップマイニング変換処理(Ｓ１０３)
ストリップマイニング変換処理Ｓ１０３の詳細な処理のフローチャートを図９に示す。ここでは、コンパイラ２０８は、ストリップマイニング登録表２１１内のエントリを、エントリ番号の順番に処理対象エントリとしていくこととする。
【００４３】
コンパイラ２０８は、ストリップマイニング登録表２１１に未処理エントリがあるか否かをチェックし、未処理エントリが存在していなければ、レジスタ割付処理(Ｓ３０３)を実行する。
【００４４】
一方、未処理エントリを存在していたら、コンパイラ２０８は、前回の処理対象エントリのつぎのエントリを、処理対象エントリとしてストリップマイニング登録表２１１から取り出す(Ｓ９０１)。その後、コンパイラ２０８は、処理対象エントリのフィールド７０４に登録されているループ識別情報に対応する初期値をループ表２１０から取り出し、その初期値をループ制御変数(以下、第２ループ制御変数ｋ)に代入する、第２ループ制御変数ｋの初期化文「ｋ＝初期値」を生成する。ここで、処理対象エントリのフィールド７０４に複数のループ識別情報が登録されている場合には、コンパイラ２０８は、各ループ識別情報に対応付けられた初期値をそれぞれループ表２１０から取り出し、それらの初期値のなかの最小値を第２ループ制御変数ｋに代入する、第２ループ制御変数ｋの初期化文を生成する。このようにして生成した、第２ループ制御変数ｋの初期化文を、コンパイラ２０８は、処理対象エントリのフィールド７０２に登録されているブロック識別情報が示す基本ブロックの直前の先行基本ブロック内に挿入する(Ｓ９０２)。
【００４５】
さらに、コンパイラ２０８は、処理対象エントリのフィールド７０４に登録されているループ識別情報に対応付けられた上限値をループ表２１０から取り出し、第２ループ制御変数ｋがその上限値以下であることを条件とするループ判定文「ｉｆ(ｋ＜＝上限値)」を生成する。ここで、処理対象エントリのフィールド７０４に複数のループ識別情報が登録されている場合には、コンパイラ２０８は、各ループ識別情報に対応付けられた上限値をそれぞれループ表２１０から取り出し、ループ制御変数ｋが、それらの上限値のなかの最大値以下であることを条件とするループ判定文を生成する。コンパイラ２０８は、処理対象エントリのフィールド７０２に登録されているループ識別情報が示す基本ブロック内のstart指示文を、このようにして生成したループ判定文で置換する(Ｓ９０３)。
【００４６】
つぎに、コンパイラ２０８は、処理対象エントリのフィールド７０５に登録されているブロックサイズ(Ｂとする)で第２ループ制御変数ｋをインクリメントする、第２ループ制御変数ｋの更新文「ｋ＝ｋ＋Ｂ」を生成し、処理対象エントリのフィールド７０３に登録されているループ識別情報が示す基本ブロック内のend指示文を、この更新文で置換する(Ｓ９０４)。
【００４７】
そして、コンパイラ２０８は、end指示文が制御変数ｋの更新文で置換された基本ブロックから、start指示文がループ判定文で置換されたブロックへと、ループバックエッジを張り(Ｓ９０５)、さらに、end指示文が制御変数ｋの更新文で置換された基本ブロックから、start指示文がループ判定文で置換されたブロックの直後の後続基本ブロックへと、ループ出口エッジを張る(Ｓ９０６)。
【００４８】
以上の処理によって、処理対象エントリのフィールド７０４に登録されているループ識別情報が示すループを取り囲む外側ループの中間コードが生成される。
【００４９】
その後、コンパイラ２０８は、処理対象エントリのフィールド７０４に登録されているループ識別情報が示すループを順次変換する。
【００５０】
具体的には、コンパイラ２０８は、処理対象エントリのフィールド７０４に登録されているすべてのループ識別情報が示すループの変換処理が行われた否かをチェックし(Ｓ９０７)、変換処理が行われていないループが存在していなければ、次の処理対象エントリをストリップマイニング登録表２１１から見つけるべくＳ９０１以降の処理を再度実行し、変換処理が行われていないループが１または複数存在していれば、そのようなループの１つを変換対象として以下の処理を実行する。
【００５１】
コンパイラ２０８は、変換対象の第１ループ制御変数の初期化文をループ表２１０から取り出し、その初期化文と一致する文を含む基本ブロックを、変換対象のループヘッダブロックの先行基本ブロックから探す。その結果得られた基本ブロックに含まれている、変換対象の第１ループ制御変数の初期化文中の初期値(Ｌとする)を、引数の最大値を返す関数「ｍａｘ(Ｌ,ｋ)」の出力値で置換し(Ｓ９０８)、変換対象のループヘッダブロックに含まれている、変換対象のループ判定文中のループ制御変数上限値(Ｎとする)を、引数の最小値を返す関数「ｍｉｎ(ｋ＋Ｂ−１,Ｎ)」の出力値で置換する(Ｓ９０９)。その後、コンパイラ２０８は、つぎの変換対象を見つけるべく、Ｓ９０１以降の処理を再度実行する。
【００５２】
このようなストリップマイニング変換処理Ｓ１０２によって、図５の中間コードは、ストリップマイニング登録表２１１及びループ表２１０に基づき、以下のように処理される。
【００５３】
まず、Ｓ９０１〜Ｓ９０６において、図５の中間コードが以下のように処理される。
【００５４】
２つのループ(ループ１、ループ２)の制御変数初期値「１」「１」のうちの最小値「１」を第２ループ制御変数ｋに代入する、第２ループ制御変数ｋの初期化文「ｋ＝１」が生成され、この初期化文「ｋ＝１」が、start指示文ブロックＢ２の直前の先行基本ブロックＢ１内に挿入される(Ｓ９０１〜９０２)。つぎに、２つのループ(ループ１、ループ２)の第１ループ制御変数の上限値(「Ｎ」「Ｎ」)の最大値「Ｎ」が第２ループ制御変数ｋの上限値であることを条件とするループ判定文「ｉｆ(ｋ＜＝Ｎ)」で、基本ブロックＢ２内のstart指示文が置換され、第２ループ制御変数ｋをブロックサイズでインクリメントする更新文「ｋ＝ｋ＋１００」で、基本ブロックＢ１０内のend指示文が置換される(Ｓ９０３〜Ｓ９０４)。さらに、基本ブロックＢ１０から基本ブロックＢ２へとループバックエッジが張られ、基本ブロックＢ２から基本ブロックＢ１１へとエッジが張られる(Ｓ９０５〜Ｓ９０６)。
【００５５】
つぎに、Ｓ９０７〜Ｓ９０９の繰り返し処理により、中間コードが以下のように処理される。
【００５６】
２つのループ(ループ１、ループ２)のうち、一方のループ(ループ１)が変換対象とされて、この変換対象の制御変数の初期化文「ｉ＝１」及びループ判定文「ｉｆ(ｉ＜＝Ｎ)」がそれぞれ「ｉ＝ｋ」及び「ｉｆ(ｉ<＝ｍａｘ(ｋ＋99,Ｎ))」で置換される(Ｓ９０８〜Ｓ９０９)。さらに、他方のループ(ループ２)を変換対象されて同様な処理が実行される。このようにして変換した中間コードを図１０に示し、この中間コードのソースイメージを図４（ｂ）に示す。
【００５７】
このように、本実施の形態に係るストリップマイニング最適化処理Ｓ３０２によれば、コンパイラは、ソースプログラムに挿入されているストリップマイニング指示文が示すストリップマイニング適用範囲に含まれている複数のループを、ソースプログラム内のストリップマイニング指示文で指定されたブロックサイズでストリップマインする。このため、ユーザは、ストリップマイニング対象とすべき複数のループを含むストリップマイニング適用範囲とストリップマイニングに用いるべきブロックサイズとを示すストリップマイニング指示文をソースプログラムに挿入しておくことにより、コンパイラに、ユーザの意図通りのストリップマイニング処理を効率的に実行させることができる。
【００５８】
また、最適なブロックサイズを見つけるためのプログラムチューニングを行う場合、実行対象マシンに応じてブロックサイズを変更する場合等には、ソースプログラム内のストリップマイニング指示文だけを修正すればよいので、ユーザによるプログラム修正の作業負担が軽減される。
【００５９】
以上においては、ストリップマイニング指示文で指定されたブロックサイズと、予め定められたストリップマイニング対象レベルとを用いてストリップマイニング最適化処理を実行するようにしているが、必ずしも、このようにする必要なない。
【００６０】
例えば、図１３に示すように、コンパイラの起動コマンド１３００のオプションでストリップマイニング対象レベル及びブロックサイズを指定できるようにしてもよい。図１３においては、コンパイラの起動コマンドに続く−Ｏオプションで、ブロックサイズ「１００」１３０１、ストリップマイニング対象レベル「２」１３０２が指定されている。このような起動コマンドを用いる場合には、コンパイラ２０８は、オプションで指定されたブロックサイズ及びストリップマイニング対象レベルを用いて上述のストリップマイニング最適化処理を実行する必要がある。
【００６１】
図１３には、コマンドオプションでブロックサイズ及びストリップマイニング対象レベルの双方を指定する場合におけるコマンドライン入力例を示したが、ブロックサイズ及びストリップマイニング対象レベルのいずれか一方をコマンドオプションで指定するようにしてもよい。例えば、ストリップマイニング指示文にブロックサイズの指定が含められており、コマンドオプションでストリップマイニング対象レベルのみが指定された場合には、コンパイラ２０８は、ストリップマイニング指示文で指定されたブロックサイズ及びコマンドオプションで指定されたストリップマイニング対象レベルを用いて上述のストリップマイニング最適化処理を実行すればよい。また、予めストリップマイニング対象レベルが定められており、コマンドオプションでブロックサイズのみが指定された場合には、コンパイラ２０８は、予め定められたストリップマイニング対象レベル及びコマンドオプションで指定されたブロックサイズを用いて上述のストリップマイニング最適化処理を実行すればよい。
【００６２】
また、start指示文によってブロックサイズ及びストリップマイニング対象レベルの双方を指定できるようにしてもよい。図１１(ａ)に、ブロックサイズ及びストリップマイニング対象レベルを引数とするstart指示文が記述されたソースプログラムの例を示す。
【００６３】
このソースプログラムには２つの二重ループが含まれている。そして、ブロックサイズ「１００」及びストリップマイニング対象レベル「２」を第１引数及び第２引数とするstart指示文４０１ａが記述されている。このようなstart指示文が記述されたソースプログラムがコンパイル対象として指定された場合には、コンパイラ２０８は、start指示文４０１ａの第１及び第２引数で指定されたブロックサイズ「１００」及びストリップマイニング対象レベル「２」を用いて上述のストリップマイニング最適化処理を実行する必要がある。例えば図１１(ａ)のソースプログラムをコンパイルした場合には、２つの二重ループの外側ループ１,３(ループレベル「２」)がブロックサイズ「１００」でストリップマインされ、その結果、図１１(ｂ)に示すようなソースイメージで表される中間コードが生成される。
【００６４】
なお、図１１には、ブロックサイズ及びストリップマイニング対象レベルを引数とするstart指示文が記述されたソースプログラムの例を示したが、ストリップマイニング対象レベルのみを引数としてstart指示文に与えておき、ブロックサイズは、コマンドオプションで指定するようにしてもよい。
【００６５】
また、以上においては、コンパイラ２０８が、ループヘッダブロックのループレベルに基づきストリップマイニング対象ループを抽出しているが、必ずしも、このようにする必要はない。例えば、以下に示すように、ストリップマイニング対象ループを指定する指示文でソースプログラムに記述しておくようにしてもよい。
【００６６】
図１２(ａ)に、そのようなソースプログラムの記述例を示す。このソースプログラムには、２つの二重ループが含まれている。さらに、ストリップマイニング対象ループを指定する指示文「*option STRIPMINE_LOOP」１２０２,１２０３が記述されている。これらの指示文１２０２,１２０３は、各二重ループに含まれるループのうちの、ストリップマイニング対象ループとなるループ２,３の直前に記述されている。このようなソースプログラムをコンパイル対象とする場合には、コンパイラ２０８は、ループヘッダブロックのループレベルがストリップマイニング対象レベルであるか否かの判定を行う代わりに、Ｓ８０９において、ループヘッダブロック直前の先行基本ブロックにプ指示文「*option STRIPMINE_LOOP」が含まれているか否かを判定することによって、ストリップマイニング対象ループとなるループヘッダブロックを抽出する必要がある。例えば図１２(ａ)のソースプログラムをコンパイルした場合、一方の二重ループの内側ループ２(ループレベル「１」)及び他方の二重ループの外側ループ３(ループレベル「２」)がブロックサイズ「１００」でストリップマインされ、その結果、図１１(ｂ)に示すようなソースイメージで表される中間コードが生成される。
【００６７】
なお、指示文「*option STRIPMINE_LOOP」によるストリップマイニング対象ループ指定と、ストリップマイニング対象レベルを用いたストリップマイニング対象ループ決定とを併用することも可能である。具体的には、ストリップマイニング適用範囲に指示文「*option STRIPMINE_LOOP」が含まれていれば、その指示文によって指定されたループをストリップマイニング対象ループとしてストリップマイニング最適化処理Ｓ３０２が実行され、ストリップマイニング適用範囲に指示文「*option STRIPMINE_LOOP」が含まれていなければ、ストリップマイニング対象レベルのループをストリップマイニング対象ループとしてストリップマイニング最適化処理Ｓ３０２が実行されるようにしてもよい。
【００６８】
以上、コンパイラへの適用例を挙げて説明したが、本発明は、ループを最適化する処理を実行する他のプログラム(例えば、トランスレータ)にも適用可能である。
【図面の簡単な説明】
【００６９】
【図１】本発明の実施の一形態に係るストリップマイニング最適化処理のフローチャートである。
【図２】本発明の実施の一形態に係るコンパイラが実装される計算機システムの構成例を示した図である。
【図３】本発明の実施の一形態に係るコンパイラが実行するコンパイル処理のフローチャートである。
【図４】(ａ)は、本発明の実施の一形態に係るコンパイラのコンパイル対象となるソースプログラムの記述例を示した図であり、(ｂ)は、そのソースプログラムのコンパイルにより生成されたオブジェクトプログラムのイメージを示した図である。
【図５】図４(ａ)のソースプログラムから生成された中間コードの一例を示した図である。
【図６】本発明の実施の一形態に係るループ表のデータ構造を概念的に示した図である。
【図７】本発明の実施の一形態に係るストリップマイニング登録表のデータ構造を概念的に示した図である。
【図８】図１のストリップマイニング指示解析処理Ｓ１０２で実行される処理のフローチャートである。
【図９】図１のストリップマイニング変換処理Ｓ１０３で実行される処理のフローチャートである。
【図１０】ストリップマイニング変換処理後の中間コードの例を示した図である。
【図１１】ストリップマイニング指示文を含むソースプログラムの記述例を示した図である。
【図１２】ストリップマイニング指示文を含むソースプログラムの記述例を示した図である。
【図１３】コマンドラインへの入力例を示した図である。
【符号の説明】
【００７０】
２００…情報処理装置、２０１…ＣＰＵ、２０３…入力装置、２０４…主記憶装置、２０５…外部記憶装置、２０６…ソースプログラム、２０７…オブジェクトプログラム、２０８…コンパイラ、２０９…中間コード、２１０…ループ表、２１１…ストリップマイニング登録表、２１２…入出力インタフェース、４０１,４０２,４０１Ａ…ストリップマイニング指示文、１２０２,１２０３…指示文
【図１】
0004719415.tif 000002
【図２】
0004719415.tif 000003
【図３】
0004719415.tif 000004
【図４】
0004719415.tif 000005
【図５】
0004719415.tif 000006
【図６】
0004719415.tif 000007
【図７】
0004719415.tif 000008
【図８】
0004719415.tif 000009
【図９】
0004719415.tif 000010
【図１０】
0004719415.tif 000011
【図１１】
0004719415.tif 000012
【図１２】
0004719415.tif 000013
【図１３】
0004719415.tif 000014