JP3551352B2 - Loop splitting method - Google Patents
Loop splitting method Download PDFInfo
- Publication number
- JP3551352B2 JP3551352B2 JP00058598A JP58598A JP3551352B2 JP 3551352 B2 JP3551352 B2 JP 3551352B2 JP 00058598 A JP00058598 A JP 00058598A JP 58598 A JP58598 A JP 58598A JP 3551352 B2 JP3551352 B2 JP 3551352B2
- Authority
- JP
- Japan
- Prior art keywords
- procedure
- optimizable
- statement
- loop
- copy
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Lifetime
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
Description
【0001】
【発明の属する技術分野】
本発明は、計算機用プログラムを実行可能なプログラムに変換する最適化コンパイラに関し、特に、手続き呼び出しを有するループのループボディを、複数のループボディに分割して複数のループを作成するループ分割方法に関する。
【0002】
【従来の技術】
従来、ループ実行高速化を促進するため、種々のループ構造変換法が利用されている。その中の1つにループ分割(loop distribution)がある。ループ分割とは、ループ制御変数を除くループ内変数の定義(変数に値を代入すること)・使用(変数の値を使用すること)の順序関係を保ったまま、1つのループのループボディを複数のループボディに分割して、複数のループを作成する方法である。
これにより、元のループでは不可能だった並列化やベクトル化などの最適化が一部の分割ループでは可能になり、ループ実行性能が向上する場合がある。
最初に、本明細書で用いる用語を説明する。変数の定義・使用の順序関係を依存、定義と使用をまとめて参照と呼ぶ。また、ループの繰り返しに跨った依存
(ある繰り返しで変数を参照し、次回以降の繰り返しで同じ変数を参照する依存)をループ運搬依存、跨らない依存をループ独立依存、定義の後に使用が来る依存をフロー依存、使用の後に定義が来る依存を逆依存、定義の後に定義が来る依存を出力依存と呼ぶ。ループの繰り返しに跨って存在するフロー依存をループ運搬フロー依存、ループの繰り返しに跨らずに存在するフロー依存をループ独立フロー依存、ループの繰り返しに跨らずに存在する逆依存をループ独立逆依存、ループの繰り返しに跨らずに存在する出力依存をループ独立出力依存と呼ぶ。特定の依存関係を持つ変数を含む文をその依存関係がある文、文 A で参照された変数が文Bで参照される場合の依存関係を文 A から文 B への依存、特定の依存関係がある文を含むループをその依存関係があるループと呼ぶ。また、依存サイクルとは、文間の依存関係を文 A から文 B、文 B から文 C とたどっていくと、最終的に出発点の文 A に戻ってくる場合の依存のことを指す。
【0003】
まず、ループ分割方法について述べる。ループ分割は、1つの依存サイクルに含まれる文を同じ分割ループに割り当てるよう、元のループを分割する。依存サイクルがある文とない文を別々の分割ループに割り当てることにより、各々の依存関係に応じた最適化を、別々に各分割ループに適用することができる。
次に、ループ中に手続き呼び出し文がある場合のループ分割方法について述べる。手続きに跨って依存関係を調べる手続き間依存解析を行なうと、呼び出し元手続きと呼び出し先手続きの間の依存関係がわかる。ループ中で、呼び出し元手続きと呼び出し先手続きの間に依存サイクルがあった場合、手続き呼び出し文は依存サイクルに含まれると解釈して、前記のループ分割を行なう方法もある。
しかし、この方法は呼び出し先手続きにある依存サイクルに含まれない文も依存サイクルに含まれると拡大解釈してしまう。このような拡大解釈を行なわない方法として、ループ分割の前処理としてインライン展開を行なう方法がある。インライン展開とは、手続き呼び出し文を手続き本体に置き換える処理である。これにより拡大解釈せずに文毎に依存を評価できるようになり、また呼び出し先手続きの文を別々の分割ループに割り当てることが可能になる。
【0004】
例としてループ 1 を考える。 S1 〜 S4,SC は文番号である。
ループ 1 内に現れる文には、次のような依存関係がある。
−依存関係 (a) 文 S1 から文 S2 へ、配列 A に関するループ独立フロー依存
−依存関係 (b) 文 S2 から文 S1 へ、配列 B に関するループ運搬フロー依存
−依存関係 (c) 文 S2 から文 S4 へ、配列 B に関するループ独立フロー依存
−依存関係 (d) 文 S3 から文 S4 へ、配列 D に関するループ独立逆依存
依存関係 (a),(b)から、ループ 1 では文 S1,S2 が依存サイクルを構成していることがわかる。
【0005】
一時変数は、手続き呼び出しの実引数と仮引数の対応関係や、呼び出し元手続きと呼び出し先手続きに同名の別変数がある場合、仮引数やローカル変数に別名関係(複数の変数が同じメモリアドレスを指していること)がある場合の変数間の対応関係を保証するために必要である。実引数と仮引数との間の対応を、一時変数を用いてではなくレジスタ渡しで行なう方法もある。しかし、引数の数が多ければレジスタが足りなくなり、一時変数を使わなければならない。更に、実引数と仮引数の間で配列形状が異なった場合、例えば、実引数で2次元配列だが仮引数では1次元配列として受け取るような場合には、レジスタ渡しは適用できず、一時変数を用いた計算が必要となる。
手続き sub1 を手続き呼び出し文 Sc に関してインライン展開すると、下記
のループ 1a が生成される。 tmpA,tmpB,tmpC はインライン展開のためにコンパイラが生成した一時変数である。また、文 S2,S3 は一時変数を用いた文 S2’,S3’に変換された。 S1,S4,S2’,S3’,ST1 〜 ST6 は文番号である。
【0006】
このループ 1a に現れる依存関係は以下の通りである。
−依存関係(1) 文 S1 から文 ST1 へ、 配列 A に関するループ独立フロー依存
−依存関係(2) 文 ST1 から文 ST5 へ、配列 A に関するループ独立逆依存
−依存関係(3) 文 S1 から文 ST5 へ、 配列 A に関するループ独立出力依存
−依存関係(4)文ST1から文S2’へ、配列 tmpA に関するループ独立フロー依存
−依存関係(5)文ST1から文ST5へ、配列 tmpA に関するループ独立フロー依存
−依存関係(6)文ST2から文ST6へ、配列 B に関するループ独立逆依存
−依存関係(7)文ST6から文S1へ、配列 B に関するループ運搬フロー依存
−依存関係(8)文ST6から文S4へ、配列 B に関するループ独立フロー依存
−依存関係(9)文ST2から文S2’へ、配列 tmpB に関するループ独立出力依存
−依存関係(10)文S2’から文ST6へ、配列 tmpB に関するループ独立フロー依存
−依存関係(11)文ST3から文ST7へ、配列 C に関するループ独立逆依存
−依存関係(12)文ST3から文S3’へ、配列 tmpC に関するループ独立出力依存
−依存関係(13)文S3’から文ST7へ、配列 tmpC に関するループ独立フロー依存
−依存関係(14)文ST4から文ST8へ、配列 D に関するループ独立逆依存
−依存関係(15)文ST8から文S4へ、配列 D に関するループ独立出力依存
−依存関係(16)文ST4から文S3’へ、配列 tmpD に関するループ独立フロー依存
−依存関係(17)文ST4から文ST8へ、配列 tmpD に関するループ独立フロー依存
【0007】
依存関係 (1),(4),(7),(10) により、ループ 1a では文 S1,ST1,S2’,ST6 が依存サイクルを構成していることがわかる。次に、依存関係を保ったまま、依存サイクルを持つ文と持たない文をできるだけまとまめるように、ループボディ中の文の順番を入れ換ると、次のようなループ 1a’ になる。
【0008】
更に、ループ 1a’ にループ分割を適用すると、次のようなループ 1aa,1abが生成される。
【0009】
このループ分割の結果、文 S1,S2’ を分割ループ 1aa に、文 S4, 文 S3’ を分割ループ 1ab に割り当てることになった。
更に、分割後のループを最適化することを考える。分割前のループがある依存を持つために最適化できなかった場合でも、分割後のループの中にはその依存をもたないものがありうるので、その依存を持たないループに対して最適化を適用することができる。例えば、最適化として並列化やベクトル化を例に挙げる。ループが並列化できる条件はループ中にループ運搬フロー依存がないことであり、ループがベクトル化できる条件はループ中に依存サイクルがないことである。
分割前のループ1はどちらの条件も満たさないため、並列化もベクトル化もできなかった。
しかし、分割後のループ 1ab はループ運搬フロー依存も依存サイクルも持たないので、並列化もベクトル化も可能である。
このようなループ分割やインライン展開は公知技術であり、例えば
Michael Wolfe(1996) ”High Performance Compilers for Parallel Computing”,Addison−Wesley Publishing Company, pp.323−pp.330、 pp.360−pp.361 で述べられている。
【0010】
【発明が解決しようとする課題】
上記従来技術は、そのインライン展開において、多数の一時変数を必要とする。
そのため、ループ分割して一部の分割ループに最適化を適用しても、一時変数の計算に時間がかかって性能がでないという問題点があった。
例えば、従来技術において、ループ 1 で手続き sub1 をインライン展開したループ 1a では、一時変数 tmpA,tmpB,tmpC を用いた ST1 〜 ST8という新たな8文が生成された。インライン展開前にはループ中には ST1 〜 ST4 の 4 文しかなかったが、インライン展開後には 12 文となり、文数が 3 倍になった。手続き呼び出しにかかる時間とループ制御にかかる時間を無視できると仮定すると、ループの実行時間は、
となる。 Tstmtavは 1文の平均実行時間、Nはループ繰り返し回数である。
【0011】
仮に、並列化やベクトル化等の最適化でループ 1ab の実行時間がループ 1aaの実行時間に比べて非常に短くなり、
とみなせるようになったとしても、ループ1aa+ループ1abの実行時間はループ 1の実行時間の5/4倍ある。この例の場合は、ループ分割して最適化を行なったならば、逆に性能が悪化してしまった。
本発明の目的は、上記問題を解決し、最適化を促進するために、手続き呼び出しを含むループを、前処理としてインライン展開を行なわずにループ分割し、ループ中から呼び出される呼び出し先手続き内の文のうち、最適化可能文を最適化可能ループに、最適化不能文を最適化不能ループに割り当てることを可能とするループ分割方法を提供することにある。
本発明の他の目的は、ループの実行時間を短縮するプログラムまたはオブジェクトコードを出力することが可能なループ分割方法を提供することにある。
【0012】
【課題を解決するための手段】
上記課題を解決するため、本発明のループ分割方法は、
(a)該ループに関して手続き間依存解析を行なう処理と、
(b)該ループを、複数の最適化可能分割ループと複数の最適化不能分割ループに分割する処理と、
(c)該最適化不能分割ループ中の文を調べて最適化可能な最適化可能文を検出する処理と、
(d)以下の3種の手続き(d.1)該最適化不能分割ループから直接呼び出される直接呼び出し手続き、(d.2)該最適化可能文を持つ最適化可能手続き、(d.3)該コールグラフ上で該直接呼び出し手続きからエッジをたどって該最適化可能手続きに至る間に現れる手続きである中間手続き、をコピー対象手続きとする処理と、
(e)該最適化不能分割ループ中の該最適化可能文に、該最適化不能文から該最適化可能文への依存を持たない前方最適化可能文がある場合は、(e.1)該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、前方直接呼び出しコピー手続 き、前方最適化可能コピー手続き、前方中間コピー手続きを作成し、(e.2) 該最適化不能分割ループの直前にある該最適化可能分割ループの最後に、該前方直接呼び出しコピー手続きの手続き呼び出し文を挿入し、(e.3)該前方直接呼び出しコピー手続きを調べ、手続き呼び出し文があれば呼び出し先手続きを再帰的に調べ、該コピー対象手続きの手続き呼び出し文があれば該前方中間コピー手続きまたは該前方最適化可能コピー手続きの手続き呼び出し文に変更し、(e.4)該前方最適化可能文以外かつ該手続き呼び出し文以外の文を、該前方直接呼び出しコピー手続き、該前方最適化可能コピー手続き、該前方中間コピー手続きから削除する処理と、
【0013】
(f)該最適化不能分割ループ中の該最適化可能文に、該最適化可能文から該最適化不能文への依存を持たない後方最適化可能文がある場合は、(f.1) 該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、後方直接呼び出しコピー手続き、後方最適化可能コピー手続き、後方中間コピー手続きを作成し、(f.2) 該最適化不能分割ループの直後にある該最適化可能分割ループの先頭に、該後方直接呼び出しコピー手続きの手続き呼び出し文を挿入し、(f.3)該後方直接呼び出しコピー手続きを調べ、手続き呼び出し文があれば呼び出し先手続きを再帰的に調べ、該コピー対象手続きの手続き呼び出し文があれば該後方中間コピー手続きまたは該後方最適化可能コピー手続きの手続き呼び出し文に変更し、(f.4) 該後方最適化可能文以外かつ該手続き呼び出し文以外の文を、該後方直接呼び出しコピー手続き、該後方最適化可能コピー手続き、該後方中間コピー手続きから削除する処理と、
(g) (g.1)該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、オリジナル直接呼び出しコピー手続き、オリジナル最適化可能コピー手続き、オリジナル中間コピー手続きを作成し、(g.2)該最適化不能分割ループ中の該直接呼び出し手続きの手続き呼び出し文を該オリジナル直接呼び出しコピー手続きの手続き呼び出し文に置換し、(g.3)該オリジナル直接呼び出しコピー手続きを調べ、手続き呼び出し文があれば呼び出し先手続きを再帰的に調べ、該コピー対象手続きの手続き呼び出し文があれば該オリジナル中間コピー手続きまたは該オリジナル最適化可能コピー手続きの手続き呼び出し文に置換し、(g.4)該最適化可能文を、該オリジナル直接呼び出しコピー手続き、該オリジナル最適化可能コピー手続き、該オリジナル中間コピー手続きから削除する手段と、(h)該最適化可能分割ループを最適化する処理、とを有することを特徴とする。
【0014】
【発明の実施の形態】
以下、本発明の実施例を、図面により詳細に説明する。
まず、本発明の実施例について説明する前に、本発明が適用される逐次処理計算機の構成を説明する。
図13は、本発明の適用対象である逐次処理計算機の構成の一例を示す図である。
この逐次処理計算機50は、プロセッサ51、メモリ53、プロセッサ51とメモリ53を結合するバス52とから構成される。
この逐次処理計算機50は、図1に示すような最適化コンパイラの各ステップおよび入力プログラムをメモリ53に格納しておき、これをプロセッサ51が順次読み出して実行する。処理中に出力された中間データも、メモリ53に格納される。
図1は、本発明のループ分割方法を実行するコンパイラの構成を示す図である。
図1に示すように、コンパイラ10 は、構文解析部 11、ループ分割部 13、最適化部 15、コード生成部17から構成される。ここで、ループ分割部13が、本発明で新規に設置された処理手順であって、その他の部分は従来から設置されたものをそのまま利用できる。
構文解析部 11 は、入力プログラム 90 を読み込んで中間語 91 を生成する。中間語 91 はコンパイラ内部のプログラムの表現であり、その形式は通常のコンパイラの場合と特に変わらないので、ここでは詳細には述べない。
ループ分割部 13 は、構文解析部 11 の結果を利用して本発明のループ分割方法が適用可能なループを検出し、本ループ分割方法を適用してループ構造を変換する。ループ分割部 13 は、依存解析部 131、ループ分割解析変換部 132、文解析部 133、手続きコピー解析部 134、手続きコピー変換部 135、文変換部 136から構成される。依存解析部 131 の実行方法は、通常のコンパイラが手続きにまたがって依存解析を行なう手続き間依存解析の場合と特に変わらないので、ここでは詳細には述べない。ステップ132〜136の説明は後述する。
【0015】
図2は、図1におけるループ分割解析変換部132の実行方法を表したフローチャートである。
本変換部132 の実行方法は、ステップ 13201 〜 13210 から構成される。
ステップ 13201 では、依存解析部131の手続き間依存解析結果を用いて、ループ中から依存サイクルに含まれる文を見つける。
ステップ 13202 では、依存サイクルに含まれる文は依存サイクルに含まれる文同志で連続して並ぶように、また依存サイクルに含まれない文は依存サイクルに含まれない文同志で連続して並ぶように、依存関係を壊さない範囲でループ中の文の位置を移動して、それぞれをまとめる。
ステップ 13203 では、ループ中の文を先頭から出現順にたどり、ステップ
13204 で文が依存サイクル中に含まれるかを判定する。このとき、手続き呼び出し文があっても呼出先手続きの文はたどらない。もし文が依存サイクル中に含まれれば、ステップ 13207 を実行する。もし文が依存サイクル中に含まれていなければ、ステップ 13206 で次の 文が依存サイクル中に含まれているかどうか判定する。もし含まれていれば、ステップ 13205 で、文の直後でループを分割するようにループ分割点を設置する。もし含まれていなければ、ステップ 13207 を実行する。
【0016】
ステップ 13207 で、ループ中の最終文であると判定されたならば、ステップ13205 で設置した分割点を用いて、ス テップ 13208 でループ分割を行なう。最終文でなければ、ステップ 13203 に戻って、次の文に関して処理を続行する。ステップ 13209 では、ステップ 13208 で生成した分割ループが最適化が可能な最適化可能ループか、不可能な最適化不能ループかを判定する。分割ループを並列化する場合は、分割ループ中にループ運搬フロー依存が含まれていなければ最適化可能ループ、含まれていれば最適化不能ループと判定する。分割ループをベクトル化する場合は、分割ループ中に依存サイクルが含まれていなければ最適化可能ループ、含まれていれば最適化不能ループと判定する。
ステップ 13210 では、分割点の前後の分割ループを調べ、前後の分割ループとも最適化可能ループ同志または最適化不能ループ同志である場合には、その分割点でのループ分割をやめ、元に戻す。
以上で、図2を用いたループ分割解析変換部 132 の説明を終る。
【0017】
図3は、図1における文解析部 133 の実行方法を表したフローチャートである。
文解析部133の実行方法は、ステップ 13301 〜 13308 から構成される。
ステップ 13301 では、ループが最適化不能分割ループであるかを判定する。ループが最適化不能分割ループであった場合は、ステップ 13302 で、最適化不能分割ループ内の文を、手続き呼び出し文があれば呼び出し先手続き内の文も再帰的にたどる。ループが最適化不能分割ループでなかった場合には、ステップ13308 でループ中の文を最適化可能文とする。ループ中の手続き呼び出し文から呼び出される呼び出し先手続き内の文は、この手続き呼び出し文に関して最適化可能文とする。
ステップ 13303 では、文が手続き呼び出し文であるか否かを判定する。文が手続き呼び出し文であった場合は、ステップ 13302 へ戻って次の文に関して処理を続行する。文が手続き呼び出し文でなかった場合は、ステップ 13304 を実 行する。
ステップ 13304 では、文が最適化可能か否かを判定する。最適化として並列化を行なう場合の最適化可能な文の条件は、文がループ運搬フロー依存を持たないことである。最適化としてベクトル化を行なう場合の最適化可能な文の条件は、文が依存サイクルに含まれないことである。最適化可能であれば、ステップ 13305 でその文を最適化可能文とし、最適化可能でなければ、ステップ 13306 でその文を最適化不能文とする。
ステップ 13307 では、文が分割ループ中の最終文かどうか判定する。最終文であれば処理を終了し、最終文でなければ、ステップ 13302 へ戻って次の文に関して処理を続行する。
以上で、図3を用いた文解析部 133 の説明を終る。
【0018】
図4は、図1における手続きコピー解析部 134 の実行方法を表したフローチャートである。
手続きコピー解析部134の実行方法は、ステップ13400〜13412から構成される。
ステップ 13400 では、コールグラフを作成する。コールグラフとは、手続きをノードとし、呼び出し元手続きから呼出先手続きへエッジをつないで、手続き呼びだし関係を表した木状グラフのことである。コールグラフの作成方法は、通常のコンパイラがコールグラフを作成する場合と特に変わらないので、ここでは詳細には述べない。
ステップ 13401 では、最適化不能分割ループ内の文を、手続き呼び出し文があれば呼び出し先手続き内の文も再帰的にたどり、ステップ 13402 で今たどっている文である自文が最適化可能文かどうか判定する。もし自文が最適化可能文であれば、ステップ 13400 で作成したコールグラフを利用して直接呼び出し手続き、最適化可能手続き、中間手続きを見つけ、それらをコピー対象手続きとし、ステップ 13404 を実行する。もし自文が最適化可能文でなければ、ステップ 13412 を実行する。
ステップ 13404 では、自文と最適化不能分割ループ内の最適化不能文との間に依存関係があるか否かを判定する。もし、依存関係があれば、ステップ 13406を実行する。もし依存関係がなければ、ステップ 13405 を実行する。
【0019】
ステップ 13405 では、最適化不能分割ループ直前の分割ループと直後の分割ループとの粒度を比較する。なお、粒度とは、ここではループボディの実行コストであると定義する。具体的には、ループボディ中の文の数または命令の数で比較する。
直前の分割ループの粒度の方が小さかった場合は、ステップ13407を実行する。そうでない場合は、ステップ 13408 を実行する。
ステップ 13406 では、自文と最適化不能文との間に存在する依存が、自文から最適化不能文への依存のみかどうか判定する。もし、自文から最適化不能文への依存のみであった場合は、ステップ 13408 を実行する。もし、自文から最適化不能文への依存のみではなかった場合は、ステップ 13409 を実行する。
ステップ 13407 では、直接呼び出しコピー手続きの手続き呼び出し文の挿入位置を、直後の分割ループの先頭とする。
ステップ 13408 では、直接呼び出しコピー手続きの手続き呼び出し文の挿入位置を、直前の分割ループの最後とする。
ステップ 13409 では、自文と最適化不能文との間に存在する依存が、最適化不能文から自文への依存のみかどうかを判定する。もし、最適化不能文から自文への依存のみであった場合は、ステップ 13407 を実行する。もし、最適化不能文から自文への依存のみではなかった場合は、ステップ 13410 を実行する。
ステップ 13410 では、自文を最適化不能文と再設定する。
ステップ 13411 では、最適化不能分割ループ中およびコピー対象手続き中からコピー対象手続きを呼び出す手続き呼び出し文を、コピーした手続きであるコピー手続きの手続き呼び出し文への置換位置とする。
ステップ 13412 では、自文が最適化不能分割ループの最終文であると判定する。もし、最終文であれば処理を終了し、最終文でなければ、ステップ 13401 へ戻って次の文に関して処理を続行する。
以上で、図4を用いたコピー手続き解析部 134 の説明を終る。
【0020】
図5は、図1における手続きコピー変換部 135 の実行方法を表したフローチャートである。
手続きコピー変換部135の実行方法は、ステップ 13501 〜 13506 から構成される。
ステップ 13501 では、最適化不能分割ループ内の文を、手続き呼び出し文があれば呼び出し先手続き内の文も再 帰的にたどり、ステップ 13502 で今たどっている文が手続き呼び出し文かどうかを判定する。もし、手続き呼び出し文であれば、ステップ 13503 を実行する。手続き呼び出し文でなければ、ステップ 13501 に戻り、次の文に関して処理を続行する。
ステップ 13503 では、呼び出し先手続きがコピー対象手続きかどうか判定する。もしコピー対象手続きならば、ステップ 13504 を実行する。コピー対象手続きでなければ、ステップ 13501 に戻り、次の文に関して処理を続行する。
ステップ 13504 では、コピー対象手続きをコピーして、コピー手続きを作成する。作成するコピー手続きの数は、コピー手続きの手続き呼び出し文を挿入または置換する数と同一である。
ステップ 13505 では、文が最適化不能分割ループの最終文であるか判定する。
もし最終文であれば、ステップ 13506 を実行する。最終文でなければ、ステップ 13501 に戻り、次の文に関して処理を続行する。
ステップ 13506 では、コピー手続きの手続き呼び出し文の全ての挿入位置および置換位置に、コピー手続きの手続き呼び出し文を挿入または置換する。
以上で、図5を用いた手続きコピー変換部135の説明を終る。
【0021】
図6は、文変換部 136 の実行方法を表したフローチャートである。
文変換部136の実行方法は、ステップ 13601 〜 13609 から構成される。
ステップ 13601 では、分割ループ内の文を、手続き呼び出し文があれば呼び出し先手続き内の文も再帰的にたどり、ステップ 13602 で今たどっている文が最適化可能文かどうか判定する。もし最適化可能文ならば、ステップ 13603 を実行する。最適化可能文でなければ、ステップ 13604 を実行する。
ステップ 13603 では、分割ループが最適化可能分割ループかどうか判定する。
もし最適化可能分割ループならば、 ステップ 13607 を実行する。最適化可能分割ループでなければ、ステップ 13605 を実行する。
ステップ 13604 では、分割ループが最適化可能分割ループかどうかを判定する。もし、最適化可能分割ループならばステップ 13605 を実行する。最適化可能分割ループでなければ、ステップ 13607 を実行する。
ステップ 13605 では、文が手続き呼び出し文かどうかを判定する。もし手続き呼び出し文ならば、ステップ 13607 を 実行する。手続き呼び出し文でなければステップ 13606 を実行する。
ステップ 13606 では、文を削除し、ステップ 13601 に戻って削除した文の次の文に関して処理を続行する。
ステップ 13607 では、文が分割ループ中の最終文であるか否かを判定する。もし、最終文であれば、ステップ 13608 を実行する。最終文でなければ、ステップ 13601 に戻って次の文に関して処理を続行する。
ステップ 13608 では、コピー手続き内で参照されていない変数を、手続きの引数から削除する。
ステップ 13609 では、実行文を含まないコピー手続きとその手続き呼び出し文を削除する。
以上で、図6を用いたコピー手続き解析部 136 の説明を終る。
これで、ループ分割部 13 の説明を終る。
【0022】
最適化部 15 は、ループ分割部 13 の結果を利用してプログラムに対して並列化やベクトル化等の最適化変換を行なう。その構成は、通常の最適化コンパイラの場合と特に変わらないので、ここでは詳細には述べない。
コード生成部 17 は、中間語 91 を読み込んで出力プログラム 92 を生成する。これらの処理の内容は通常のコンパ イラの場合と特に変わらないので、ここでは詳細には述べない。
以上で、本発明によるループ分割方法の説明を終る。
【0023】
図7の入力プログラム 90 は、コンパイラ 10 のループ分割部 13 への中間語91 の入力のソースイメージの一例であり、 図8のプログラム 93 は、コンパイラ10 のループ分割解析変換部 132 の中間語 91 への出力のソースイメージの一例であり、図9のプログラム 94 は、コンパイラ 10 の手続きコピー変換部 135 の中間語 91 への出力のソースイメージの一例であり、 図10 のプログラム 95 は、コンパイラ10 の文変換部 136 の中間語 91 への出力のソースイメージの一例であり、図11のプログラム 96 は、コンパイラ 10 が最適化として並列化を行なった場合の、最適化部 15 からの中間語 91 への出力の ソースイメージの一例であり、図12のプログラム 97 は、コンパイラ 10 が最適化としてベクトル化をおこなった場合の、 最適化部 15 からの中間語 91 への出力のソースイメージの一例である。プログラム 90、 92 〜 97 を用いて、コンパ イラ10 によるループ分割の一例を説明する。
【0024】
図7の入力プログラム 90 で、図の左端にある番号は、理解を助けるために打った行番号である。図の 1 行目は、 整数型の変数 i, N の宣言文、図の 2 行目は、整数型の変数 N の初期化文、図の 3 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D と、実数型の変数 X の宣言文、図の 4 〜 8行目が入力プログラム 90 の主処理部、 図の 10 行目は、主処理部の 6 行目から呼び出される手続き sub1 の手続き文、図の 11 行目は、整数型の変数 i, N の宣言文、図の 12 行目は、整数型の変数 N の初期化文、図の 13 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元 配列 A,B,C,D の宣言文、図の 14 〜 17 行目が入力プログラム 90 の手続き sub1 処理部である。
【0025】
図8のループ分割解析変換部 132 の出力プログラム 93 で、図の左端にある番号は、理解を助けるために打った行番号 である。図の 1 行目は、整数型の変数i, N の宣言文、図の 2 行目は、整数型の変数 N の初期化文、図の 3 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D と、実数型の変数Xの宣言文、図の 4 〜 10 行目が出力プ ログラム 93 の主処理部(4〜7行が最適化不能の処理、8〜10行が最適化可能の処理)、図の 12 行目は、主処理部の 6行目から呼び出される手続き sub1 の手続き文、図の 13 行 目は、整数型の変数 i, N の宣言文、図の 14 行目は、整数型の変数 N の初期化文、図の 15 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D の宣言文、図の 16 〜 19 行目が出力プログラム 93 の手続き sub1 処理部である。
【0026】
図9の手続きコピー変換部 135 の出力プログラム 94 で、図の左端にある番号は、理解を助けるために打った行番号である。図の 1 行目は、整数型の変数 i, N の宣言文、図の 2 行目は、整数型の変数 N の初期化文、図の 3 行目 は実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D と、実数型の変数 Xの宣言文、図の 4 〜 11 行目が出 力プログラム 94 の主処理部(4〜7行が最適不可能部分、8〜11行が最適可能部分)、図の 13 行目は、主処理部の 6 行目から呼び出されるコピー手続き_copy1_sub1 の手続 き文、図の 14 行目は、整数型の変数 i, N の宣言文、図の 15 行目は、整数型の変数 N の初期化文、図の 16 行目は、 実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D の宣言文、図の 17 〜 20 行目が出力プログラム 94 の手続 き_copy1_sub1 処理部である。図の 22 行目は、主処理部の 9 行目から呼び出されるコピー手続き_copy2_sub1 の手 続き文、図の 23 行目は、整数型の変数 i, N の宣言文、図の24 行目は、整数型の変数 N の初期化文、図の 25 行目 は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D の宣言文、図の 26 〜 29 行目が出力プログラム 94 の 手続き_copy2_sub1 処理部である。
【0027】
図10の文変換部 136 の出力プログラム 95 で、図の左端にある番号は、理解を助けるために打った行番号である。 図の 1 行目は、整数型の変数 i, N の宣言文、図の 2 行目は、整数型の変数 N の初期化文、図の 3 行目は、実数型で あり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,D と、実数型の変数 X の宣言文、図の 4 〜 11 行目が出力プログラム 95 の主処理部(4〜7行が最適化不可能部分、8〜11行が最適化可能部分)、図の 13 行目は、主処理部の 6 行目から呼び出されるコピー手続き_copy1_sub1 の手続き文、図の 14 行目は、整数型の変数 i, N の宣言文、図の 15 行目は、整数型の変数 N の初期化文、図の 16 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B の宣言文、図の17 〜 19 行目が出力プログラム 95 の手続き_copy1_sub1 処理部(最適化不可能部分)である。図の 21 行目は、主処理部の 9 行目から呼び出されるコピー手続き_copy2_sub1 の手続き文、図の 22 行目 は、整数型の変数 i, N の宣言文、図の 23 行目は、整数型の変数 N の初期化文、図の 24 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 C,D の宣言文、図の 25 〜 27 行目が出力プログラム 95 の手続き_copy2_sub1 処理部(最適化可能部分)である。
【0028】
図11の最適化部 15 が並列化を行なった場合の出力プログラム 96 で、図の左端にある番号は、理解を助けるた めに打った行番号である。図の 1 行目は、整数型の変数 i, N, プロセッサ台数 Nproc の宣言文、図の 2 行目は、整数型の変数 N の初期化文、図の 3 行目は、実数型であり 1 〜 N のサイズを持つ 1次元配列 A,B,C,D と、実数型の変数 X の宣言文、図の 4 〜 11 行目が出力プログラム 96 の主処理部(4〜7行が最適化不可部分、8〜11行が最適化可能部分)、図の 13 行目は、主処理部の 6 行目から呼び出され るコピー手続き_copy1_sub1 の手続き文、図の 14 行目は、整数型の変数 i, N の宣言文、図の 15 行目は、整数型の変 数 N の初期化文、図の 16 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B の宣言文、図の 17 〜 19 行 目が出力プログラム 96 の手続き_copy1_sub1 処理部(最適化不可能部分)である。図の 21 行目は、主処理部の 9 行目から呼び出されるコ ピー手続き_copy2_sub1 の手続き文、図の 22 行目は、整数型の変数 i, N の宣言文、図の 23 行目は、整数型の変数 Nの初期化文、図の 24 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 C,D の宣言文、図の 25 〜 27 行目 が出力プログラム 96 の手続き_copy2_sub1 処理部(最適化可能部分)である。
【0029】
図12の最適化部 15 がベクトル化を行なった場合の出力プログラム 97 で、図の左端にある番号は、理解を助 けるために打った行番号である。図の 1 行目は、整数型の変数 i, N の宣言文、図の 2 行目は、整数型の変数 N の初 期化文、図の 3 行目は、実数型であり 1 〜 N のサイズを持つ 1 次元配列 A,B,C,Dと、実数型の変数 X の宣言文、 図の 4 〜 9 行目が出力プログラム 97 の主処理部、図の 11 行目は、主処理部の 6 行目から呼び出されるコピー手続 き_ copy1_sub1 の手続き文、図の 12 行目は、整数型の変数 i, N の宣言文、図の 13 行目は、整数型の変数 N の初期 化文、図の 14 行目は、実数型であり 1 〜N のサイズを持つ 1 次元配列 A,B の宣言文、図の 15 〜 17 行目が出力プ ログラム 96 の手続き_copy1_sub1 処理部である。
【0030】
図7〜図12で明らかなように、ループ分割部 13 は、入力プログラム 90 を出力プログラム 95 に変換する。そのために、まず、ループ分割解析変換部 132が、入力プログラム 90 を出力プログラム 93 に変換する(図8参照)。入力プログラム 90 の 4 〜 8 行目のループが、出力プログラム 93 の 4 〜 7 行目、8 〜 10 行目のループに分割された。前者のループが最適化不能分割ループ、後者のループが最適化可能分割ループである。
次に、手続きコピー変換部 135 が、出力プログラム 93 を出力プログラム94 に変換する(図9参照)。出力プログラム 93 の 6 行目の手続き呼び出し文が手続き sub1 を呼び出していたのが、出力プログラム 94 の 6 行目の手続き呼び出し文で は、手続き sub1 をコピーしたコピー手続き_copy1_sub1 を呼び出すようになった。また、出力プログラム 94 の 9 行 目に、手続き sub1 をコピーしたコピー手続き_copy2_sub1 を呼び出す手続き呼び出し文が追加された。
また、手続き本体も sub1 から_copy1_sub1、_copy2_sub1 の本体に変更された。元の手続き sub1 の本体はプログラム中から削除されてはいないが、手続きコピー変換部 135 によって手続き呼び出し文が削除されてしまったので、出力プログラ ム 94 からは省略した。出力プログラム 95 〜 97 でも同様の理由で省略した。
【0031】
次に、文変換部 136 が、出力プログラム 94 を出力プログラム 95 に変換する(図10参照)。出力プログラム 94 の 18 行目の代 入文が最適化可能文として、 26 行目の代入文が最適化不能文として、出力プログラム95のそれぞれ4 〜 7 行目の最適化不能分割ループ、 8 〜 10 行目の最適化可能分割ループで実行されないように削除された。
次に、最適化部 15 は、並列化を行なう場合には、出力プログラム 95 を出力プログラム 96 に変換する(図11参照)。出力プ ログラム 95 の 8 〜 11 行目の最適化可能分割ループが、出力プログラム 96 の 8 〜 11 行目の並列ループに変換され た。ループ範囲が 1 〜 N より 1 〜 N=Nproc に変更されている。
また、最適化部 15 は、ベクトル化を行なう場合には、出力プログラム 95 を出力プログラム 97 に変換する(図12参照)。出力 プログラム 95 の8 〜11 行目の最適化可能分割ループが、コピー手続き_copy2_sub1 をインライン展開してからベク トル化することで、出力プログラム 96 の 8 〜 9 行目の配列代入文に変換された。配列代入文は、ベクトル化可能なループと同一の意味を表す。以上で、プログラム 90、 92 〜 97 を用いたループ分割の一例の説明を終る。
【0032】
もし、本ループ分割を実行しなければ、入力プログラム 90 の 4 〜 8 行目のループは、 5 〜 6 行目を実行する最適化不能分割ループと 7 行目を実行する最適化可能分割ループにしかループ分割できず、 7 行目の文しか並列化やベクトル化ができない。
しかし、本発明のループ分割によって、呼び出し先手続き sub1 内の 14,15 行目の文も別々の分割ループに割り当てることができ、その結果、 7 行目の文に加えて 15 行目の文も最適化可能分割ループに割り当てることができた。その結果、並列化やベクトル化可能な文の数が 1 文から 2 文に増えた。また、一時変数を使用していないので、余分な文の実行をせずに済み、プログラムの実行がより高速化できる。
【0033】
【発明の効果】
以上説明したように、本発明によれば、手続き呼び出し先の文も呼び出し元ループにおけるループ分割後の最適化対象となるので、より実行性能の良いプログラムまたはオブジェクトコードが得られる。また、一時変数を導入することなくループ分割が可能になるので、分割前のループに対して実行性能を劣化させることがない。
【図面の簡単な説明】
【図1】本発明の一実施例を示すループ分割方法を実行するコンパイラの構成図である。
【図2】図1におけるループ分割解析変換部の処理フローチャートである。
【図3】図1における文解析部の処理フローチャートである。
【図4】図1における手続きコピー解析部の処理フローチャートである。
【図5】図1における手続きコピー変換部の処理フローチャートである。
【図6】図1における文変換部の処理フローチャートである。
【図7】本発明で使用される入力プログラムの一例図である。
【図8】本発明でループ分割されたプログラムの一例図である。
【図9】本発明により手続きコピー変換されたプログラムの一例図である。
【図10】本発明により文変換されたプログラムの一例図である。
【図11】本発明により並列化された出力プログラムの一例図である。
【図12】本発明によりベクトル化された出力プログラムの一例図である。
【図13】本発明が適用される逐次処理計算機の構成の一例を示す図である。
【符号の説明】
10…本発明のコンパイラ、 11 …構文解析部、 13…ループ分割部、
15…最適化部、 17…コード生成部、50…逐次処理計算機、51…プロセッサ、
52…バス、53…メモリ、 90…入力プログラム、91…中間語、
93…ループ分割されたプログラム、92…出力プログラム、
94…手続きコピー変換されたプログラム、95…文変換されたプログラム、
96…並列化出力プログラム、97…ベクトル化出力プログラム、
131…依存解析部、 132…ループ分割解析変換部、133…文解析部、
134…手続きコピー解析部、135…手続きコピー変換部、136…文変換部。[0001]
TECHNICAL FIELD OF THE INVENTION
The present invention relates to an optimizing compiler for converting a computer program into an executable program, and more particularly to a loop dividing method for dividing a loop body having a procedure call into a plurality of loop bodies to create a plurality of loops. .
[0002]
[Prior art]
Conventionally, various loop structure conversion methods have been used in order to accelerate the speed of loop execution. One of them is a loop division. Loop division means that the loop body of one loop is maintained while maintaining the order relationship of defining (substituting values for variables) and using (using variable values) variables in the loop, excluding loop control variables. This is a method of creating a plurality of loops by dividing into a plurality of loop bodies.
As a result, optimization such as parallelization and vectorization, which was impossible in the original loop, is enabled in some divided loops, and the loop execution performance may be improved.
First, terms used in the present specification will be described. The order relation of the definition and use of variables depends, and the definition and use are collectively called a reference. Also depend on loop iterations
(Dependence that refers to a variable in one iteration and refers to the same variable in the next and subsequent iterations) is a loop-carrying dependency, a loop-independent dependency is a loop-independent dependency, a dependency that comes after definition is flow-dependent, and a dependency is defined after use A dependency that comes with is called an inverse dependency, and a dependency that comes after a definition is called an output dependency. Flow dependencies that exist over loop iterations depend on loop transport flows, flow dependencies that do not exist over loop iterations depend on loop-independent flows, and inverse dependencies that do not exist over loop iterations are loop-independent reverse. An output dependency that does not extend over the dependency and loop repetition is called a loop-independent output dependency. A sentence including a variable having a specific dependency is referred to as a statement having the dependency, a dependency when a variable referred to in statement A is referred to in statement B is referred to as a dependency from statement A to statement B, and a specific dependency. A loop including a certain statement is called a loop having the dependency. Further, the dependency cycle refers to a dependency when the dependency relationship between sentences is sent from sentence A to sentence B and sentence B to sentence C, and finally returns to sentence A as the starting point.
[0003]
First, a loop division method will be described. In loop division, an original loop is divided so that a statement included in one dependent cycle is assigned to the same divided loop. By allocating a sentence having a dependency cycle and a sentence without a dependency cycle to separate split loops, optimization according to each dependency can be separately applied to each split loop.
Next, a loop division method when a procedure call statement is present in a loop will be described. By performing inter-procedural dependency analysis for checking dependencies across procedures, the dependency between the calling procedure and the called procedure can be determined. If there is a dependency cycle between the calling procedure and the called procedure in the loop, there is also a method of interpreting that the procedure call statement is included in the dependency cycle and performing the above-described loop division.
However, in this method, statements that are not included in the dependent cycle in the called procedure are interpreted as being expanded as being included in the dependent cycle. As a method of not performing such an expanded interpretation, there is a method of performing inline expansion as preprocessing of loop division. Inline expansion is a process of replacing a procedure call statement with a procedure body. This makes it possible to evaluate dependencies on a statement-by-statement basis without performing extended interpretation, and to assign statements of a called procedure to separate split loops.
[0004]
Consider
The statements that appear in
-Dependency (a) From statement S1 to statement S2, loop independent flow dependency on array A
-Dependency (b) Dependency of loop carrying flow on array B from statement S2 to statement S1
-Dependency (c) Loop-independent flow dependence on array B from statement S2 to statement S4
-Dependency (d) Loop-independent inverse dependency on array D from statement S3 to statement S4
From the dependencies (a) and (b), it can be seen that in the
[0005]
Temporary variables are associated with the actual arguments and the formal parameters of the procedure call, and when the calling procedure and the called procedure have another variable with the same name, It is necessary to guarantee the correspondence between variables when there is one. There is also a method in which the correspondence between the actual argument and the dummy argument is passed by register instead of using a temporary variable. However, if the number of arguments is large, there are not enough registers, and temporary variables must be used. Furthermore, when the array shape differs between the actual argument and the dummy argument, for example, when the actual argument is a two-dimensional array but the dummy argument is received as a one-dimensional array, register passing cannot be applied and the temporary variable is The calculations used are required.
When the procedure sub1 is expanded inline with respect to the procedure call statement Sc,
Is generated. tmpA, tmpB, and tmpC are temporary variables generated by the compiler for inline expansion. The sentences S2 and S3 were converted into sentences S2 ′ and S3 ′ using temporary variables. S1, S4, S2 ', S3', ST1 to ST6 are sentence numbers.
[0006]
The dependencies that appear in this loop 1a are as follows.
-Dependency (1) From statement S1 to statement ST1, loop-independent flow dependency on array A
-Dependency (2) Loop-independent inverse dependency on array A from statement ST1 to statement ST5
-Dependency (3) From statement S1 to statement ST5, loop-independent output dependency on array A
-Dependency (4) Loop-independent flow dependency on array tmpA from statement ST1 to statement S2 '
-Dependency (5) From statement ST1 to statement ST5, loop independent flow dependency on array tmpA
-Dependency (6) Loop-independent inverse dependency on array B from statement ST2 to statement ST6
-Dependency (7) From statement ST6 to statement S1, loop carrying flow dependency on array B
-Dependency (8) From statement ST6 to statement S4, loop-independent flow dependency on array B
-Dependency (9) Loop-independent output dependency on array tmpB from statement ST2 to statement S2 '
-Dependency (10) From statement S2 'to statement ST6, loop independent flow dependency on array tmpB
-Dependency (11) Loop-independent inverse dependency on array C from statement ST3 to statement ST7
-Dependency (12) Loop-independent output dependency on array tmpC from statement ST3 to statement S3 '
-Dependency (13) From statement S3 'to statement ST7, loop independent flow dependency on array tmpC
-Dependency (14) Loop-independent inverse dependency on array D from statement ST4 to statement ST8
-Dependency (15) Loop-independent output dependence on array D from statement ST8 to statement S4
-Dependency (16) From statement ST4 to statement S3 ', loop independent flow dependency on array tmpD
-Dependency (17) From statement ST4 to statement ST8, loop independent flow dependency on array tmpD
[0007]
From the dependencies (1), (4), (7), and (10), it is understood that the statements S1, ST1, S2 ', and ST6 constitute a dependency cycle in the loop 1a. Next, when the order of the statements in the loop body is changed so that statements having a dependency cycle and statements not having a dependency cycle are grouped as much as possible while maintaining the dependency, the following loop 1a 'is obtained. .
[0008]
Further, when the loop division is applied to the loop 1a ′, the following loops 1aa and 1ab are generated.
[0009]
As a result of this loop division, the statements S1 and S2 'are assigned to the division loop 1aa, and the statements S4 and S3' are assigned to the division loop 1ab.
Further, consider optimizing the loop after division. Even if the loop before splitting cannot be optimized because it has certain dependencies, some loops after splitting may not have the dependency, so optimization is performed for loops that do not have the dependency. Can be applied. For example, parallelization and vectorization are given as examples of optimization. The condition that the loop can be parallelized is that there is no loop-carrying flow dependency in the loop, and the condition that the loop can be vectorized is that there is no dependent cycle in the loop.
Since
However, since the loop 1ab after the division does not have the loop carrying flow dependency and the dependency cycle, it can be parallelized and vectorized.
Such loop division and inline expansion are known technologies, for example,
Michael Wolfe (1996) "High Performance Compilers for Parallel Computing", Addison-Wesley Publishing Company, pp. 146-64. 323-pp. 330 pp. 360-pp. 361.
[0010]
[Problems to be solved by the invention]
The above prior art requires a large number of temporary variables in the inline expansion.
Therefore, even if the loop is divided and the optimization is applied to some of the divided loops, there is a problem that it takes a long time to calculate a temporary variable and performance is not improved.
For example, in the related art, in the loop 1a in which the procedure sub1 is expanded inline in the
It becomes. Tsmtav is the average execution time of one sentence, and N is the number of loop repetitions.
[0011]
Suppose that the execution time of the loop 1ab is significantly shorter than the execution time of the loop 1aa by optimization such as parallelization and vectorization,
Even if it can be regarded as, the execution time of the loop 1aa + the loop 1ab is 5/4 times the execution time of the
An object of the present invention is to solve the above problem and promote optimization by dividing a loop including a procedure call into loops without performing inline expansion as preprocessing, and executing a loop in a called procedure called from the loop. It is an object of the present invention to provide a loop dividing method capable of assigning an optimizable statement to an optimizable loop and a non-optimizable statement to a non-optimizable loop among statements.
Another object of the present invention is to provide a loop dividing method capable of outputting a program or object code for reducing the execution time of a loop.
[0012]
[Means for Solving the Problems]
In order to solve the above-mentioned problems, a loop dividing method according to the present invention includes:
(A) a process of performing interprocedural dependency analysis on the loop;
(B) dividing the loop into a plurality of optimizable divided loops and a plurality of non-optimizable divided loops;
(C) examining the statements in the non-optimizable split loop to detect an optimizable statement that can be optimized;
(D) the following three procedures (d.1) a direct call procedure called directly from the non-optimizable split loop, (d.2) an optimizable procedure having the optimizable statement, and (d.3) A process in which an intermediate procedure, which is a procedure that appears on the call graph from the direct calling procedure to the optimizable procedure by following an edge, is a procedure to be copied;
(E) When the optimizable statement in the non-optimizable split loop includes a forward optimizable statement having no dependency from the non-optimizable statement to the optimizable statement, (e.1) Creating a forward direct call copy procedure, a forward optimizable copy procedure, and a forward intermediate copy procedure by copying the direct call procedure, the optimizable procedure, and the intermediate procedure, and (e.2) the non-optimizable partition At the end of the optimizable split loop immediately before the loop, insert the procedure call statement of the forward direct call copy procedure, and (e.3) check the forward direct call copy procedure, and call the procedure call statement if any. Recursively examines the preceding procedure, and if there is a procedure call statement of the procedure to be copied, changes it to the procedure call statement of the forward intermediate copy procedure or the forward optimizable copy procedure, .4) statements other than said front optimizable statements other than and 該手 continued call statement, the process of deleting said front direct call copy procedure, said front optimizable copy procedure, from said front intermediate copying procedure,
[0013]
(F) When the optimizable statement in the non-optimizable split loop includes a backward optimizable statement having no dependency from the optimizable statement to the non-optimizable statement, (f.1) Creating a backward direct call copy procedure, a backward optimizable copy procedure, and a backward intermediate copy procedure by copying the direct call procedure, the optimizable procedure, and the intermediate procedure, and (f.2) the non-optimizable split loop Inserts the procedure call statement of the backward direct call copy procedure at the beginning of the optimizable split loop immediately after (f.3), examines the backward direct call copy procedure, and calls the call destination if there is a procedure call statement. The procedure is recursively examined, and if there is a procedure call statement of the procedure to be copied, it is changed to the procedure intermediate statement of the backward intermediate copy procedure or the procedure call statement of the backward optimizable copy procedure, ( .4) statements other than aft optimizable statements other than and 該手 continued call statement, the process of deleting aft direct call copy procedure, aft optimizable copy procedure, the aft intermediate copying procedure,
(G) (g.1) Create an original direct call copy procedure, an original optimizable copy procedure, and an original intermediate copy procedure by copying the direct call procedure, the optimizable procedure, and the intermediate procedure, and (g. 2) replacing the procedure call statement of the direct call procedure in the non-optimizable split loop with the procedure call statement of the original direct call copy procedure, and (g.3) examining the original direct call copy procedure, If there is, the callee procedure is recursively examined, and if there is a procedure call statement of the procedure to be copied, it is replaced with the procedure call statement of the original intermediate copy procedure or the original optimizable copy procedure, and (g.4) the Optimizeable statements are copied in the original direct call copy procedure, the original optimizable And (h) a process of optimizing the optimizable division loop.
[0014]
BEST MODE FOR CARRYING OUT THE INVENTION
Hereinafter, embodiments of the present invention will be described in detail with reference to the drawings.
First, before describing an embodiment of the present invention, a configuration of a sequential processing computer to which the present invention is applied will be described.
FIG. 13 is a diagram illustrating an example of a configuration of a sequential processing computer to which the present invention is applied.
The
In the
FIG. 1 is a diagram showing a configuration of a compiler for executing the loop dividing method of the present invention.
As shown in FIG. 1, the
The
The
[0015]
FIG. 2 is a flowchart showing an execution method of the loop division
The execution method of the
In
In
In
At 13204, it is determined whether the statement is included in the dependency cycle. At this time, even if there is a procedure call statement, the statement of the called procedure is not followed. If the statement is included in the dependency cycle, execute
[0016]
If it is determined in
In
This concludes the description of the loop division
[0017]
FIG. 3 is a flowchart showing an execution method of the
The execution method of the
In
In
In
In
This concludes the description of the
[0018]
FIG. 4 is a flowchart showing an execution method of the procedure
The execution method of the procedure
In
In
In
[0019]
In
When the granularity of the immediately preceding division loop is smaller,
In
In
In
In step 13409, it is determined whether the dependency existing between the self-statement and the non-optimizable statement is only a dependency from the non-optimizable statement to the self-statement. If only the statement that cannot be optimized is dependent on the own statement,
In
In step 13411, the procedure call statement that calls the procedure to be copied from the non-optimizable division loop and the procedure to be copied is set as the replacement position of the copied procedure, which is the copied procedure, with the procedure call statement.
In
This concludes the description of the copy
[0020]
FIG. 5 is a flowchart showing a method of executing the procedure
The execution method of the procedure
In
In
In
In
If it is the last sentence,
In
This is the end of the description of the procedure
[0021]
FIG. 6 is a flowchart illustrating an execution method of the
The execution method of the
In
In
If it is an optimizable division loop,
In
In
In
In
In
In
This concludes the description of the copy
This concludes the description of the
[0022]
The
The
This concludes the description of the loop division method according to the present invention.
[0023]
The
[0024]
In the
[0025]
In the output program 93 of the loop division analysis /
[0026]
In the
[0027]
In the output program 95 of the
[0028]
In the
[0029]
In the
[0030]
As is clear from FIGS. 7 to 12, the
Next, the procedure
The procedure body has also been changed from sub1 to _copy1_sub1, _copy2_sub1. Although the main body of the original procedure sub1 has not been deleted from the program, it has been omitted from the
[0031]
Next, the
Next, when performing parallelization, the
When performing vectorization, the optimizing
[0032]
If this loop division is not executed, the loops of
However, by the loop division according to the present invention, the statements on the 14th and 15th lines in the callee procedure sub1 can also be assigned to different division loops. As a result, the statement on the 15th line in addition to the statement on the 7th line It could be assigned to an optimizable split loop. As a result, the number of statements that can be parallelized and vectorized has increased from one to two. In addition, since no temporary variables are used, the execution of extra statements is not required, and the speed of execution of the program can be further increased.
[0033]
【The invention's effect】
As described above, according to the present invention, the statement of the procedure call destination is also subject to optimization after loop division in the caller loop, so that a program or object code with higher execution performance can be obtained. Further, since the loop can be divided without introducing a temporary variable, the execution performance of the loop before the division is not deteriorated.
[Brief description of the drawings]
FIG. 1 is a configuration diagram of a compiler that executes a loop division method according to an embodiment of the present invention.
FIG. 2 is a processing flowchart of a loop division analysis conversion unit in FIG. 1;
FIG. 3 is a processing flowchart of a sentence analysis unit in FIG. 1;
FIG. 4 is a processing flowchart of a procedure copy analysis unit in FIG. 1;
FIG. 5 is a processing flowchart of a procedure copy conversion unit in FIG. 1;
FIG. 6 is a processing flowchart of a sentence conversion unit in FIG. 1;
FIG. 7 is an example of an input program used in the present invention.
FIG. 8 is an example diagram of a program divided into loops according to the present invention.
FIG. 9 is a diagram showing an example of a program subjected to procedure copy conversion according to the present invention.
FIG. 10 is a diagram showing an example of a sentence-converted program according to the present invention.
FIG. 11 is an example of an output program parallelized according to the present invention.
FIG. 12 is an example of an output program vectorized by the present invention.
FIG. 13 is a diagram showing an example of a configuration of a sequential processing computer to which the present invention is applied.
[Explanation of symbols]
10 Compiler of the
15: optimization unit 17: code generation unit 50: sequential processing computer 51: processor
52: bus, 53: memory, 90: input program, 91: intermediate language,
93: loop-divided program, 92: output program,
94: Procedure-converted program, 95: Sentence-converted program,
96: parallelized output program, 97: vectorized output program,
131: dependency analysis unit 132: loop division analysis conversion unit, 133: sentence analysis unit
134: procedure copy analysis unit; 135: procedure copy conversion unit; 136: sentence conversion unit.
Claims (6)
(a) 該最適化不能分割ループに含まれる手続き呼び出し文の呼び出し先手続きに該最適化可能な最適化可能部分が存在する場合、該最適化可能部分を該最適化可能ループにまで移動可能なものと移動不能なものに分類するステップと、
(b) 該移動可能な最適化可能部分を最適化可能分割ループ中へ移動するステップと
を有することを特徴とするループ分割方法。When dividing into loops that include procedure call statements that appear in a program written for a sequential processing computer and that are divided into an optimizable split loop that can be optimized and a non-optimizable split loop that cannot be optimized ,
(A) If the optimizable part exists in the called procedure of the procedure call statement included in the non-optimizable division loop, the optimizable part can be moved to the optimizable loop. Classifying the object as immovable;
(B) moving the movable optimizable part into an optimizable division loop.
(a) 該ループに関して、手続きに跨って変数の参照関係を調べる依存解析ステップと、
(b) 該ループを、最適化可能な複数の最適化可能分割ループと、最適化不能な複数の最適化不能分割ループに分割するループ分割ステップと、
(c) 該最適化不能分割ループ中の文、およびその中に手続き呼び出し文があればその呼び出し先手続き中の文を再帰的に調べ、最適化可能な最適化可能文および最適化不能な最適化不能文を検出する文解析ステップと、
(d) 手続きをノードとし、呼び出し元手続きから呼び出し先手続きへエッジをつないで、手続き呼び出し関係を表すコールグラフを作成し、手続きコピーの対象となる手続きを検出する手続きコピー解析ステップと、
(e) 該最適化不能分割ループ中の該最適化可能文のうち、該最適化可能分割ループへ移動可能な文を検出し、移動後も変数間の依存関係を満たすように手続きをコピーし、該移動可能な文を移動するコピー変換ステップと、
(f) 該最適化可能分割ループを最適化する最適化ステップ
を有することを特徴とするループ分割方法。In a loop division method for dividing a loop including a procedure call statement, which appears in a program described for a sequential processing computer,
(A) a dependency analysis step of examining the reference relation of variables across procedures with respect to the loop;
(B) dividing the loop into a plurality of optimizable divided loops that can be optimized and a plurality of non-optimizable divided loops that cannot be optimized;
(C) recursively examines the statement in the non-optimizable split loop and the statement in the called procedure, if any, in the called procedure, and optimizes the optimizable statement and the non-optimizable statement. A sentence parsing step for detecting an unconvertible sentence,
(D) a procedure copy analysis step of creating a call graph representing a procedure call relationship by connecting an edge from a caller procedure to a callee procedure with a procedure as a node, and detecting a procedure to be copied;
(E) detecting a statement that can be moved to the optimizable divided loop among the optimizable statements in the non-optimizable divided loop, and copying a procedure so as to satisfy the dependency between variables even after the movement; A copy conversion step of moving the movable sentence;
(F) A loop splitting method comprising an optimizing step of optimizing the optimizable split loop.
(d.1) 該最適化不能分割ループから直接呼び出される直接呼び出し手続き、(d.2) 該最適化可能文を持つ最適化可能手続き、
(d.3) 該コールグラフ上で該直接呼び出し手続きから手続き呼び出し関係に従ってエッジをたどり、該最適化可能手続きに至る間に現れる手続きである中間手続き、
をコピー対象手続きとして検出するステップを有することを特徴とする請求項2に記載のループ分割方法。The procedure copy analysis step includes:
(D.1) a direct call procedure called directly from the non-optimizable split loop, (d.2) an optimizable procedure having the optimizable statement,
(D.3) an intermediate procedure, which is a procedure that follows an edge on the call graph from the direct call procedure according to the procedure call relation, and appears between the call procedure and the optimizable procedure;
3. The method according to claim 2, further comprising the step of detecting as a copy target procedure.
(a)該最適化不能分割ループ中の該最適化可能文に、該最適化不能文から該最適化可能文へのデータ依存を持たない前方最適化可能文がある場合は、
(a.1) 該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、前方直接呼び出しコピー手続き、前方最適化可能コピー手続き、前方中間コピー手続きを作成し、
(a.2) 該最適化不能分割ループの直前にある該最適化可能分割ループの最後に、該前方直接呼び出しコピー手続きの手続き呼び出し文を挿入し、
(a.3) 該前方直接呼び出しコピー手続き、およびその中に手続き呼び出し文があればその呼び出し先手続きを再帰的に調べ、 該コピー対象手続きの手続き呼び出し文があれば該前方中間コピー手続きまたは該前方最適化可能コピー手続きの手続き呼び出し文に変更し、
(a.4) 該前方最適化可能文以外かつ該コピー対象手続き中の手続き呼出し文以外の文を、該前方直接呼び出しコピー手続き、該前方最適化可能コピー手続き、該前方中間コピー手続きから削除する、前方コピー変換ステップと、
(b) 該最適化不能分割ループ中の該最適化可能文に、該最適化可能文から該最適化不能文へのデータ依存を持たない後方最適化可能文がある場合は、
(b.1) 該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、後方直接呼び出しコピー手続き、後方最適化可能コピー手続き、後方中間コピー手続きを作成し、
(b.2) 該最適化不能分割ループの直後にある該最適化可能分割ループの先頭に、該後方直接呼び出しコピー手続きの手続き呼び出し文を挿入し、
(b.3) 該後方直接呼び出しコピー手続き、およびその中に手続き呼び出し文があればその呼び出し先手続きを再帰的に調べ、該コピー対象手続きの手続き呼び出し文があれば該後方中間コピー手続きまたは該後方最適化可 能コピー手続きの手続き呼び出し文に変更し、
(b.4) 該後方最適化可能文以外かつ該コピー対象手続き中の手続き呼出し文以外の文を、該後方直接呼び出しコピー手続き、該後方最適化可能コピー手続き、該後方中間コピー手続きから削除する後方コピー変換ステップと、
(c) (c.1) 該直接呼び出し手続き、該最適化可能手続き、該中間手続きをコピーした、オリジナル直接呼び出しコピー手続き、オリジナル最適化可能コピー手続き、オリジナル中間コピー手続きを作成し、
(c.2) 該最適化不能分割ループ中の該直接呼び出し手続きの手続き呼び出し文を、該オリジナル直接呼び出しコピー手続きの手続き呼び出し文に置換し、
(c.3) 該オリジナル直接呼び出しコピー手続き、およびその中に手続き呼び出し文があればその呼び出し先手続きを再帰的に調べ、該コピー対象手続きの手続き呼び出し文があれば該オリジナル中間コピー手続きまたは該 オリジナル最適化可能コピー手続きの手続き呼び出し文に置換し、
(c.4) 該最適化可能文を、該オリジナル直接呼び出しコピー手続き、該オリジナル最適化可能コピー手続き、該オリジナル中間コピー手続きから削除する、オリジナルコピー変換ステップと
を有することを特徴とする請求項2に記載のループ分割方法。The copy conversion step includes:
(A) When the optimizable statement in the non-optimizable split loop includes a forward optimizable statement that does not have a data dependency from the non-optimizable statement to the optimizable statement,
(A.1) creating a forward direct call copy procedure, a forward optimizable copy procedure, and a forward intermediate copy procedure by copying the direct call procedure, the optimizable procedure, and the intermediate procedure;
(A.2) inserting a procedure call statement of the forward direct call copy procedure at the end of the optimizable split loop immediately before the non-optimizable split loop;
(A.3) The forward direct call copy procedure, and if there is a procedure call statement in it, recursively examine the callee procedure. If there is a procedure call statement of the procedure to be copied, the forward intermediate copy procedure or the forward intermediate copy procedure Changed to the procedure call statement of the forward optimizable copy procedure,
(A.4) Deleting statements other than the forward optimizable statement and the procedure call statements in the copy target procedure from the forward direct call copy procedure, the forward optimizable copy procedure, and the forward intermediate copy procedure. A forward copy conversion step,
(B) if the optimizable statement in the non-optimizable split loop includes a backward optimizable statement that does not have a data dependency from the optimizable statement to the non-optimizable statement,
(B.1) creating a backward direct call copy procedure, a backward optimizable copy procedure, and a backward intermediate copy procedure which are obtained by copying the direct call procedure, the optimizable procedure, and the intermediate procedure;
(B.2) inserting a procedure call statement of the backward direct call copy procedure at the beginning of the optimizable split loop immediately after the non-optimizable split loop;
(B.3) The backward direct call copy procedure and, if there is a procedure call statement in it, recursively check the callee procedure. If there is a procedure call statement of the procedure to be copied, the backward intermediate copy procedure or the backward intermediate copy procedure or Changed to a procedure call statement of a backward-optimizable copy procedure,
(B.4) A statement other than the backward optimizable statement and other than a procedure call statement in the procedure to be copied is deleted from the backward direct call copy procedure, the backward optimizable copy procedure, and the backward intermediate copy procedure. A backward copy conversion step;
(C) (c.1) creating an original direct call copy procedure, an original optimizable copy procedure, and an original intermediate copy procedure by copying the direct call procedure, the optimizable procedure, and the intermediate procedure;
(C.2) replacing the procedure call statement of the direct call procedure in the non-optimizable split loop with the procedure call statement of the original direct call copy procedure;
(C.3) The original direct call copy procedure, and if there is a procedure call statement in it, recursively examines the callee procedure. If there is a procedure call statement of the procedure to be copied, the original intermediate copy procedure or the original intermediate copy procedure or Replace with the procedure call statement of the original optimizable copy procedure,
(C.4) an original copy conversion step of deleting the optimizable statement from the original direct call copy procedure, the original optimizable copy procedure, and the original intermediate copy procedure. 3. The loop division method according to 2.
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00058598A JP3551352B2 (en) | 1998-01-06 | 1998-01-06 | Loop splitting method |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP00058598A JP3551352B2 (en) | 1998-01-06 | 1998-01-06 | Loop splitting method |
Publications (2)
Publication Number | Publication Date |
---|---|
JPH11194947A JPH11194947A (en) | 1999-07-21 |
JP3551352B2 true JP3551352B2 (en) | 2004-08-04 |
Family
ID=11477808
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP00058598A Expired - Lifetime JP3551352B2 (en) | 1998-01-06 | 1998-01-06 | Loop splitting method |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP3551352B2 (en) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2011158460A1 (en) * | 2010-06-14 | 2011-12-22 | パナソニック株式会社 | Multi-threaded parallel execution device, broadcast stream playback device, broadcast stream storage device, stored stream playback device, stored stream re-encoding device, integrated circuit, multi-threaded parallel execution method, and multi-threaded compiler |
-
1998
- 1998-01-06 JP JP00058598A patent/JP3551352B2/en not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
JPH11194947A (en) | 1999-07-21 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7725883B1 (en) | Program interpreter | |
US8776030B2 (en) | Partitioning CUDA code for execution by a general purpose processor | |
US6233733B1 (en) | Method for generating a Java bytecode data flow graph | |
US8893080B2 (en) | Parallelization of dataflow actors with local state | |
JP6141365B2 (en) | Method and system for parallel processing of sequential computer program code | |
Prasad et al. | Automatic compilation of MATLAB programs for synergistic execution on heterogeneous processors | |
Chen et al. | Type-directed automatic incrementalization | |
US20060277529A1 (en) | Compiler apparatus | |
JP3651774B2 (en) | Compiler and its register allocation method | |
Cann | The optimizing SISAL compiler: version 12.0 | |
JP4041248B2 (en) | COMPILER DEVICE, COMPUTER-READABLE RECORDING MEDIUM CONTAINING COMPILING PROGRAM, AND COMPILING METHOD | |
US10013244B2 (en) | Apparatus and method to compile a variadic template function | |
Metcalf | The seven ages of fortran | |
JPH0926884A (en) | Method and apparatus for making required flow information usable during task requiring binary information | |
US6993756B2 (en) | Optimization apparatus that decreases delays in pipeline processing of loop and computer-readable storage medium storing optimization program | |
JP3539613B2 (en) | Array summary analysis method for loops containing loop jump statements | |
Bahmann et al. | Perfect reconstructability of control flow from demand dependence graphs | |
Reppy | Optimizing nested loops using local CPS conversion | |
US20170206068A1 (en) | Program optimization based on directives for intermediate code | |
Min et al. | Portable compilers for OpenMP | |
JP3551352B2 (en) | Loop splitting method | |
US20170344351A1 (en) | Information processing apparatus, compiling management method, and recording medium | |
Osmialowski | How the Flang frontend works: Introduction to the interior of the open-source fortran frontend for LLVM | |
JP3405696B2 (en) | Compiling apparatus and method | |
JP3028821B2 (en) | Parallel compilation method |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
TRDD | Decision of grant or rejection written | ||
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20040402 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20040415 |
|
R150 | Certificate of patent or registration of utility model |
Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080514 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20080514 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090514 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090514 Year of fee payment: 5 |
|
S111 | Request for change of ownership or part of ownership |
Free format text: JAPANESE INTERMEDIATE CODE: R313114 |
|
S531 | Written request for registration of change of domicile |
Free format text: JAPANESE INTERMEDIATE CODE: R313531 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090514 Year of fee payment: 5 |
|
R350 | Written notification of registration of transfer |
Free format text: JAPANESE INTERMEDIATE CODE: R350 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20090514 Year of fee payment: 5 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100514 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20100514 Year of fee payment: 6 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110514 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110514 Year of fee payment: 7 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120514 Year of fee payment: 8 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120514 Year of fee payment: 8 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130514 Year of fee payment: 9 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130514 Year of fee payment: 9 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
EXPY | Cancellation because of completion of term |