JPH08185325A - コンパイラにおけるコード生成方法及びコンパイラ - Google Patents

コンパイラにおけるコード生成方法及びコンパイラ

Info

Publication number
JPH08185325A
JPH08185325A JP6311764A JP31176494A JPH08185325A JP H08185325 A JPH08185325 A JP H08185325A JP 6311764 A JP6311764 A JP 6311764A JP 31176494 A JP31176494 A JP 31176494A JP H08185325 A JPH08185325 A JP H08185325A
Authority
JP
Japan
Prior art keywords
loop
processors
code
expression
array
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.)
Granted
Application number
JP6311764A
Other languages
English (en)
Other versions
JP2669603B2 (ja
Inventor
Takeshi Ogasawara
武史 小笠原
Hideaki Komatsu
秀昭 小松
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP6311764A priority Critical patent/JP2669603B2/ja
Priority to US08/570,996 priority patent/US6016397A/en
Publication of JPH08185325A publication Critical patent/JPH08185325A/ja
Application granted granted Critical
Publication of JP2669603B2 publication Critical patent/JP2669603B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/45Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
    • G06F8/451Code distribution
    • G06F8/452Loops

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)
  • Advance Control (AREA)

Abstract

(57)【要約】 【目的】 インデックスセットが分配可能、という条
件は満たすが、代入文右辺のデータ依存が1つに決めら
れる、という条件は満たさないような特性をもつループ
を並列化すること。 【構成】 do i=M, N a(i) = a(x) enddo は、xがコンパイル時に決定されない変数なので、従来
技術では並列化できない。そこで、M, Nとxの大小関係
に応じて、xも含めてi=M..Nというインデックスセット
を複数のプロセッサに分配し、これによって、ループの
前に定義された値を使用するプロセッサセットと、ルー
プの後で定義された値を使用するプロセッサセットとを
計算し、ループの前後にこれらのプロセッサに対する通
信を行わせるコードを挿入することにより、ループ内で
はプロセッサ間の通信を行う必要がないようにし、以っ
て実行プログラムの速度を向上させる。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、プログラムにおけるル
ープを複数のプロセッサに分割して並列に実行させるた
めのデータ並列言語用のコンパイラにおける並列化技法
に関するものである。
【0002】
【従来の技術】近年、巨大な配列を使用する、より実際
的な数値計算プログラムの開発において、データ並列言
語およびそのコンパイラによる開発が中心になりつつあ
る。データ並列言語では、そうした巨大な配列は複数の
プロセッサに分割されて所有される。データ並列プログ
ラムはSPMD (Single Program Multiple Data)コー
ドにコンパイルされる。SPMDコードとは、1つのコ
ードを複数のプロセッサ上で実行させるために生成され
たコードである。プロセッサの台数が増えてくると、そ
れぞれのプロセッサ用にコードを生成するのは現実的で
はないため、SPMDコードが主流になっている。本発
明はデータ配列言語のコンパイラ上の技術である。
【0003】さて、一般にデータ並列言語用のコンパイ
ラは、ループ実行に必要なデータをループ実行の前に各
プロセッサに読み込ませ(通信外挿)、最少の通信や同
期でループを実行させるという、ループ並列化の課題を
持つ。ループ並列化を行なうにはこうした通信の外挿が
必要であるが、そのためには各プロセッサが読み込むデ
ータをどのプロセッサが所有し、それら所有プロセッサ
がどの時点で定義した値を読み込むのかを解析し、その
データ依存を維持するように通信するコードを生成する
ことが重要になる。
【0004】SPMDコードにおいて、式の評価をどの
プロセッサで行なうかについては、コード生成の容易さ
から「書き込み者計算」という方針が主流である。この
方針では、プログラムの各文について右辺式の評価をす
るプロセッサを、左辺を持つプロセッサ(左辺がない文
であれば全プロセッサ)に決める。したがって、文を実
行するプロセッサが実行に必要だが自プロセッサが所有
しない配列を右辺の評価前に通信して読み込むコード
を、コンパイラが生成する必要がある。
【0005】データ並列言語で記述される主要なアプリ
ケーションの1つ、科学計算のプログラムでは、計算時
間のほとんどの部分がループ実行によって費やされる。
またループの本体はほとんどが代入文であり、代入文に
登場するオペランドは、ほとんどが左辺、右辺、共に配
列である。このような配列をオペランドとして持つ代入
文のループを、並列に実行するコードを生成すること
が、データ並列言語コンパイラが行なう主要なコード最
適化である。
【0006】ループのインデックス変数のとる値の集合
をインデックスセットと呼ぶ。ループを並列に実行する
コードでは、このインデックスセットは分割されてそれ
ぞれが別々のプロセッサに割り当てられる(インデック
スセットの分配という)。分配方針は、各プロセッサが
自分の分割されたインデックスセットでループを実行す
る限り代入文の左辺は自分が所有するように、分配する
ことである。ループを並列に実行するためには、まず第
1にこのインデックスセットの分配が可能であることが
必要である。
【0007】インデックスセットの分配が可能でない例
として、次のループがある。
【数1】 do i=1,10 a(b(i))= ... enddo
【0008】ここで、b(i)は、aとは別の配列である。
このような場合、i=1..10に対してb(i)がどのような値
をとるかはコンパイル時に決まらないので、コンパイラ
は、インデックスセットを複数のプロセッサに分配する
ことができない。
【0009】ループを並列に実行できるための第2の条
件は、ループ本体の代入文の右辺について発生する通信
を、すべてループの外側で行なえることである。仮にイ
ンデックスセットの分配が行なえても、通信をすべてル
ープの外側で行なえなくては、ループの並列化ができな
い。通信をすべてループの外側で行なうコードをコンパ
イラが生成するためには、ループ実行中に読む右辺の配
列領域のデータ依存がループ実行時に解析できる必要が
ある。すなわち、各プロセッサについて、分配されたイ
ンデックスセットで読む右辺の配列領域のどの部分を持
つか持たないか解析し、持たない領域を読む場合、その
領域に対してどのプロセッサからどの文で定義した後の
値を通信で読み込んでくるか、ということがループ実行
前に決定される必要がある。プロセッサと文の組どうし
の生産者と消費者のこうしたデータ依存関係が1つに決
まれば、コンパイラはループの外で通信を行なうコード
を生成できる。
【0010】データ依存関係が1つに決まらない例とし
ては、次のようなループがある。
【数2】 do i=5,10 a(i)= .. a(m) .. enddo
【0011】この例では、ある繰り返しにおける代入分
a(i)= .. a(m) ..で使用するa(m)の値がループでの定義
後の値か、定義前の値か、コンパイラが判断することが
できない。こういう場合は、データ依存関係が1つに決
まらないので、「複数のデータ依存を持つ」と呼ばれ
る。
【0012】以上まとめると、コンパイル時に (1) インデックスセットが分配可能かどうかが決まる (2) 代入文右辺のデータ依存が1つに決められる の2つの条件を満たせば、ループを並列実行するコード
が生成できる。簡単のためそれぞれを以下、コンパイル
時に要求される、条件(1)、条件(2)と呼ぶ。
【0013】ところで、ループを複数のプロセッサに分
割して並列に実行することにより、プログラムの実行を
高速化するための技法に関するものとして次のような刊
行物がある。
【0014】特開昭61−182161号公報は、複数
のCPUと、複数のメモリとを基本構成要素とするマル
チプロセッサ計算機システムにおいて、各プロセッサを
ループ状に結合したストリーム・バスと、各プロセッサ
内部に設けられ、ストリーム・バスに対して一定方向に
メッセージを逆受する手段を有し、メッセージを上記各
プロセッサに送りながら、1つの処理を進めることを開
示する。
【0015】特開平4−184540号公報は、複数の
並列実行可能なプロセッサからなる並列計算機システム
に対して、与えられたソース・プログラムからオブジェ
クト・プログラムを生成するコンパイラにおいて、上記
ソース・プログラムを字句に分解して解析し、該解析結
果に基づき構文を認識し中間コードを生成し、その中間
コードからループ構造を検出して並列実行可能部分を抽
出し、該ループが多重ループである場合に、各ループに
関してデータ参照関係を解析し、ループ間でデータ参照
関係の生じないループに関して並列実行処理を行うこと
を開示する。
【0016】特開平5−158895号公報は、複数の
計算機が結合された並列計算機システムにおいて、ルー
プ間に値の参照を含む依存関係を有するループ計算機に
おける複数の連続ループ計算を分担し、依存関係により
他の計算機で必要とするデータを該他の計算機に通信す
ることを開示する。
【0017】特開平5−324345号公報は、データ
を分割しても相互に演算上の影響がないループ計算を並
列計算機の各セルに分割して処理させる場合の、ソース
プログラムのループ文の添字を分割する方法に関し、ル
ープ文で計算する複数個のデータを、並列計算機の各セ
ルに、予め、全てのデータを分配するか、または細切に
して分配するかのデータ分配形式を決め、各セルが分担
するループ演算を指示する添字文をループ文の分割形式
と、データ分配形式に対応して生成しておき、ソース・
プログラムから並列処理するループ文を選択し、該選択
されたループ文の前に、データの分配形式に合わせてル
ープ文の分割形式を指定する記述子を付加することによ
って、ソースプログラムを中間プログラムに変換すると
き、その記述子に応じて、添字文を選択するようにする
ことを開示する。
【0018】しかし、上記刊行物に記載された技術も含
め、従来技術では、上記(1)と(2)の2つの条件の両方を
満たさないとループを並列実行できない。換言すると、
従来技術では、ループ実行本体である代入文の右辺の配
列参照が、複数のデータ依存を持つとコンパイル時に判
明した場合、各プロセッサにとってその読み込む配列の
値を定義するプロセッサが1つに特定できないため、通
信外挿を行なうコードが生成できなかった。
【0019】例えば、次のようなループをもつプログラ
ムについて考慮する。
【数3】 subroutine sub(a,n,m) integer a(n) *hpf$ distribute a(block(n/number_of_processors())) do i=1,n a(i)=a(m) enddo end
【0020】これは、ループを含む処理のサブルーチン
がHigh Performace Fortranの構文に従い記述されてい
るソース・コードの例であって、*hpf$で始まる3行目
は、「配列aをブロック状に現在のプロセッサ(number_
of_processors()個)に分割する」ということを意味す
る。便宜上、number_of_processors()をnp()と略記す
る。すると、1つ1つのプロセッサが持つ配列要素の個
数は、n/np()で、これをneとする。この場合、分配され
るインデックスセット{1,2,...,n}は、プロセッサpに対
して{(p-1)*ne+1,(p-1)*ne+2,...,min(n,p*ne)}とな
る。ne=n/np()やnはコンパイル時には定数ではないが、
可能と分かる点で条件(1)を満たす。また、このループ
は複数のデータ依存を持つため、条件(2)を満たさな
い。
【0021】実際、従来技術によれば、以下に述べるよ
うに、上記(1)は満たすが(2)は満たさないようなループ
に対して、処理の速度低下を生じてしまうようなコード
が生成される。
【0022】先ず、条件(1)、(2)を同時に満たせない、
並列化されないループに対するSPMDコードについて
説明すると、それは次のようなものである。そもそも、
条件(1)を満たさないループについては、インデックス
セットは分配されない。そのためSPMDコードを実行
する全プロセッサは、何もしなければ、そのループ実行
によって自分の所有しない配列領域に書き込む代入文を
実行する可能性がある。コンパイラはそれを防ぐため
に、「プロセッサガード」と呼ぶIF文で代入文を囲み、
自分が所有しない配列要素への書き込みならば代入文を
実行しないようなコードを生成する。
【0023】また、条件(2)を満たさないループについ
ても、インデックスセットは分配されない。その理由
は、インデックスセットを分配するということは、各プ
ロセッサが互いに干渉なく別々のインデックスセットで
ループを実行することだが、そうした場合、あるプロセ
ッサでループ実行中に右辺が必要になったことをその所
有者プロセッサが知ることができない、つまり送ること
ができないからである。さらにいえば、所有者プロセッ
サは、送る値がプログラム実行中のどの時点での値かも
分からない。インデックスセットが分配されない場合の
SPMDコードは前述の通りである。
【0024】以上、条件(1)を満たさない場合も、条件
(2)を満たさない場合も、分配されないインデックスセ
ットを使用したSPMDコードが生成されることを述べ
た。
【0025】一方、条件(1)を満たさない場合、各プロ
セッサがループ実行を通じて右辺でアクセスする配列領
域も分からない。そのため、ループの外でまとめて読み
込むことができないので、ループの中で通信するSPM
Dコードが生成される。具体的に元の各代入文の i 番
目の右辺を読み込む疑似SPMDコードは、LHSを左辺
オペランド、RHSiをi番目の右辺、#Tを一時変数として
【数4】
【0026】代入文の右辺式を評価する際には、RHSiの
代わりに#Tを使う。
【0027】条件(2)を満たさない場合も、複数のデー
タ依存を持つ右辺の読み込みについて、同様なSPMD
コードが生成される。
【0028】このような、インデックスセットが分配さ
れない、ループ中で通信が発生するSPMDコードが生
成されるループを、DOSYNCループと呼ぶ。ここで示した
ようなオペランドを通信の送受信によって読むコード
は、CPUがメモリから読むコードに比べ非常に遅い。理
由は、第1に、通信によるオペランドのフェッチでは、
不平等な負荷などによる送信側プロセッサの実行の受信
側プロセッサの実行に対する遅れがあった場合、受信側
プロセッサが待たされることがあるからである。第2に
は、通信ライブラリの実行オーバヘッドがあるからであ
る。特に分散メモリ型のマルチプロセッサの場合、送信
データが受信されるまでの時間が長いこともこれに加わ
る。こうしたことから、通信によるオペランドの読み込
みがループ中にあると、ループの実行時間は遅い通信時
間に支配される。結論として、並列性を持つがコンパイ
ラの能力上、DOSYNCループの扱いを受けるループがある
と、そのプログラムの実行速度をそのループが決定し
て、遅くしてしまう。
【0029】
【発明が解決しようとする課題】この発明の目的は、
(1) インデックスセットが分配可能、という条件は満た
すが、(2) 代入文右辺のデータ依存が1つに決められ
る、という条件は満たさないような特性をもつループを
並列化して高速で処理することを可能ならしめるコード
を生成するための技法を提供することにある。
【0030】
【課題を解決するための手段】上記目的は、本発明に従
い、最内ループパイプライン化によって、実行時に一意
に決まったデータ依存に基づいて、データの読み込みを
ループ前で行なうことによって達成される。
【0031】ループ並列化の際、従来技術では、静的な
データ依存関係に基づいて、ループの外でまとめて通信
するコードをコンパイラが生成する。そのため、データ
依存の複数の可能性があるといった、条件(2)を満たさ
ない要因があると、条件(1)が満たされていてもそのル
ープをコンパイラは並列化できない。そうした並列化さ
れないループの中には、ループ不変な変数を配列の添字
として持つ場合が含まれる。
【0032】しかしその一方で、条件(2)を満たさない
理由が、添字に登場するループ不変な変数だけであれ
ば、実行時にはその変数は定数と同じように扱えるた
め、実行時にデータ依存は1つに決まる。したがって実
行時に決まるプロセッサ間にまたがるデータ依存の種類
をコンパイル時にすべて知ることができ、そのいずれの
データ依存に対しても送信者と受信者を保証する通信コ
ードをループの外に生成できれば、通信によるデータ読
み込みをループの外に出せる。したがってループを並列
に実行できる。この最適化は、条件(1),(2)で示した並
列化対象ループの範囲を広げる。本発明はこうした考え
に基づいて、実行時に1つに決まるデータ依存にもとづ
いてループを並列化するコードを生成する。ここで1次
元配列、1重ループ、1右辺オペランド、という基本的
な場合を標準ループとし、データ依存が複数あるループ
と、それらのどこに並列性があるのかを説明する。標準
ループは簡単であるが本発明の新規性をすべて説明でき
る例である。
【数5】
【0033】ここで、配列aはa(1)からa(MAX)まで宣言
され、M, N, xは整数の変数である。また配列aはブロッ
ク状にPn台の1次元プロセッサ配列に順に分配されてい
るとする(各プロセッサne=MAX/Pn要素ずつ所有)。つ
まりプロセッサ pはa(1+(p-1)*ne)からa(ne+(p-1)*ne)
までを連続して所有する。
【0034】標準ループのループは、2.2.の条件(1)を
満たす。すなわちインデックスセットは分配でき、プロ
セッサ p はインデックスセットi=1+(p-1)*ne:ne+(p-1)
*ne:1(1+(p-1)*neからne+(p-1)*neまで1とび)でルー
プを実行する(a:b:dのような記法は、開始がaで、dず
つ増分してbまで達するインデックスセットのこのであ
る)。しかし条件(2)は満たさない。なぜなら、プロセ
ッサ p は右辺 a(x)を必要とするが、読む値が a(x) の
所有者プロセッサのループの代入文S1実行前の値か、S1
実行後の値かが分からないからである。以下では具体的
に x と M, N の関係によって2通りに変化するデータ
依存と並列性を述べる。ここで重要なのは、実行時には
2通りのどちらかに決まり、静的なデータ依存として扱
えるということである。
【0035】(a) x が M より小さいか N より大きい場
合 x が M より小さいか N より大きい値であった場
合、a(x)はこのループでは定義されない、つまり代入文
S1で使用されるa(x)の値はどのプロセッサもループ実行
前の値である。
【0036】実行時にループ実行前に、a(x)の所有者プ
ロセッサはそれ以外のプロセッサにa(x)を送信し、それ
以外のプロセッサは送信された値を受信する。そこで一
度同期された後は、プロセッサは互いに独立に分配され
たインデックスセットでループを実行できる。
【0037】(b) x が M 以上 N 以下の場合 x が M <= x <= N であった場合、a(x)はこのループで
再定義される。代入文S1で使用されるa(x)の値は、イン
デックスセットの1:x:1の部分では、ループ実行前のa
(x)の値、インデックスセットx+1:M:1の部分では、ルー
プ実行後のa(x)の値である。これを前述の分配されたイ
ンデックスセットで考えると、プロセッサ1からプロセ
ッサ1+(x-1)/ne(a(x)の所有者プロセッサ)までがルー
プ実行前のa(x)の値、プロセッサ2+(x-1)/neからプロセ
ッサpまでがループ実行後のa(x)の値を、代入文S1のa
(x)の値として使用する。 実行時にループ実行前に、a
(x)の所有者プロセッサはプロセッサ1から(x-1)/neにa
(x)を送信し、プロセッサ1から(x-1)/neは送信されたa
(x)を受信する。この通信同期の後は、プロセッサ1か
ら1+(x-1)/neは互いに独立に分配されたインデックスセ
ットでループを実行できる。そしてループ実行後に、a
(x)の所有者プロセッサはプロセッサ2+(x-1)/neからpに
a(x)を送信し、プロセッサ2+(x-1)/neからpは送信され
たa(x)の値を受信する。この通信同期の後は、プロセッ
サ2+(x-1)/neからpは互いに独立に分配されたインデッ
クスセットでループを実行できる。
【0038】上述したように、コンパイル時に条件(1)
を満たし、実行時に条件(2)を満たすループは並列性を
持つため、コードを工夫することによってループ並列化
できる可能性を持つ。本発明は、コンパイル時に条件
(1)を満たし、実行時に条件(2)を満たすループを見つ
け、可能性のあるデータ依存の場合を網羅した通信を行
なうコードを生成するコンパイラ最適化技術である。よ
り具体的には、前述の標準ループに対する並列性の場合
分けで行なったように、複数のデータ依存の原因となる
配列添字内のループ不変変数やインデックス変数の上
限、下限をパラメータとして、パイプライン実行を行な
うコードを構成し、パイプライン実行によってループ並
列化を行なう。これを「最内ループのパイプライン化」
と呼ぶ。
【0039】これによって ・通信をループ外に出すことによる通信回数減少 ・通信外挿によるループ内通信同期削除 ・分割されたインデックスセットによる代入のガード不
要 が行なえた。
【0040】この効果は、標準ループを例にとると、ル
ープ並列化されないループではループの中でa(x)の通信
が(N-M+1)回行なわれたのに対し、本発明による改善後
では、ループの外で通信が1回だけ行なわれる、という
ことで見て取れる。通信の種類は、ループ並列化されな
いループの場合は、a(x)の所有者プロセッサから左辺a
(i)の所有者プロセッサへの1対1通信、本発明による
改善後のループでは、a(x)の所有者プロセッサから左辺
の代入を行なうすべてのプロセッサへの1対多通信であ
る。この効果は、次のようにまとめられる。
【表1】
【0041】ループ内で必要な同期は、MAX, M, N, Pn
に関わらず必要なくなる。前述のようにループの中で行
なわれる通信による同期はループ実行を非常に遅くする
ため、同期が全くなくなることは非常に大きな高速化を
もたらす。また通信回数も減少する。a(x)を所有せず代
入を行なうプロセッサの数は、MAX, M, N,Pnに依存する
が、だいたい並列化前より並列化後で約1/ne(1プロセ
ッサに分散される配列要素数の逆数)になり、通信ライ
ブラリのオーバヘッドを約1/neにできる。
【0042】仮にMAX=10000, M=1, N=10000だったとす
ると標準ループのループは配列全体に対する代入とな
る。また、Pn=2000台とするとこのループ実行による代
入は2000台のプロセッサすべてが参加する。すると上記
の表の具体的な数値は次のようになる。本発明の効果が
非常に高いことが分かる。
【表2】
【0043】
【実施例】以下、図面を参照して本発明について説明す
る。 A.ハードウェア構成 本発明を実施するためには、互いにデータをやり取りす
るように相互接続された複数のプロセッサからなる、マ
ルチプロセッサ・システムが必要である。大別すると、
マルチプロセッサ・システムには、図1に示す分散メモ
リ型マルチプロセッサ・システムと、図2に示す共有メ
モリ型マルチプロセッサ・システムとがある。
【0044】図1を参照すると、分散メモリ型マルチプ
ロセッサ・システムは、複数のCPU102、104、
106・・・に、ローカル・バス122、124、12
6・・・を介して、それぞれ個別にメモリ112、11
4、116・・・が接続され、さらに各々のローカル・
バス122、124、126・・・は、個別の通信装置
132、134、136・・・及びディジタル・ネット
ワークを介して互いに接続されているようなシステムで
ある。
【0045】ディジタル・ネットワークは、典型的には
LANであるけれども、ISDNなどのディジタル回線
を通じてWAN(広域ネットワーク)として構成された
ものでもよい。従って、分散メモリ型マルチプロセッサ
・システムにおいては、互いに相互接続し得るCPUの
個数は、実質的に無制限であり、このため、好適に分散
処理のプログラムを形成することにより、巨大な配列の
行列計算などを処理することも可能となる。
【0046】但し、分散メモリ型マルチプロセッサ・シ
ステムでは、LANまたはWANなどの通信回線を介し
てCPU間のデータのやり取りが行われるため、この通
信のための処理コストが負担になる可能性がある。
【0047】図2を参照すると、共有メモリ型マルチプ
ロセッサ・システムの典型的な構成が示されている。共
有メモリ型マルチプロセッサ・システムにおいては、複
数のCPU202、204、206・・・が、ローカル
・バス210を介して互いに接続され、また、ローカル
・バス210は、共有メモリ220に接続されている。
共有メモリ220の領域は、例えば個別のCPUによっ
て占有される排他的な領域と、複数のCPUによって共
通にアクセスされる共通の領域とを含む。
【0048】共有メモリ型マルチプロセッサ・システム
の利点は、CPUが互いにローカル・バスで相互接続さ
れているため、CPU間の通信コストが少なくて済むこ
とである。しかし、ある限定された筐体に複数のCPU
をパッケージする必要があるためと、共有バスに対する
複数CPUによるアクセスを調停する必要性とから、共
有メモリ型マルチプロセッサ・システムにおいて接続可
能なCPUの個数は自ずと制限がある。
【0049】本発明は、分散メモリ型マルチプロセッサ
・システムや共有メモリ型マルチプロセッサ・システム
などのCPUの接続形態に限定されることなく、複数の
CPUが互いに通信可能に構成された任意のシステムに
適用可能である。
【0050】B.本発明の処理の概要フローチャート 図3のフローチャートを参照して、本発明の処理の概要
について説明する。この処理は、本発明に係るコンパイ
ラが、ソース・プログラム中のループを見出すと開始さ
れる。
【0051】先ず、ステップ3002では、そのように
して見出されたループ(ネストしたループの場合、最も
内側のループ)のインデックスについて、インデックス
セットが分配可能かどうかが判断される。もしそうでな
いと判断されると、ステップ3006に進んで、並列化
不可能として、ループ内にプロセッサ間通信を行うコー
ドを挿入するような通常のコンパイル処理が行われ、こ
のフローチャートの処理は終わる。
【0052】ステップ3002でインデックスセットが
分配可能であると判断された場合、ステップ3004に
進んで、そのループに含まれている代入文のデータ・フ
ローが1つに決定されるかどうかが判断される。もしそ
うであると判断されると、本発明によることなく既存の
コンパイラで並列化可能であるので、処理はステップ3
008に進み、そこでは既存のコンパイル技術によって
複数のプロセッサ間で処理を並列化するコードが生成さ
れ、このフローチャートの処理は終わる。
【0053】ステップ3004での判断が否定的である
と、ステップ3010に進み、そこでは次のような判断
が行われる。すなわち、最内ループのインデックス変数
を#IV.dとしたとき、 ・その式の左辺の配列aのm番目(mは1以上でN以下
の任意の整数)の添字が、c1 * #V1.d + c2(c1,c2
は、該最も内側のループにおけるループ不変定数であっ
て、c1 は、0に等しくない)である、 ・その式の左辺の配列aのm番目の次元が複数のプロセ
ッサ間でブロック状に分配されている、 ・その式の右辺の配列aのm番目の添字式xが、コンパ
イル時点では値が不定であるけれどもプログラム実行時
点では値が最内ループで不変であるような変数である、 という3つの条件を満たすかどうかが判断され、それら
の条件のうち1つでも満足しないと判断されると処理は
ステップ3012に進み、そこでは、ステップ3006
と同様に並列化不可能として、ループ内にプロセッサ間
通信を行うコードを挿入するような通常のコンパイル処
理が行われ、このフローチャートの処理は終わる。
【0054】ステップ3010で、3つの条件が満足さ
れると判断されたときには、ステップ3014で本発明
によって処理可能であると判断され、より詳細には、ス
テップ3016で記述される本発明の処理によって、並
列化のためのコード生成処理が行われる。尚、ステップ
3016での処理については、以下でより詳細に説明す
る。
【0055】C.本発明の処理に関するより詳細な説明 ループを最内ループパイプライン化をするためには、次
のような手続きを行なう。尚、これ以降、ループは1か
ら始まり飛びは1という正規化が行なわれているとする
(ループについては上限値だけが考慮される)。
【0056】C−1. 対象ループの発見 コンパイル時に条件(1)を、実行時に条件(2)を満たすル
ープが対象である。具体的には、最内ループ(1重ルー
プならそれ自身)のインデックス変数が#IV.dであると
き、次の条件を同時に満たすことが必要である。 ・左辺の配列のm番目の添字にa * #IV.d + bを含む(a
は0ではない,bはループ不変数) ・左辺の配列のm番目の次元はプロセッサ間にブロック
上に分配されている ・右辺に左辺と同じ配列の参照でm番目の添字にx(xは
ループ不変式)を含むものがある
【0057】左辺の配列のm番目の添字がa * #IV.d + b
の形をしていれば、コンパイル時に条件(1)を満たして
いる。右辺の同じ配列のm番目の添字式がxであれば、最
内ループよりも外側のループのインデックス変数の値を
固定して考えると、最内ループは前述の標準ループと等
価である。よってこれら条件を満たしていれば、対象ル
ープである。
【0058】C−2.インデックスセットの分配 左辺の配列とループに関する次の3つの情報から、イン
デックスセットの分配が求まる。
【0059】・最内ループの上限値 ・m番目の添字式a * #IV.d + b ・分割の仕方
【0060】インデックスセットの分配は、具体的には
次のようにして求める。先ず、最内ループの上限値をUB
とする。添字式a * #IV.d + bであるから最内ループの
実行では、左辺のm番目の次元についてaが正の場合a+b
からa*UB+bまでa飛び、aが負の場合a*UB+bからa+bまでa
飛び、の順にアクセスされる。次に分割の仕方すなわち
左辺の配列のm番目の次元をブロック状に分割するプロ
セッサの情報から、左辺のm番目の次元をアクセスした
時にどのプロセッサがどの範囲をアクセスするかを求め
る。さらに各プロセッサのアクセスする範囲を添字式su
bs_m=a * #IV.d+ bの逆関数である#IV.d=(subs_m - b)
/ aによって、その範囲をアクセスするインデックス変
数の範囲を求める。求められたものが分配されたインデ
ックスセットである。
【0061】例えば正規化された標準ループを考える。
【数6】
【0062】この場合、配列a(1:MAX)はPn個のプロセッ
サにブロック状に分散して保持されている。また最内ル
ープのインデックス変数を含む添字式は、subs=i+M-1で
その逆関数はi=subs-M+1である。最内ループの上限値は
N-M+1である。まず左辺はMからNまで1飛びでアクセスさ
れる。a(M), a(N)を所有するプロセッサをそれぞれP
(M), P(N)とする。1からP(M)-1までのプロセッサと、P
(N)+1からPnまでのプロセッサには、インデックスセッ
トは分配されない。P(M)からP(N)までのプロセッサにだ
けインデックスセットは分配される。各プロセッサには
ne個ずつ配列要素が保持されているため、M,Nがneの倍
数+1でないと半端が生じ、P(M), P(N)に分配されるイン
デックスセットも半端になるが、その間のP(M)+1からP
(N)-1までのプロセッサpでは左辺は1+(p-1)*neからne+
(p-1)*neまで1飛びでアクセスされる。こうして各プロ
セッサごとの、左辺のアクセスされる範囲が求まる。こ
れをさらに逆関数i=subs-M+1によって各プロセッサごと
のそのアクセスを行なうインデックスセットを求める。
例えばP(M)+1からP(N)-1までのプロセッサpでは、1+(p-
1)*ne-M+1からne+(p-1)*ne-M+1までがその分配されたイ
ンデックスセットである。
【0063】尚、指定するプロセッサの数及び分割の仕
方は、HPFの場合、*hpf$で始まるステートメントで
指定することもできるし、あるいは、プログラムの実行
時、コマンドライン・パラメータで与えたり、特定のモ
ジュールが、接続されているプロセッサを識別してプロ
セッサの数及び分割の仕方を自動的に決定するようにす
ることもできる。
【0064】最内ループの上限値や分配されたインデッ
クスセットを保持するデータ構造へのポインタをlis_pt
r, 左辺のm番目の添字式を保持するデータ構造へのポイ
ンタをsubs_ptr, 左辺の分割の仕方を保持するデータ構
造へのポインタをdecomp_ptrとすると、こうした分配さ
れるインデックスセットの計算は、compute_lisという
実行時ライブラリの中で計算される。compute_lisは次
のようにして呼び出される。
【数7】 call compute_lis(lis_ptr, subs_ptr, decomp_ptr)
【0065】上記の例では、subs_ptrには、(i+M-1)が
与えられ、decomp_ptrには、Pnのプロセッサそれぞれ
が配列aのどのような値をもっているかという情報が与
えられ、lis_ptrは、compute_lisの計算結果としての情
報、すなわち、各プロセッサの分配されたインデックス
セットが、lb:ub:stのような形で保持されている情報へ
のポインタである。
【0066】C−3.受信プロセッサセットの計算 一般には、添字式a * #IV.d + b、分割方法、xの値によ
って、最内ループで定義前の値を使うか、定義後の値を
使うかプロセッサ毎に異なる。
【0067】aが正の場合を考える。左辺のm次元目は、
a+bからa*UB+bまでa飛びでアクセスされる。mod(x-b,
a)が0でない、あるいはa+b > xまたはa*UB+b < xの場合
はループで定義されない。定義されない場合は定義前の
値を使うプロセッサセットrecv_preに左辺の代入を行な
うプロセッサすべてを入れる。一方、mod(x-b, a)が0
で、a+b <= x <=a*UB+bの場合はループで定義される可
能性がある。a * ix + bがxと等しいすると、1からixま
での一部を分配されたインデックスセットに持つプロセ
ッサはループで定義前の値を使用する。これらをrecv_p
reとする。またix+1からUBまでの一部を分配されたイン
デックスセットに持つプロセッサはループで定義後の値
を使用する。これらをrecv_postとする。
【0068】aが負の場合を考える。左辺のm次元目は、
a*UB+bからa+bまでa飛びでアクセスされる。mod(x-b, |
a|)が0でない、あるいはa*UB+b > xまたはa+b < xの場
合はループで定義されない。定義されない場合は定義前
の値を使うプロセッサセットrecv_preに左辺の代入を行
なうプロセッサすべてを入れる。一方、mod(x-b, |a|)
が0で、a*UB+b <= x <=a+bの場合はループで定義される
可能性がある。a * ix+ bがxと等しいすると、UBからix
までの一部を分配されたインデックスセットに持つプロ
セッサはループで定義前の値を使用する。これらをrecv
_preとする。またix-1から1までの一部を分配されたイ
ンデックスセットに持つプロセッサはループで定義後の
値を使用する。これらをrecv_postとする。
【0069】以上、recv_pre, recv_postをまとめると
次のようになる。 (a) mod(x-b, |a|)が0でない場合 recv_pre=左辺代入するすべてのプロセッサ (b) mod(x-b, |a|)が0、かつaが正、かつa+b > xの場合 recv_pre=左辺代入するすべてのプロセッサ (c) mod(x-b, |a|)が0、かつaが正、かつx > a*UB+bの
場合 recv_pre=左辺代入するすべてのプロセッサ (d) mod(x-b, |a|)が0、かつaが正、かつa+b <= x <= a
*UB+bの場合 recv_pre=1から(x-b)/aまでの一部を分配されたインデ
ックスセットとして持つプロセッサ recv_post=(x-b)/a+1からUBまでの一部を分配されたイ
ンデックスセットとして持つプロセッサ (e) mod(x-b, |a|)が0、かつaが負、かつa*UB+b > xの
場合 recv_pre=左辺代入するすべてのプロセッサ (f) mod(x-b, |a|)が0、かつaが負、かつx > a+bの場合 recv_pre=左辺代入するすべてのプロセッサ (g) mod(x-b, |a|)が0、かつaが負、かつa*UB+b <= x <
= a+bの場合 recv_pre=(x-b)/aからUBまでの一部を分配されたインデ
ックスセットとして持つプロセッサ recv_post=1から(x-b)/a-1までの一部を分配されたイン
デックスセットとして持つプロセッサ
【0070】正規化された標準ループではa=1,b=M-1,UB
=N-M+1と置き換えて次のようになる。なお(a),(e),(f),
(g)の場合はとり得ないので省略した。 (b) mod(x-M+1, |1|)が0、かつ1が正、かつ1+M+1 > xの
場合 recv_pre=左辺代入するすべてのプロセッサ (c) mod(x-M+1, |1|)が0、かつ1が正、かつx > 1*(N-M+
1)+M+1の場合 recv_pre=左辺代入するすべてのプロセッサ (d) mod(x-M+1, |1|)が0、かつ1が正、かつ1+M+1 <= x
<=1*(N-M+1)+M+1の場合 recv_pre=1からx-M+1までの一部を分配されたインデッ
クスセットとして持つプロセッサ recv_post=x-M+2からN-M+1までの一部を分配されたイン
デックスセットとして持つプロセッサ
【0071】recv_pre, recv_postのデータ構造へのポ
インタをそれぞれpre_ptr,post_ptrとする。こうしたre
cv_pre, recv_postの計算は、compute_pre_postという
実行時ライブラリの中で計算される。compute_pre_post
は、次のようにして呼び出される。
【数8】call compute_pre_post(x, lis_ptr, subs_pt
r, pre_ptr, post_ptr)
【0072】C−4. 受信プロセッサセットに対する
通信 最内ループよりも外側のd-1重ループのインデックス変
数は固定とみなせ、またxも決まっているので、右辺に
登場する左辺と同じ配列でm次元目にxを持つ配列要素RH
Sxは、配列の分割情報を利用してその所有者プロセッサ
が求められる。所有者プロセッサをpxとする。プロセッ
サpxは最内ループの前で先ほど求めたrecv_pre(ループ
で定義前の値を使用するプロセッサセット)に登録され
たプロセッサにRHSxを送信し、recv_preに登録されたプ
ロセッサは受信する。またプロセッサpxは最内ループの
後で先ほど求めたrecv_post(ループで定義後の値を使
用するプロセッサセット)に登録されたプロセッサにRH
Sxを送信し、recv_postに登録されたプロセッサは受信
する。
【0073】最内ループの外側のループインデックス変
数の値を保持するデータ構造へのポインタをiv_ptr, RH
Sxの全次元の添字式の情報を保持するデータ構造へのポ
インタをsubs_all_ptrとすると、こうした通信は、pre_
send、post_sendという実行時ライブラリの中で行なわ
れる。このために、次のようにして、pre_send及びpost
_sendという手続きが呼び出される。
【数9】 call pre_send(iv_ptr, subs_all_ptr, pre_ptr) call post_send(iv_ptr, subs_all_ptr, post_ptr)
【0074】C−5.最内ループパイプライン化された
疑似SPMDコード 以上により、最内ループパイプライン化された疑似SP
MDコードはつぎのようになる。ただし、lis.lb(p), l
is.ub(p)は、compute_lisで初期されたlis_ptrが指すデ
ータ構造の中のプロセッサpに関するデータで、分配さ
れたインデックスセットの下限、上限である。
【数10】 call compute_lis(lis_ptr, subs_ptr, decomp_ptr) call compute_pre_post(x, lis_ptr, subs_ptr, pre_ptr, post_ptr) call pre_send(iv_ptr, subs_all_ptr, pre_ptr) do #IV.d=lis.lb(p), lis.ub(p) a(..., a * #IV.d + b, ...) = a(..., x, ...) enddo call post_send(iv_ptr, subs_all_ptr, post_ptr)
【0075】上記プログラム中で、doからenddoまでの
部分は、各プロセッサp毎に、すなわち、各プロセッサp
で並列に実行される。
【0076】
【発明の効果】以上説明したように、本発明によれば、
従来技術では並列化不可能であった、複数のデータ依存
性をもつ式を含むループを効率的に並列化することがで
きるコンパイラが提供される。
【0077】また、上記実施例では、HPF(FORT
RAN90をベースとする並列処理言語)に基づき説明
を行ったが、本発明はこのような特定のプログラミング
言語に限定されるものではなく、APL、C*(Cをベ
ースとする並列言語)などの、マルチプロセッサ環境に
おける並列処理をサポートする任意の言語処理系に適用
可能である。
【0078】さらに、本発明が対象とするループは、do
.. enddo ループのみならず、FORTRAN90が提
供するアレイ計算や、SPREAD、CSHIFTなどのTIF(Tr
ansformational Intrinsic Functions)によって提供さ
れる処理にも拡張される。
【図面の簡単な説明】
【図1】 分散メモリ型マルチプロセッサの構成を示す
ブロック図である。
【図2】 共有メモリ型マルチプロセッサの構成を示す
ブロック図である。
【図3】 本発明の処理の手順を示すフローチャートの
図である。
フロントページの続き (72)発明者 小松 秀昭 神奈川県大和市下鶴間1623番地14 日本ア イ・ビー・エム株式会社 東京基礎研究所 内

Claims (12)

    【特許請求の範囲】
  1. 【請求項1】複数のプロセッサをもつコンピュータにお
    いて、ソース・プログラムにおけるループを複数のプロ
    セッサに分割して並列に実行させることにより、プログ
    ラムの実行を高速化するようにコードを生成するため
    の、コンパイラにおけるコード生成方法であって、(a)
    ソース・プログラムを読み込む段階と、(b) 上記ソース
    ・プログラムにおいて、インデックスセットが分配可能
    かどうかが決まる、という条件は満たすが、代入文右辺
    のデータ依存が1つに決められる、という条件は満たさ
    ないループを見出す段階と、(c) 上記見出されたされた
    ループの最も内側のループのインデックス変数を#IV.d
    とし、そのループ内の式における、両辺に同一の、N次
    元(Nは1以上の整数)の配列aをもつ式に着目し、そ
    の式の左辺の配列aのm番目(mは1以上でN以下の任
    意の整数)の添字がc1 * #V1.d + c2(c1,c2は、該最
    も内側のループにおけるループ不変定数であって、c1
    は、0に等しくない)であること、その式の左辺の配列
    aのm番目の次元が複数のプロセッサ間でブロック状に
    分配されていることと、及びその式の右辺の配列aのm
    番目の添字式xが、コンパイル時点では値が不定である
    けれどもプログラム実行時点では値が最内ループで不変
    であるような変数であること、という条件を満足するか
    どうかを決定する段階と、(d) 上記段階(c)において上
    記条件が満足されたと決定されたことに応答して、上記
    c1,c2及び上記m番目の添字の上記複数のプロセッサ間
    の分配の情報に応じて、上記複数のプロセッサ毎に、ル
    ープ計算の添字の下限lbと上限ubを計算し保持する段階
    と、(e) 上記段階(d)で計算された、上記複数のプロセ
    ッサ毎のループ計算の添字の下限lbと上限ubの値と、上
    記c1,c2と、上記xの値に応じて、受信プロセッサセッ
    トを計算する段階と、(f) 上記段階(e)で計算された受
    信プロセッサセットに応じて、受信プロセッサセットに
    対する通信を行うコードを生成する段階と、(g) 上記段
    階(d)で計算されたプロセッサ毎のループ計算の添字の
    下限lbと上限ubの値に応じて、上記最も内側のループに
    関して、上記複数のプロセッサ毎にパイプライン化され
    たループのコードを生成する段階を有する、 に記載のコンパイラにおけるコード生成方法。
  2. 【請求項2】上記ソース・プログラムは、FORTRA
    Nで記述されている請求項1に記載のコンパイラにおけ
    るコード生成方法。
  3. 【請求項3】上記ソース・プログラムは、使用するプロ
    セッサの数及び分割方法を指定するコードを含む請求項
    2に記載のコンパイラにおけるコード生成方法。
  4. 【請求項4】複数のプロセッサをもつコンピュータにお
    いて、ソース・プログラムにおけるループを複数のプロ
    セッサに分割して並列に実行させることにより、プログ
    ラムの実行を高速化するようにコードを生成するため
    の、コンパイラにおけるコード生成方法であって、(a)
    ソース・プログラムを読み込む段階と、(b) 上記ソース
    ・プログラムにおいて、インデックスセットが分配可能
    かどうかが決まる、という条件は満たすが、代入文右辺
    のデータ依存が1つに決められる、という条件は満たさ
    ないループを見出す段階と、(c) 上記見出されたされた
    ループの最も内側のループのインデックス変数を#IV.d
    とし、そのループ内の式における、両辺に同一の、N次
    元(Nは1以上の整数)の配列aをもつ式に着目し、そ
    の式の左辺の配列aのm番目(mは1以上でN以下の任
    意の整数)の添字がc1 * #V1.d + c2(c1,c2は、該最
    も内側のループにおけるループ不変定数であって、c1
    は、0に等しくない)であること、その式の左辺の配列
    aのm番目の次元が複数のプロセッサ間でブロック状に
    分配されていることと、及びその式の右辺の配列aのm
    番目の添字式xが、コンパイル時点では値が不定である
    けれどもプログラム実行時点では値が最内ループで不変
    であるような変数であること、という条件を満足するか
    どうかを決定する段階と、(d) 上記段階(c)において上
    記条件が満足されたと決定されたことに応答して、上記
    c1,c2及び上記m番目の添字の上記複数のプロセッサ間
    の分配の情報に応じて、上記複数のプロセッサ毎に、ル
    ープ計算の添字の下限lbと上限ubを計算し保持する段階
    と、(e) 上記段階(d)で計算された、上記複数のプロセ
    ッサ毎のループ計算の添字の下限lbと上限ubの値と、上
    記c1,c2と、上記xの値に応じて、上記最も内側のルー
    プの前に通信されるべき受信プロセッサセットと、上記
    最も内側のループの後に通信されるべき受信プロセッサ
    セットを計算する段階と、(f) 上記段階(e)で計算され
    た受信プロセッサセットに応じて、上記最も内側のルー
    プの前に通信されるべき受信プロセッサセットに対する
    通信を行うコードを生成する段階と、(g) 上記段階(d)
    で計算されたプロセッサ毎のループ計算の添字の下限lb
    と上限ubの値に応じて、上記最も内側のループに関し
    て、上記複数のプロセッサ毎にパイプライン化されたル
    ープのコードを生成する段階と、(h) 上記段階(e)で計
    算された受信プロセッサセットに応じて、上記最も内側
    のループの後に通信されるべき受信プロセッサセットに
    対する通信を行うコードを生成する段階を有する、 に記載のコンパイラにおけるコード生成方法。
  5. 【請求項5】上記ソース・プログラムは、FORTRA
    Nで記述されている請求項4に記載のコンパイラにおけ
    るコード生成方法。
  6. 【請求項6】上記ソース・プログラムは、使用するプロ
    セッサの数及び分割方法を指定するコードを含む、請求
    項5に記載のコンパイラにおけるコード生成方法。
  7. 【請求項7】複数のプロセッサをもつコンピュータにお
    いて、ソース・プログラムにおけるループを複数のプロ
    セッサに分割して並列に実行させることにより、プログ
    ラムの実行を高速化するようにコードを生成するため
    の、コンパイラにおけるコード生成方法であって、(a)
    ソース・プログラムを読み込む段階と、(b) 上記ソース
    ・プログラムにおいて、インデックスセットが分配可能
    かどうかを決定し、もしそうでないならプロセッサ間で
    通信を行わせるコードをループ内に生成する段階と、
    (c) 上記ソース・プログラムにおいて、インデックスセ
    ットが分配可能である場合に、代入文右辺のデータ依存
    が1つに決められるかどうかを決定する段階と、(d) 上
    記段階(c)において代入文右辺のデータ依存が1つに決
    められると判断されたことに応答して、ループにおける
    インデックスを複数のプロセッサの間で分割して並列に
    実行させるコードを生成する段階と、(e) 上記段階(c)
    において代入文右辺のデータ依存が1つに決められない
    と判断されたことに応答して、上記見出されたされたル
    ープの最も内側のループのインデックス変数を#IV.dと
    し、そのループ内の式における、両辺に同一の、N次元
    (Nは1以上の整数)の配列aをもつ式に着目し、その
    式の左辺の配列aのm番目(mは1以上でN以下の任意
    の整数)の添字がc1 * #V1.d + c2(c1,c2は、該最も
    内側のループにおけるループ不変定数であって、c1
    は、0に等しくない)であること、その式の左辺の配列
    aのm番目の次元が複数のプロセッサ間でブロック状に
    分配されていることと、及びその式の右辺の配列aのm
    番目の添字式xが、コンパイル時点では値が不定である
    けれどもプログラム実行時点では値が最内ループで不変
    であるような変数であること、という条件を満足するか
    どうかを決定する段階と、(f) 上記段階(e)において上
    記条件が満足されたと決定されたことに応答して、上記
    c1,c2及び上記m番目の添字の上記複数のプロセッサ間
    の分配の情報に応じて、上記複数のプロセッサ毎に、ル
    ープ計算の添字の下限lbと上限ubを計算し保持する段階
    と、(g) 上記段階(f)で計算された、上記複数のプロセ
    ッサ毎のループ計算の添字の下限lbと上限ubの値と、上
    記c1,c2と、上記xの値に応じて、上記最も内側のルー
    プの前に通信されるべき受信プロセッサセットと、上記
    最も内側のループの後に通信されるべき受信プロセッサ
    セットを計算する段階と、(h) 上記段階(g)で計算され
    た受信プロセッサセットに応じて、上記最も内側のルー
    プの前に通信されるべき受信プロセッサセットに対する
    通信を行うコードを生成する段階と、(i) 上記段階(f)
    で計算されたプロセッサ毎のループ計算の添字の下限lb
    と上限ubの値に応じて、上記最も内側のループに関し
    て、上記複数のプロセッサ毎にパイプライン化されたル
    ープのコードを生成する段階と、(j) 上記段階(g)で計
    算された受信プロセッサセットに応じて、上記最も内側
    のループの後に通信されるべき受信プロセッサセットに
    対する通信を行うコードを生成する段階を有する、 に記載のコンパイラにおけるコード生成方法。
  8. 【請求項8】複数のプロセッサをもつコンピュータにお
    いて、ソース・プログラムにおけるループを複数のプロ
    セッサに分割して並列に実行させることにより、プログ
    ラムの実行を高速化するようにコードを生成するため
    の、コンパイラにおけるコード生成方法であって、(a)
    ソース・プログラムを読み込む段階と、(b) 上記ソース
    ・プログラムにおいて、インデックスセットが分配可能
    かどうかを決定し、もしそうでないならプロセッサ間で
    通信を行わせるコードをループ内に生成する段階と、
    (c) 上記ソース・プログラムにおいて、インデックスセ
    ットが分配可能である場合に、代入文右辺のデータ依存
    が1つに決められるかどうかを決定する段階と、(d) 上
    記段階(c)において代入文右辺のデータ依存が1つに決
    められると判断されたことに応答して、ループにおける
    インデックスを複数のプロセッサの間で分割して並列に
    実行させるコードを生成する段階と、(e) 上記段階(c)
    において代入文右辺のデータ依存が1つに決められない
    と判断されたことに応答して、上記見出されたされたル
    ープの最も内側のループのインデックス変数を#IV.dと
    し、そのループ内の式における、両辺に同一の、N次元
    (Nは1以上の整数)の配列aをもつ式に着目し、その
    式の左辺の配列aのm番目(mは1以上でN以下の任意
    の整数)の添字がc1 * #V1.d + c2(c1,c2は、該最も
    内側のループにおけるループ不変定数であって、c1
    は、0に等しくない)であること、その式の左辺の配列
    aのm番目の次元が複数のプロセッサ間でブロック状に
    分配されていることと、及びその式の右辺の配列aのm
    番目の添字式xが、コンパイル時点では値が不定である
    けれどもプログラム実行時点では値が最内ループで不変
    であるような変数であること、という条件を満足するか
    どうかを決定する段階と、(f) 上記段階(e)において上
    記条件が満足されないことに応答して、プロセッサ間で
    通信を行わせるコードをループ内に生成する段階と、
    (g) 上記段階(e)において上記条件が満足されたと決定
    されたことに応答して、上記c1,c2及び上記m番目の添
    字の上記複数のプロセッサ間の分配の情報に応じて、上
    記複数のプロセッサ毎に、ループ計算の添字の下限lbと
    上限ubを計算し保持する段階と、(h) 上記段階(g)で計
    算された、上記複数のプロセッサ毎のループ計算の添字
    の下限lbと上限ubの値と、上記c1,c2と、上記xの値に
    応じて、上記最も内側のループの前に通信されるべき受
    信プロセッサセットと、上記最も内側のループの後に通
    信されるべき受信プロセッサセットを計算する段階と、
    (i) 上記段階(h)で計算された受信プロセッサセットに
    応じて、上記最も内側のループの前に通信されるべき受
    信プロセッサセットに対する通信を行うコードを生成す
    る段階と、(j) 上記段階(g)で計算されたプロセッサ毎
    のループ計算の添字の下限lbと上限ubの値に応じて、上
    記最も内側のループに関して、上記複数のプロセッサ毎
    にパイプライン化されたループのコードを生成する段階
    と、(k) 上記段階(h)で計算された受信プロセッサセッ
    トに応じて、上記最も内側のループの後に通信されるべ
    き受信プロセッサセットに対する通信を行うコードを生
    成する段階を有する、に記載のコンパイラにおけるコー
    ド生成方法。
  9. 【請求項9】上記段階(h)での受信プロセッサセットの
    計算は、最内ループにおけるインデックスの上限をUBと
    して、 (1) mod(x-c2, |c1|)が0でない場合 recv_pre=左辺代入するすべてのプロセッサ (2) mod(x-c2, |c1|)が0、かつc1が正、かつc1+c2 > x
    の場合 recv_pre=左辺代入するすべてのプロセッサ (3) mod(x-c2, |c1|)が0、かつc1が正、かつx > c1*UB+
    c2の場合 recv_pre=左辺代入するすべてのプロセッサ (4) mod(x-c2, |c1|)が0、かつc1が正、かつc1+c2 <= x
    <= c1*UB+c2の場合 recv_pre=1から(x-c2)/c1までの一部を分配されたイン
    デックスセットとして持つプロセッサ recv_post=(x-c2)/c1+1からUBまでの一部を分配された
    インデックスセットとして持つプロセッサ (4) mod(x-c2, |c1|)が0、かつc1が負、かつc1*UB+c2 >
    xの場合 recv_pre=左辺代入するすべてのプロセッサ (6) mod(x-c2, |c1|)が0、かつc1が負、かつx > c1+c2
    の場合 recv_pre=左辺代入するすべてのプロセッサ (7) mod(x-c2, |c1|)が0、かつc1が負、かつc1*UB+c2 <
    = x <= c1+c2の場合recv_pre=(x-c2)/c1からUBまでの一
    部を分配されたインデックスセットとして持つプロセッ
    サ recv_post=1から(x-c2)/c1-1までの一部を分配されたイ
    ンデックスセットとして持つプロセッサ の場合分けによって、上記最も内側のループの前に通信
    されるべき受信プロセッサセットrecv_preと、上記最も
    内側のループの後に通信されるべき受信プロセッサセッ
    トrecv_postを計算する段階を有する、請求項8に記載
    のコンパイラにおけるコード生成方法。
  10. 【請求項10】複数のプロセッサをもつコンピュータに
    おいて、ソース・プログラムにおけるループを複数のプ
    ロセッサに分割して並列に実行させることにより、プロ
    グラムの実行を高速化するようにコードを生成するため
    の、コンパイラであって、(a) コンパイルすべきソース
    ・プログラムにおいて、インデックスセットが分配可能
    かどうかが決まる、という条件は満たすが、代入文右辺
    のデータ依存が1つに決められる、という条件は満たさ
    ないループを見出す手段と、(b) 上記見出されたされた
    ループの最も内側のループのインデックス変数を#IV.d
    とし、そのループ内の式における、両辺に同一の、N次
    元(Nは1以上の整数)の配列aをもつ式に着目し、そ
    の式の左辺の配列aのm番目(mは1以上でN以下の任
    意の整数)の添字がc1 * #V1.d + c2(c1,c2は、該最
    も内側のループにおけるループ不変定数であって、c1
    は、0に等しくない)であること、その式の左辺の配列
    aのm番目の次元が複数のプロセッサ間でブロック状に
    分配されていることと、及びその式の右辺の配列aのm
    番目の添字式xが、コンパイル時点では値が不定である
    けれどもプログラム実行時点では値が最内ループで不変
    であるような変数であること、という条件を満足するか
    どうかを決定する手段と、(c) 上記手段(b)において上
    記条件が満足されたと決定されたことに応答して、上記
    c1,c2及び上記m番目の添字の上記複数のプロセッサ間
    の分配の情報に応じて、上記複数のプロセッサ毎に、ル
    ープ計算の添字の下限lbと上限ubを計算し保持する手段
    と、(d) 上記手段(c)で計算された、上記複数のプロセ
    ッサ毎のループ計算の添字の下限lbと上限ubの値と、上
    記c1,c2と、上記xの値に応じて、受信プロセッサセッ
    トを計算する手段と、(e) 上記手段(d)で計算された受
    信プロセッサセットに応じて、受信プロセッサセットに
    対する通信を行うコードを生成する手段と、(f) 上記手
    段(c)で計算されたプロセッサ毎のループ計算の添字の
    下限lbと上限ubの値に応じて、上記最も内側のループに
    関して、上記複数のプロセッサ毎にパイプライン化され
    たループのコードを生成する手段を具備する、 に記載のコンパイラ。
  11. 【請求項11】上記ソース・プログラムは、FORTR
    ANで記述されている請求項10に記載のコンパイラ。
  12. 【請求項12】上記手段(d)は、最内ループにおけるイ
    ンデックスの上限をUBとして、 (1) mod(x-c2, |c1|)が0でない場合 recv_pre=左辺代入するすべてのプロセッサ (2) mod(x-c2, |c1|)が0、かつc1が正、かつc1+c2 > x
    の場合 recv_pre=左辺代入するすべてのプロセッサ (3) mod(x-c2, |c1|)が0、かつc1が正、かつx > c1*UB+
    c2の場合 recv_pre=左辺代入するすべてのプロセッサ (4) mod(x-c2, |c1|)が0、かつc1が正、かつc1+c2 <= x
    <= c1*UB+c2の場合 recv_pre=1から(x-c2)/c1までの一部を分配されたイン
    デックスセットとして持つプロセッサ recv_post=(x-c2)/c1+1からUBまでの一部を分配された
    インデックスセットとして持つプロセッサ (4) mod(x-c2, |c1|)が0、かつc1が負、かつc1*UB+c2 >
    xの場合 recv_pre=左辺代入するすべてのプロセッサ (6) mod(x-c2, |c1|)が0、かつc1が負、かつx > c1+c2
    の場合 recv_pre=左辺代入するすべてのプロセッサ (7) mod(x-c2, |c1|)が0、かつc1が負、かつc1*UB+c2 <
    = x <= c1+c2の場合 recv_pre=(x-c2)/c1からUBまでの一部を分配されたイン
    デックスセットとして持つプロセッサ recv_post=1から(x-c2)/c1-1までの一部を分配されたイ
    ンデックスセットとして持つプロセッサ の場合分けによって、上記最も内側のループの前に通信
    されるべき受信プロセッサセットrecv_preと、上記最も
    内側のループの後に通信されるべき受信プロセッサセッ
    トrecv_postを計算する手段を有する、請求項10に記
    載のコンパイラ。
JP6311764A 1994-12-15 1994-12-15 コンパイラにおけるコード生成方法及びコンパイラ Expired - Lifetime JP2669603B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP6311764A JP2669603B2 (ja) 1994-12-15 1994-12-15 コンパイラにおけるコード生成方法及びコンパイラ
US08/570,996 US6016397A (en) 1994-12-15 1995-12-12 Method and apparatus for compilation of a data parallel language

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP6311764A JP2669603B2 (ja) 1994-12-15 1994-12-15 コンパイラにおけるコード生成方法及びコンパイラ

Publications (2)

Publication Number Publication Date
JPH08185325A true JPH08185325A (ja) 1996-07-16
JP2669603B2 JP2669603B2 (ja) 1997-10-29

Family

ID=18021210

Family Applications (1)

Application Number Title Priority Date Filing Date
JP6311764A Expired - Lifetime JP2669603B2 (ja) 1994-12-15 1994-12-15 コンパイラにおけるコード生成方法及びコンパイラ

Country Status (2)

Country Link
US (1) US6016397A (ja)
JP (1) JP2669603B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010191506A (ja) * 2009-02-16 2010-09-02 Fujitsu Ltd コンパイル装置およびコンパイルプログラム

Families Citing this family (22)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6074433A (en) * 1995-08-25 2000-06-13 Fujitsu Limited Optimization control apparatus and optimization control method for array descriptions
JP3640081B2 (ja) * 1999-12-27 2005-04-20 日本電気株式会社 Mpiプログラムのコンパイルにおける最適化方法
US6728694B1 (en) * 2000-04-17 2004-04-27 Ncr Corporation Set containment join operation in an object/relational database management system
US7086040B2 (en) * 2001-01-30 2006-08-01 Northwestern University Method for array shape inferencing for a class of functions in MATLAB
US6952821B2 (en) * 2002-08-19 2005-10-04 Hewlett-Packard Development Company, L.P. Method and system for memory management optimization
US7484079B2 (en) * 2002-10-31 2009-01-27 Hewlett-Packard Development Company, L.P. Pipeline stage initialization via task frame accessed by a memory pointer propagated among the pipeline stages
US20070094652A1 (en) * 2005-10-21 2007-04-26 Chia Joshua J Lockless scheduling of decreasing chunks of a loop in a parallel program
US8104030B2 (en) * 2005-12-21 2012-01-24 International Business Machines Corporation Mechanism to restrict parallelization of loops
US8112751B2 (en) * 2007-03-01 2012-02-07 Microsoft Corporation Executing tasks through multiple processors that process different portions of a replicable task
US9672019B2 (en) 2008-11-24 2017-06-06 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US20100274972A1 (en) * 2008-11-24 2010-10-28 Boris Babayan Systems, methods, and apparatuses for parallel computing
US10621092B2 (en) 2008-11-24 2020-04-14 Intel Corporation Merging level cache and data cache units having indicator bits related to speculative execution
US9189233B2 (en) 2008-11-24 2015-11-17 Intel Corporation Systems, apparatuses, and methods for a hardware and software system to automatically decompose a program to multiple parallel threads
US8627042B2 (en) * 2009-12-30 2014-01-07 International Business Machines Corporation Data parallel function call for determining if called routine is data parallel
US8453135B2 (en) * 2010-03-11 2013-05-28 Freescale Semiconductor, Inc. Computation reuse for loops with irregular accesses
WO2012004972A1 (ja) * 2010-07-05 2012-01-12 パナソニック株式会社 プログラム生成装置、プログラム生産方法及びプログラム
US8683185B2 (en) 2010-07-26 2014-03-25 International Business Machines Corporation Ceasing parallel processing of first set of loops upon selectable number of monitored terminations and processing second set
US9417855B2 (en) 2011-09-30 2016-08-16 Intel Corporation Instruction and logic to perform dynamic binary translation
US9114331B2 (en) 2012-09-28 2015-08-25 Random Technologies Llc Apparatus and method for degassing liquids
US9891936B2 (en) 2013-09-27 2018-02-13 Intel Corporation Method and apparatus for page-level monitoring
US10180829B2 (en) * 2015-12-15 2019-01-15 Nxp Usa, Inc. System and method for modulo addressing vectorization with invariant code motion
US10628141B2 (en) * 2018-05-07 2020-04-21 Intel Corporation Compiler transformation with loop and data partitioning

Family Cites Families (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3053092B2 (ja) * 1987-06-05 2000-06-19 株式会社日立製作所 並列化コンパイル方法
JP2738692B2 (ja) * 1988-01-29 1998-04-08 株式会社日立製作所 並列化コンパイル方法
CA1319757C (en) * 1988-07-29 1993-06-29 Digital Equipment Corporation Echelon method for execution of nested loops in multiple processor computers
JPH03111971A (ja) * 1989-09-27 1991-05-13 Toshiba Corp ベクトル化診断方式
US5202995A (en) * 1989-10-12 1993-04-13 International Business Machines Corporation Method for removing invariant branches from instruction loops of a computer program
JPH04211830A (ja) * 1990-02-05 1992-08-03 Matsushita Electric Ind Co Ltd 並列化コンパイル方式
JPH0475139A (ja) * 1990-07-18 1992-03-10 Toshiba Corp ループ並列化装置
US5274818A (en) * 1992-02-03 1993-12-28 Thinking Machines Corporation System and method for compiling a fine-grained array based source program onto a course-grained hardware
US5586325A (en) * 1993-12-10 1996-12-17 Cray Research, Inc. Method for the dynamic allocation of array sizes in a multiprocessor system

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010191506A (ja) * 2009-02-16 2010-09-02 Fujitsu Ltd コンパイル装置およびコンパイルプログラム

Also Published As

Publication number Publication date
US6016397A (en) 2000-01-18
JP2669603B2 (ja) 1997-10-29

Similar Documents

Publication Publication Date Title
JP2669603B2 (ja) コンパイラにおけるコード生成方法及びコンパイラ
Besta et al. To push or to pull: On reducing communication and synchronization in graph computations
Rogers et al. Process decomposition through locality of reference
Anderson et al. Optimal DNN primitive selection with partitioned boolean quadratic programming
US20190079805A1 (en) Execution node selection method and information processing apparatus
Katagiri et al. Early experiences for adaptation of auto-tuning by ppOpen-AT to an explicit method
US7555745B2 (en) Program and apparatus for translating language, and program converting method
Bakhtin et al. DVM-approach to the automation of the development of parallel programs for clusters
Jenista et al. OoOJava: An out-of-order approach to parallel programming
Moreira On the implementation and effectiveness of autoscheduling for shared-memory multiprocessors
Harris et al. Compiling High Performance Fortran for distributed-memory systems
US20030126589A1 (en) Providing parallel computing reduction operations
Roh et al. Generation and quantitative evaluation of dataflow clusters
Witterauf et al. Polyhedral fragments: an efficient representation for symbolically generating code for processor arrays
Légaux et al. Managing arbitrary distributions of arrays in Orléans Skeleton Library
Belyaev et al. LuNA-ICLU compiler for automated generation of iterative fragmented programs
Kalra Design and evaluation of register allocation on gpus
US11762641B2 (en) Allocating variables to computer memory
Sasidharan Performance Models for Hybrid Programs Accelerated by GPUs
JP2002073579A (ja) 分散共有メモリ向けコンパイル方法
Lossing et al. Automatic code generation of distributed parallel tasks
Seo et al. HPF/JA: extensions of High Performance Fortran for accelerating real‐world applications
Hsu et al. Efficient Methods for kr→ r and r→ kr Array Redistribution1
Bronevetsky et al. Compiling mpi for many-core systems
Lewis An OpenSHMEM Runtime for UPC