JPH0744508A - プログラム分割方法 - Google Patents

プログラム分割方法

Info

Publication number
JPH0744508A
JPH0744508A JP5210956A JP21095693A JPH0744508A JP H0744508 A JPH0744508 A JP H0744508A JP 5210956 A JP5210956 A JP 5210956A JP 21095693 A JP21095693 A JP 21095693A JP H0744508 A JPH0744508 A JP H0744508A
Authority
JP
Japan
Prior art keywords
loop
program
processor
assignment statement
list vector
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
JP5210956A
Other languages
English (en)
Inventor
Kiyomi Umehara
清美 梅原
Makoto Sato
真琴 佐藤
Fujio Yamamoto
富士男 山本
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 JP5210956A priority Critical patent/JPH0744508A/ja
Publication of JPH0744508A publication Critical patent/JPH0744508A/ja
Priority to US08/650,008 priority patent/US5721928A/en
Pending legal-status Critical Current

Links

Classifications

    • G—PHYSICS
    • G06—COMPUTING OR CALCULATING; COUNTING
    • G06F—ELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00—Arrangements for software engineering
    • G06F8/40—Transformation of program code
    • G06F8/41—Compilation
    • G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451—Code distribution
    • G06F8/452—Loops
    • G—PHYSICS
    • G06—COMPUTING OR CALCULATING; COUNTING
    • G06F—ELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00—Arrangements for software engineering
    • G06F8/40—Transformation of program code
    • G06F8/41—Compilation
    • G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/453—Data distribution
    • G—PHYSICS
    • G06—COMPUTING OR CALCULATING; COUNTING
    • G06F—ELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00—Arrangements for software engineering
    • G06F8/40—Transformation of program code
    • G06F8/41—Compilation
    • G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/456—Parallelism detection

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Complex Calculations (AREA)

Abstract

(57)【要約】 【目的】逐次ソースプログラムを並列計算機向きに変換
する際に用いるプログラム分割方法において、代入文左
辺に現われる配列の分割方法が異なることによる結果不
正を起こさないこと、および代入文左辺に現われる配列
の添字式が異なるためにループ繰り返し範囲が拡大され
て無駄なループ繰り返しを実行するようなことがなく、
必要不可欠なループ繰り返しだけを実行し、性能向上を
図ることを目的とする。 【構成】各代入文の左辺の配列要素が割り付けられてい
るプロセッサでその代入文を実行するように、ループ内
の各代入文に対応するループ添字の和集合をリストベク
トルとし、ループ実行範囲をリストベクトルの範囲に絞
る。リストベクトルは、言語変換時に決定する方法と実
行時に計算するようなプログラムを追加する方法があ
る。ループ内の各代入文は、和集合のうち対応する部分
集合だけを実行するようにする。 【効果】結果不正を起こすことなく、無駄なループ繰り
返しもないようにできる。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、並列計算機向け言語変
換システムにおけるプログラム分割方法に関し、特に、
データ分割指示(分散記憶型並列計算機の各プロセッサ
へのデータの割り付け方に関する指示)付きの逐次ソー
スプログラムを入力とし、分散記憶型並列計算機向きの
並列ライブラリの呼び出しを含むソースプログラムまた
はオブジェクトプログラムを生成するためのプログラム
分割方法に関する。
【0002】
【従来の技術】計算速度の向上のために、プロセッサを
複数台並べて同時に動作させる並列計算機システムが考
案されてきた。並列計算機システムでは、通常、複数台
ある各プロセッサは、それぞれローカルメモリを備えて
いる。
【0003】一方、従来のシングルプロセッサ向きにコ
ーディングされたソースプログラムは、単一メモリを仮
定している。従って、シングルプロセッサ向きにコーデ
ィングされたソースプログラムを並列計算機システムで
動作させる場合は、ソースプログラム中のデータ(配列
など)を複数のデータ群に分割して、並列計算機システ
ムの各プロセッサのローカルメモリに割り付けて計算を
行う必要がある。
【0004】このとき、演算を各プロセッサに分配する
方法として、「代入文の左辺の変数が割り付けられてい
るプロセッサで、その代入文を実行する」という原則
で、ソースプログラムを並列化変換する。以後、このよ
うなシングルプロセッサ向きの逐次ソースプログラムの
並列化変換をプログラム分割と呼ぶ。
【0005】以下、従来のプログラム分割の方式につい
て説明する。なお、ここではDOループを対象として説
明する。
【0006】元の逐次ソースプログラムにおいて、代入
文がループ内で繰り返し計算される場合は、上記の原則
が成り立つように、ループ繰り返しの範囲を分割して、
それを各プロセッサに割り付ける。
【0007】そのようなプログラム分割方法に関する説
明は、例えば、バサンス・バラサンダラム,ジオフェリ
・フォックス,ケン・ケネディ,ウルリッチ・クレマ共
著”データ分割とデータ分散に対する対話環境”(Va
santh Balasundaram,Geoffr
ey Fox,Ken Kennedy and Ul
rich Kremer:”An Interacti
ve Environment for Data P
artitioning and Distribut
ion”)(Fifth Distributed M
emory Computing Conferenc
e,Charleston,SouthCarolin
a,April9−12,1990,pp1160−1
170)にある。
【0008】この論文でのプログラム実行方式は、デー
タ・オーナー・コンピューツ・ルール(data ow
ner computes rule)に基づいた、S
PMD(Single Program Multip
le Data)である。ここで、SPMDとは、各プ
ロセッサが同じプログラムを持つことをいう。データ・
オーナー・コンピューツ・ルールとは、配列要素が割り
当てられているプロセッサのみが、その配列要素の定義
を実行するようにすることである。
【0009】従って、プログラム分割決定方法では、デ
ータの分割の仕方とその分割単位のプロセッサへの割り
付けに基づいて、各代入文の左辺の配列要素が割り付け
られているプロセッサでその代入文を実行するようにプ
ログラム分割する。そのため、プログラム分割処理で
は、元の逐次ソースプログラムとデータ分割情報を入力
して、変更したソースプログラムとプログラム分割情報
を出力する。
【0010】ここで、データ分割情報とは、下記の〜
の情報をいう。
【0011】データの分割の仕方とその分割単位のプ
ロセッサへの割り付け方を示すデータ分割関数(配列要
素のインデックスから、データを割り付けたプロセッサ
番号への写像) 各配列要素のインデックスを元の逐次プログラムでの
グローバルインデックスから各プロセッサのローカルイ
ンデックスへ変換する局所化関数 上記局所化関数の逆関数で、ローカルインデックスか
らグローバルインデックスへ変換する大域化関数から成
る関数群 これらの関数群を適用して得られる、各プロセッサご
との配列要素のインデックスのグローバル表現とローカ
ル表現を格納するデータ分割テーブル
【0012】プログラム分割情報とは、下記のおよび
の情報をいう。
【0013】各代入文に対して、元のループ反復範囲
のうち、各プロセッサで分担実行すべきループ反復範囲
を示すために、ループインデックスの値の取り得る範囲
をプロセッサ番号を用いた式で表現したプログラム分割
式テーブル 各プロセッサごとに、実際に参照するループインデッ
クスの具体的な値で表現したプログラム分割値テーブル
【0014】以下、従来法によるプログラム分割方法に
ついて詳しく説明する。
【0015】まず、添字関数とローカル・イテレーショ
ン・セット(Local Iteration Se
t:以下、LITSと略す)について説明する。
【0016】図2は、添字関数を説明するためのプログ
ラムの例である。同図において、201と202はルー
プを示している。多重ループ201において、A(S
1,S2,…,Sm)は、配列Aの参照(定義または使
用)である。各Skは、ループインデックス変数I1,
I2,…,Inおよびこの参照を包含するループ内で不
変な式を使って表現される添字式である。
【0017】ここで、配列A(S1,S2,…,Sm)
に対する添字関数fとは、ループインデックス変数I
1,I2,…,Inの値の組に対し、各次元の添字式S
1,S2,…,Smの値を決める関数をいう。すなわ
ち、この例では、 f(I1,I2,…,In)=(S1,S2,…,S
m) である。
【0018】添字関数fの逆関数inv_f(D1,D
2,…,Dm)=(I1,I2,…,In)は、配列添
字の値の組D1,D2,…,Dmに対して、その配列参
照を包含するループインデックス変数I1,I2,…,
Inの各々の値を決める関数である。
【0019】すなわち、配列添字値D1,D2,…,D
mに関して、連立方程式:S1=D1,S2=D2,
…,Sm=Dmを、インデックス変数I1,I2,…,
Inについて解くことにより、添字関数fの逆関数in
v_fが求められる。
【0020】例として、ループ202では、配列参照A
(I+J,J−1)に対する添字関数fは、f(I,
J)=(I+J,J−1)である。また、逆関数inv
_f(C,D)は、2つの連立方程式I+J=C;J−
1=Dを、I,Jについて解くことにより、inv_f
(C,D)=(C−(D+1),D+1)となる。すな
わち、配列要素添字(C,D)に対して、対応するルー
プインデックスの値として、I=C−(D+1),J=
D+1を得る。
【0021】この逆関数を使うことにより、A(5,
2)は、I=5−(2+1)=2,J=2+1=3のと
き参照されるが、A(3,3)は、I=3−(3+1)
=−1,J=3+1=4であり、反復範囲外となるの
で、ループ202では参照されないことがわかる。
【0022】LITS(ローカル・イテレーション・セ
ット)とは、各代入文に対して、元のループ反復範囲の
うち、各プロセッサで分担実行すべきループ反復範囲
を、そのプロセッサでのループインデックスの値の取り
得る範囲として表現したものである。
【0023】図3は、LITSを求める処理手順を示
す。LITSを求める処理108では、データ分割情報
105と中間語103を入力して、プログラム分割情報
110を出力する。
【0024】LITSを求める処理の手順を説明する。
まず、配列のローカル・インデックス・セット(Loc
al Index Set:以下、LIXSと略す)を
計算する処理301で、データ分割情報105のデータ
分割テーブル302(図12)を参照して、各プロセッ
サごとのLIXSを得る。
【0025】LIXSとは、元のデータ(配列の要素)
が各プロセッサに割り付けられた場合、各プロセッサに
ある配列要素のインデックス値の集合である。このイン
デックスの値は、各プロセッサでのローカルな値であ
る。配列Aに対するプロセッサpでのLIXSを、LI
XS_A(p)と表す。
【0026】次に、LIXSをグローバルインデックス
で表現し直す処理303で、データ分割情報105の大
域化関数304によって、LIXS_A(p)をグロー
バルインデックスで表現したものGIXS_A(p)を
得る。これにより、各プロセッサでのローカルなインデ
ックス値であるLIXS_A(p)から、元のプログラ
ムにおけるインデックス値で表現されたグローバルイン
デックスの集合GIXS_A(p)が得られる。
【0027】次に、添字関数の逆関数を計算する処理3
05では、中間語103から、代入文左辺配列A(S
1,S2,…,Sm)に対して、添字関数の逆関数in
v_fを計算する。
【0028】そして、各プロセッサに対するループ仮想
反復範囲を計算する処理306で、各プロセッサpにつ
いて、添字関数の逆関数inv_fをLIXS_A
(p)に適用することによって、代入文左辺配列A(S
1,S2,…,Sm)に対する、プロセッサpでのロー
カルなループの仮想反復範囲VLITS_A(p)を求
める。同様に、逆関数inv_fをGIXS_A(p)
に適用することによって、グローバルなループの仮想反
復範囲VGITS_A(p)を求める。
【0029】ここで、VLITS_A(p)やVGIT
S_A(p)は、元のループ繰り返し範囲を考慮せず
に、LIXS_A(p)から求めた繰り返し範囲であ
る。従って、元のループ繰り返し範囲を外れている可能
性があり、そこで「仮想」と呼んでいる。
【0030】最後に、処理307で、ループ仮想反復範
囲からLITSを求める。この処理307は、詳しくは
以下の手順で行う。
【0031】まず、中間語103から、VGITS_A
(p)とループインデックスの全区間との積集合(in
tersection)を計算し、その結果をGITS
_A(p)とする。GITS_A(p)は、着目してい
る代入文の配列Aに対するプロセッサpでのGITS
(グローバル・イテレーション・セット)を表す。GI
TSとは、各代入文に対して、元のループ反復範囲のう
ち各プロセッサで分担実行すべきループ反復範囲を、元
のプログラムにおけるグローバルなループインデックス
の値の取り得る範囲として、表現したものである。
【0032】仮想反復範囲VLITS_A(p)は、V
GITS_A(p)と直接対応するものなので、VGI
TS_A(p)とGITS_A(p)の差分(diff
erence)を、VLITS_A(p)に反映して、
配列Aに対するプロセッサpでのローカル・イテレーシ
ョン・セットLITS_A(p)を求める。そして、得
られたLITS_A(p),GITS_A(p)は、プ
ログラム分割情報110のPRG分割式テーブル308
(図13)に格納する。
【0033】図4は、LITSを求めて、プログラム分
割する例を示している。401は、元の逐次ソースプロ
グラムである。402は、配列データ分割パターンであ
る。114は、プログラム分割後の各プロセシング・エ
レメント(Processing Element:以
下、PEと略す)のノードプログラムである。
【0034】図3および図4を参照して、プログラム4
01をプログラム分割する手順を説明する。このプログ
ラム401における配列Aを、データ分割パターン40
2に従って、4つのPEに割り付ける。
【0035】まず、処理301では、データ分割パター
ンに従って、配列Aについての各プロセッサのLIXS
を求める。ここでは、 LIXS_A(p)=[1:25,1:100],(p
=0,1,2,3) である。ここで、[]内に並んでいる複数個の値の区間
は左のものほど、外側のループのインデックスに対応し
ている。すなわち、「1:25」の区間は外側のインデ
ックス変数Iのループに対応し、「1:100」の区間
は内側のインデックス変数Jのループに対応している。
【0036】処理303では、LIXS_A(p)に対
応するGIXS_A(p)を求める。ここでは、 GIXS_A(1)=([1:25],[1:10
0]) GIXS_A(2)=([26:50],[1:10
0]) GIXS_A(3)=([51:75],[1:10
0]) GIXS_A(4)=([76:100],[1:10
0]) となる。
【0037】処理305では、添字関数の逆関数を計算
する。代入文の左辺配列参照A(I−1,J)に対する
添字関数fは、f(I,J)=(I−1,J)であるか
ら、添字関数fの逆関数は、inv_f(C,D)=
(C+1,D)である。
【0038】処理306で、この逆関数inv_fをL
IXS_A(p)に適用することによって、A(I−
1,J)に対するプロセッサpでのループ仮想反復範囲
(元のループ反復でのローカルインデックスで表現した
範囲)VLITS_A(p)を求めると、 VLITS_A(p)=inv_f(LIXS_A
(p)) =inv_f([1:25],[1:100]) =([2:26],[1:100]) (p=1,2,3,4) となる。
【0039】また、逆関数inv_fをGIXS_A
(p)に適用することによってVGITS_A(p)を
求めると、 VGITS_A(1)=inv_f(GIXS_A
(1))=([2:26],[1:100]) VGITS_A(2)=inv_f(GIXS_A
(2))=([27:51],[1:100]) VGITS_A(3)=inv_f(GIXS_A
(3))=([52:76],[1:100]) VGITS_A(4)=inv_f(GIXS_A
(4))=([77:101],[1:100]) となる。
【0040】処理307では、VGITS_A(p)と
元のループの反復の全範囲([2:99]、[2:10
0])との積集合(intersection)の結果
として、GITS_A(p)を求めると、 GITS_A(1) =VGITS_A(1)∩([2:99],[2:100]) =([2:26],[2:100]) GITS_A(2) =VGITS_A(2)∩([2:99],[2:100]) =([27:51],[2:100]) GITS_A(3) =VGITS_A(3)∩([2:99],[2:100]) =([52:76],[2:100]) GITS_A(4) =VGITS_A(4)∩([2:99],[2:100]) =([77:99],[2:100]) となる。
【0041】VGITS_A(p)とGITS_A
(p)に相違があるのは、p=3の場合の([77:1
01]、[1:100])対([77:99]、[2:
100])だけである。この相違(反復範囲の縮小)
を、VLITS_A(p)に反映して、最終的なLIT
S_A(p)を求めると、 LITS_A(1)=([2:26],[2:10
0]) LITS_A(2)=([2:26],[2:10
0]) LITS_A(3)=([2:26],[2:10
0]) LITS_A(4)=([2:26−2],[2:10
0])=([2:24],[2:100]) となる。
【0042】以上、LITSを求める処理108の結果
として、配列Aの宣言とDOループ反復範囲は、各PE
のノードプログラム114で示すようになる。
【0043】一般に、LITSは、各代入文ごとに変わ
り得る。従来法では、下記の2つの場合しか扱っていな
い。2つの場合とは、同一ループ内の各代入文が同一G
ITSである場合と、各代入文が異なるGITSであっ
ても、ループ分割可能であり、ループ分割した結果、ル
ープ内の各代入文が同一GITSになる場合である。
【0044】図5は、同一ループ内の各代入文が異なる
GITSで、ループ分割可能な例を示している。501
は、元の逐次ソースプログラムである。502は配列A
のデータ分割パターンで、503は配列Bのデータ分割
パターンである。114は、プログラム分割の結果得ら
れる各PEのノードプログラムである。
【0045】逐次ソースプログラム501をプログラム
分割するとき、配列Aはデータ分割パターン502に従
って4つのPEに割り付け、配列Bはデータ分割パター
ン503に従って、データ分割せずに全配列データを4
つのPEに割り付ける。配列Aに対する代入文と配列B
に対する代入文は依存関係がないので、ループ500は
ループ分割でき、各代入文ごとにループを生成する。
【0046】各PEのノードプログラム114におい
て、配列Aへの代入のためのループ510と、配列Bへ
の代入のためのループ520では、ループ制御変数Iの
ループ繰り返し範囲は、それぞれ1から4までと1から
16までになる。
【0047】また、別の論文、シーマ・ヒラナンダニ,
ケン・ケネディ,チョウ・ウンスク共著”MIMD分散
メモリ型計算機に対するFORTRAN D コンパイ
ル方式”(Seema Hiranandani,Ke
n Kennedy andChau−Wen Tse
ng:”Compiling FORTRAN Dfo
r MIMD Distributed−Memory
Machines”)(COMMUICATIONS
OF THE ACM,August1992,Vo
l.35,No.8,pp66−80)では、ループ内
にある各代入文に対して、各代入文のLITSの和集合
ULITS(このとき、ULITSは等差数列になるよ
うにする)をとり、各代入文はULITSのうち対応す
る元のLITSだけを実行するようにしている。
【0048】図6は、同一ループ内の各代入文が、異な
るGITSを持つ場合のプログラム分割例を示してい
る。601は、元の逐次ソースプログラムである。60
2は、配列データ分割パターンである。114は、プロ
グラム分割の結果得られる各PEのノードプログラムで
ある。
【0049】逐次ソースプログラム601をプログラム
分割するとき、配列Aはデータ分割パターン602に従
って、4つのPEに割り付ける。
【0050】代入文604はLITS_A(p)=
[1:4]、代入文605はLITS_A(p)=[1
3:16]なので、これらの和集合ULITS_A
(p)=[1:4]∪[13:16]となる。ループ繰
り返し範囲は、この和集合が連続する範囲である[1:
16]とする。プログラム分割の結果、各PEのノード
プログラムは114に示すものとなる。
【0051】
【発明が解決しようとする課題】ところで、上記従来技
術では、ループ内にある複数の代入文の左辺に現われる
配列の分割方法が異なる場合、各代入文ごとに、LIT
Sに対応するGITSが異なるにもかかわらずLITS
を共有することになる。従って、各プロセッサで、各代
入文間の実行順序が元の逐次プログラムでの実行順序と
異なることがあり、結果が不正となる可能性がある。
【0052】図7は、同一ループ内にある複数代入文の
左辺に現われる配列の分割方法が各々異なるために、各
プロセッサのループの各回で、代入文間の実行順序が逐
次の実行順序と異なる例を示している。701は、元の
逐次ソースプログラムである。702と703は、配列
データ分割パターンである。114は、プログラム分割
の結果得られる各PEのノードプログラムである。
【0053】逐次ソースプログラム701をプログラム
分割するとき、配列Aのデータ分割パターン702と、
配列Bのデータ分割パターン703より、代入文704
に対するLITS_A(p)=[1:4]、代入文70
5に対するLITS_B(p)=[1:4]となる。従
って、ループ700におけるループ制御変数Iのループ
繰り返し範囲は、1から4までとなる。
【0054】これは、プロセッサPE1では、I=1の
ときA(1)とB(1)の計算を、I=2のときA
(2)とB(5)の計算を、それぞれ実行することにな
る。
【0055】ところが、B(5)の計算では、I=4で
定義されるA(4)を使用しなければならないので、B
(5)の計算において未定義のA(4)を使用すること
になり、結果が不正になる。
【0056】さらに、図6のように代入文左辺に現われ
る配列の添字式が異なる場合に、前述のようにループ繰
り返し範囲を拡大すると、実際には代入文が実行されな
いループ繰り返しも回ることになる(例えば、図6のノ
ードプログラム114のDOループでI=5〜12のと
き)ので、無駄なループ繰り返しがあり性能向上が図れ
ない。
【0057】本発明は、逐次ソースプログラムを並列計
算機向きに変換する際に用いるプログラム分割方法にお
いて、代入文左辺に現われる配列の分割方法が異なるこ
とによる結果不正を起こさないこと、および代入文左辺
に現われる配列の添字式が異なるためにループ繰り返し
範囲が拡大されて無駄なループ繰り返しを実行するよう
なことがなく、必要不可欠なループ繰り返しだけを実行
し、性能向上を図ることを目的とする。
【0058】
【課題を解決するための手段】上記目的を達成するた
め、本発明は、逐次ソースプログラムを入力して、分散
記憶型並列計算機向きの並列化ソースプログラムまたは
オブジェクトプログラムを生成する言語変換システムに
おいて、該逐次ソースプログラム中のループに対し、各
プロセッサが分担して計算するループ繰り返し範囲を求
めるプログラム分割方法であって、上記逐次ソースプロ
グラム中で宣言されているデータの各プロセッサへの割
り付け方を示すデータ分割指示情報を入力するステップ
と、各プロセッサごとに、ループ内の各代入文の代入先
のデータが該プロセッサに割り付けられているときのル
ープインデックスの和集合をリストベクトルとして保持
するステップと、該プロセッサでのループ実行回数をそ
のリストベクトルの要素数とするとともに、ループ内の
代入文に現れるループインデックスを上記リストベクト
ルの参照に置き換えるステップとを備えたことを特徴と
する。
【0059】前記リストベクトルは、言語変換時に決定
できる場合は、言語変換時に決定してその値を並列化プ
ログラムに登録し、プログラム中で参照できるようにす
るとよい。また、実行時にリストベクトルを計算する処
理を、並列化プログラムに含めるようにしてもよい。
【0060】さらに、本発明は、逐次ソースプログラム
を入力して、分散記憶型並列計算機向きの並列化ソース
プログラムまたはオブジェクトプログラムを生成する言
語変換システムにおいて、該逐次ソースプログラム中の
ループに対し、各プロセッサが分担して計算するループ
繰り返し範囲を求めるプログラム分割方法であって、上
記逐次ソースプログラム中の配列の各プロセッサへの割
り付け方を示すデータ分割指示情報を入力するステップ
と、該データ分割指示情報に基づいて、ループ内の各代
入文ごとに、その代入文に対して元のループ反復範囲の
うち各プロセッサで分担実行すべきループ反復範囲を示
すループインデックスの集合であるグローバル・イテレ
ーション・セットを求めるステップと、各プロセッサご
とに、ループ内のすべての代入文に対応する上記グロー
バル・イテレーション・セットの和集合を求め、該和集
合の要素をソートしてリストベクトルとして保持するス
テップと、各プロセッサでのループ反復回数を上記リス
トベクトルの要素数とするとともに、ループ内の代入文
の配列の添字式中のループインデックスを上記リストベ
クトルの参照に置き換えるステップとを備えたことを特
徴とする。
【0061】また、逐次ソースプログラムを入力して、
分散記憶型並列計算機向きの並列化ソースプログラムま
たはオブジェクトプログラムを生成する言語変換システ
ムにおいて、該逐次ソースプログラム中のループに対
し、各プロセッサが分担して計算するループ繰り返し範
囲を求めるプログラム分割方法であって、上記逐次ソー
スプログラム中の配列の各プロセッサへの割り付け方を
示すデータ分割指示情報を入力するステップと、該デー
タ分割指示情報に基づいて、ループ内の各代入文ごと
に、その代入文に対して元のループ反復範囲のうち各プ
ロセッサで分担実行すべきループ反復範囲を示す下限
式、上限式、および増分式を求めるステップと、上記下
限式、上限式、および増分式を用いて、各代入文に対応
するループ反復範囲を示すループインデックス値の集合
を算出する文を生成するステップと、各プロセッサごと
に、ループ内のすべての代入文に対応する上記ループイ
ンデックス値の集合の和集合を求め、該和集合の要素を
ソートしてリストベクトルとして設定する文を生成する
ステップと、各プロセッサでのループ反復回数を上記リ
ストベクトルの要素数とするとともに、ループ内の代入
文の配列の添字式中のループインデックスを上記リスト
ベクトルの参照に置き換えるステップとを備えたことを
特徴とする。
【0062】さらに、任意のループインデックスに対し
て、前記リストベクトルの該ループインデックス番目の
要素が前記ループ内の代入文のグローバル・イテレーシ
ョン・セットに含まれるときのみその代入文を実行する
ように変更してもよい。
【0063】
【作用】本発明によれば、各プロセッサごとに、ループ
内の各代入文の代入先のデータが該プロセッサに割り付
けられているときのループインデックスの和集合をリス
トベクトルとして求めている。従って、代入文ごとのG
ITS(グローバル・イテレーション・セット)の和集
合をループ繰り返しの範囲とすることになり、従来例の
ようにGITSが異なるにもかかわらずLITS(ロー
カル・イテレーション・セット)を共有するようなこと
がないので、結果不正にならない。
【0064】また、各代入文のLITSが互いに排反で
LITSが非連続になる場合でも、リストベクトルの要
素数の回数だけループ繰り返しを行うようにしており、
さらにリストベクトルの値がGITSに含まれるときの
みその代入文を実行するようにしているので、無駄なル
ープ繰り返しを行なうことがない。
【0065】
【実施例】以下、本発明の実施例を図1および図8から
図24を用いて説明する。
【0066】図1は、本発明に係るプログラム分割方法
を適用した自動並列化変換システムにおける処理手順の
概要を示す。
【0067】自動並列化処理100では、まず構文解析
処理102で、データ分割指示付きソースプログラム1
01を入力し、これを中間語103に変換し、辞書10
4に登録して、データ分割情報105を設定する。
【0068】プログラム分割処理106(図8,図9)
は、この中間語103とデータ分割情報105を入力
し、プログラム分割処理方法判定部107で判定して、
単一文におけるプログラム分割処理108(図3)、ま
たはリストベクトルによるプログラム分割処理109
(図10,図11)を実行し、結果をプログラム分割情
報110として格納し、中間語103と辞書104を変
更、追加する。
【0069】次に、このプログラム分割情報110、中
間語103、およびデータ分割情報105を入力し、非
局所データの有無を解析して、非局所データ解析情報1
12を設定し、プロセッサ間通信生成処理111を行
い、中間語103を変更する。非局所データとは、自プ
ロセッサのローカルメモリに無いデータ(すなわち、他
のプロセッサから通信により得ることが必要であるデー
タ)のことである。
【0070】最後に、この中間語103と辞書104、
およびデータ分割情報105とプログラム分割情報11
0を入力して、ノードプログラム生成処理113を行
い、各プロセッサで動作させるノードプログラム114
を出力する。
【0071】次に、図1のプログラム分割処理106に
おいて用いている各種の情報について説明する。
【0072】図12は、データ分割情報105に設定さ
れるデータ分割テーブル302を示す。データ分割テー
ブル302は、ソースプログラム中の各配列の各次元に
おけるGIXSとLIXSとを格納(詳しくは、GIX
SやLIXSへのポインタを格納)するテーブルであ
る。
【0073】データ分割テーブル302は、配列名12
01と、配列の各次元へのポインタDIMp1202か
ら成る。ポインタDIMp1202で指された各次元の
情報は、次元番号1203と、GIXS(図15)への
ポインタGIXSp1204と、LIXS(図15)へ
のポインタLIXSp1205と、次の次元へのポイン
タDIMp1202から成る。
【0074】図13は、プログラム分割情報110のP
RG(プログラム)分割式テーブル308を示す。PR
G分割式テーブル308は、プログラム分割対象の各ル
ープの分割に関するデータを格納するテーブルである。
【0075】すなわち、PRG分割式テーブル308
は、ループ番号1301と、次のループに関するデータ
へのポインタ1302と、処理番号1303と、LIT
S(図15)へのポインタLITSp1304と、ルー
プに含まれる文へのポインタ1305からなる。処理番
号1303とは、そのループに係るプログラム分割処理
が、単一代入文に対する方法か、静的リストベクトルに
よる方法か、または動的リストベクトルによる方法かを
示す番号である。各方法の手順は、後述する。
【0076】ポインタ1305で指されるループ内の文
に関するデータは、文番号1306と、この文に対する
GITS(図15)へのポインタGITSp1307
と、次の文へのポインタ1305から成る。
【0077】図14は、プログラム分割情報のPRG
(プログラム)分割値テーブル808を示す。PRG分
割値テーブル808は、プログラム分割対象の各ループ
の分割に関するデータを格納するテーブルである。上記
の図13のPRG分割式テーブルと同様のデータを格納
するが、図13のPRG分割式テーブルでは式の形式で
各ループのLITSや各文のGITSを格納するのに対
し、図14のPRG分割値テーブル808では具体的な
値で格納する。
【0078】PRG分割値テーブル808は、ループ番
号1301、次のループへのポインタ1302、および
プロセッサごとのLITSに関するテーブルへのポイン
タ1401を備えている。
【0079】ポインタ1401で指されたプロセッサご
とのLITSに関する情報は、プロセッサ(PE)番号
1402、次のプロセッサのLITS情報へのポインタ
1401、LITS(図15)へのポインタLITSp
1304、リストベクトルL1404へのポインタLI
STp1403、およびループ内に含まれる文へのポイ
ンタ1305から成る。
【0080】ポインタ1305で指されるループ内の文
に関する情報は、文番号1306、GITS(図15)
へのポインタGITSp1307、および次の文へのポ
インタ1305から成る。
【0081】リストベクトルは各ループに対応して設け
られる1次元配列である。その配列の要素数は、対応す
るループの繰り返し回数である。リストベクトルの各要
素には、ループ内の各代入文のGITSがソートして格
納される。リストベクトルについては、後の具体例など
で詳述する。
【0082】図15は、上述したポインタGIXSp1
204,LIXSp1205,LITSp1304,G
ITSp1307で指されるテーブルを示す。
【0083】これらは共通のテーブルで表わすことがで
き、それは、先頭プロセッサの範囲式へのポインタpr
e_RANGEp1501、中間プロセッサに対する範
囲式へのポインタmid_RANGEp1502、終端
プロセッサに対する範囲式へのポインタpost_RA
NGEp1503から成る。
【0084】範囲式は、下限式へのポインタ1504、
上限式へのポインタ1505、増分式へのポインタ15
06、および非連続で等差数列で表現できない範囲式同
士をリストでつなぐための次の範囲式へのポインタ15
07から成る。
【0085】次に、図1のプログラム分割処理106に
ついてさらに詳細に説明する。ここでは、プログラム分
割処理として、静的プログラム分割処理および動的プロ
グラム分割処理の2つの処理方式を説明する。静的プロ
グラム分割処理とは、ソースプログラムのコンパイル時
にループの繰り返し範囲が確定できる場合のプログラム
分割処理である。動的プログラム分割処理とは、そのプ
ログラムを実行したときにループの繰り返し範囲を確定
するプログラム分割処理である。
【0086】まず、静的プログラム分割処理について説
明する。
【0087】図8は、プログラム分割処理部106にお
ける静的プログラム分割処理の処理手順を示す。プログ
ラム分割処理部106は、中間語103、辞書104、
およびデータ分割情報105を入力して、処理を開始す
る。
【0088】まず、終了判定部801でプログラムが終
りであるか否かを判定する。終りであれば、プログラム
分割処理106は終了となる。そうでなければ、ソース
プログラム中の次のループをみつける処理802を行
う。
【0089】ループがみつかったら、そのループ内の代
入文が単一か複数かの判定803を行う。そのループ内
に代入文が1つしかないなら、従来方法でプログラム分
割すればよいから、まずデータ分割情報105にあるデ
ータ分割テーブル302(図12)と大域化関数304
を参照して代入文のGITSを計算し、計算結果をプロ
グラム分割情報110にあるPRG分割式テーブル30
8(図13)ヘ書き込む処理108(図3)を行う。
【0090】さらに、LITSを計算して、計算結果と
プログラム分割処理番号0とをPRG分割式テーブル3
08(図13)ヘ書き込む処理を行い、再び処理801
に戻る。プログラム分割処理番号0は、プログラム分割
処理が、単一代入文に対する方法であることを明示する
ためのものである。
【0091】一方、ループが複数の代入文を含む場合
は、ループ分割可否判定部804で、ループを分割する
ことが可能か否か判定する。ループ分割可能なら、図5
で説明したのと同様にしてループ分割処理805を行
い、再びループ分割した各ループについて判定803を
行う。
【0092】ループ分割不可能なら、データ分割情報1
05のデータ分割テーブル302(図12)と大域化関
数304を参照して、各代入文のGITSを計算する処
理108(図3)を実行し、結果をPRG分割式テーブ
ル308(図13)へ書き込む。そして、各代入文のG
ITSが同一であるか否かの判定806を行う。
【0093】この結果、同一GITSであれば、単一代
入文のときと同様になり、LITSを計算する処理10
8(図3)を行い、PRG分割式テーブル308(図1
3)へ計算結果とプログラム分割処理番号0を書き込
む。
【0094】各代入文のGITSが異なるなら、PRG
分割式テーブル308(図13)を参照して、静的リス
トベクトル計算処理生成807(図10)を実行し、結
果をPRG分割値テーブル808(図14)へ書き込
む。そして、再び、判定801に戻る。静的リストベク
トル計算処理生成807の詳細は後述する。
【0095】次に、動的プログラム分割処理について説
明する。
【0096】図9は、動的プログラム分割処理の処理手
順を示す。同図の処理手順は、図8の静的プログラム分
割処理の処理手順とほぼ同じであるが、下記の点が異な
る。すなわち、図8の静的リストベクトル計算処理生成
部807(図10)に代えて、動的リストベクトル計算
処理生成部901(図11)とし、プログラム分割情報
110のプログラム分割式テーブル308(図13)を
入力して、中間語103に新たに動的リストベクトル計
算処理を行う中間語を追加するようにしている。動的リ
ストベクトル計算処理生成部901の詳細は後述する。
【0097】図10は、静的リストベクトル計算処理生
成の詳細な処理手順を示す。静的リストベクトル計算処
理生成部807は、中間語103と、プログラム分割情
報110のPRG分割式テーブル308(図13)を入
力し、中間語103を変更し、プログラム分割情報11
0に、PRG分割値テーブル808(図14)を追加す
る。
【0098】まず、プログラム分割情報110のPRG
分割式テーブル308(図13)の処理番号を1に設定
し、このPRG分割式テーブル308(図13)のルー
プ番号および文番号をPRG分割値テーブル808(図
14)へ複写する処理1001を行う。処理番号を1に
設定するのは、プログラム分割処理が静的リストベクト
ルによる方法であることを明示するためである。
【0099】次に、PRG分割式テーブル308(図1
3)のGITSから、各プロセッサごとに、具体的なG
ITSの値を計算する処理1002を実行して、計算結
果をPRG分割値テーブル808(図14)へ格納す
る。
【0100】次に、リストベクトルとして、元のループ
繰り返し回数の大きさ(要素数)の配列を、プロセッサ
台数分用意する処理1003を行う。リストベクトル
は、PRG分割値テーブル808(図14)内に用意す
る。
【0101】その後、以下の処理1004を行う。すな
わち、プロセッサ番号pごとに、PRG分割値テーブル
808(図14)の各代入文のGITSの和集合を計算
する。そして、重複を除いたその和集合の要素数をnと
するとき、各要素を、プロセッサ番号pに対応するリス
トベクトルLp(1:n)に、格納する。格納する際に
は、元のループの増分値が正なら昇順に、負なら降順に
ソートして格納するようにする。
【0102】次に、対象ループの繰り返し範囲LITS
を[1:n:1]とし、各代入文の中間語を「Lp
(I)が各代入文のGITSに含まれるときのみ、その
文を実行する」ような中間語に変更する処理1005を
行う。なお、ループの繰り返し範囲[l:u:d]は、
lが下限、uが上限、dが増分値を表すものとする。I
は、対象ループのループインデックス変数(ループ制御
変数)である。
【0103】最後に、代入文の配列添字を、Lp(I)
となるような中間語に変える処理1006を行う。
【0104】図11は、動的リストベクトル計算処理生
成の詳細な処理手順を示す。動的リストベクトル処理生
成部901は、中間語103、およびプログラム分割情
報110を入力する。
【0105】初めに、プログラム分割情報110のPR
G分割式テーブル308(図13)の処理番号を2に設
定する処理1101を実行する。これは、プログラム分
割処理が、動的リストベクトルによる方法であることを
明示するためである。
【0106】次に、ループ内の代入文の数をmとし、配
列GITSk(k=1,…,m)を宣言し、辞書104
に登録する処理1102を行う。各配列GITSk(k
=1,…,m)の大きさ(要素数)は、それぞれ、PR
G分割式テーブル308(図13)の各GITSk(k
=1,…,m)の要素数の大きさと同じとする。
【0107】そして、各代入文(k=1,…,m)ごと
に、PRG分割式テーブル308(図13)内のGIT
Skの範囲式を参照して、ループ中間語を生成し、中間
語1104をループ内の文となるように、ループ中間語
につなぐ処理1103を実行する。中間語1104と
は、「各代入文(k=1,…,m)に対応する配列GI
TSkのインデックスIを1だけ増やし、このときのル
ープインデックスの値をGITSk(I)へ格納する」
である。言い替えると、処理1103では、各代入文
(k=1,…,m)ごとのGITSの具体的な値を求め
て配列GITSk(I)へ格納する処理を行うような中
間語を生成する処理を行う。
【0108】それから、処理1103で求めた同一ルー
プ内の全代入文に対する配列GITSk(k=1,…,
m)を入力とし、これらの和集合をとって、重複を除く
要素数nを返し、分割対象ループの増分値が正なら昇順
に負なら降順にマージソートしてリストベクトルの配列
Lに設定するサブルーチンを、処理1103で追加した
DOループ中間語の直後に追加する処理1105を実行
する。これにより、リストベクトルLを設定する中間語
が、上記処理1103で生成した中間語の後に追加され
たことになる。
【0109】その後、各代入文の配列GITSkを参照
するためのインデックス変数を初期化する中間語を生成
して、上記処理1105で生成した中間語の後に追加す
る処理1106を実行する。
【0110】以上、処理1103、1105、1106
で新たに生成した中間語を、ユーザのDOループ中間語
の直前に挿入する処理1107を実行する。
【0111】次に、ユーザのDOループ繰り返しの範囲
を[1:n:1]([下限:上限:増分値]の意)と
し、ループ内の各代入文の中間語を「L(I)が各代入
文のGITSに含まれるときのみ、その文を実行する」
ような中間語に変える処理1005を行う。Iは、対象
ループのループインデックス変数(ループ制御変数)で
ある。
【0112】最後に、各代入文の配列のインデックスを
L(I)となるような中間語に変える処理1006を行
う。
【0113】以上で、動的リストベクトル計算処理を終
える。静的リストベクトル計算処理は、リストベクトル
の具体的な値を求めて、それを参照するようにプログラ
ムを変える。これに対し、動的リストベクトル計算処理
は、プログラムの実行時にリストベクトルの値を求める
ような中間語を追加する。すなわち、リストベクトルの
具体的な値は、プログラムの実行時に求められ、その値
が参照される。
【0114】次に、上述の図1および図8〜図11で説
明した自動並列化処理100によって、図7の逐次ソー
スプログラム701についてプログラム分割処理106
を行う具体例を説明する。
【0115】図16は、図7の逐次ソースプログラム7
01の配列Aのデータ分割テーブル302を示す。配列
A(0:17)は、図1の構文解析処理102におい
て、図7のデータ分割パターン702に従ってデータ分
割される。
【0116】配列Aに対するGIXSとLIXSは、具
体的には以下のようになる。なお、配列Aに対するプロ
セッサpでのGIXSをGIXS_A(p)と表わす。
【0117】 GIXS_A(1)={0,1,2,3,4} GIXS_A(2)={5,6,7,8} GIXS_A(3)={9,10,11,12} GIXS_A(4)={13,14,15,16,1
7} LIXS_A(p)={0,1,2,3,4,5} (p=1,2,3,4) これをデータ分割テーブル302に書き込むと図16に
なる。LIXSp1205は、全プロセッサで共通の範
囲式1601を指す。なお、説明の便宜のため、図15
のポインタ1504,1505,1506は、図16で
はポインタでなく式(あるいは値)そのものを記載して
いる。以下の図17〜図19でも同様とする。
【0118】図17は、図7の逐次ソースプログラム7
01の配列Bのデータ分割テーブル302を示す。配列
B(0:17)は、図1の構文解析処理102におい
て、図7のデータ分割パターン703に従ってデータ分
割される。
【0119】配列Bに対するGIXSとLIXSは、具
体的には以下のようになる。
【0120】 GIXS_B(1)={1,5,9,13,17} GIXS_B(2)={2,6,10,14} GIXS_B(3)={3,7,11,15} GIXS_B(4)={0,4,8,12,16} LIXS_B(p)={0,1,2,3,4,5} これをデータ分割テーブル302に書き込むと図17に
なる。
【0121】図1の構文解析処理102において図16
および図17のデータ分割テーブル302を作成した
後、図8(または図9)のプログラム分割処理106を
行う。プログラム分割処理106では、図7の逐次ソー
スプログラム701のループ700が複数代入文を含む
ため、判定803を介して、ループ分割可否判定804
を行う。ループ700はループ分割できないので、各代
入文704、705のGITSを計算する処理108を
行う。
【0122】その結果、文704のGITSは、 GITS_A(1)={1,2,3,4} GITS_A(2)={5,6,7,8} GITS_A(3)={9,10,11,12} GITS_A(4)={13,14,15,16} GITS_A(p)={4p−3,4p−2,4p−
1,4p} (p=1,2,3,4) となる。
【0123】また、文705のGITSは、 GITS_B(1)={1,5,9,13} GITS_B(2)={2,6,10,14} GITS_B(3)={3,7,11,15} GITS_B(4)={4,8,12,16} GITS_B(p)={p,4+p,8+p,12+
p} (p=1,2,3,4) となる。
【0124】図8の処理108では、これらの文70
4、705のGITSを表す式を、PRG分割式テーブ
ル308へ書き込む。図18は、GITSを表す式を書
き込んだPRG分割式テーブル308を示す。
【0125】ポインタ1307が指す範囲式が、全プロ
セッサに対するGITSを表す式になる。具体的には、
文704では範囲式1801、文705では範囲式18
02と共通になる。すなわち、プロセッサ番号をpとす
ると、文704ではGITSの範囲が[4p−3:4
p:1]となり、文705では[p:12+p:4]と
なる。
【0126】次に、図8の判定806で、各代入文が同
一GITSか否か判定する。ここでは異なるGITSで
あるから、リストベクトル計算処理生成109を実行す
る。上述したように、リストベクトル計算処理生成とし
ては、静的リストベクトル計算処理生成807(図1
0)の場合と、動的リストベクトル計算処理生成807
(図11)の場合とがある。
【0127】初めに、静的リストベクトル計算処理生成
807を行う場合について図10を参照して説明する。
【0128】まず、処理1001で、プログラム分割式
テーブル308(図18)の処理番号1303を1に設
定し、PRG分割式テーブル308(図18)から、P
RG分割値テーブル808(図19)を生成し、ループ
番号1301、および文番号1306をコピーする。続
いて、処理1002で、各プロセッサごとに各代入文7
04、705のGITSの値1901、1902を算出
し格納する。
【0129】次に、処理1003で、リストベクトル1
404をプロセッサ台数分用意する。ここでは、プロセ
ッサが4台あるから、それに対応してリストベクトルL
p(p=1,2,3,4)を用意する。
【0130】そして、処理1004で、GITS_A
(p)1901とGITS_B(p)1902の和集合
をとり、リストベクトルLp1903にソートして格納
する。図19のリストベクトル1404は、処理100
4を行った結果を示す。
【0131】次に、処理1005で、ループ繰り返しの
範囲LITS1904を設定する。この例では、各リス
トベクトルの要素数は7であるから、どのプロセッサも
[1:7:1]とする。そして、図10の処理1005
で説明したように、Iをループインデックス(ループ制
御変数)として、Lp(I)が各代入文のGITSに含
まれるときのみにその代入文が実行されるように中間語
を変更する。また、処理1006で、代入文の配列添字
をLp(I)とするように中間語を変更する。
【0132】結果として、静的プログラム分割処理後の
プログラムは、図20になる。
【0133】図20において、実行文の最初の文200
1で、自分のプロセッサ番号(p=1,…,4)を得
る。なお、文2001の生成は図1のノードプログラム
生成113で行う。
【0134】図20のプログラムでは、DOループの繰
り返し範囲を、1,2,…,npとしている。これは上
記の処理1005により、ループ繰り返し範囲を、各プ
ロセッサごとの各代入文のGITSの和集合の要素数n
pとしたものである。また、各代入文2004,200
5は、それぞれ条件文2002,2003によって、実
行すべきループ繰り返し回だけを処理するようにガード
をかけている。これは、上記の処理1005によって、
Lp(I)が各代入文のGITSに含まれるときのみに
その代入文が実行されるようにしたものである。
【0135】さらに、代入文2004,2005では、
図7の元の代入文704,705で配列要素を定義また
は参照するためのインデックスIをLp(I)に置き換
えている。これは上記の処理1006により、代入文2
004,2005の配列添字を、リストベクトル内のG
ITSを表わす配列要素に変換したものである。
【0136】以上で、図7の逐次ソースプログラム70
1を静的プログラム分割した後のプログラム(図20)
が得られた。この後、プロセッサ間通信生成(図1の処
理111)とノードプログラム生成(図1の処理11
3)を行い、PRG分割値テーブル808(図19)を
参照して、最終的な並列ノードプログラム114(図2
1)を得る。
【0137】図21の並列ノードプログラム114にお
いて、配列Aのデータ分割関数をfA、配列Bのデータ
分割関数をfB、配列Aの局所化関数をgA、配列Bの
局所化関数をgBとしている。また、静的に得られた全
プロセッサのプログラム分割情報が、DATA文によっ
てすべてプログラム内に置かれている。
【0138】なお、このDATA文の内容をファイルと
してとっておき、そこから必要な所を読み込むようにし
てもよい。また、共有メモリをもつ場合には、共有メモ
リ上にDATA文の内容をとっておき、各プロセッサが
自分に必要な所を読み込むようにしてもよい。そのよう
にすることにより、各プロセッサが、すべてのプロセッ
サの情報をもつ必要がなくなる。
【0139】次に、動的リストベクトル計算処理生成を
行う場合について説明する。図22は、図7の逐次ソー
スプログラム701を動的プログラム分割処理した後の
プログラムを示す。図11のフローチャートおよび分割
処理後の図22のプログラムを参照して、動的リストベ
クトル計算処理生成について具体的に説明する。
【0140】まず、処理1101で、PRG分割式テー
ブル308の処理番号1303を2に設定する。次に、
処理1102で、図7の逐次プログラム701のループ
700内の各代入文704,705に対するGITSの
配列を宣言する。その宣言文が、図22の宣言部220
1の配列GITSA(4),GITSB(4)である。
実行文の最初に、自分のプロセッサ番号を得る文200
1を生成する処理は、上述の静的プログラム分割処理と
同様に、図1のノードプログラム生成113で行う。
【0141】処理1103で、まず代入文704に対す
るGITSAを求めるために、PRG分割式テーブル3
08(図18)のGITS1801に基づいて、ループ
2202を生成する。そして、そのループ2202のル
ープインデックスIを配列GITSAに順に格納する。
これにより、代入文704に対するGITSを配列GI
TSAに格納する文が、生成されたことになる。
【0142】同様にして、代入文706に対するGIT
SBを求めるために、PRG分割式テーブル308(図
18)のGITS1802に基づいてループ2203を
生成し、ループインデックスIを配列GITSBに順に
格納する。これにより、代入文706に対するGITS
を配列GITSBに格納する文が、生成されたことにな
る。
【0143】次に、処理1105により文2204を生
成する。文2204は、配列GITSAとGITSBの
和集合をとって、重複を除いた要素数nを返し、これら
をマージしてリストベクトルLに格納するサブルーチン
をコールする文である。
【0144】さらに、処理1106により文2205を
生成する。文2205は、配列GITSA,GITSB
を前から順に参照するために用いる配列インデックス
J,Kを1に初期化する文である。
【0145】そして、処理1107により、上記の文2
202,2203,2204,2205をリストベクト
ル計算処理生成プログラムとして中間語103に追加す
る。
【0146】処理1005,1006は、各代入文にガ
ードをかけ、配列のインデックスを変更する処理であ
り、静的リストベクトル計算処理生成の場合と同様であ
る。
【0147】以上で、図7の逐次ソースプログラム70
1を動的プログラム分割した後のプログラム(図22)
が得られる。この後、プロセッサ間通信生成(図1の処
理111)とノードプログラム生成(図1の処理11
3)を行い、プログラム分割式テーブル308(図1
8)を参照して、最終的な並列ノードプログラム114
(図23)を得る。
【0148】従来方法では、同一ループ内に複数の代入
文がある場合、各代入文のLITSの和集合をループ繰
り返しの範囲として採用していた。このため、ループ内
にある複数の代入文の左辺に現われる配列の分割方法が
異なる場合(例えば、図7で説明したような場合)に
は、各代入文ごとにLITSに対応するGITSが異な
るにもかかわらずLITSを共有することになり、結果
不正になる可能性があった。
【0149】上記実施例によれば、プロセッサごとに各
代入文のGITSの和集合をループ繰り返し範囲とする
ので結果不正にはならない。
【0150】また、従来方法では、代入文の左辺に現わ
れる配列の添字式が異なる場合、各プロセッサで無駄な
ループ繰り返しを行う可能性があった。すなわち、従来
法では各代入文のLITSが互いに排反でLITSが非
連続になる場合、LITSが等比数列で表現できる(連
続)範囲に拡大すると、どの代入文も実行しないような
無駄なループ繰り返しがあった。
【0151】例えば、図6の逐次プログラム601で
は、配列Aのデータ分割パターンが602のとき、並列
ノードプログラムは114に示すようになる。ここで、
元のプログラム601のループ内の各代入文604,6
05のLITSはそれぞれ[1:4]と[13:16]
なので、和集合が連続する範囲をとると[1:16]に
なる。従来方法では、プログラム114に示すように、
この[1:16]の範囲をLITSとしていた。従っ
て、無駄なループ繰り返し(I=5〜12のとき)を行
うこととなる。
【0152】これに対し、図6の逐次プログラム601
に本実施例の方法(静的プログラム分割処理)を適用す
ると、図24の並列ノードプログラム114になる。図
24のプログラム114では、あらかじめリストベクト
ルLpに格納してあるGITSによりループ内の代入文
の配列の添字を構成している。そして、ループは、この
リストベクトルの要素長の範囲をまわるようにしてあ
る。従って、代入文を実行するループ繰り返し回数は8
回であり、無駄なループ繰り返しはなくなり、性能が向
上する。
【0153】上記実施例によれば、各代入文のGITS
の和集合をリストベクトルとして静的にあるいは動的に
生成し、そのリストベクトルを参照することにより、各
プロセッサでのループ繰り返しに無駄なループ繰り返し
を含まないので性能が向上する。
【0154】
【発明の効果】以上説明したように、本発明によれば、
逐次ソースプログラムを並列計算機向きに変換する際に
用いるプログラム分割方法において、代入文左辺に現わ
れる配列の分割方法が異なることによる結果不正を起こ
さないようにできる。また、代入文左辺に現われる配列
の添字式が異なるためにループ繰り返し範囲が拡大され
て無駄なループ繰り返しを実行するようなことがなく、
必要不可欠なループ繰り返しだけを実行して性能向上を
図ることができる。
【0155】なお、上記実施例では、DOループを例と
して説明しているが、当然に、他のループに適用するこ
ともできる。
【図面の簡単な説明】
【図1】本発明に係るプログラム分割方法を適用した自
動並列化変換システムにおける処理手順の概要図
【図2】添字関数とその逆関数についての説明図
【図3】LITSを求める処理図
【図4】LITSを求める例
【図5】ループ分割可能な例
【図6】異なるGITSの例
【図7】配列データ分割パターンが異なる例
【図8】静的プログラム分割処理の手順を表すフローチ
ャート図
【図9】動的プログラム分割処理の手順を表すフローチ
ャート図
【図10】静的リストベクトル計算処理生成の手順を表
すフローチャート図
【図11】動的リストベクトル計算処理生成の手順を表
すフローチャート図
【図12】データ分割テーブルの構成図
【図13】PRG分割式テーブルの構成図
【図14】PRG分割値テーブルの構成図
【図15】GIXS,LIXS,GITS,LITSテ
ーブルの構成図
【図16】図7の例題プログラムにおける配列Aのデー
タ分割テーブルを示す図
【図17】図7の例題プログラムにおける配列Bのデー
タ分割テーブルを示す図
【図18】図7の例題プログラムのPRG分割式テーブ
ルを示す図
【図19】図7の例題プログラムのPRG分割値テーブ
ルを示す図
【図20】図7の例題プログラムの静的プログラム分割
処理後のプログラムを示す図
【図21】図7の例題プログラムの静的プログラム分割
処理による並列ノードプログラムを示す図
【図22】図7の例題プログラムの動的プログラム分割
処理後のプログラムを示す図
【図23】図7の例題プログラムの動的プログラム分割
処理による並列ノードプログラムを示す図
【図24】図6の例題プログラムの静的プログラム分割
処理による並列ノードプログラムを示す図
【符号の説明】
100…自動並列化処理、101…データ分割指示付き
ソースプログラム、102…構文解析処理、103…中
間語、104…辞書、105…データ分割情報、106
…プログラム分割処理、107…プログラム分割処理方
法判定部、108…単一文におけるプログラム分割処
理、109…リストベクトルによるプログラム分割処
理、110…プログラム分割情報、111…プロセッサ
間通信生成処理、112…非局所データ解析情報、11
3…ノードプログラム生成処理、114…ノードプログ
ラム、302…データ分割テーブル、308…PRG
(プログラム)分割式テーブル、808…PRG(プロ
グラム)分割値テーブル。

Claims (6)

    【特許請求の範囲】
  1. 【請求項1】逐次ソースプログラムを入力して、分散記
    憶型並列計算機向きの並列化ソースプログラムまたはオ
    ブジェクトプログラムを生成する言語変換システムにお
    いて、該逐次ソースプログラム中のループに対し、各プ
    ロセッサが分担して計算するループ繰り返し範囲を求め
    るプログラム分割方法であって、 上記逐次ソースプログラム中で宣言されているデータの
    各プロセッサへの割り付け方を示すデータ分割指示情報
    を入力するステップと、 各プロセッサごとに、ループ内の各代入文の代入先のデ
    ータが該プロセッサに割り付けられているときのループ
    インデックスの和集合をリストベクトルとして保持する
    ステップと、 該プロセッサでのループ実行回数をそのリストベクトル
    の要素数とするとともに、ループ内の代入文に現れるル
    ープインデックスを上記リストベクトルの参照に置き換
    えるステップとを備えたことを特徴とするプログラム分
    割方法。
  2. 【請求項2】請求項1に記載のプログラム分割方法にお
    いて、前記リストベクトルを言語変換時に決定すること
    を特徴とするプログラム分割方法。
  3. 【請求項3】請求項1に記載のプログラム分割方法にお
    いて、前記リストベクトルを実行時に計算する処理を、
    変換結果の並列化プログラムに含めることを特徴とする
    プログラム分割方法。
  4. 【請求項4】逐次ソースプログラムを入力して、分散記
    憶型並列計算機向きの並列化ソースプログラムまたはオ
    ブジェクトプログラムを生成する言語変換システムにお
    いて、該逐次ソースプログラム中のループに対し、各プ
    ロセッサが分担して計算するループ繰り返し範囲を求め
    るプログラム分割方法であって、 上記逐次ソースプログラム中の配列の各プロセッサへの
    割り付け方を示すデータ分割指示情報を入力するステッ
    プと、 該データ分割指示情報に基づいて、ループ内の各代入文
    ごとに、その代入文に対して元のループ反復範囲のうち
    各プロセッサで分担実行すべきループ反復範囲を示すル
    ープインデックスの集合であるグローバル・イテレーシ
    ョン・セットを求めるステップと、 各プロセッサごとに、ループ内のすべての代入文に対応
    する上記グローバル・イテレーション・セットの和集合
    を求め、該和集合の要素をソートしてリストベクトルと
    して保持するステップと、 各プロセッサでのループ反復回数を上記リストベクトル
    の要素数とするとともに、ループ内の代入文の配列の添
    字式中のループインデックスを上記リストベクトルの参
    照に置き換えるステップとを備えたことを特徴とするプ
    ログラム分割方法。
  5. 【請求項5】逐次ソースプログラムを入力して、分散記
    憶型並列計算機向きの並列化ソースプログラムまたはオ
    ブジェクトプログラムを生成する言語変換システムにお
    いて、該逐次ソースプログラム中のループに対し、各プ
    ロセッサが分担して計算するループ繰り返し範囲を求め
    るプログラム分割方法であって、 上記逐次ソースプログラム中の配列の各プロセッサへの
    割り付け方を示すデータ分割指示情報を入力するステッ
    プと、 該データ分割指示情報に基づいて、ループ内の各代入文
    ごとに、その代入文に対して元のループ反復範囲のうち
    各プロセッサで分担実行すべきループ反復範囲を示す下
    限式、上限式、および増分式を求めるステップと、 上記下限式、上限式、および増分式を用いて、各代入文
    に対応するループ反復範囲を示すループインデックス値
    の集合を算出する文を生成するステップと、 各プロセッサごとに、ループ内のすべての代入文に対応
    する上記ループインデックス値の集合の和集合を求め、
    該和集合の要素をソートしてリストベクトルとして設定
    する文を生成するステップと、 各プロセッサでのループ反復回数を上記リストベクトル
    の要素数とするとともに、ループ内の代入文の配列の添
    字式中のループインデックスを上記リストベクトルの参
    照に置き換えるステップとを備えたことを特徴とするプ
    ログラム分割方法。
  6. 【請求項6】請求項4または5に記載のプログラム分割
    方法において、さらに、任意のループインデックスに対
    して、前記リストベクトルの該ループインデックス番目
    の要素が前記ループ内の代入文のグローバル・イテレー
    ション・セットに含まれるときのみその代入文を実行す
    るように変更することを特徴とするプログラム分割方
    法。
JP5210956A 1993-08-03 1993-08-03 プログラム分割方法 Pending JPH0744508A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP5210956A JPH0744508A (ja) 1993-08-03 1993-08-03 プログラム分割方法
US08/650,008 US5721928A (en) 1993-08-03 1996-05-16 Method for partitioning computation

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP5210956A JPH0744508A (ja) 1993-08-03 1993-08-03 プログラム分割方法

Publications (1)

Publication Number Publication Date
JPH0744508A true JPH0744508A (ja) 1995-02-14

Family

ID=16597899

Family Applications (1)

Application Number Title Priority Date Filing Date
JP5210956A Pending JPH0744508A (ja) 1993-08-03 1993-08-03 プログラム分割方法

Country Status (2)

Country Link
US (1) US5721928A (ja)
JP (1) JPH0744508A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012137390A1 (ja) * 2011-04-04 2012-10-11 株式会社日立製作所 並列化設計支援システム、プログラム、および方法
US9424032B2 (en) 2013-02-27 2016-08-23 Nec Corporation List vector processing apparatus, list vector processing method, storage medium, compiler, and information processing apparatus

Families Citing this family (26)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6311265B1 (en) * 1996-03-25 2001-10-30 Torrent Systems, Inc. Apparatuses and methods for programming parallel computers
JPH09305551A (ja) * 1996-05-10 1997-11-28 Toshiba Corp 並列計算機システム
US6279152B1 (en) * 1996-10-18 2001-08-21 Fujitsu Limited Apparatus and method for high-speed memory access
US5812852A (en) * 1996-11-14 1998-09-22 Kuck & Associates, Inc. Software implemented method for thread-privatizing user-specified global storage objects in parallel computer programs via program transformation
US6330008B1 (en) * 1997-02-24 2001-12-11 Torrent Systems, Inc. Apparatuses and methods for monitoring performance of parallel computing
US5842208A (en) * 1997-04-09 1998-11-24 International Business Machines Corporation High performance recover/build index system by unloading database files in parallel
JP4425377B2 (ja) * 1999-07-29 2010-03-03 株式会社ターボデータラボラトリー データ処理装置、および、データ処理方法
US7159041B2 (en) * 2000-03-07 2007-01-02 Microsoft Corporation Method and system for defining and controlling algorithmic elements in a graphics display system
US6828975B2 (en) * 2001-03-01 2004-12-07 Microsoft Corporation Method and system for managing graphics objects in a graphics display system
US8924654B1 (en) * 2003-08-18 2014-12-30 Cray Inc. Multistreamed processor vector packing method and apparatus
JP4079923B2 (ja) * 2004-07-26 2008-04-23 エヌイーシーコンピュータテクノ株式会社 ベクトル処理装置、情報処理装置、および、ベクトル処理方法
US20060123401A1 (en) * 2004-12-02 2006-06-08 International Business Machines Corporation Method and system for exploiting parallelism on a heterogeneous multiprocessor computer system
US7779008B2 (en) * 2005-02-16 2010-08-17 Oracle International Corporation Parallel partition-wise aggregation
US7743087B1 (en) 2006-03-22 2010-06-22 The Math Works, Inc. Partitioning distributed arrays according to criterion and functions applied to the distributed arrays
US8527971B2 (en) * 2006-03-30 2013-09-03 Atostek Oy Parallel program generation method
JP4784827B2 (ja) * 2006-06-06 2011-10-05 学校法人早稲田大学 ヘテロジニアスマルチプロセッサ向けグローバルコンパイラ
US8239844B2 (en) * 2007-02-14 2012-08-07 The Mathworks, Inc. Method of using parallel processing constructs and dynamically allocating program portions
US8108845B2 (en) * 2007-02-14 2012-01-31 The Mathworks, Inc. Parallel programming computing system to dynamically allocate program portions
US8255889B2 (en) * 2007-02-14 2012-08-28 The Mathworks, Inc. Method of using parallel processing constructs and dynamically allocating program portions
US8010954B2 (en) * 2007-02-14 2011-08-30 The Mathworks, Inc. Parallel programming interface to dynamically allocate program portions
US8255890B2 (en) * 2007-02-14 2012-08-28 The Mathworks, Inc. Media for performing parallel processing of distributed arrays
US8250550B2 (en) * 2007-02-14 2012-08-21 The Mathworks, Inc. Parallel processing of distributed arrays and optimum data distribution
US8239845B2 (en) * 2007-02-14 2012-08-07 The Mathworks, Inc. Media for using parallel processing constructs
US8239846B2 (en) * 2007-02-14 2012-08-07 The Mathworks, Inc. Device for performing parallel processing of distributed arrays
US8434076B2 (en) * 2007-12-12 2013-04-30 Oracle International Corporation Efficient compilation and execution of imperative-query languages
US20100169618A1 (en) * 2008-12-30 2010-07-01 Microsoft Corporation Identifying concurrency control from a sequential proof

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2738692B2 (ja) * 1988-01-29 1998-04-08 株式会社日立製作所 並列化コンパイル方法
US5093916A (en) * 1988-05-20 1992-03-03 International Business Machines Corporation System for inserting constructs into compiled code, defining scoping of common blocks and dynamically binding common blocks to tasks
JPH04211830A (ja) * 1990-02-05 1992-08-03 Matsushita Electric Ind Co Ltd 並列化コンパイル方式
JPH0475139A (ja) * 1990-07-18 1992-03-10 Toshiba Corp ループ並列化装置
US5437034A (en) * 1991-04-19 1995-07-25 Hitachi, Ltd. Method of generating from source program object program by which final values of variables for parallel execution are guaranteed
US5293631A (en) * 1991-08-06 1994-03-08 Hewlett-Packard Company Analysis and optimization of array variables in compiler for instruction level parallel processor
US5551039A (en) * 1992-02-03 1996-08-27 Thinking Machines Corporation Compiling a source code vector instruction by generating a subgrid loop for iteratively processing array elements by plural processing elements
JP3208870B2 (ja) * 1992-10-30 2001-09-17 株式会社日立製作所 データ分割パタンの評価方法
US5475842A (en) * 1993-08-11 1995-12-12 Xerox Corporation Method of compilation optimization using an N-dimensional template for relocated and replicated alignment of arrays in data-parallel programs for reduced data communication during execution

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2012137390A1 (ja) * 2011-04-04 2012-10-11 株式会社日立製作所 並列化設計支援システム、プログラム、および方法
US9424032B2 (en) 2013-02-27 2016-08-23 Nec Corporation List vector processing apparatus, list vector processing method, storage medium, compiler, and information processing apparatus

Also Published As

Publication number Publication date
US5721928A (en) 1998-02-24

Similar Documents

Publication Publication Date Title
US5721928A (en) Method for partitioning computation
Wise Aspects of applicative programming for parallel processing
US20190391791A1 (en) Acceleration techniques for graph analysis programs
Kennedy et al. Automatic data layout for distributed-memory machines
US5548761A (en) Compiler for target machine independent optimization of data movement, ownership transfer and device control
JP3047998B2 (ja) 並列計算機におけるプロセッサ割り当て方法、及び装置
Tran Tan et al. Automatic task-based code generation for high performance domain specific embedded language
Dewitt A Machine Independent Approach To The Production Of Optimized Horizontal Microcode.
González et al. A general and efficient divide-and-conquer algorithm framework for multi-core clusters
Trapp et al. Documentation of the intermediate representation firm
Pizka Design and implementation of the GNU INSEL-compiler gic
Zhang et al. KDRSolvers: Scalable, Flexible, Task-Oriented Krylov Solvers
Keßler et al. Integrating synchronous and asynchronous paradigms: The Fork95 parallel programming language
Brezany Input/output intensive massively parallel computing: language support, automatic parallelization, advanced optimization, and runtime systems
EP3991027B1 (en) Method and apparatus for enabling autonomous acceleration of dataflow ai applications
Murai et al. XcalableMP programming model and language
Menouer et al. Mixing static and dynamic partitioning to parallelize a constraint programming solver
Witterauf et al. Polyhedral fragments: an efficient representation for symbolically generating code for processor arrays
Nishimura et al. Parallel functional programming on recursively defined data via data-parallel recursion
Paronyan Agent-based computational geometry
da Silva Non-blocking concurrent imperative programming with session types
Marker Design by transformation: from domain knowledge to optimized program generation
Dekeyser et al. A geometrical data-parallel language
Annus et al. Term search in rust
Weinhardt et al. CHiPReP—A Compiler for the HiPReP High-Performance Reconfigurable Processor. Electronics 2021, 10, 2590