JP2003256214A - 配列拡張によるループ変換方法 - Google Patents

配列拡張によるループ変換方法

Info

Publication number
JP2003256214A
JP2003256214A JP2002050672A JP2002050672A JP2003256214A JP 2003256214 A JP2003256214 A JP 2003256214A JP 2002050672 A JP2002050672 A JP 2002050672A JP 2002050672 A JP2002050672 A JP 2002050672A JP 2003256214 A JP2003256214 A JP 2003256214A
Authority
JP
Japan
Prior art keywords
loop
array
loops
distribution
permutation
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.)
Pending
Application number
JP2002050672A
Other languages
English (en)
Inventor
Keiko Motokawa
敬子 本川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2002050672A priority Critical patent/JP2003256214A/ja
Publication of JP2003256214A publication Critical patent/JP2003256214A/ja
Pending legal-status Critical Current

Links

Abstract

(57)【要約】 【課題】配列拡張を伴うループ分配後にループ交換を適
用するループ変換において、配列拡張した参照が連続参
照となるようなループ変換方法を提供する。 【解決手段】非線型ネストに対するループ分配により複
数の線形ネストを生成し(604)、その後ループ分配
により生成された線形ネストに対してループ交換を適用
する(608)。ループ分配(604)においては、ル
ープ交換コストの評価(105)に基づいてループネス
ト順列の決定を行い(106)、決定したループネスト
順列において連続参照となるように配列拡張した参照へ
の置換を行う(108)。

Description

【発明の詳細な説明】
【0001】
【発明の属する技術分野】本発明は、計算機の利用技術
において、オブジェクトプログラムの実行時間を削減す
るコンパイル方法に関する。特に、ループ分配において
配列拡張を行う場合の最適化方法に関する。
【0002】
【従来の技術】ループ分配とは、ループ中の実行コード
を複数の部分に分割し、それぞれが別のループの実行と
なるようにループを分配して、複数のループに変換する
ループ変換手法である。ループ分配については、中田
「コンパイラの構成と最適化」(朝倉書店)436頁か
ら438頁に記載されている。
【0003】多重ループにおいて、最内側ループを除く
全てのループが、その内側にただ1つの一重または多重
ループを含むとき、これを線形ネストと呼ぶ。この条件
を満たさない多重ループ、即ち、多重ループ内に、その
内部に複数のループを含むループが存在するものを非線
形ネストと呼ぶ。
【0004】非線型ネストは、ループ分配で複数の内部
ループがそれぞれ別ループに含まれるような変換によ
り、線形ネストに変換できる。
【0005】ループ分配を阻害する配列参照間の依存が
ある場合、この配列の参照を、より多次元の配列(拡張
配列と呼ぶ)の参照に置換することで、ループ分配が適
用可能になることがある。このような変換を配列拡張と
呼ぶ。
【0006】図8(a)にFortranで記述された非線型
ネストのソースプログラムを示す。本例で、外側のLOOP
0をLOOP1とLOOP2に分配して図8(b)のように変換し
た場合、LOOP2内で参照するUの値が元のプログラムと異
なるため、不正な変換となる。そこで、2次元の拡張配
列Wを導入し、1次元配列Uの参照をWで置換する配列拡張
により図8(c)のような正しい変換コードが得られ
る。拡張配列の添え字は、連続参照となるようにループ
のネスト順列に従って設定する。図8の例では、内側ル
ープのループ制御変数がJが配列の1次元目に現れるよ
うに、W(J,I)のように添え字を設定する。
【0007】このような変換の例は、日立「HI-UX/MPP
for SR8000 最適化FORTRAN90 使用の手引」(6A30-3-3
11)の150頁から151頁に記載されている。
【0008】ループ交換は多重ループにおいて外側ルー
プと内側ループを入れ替えるといった、ループのネスト
順列を変更するループ変換方法である。ループ交換につ
いても、前記中田の文献の439頁から443頁に記載
されている。ループ交換は主として、非連続な配列参照
を連続参照にするといった、データ参照の局所性向上を
目的に適用する。
【0009】図9(a)のLOOP0とLOOP1のループネスト
においては、配列AとBの参照が非連続になっている。2
つのループを入れ替え図9(b)ように変換すると、A
とBの参照が連続となり、実行性能の向上が図れる。
【0010】
【発明が解決しようとする課題】図9に示したループ交
換の例で、配列Wは交換前のループで連続参照となって
いるため、交換後には非連続となってしまう。交換後の
ループで配列Wも連続参照となるようにできれば、実行
性能のさらなる向上が図れる。図10(a)は図8
(a)と同じソースプログラムを示したものであるが、
これを図10(b)のように変換して配列Wの参照をW
(I,J)とすれば、ループ交換後のループは図10(c)
のようになり、配列Wの参照も連続にすることができ
る。
【0011】本発明の目的は、配列拡張を伴うループ分
配後にループ交換を適用するループ変換において、拡張
配列の参照が連続参照となるようなループ変換方法を提
供することにある。
【0012】
【課題を解決するための手段】本発明の目的は、非線型
ネストに対するループ分配により複数の線形ネストを生
成するループ分配ステップと、ループ分配により生成さ
れた線形ネストに対してループ交換を適用するループ交
換ステップとを有するループ変換方法において、ループ
分配ステップに含まれる、ループ内の配列をより多次元
の配列に置換する配列拡張処理において、ループ交換の
結果を予測するループネスト順列決定ステップと、決定
したループネスト順列において連続参照となるような拡
張配列参照への置換を行うステップにより達成される。
上記ループネスト順列決定ステップでは、ループ分配後
の線形ネストに対するループ交換を想定したループ交換
コストの評価を実施する。
【0013】
【発明の実施の形態】以下、図面を用いて本発明の実施
の形態について説明する。
【0014】図2は、本発明によるコンパイラが稼動す
る計算機システムの構成図である。この計算機システム
は、CPU201、ディスプレイ装置202、キーボー
ド203、主記憶装置204、および外部記憶装置20
5より構成されている。キーボード203により、ユー
ザからのコンパイラ起動命令を受け付ける。コンパイラ
終了メッセージやエラーメッセージは、ディスプレイ装
置202に表示される。外部記憶装置205には、ソー
スプログラム206とオブジェクトプログラム207が
格納される。主記憶装置204には、コンパイラ20
8、コンパイル過程で必要となる中間コード209、ル
ープ表210および配列表211が格納される。コンパ
イル処理はCPU201がコンパイラプログラム208
を実行することにより行われる。
【0015】図3に、図2のシステムで稼動するコンパ
イラ208の処理手順を示す。
【0016】コンパイラの処理は、構文解析301、ル
ープ解析302、ループ変換303、レジスタ割り付け
304、コード生成305の順で行う。
【0017】構文解析301では、ソースプログラム2
06を入力として構文解析を行い、中間コード209を
出力する。また配列に関する情報を配列表211に登録
する。
【0018】ループ解析302により、プログラムに含
まれるループの集合が求められ、これがループ表210
に記録される。ループ解析について、「エイホ、セシ
ィ、ウルマン著:コンパイラ(サイエンス社、1990
年)」に記述されている。
【0019】ループ変換303は、本発明の特徴となる
ステップであるので、後で詳細に説明する。
【0020】レジスタ割り付け304では中間コード2
09の各ノードへのレジスタ割り付けを行う。コード生
成305では、中間コード209をオブジェクトプログ
ラム207に変換し、出力する。
【0021】図4はループ表210の例を示す図であ
る。ループ表は、「ループ番号」欄401、「子ルー
プ」欄402、「親ループ」欄403、「制御変数」欄
404、「初期値」欄405、「終値」欄406、「増
分値」欄407から構成されている。
【0022】「ループ番号」欄には、各ループを特定す
るために、各ループに適宜割り当てられる番号が登録さ
れる。「子ループ」欄にはそのループ内に含まれるルー
プのリストを登録する。子ループが多重ループの場合に
は、最も外側のループを登録する。「親ループ」欄に
は、そのループのすぐ外のループを登録する。「制御変
数」欄にはループ制御変数を登録し、ループ制御変数の
初期値、終値、イタレーション毎の増分値をそれぞれ
「初期値」欄、「終値」欄、「増分値」欄に登録する。
図4のループ表は図8(a)のソースプログラムに対応し
ている。
【0023】図5は配列表211の例を示す図である。
配列表にはプログラム中に出現する配列の情報を登録す
る。「配列名」欄501はソースプログラム上の配列名
を示す。「次元数」欄502は、配列が何次元かを登録
する。「1次元目」欄503には配列の1次元目の要素
の下限と上限の値を登録する。「2次元目」欄504に
は同様に配列の2次元目の要素の下限と上限の値を登録
する。3次元目以降についても同様に登録する。配列の
次元に関する情報は配列の宣言文により決定される。図
5の表の配列AからUまでは、図8(a)のソースプログラ
ムに対応している。
【0024】図6に、本発明によるループ変換の処理手
順を示す。各ステップを説明する。
【0025】ステップ601、602、603、604
によりループ分配最適化を行う。
【0026】ステップ601では、未処理のループがあ
るかどうかを判定し、あればステップ602で未処理ル
ープを1つ取り出す。
【0027】ステップ603では、取り出したループが
非線型ネストであるかどうかを判定する。ループ表21
0の子ループ欄402により子ループを順に辿り、子ル
ープが複数登録されているかどうかにより判定できる。
全ループの子ループ数が1以下ならば線形ネスト、子ル
ープ数が2以上のループがあれば非線型ネストと判定す
る。非線型ネストならばステップ604に進み、そうで
なければステップ601に戻り、次のループの処理に進
む。
【0028】ステップ604では、本発明の最も特徴的
な部分であるループ分配最適化を行う。本ステップの詳
細を図1に従って説明する。
【0029】ステップ101では、ループ分配により線
形ネストとなるように、分配ループと分割点を決定す
る。図11に一般化した非線型ネストの例を示す。外側
ループから順に複数の子ループを持つループを探す。複
数の子ループを持つのは”DO In”のループであるか
ら、その外側にある”DO I1”から”DO In”までの全ル
ープを分配ループ群とし、子ループへの分配を試みる。
線形ネストを生成するために、”DO In”のループ内の
実行文を複数のパートに分割し、各パート内に子ループ
ネストが1つだけ存在するようにする。図11の例では
3つのパートに分割している。図8(a)のソースプロ
グラムの例では、分配ループはLOOP0、分割点はLOOP1と
LOOP2の2パートに分割することを決定する。
【0030】ステップ102では分割パート間のデータ
依存を調べ、ループ分配を阻害するかどうかを調べる。
ループ分配の依存条件については、前記中田の文献に記
載されている。ループ分配を阻害する依存がない場合に
はステップ109へ進み、変換を適用する。ある場合に
はステップ103へ進む。図8(a)のソースプログラ
ムにおいては、配列Uの定義がLOOP1に、使用がLOOP2に
あり、図8(b)で示したようにそのまま分配するとLO
OP2で使用するUの値が不正になることから、ループ分配
を阻害すると判定する。
【0031】ステップ103ではステップ102でルー
プ分配を阻害すると判定されたデータ依存に対して、配
列拡張を適用できるかどうかを判定する。図8(a)の
ソースプログラムにおいては、1次元の配列Uの各要素
がIループの繰り返し毎に再定義されることによる依存
がループ分配を阻害している。2次元の配列への配列拡
張を実施すればUの各要素の再定義がなくなり、ループ
分配が適用可能となる。従って本例では配列拡張を適用
できると判定する。
【0032】ステップ104ではループ分配の変換処理
を適用し、非線型ネストを複数の線形ネストへ変換す
る。図8の例では、ループ分配の変換処理により図8
(b)のように変換される。
【0033】ステップ105では、ステップ103で配
列拡張を適用すると判定した配列を含む各ループネスト
に対して、ループ交換を想定したコスト評価を行う。n
重ループの最外側ループを1、最内側ループをnとする
ように外側ループから順に番号付けし、1からnまでの
数の順列をループ交換後のループネスト順列と考えて、
ループ内の配列参照のコストを評価する。図8のソース
プログラムに対するループ交換コスト評価の例を図7に
示す。配列拡張の対象配列はUで、これを含むループLOO
P1とLOOP2が対象となる。LOOP1に含まれる配列参照はA
(I,J)とB(I,J)である。U(J)は配列拡張の対象であるた
め除外する。本例では、非連続参照のコストを10、連続
参照のコストを1とする。ループネスト順列(1,2)はLOOP
0を外側ループ、LOOP1を内側ループとする元のループ順
列に対応する。A(I,J)、B(I,J)は内側ループで非連続参
照となるからそれぞれのコストは10で合計は20である。
ループネスト順列(2,1)は外側ループがLOOP1、内側ルー
プがLOOP0の場合である。A(I,J)、B(I,J)は内側ループ
で連続参照となり、コストの合計は2である。本ループ
はループ交換において、コストが最小なループネスト順
列(2,1)を選択すると予想される。ループ2についても同
様に評価を行い、図7の結果が得られる。
【0034】ステップ106では、ステップ105の結
果に基づき、配列拡張で想定するループネスト順列を決
定する。図7の例では、両ループでネスト順列(2,1)が
選択されるため、これをループネスト順列に決定する。
各ループで選択されるネスト順列が異なる場合には、1
つを選択する。
【0035】ステップ107では、ステップ103で配
列拡張の対象に決定した各配列に対して、拡張配列を作
成する。元の配列を含むループがn重ループならば、n
次元の拡張配列を作成する。拡張配列の各次元の要素数
は、各ループの繰り返し回数以上であることが必要であ
るから、ループ表の情報に従い決定する。ここで、1次
元目の要素数はステップ106で決定したループネスト
順列の最内側ループに基づいて決定し、2次元目はルー
プネスト順列の内側から2番目、n次元目はループネス
ト順列の最外側ループというように、ループネスト順列
に従って決定する。図8の例の場合には、ステップ10
6で決定したループネスト順列は(2,1)であるから、LOO
P0の制御変数の初期値と終値に合わせ、配列の1次元目
の下限を1、上限をMとする。2次元目の要素数はLOOP
1とLOOP2の両ループに従い、下限を1、上限をNとす
る。配列名をWとして拡張配列を作成した結果を図5に
示している。
【0036】ステップ108では、配列拡張対象の配列
のループ中の参照を、ステップ107で作成した拡張配
列の参照で置換する。図8の例では配列Uの参照を配列
Wの参照で置換する。拡張配列の参照の添え字は、ステ
ップ106のループネスト順列に従って生成する。図8
の例では、LOOP1内の参照は、内側ループとなるLOOP0の
制御変数Iが1次元目に、外側ループとなるLOOP1の添え
字が2次元目となるように、W(I,J)とする。拡張配列へ
の置換後の結果は図10(b)のようになる。
【0037】以上で図1およびステップ604の説明を
終了する。
【0038】次にステップ605からステップ608
で、ループ交換を実施する。
【0039】ステップ606では、未処理のループがあ
るかどうかを判定し、あればステップ607で未処理ル
ープを1つ取り出す。
【0040】ステップ607では、取り出したループが
線形ネストであるかどうかを判定する。線形ネストかど
うかの判定方法はステップ603で説明した通りであ
る。
【0041】線形ネストならばステップ608へ進み、
ループ交換最適化を行う。ループ交換においては、ステ
ップ105および図7で説明したのと同様の方法でコス
ト評価を行い、コストが最小となるループネスト順列を
決定する。次に、その順列によるループ交換が正当かど
うか、依存条件の判定を行い、正当ならばループ交換を
適用する。ループ交換の依存条件については、前記中田
の文献に記載されている。図8のソースプログラムの例
では、図10(b)のループに対してループ交換を適用
した結果、図10(c)のように変換される。
【0042】
【発明の効果】本発明によれば、ループ分配時の配列拡
張処理においてループ交換を考慮したループネスト順列
を決定し、その順列に従った添え字による拡張配列の参
照に置換する配列拡張を実施することにより、ループ分
配後にループ交換を適用した場合に拡張配列の参照が連
続となり、プログラム実行の高速化が図れる。
【図面の簡単な説明】
【図1】本発明に係るループ変換方法におけるループ分
配最適化の処理手順を示すフローチャート。
【図2】本発明に係るループ変換方法を実施するコンパ
イラが稼動する計算機システムの構成図。
【図3】本発明に係るループ変換方法を実施するコンパ
イラの処理手順を示すフローチャート。
【図4】ループ表の例を示す図。
【図5】配列表の例を示す図。
【図6】本発明によるループ変換方法の処理手順を示す
フローチャート。
【図7】本発明に係るループ変換方法におけるループ交
換コスト評価の一例を示す図。
【図8】従来技術によるループ分配の適用例を示す図。
【図9】ループ交換の一例を示す図。
【図10】本発明によるループ変換の適用例を示す図。
【図11】ループ分配における分割点決定の一例を示す
図。
【符号の説明】
208・・・コンパイラ、604・・・ループ分配最適
化処理、106・・・ループネスト順列決定ステップ、
107・・・拡張配列作成ステップ、108・・・拡張
配列参照への置換ステップ。

Claims (3)

    【特許請求の範囲】
  1. 【請求項1】一重または多重の外側ループの内部に複数
    の一重または多重の内側ループを包含するループに対し
    て、 複数の内側ループのそれぞれに外側ループを分配して、
    複数の多重ループに変換するループ分配ステップと、 ループ分配ステップにより生成された多重ループに対し
    て、外側ループと内側ループの入れ替えを行うループ交
    換ステップとを有するループ変換方法であって、 ループ分配ステップは、複数の内側ループ内で参照され
    る配列をより多次元に拡張した配列の参照に置換する配
    列拡張ステップを有し、 配列拡張ステップでは、ループ交換ステップによって入
    れ替えられるループ順列の予測に基づくループ順列決定
    ステップと、ループ順列決定ステップの結果に基づき、
    拡張した配列参照の添え字を決定するステップを含むこ
    とを特徴とするループ変換方法。
  2. 【請求項2】一重または多重の外側ループの内部に複数
    の一重または多重の内側ループを包含するループに対し
    て、 複数の内側ループのそれぞれに外側ループを分配して、
    複数の多重ループに変換するループ分配ステップと、 ループ分配ステップにより生成された多重ループに対し
    て、外側ループと内側ループの入れ替えを行うループ交
    換ステップとを有するコンパイラであって、ループ分配
    ステップは、複数の内側ループ内で参照される配列をよ
    り多次元に拡張した配列の参照に置換する配列拡張ステ
    ップを有し、 配列拡張ステップでは、ループ交換ステップによって入
    れ替えられるループ順列の予測に基づくループ順列決定
    ステップと、ループ順列決定ステップの結果に基づき、
    拡張した配列参照の添え字を決定するステップを含むこ
    とを特徴とするコンパイラ。
  3. 【請求項3】一重または多重の外側ループの内部に複数
    の一重または多重の内側ループを包含するループに対し
    て、 複数の内側ループのそれぞれに外側ループを分配して、
    複数の多重ループに変換するループ分配ステップと、 ループ分配ステップにより生成された多重ループに対し
    て、外側ループと内側ループの入れ替えを行うループ交
    換ステップとを有するプログラムを格納するコンピュー
    タにより読み取り可能な記憶媒体であって、 前記ループ分配ステップは、複数の内側ループ内で参照
    される配列をより多次元に拡張した配列の参照に置換す
    る配列拡張ステップを有し、 配列拡張ステップでは、ループ交換ステップによって入
    れ替えられるループ順列の予測に基づくループ順列決定
    ステップと、ループ順列決定ステップの結果に基づき、
    拡張した配列参照の添え字を決定するステップを含むプ
    ログラムを記憶する記憶媒体。
JP2002050672A 2002-02-27 2002-02-27 配列拡張によるループ変換方法 Pending JP2003256214A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2002050672A JP2003256214A (ja) 2002-02-27 2002-02-27 配列拡張によるループ変換方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2002050672A JP2003256214A (ja) 2002-02-27 2002-02-27 配列拡張によるループ変換方法

Publications (1)

Publication Number Publication Date
JP2003256214A true JP2003256214A (ja) 2003-09-10

Family

ID=28662840

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2002050672A Pending JP2003256214A (ja) 2002-02-27 2002-02-27 配列拡張によるループ変換方法

Country Status (1)

Country Link
JP (1) JP2003256214A (ja)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009211458A (ja) * 2008-03-05 2009-09-17 Nec Corp コンパイラ、変数最適化装置、方法、及び、プログラム
WO2011090032A1 (ja) * 2010-01-20 2011-07-28 株式会社日立製作所 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置
JP2019028540A (ja) * 2017-07-26 2019-02-21 富士通株式会社 情報処理装置、コンパイル方法及びコンパイルプログラム
US10824407B2 (en) 2016-01-04 2020-11-03 Nec Corporation Program conversion device, program conversion method, and non-transitory recording medium having program conversion program recorded therein

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2009211458A (ja) * 2008-03-05 2009-09-17 Nec Corp コンパイラ、変数最適化装置、方法、及び、プログラム
WO2011090032A1 (ja) * 2010-01-20 2011-07-28 株式会社日立製作所 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置
JPWO2011090032A1 (ja) * 2010-01-20 2013-05-23 株式会社日立製作所 並列処理プログラム生成方法、並列処理プログラム生成プログラム、及び並列処理プログラム生成装置
US10824407B2 (en) 2016-01-04 2020-11-03 Nec Corporation Program conversion device, program conversion method, and non-transitory recording medium having program conversion program recorded therein
JP2019028540A (ja) * 2017-07-26 2019-02-21 富士通株式会社 情報処理装置、コンパイル方法及びコンパイルプログラム

Similar Documents

Publication Publication Date Title
US4833606A (en) Compiling method for vectorizing multiple do-loops in source program
Agerwala Microprogram optimization: A survey
US6550059B1 (en) Method for generating optimized vector instructions from high level programming languages
JP2006509275A (ja) シストリックソルバを作成するシステムおよび方法
JPH02217926A (ja) コード生成方法
JP2003256214A (ja) 配列拡張によるループ変換方法
US5907711A (en) Method and apparatus for transforming multiplications into product table lookup references
Kronawitter et al. Automatic data layout transformations in the ExaStencils code generator
JP2009025973A (ja) 動作合成装置、半導体集積回路の製造方法、動作合成方法、動作合成制御プログラムおよび可読記録媒体
Kitai et al. An auto-tuning with adaptation of a64 scalable vector extension for spiral
Stitt et al. Techniques for synthesizing binaries to an advanced register/memory structure
Seiferth et al. Offsite autotuning approach: performance model driven autotuning applied to parallel explicit ODE methods
JPH10320212A (ja) キャッシュ向け最適化方法
Šinkarovs et al. Type‐driven data layouts for improved vectorisation
JP2009265708A (ja) コンパイラ及びそのコード生成方法
Liao et al. Code generation and optimization techniques for embedded digital signal processors
JP3028821B2 (ja) 並列化コンパイル方法
US7676799B1 (en) Address simplification by binary transformation
JP2000020318A (ja) メモリアクセス命令削減装置および記録媒体
JPH04307624A (ja) ループ最適化方法及び装置
Kitai et al. Adaptation of A64 Scalable Vector Extension for Spiral
WO2020116025A1 (ja) コンパイル装置、コンパイル方法、及び非一時的なコンピュータ可読媒体
JP7239827B2 (ja) 情報処理装置及びコンパイラプログラム
Gebotys A minimum-cost circulation approach to DSP address-code generation
Unnikrishnan et al. Loop transformations for reducing data space requirements of resource-constrained applications