JP3551353B2 - データ再配置方法 - Google Patents

データ再配置方法 Download PDF

Info

Publication number
JP3551353B2
JP3551353B2 JP28169298A JP28169298A JP3551353B2 JP 3551353 B2 JP3551353 B2 JP 3551353B2 JP 28169298 A JP28169298 A JP 28169298A JP 28169298 A JP28169298 A JP 28169298A JP 3551353 B2 JP3551353 B2 JP 3551353B2
Authority
JP
Japan
Prior art keywords
array
loop
dimension
data
program
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
Application number
JP28169298A
Other languages
English (en)
Other versions
JP2000112901A (ja
Inventor
真琴 佐藤
孝志 廣岡
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 JP28169298A priority Critical patent/JP3551353B2/ja
Priority to US09/409,900 priority patent/US6681388B1/en
Publication of JP2000112901A publication Critical patent/JP2000112901A/ja
Application granted granted Critical
Publication of JP3551353B2 publication Critical patent/JP3551353B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Images

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/453Data distribution

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)

Description

【0001】
【発明の属する技術分野】
本発明は、逐次計算機向けのプログラムまたは並列計算機向けのデータ再分散指示を含むプログラムを入力してデータ再配置を行なったり、あるいは、データ再配置指示を挿入した並列計算機向けのプログラムまたはオブジェクトプログラムを生成するコンパイラに係り、特に、バッファへのコピー時間を不要とし、プログラムの実行時間を短縮することが可能なデータ再配置方法に関する。
【0002】
【従来技術】
従来、分散メモリ型並列計算機におけるデータ再分散を高速化する技術として、ダニエル・ジェイ・パレルモ、オイゲネ・ヴェー・ホッジ・フィエル、プリスヴィラージ・バナジー著「ダイナミック データ パーティショニング フォー ディストリビューテッド−メモリ マルチコンピューターズ」ジャーナル オブ パラレル アンド ディストリビューテッド コンピューティング 38、第158頁から第175頁(1988)(Daniel J. Palermo, Eugene W. Hodges IV, and Prithviraj Banerjee. ”Dynamic Data Partitioning for Distributed−Memory Multicomputers”, Journal of Parallel and Distributed Computing 38, pp. 158−175 (1998))中のpp.170−171で言及されているように、データ再分散オペレーションのアグレゲーション、即ち、データ再分散すべき複数の配列、または、データ再分散すべき一つの配列の中の非連続な部分を、1つのバッファの連続アドレス領域へプログラム実行時にコピーし、そのバッファに対して再分散を唯1回、行なうことで、再分散の起動オーバヘッドを削減するものがあった。
【0003】
また、従来、共有メモリ型並列計算機におけるFalse Sharingと呼ばれるキャッシュ間コンフリクトを削減する技術として、ジェニファー・エム・アンダースン、サマン・ピー・アマラシンハ、モニカ・エス・ラム著「データ アンド コミュニケーション トランスフォーメーションズ フォー マルチプロセッサーズ」ピーピーオーピーピー95、第166頁カラ第178頁、1995(Jennifer M. Anderson, Saman P. Amarasinghe, and Monica S. Lam. ”Data and Communication Transformations for Multiprocessors”, PPOPP’95, pp. 166−178 (1995) )で述べられているように、配列の次元の内、アドレスが連続する配列要素を特定するのに使われる次元を、プロセッサ個数分に分割し、その次元を、一つのプロセッサがアクセスする添字だけからなる次元と、プロセッサ番号を指定する次元の2つの次元に分割し、後者を、アドレスの増加が最も遅い次元になるように配列を高次元化することで、キャッシュ内のデータが2つのプロセッサにまたがる機会を減少させるものがあった。
【0004】
【発明が解決しようとする課題】
上記第1の従来技術は、プログラム実行時にバッファへコピーするため、コピーに余分な時間がかかるという問題点がある。
また、上記第1の従来技術は、再分散前後で配列の大きさが変化する可能性があるため、再分散のたびに配列領域の確保・開放が必要で、それらに余分な時間がかかるという問題点がある。
さらに、上記第1の従来技術は、上記配列領域の確保・開放、および、再分散前後で配列の形状が変化することにより、本来は不要な、再分散前後で同一のプロセッサに割り当てられる部分配列のコピーも必要で、それに余分な時間がかかるという問題点がある。
【0005】
上記第2の従来技術は、ある特定の次元の配列要素を複数プロセッサが分担して計算する時には適用可能だが、配列が3次元以上で、プログラム中に2つの異なるループが存在し、複数プロセッサが分担して計算する配列の次元がそれらのループに対して、各々、アドレスが連続になる次元から1次元目と2次元目である時、前者のループに対してはキャッシュ間コンフリクトの一種であるフォールスシェアリングがかなり削減可能である。しかし、後者のループに対しては配列の2次元目の、プロセッサ間の割り当て境界で、3次元目の各添字に対してプロセッサ総数だけ両プロセッサがキャッシュ共有する可能性があるため、フォールスシェアリングはあまり削減できないという問題点がある。
【0006】
本発明の目的は、プログラム実行時にバッファへのコピー処理をなくし、プログラムの実行時間を短縮することである。
また、本発明の別の目的は、再分散時の、配列領域の確保・開放処理をなくし、プログラムの実行時間を短縮することである。
また、本発明の別の目的は、再分散前後で同一のプロセッサに割り当てられる部分配列のコピーをなくすことにより、プログラムの実行時間を短縮することである。
また、本発明の別の目的は、プログラム中に複数の異なるループが存在し、各々のループで、複数プロセッサが分担して計算する配列の次元が異なる時に、それら全てのループに対してキャッシュ間コンフリクトを削減することにより、プログラムの実行時間を短縮することである。
【0007】
【課題を解決するための手段】
本発明は、上記目的を達成するために、プログラム中の各点における、各配列要素の分散メモリへの割付け方法を表わすデータ分散形状を収集する形状収集ステップ(図1の形状収集部103)と、各配列を、上記形状収集で得られたどのデータ分散形状においても、各部分配列が唯一のプロセッサに属するような部分配列からなる集合に分割する配列細分化ステップ(同、配列細分化部105)と、上記各部分配列内の配列要素が連続アドレスになるように元の配列の次元数を増加させて配列要素の順序を並び替える配列高次元化ステップ(同、配列高次元化部106)と、配列の各次元のデータ分散形状の種類が2種類以下であることを判定する形状種別数判定ステップ(同、形状種別数判定104)と、配列の高次元化される次元の添字にループ制御変数が含まれることを検出し、そのループ制御変数を持つループを、配列高次元化に対応して、ネストする複数のループに変換するループ変換ステップ(同、ループ変換部1071)と、プログラム中の配列参照点における配列添字を、配列高次元化に対応して変更する添字変更ステップ(同、添字変更部1072)と、分散メモリ型並列計算機の各プロセッサで、データ分散前の元の配列全体を宣言するグローバルデータ宣言作成ステップ(図7のステップ706)と、各配列参照点における配列添字の値を、データ分散前の元の値を用いるグローバル添字生成ステップ(図7のステップ7052)と、通信データのバッファリングを行なわない再分散通信を生成する非バッファリング再分散通信生成ステップ(図7のステップ7041)を含むものである。
【0008】
また、本発明は、上記別の目的を達成するために、複数プロセッサがその部分配列を分担して計算すべき配列に対して、プログラム中の各点における、各配列要素のプロセッサへの割付け方法を表わすデータ分担形状を収集する形状収集ステップ(図27の形状収集部103)と、各配列を、上記形状収集で得られたどのデータ分担形状においても、各部分配列が唯一のプロセッサの分担になるような部分配列からなる集合に分割する配列細分化ステップ(同、配列細分化部105)と、上記各部分配列内の配列要素が連続アドレスになるように元の配列の次元数を増加させて配列要素の順序を並び替える配列高次元化ステップ(同、配列高次元化部106)と、配列の各次元のデータ分担形状の種類が2種類以下であることを判定する形状種別数判定ステップ(同、形状種別数判定部104)と、配列の高次元化される次元の添字にループ制御変数が含まれることを検出し、そのループ制御変数を持つループを、配列高次元化に対応して、ネストする複数のループに変換するループ変換ステップ(同、ループ変換部1071)と、プログラム中の配列参照点における配列添字を、配列高次元化に対応して変更する添字変更ステップ(同、添字変更部1072)と、分散メモリ型並列計算機の各プロセッサで、データ分散前の元の配列全体を宣言するグローバルデータ宣言作成ステップ(図7のステップ706)と、各配列参照点における配列添字の値を、データ分散前の元の値を用いるグローバル添字生成ステップ(図7のステップ7052)と、通信データのバッファリングを行なわない再分散通信を生成する非バッファリング再分散通信生成ステップ(図7のステップ7041)を含むものである。
【0009】
【発明の実施の形態】
(第1の実施例)
以下、本発明の第1の実施例を図1から図26を用いて説明する。
第1の実施例では分散メモリを持つ並列計算機を対象としている。
図1は、本発明による並列化コンパイラの構成を示したものである。
100は並列化コンパイラである。並列化コンパイラ100は、同図に示すように、ソースプログラム110を入力して辞書120及び中間語130を出力する構文解析部101、辞書120及び中間語130を入力してデータ分散指示文を解析し、データ分散情報140を出力するデータ分散指示文解析部102、データ分散情報140を入力してプログラム内に現れるデータ分散形状情報を収集し、その結果を辞書120に反映させる形状収集部103、辞書120及びデータ分散情報140を入力して配列のデータ分散の種別数を判定し、配列を細分化すべきか否かを辞書120に反映させる形状種別数判定部104、辞書120及びデータ分散情報140を入力して配列を細分化し、その結果を辞書120に反映させる配列細分化部105、辞書120及びデータ分散情報140を入力して、データ分散形状が変化する次元の配列添字範囲を分割して、その次元を2つの次元に分けることによって配列を高次元化し、その結果を辞書120に反映させる配列高次元化部106、辞書120,データ分散情報140及び中間語130を入力してプログラムを変換し、その結果を中間語130に反映し、またループテーブル150を出力するプログラム変換部107,辞書120,データ分散情報140,中間語130及びループテーブル150を入力してプログラムを並列化し、その結果を辞書120,中間語130,ループテーブル150に反映するプログラム並列化部108、辞書120,中間語130,ループテーブル150を入力して並列化プログラム160を出力するコード生成部109よりなる。
【0010】
ここで、プログラム変換部107は、辞書120,データ分散情報140及び中間語130を入力して、配列を高次元化する時に添字範囲を分割することによって生じる、分割境界をまたいだ配列要素の参照とそうでない配列要素の参照で添字が異なることに対処するために、分割境界をまたいだ配列要素を参照する文を含むループ繰り返しと、そのような文を含まないループ繰り返しを別のループにするループピーリングと、配列高次元化に伴い、増加した添字に対するループを作成するループ多重化とを行い、その結果をループテーブル150を作成してそこに反映し、また中間語130に反映するループ変換部1071、配列の高次元化とループピーリングに伴って、配列の添字を変更する添字変更部1072、よりなる。
【0011】
本実施例におけるソースプログラム110は、HPF(High Performance Fortran)のようなデータ分散指示文の入ったプログラムであり、並列化プログラム160は、分散メモリマシン向けのMPI(Message Passing Interface)のようなメッセージ通信入りの並列化プログラムである。ここで、データ分散指示文とは、データを分割して分割された個々のデータを複数の論理プロセッサの内の一つに割り付けるように、コンパイラに指示する文である。
【0012】
HPFの言語仕様の説明は、ハイ パフォーマンス フォートラン フォーラム編「ハイ パフォーマンス フォートラン ランゲージ スペシフィケーション バージョン2.0.α.2」センター フォー リサーチ オン パラレル コンピュテーション、ライス ユニバーシティ、ヒューストン、テキサス、1996(High Performance Fortran Forum, ”High Performance Fortran Language Specification Ver. 2.0.α.2”, Center for Research on Parallel Computation, Rice Univ.,Houston, Tx, 1996.)に詳しい。
【0013】
MPIの仕様の説明は、メッセージ パッシング インターフェース フォーラム編「エム ピー アイ:ア メッセージ ―パッシング インターフェース スタンダード」ユニバーシティ オブ テネシー、ノックスビル、テネシー、1994(Message Passing Interface Forum, ”MPI: A Message−Passing Interface Standard”, University of Tennessee, Knoxville, Tennesssee, 1994.)に詳しい。
【0014】
次に、本発明の並列化コンパイラの動作を、図1を元に、図2から図26まで、具体例を用いて説明する。
図8はソースプログラム110の具体例である。
文800は、Fortranの文法による配列a及びスカラ変数b,cの宣言である。
文803と文817で囲まれた部分は、kをループ制御変数とするループ本体である。
文805と文809で囲まれた部分は、jをループ制御変数とするループ本体であり、文806と文808で囲まれた部分は、iをループ制御変数とするループ本体である。
文811と文815で囲まれた部分も同様に、jをループ制御変数とするループ本体であり、文812と文814で囲まれた部分も同様に、iをループ制御変数とするループ本体である。
【0015】
文816は、スカラ変数b,cの値を変更する手続き呼出し文である。
文801,文802,文804,及び文810はHPFの指示文である。“!HPF$”は、それで始まる文がHPFの指示文であることを表わすキーワードである。文801は論理プロセッサの配置形状を指定する指示文である。“PROCESSORS”はキーワードであり、それに続く“proc(4)”により、論理プロセッサ4台が直線状に配置されていることを宣言している。
文802は、配列aの初期分割を指示する文である。“DISTRIBUTE”はキーワードであり、それに続く“a(block,*) ONTO proc”により、配列aの1次元目をblockという方法で分割し、分割された各々の部分配列を論理プロセッサproc(1),proc(2),proc(3),proc(4)に、それぞれ割り付けることを表わす。
【0016】
ここで、上記の論理プロセッサ宣言において、配列aの1次元目をblock分割するとは、配列aの1次元目の下限値を1、上限値をNとすると、配列aの1次元目の添字を、1から[(N−1)/4]+1個ずつ区切って、proc(1)から順番に割り付けることである。今の場合、a(1:3,1:12),a(4:6,1:12),a(7:9,1:12),a(10:12,1:12)がそれぞれ、proc(1),proc(2),proc(3),proc(4)に割り付けられる。
【0017】
文804は配列aをプログラム実行中に再分割することを指示する文である。“REDISTRIBUTE”はキーワードであり、それに続く“a(block,*) ONTO proc”により、配列aの1次元目をblockという方法で分割し、分割された各々の部分配列を論理プロセッサproc(1),proc(2),proc(3),proc(4)に、それぞれ割り付けることを表わす。この指示文により、それまで他の方法で論理プロセッサに割り付けられていた配列要素は、配列aの1次元目をblock分割するような割り付けられ方に変更される。これにより、一般に論理プロセッサ間のデータ移動が発生する。
【0018】
文810も同様に配列aをプログラム実行中に再分割することを指示する文である。この文は、文804とは異なり、配列aの2次元目をblock分割するような割り付けかたを指示する。
今の場合、a(1:12,1:3),a(1:12,4:6),a(1:12,7:9),a(1:12,10:12)がそれぞれ、proc(1),proc(2),proc(3),proc(4)に割り付けられる。
【0019】
以下、並列化コンパイラ100の中の個々の処理を説明する。
構文解析部101は上記ソースプログラム110を入力して辞書120、中間語130を生成する。中間語130はソースプログラム110に対応しているので、以下の説明では、図8のソースプログラム110を、中間語130のソースプログラムイメージの表現として用いる。
【0020】
図10は、構文解析部101が生成する辞書120を示したものである。
1000は、配列aに対する辞書120である。本説明ではスカラ変数bとcに対する辞書は説明で用いないため、省略する。
1001は変数名を示し、配列名である“a”という文字列が設定されている。
1002は変数の型で、実数型を示す“REAL”が設定されている。
1003は変数長で、4バイト変数を示す“4”が設定されている。
1004は変数が配列か否かを表わすフラグで、aは配列なので“TRUE”が設定されている。
【0021】
1005は配列を細分化すべきか否かを表わすフラグであり、“TRUE”は配列を細分化すべきであることを表わす。この値は形状種別数判定104で設定される。
1006は変数が配列の場合、その次元数を表わす。配列aは2次元配列なので、値2が設定されている。
1007は変数が配列の場合、その配列の各次元の寸法宣言情報を格納した配列辞書1040を指すポインタである。
1008は細分化情報1100へのポインタである。これは配列細分化105で設定される。
1009は高次元化辞書1200へのポインタである。これは配列高次元化106で設定される。
1010はデータ分散情報の収集リストの先頭1020へのポインタである。これは形状収集103で設定される。
【0022】
1040は配列の各次元の寸法宣言情報を格納した配列辞書であり、辞書1000のフィールド1007から指されている。
1041は配列aの第1次元目の下限値と上限値が、各々、1と12であることを表わしている。
1042は配列aの第2次元目の下限値と上限値が、各々、1と12であることを表わしている。
【0023】
データ分散指示文解析102は、辞書120及び中間語130を入力して、データ分散情報140を出力する。
図9は、データ分散情報140を示したものである。
上記説明した通り、中間語130として図8のソースプログラム110を用いる。また、図8における文802に対するデータ分散情報は文804に対するデータ分散情報と同じなので、ここでは文804と文810に対するデータ分散情報、及び文801に対する論理プロセッサ情報のみ示す。
【0024】
940はPROCESSORS指示文801を解析して得たPROCESSORS情報テーブルである。
941は論理プロセッサの変数名を表わす文字列“proc”である。
942は論理プロセッサの配列次元数であり、値1は1次元配列であることを示す。
943は論理プロセッサの各次元の寸法情報を表わす配列辞書950へのポインタである。
950は論理プロセッサの各次元の寸法情報を表わす配列辞書であり、論理プロセッサprocの第1次元目の下限値と上限値が、各々、0と3であることを示している。
【0025】
900は再分散指示文804を解析して得た、配列aに対するデータ分散情報テーブルである。
901は804の指示文に対してデータ分散情報が変化する他の変数へのポインタである。今の場合、そのような変数は存在しないので値NULLが設定されている。
902は配列aの次元数であり、値2が設定されている。
903は各次元ごとのデータ分散情報を表わす次元毎データ分散情報テーブル920へのポインタである。
904は論理プロセッサに対するPROCESSORS情報テーブルへのポインタであり、procに対するPROCESSORS情報テーブル940を指している。
【0026】
920は配列aに対する次元毎データ分散情報テーブルである。
921は第1次元目の分散形状がblock分割であることを示している。
922は第1次元目のblock分割により、連続する3個の配列要素が各論理プロセッサに割り当てられることを示している。この数値3は、配列辞書1040から得られる配列aの第1次元目の寸法「12」を、配列辞書950から得られる論理プロセッサ数「4」で割って、小数点以下の端数を切り上げることで得られる。今の場合は「3」となる。この計算方法は前出の“High PerformanceFortran Language Specification”に記述されている。
923は第2次元目が分散されないことを示している。
924は第2次元目の、連続する12個の配列要素が各論理プロセッサに割り当てられることを示している。即ち、これは第2次元目の全部が各論理プロセッサに割り当てられることを示している。
【0027】
910は再分散指示文810を解析して得た、配列aに対するデータ分散情報テーブルである。
911は再分散指示文810に対してデータ分散情報が変化する他の変数へのポインタである。今の場合、そのような変数は存在しないので値NULLが設定されている。
912は配列aの次元数であり、値2が設定されている。
913は各次元ごとのデータ分散情報を表わす次元毎データ分散情報テーブル930へのポインタである。
【0028】
914は論理プロセッサに対するPROCESSORS情報テーブルへのポインタであり、procに対するPROCESSORS情報テーブル940を指している。
930は配列aに対する次元毎データ分散情報テーブルである。
931は第1次元目が分散されないことを示している。
932は第1次元目の、連続する12個の配列要素が各論理プロセッサに割り当てられることを示している。即ち、これは第2次元目の全部が各論理プロセッサに割り当てられることを示している。
933は第2次元目の分散形状がblock分割であることを示している。
934は第2次元目のblock分割により、連続する3個の配列要素が各論理プロセッサに割り当てられることを示している。この数値3の計算方法は922の場合と同様である。
【0029】
データ分散指示文解析部102は、上記説明したデータ分散情報テーブル900及び910を得るものであり、通常の構文解析処理に、辞書の各次元ごとの寸法と論理プロセッサ数から922及び934を計算する処理を加えただけのものであるので、詳細なアルゴリズムは省略する。
【0030】
次に、形状収集部103はデータ分散情報140を入力して、変数ごとのデータ分散情報をまとめるための収集リストを作成して、その収集リストの先頭を変数の辞書120に接続する。
図10の1020と1030はその結果得られるデータ分散情報の収集リストであり、1020はその内の先頭であり、辞書1000のフィールド1010から指されている。
1021は次の収集リストへのポインタであり、次の収集リスト1030を指している。
1022は形状収集103が収集するデータ分散情報900へのポインタである。
1031は次の収集リストへのポインタであり、もうリストがないので、値NULLが設定されている。
1032は形状収集103が収集するデータ分散情報910へのポインタである。
【0031】
形状種別数判定部104は、辞書120及びデータ分散情報140を入力して配列のデータ分散の種別数を判定し、種別数が2の時は配列を細分化すべきと判定し、その結果を辞書120に反映させる。
まず、配列aに対する辞書1000のフィールド1010から収集リスト1020及び1030をたどり、そこから得られるデータ分散情報テーブル900及び910が各々異なる分散形状(block,*),(*,block)であることからデータ分散の種別数2を得る。その結果、細分化すべきと判定し、細分化フラグ1005の値をTRUEに設定する。
【0032】
配列細分化部105は、辞書120及びデータ分散情報140を入力して配列を細分化し、その結果を辞書120に反映させる。
図2は配列細分化部105の処理手順を示したものである。以下、配列aに対する処理を示す。
まず、形状種別判定部104で設定された1005のフラグの値がTRUEなので、配列aは細分化すべきであり、ステップ200はYesとなる。
次に、ステップ201でIの値が1となる。
収集リスト1020と1030から、配列aのデータ分散情報テーブル900、910をたどり、それらから指される921及び931より、配列aの1次元目のデータ分散形状が“block”と“*”とわかる。今の場合、202におけるブロック分割の記法におけるmの値は、922の値3にあたるので、ステップ202はYesとなる。
【0033】
ステップ203では、細分化フラグTRUE、細分分散block、細分幅mとして3、細分PE数として1次元目がblock分散となるデータ分散指示文804の、blockに対する論理プロセッサ数4を、細分化情報の1次元目に設定する。
【0034】
図11は細分化情報1100を示したものである。
1101は1次元目に対する細分化フラグの値を、1102は1次元目に対する細分分散を、1103は1次元目に対する細分幅を、1104は1次元目に対する細分PE数を示している。
同様にして、1105は2次元目に対する細分化フラグの値を、1106は2次元目に対する細分分散を、1107は2次元目に対する細分幅を、1108は2次元目に対する細分PE数を示す。
今、Iが1なので、ステップ203で設定された情報は細分化情報1100の1次元目に対するフィールドに格納される。即ち、細分化フラグの値TRUEが1101に、細分分散blockが1102に、細分幅3が1103に、細分PE数4が1104に格納される。
【0035】
次に、ステップ207において、Iの値が2になる。
配列aは2次元なのでステップ208はNoとなり、処理はステップ202に戻る。収集リスト1020と1030から、配列aのデータ分散情報テーブル900及び910をたどり、それらから指される923,933より、配列aの2次元目のデータ分散形状が“*”と“block”とわかる。今の場合、ステップ202におけるブロック分割の記法におけるmの値は、934の値3にあたるので、ステップ202はYesとなる。
【0036】
ステップ203では、細分化フラグTRUE、細分分散block、細分幅mとして3、細分PE数として2次元目がblock分散となるデータ分散指示文810の、blockに対する論理プロセッサ数4を、細分化情報の2次元目に設定する。
今、Iが2なので、ステップ203で設定された情報は細分化情報1100の2次元目に対するフィールドに格納される。即ち、細分化フラグの値TRUEが1105に、細分分散blockが1106に、細分幅3が1107に、細分PE数4が1108に格納される。
【0037】
次に、ステップ207において、Iの値が3になる。配列aは2次元なのでステップ208はYesになる。他にデータ分散配列はないので、ステップ209はNoとなり処理を終了する。
【0038】
次に、配列高次元化部106は、辞書120及びデータ分散情報140を入力して配列宣言を高次元化することにより配列要素のアドレス順序を変更し、その結果を辞書120に反映させる。
図3は配列高次元化部106の処理手順を示したものである。以下、配列aに対する処理を示す。
【0039】
まず、形状種別判定部104で設定された1005のフラグの値がTRUEなので、配列aは細分化すべきであり、ステップ300はYesとなる。
ステップ301では、配列aの辞書1000のフィールド1006より配列の次元数Kは2、細分化情報1100のフラグ1101と1105が両方ともTRUEなので、細分化すべき次元数Jは2で、K+J=4となって、4次元分の高次元化辞書の領域を確保する。
【0040】
図12は高次元化辞書1200を示したものである。
1201は高次元化後の配列の次元数、1202は高次元化後の配列の次元毎情報テーブル1210へのポインタ、1210は次元毎情報テーブル、1211,1214,1217,1220は各々、高次元化後の配列の1,2,3,4次元目の高次元化フラグである。高次元化フラグには、高次元化の対象次元なら“changed”が、高次元化により新しく作成される次元なら“new”が、高次元化の対象でない次元なら“not changed”が設定される。
【0041】
1212,1215,1218,1221は各々、高次元化後の配列の1,2,3,4次元目の高次元化対応次元である。高次元化対応次元には、高次元化の対象次元なら、その次元に対応する新しく作成される次元が、高次元化により新しく作成される次元なら、その元の高次元化対象次元が設定され、高次元化の対象でない次元なら0が設定される。
1213,1216,1219,1222は各々、高次元化後の配列の1,2,3,4次元目の上下限値が設定される。
【0042】
次に、ステップ302でIの値が1、Jの値が0となる。
細分化情報1100の1次元目の細分化フラグ1101の値がTRUEなので、ステップ303はYesとなる。
次に、ステップ304でJの値を1にする。
ステップ305で高次元化辞書1200の第1次元目の高次元化フラグ1211の値をchangedに設定する。辞書1000中の1041で示された、配列aの第1次元の下限値1と上限値12、細分化情報1100のフィールド1104が示す細分化PE数の値4より、細分化後の下限値1、細分化後の上限値1+(12/4)−1=3を得る。これらから得られる下限値と上限値の組1:3を高次元化辞書1200の第1次元目に対するフィールド1213に設定する。また、高次元化対応次元K+Jの値3を1212に設定する。
【0043】
ステップ306で、高次元化辞書のK+J=3次元目の高次元化フラグ1217の値をnew、下限値を1、上限値を細分化PE数の値4として、組1:4を1219に設定する。また、高次元化対応次元Iの値1を1218に設定する。
ステップ308で、Iの値が2になる。
Iの値2は、Kの値2より大きいことはないので、ステップ309はNoとなり、ステップ310により次の次元に処理を移し、ステップ303に戻る。
【0044】
細分化情報1100の2次元目の細分化フラグ1105の値がTRUEなので、ステップ303はYesとなる。
ステップ304でJの値は2になる。
ステップ305で高次元化辞書1200の第2次元目の高次元化フラグ1214の値をchangedに設定する。辞書1000中の1042で示された、配列aの第2次元の下限値1と上限値12、細分化情報1100のフィールド1108が示す細分化PE数の値4より、細分化後の下限値1、細分化後の上限値1+(12/4)−1=3を得る。これらから得られる下限値と上限値の組1:3を高次元化辞書1200の第2次元目に対するフィールド1216に設定する。また、高次元化対応次元K+Jの値4を1215に設定する。
【0045】
ステップ306で、高次元化辞書のK+J=4次元目の高次元化フラグ1220の値をnew、下限値を1、上限値を細分化PE数の値4として、組1:4を1222に設定する。また、高次元化対応次元Iの値2を1221に設定する。
ステップ308で、Iの値が3になる。
Iの値3は、Kの値2より大きいので、ステップ309はYesとなる。
データ分散配列は他にないので、ステップ311はNoとなり、配列高次元化の処理を終了する。
【0046】
次に、プログラム変換部107は、辞書120、データ分散情報140及び中間語130を入力してプログラムを変換し、その結果を中間語130に反映し、またループテーブル150を出力するプログラム変換を行なう。プログラム変換部107はループ変換部1071と添字変換部1072からなる。
ここでは、中間語130として、図8の文803と文817に対応するループkと、文805から文809までのループj、ループiのみを対象として説明し、文811と文815に対応するループjと文812から文814までに対応するループiに関する処理は省略する。
【0047】
図4はループ変換部1071の処理手順を説明したものである。
プログラム分割解析ステップ400では辞書120,データ分散情報140及び中間語130を入力して、ループテーブル150を出力する。
図13はループテーブル150を示す。1300は図8の文803と文817に対応するループkのループテーブル、1310は文805と文809に対応するループjのループテーブル、1330は文806から文808までに対応するループiのループテーブル、1320は文811と文815に対応するループjのループテーブルを示す。文812から文814までに対応するループiのループテーブルは説明に使わないため省略されているが、それは1320から接続されている。
【0048】
1301はループkの一つ内側にあるループ群の先頭ループのループテーブルへのポインタであり、1310を指している。1302はループkの一つ外側にあるループのループテーブルへのポインタであり、ループkにはそのようなループはないので、値NULLが設定されている。1303は当該ループのループ制御変数の辞書へのポインタであり、kを指している。1304はループネストであり、一番外側のループなので、1が設定されている。1305は当該ループをピーリングするか否かを示すフラグであり、これはループピーリング解析401で設定される。1306はループの上下限値を示し、下限値1、上限値10が設定されている。1307はループをプログラム分割した結果、作成されるプログラム分割テーブルの先頭テーブルへのポインタである。ループkはプログラム分割対象ループでないので値NULLが設定されている。1308は後続のループのループテーブルへのポインタで、ループkには後続ループはないので値NULLが設定されている。
【0049】
同様にして、1311はループjの内側ループであるループiのループテーブル1330へのポインタ、1312はループjの外側ループであるループkのループテーブル1300へのポインタ、1313はループ制御変数jの辞書へのポインタ、1314はループjのネスト2、1315はループjをピーリングするか否かを示すフラグ、1316はループjの上下限値、1317はプログラム分割テーブルの先頭テーブル1340へのポインタ、1318は後続ループである、811と815が示すループjのループテーブルへのポインタを示す。
【0050】
同様にして、1331はループiの内側ループがないため値NULL、1332はループiの外側ループであるループjのループテーブル1310へのポインタ、1333はループiのループ制御変数iの辞書へのポインタ、1334はループiのネスト3、1335はループiをピーリングするか否かを示すフラグ、1336はループiの上下限値、1337はプログラム分割テーブルの先頭テーブル1360へのポインタ、1338は後続ループがないため値NULLを示す。ループテーブルの内、以上の内容は中間語130から容易に得られる。
【0051】
1340及び1350はループjに対するプログラム分割テーブルである。1341は本テーブルが有効な論理プロセッサ番号の範囲を示し、論理プロセッサ番号1に対して有効であることを示す。1342はプログラム分割後のループの上下限値であり、下限値が2、上限値が3であることを示す。1343は次のプログラム分割テーブルへのポインタであり、1350を指している。1351は本テーブルが有効な論理プロセッサ番号の範囲を示し、論理プロセッサ番号2から4までに対して有効であることを示す。1352はプログラム分割後のループの上下限値であり、下限値が1、上限値が3であることを示す。1353は次のプログラム分割テーブルへのポインタであるが、もうないので値NULLが設定されている。
上記2つのプログラム分割テーブルにより、ループjは論理プロセッサ番号1に対しては、ループ上下限値が2と3、論理プロセッサ番号2から4に対しては、ループ上下限値が1と3、になることがわかる。
【0052】
上記プログラム分割テーブルを得るための処理はジーマ・ヒラナンダニ、ケン・ケネディ、チャウ・ウェン・ツェン著「コンパイリング フォートラン ディーフォー エムアイエムディー ディストリビューテッド メモリ マシーンズ」コミュニケーションズ オブ ザ エーシーエム、ボリューム35、ナンバー8、オーガスト、1992、第66頁から第80頁(Seema Hiranandani, Ken Kennedy, Chau−Wen Tseng, ”Compiling Fortran D for MIMD Distributed−Memory Machines”, Communications of the ACM, Vol. 35, No. 8, August, 1992, pp.66−80)に詳しい。
【0053】
次にループピーリング解析ステップ401は中間語130中の配列参照テーブルとループテーブルを入力し、各々に対してループピーリング後の情報を追加する。
【0054】
図14は文807中のa(i,j−1)に対する配列参照テーブルを示したものである。
1400はa(i,j−1)に対する配列参照テーブルである。
1401は配列aの辞書へのポインタである。1402は配列の各次元の添字情報を表わす添字テーブルの先頭へのポインタであり、1410を指している。1403は各次元ごとのピーリング情報を表わすテーブルへのポインタであり、1430を指している。これはループピーリング解析ステップ401で設定される。1410はa(i,j−1)の1次元目の添字テーブルである。1411は2次元目に対する添字テーブルへのポインタであり、1420を指している。1412は添字を表わす中間語へのポインタであり、iを表わす中間語を指している。1420はa(i,j−1)の2次元目の添字テーブルである。1421は配列aには3次元目が存在しないので、値NULLが設定されている。1422は添字を表わす中間語へのポインタであり、j−1を表わす中間語を指している。1430及び1440は次のループピーリング解析で作成されるテーブルであり、その処理の中で説明する。
【0055】
図5はループピーリング解析ステップ401の詳細な処理手順を示したものである。ここでは図14で示された配列参照テーブル1400に対する処理のみ説明する。
ステップ500でIの値は1になる。
配列aの1次元目は細分化情報1100中のフィールド1101がTRUEなので細分化する次元であり、ステップ501はYesとなる。
【0056】
1412より当次元に現れる変数はiであり、これはループテーブル1330よりループ制御変数であることがわかる。このiに分散後ループ範囲1362を代入して、当次元の添字範囲は1:3になる。一方、データ分散後の当次元の添字範囲は高次元化辞書1200のフィールド1213より1:3であるから、分散後ループ範囲から得られた添字範囲1:3からデータ分散後の添字範囲1:3をひいた残りの範囲は空集合となり、ステップ502の結果は空集合である。よって、ステップ503はYesとなる。
【0057】
ステップ505で当次元はピーリングしない、とし、ピーリングすべきループ範囲とピーリングすべき添字のはみ出す方向を各々、0とする。
次に、ステップ506で、ピーリング情報テーブル1430を作成する。
ここで、1431は次のピーリング情報テーブルへのポインタ,1432はピーリングするか否かを示すフラグ,1433は当次元に現れるループ制御変数,1434はピーリングすべきループ範囲,1435はピーリングすべき添字のはみ出す方向,1436は当ループ制御変数を持つループテーブルへのポインタである。
【0058】
よって、今の場合、1431には、まずNULLが設定される。但し、このフィールドは次の2次元目の処理で、新規に作成されるピーリング情報テーブル1440を指すように変更される。1432にはピーリングしないのでFALSEが、1433には当次元に現れるループ制御変数iが、1434には0が、1435にも0が、1436にはループiに対するループテーブル1330へのポインタが設定される。
【0059】
次に、ステップ507では、現在は1次元目の処理をしているので、Yesとなる。ステップ508で、Iの値は2になる。配列aの2次元目は細分化情報1100中のフィールド1105がTRUEなので細分化する次元であり、ステップ501はYesとなる。
1422より当次元に現れる変数はjであり、これはループテーブル1310よりループ制御変数であることがわかる。このjに分散後ループ範囲1342、1352を代入し、1341、1351の論理プロセッサ番号範囲も合わせると、当次元の添字範囲は、論理プロセッサ番号範囲が1:1の時は1:2、論理プロセッサ番号範囲が2:4の時は0:2となる。
【0060】
一方、データ分散後の当次元の添字範囲は高次元化辞書1200のフィールド1216より1:3であるから、分散後ループ範囲から得られた添字範囲からデータ分散後の添字範囲をひいた残りの範囲は論理プロセッサ番号範囲が2:4の時に0:0となり、ステップ502の結果は0:0である。よって、ステップ503はNoとなる。
【0061】
ステップ504では、まず、「当次元はピーリングする」とする。次に、0:0が2次元目の添字であるj―1と等しくなることより、jの値は1:1となる。よって、はみ出す時のループ範囲であるピーリング範囲は1:1である。また、このピーリング範囲は論理プロセッサ番号範囲が2:4の時に生じるので、ループテーブル1310の分散後ループ範囲のうち、この論理プロセッサ番号範囲に対応するテーブル1350を細分する。即ち、テーブル1350を、ピーリング範囲1:1の範囲を持つテーブルとそれ以外の範囲からなるテーブルに分割する。
【0062】
図15は細分化後のループ分散範囲テーブルである。
テーブル1350のループ分散範囲は1:3から1:1に変更されている。
新たにテーブル1500が作成され、1353は1500を指す。1501は細分されるループ分散範囲の論理プロセッサ番号範囲2:4に設定される。1502は元のループ分散範囲は1:3から1:1を引いた範囲2:3に設定される。1503は他に指すべきテーブルがないので、値NULLが設定される。
【0063】
次に、ステップ506より、ピーリング情報テーブル1440を作成する。
まず、1441には次のテーブルがないのでNULLが設定され、1431には1440へのポインタが設定される。1442には、ピーリングすることを示すフラグTRUEが、1443には当次元に現れるループ制御変数であるjが、1444にはステップ504で計算した1:1を設定する。ループ分散後のループ範囲1342及び1352の内、1:1は1352の下限を含むので、はみ出す方向として下限方向を示す−1を、1445に設定する。1446には、ループjに対するループテーブル1310へのポインタを設定する。
【0064】
次に、配列aにはもう処理すべき次元がないので、ステップ507はNoとなる。
上記説明したように、図5では図14の配列参照に対する処理だけを説明するので、ステップ509はNoになり、これでループピーリング処理の説明を終了する。
【0065】
ここで、図4に戻り、ループ変換の説明を続ける。
ループ変換の残りの処理では、図13のループテーブル群から図16及び17で示されたループテーブル群を生成し、図18のプログラムを生成する。
まず、ステップ402で、最初の最内側ループであるループiを検出する。
以降の処理で、処理済みの分散ループに対しては、ループ分散範囲テーブルへのポインタをNULLにする。よって、ステップ403で、未処理の分散ループであることは、分散ループであることを示すフラグがTRUEで、かつ、ループ分散範囲テーブルへのポインタがNULLでないことからわかる。図13の、ループiに対するループテーブル1330で、1335はTRUEで、1337はNULLでないので、ループiは未処理の分散ループであり、ステップ403はYesである。
【0066】
ステップ404では、1330の一つ内側にループテーブルを作成する。
図16はステップ404により現ループテーブル1330(LT1)の一つ内側に新たにループテーブル1600(LT2)が作成された様子を表わした図である。
【0067】
以下、ステップ404に従って図16を説明する。
まず、ループ分散テーブル1360は1個だけなので、LT1以下のループテーブルのコピーは作成する必要はない。LT1に対するループ制御変数名をi2とし、1333に設定する。LT1のループ範囲1336をループ分散範囲テーブル1360の論理プロセッサ番号範囲1361である1:4に設定する。
【0068】
ループテーブル1600は一つ内側のループに対するテーブルなので、一つ内側のループ先頭を指すポインタ1331を1600を指すように設定する。一つ外側のループテーブルへのポインタ1331,ループネスト1334,分散ループフラグ1335,後続ループへのポインタ1338はそのままである。ループ分散範囲テーブル1360へのポインタ1337をNULLに設定して、このループテーブルが処理済みであることを示す。
【0069】
次に、LT2に対するループ制御変数名をi1とし、1603に設定する。LT2のループ範囲1606をループ分散範囲テーブル1360のループ分散範囲1362である1:3に設定する。ループテーブル1600は最内側ループなので、1601はNULLに、一つ外側のループテーブルへのポインタである1602は1330を指すように設定される。また、1604,1605,1607,1608は各々、0、TRUE、NULL、NULLに初期化される。1605がTRUEで1607がNULLなので、ループテーブル1600は処理済みであることを示す。
【0070】
次に、1338はNULLなので後続ループはなく、ステップ405はNoである。1332は外側ループテーブル1310を指しているので、ステップ407はTRUE(Yes)であり、ステップ408で処理は外側ループテーブル1310に移り、ステップ403へ戻る。1315はTRUEだが、1317はNULLでないので、ループテーブル1310は未処理の分散ループであり、ステップ403はYesである。
【0071】
ループテーブル1310のループ分散範囲テーブルの個数は図15より3個なので、ステップ404では、ループテーブル1310(LT1)の一つ内側にループテーブル(LT2)を作成し、LT1以下のループテーブルのコピーを2個作成して、LT1の後続ループとして接続する。
【0072】
図17はこれらのテーブルが作成された様子を表わした図である。1700がLT2を、1710,1720,1730,1740がLT1以下のループテーブルの第1のコピーを、1750,1760,1770,1780がLT1以下のループテーブルの第2のコピーを表わす。
【0073】
以下、ステップ404に従って図17を説明する。
まず、LT1とそのコピーに対するループ制御変数名をj2とし、1313,1713,1753に設定する。LT1とそのコピーのループ範囲1316,1716,1756をループ分散範囲テーブル1340,1350,1500の論理プロセッサ番号範囲1341,1351,1501である1:1,2:4,2:4に設定する。ループテーブル1700,1720,1760は、各々、ループテーブル1310,1710,1750の一つ内側のループに対するテーブルなので、一つ内側のループ先頭を指すポインタ1311,1711,1751を、各々、1700,1720,1760を指すように設定する。一つ外側のループテーブルへのポインタ1312はそのままであり、1712,1752はNULLに初期化される。
【0074】
ループネスト1314はそのままであり、1714,1754は0に初期化される。これらの値は後のループネスト決定ステップ409で、括弧内の値に設定される。分散ループフラグ1315はそのままであり、1715,1755はTRUEに設定される。ループ分散範囲テーブル1340へのポインタ1317、及び1717,1757をNULLに設定して、これらのループテーブルが処理済みであることを示す。後続ループテーブルへのポインタは、1320を指していた1318は1710を、1718は1750を、1758は1320を指すように設定される。
【0075】
次に、LT2とそのコピーに対するループ制御変数名をj1とし、1703,1723,1763に設定する。LT2とそのコピーのループ範囲1706,1726,1766をループ分散範囲テーブル1340,1350,1500のループ分散範囲1342,1352,1502である2:3,1:1,2:3に設定する。
【0076】
ループテーブル1330,1730,1770は、各々、ループテーブル1700,1720,1760の一つ内側のループに対するテーブルなので、一つ内側のループ先頭を指すポインタ1701,1721,1761を、各々、1330,1730,1770を指すように設定する。ループテーブル1310,1710,1750は、各々、ループテーブル1700,1720,1760の一つ外側のループに対するテーブルなので、一つ外側のループ先頭を指すポインタ1702,1722,1762を、各々、1310,1710,1750を指すように設定する。ループネスト1704,1724,1764は0に初期化される。これらの値は後のループネスト決定409で、括弧内の値に設定される。分散ループフラグ1705,1725,1765はTRUEに設定される。ループ分散範囲テーブルへのポインタ1707,1727,1767をNULLに設定して、こららのループテーブルが処理済みであることを示す。後続ループテーブルへのポインタは1708,1728,1768はNULLに初期化される。
【0077】
1730と1770、1740と1780は各々、1330,1600のコピーであり、外側ループ、内側ループを指すポインタ、ループネスト以外は全て同じ値となる。即ち、1733,1773とは1333と同じ値で、1735から1738まで、1775から1778までは1335から1338までと同じ値である。また、1743,1783は1603と同じ値で、1745から1748までと1785から1788までは1605から1608までと同じ値である。ループネストである1734,1774,1744,1784は0に初期化される。一つ内側のループテーブルを指すポインタは、1731が1740を、1741はNULLを、1771は1780を、1781はNULLを指すように設定される。一つ外側のループテーブルを指すポインタは、1732が1720を、1742は1730を、1772は1760を、1782は1770を指すように設定される。
【0078】
次に、ループテーブル1310の元々の後続テーブルは1320であるが、本実施例では1320以降のテーブルに対する処理は説明しないので、ステップ405はNoとなる。
1312より、ループテーブル1310の外側ループテーブル1300が存在するので、ステップ407はYesとなり、ステップ408で処理をループテーブル1300に移し、ステップ403へ戻る。
【0079】
1305がFALSEなので、ループテーブル1300に対応するループkは分散ループでなく、ステップ403はNoとなる。1308はNULLなので、後続ループはなく、ステップ405はNoとなる。1302はNULLなので、外側ループはなく、ステップ407はNoとなる。
【0080】
次に、ループネスト決定ステップ409で、図17のループテーブルのネストを決定する。
この処理は最も外側のループから順番に決定する簡単な処理なので、詳細は省略する。
図17の、1304,1314,及び,1704,1334,1604,1714,1724,1734,1744,1754,1764,1774,1784の括弧内の数値が決定されたループネストである。
【0081】
次にループ多重化・ループピーリングステップ410で図17のループテーブル群に従って、ループを表わす元の中間語に、ループ多重化とループピーリングを適用する。
図18は、元のループ中間語である図8の文803から文817に、ループ多重化とループピーリングを適用した結果のプログラムである。
【0082】
文1810から文1835までが図8の文805から文809に対応する部分である。このうち、文1810から文1815までがループテーブル1310,1700,1330,1600に対応し、文1820から文1825までがループテーブル1710,1720,1730,1740に対応し、文1830から文1835までがループテーブル1750,1760,1770,1780に対応する。同様にして、文1840から文1880までが図8の文811から文815に対応する部分である。
【0083】
図4に戻り、最後に後続ループネストはないので、ステップ411はNoとなり、ループ変換部1071の処理を終了する。
【0084】
次に、図1の添字変更部1072の処理を行なう。
図6は添字変更部1072の処理手順を説明した図である。
ここでは、文1814と文1824中の配列参照a(i,j−1)に対する処理を、その配列参照テーブルを示した図14、処理結果得られるプログラムを示した図19を用いて説明する。
【0085】
まず、ステップ600でIの値は1となり、1次元目の処理を行なう。
細分化情報テーブル中の1次元目の細分化フラグ1101の値がTRUEなので、この次元は細分化する次元であり、ステップ601はYesとなる。
高次元化辞書1200の1次元目に対する高次元化対応次元1212は3となっているので、ステップ602では、配列参照に3次元目を追加する。文1814はループ中にあるので、ステップ603はYesである。
【0086】
ステップ604で、現在の配列参照テーブル1400の1次元目の添字は1411よりiで、ループ制御変数iを持っていたループテーブルへのポインタは1436より1330とわかるので、1次元目の添字を値が先に増加する内側ループのループ制御変数である1603のi1に、3次元目の添字を外側ループのループ制御変数である1333のi2に設定する。現配列参照の1次元目に対するピーリングフラグ1432はFALSEなので、ステップ606はNoとなる。配列aは元々2次元なので、ステップ608はYesとなり、ステップ610でIの値を2にして処理を2次元目に移し、ステップ601に戻る。
【0087】
細分化情報テーブル中の2次元目の細分化フラグ1105の値がTRUEなので、この次元は細分化する次元であり、ステップ601はYesとなる。高次元化辞書1210の2次元目に対する高次元化対応次元1215は4となっているので、ステップ602では、配列参照に4次元目を追加する。文1814はループ中にあるので、ステップ603はYesである。
【0088】
ステップ604で、現在の配列参照テーブル1400の2次元目の添字は1422よりj−1で、ループ制御変数jを持っていたループテーブルへのポインタは1446より1310とわかるので、2次元目の添字を値が先に増加する内側ループのループ制御変数である1703のj1を用いてj1−1に、4次元目の添字を外側ループのループ制御変数である1313のj2に設定する。
【0089】
現配列参照の2次元目に対するピーリングフラグ1442はTRUEだが、現配列参照のピーリングすべきループ範囲は1444より1:1である。一方、現配列参照を含み、元々ピーリングループ制御変数jを持っていたループのループテーブル1310の、一つ内側ループのループ範囲1706は2:3であるから、1:1は2:3に含まれておらず、ステップ606はNoとなる。これは、ピーリングに伴って、jに対する添字変更の特別処理が必要なループ範囲が1:1であるが、現在のループ範囲はその範囲を含んでいないので、特別な処理が不要であることを示している。
【0090】
配列aの次元はもうないので、ステップ608はNoとなる。以上で、文1814中の配列参照a(i,j−1)は、文1915中の配列参照a(i1,j1−1,i2,j2)に変更される。配列参照はまだあるので、ステップ609はYesとなり、ステップ611で次の配列参照である文1824のa(i,j−1)に処理を移す。
【0091】
この配列参照に対して、1次元目の処理は文1814の場合と同じなので、省略して、2次元目の場合のみ説明する。
ステップ601,602,603,604の処理は文1814の配列参照の場合と同様で、その結果、文1824のa(i,j−1)は、一旦、文1915の配列参照a(i1,j1−1,i2,j2)のように変更される。
【0092】
次に、ピーリングフラグ1442はTRUEで、現配列参照のピーリングすべきループ範囲は1444より1:1である。一方、現配列参照を含み、元々ピーリングループ制御変数jを持っていたループのループテーブル1310のコピーになるループテーブルは1710であり、その一つ内側ループのループ範囲1726は1:1である。よって、両者は一致し、ステップ606はYesとなる。ピーリング添字のはみ出す方向は1445より−1、現次元の寸法は1216より3なので、j1はj1+3,j2はj2−1となる。これより、j1−1はj1+2に、j2はj2−1になり、文1925の配列参照a(i1,j1+2,i2,j2−1)が得られる。
【0093】
次に、配列aは2次元配列なので、ステップ608はNoとなる。
本説明では2つの配列参照についてのみ説明するので、ステップ609はNoとなり、添字変更部1072の処理を終了する。
他の配列参照についても同様に処理することで、図19の中間語が得られる。
以上により、プログラム変換部107の処理を終了する。
【0094】
次に、プログラム並列化部108の処理を説明する。
図7はプログラム並列化部108の処理手順を説明した図である。
データ分散情報変更ステップ700は、データ分散情報140と高次元化辞書1200を入力して、変更したデータ分散情報を出力する。
図20は変更後のデータ分散情報である。データ分散情報変更の処理は容易なので以下、概略を記す。
【0095】
配列高次元化部106の処理によって、配列の次元が1201に示されるように4になったので、図20における902,912は図9における2から4になる。これに伴い、2000,2010には4次元分のテーブルを確保する。次に、高次元化辞書において、フラグの値が“changed”で、かつ、データ分散が指定された次元の分散形状は、次元毎分散情報テーブルの該当する次元では“*”と変更され、上記次元に対応する、フラグの値が“new”である次元の分散形状は、上記“changed”フラグを持つ次元の、元の分散形状に設定される。但し、ブロック分割の幅は再計算される。その他の次元は、“*”と設定される。
【0096】
まず、図9のデータ分散情報テーブル900について処理する。
高次元化辞書の第1次元目は、フラグ1211の値が“changed”で、データ分散情報テーブル900に対応する第1次元目のデータ分散形状921はblockなので、この次元の分散形状は“*”に変更される。2001は“*”となり、2002には1213より、高次元化辞書の第1次元目の寸法3が設定される。上記第1次元目に対応する次元は1212より3次元目であり、3次元目のフラグ1217の値が“new”なので、この次元はデータ分散するように変更される。よって、2005はblockとなり、この次元の上下限1219よりわかる寸法4を、950よりわかる論理プロセッサ数4で割った値1がブロック分割の幅となるので、この値1を2006に設定する。
【0097】
一方、第2次元目は、フラグ1214の値は“changed”であるが、データ分散情報テーブル900に対応する第2次元目のデータ分散形状923は“*”なので、この次元の分散形状は“*”に設定される。よって、2003は“*”となり、2004には1216より、高次元化辞書の第2次元目の寸法3が設定される。
また、上記2次元目に対応する次元は1215より4となり、第4次元目の分散形状も“*”に設定される。よって、2007は“*”となり、2008には1222より、高次元化辞書の第4次元目の寸法4が設定される。
【0098】
次に、図9のデータ分散情報テーブル910について処理する。
高次元化辞書の第1次元目は、フラグ1211の値は“changed”であるが、データ分散情報テーブル910に対応する第1次元目のデータ分散形状931は“*”なので、この次元はデータ分散しないように設定される。よって、2011は“*”となり、2012には1213より、高次元化辞書の第1次元目の寸法3が設定される。また、上記第1次元目に対応する次元は1212より3となり、第3次元目もデータ分散されないように設定される。よって、2015は“*”となり、2016には1219より、高次元化辞書の第3次元目の寸法4が設定される。
【0099】
一方、高次元化辞書の第2次元目は、フラグ1210の値が“changed”で、データ分散情報テーブル910に対応する第2次元目のデータ分散形状933はblockなので、この次元はデータ分散しないように変更される。2013は“*”となり、2014には1216より、高次元化辞書の第2次元目の寸法3が設定される。上記第2次元目に対応する次元は1215より4次元目であり、4次元目のフラグ1220の値が“new”なので、この次元はデータ分散するように変更される。よって、2017はblockとなり、この次元の上下限1222よりわかる寸法4を、950よりわかる論理プロセッサ数4で割った値1がブロック分割の幅となるので、この値1を2018に設定する。
【0100】
次に、図20のデータ分散情報に基づいて、プログラム分割解析ステップ701、通信解析ステップ702を実行する。これらに対する処理方法はジーマ・ヒラナンダニ、ケン・ケネディ、チャウ・ウェン・ツェン著「コンパイリング フォートラン ディー フォー エムアイエムディー ディストリビューテッド メモリ マシーンズ」コミュニケーションズ オブ ザ エーシーエム、ボリューム35、ナンバー8、オーガスト、1992、第66頁から第80頁(Seema Hiranandani, Ken Kennedy, Chau−Wen Tseng, ”Compiling Fortran D for MIMD Distributed−Memory Machines”, Communications of the ACM, Vol. 35, No. 8, August,1992, pp.66−80)に書かれている。また、通信生成707、プログラム分割コード生成708、分割データ宣言作成709についても同文献に書かれている。
【0101】
図21はプログラム並列化の処理結果のプログラムを示す図である。以下、図10,図20,図21を用い、処理手順の概略を説明する。
配列aは細分化フラグ1005がTRUEなので、ステップ703はYesとなる。通信生成ステップ704では、通常のsend/receive型の論理プロセッサ間通信の生成を行い、再分散処理ではステップ7041の非バッファリング再分散通信生成により、バッファリングしない再分散通信を生成する。これは図21の文2102及び文2140に対応する。
2101の再分散ルーチン“non_buf_remap”は、配列aを、ディスクリプタD1に記述されたデータ分散形状から、ディスクリプタD2に記述されたデータ分散形状に、バッファを使わずにデータ再分散するルーチンである。
【0102】
文2102のD1は、この時点における配列aのデータ分散形状を記述したディスクリプタである。これは、ループkの1回目の繰り返しでは、プログラム先頭におけるデータ分散であり、文802と文804が元々同じデータ分散であることから、文804でのデータ分散に対応する、図20のテーブル900及び2000が示すデータ分散となる。また、ループkの2回目以降の繰り返しでは、文810でのデータ分散に対応する、図20のテーブル910及び2010が示すデータ分散となる。
【0103】
文2102のD2は、再分散ルーチン“non_buf_remap”により、配列aが再分散された後のデータ分散形状を記述したディスクリプタであり、図20のテーブル900及び2000が示すデータ分散情報に対応している。文2140の再分散ルーチン“non_buf_remap”は、配列aを、ディスクリプタD2に記述されたデータ分散形状から、ディスクリプタD1に記述されたデータ分散形状に、バッファを使わずにデータ再分散するルーチンである。
【0104】
文2140のD2は、この時点における配列aのデータ分散形状を記述したディスクリプタであり、図20のテーブル900及び2000が示すデータ分散情報に対応している。文2140のD1は、この時点における配列aのデータ分散形状を記述したディスクリプタであり、図20のテーブル910及び2010が示すデータ分散情報に対応している。
【0105】
プログラム分割コード生成ステップ705では、ループインデックス生成ステップ7051とグローバル添字生成ステップ7052の処理を実行する。
ループインデックス生成ステップ7051では、データ分散する配列次元の添字に含まれるループ制御変数に対応するループのループ範囲を分散して、分散後のループの上下限値を生成する。
【0106】
本発明の配列高次元化部106の処理を適用した後の配列では、データ分散情報変更ステップ700によりデータ分散する次元は元のデータ分散次元の高次元化対応次元であり、その次元の寸法は配列高次元化部106の処理より論理プロセッサ数と等しい。ループ変換部1071により上記データ分散される次元に現れるループ制御変数を持つループのループ長はループ分散範囲テーブルの論理プロセッサ番号範囲に等しく、図8に対する中間語を入力とした場合、それは論理プロセッサ数に等しいのでループは解消される。
【0107】
グローバル添字生成ステップ7052では、データ分散した次元の添字として、データ分散前の該当する配列要素を表わす添字を用いる。
本発明では、データ分散する配列次元の添字はデータ分散前は、論理プロセッサ番号の内のいずれかと等しくなっているので、データ分散後の添字も同じ論理プロセッサ番号にする。
【0108】
文1910から文1936までのデータ分散は、データ分散情報テーブル900と2000で示されたものであり、配列aの第3次元目がブロック分割される。aの第3次元目にあるループ制御変数は文1914,1915,1924,1925,1934,1935の配列参照においてi2であるので、ループi2は解消され、配列aの第3次元目の添字は論理プロセッサ番号になる。
図21の文2113,2114,2123,2124,2133,2134における配列aの第3次元目の添字“mype”が論理プロセッサ番号を表わしており、図21の文2110から2135には、ループi2がないことがわかる。
【0109】
同様にして、文1940から文1980までのデータ分散は、データ分散情報テーブル910と2010で示されたものであり、配列aの第4次元目がブロック分割される。aの第4次元目にあるループ制御変数は文1952,1953,1962,1963,1972,1973の配列参照においてj2であるので、ループj2は解消され、配列aの第4次元目の添字は論理プロセッサ番号になる。
図21の文2152,2153,2162,2163,2172,2173における配列aの第4次元目の添字“mype”が論理プロセッサ番号を表わしており、図21の文2141から文2180には、ループj2がないことがわかる。
【0110】
次にグローバルデータ宣言作成ステップ706では、データ分散配列に対しても、高次元化後で、データ分散前の配列宣言を行なう。文2100の宣言がそれに該当する。
最後に、コード生成部109は、図21に対応する中間語を入力し、図21のソースプログラムまたはそれをオブジェクトプログラムの形にした並列化プログラム160を出力する。これで第1の実施例の処理フローの説明を終了する。
【0111】
図22は本願のデータ再配置やデータ分散を適用する前の配列を用いて、データ再分散の様子を説明したものである。
2200は1時限目および2次元目の要素数が各々12の2次元配列aを表わし、縦方向は配列の1次元目を表わす。この次元はFORTRANではアドレスの連続する次元にあたる。また、横方向は配列の2次元目を表わす。
2200中の16個の矩形は各々、3x3の部分配列を表わす。
【0112】
各部分配列中の矢印の左側の数字は、配列aが(block,*)という方法で4台の論理プロセッサにブロック分散された時の、各々の部分配列が割り付けられる論理プロセッサ番号を、矢印の右側の数字は、配列aが(*,block)という方法で4台の論理プロセッサにブロック分散された時の、各々の部分配列が割り付けられる論理プロセッサ番号を表わす。したがって、各部分配列中の矢印とその両側の数字により、その部分配列が(block,*)から(*,block)へのデータ再分散によって、左側の番号の論理プロセッサから右側の番号の論理プロセッサへ送信されることを表わす。
【0113】
図23は従来技術による並列化プログラムである。
文2300における配列aの宣言が示すように、配列は第1次元目が分割されて寸法が3になっている。
文2302と文2320はバッファリングをするデータ再分散ルーチンである。
文2302の再分散ルーチン“remap”は、配列aを、ディスクリプタE1に記述されたデータ分散形状から、ディスクリプタE2に記述されたデータ分散形状に、データ再分散するルーチンである。
【0114】
文2302のE1は、この時点における配列aのデータ分散形状を記述したディスクリプタである。これは、ループkの1回目の繰り返しでは、プログラム先頭におけるデータ分散形状であり、文802と文804が同じデータ分散であることから、文804のデータ分散を表わす、図9のテーブル900及び920が示すデータ分散となる。また、ループkの2回目以降の繰り返しでは、文810でのデータ分散を表わす、図9のテーブル910及び930が示すデータ分散となる。
【0115】
文2302のE2は、再分散ルーチン“remap”により、配列aが再分散された後のデータ分散形状を記述したディスクリプタであり、図9のテーブル900及び920が示すデータ分散情報に対応している。
文2320の再分散ルーチン“remap”は、配列aを、ディスクリプタE2に記述されたデータ分散形状から、ディスクリプタE1に記述されたデータ分散形状に、データ再分散するルーチンである。
文2320のE2は、この時点における配列aのデータ分散形状を記述したディスクリプタであり、図9のテーブル900及び920が示すデータ分散情報に対応している。
文2320のE1は、再分散ルーチン“remap”により、配列aが再分散された後のデータ分散形状を記述したディスクリプタであり、図9のテーブル910及び930が示すデータ分散情報に対応している。
【0116】
図24は従来の並列化によるデータ再分散の様子を、特に、論理プロセッサ1(以下、P1と略す)から論理プロセッサ2(以下、P2と略す)へ送信されるデータに注目して表示したものである。
2401で示される3行12列の部分配列は、配列aを(block,*)というデータ分散方法で従来の並列化方法により並列化した時、P1に割り付けられる分割データである。
2400は分割データ2401の元の配列における相対的な位置を示すために、参考までに表示した12行12列の元の配列である。配列aは(block,*)でデータ分散されるため、配列の1次元目が4分割され、その内の一つである2401がP1に割り付けられるデータとなる。
2401中の数字は、P1に割り付けられたデータ2401の配列要素がアドレス順に並ぶ様子を示している。
【0117】
2411で示される12行3列の部分配列は、配列aを(*,block)というデータ分散方法で従来の並列化方法により並列化した時、P2に割り付けられる分割データである。
2410は分割データ2411の元の配列における相対的な位置を示すために、参考までに表示した12行12列の元の配列である。配列aは(*,block)でデータ分散されるため、配列の2次元目が4分割され、その内の一つである2411がP2に割り付けられるデータとなる。
2411中の数字は、P2に割り付けられたデータ2411の配列要素がアドレス順に並ぶ様子を示している。
【0118】
2401中の網掛け部分2402は、(block,*)から(*,block)へのデータ再分散により、P1からP2へ送信されるデータを表わす。図中に示されたアドレス順により、このデータは19番目から27番目までの配列要素からなる連続データであることがわかる。
一方、2411中の網掛け部分2412は、(block,*)から(*,block)へのデータ再分散により、P2がP1から受信するデータの格納先を表わす。図中に示されたアドレス順により、このデータは4番目から6番目,16番目から18番目,28番目から30番目までの配列要素からなる非連続データであることがわかる。
【0119】
従って、送信側データは連続であるが、受信側では非連続な位置にデータを格納することが必要であるとわかる。データ通信ルーチンの中には、送信側データは非連続なものを許すものもあるが、受信側は通常、連続になってないといけないので、この場合、1回のデータ送信で済ます場合には、受信側でどうしてもバッファリングが必要なことがわかる。即ち、送信側データ2402は送信ルーチンにより、P2内のアドレスが連続するバッファに送信され、受信したP2は、そのバッファ内のデータを2412へ、各列毎に1回、少なくとも計3回コピーを行なう。
【0120】
図25は、本発明の並列化によるデータ再分散の様子を、P1からP2へ送信されるデータに注目して表示したものである。
2500で示される12行12列の配列は、配列aを(block,*)というデータ分散方法で分割して、本発明の並列化方法により並列化した時、P1に割り付けられるデータである。この配列の大きさはデータ分散前の配列の大きさと同じである。
2500中の数字は、P1に割り付けられたデータ配列2500の配列要素がアドレス順に並ぶ様子を示している。左上角から始まる12行3列の部分に、最初の36要素のアドレス順が示されている。これにより、太線で区切られた3行3列の部分は連続アドレスであることがわかる。数字が表示されてない他の部分についても同様である。
【0121】
この、本発明による配列要素のアドレスの変更は、一般に、配列aを2次元配列a(N,N)、プロセッサ数をP、NはPで割り切れる、とする時、次の式(1)によって表現される。
(i,j)→((i−1)modL+1,(j−1)modL+1,[(i−1)/L]+1,[(J−1)/L]+1) (1)
ここで、矢印の左辺の(i,j)は元の配列aの第i行第j列の配列要素を表し、矢印の右辺は本発明による配列再配置を適用した後の4次元配列における対応する配列要素を表わす。また、LはN/Pを、[]は切り捨てを表わすガウスの記号である。
【0122】
この4次元配列の最初の2次元から作られる2次元配列は、データ配列2500中の、太線で区切られた3行3列の部分に対応し、最後の2次元から作られる2次元配列は、この太線で区切られた3行3列の部分を一つの配列要素とみなして得られる4行4列の位置配列を表わす。
【0123】
例として、図25と同様に、N=12,P=4とすると、L=N/P=3となり、式(1)は次の式となる。
(i,j)→((i−1)mod3+1,(j−1)mod3+1,[(i−1)/3]+1,[(J−1)/3]+1) (2)
ここで、データ配列2500の左上角にある配列要素(1,1)は、式(2)より、(1,1,1,1)に移される。これは、位置配列の配列要素が(1,1)、即ち、データ配列2500の左上角の太線で区切られた3行3列の部分であり、その3行3列の部分からなる2次元配列中の配列要素が(1,1)であることを示しており、元の(1,1)と同じアドレスを指していることがわかる。
【0124】
また、データ配列2500中のアドレス番号が83の部分は、元の配列における配列要素が(5,7)であり、これは式(2)により、(2,1,2,3)に移される。これは、位置配列の配列要素が(2,3)、即ち、2502を示しており、その位置配列要素が指す、3行3列の部分からなる2次元配列中の配列要素が(2,1)であることを示しており、アドレス番号が83の部分を指していることがわかる。
【0125】
2501で示される、アドレス順で、10番目から18番目,46番目から54番目,82番目から90番目,118番目から126番目の、3行12列の部分配列は、配列aを(block,*)というデータ分散方法で分割して、本発明の並列化方法により並列化した時、P1がその配列要素の計算を担当するデータである。即ち、2502の配列要素の値の更新は、原則的にP1が行なう。
2510で示される12行12列の配列は、配列aを(*,block)というデータ分散方法で分割して、本発明の並列化方法により並列化した時、P2に割り付けられるデータである。この配列の大きさはデータ分散前の配列の大きさと同じである。
【0126】
2510中の一部の数字も同様に、P2に割り付けられたデータ2510の配列要素がアドレス順に並ぶ様子を示している。
2511で示される、アドレス順で、73番目から108番目の、12行3列の部分配列は、配列aを(*,block)というデータ分散方法で分割して、本発明の並列化方法により並列化した時、P2がその配列要素の計算を担当するデータである。即ち、2511の配列要素の値の更新は、原則的にP2が行なう。
【0127】
2501中の網掛け部分2502は、(block,*)から(*,block)へのデータ再分散により、P1からP2へ送信されるデータを表わす。図中に示されたアドレス順により、このデータは82番目から90番目までの配列要素からなる連続データであることがわかる。
一方、2511中の網掛け部分2512は、(block,*)から(*,block)へのデータ再分散により、P2がP1から受信するデータを表わす。図中に示されたアドレス順により、このデータはやはり、82番目から90番目までの配列要素からなる連続データであることがわかる。
【0128】
従って、送信側データも受信側データも連続となり、データ通信に際してはバッファを介する必要がないことがわかる。これは、配列からバッファへのコピーが不要であることを意味している。
以上により、従来技術では、データ再分散に際し、データとバッファ間のコピーが必要であったが、本願により、それが不要になることがわかる。
【0129】
尚、本実施例では、分散メモリマシン向けの並列化プログラムに関するデータ再分散の説明を行ったが、分散共有メモリマシンと呼ばれる、メモリは物理的に分散しているが、ハードウエアやOSなどにより、ユーザ側には共有メモリに見えるマシン向けの、並列化プログラムに関するデータ再分散に対しても本発明は適用可能である。
【0130】
図26は、本発明のコンパイラが対象とする並列計算機システムのハードウェア構成の一例を示したものである。同図において、2601はローカルメモリ、2602は論理プロセッサエレメント、2603はネットワーク、2604は入出力用論理プロセッサエレメント、2605は入出力用コンソールまたはワークステーションを表す。
【0131】
本発明の並列化コンパイラ100は、入出力用コンソールまたはワークステーション2605において実行され、並列ソースプログラムまたは並列オブジェクトプログラムに変換される。前者の並列ソースプログラムは、さらに、論理プロセッサエレメント2602向けのコンパイラにより並列オブジェクトプログラムに変換される。上記並列オブジェクトプログラムはリンカによりロードモジュールに変換され、入出力用論理プロセッサエレメント2604を通じて各論理プロセッサエレメント2602のローカルメモリ2601にロードされ、各論理プロセッサエレメント2602により実行される。実行時における各ロードモジュール間の通信はネットワーク2603を通じて行われる。
本発明に係る並列化コンパイラは、上記並列計算機システムを有効利用してプログラムを高速化するものである。
【0132】
(第2の実施例)
次に、本発明の第2の実施例を図27から図33を用いて説明する。
第2の実施例では共有メモリを持つ並列計算機を対象としている。
図27は、本発明による並列化コンパイラの構成を示したものである。
2700は並列化コンパイラである。並列化コンパイラ2700中、ループ並列化解析部2701,データ分散形状決定部2702,プログラム並列化部2703以外は、図1のものと同じであるので説明を省略し、ループ並列化解析部2701,データ分散形状決定部2702,プログラム並列化部2703についてのみ説明する。
【0133】
ループ並列化解析部2701は辞書120及び中間語130を入力し、ループの並列性を解析し、ループテーブル150を出力する。
この処理の詳細は、ハンス・ジーマ、バーバラ・チャップマン著「スーパーコンパイラーズ フォー パラレル アンド ベトトル コンピューターズ」アディッソン−ウエスリー、1991(Hans Zima and Barbara Chapman. ”Supercompilers for Parallel and Vector Computers”, Addison−Wesley, 1991)に説明されている。
【0134】
データ分散形状決定部2702は辞書120,中間語130,及びループテーブル150を入力し、データ分散情報140を出力する。
ここでは、まず、並列化された各ループに対して、そのループのループ制御変数が、配列のどの次元に出現するかを調べる。
次に、ループ並列化によるループ繰り返しのプロセッサへの割り当て方法に対応して、配列要素がどのようなデータ分散方法によってプロセッサに割り付けられるかを調べる。これは、ループ中にある、代入文の左辺の配列添字に、並列化後の各プロセッサへ割り当てられるループ繰り返し範囲を代入することで得ることができる。
【0135】
例えば、ループiのループ繰り返しの1から10,11から20,21から30,31から40回目が各々、プロセッサ0番,1番,2番,3番に割り当てられ、そのループ中で要素数40の配列aが、“a(i)=”の形で代入文の左辺に出現しているとすると、a(1)からa(10),a(11)からa(20),a(21)からa(30),a(31)からa(40)までが各々、プロセッサ0番,1番,2番,3番によって、値が更新される。即ち、そのループの並列化方法は配列がブロック分散でプロセッサに割り付けられた時と同じになる。後は、上記の方法で得られた分散情報テーブル140を用いて、上述した第1の実施例と同じ方法を適用することで並列化プログラム2720が得られる。
【0136】
次に、具体例を用いて説明する。
図28は、ソースプログラム2710を示す図である。
これは、図8のソースプログラムから、プロセッサ指示文801、データ分散指示文802、データ再分散指示文804及び810を除いたものである。プロセッサ数はソースプログラム2710では指定されてないが、コンパイルオプションで4と指定されている、とする。
【0137】
ループ並列化解析部2701は、ソースプログラム2710を解析し、第1のループネストである文2802から文2806に対してはループiを並列化し、第2のループネストである文2807から文2811に対しては、ループjを並列化する、と決定する。
【0138】
データ分散形状決定部2702では、ループ並列化解析部2701が出力したループテーブル150,辞書120,及び中間語130を入力して以下の処理を行なう。
まず、プロセッサ数は上記コンパイルオプションで4と指定されているので、第1のループネスト中のループiでは、ループ繰り返しの1から3,4から6,7から9,10から12回目が各々、プロセッサ0番,1番,2番,3番に割り当てられており、この割り当て方法はデータ分散におけるブロック分散と同じである。
【0139】
また、ループi中で1次元目の要素数12の配列aが、“a(i,j)=”の形で代入文の左辺に出現しているので、a(1,j)からa(3,j),a(4,j)からa(6,j),a(7,j)からa(9,j),a(10,j)からa(12,j)までが各々、プロセッサ0番,1番,2番,3番によって、値が更新される。即ち、配列aの1次元目はブロック分散される。同様にして、第2のループネスト中のループjでは、ループ繰り返しがブロック分散され、ループj中で2次元目の要素数12の配列aが、“a(i,j)=”の形で代入文の左辺に出現しているので、配列aの2次元目はブロック分散される。よって、データ分散情報140には、第1のループネストでは、配列aの1次元目がブロック分散され、第2のループネストでは配列aの2次元目がブロック分散される、という情報が設定される。この結果、図9のデータ分散情報が得られる。
形状収集部103からプログラム変換部107までの処理は前述した第1の実施例と同じである。
【0140】
プログラム並列化部2703での処理も、ほぼ、第1の実施例と同じであるが、通信生成ステップ704(図7参照)におけるremapやsend,receive通信のかわりにバリア同期を引き起こすルーチンであるbarierを呼出し、ループを並列化するために、並列化部分の最初でスレッド生成ルーチンforkを、並列化部分の直後でスレッド消滅ルーチンjoinを呼ぶ。
【0141】
これらのfork,joinは、しばしば、並列化ループよりも外側に、しかも、複数の並列化ループに対して1組だけ呼出される。上記forkとjoinによって囲まれる、実際の並列化ループよりも大きい範囲はSPMD リージョンと呼ばれる。このSPMDリージョンの作成処理については、チャウ・ヴェン・ツェン著「コンパイラ オプティマイゼーション フォー エリミネイティング バリア シンクロナイゼーション」ピーピーオーピーピー95、第144頁から第155頁、1995(Chau−Wen Tseng.” Compiler Optimizations for Eliminationg Barrier Synchronization”,PPOPP’95, pp.144−155, 1995)で説明されている。
コード生成部109の処理も第1の実施例と同じである。
【0142】
図29は、上記の処理の結果得られた並列化プログラム2720を示す図である。
文2903と文2940では、図21の、第1の実施例における並列化プログラムにおける文2102及び文2140での再分散ルーチンのかわりに、バリア同期が呼出されている。
文2901ではforkが、文2983ではjoinが呼出されている。これらforkとjoinで囲まれた部分がSPMDリージョンである。これら以外は図21のプログラムと同じである。
【0143】
図30は従来技術による並列化プログラムを示す図である。
文3003と文3020では、やはり、図23の、第1の実施例における並列化プログラムにおける文2302及び文2320での再分散ルーチンのかわりに、バリア同期が呼出されている。
また、文3001ではforkが、文3042ではjoinが呼出されている。
これら以外に、図23と異なる点は以下の2つである。
【0144】
図23では、配列データが分散メモリに分散されていたため、一つのプロセッサにはそのうちの一部のみが割り付けられていた。そのため、図23における配列aの宣言はa(3,12)となっていた。しかし、図30は共有メモリ型並列計算機に対するプログラムなので、配列aは分散されず、宣言はa(12,12)である。
【0145】
また、上記と同じ理由により、図23では、各プロセッサは、分散された配列の要素を参照するように、文2311及び文2330で示されるように、ループの繰り返し範囲も縮小されていた。ところが、図30の文3011及び文3030では、各プロセッサは分散されない配列の一部分のみ参照するように、プロセッサ番号が格納された変数mypeを用いて、ちょうど自プロセッサが分担する配列要素のみ参照するようなループ範囲を生成している。
【0146】
図31は、従来の並列化によるプロセッサへの計算分担部分を、第1のループネストにおける論理プロセッサ1(以下、P1と略す)の計算分担部分と、第2のループネストにおける論理プロセッサ2(以下、P2と略す)の計算分担部分に注目して表示したものである。
3100は12行12列の配列a全体を示す。
3100中の数字は、配列要素がアドレス順に並ぶ様子を示している。左上角から始まる12行3列の部分に、最初の36要素(1〜36)のアドレス順が示されている。これにより、1列中の部分は連続アドレスであることがわかる。数字が表示されてない他の部分についても同様である。
この本発明による配列要素のアドレスの変更は、図25の場合と同じである。
【0147】
4つの角のアドレスが、4,6,136,138番目になる矩形部分3101は、第1のループネストにおける、配列aを(block,*)というデータ分散方法で分散することに対応した、P1の計算分担部分である。
また、4つの角のアドレスが、3,4,135,136番目になる網掛け部分3102はプロセッサがキャッシュを持ち、そのキャッシュライン長が配列2要素分であり、配列aの最初の要素がキャッシュライン先頭にある場合に、P1とP0が共有するキャッシュラインを示したものである。この条件の下では、キャッシュラインは、アドレスが奇数番目の配列要素から始まり、それより一つアドレスが大きい配列要素で終わる。したがって、2つのプロセッサは、12個のキャッシュラインを共有し、フォールスシェアリングもその共有キャッシュラインの数だけ発生しやすい。
【0148】
4つの角のアドレスが、73,84,97,108番目になる矩形部分3111は、第2のループネストにおける、配列aを(*,block)というデータ分散方法で分散することに対応した、P2の計算分担部分である。この矩形部分3111は、奇数番目のアドレスで始まり、偶数番目のアドレスで終わる単一の連続領域なので、他プロセッサとキャッシュを共有することはない。よって、フォールスシェアリングは第1のループネストにおいてのみ発生する。
【0149】
図32は、本発明の並列化によるプロセッサへの計算分担部分を、第1のループネストにおけるP1の計算分担部分と、第2のループネストにおけるP2の計算分担部分に注目して表示したものである。
3200は12行12列の配列a全体を示す。
3200中の数字は、配列要素がアドレス順に並ぶ様子を示している。左上角から始まる12行3列の部分に、最初の36要素(1〜36)のアドレス順が示されている。これにより、太線で囲まれた3行3列中の部分は連続アドレスであることがわかる。数字が表示されてない他の部分についても同様である。
【0150】
4つの角のアドレスが、10,12,124,126番目になる矩形部分3201は、第1のループネストにおける、配列aを(block,*)というデータ分散方法で分散することに対応した、P1の計算分担部分である。
アドレスが9と10,45と46,81と82,117と118の網掛け部分は、P1とP0が共有する4つのキャッシュラインを示したものである。図31に比べて共有キャッシュラインの数が3分の1になっているので、フォールスシェアリングはそれだけ、発生しにくい。
【0151】
4つの角のアドレスが、73,79,102,108番目になる矩形部分3211は、第2のループネストにおける、配列aを(*,block)というデータ分散方法で分散することに対応した、P2の計算分担部分である。この矩形部分3211は、奇数番目のアドレスで始まり、偶数番目のアドレスで終わる、単一の連続領域なので、他プロセッサとキャッシュを共有することはない。よって、フォールスシェアリングは第1のループネストにおいてのみ、発生する。
【0152】
今の例では、共有キャッシュラインの数は3分の1になっていたが、一般に、従来技術では、図31において配列aの第2次元の寸法だけキャッシュラインを共有する可能性があり、本発明では、図32において太線で囲まれた部分について1つだけ、即ち、プロセッサ数分だけキャッシュラインを共有する可能性があるので、第2次元の寸法がプロセッサ数を上回れば、後者の方がフォールスシェアリングは発生しにくい。
【0153】
図33は、本発明のコンパイラが対象とする並列計算機システムの構成の一例を示したものである。同図において、3301は共有メモリ、3302は論理プロセッサエレメント、3303は制御用ネットワーク、3304は入出力用論理プロセッサエレメント、3305は入出力用コンソールまたはワークステーションを表す。
【0154】
本発明のコンパイラは、入出力用コンソールまたはワークステーション3305において実行され、並列ソースプログラムまたは並列オブジェクトプログラムに変換される。前者の並列ソースプログラムは、さらに、論理プロセッサエレメント3302向けのコンパイラにより並列オブジェクトプログラムに変換される。上記並列オブジェクトプログラムはリンカによりロードモジュールに変換され、入出力用論理プロセッサエレメント3304を通じて共有メモリ3301にロードされ、各論理プロセッサエレメント3302により実行される。論理プロセッサエレメント3302の起動、終了などの制御は制御用ネットワーク3303を通じて行われる。
【0155】
【発明の効果】
本発明によれば、プロセッサiからプロセッサjへ送信される部分配列は、プロセッサi側でもプロセッサj側でも連続アドレスになるので、非連続データを1回の通信で送信するために使われるバッファが不要になり、バッファへのデータのコピー時間が削除されるので、その分、プログラムの実行時間が短縮される。
【0156】
また、本発明によれば、各プロセッサはデータ分散前の配列全体を宣言して使用するので、データ再分散の際に、データ領域の確保・開放が不要であり、それにかかる実行時間が短縮される。
また、本発明によれば、データ分散前の配列全体を宣言して使用しているため、再分散されるデータの内、自プロセッサから自プロセッサへ送信されるデータは、再分散前後でアドレスが全く変わらないため処理が不要であり、従来、自プロセッサ内の異なるアドレスへコピーしていたのにかかる時間が短縮される。
【0157】
また、本発明によれば、プロセッサiに割り付けられたデータは、送信先プロセッサによって、高々、プロセッサ総数分の非連続な領域に別れるだけなので、プロセッサiに割り付けられたデータとプロセッサjに割り付けられたデータのアドレスが隣合う回数は、全プロセッサ数以下となる。したがって、異なるプロセッサが同じキャッシュラインを共有する機会が少ないため、異なるプロセッサが同じキャッシュラインをアクセスすることにより発生するフォールスシェアリングの発生する機会が少なく、プログラムの実行時間が短縮される。
【図面の簡単な説明】
【図1】本発明の第1実施例による並列化コンパイラの構成図である。
【図2】配列細分化部の処理を説明するためのフローチャートである。
【図3】配列高次元化部の処理を説明するためのフローチャートである。
【図4】ループ変換部の処理を説明するためのフローチャートである。
【図5】ループピーリング解析処理を説明するためのフローチャートである。
【図6】添字変更部の処理を説明するためのフローチャートである。
【図7】プログラム並列化部の処理を説明するためのフローチャートである。
【図8】ソースプログラムの例を示す図である。
【図9】ソースプログラムに対するデータ分散情報を説明するための図である。
【図10】ソースプログラムに対する辞書を説明するための図である。
【図11】配列細分化による細分化情報を説明するための図である。
【図12】配列高次元化による高次元化辞書を説明するための図である。
【図13】ソースプログラムに対するループテーブルとループ分散範囲テーブルを説明するための図である。
【図14】ソースプログラムに対する配列参照テーブルとピーリングテーブルを説明するための図である。
【図15】ループ範囲細分化後のループ分散範囲テーブルを説明するための図である。
【図16】ループiのループ範囲細分化後のループテーブルを説明するための図である。
【図17】ループjのループ範囲細分化後のループテーブルを説明するための図である。
【図18】ループピーリング後の中間語をプログラムイメージで表現した図である。
【図19】添字変更後の中間語をプログラムイメージで表現した図である。
【図20】データ分散情報変更後のデータ分散情報を説明するための図である。
【図21】並列化後のプログラムを示した図である。
【図22】データ分散前の配列によるデータ再分散の様子を示した図である。
【図23】従来技術による並列化プログラムを示した図である。
【図24】従来の並列化によるデータ再分散を説明するための図である。
【図25】本発明の第1実施例の並列化によるデータ再分散を説明するための図である。
【図26】本発明の第1実施例のコンパイラが対象とする並列計算機システムの構成の一例である。
【図27】本発明の第2実施例による並列化コンパイラの構成図である。
【図28】ソースプログラムの例を示す図である。
【図29】並列化後のプログラムを示す図である。
【図30】従来技術による並列化プログラムを示す図である。
【図31】従来の並列化によるプロセッサへの計算分担部分を説明するための図である。
【図32】本発明の第2実施例の並列化によるプロセッサへの計算分担部分を説明するための図である。
【図33】本発明の第2実施例のコンパイラが対象とする並列計算機システムの構成の一例を示す図である。
【符号の説明】
100:並列化コンパイラ
101:構文解析部
102:データ分散指示文解析部
103:形状収集部
104:形状種別数判定部
105:配列細分化部
106:配列高次元化部
107:プログラム変換部
1071:ループ変換部
1072:添字変更部
108:プログラム並列化部
109:コード生成部
110,2710:ソースプログラム
120:辞書
130:中間語
140:データ分散情報
150:ループテーブル
160,2720:並列化プログラム
2601:ローカルメモリ
2602,3302:論理プロセッサエレメント
2603:ネットワーク
2604,3304:入出力用論理プロセッサエレメント
2605,3305:入出力用コンソールまたはワークステーション
2701:ループ並列化解析部
2702:データ分散形状決定部
2703:プログラム並列化部
3301:共有メモリ
3303:制御用ネットワーク

Claims (8)

  1. 逐次計算機向けのソースプログラムまたはデータ分散指示文あるいはデータ再分散指示文を含む並列計算機向けのソースプログラムを入力し、並列計算機の各分散メモリにデータを分散し、データ再分散指示文またはデータ再分散ルーチンを含む並列計算機向けソースプログラムまたはオブジェクトプログラムを出力するコンパイラにおけるデータ再配置方法であって、
    プログラム中の各点における、各配列要素の分散メモリへの割付け方法を表わすデータ分散形状を収集する形状収集ステップと、
    各配列を、上記形状収集ステップで得られたどのデータ分散形状においても、各部分配列が唯一のプロセッサに属するような部分配列からなる集合に分割する配列細分化ステップと、
    上記各部分配列内の配列要素が連続アドレスになるように元の配列の次元数を増加させて配列要素の順序を並び替える配列高次元化ステップを有することを特徴とするデータ再配置方法。
  2. 逐次計算機向けまたは並列指示文を含む並列計算機向けのソースプログラムを入力し、共有メモリ型並列計算機向けの並列化指示文を含むソースプログラムまたはオブジェクトプログラムを出力するコンパイラにおけるデータ再配置方法であって、
    複数プロセッサがその部分配列を分担して計算すべき配列に対して、プログラム中の各点における、各配列要素のプロセッサへの割付け方法を表わすデータ分担形状を収集する形状収集ステップと、
    各配列を、上記形状収集ステップで得られたどのデータ分担形状においても各部分配列が唯一のプロセッサの分担になるような部分配列からなる集合に分割する配列細分化ステップと、
    上記各部分配列内の配列要素が連続アドレスになるように元の配列の次元数を増加させて配列要素の順序を並び替える配列高次元化ステップを有することを特徴とするデータ再配置方法。
  3. 請求項1または2記載のデータ再配置方法において、上記形状収集ステップによって得られた配列の各次元のデータ分散形状またはデータ分担形状の種類が2種類以下であることを判定する形状種別数判定ステップをさらに有することを特徴とするデータ再配置方法。
  4. 請求項1または2記載のデータ再配置方法において、上記配列高次元化ステップは、元の配列の各要素を、それぞれの請求項における配列細分化ステップによって得られた部分配列中の要素と各部分配列の全体配列中での位置を示す位置配列の要素との組で表現可能なように、元の配列から、上記部分配列の次元数と上記位置配列の次元数の和の次元数を持つ高次元化配列を作成し、上記高次元化配列の連続アドレスを与える次元から上記部分配列の次元数分の次元までの各寸法は、上記部分配列の各次元の寸法とし、残りの次元の寸法は、上記位置配列の各次元の寸法とすることを特徴とするデータ再配置方法。
  5. 請求項1または2記載のデータ再配置方法において、上記配列高次元化ステップに伴い、配列の高次元化される次元の添字にループ制御変数が含まれることを検出し、そのループ制御変数を持つループを、配列高次元化ステップに対応してネストする複数のループに変換するループ変換ステップと、プログラム中の配列参照点における配列添字を、配列高次元化ステップに対応して変更する添字変更ステップとをさらに含むことを特徴とするデータ再配置方法。
  6. 請求項5記載のデータ再配置方法において、上記ループ変換ステップは、配列要素の参照が部分配列間の境界をまたがるか否かを判定し、境界をまたがる場合とまたがらない場合とで別ループになるようにループの繰り返し範囲を分割するための解析を行なうループピーリング解析ステップと、上記解析の結果を用いてループの繰返し範囲を分割するループピーリングステップとを含むことを特徴とするデータ再配置方法。
  7. 請求項1記載のデータ再配置方法において、通信データのバッファリングを行なわない再分散通信を生成する非バッファリング再分散通信生成ステップをさらに含むことを特徴とするデータ再配置方法。
  8. 請求項7記載のデータ再配置方法において、分散メモリ型並列計算機の各プロセッサで、データ分散前の元の配列全体を宣言するグローバルデータ宣言作成ステップと、各配列参照点における配列添字の値を、データ分散前の元の値を用いるグローバル添字生成ステップをさらに含むことを特徴とするデータ再配置方法。
JP28169298A 1998-10-02 1998-10-02 データ再配置方法 Expired - Lifetime JP3551353B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP28169298A JP3551353B2 (ja) 1998-10-02 1998-10-02 データ再配置方法
US09/409,900 US6681388B1 (en) 1998-10-02 1999-10-01 Method and compiler for rearranging array data into sub-arrays of consecutively-addressed elements for distribution processing

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP28169298A JP3551353B2 (ja) 1998-10-02 1998-10-02 データ再配置方法

Publications (2)

Publication Number Publication Date
JP2000112901A JP2000112901A (ja) 2000-04-21
JP3551353B2 true JP3551353B2 (ja) 2004-08-04

Family

ID=17642661

Family Applications (1)

Application Number Title Priority Date Filing Date
JP28169298A Expired - Lifetime JP3551353B2 (ja) 1998-10-02 1998-10-02 データ再配置方法

Country Status (2)

Country Link
US (1) US6681388B1 (ja)
JP (1) JP3551353B2 (ja)

Families Citing this family (70)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7266725B2 (en) 2001-09-03 2007-09-04 Pact Xpp Technologies Ag Method for debugging reconfigurable architectures
DE19651075A1 (de) * 1996-12-09 1998-06-10 Pact Inf Tech Gmbh Einheit zur Verarbeitung von numerischen und logischen Operationen, zum Einsatz in Prozessoren (CPU's), Mehrrechnersystemen, Datenflußprozessoren (DFP's), digitalen Signal Prozessoren (DSP's) oder dergleichen
DE19654595A1 (de) * 1996-12-20 1998-07-02 Pact Inf Tech Gmbh I0- und Speicherbussystem für DFPs sowie Bausteinen mit zwei- oder mehrdimensionaler programmierbaren Zellstrukturen
DE19654846A1 (de) * 1996-12-27 1998-07-09 Pact Inf Tech Gmbh Verfahren zum selbständigen dynamischen Umladen von Datenflußprozessoren (DFPs) sowie Bausteinen mit zwei- oder mehrdimensionalen programmierbaren Zellstrukturen (FPGAs, DPGAs, o. dgl.)
EP1329816B1 (de) * 1996-12-27 2011-06-22 Richter, Thomas Verfahren zum selbständigen dynamischen Umladen von Datenflussprozessoren (DFPs) sowie Bausteinen mit zwei- oder mehrdimensionalen programmierbaren Zellstrukturen (FPGAs, DPGAs, o.dgl.)
US6542998B1 (en) 1997-02-08 2003-04-01 Pact Gmbh Method of self-synchronization of configurable elements of a programmable module
US8686549B2 (en) * 2001-09-03 2014-04-01 Martin Vorbach Reconfigurable elements
DE19861088A1 (de) * 1997-12-22 2000-02-10 Pact Inf Tech Gmbh Verfahren zur Reparatur von integrierten Schaltkreisen
JPH11259437A (ja) * 1998-03-12 1999-09-24 Hitachi Ltd 不要バリア命令の削減方式
TW463528B (en) * 1999-04-05 2001-11-11 Idemitsu Kosan Co Organic electroluminescence element and their preparation
JP2003505753A (ja) * 1999-06-10 2003-02-12 ペーアーツェーテー インフォルマツィオーンステヒノロギー ゲゼルシャフト ミット ベシュレンクテル ハフツング セル構造におけるシーケンス分割方法
US7500188B1 (en) * 2000-04-26 2009-03-03 Novarra, Inc. System and method for adapting information content for an electronic device
US20040049737A1 (en) * 2000-04-26 2004-03-11 Novarra, Inc. System and method for displaying information content with selective horizontal scrolling
US7747782B2 (en) * 2000-04-26 2010-06-29 Novarra, Inc. System and method for providing and displaying information content
JP2004506261A (ja) 2000-06-13 2004-02-26 ペーアーツェーテー イクスペーペー テクノロジーズ アクチエンゲゼルシャフト パイプラインctプロトコルおよびct通信
US8058899B2 (en) * 2000-10-06 2011-11-15 Martin Vorbach Logic cell array and bus system
US20090210653A1 (en) * 2001-03-05 2009-08-20 Pact Xpp Technologies Ag Method and device for treating and processing data
US7444531B2 (en) * 2001-03-05 2008-10-28 Pact Xpp Technologies Ag Methods and devices for treating and processing data
US9037807B2 (en) * 2001-03-05 2015-05-19 Pact Xpp Technologies Ag Processor arrangement on a chip including data processing, memory, and interface elements
US7844796B2 (en) * 2001-03-05 2010-11-30 Martin Vorbach Data processing device and method
JP2004533691A (ja) * 2001-06-20 2004-11-04 ペーアーツェーテー イクスペーペー テクノロジーズ アクチエンゲゼルシャフト データを処理するための方法
US7055144B2 (en) * 2001-07-12 2006-05-30 International Business Machines Corporation Method and system for optimizing the use of processors when compiling a program
US7996827B2 (en) 2001-08-16 2011-08-09 Martin Vorbach Method for the translation of programs for reconfigurable architectures
US7434191B2 (en) * 2001-09-03 2008-10-07 Pact Xpp Technologies Ag Router
US8686475B2 (en) * 2001-09-19 2014-04-01 Pact Xpp Technologies Ag Reconfigurable elements
US8281108B2 (en) * 2002-01-19 2012-10-02 Martin Vorbach Reconfigurable general purpose processor having time restricted configurations
EP1347375A1 (en) * 2002-02-07 2003-09-24 Sap Ag Method and apparatus for parallel distributed compilation
US8127061B2 (en) * 2002-02-18 2012-02-28 Martin Vorbach Bus systems and reconfiguration methods
US8914590B2 (en) * 2002-08-07 2014-12-16 Pact Xpp Technologies Ag Data processing method and device
EP1518186A2 (de) * 2002-03-21 2005-03-30 PACT XPP Technologies AG Verfahren und vorrichtung zur datenverarbeitung
US20110161977A1 (en) * 2002-03-21 2011-06-30 Martin Vorbach Method and device for data processing
US20070011433A1 (en) * 2003-04-04 2007-01-11 Martin Vorbach Method and device for data processing
JP3847672B2 (ja) * 2002-07-03 2006-11-22 松下電器産業株式会社 コンパイラ装置及びコンパイル方法
WO2004021176A2 (de) * 2002-08-07 2004-03-11 Pact Xpp Technologies Ag Verfahren und vorrichtung zur datenverarbeitung
US20110238948A1 (en) * 2002-08-07 2011-09-29 Martin Vorbach Method and device for coupling a data processing unit and a data processing array
US7657861B2 (en) * 2002-08-07 2010-02-02 Pact Xpp Technologies Ag Method and device for processing data
US6952821B2 (en) * 2002-08-19 2005-10-04 Hewlett-Packard Development Company, L.P. Method and system for memory management optimization
EP1537486A1 (de) 2002-09-06 2005-06-08 PACT XPP Technologies AG Rekonfigurierbare sequenzerstruktur
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
WO2006082091A2 (en) * 2005-02-07 2006-08-10 Pact Xpp Technologies Ag Low latency massive parallel data processing device
US7373640B1 (en) * 2003-07-31 2008-05-13 Network Appliance, Inc. Technique for dynamically restricting thread concurrency without rewriting thread code
JP4700611B2 (ja) * 2003-08-28 2011-06-15 ペーアーツェーテー イクスペーペー テクノロジーズ アクチエンゲゼルシャフト データ処理装置およびデータ処理方法
US7395527B2 (en) 2003-09-30 2008-07-01 International Business Machines Corporation Method and apparatus for counting instruction execution and data accesses
US8381037B2 (en) * 2003-10-09 2013-02-19 International Business Machines Corporation Method and system for autonomic execution path selection in an application
US7415705B2 (en) 2004-01-14 2008-08-19 International Business Machines Corporation Autonomic method and apparatus for hardware assist for patching code
US7895382B2 (en) 2004-01-14 2011-02-22 International Business Machines Corporation Method and apparatus for qualifying collection of performance monitoring events by types of interrupt when interrupt occurs
US7496908B2 (en) * 2004-01-14 2009-02-24 International Business Machines Corporation Method and apparatus for optimizing code execution using annotated trace information having performance indicator and counter information
CN100409187C (zh) * 2004-02-12 2008-08-06 松下电器产业株式会社 程序转换装置及程序转换方法
US20060123401A1 (en) * 2004-12-02 2006-06-08 International Business Machines Corporation Method and system for exploiting parallelism on a heterogeneous multiprocessor computer system
US8473934B2 (en) * 2005-07-15 2013-06-25 Imec Method for mapping applications on a multiprocessor platform/system
JP4822817B2 (ja) * 2005-11-22 2011-11-24 パナソニック株式会社 コンパイルシステム
WO2007068148A1 (en) * 2005-12-17 2007-06-21 Intel Corporation Method and apparatus for partitioning programs to balance memory latency
JP2009524134A (ja) * 2006-01-18 2009-06-25 ペーアーツェーテー イクスペーペー テクノロジーズ アクチエンゲゼルシャフト ハードウェア定義方法
US7912889B1 (en) 2006-06-16 2011-03-22 Nvidia Corporation Mapping the threads of a CTA to the elements of a tile for efficient matrix multiplication
US7792895B1 (en) * 2006-06-16 2010-09-07 Nvidia Corporation Efficient matrix multiplication on a parallel processing device
US7836118B1 (en) 2006-06-16 2010-11-16 Nvidia Corporation Hardware/software-based mapping of CTAs to matrix tiles for efficient matrix multiplication
US8255890B2 (en) * 2007-02-14 2012-08-28 The Mathworks, Inc. Media for performing parallel processing of distributed arrays
US8239844B2 (en) * 2007-02-14 2012-08-07 The Mathworks, Inc. Method of using parallel processing constructs and dynamically allocating program portions
WO2008118613A1 (en) * 2007-03-01 2008-10-02 Microsoft Corporation Executing tasks through multiple processors consistently with dynamic assignments
WO2009068014A2 (de) * 2007-11-28 2009-06-04 Pact Xpp Technologies Ag Über datenverarbeitung
WO2009071329A1 (en) * 2007-12-07 2009-06-11 Pact Xpp Technologies Ag Using function calls as compiler directives
US8572276B2 (en) * 2010-04-29 2013-10-29 International Business Machines Corporation Pipelining protocols in misaligned buffer cases
US20120221788A1 (en) * 2011-02-28 2012-08-30 Microsoft Corporation Multi-dimensional array manipulation
US20130332937A1 (en) * 2012-05-29 2013-12-12 Advanced Micro Devices, Inc. Heterogeneous Parallel Primitives Programming Model
JP6442967B2 (ja) 2014-10-10 2018-12-26 富士通株式会社 情報処理プログラム、情報処理装置、情報処理方法
US10402110B2 (en) * 2016-08-04 2019-09-03 Rambus Inc. Adjustable access energy and access latency memory system and devices
JP6718119B2 (ja) 2016-12-05 2020-07-08 富士通株式会社 コンパイルプログラム、コンパイル方法および情報処理装置
US9946539B1 (en) * 2017-05-23 2018-04-17 Google Llc Accessing data in multi-dimensional tensors using adders
US10628141B2 (en) * 2018-05-07 2020-04-21 Intel Corporation Compiler transformation with loop and data partitioning
US11113064B2 (en) * 2019-11-27 2021-09-07 Sas Institute Inc. Automated concurrency and repetition with minimal syntax

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247632A (en) * 1989-01-23 1993-09-21 Eastman Kodak Company Virtual memory management arrangement for addressing multi-dimensional arrays in a digital data processing system
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
US5485619A (en) * 1993-12-29 1996-01-16 International Business Machines Corporation Array variable transformation system employing subscript table mapping to scalar loop indices
US5659714A (en) * 1995-07-05 1997-08-19 Mitsubishi Denki Kabushiki Kaisha Data processor including memory for associating data elements of two-dimensional array which are numbered in spiral order with element numbers thereof
US5845126A (en) * 1995-12-06 1998-12-01 International Business Machines Corporation Method of, system for, and computer program product for providing inlined nested array constructors using normalized counters

Also Published As

Publication number Publication date
US6681388B1 (en) 2004-01-20
JP2000112901A (ja) 2000-04-21

Similar Documents

Publication Publication Date Title
JP3551353B2 (ja) データ再配置方法
US5293631A (en) Analysis and optimization of array variables in compiler for instruction level parallel processor
US7257780B2 (en) Software-to-hardware compiler
JP5733860B2 (ja) 依存問題の効率的並列計算
US8930922B2 (en) Software-to-hardware compiler with symbol set inference analysis
KR20200062323A (ko) 다수의 프로세서들 및 뉴럴 네트워크 가속기를 갖는 뉴럴 네트워크 프로세싱 시스템
Bauer et al. Singe: Leveraging warp specialization for high performance on gpus
JP2011527788A5 (ja)
JP2014524607A (ja) 異種構成コンピュータ上でハイ・レベルのプログラムをコンパイルし、実行するための技法
CN111090464B (zh) 一种数据流处理方法及相关设备
Hormati et al. Macross: Macro-simdization of streaming applications
Xiang et al. Heteroflow: An accelerator programming model with decoupled data placement for software-defined fpgas
Papakonstantinou et al. Efficient compilation of CUDA kernels for high-performance computing on FPGAs
Huang et al. Towards a more efficient implementation of OpenMP for clusters via translation to global arrays
Das et al. Index array flattening through program transformation
US5781777A (en) Optimization method for computation partitioning oriented to a distributed memory
WO2022068205A1 (zh) 数据存储和读取方法及系统
Owaida et al. Massively parallel programming models used as hardware description languages: The OpenCL case
US7802005B2 (en) Method and apparatus for configuring buffers for streaming data transfer
Viswanathan et al. Compiler-directed shared-memory communication for iterative parallel applications
Tao et al. Compiler-directed scratchpad memory data transfer optimization for multithreaded applications on a heterogeneous many-core architecture
JP4787456B2 (ja) 並列プログラム生成装置,並列プログラム生成方法および並列プログラム生成プログラム
Benkner HPF+: High Performance Fortran for advanced scientific and engineering applications
CN113448586A (zh) 自动编译器数据流优化的集成
Benkner Optimizing irregular HPF applications using halos

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

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

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: 20080514

Year of fee payment: 4

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

EXPY Cancellation because of completion of term