JP4740561B2 - トランスレータプログラム、プログラム変換方法およびトランスレータ装置 - Google Patents

トランスレータプログラム、プログラム変換方法およびトランスレータ装置 Download PDF

Info

Publication number
JP4740561B2
JP4740561B2 JP2004203063A JP2004203063A JP4740561B2 JP 4740561 B2 JP4740561 B2 JP 4740561B2 JP 2004203063 A JP2004203063 A JP 2004203063A JP 2004203063 A JP2004203063 A JP 2004203063A JP 4740561 B2 JP4740561 B2 JP 4740561B2
Authority
JP
Japan
Prior art keywords
loop
index
distribution
program
code
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 - Fee Related
Application number
JP2004203063A
Other languages
English (en)
Other versions
JP2006024088A (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.)
Fujitsu Ltd
Original Assignee
Fujitsu 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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2004203063A priority Critical patent/JP4740561B2/ja
Priority to US10/992,353 priority patent/US7555745B2/en
Publication of JP2006024088A publication Critical patent/JP2006024088A/ja
Application granted granted Critical
Publication of JP4740561B2 publication Critical patent/JP4740561B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

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/456Parallelism detection

Description

この発明は、並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータプログラム、プログラム変換方法およびトランスレータ装置に関し、特に、ループインデックスの計算に起因するループの実行効率の低下を防ぐことができるトランスレータプログラム、プログラム変換方法およびトランスレータ装置に関するものである。
科学技術計算の並列化では、データを複数のプロセッサに分割して処理させるデータの分散処理と、ループを複数のプロセッサに分割して処理させるループの分散処理が基本となる。図21−1は、データの分散を示す図であり、図21−2は、ループの分散を示す図である。
図21−1は、30個のデータから構成される1次元配列Aを8個、8個、8個および6個のデータから構成される4つのグループに分割し、4つのプロセッサで分散処理する場合を示している。図21−2は、ループ変数Iについての30回の繰り返し処理を、8回、8回、8回および6回の繰り返し処理に4分割し、4つのプロセッサで分散処理する場合を示している。
このように、科学技術計算では、データおよびループを分散処理することによって、処理の高速化が図られている。なお、データの分割およびループの分割は、インデックスの分割として統一的に扱うことができる。
HPF、OpenMP、VPPFortranなどの並列プログラミング言語では、インデックスの分割を指定することができる。具体的には、VPP Fortranはデータ分割とループ分割を表現する書式を持つ。HPFはデータ分割を表現する書式を持ち、ループ分割は間接的に表現できる。OpenMPはループ分割を表現する書式を持つが、共有メモリ型計算機を対象とするのでデータ分割の表現を持たない。
また、これらの並列プログラミング言語は、複数種類のインデックス分割を提供している。図22は、インデックス分割による分散の種類を示す図であり、30要素を4分割する場合を例として示している。同図に示すように、インデックス分割による分散には、ブロック分散、サイクリック分散、ブロック−サイクリック分散、不均等ブロック分散、不規則分散の5種類がある。
それぞれの詳細な意味については、非特許文献1または2に記載されているが、特徴は以下のとおりである。
ブロック分散は、分散次元についてもデータの連続性を残しているので近傍のデータ(配列要素)との相関が大きいアプリケーションに適している。また、計算負荷が計算領域に対して均一でない場合や、並列計算機の能力が不揃いの場合(ヘテロ環境)には、ブロック分散の代りに不均等ブロック分散を使用すれば負荷バランスが調節できる。
また、負荷バランスや計算範囲が実行ループごとに違う場合や実行時まで不明の場合には、サイクリック分散を使えば負荷分散をほぼ均等にできる。しかし、サイクリック分散は近傍のデータとの相関が強い場合に通信を多く発生するので、ブロック分散とサイクリック分散の中間的な方法としてブロック−サイクリック分散がある。
また、空間中を浮遊する粒子に関する計算など、データとプロセッサの対応づけが不規則でテーブルによって管理する必要がある場合には、不規則分散を使用することができる。
図23−1〜図23−3は、並列プログラミング言語による並列化の例を示す図である。図23−1は、逐次プログラムを示す図であり、図23−2は、OpenMPによる並列化を示す図であり、図23−3は、HPFによる並列化(入力例1)を示す図である。
図23−2において、4行目のparallel do指示文は、ループdo Iを並列に実行するよう指示している。OpenMPは、データの共有を前提とするので、データの分割配置に関する指示文は持たない。
図23−3において、2行目と3行目は、変数Aの1次元目方向を均等に4ブロックに分割して4プロセッサに配置することを指示している。6行目のindependent指示文は、ループdo Iが並列実行可能であることを指示している。
それぞれ、ループの並列実行のためには、各プロセッサが実行するループインデックスの範囲を決定する必要がある。OpenMPではループの分割方法は言語仕様によって決められていて、インデックス範囲を機械的に分割する。HPFでは、ループ内でアクセスされる変数(この例ではA)の分割配置となるべく整合性が取れるように、コンパイラが自動的に分割を決定する。
このように、並列化されたプログラムに対して、コンパイラは複数のプロセッサが実際に並列実行できるコードを生成する。このとき、コンパイラは、データもループもインデックス範囲を分割してプロセッサに割り振るが、データのインデックス付けを変換することで宣言形状をプロセッサ間で同じにし、SPMD(Single Program/Multiple Data)方式で静的なデータ割付を可能にする。
図24−1は、データおよびループのインデックス分割とプロセッサとの対応を示す図である。同図は、1000×1000の配列a(i,j)に対して、1行〜250行までのデータが0番のプロセッサP(0)に割り当てられ、251行〜500行までのデータが1番のプロセッサP(1)に割り当てられ、501行〜750行までのデータが2番のプロセッサP(2)に割り当てられ、751行〜1000行までのデータが3番のプロセッサP(3)に割り当てられることを示している。
図24−2は、図23−3に示した並列言語プログラムに対して従来のコンパイラが出力するコードを示す図である。同図において、myIDはプロセッサの番号であり、myIDを用いて各プロセッサの担当インデックス範囲の下限値myLBおよび上限値myUBが計算され、これら下限値および上限値が繰り返し範囲の指定およびデータのアクセスに使用される。
ここで、データa(i,j)をアクセスする場合に、変換前の入力プログラムのインデックスであるグローバルインデックスIから変換後のプログラムのインデックスであるローカルインデックスiへの変換i=gtol(I)=I-myLB+1=I-250*myIDが実行時に必要となる。
この変換gtolは、分散の種類やパラメタ(インデックスの長さ、分割数など)によって異なる関数となり、分散種別によっては複雑な計算式となるため、実行時ライブラリの呼出しによって実現されることも多い。なお、不規則分散の場合には一つの式では表現できず、テーブルの参照となる。
High Performance Fortran Forum, "High Performance Language Specification Version 2.0.", 1997 富士通,日立,日本電気訳、「High Performance Fortran 2.0公式マニュアル」、シュプリンガー・フェアラーク東京、ISBN4-431-70822-7、1999年 Japan Association for High Performance Fortran (JAHPF),"HPF/JA Language Specification Version 1.0", November 1999、[平成16年6月18日検索]、インターネット<URL: HYPERLINK http://www.hpfpc.org/jahpf/spec/hpfja-v10-eng.pdf http://www.hpfpc.org/jahpf/spec/hpfja-v10-eng.pdf> OpenMP Architecture Review Board, "OpenMP Fortran Application Program Interface Version 2.0", November 2000、[平成16年6月18日検索]、インターネット<URL: HYPERLINK http://www.openmp.org/specs/mp-documents/fspec20.pdf http://www.openmp.org/specs/mp-documents/fspec20.pdf> OpenMP Architecture Review Board, "OpenMP C/C++ Application Program Interface Version 1.0", October 1998、[平成16年6月18日検索]、インターネット< HYPERLINK http://www.openmp.org/specs/mp-documents/cspec10.pdf http://www.openmp.org/specs/mp-documents/cspec10.pdf>
図24−2に示したコードでは、グローバルインデックスIからローカルインデックスiへの変換gtolは、比較的単純であった。しかし、このような場合でさえも、インデックス変換のない場合の変数アクセスのコスト(load命令1回分程度)と比較して、インデックス変換のコスト(数演算の実行)はかなり大きいため、その部分の実行時間は数倍に増加する場合がある。
より一般的な場合(ブロック分散以外の分散、ループの初期値・終値が配列の宣言形状と不一致、ループに1以外の増分値、インデックスの大きさがプロセッサ数で割り切れないなど)、ループを並列化した結果はより複雑になり、実行効率が低下するという問題がある。
例えば、図25−1は、ブロック−サイクリック分散を用いる並列言語プログラムの例を示す図である。また、この例では、ループの上下限値が配列の上下限値と異なる。このとき、グローバルインデックスとローカルインデックスの対応は、図25−2に示すようになる。
図25−2において、プロセッサP(0)では、グローバルインデックス「1〜5」にローカルインデックス「1〜5」が対応し、グローバルインデックス「21〜25」にローカルインデックス「6〜10」が対応し、グローバルインデックス「981〜5」にローカルインデックス「246〜250」が対応する。
図25−3は、図25−1に示した並列言語プログラムに対して生成される従来のコードを示す図である。同図に示すように、インデックス変換式は、(I-1)/20*5+MOD(I-1,5)+1となる(除算は余りを切り捨てる整数除算)。また、並列ループについて、各プロセッサの担当範囲は5要素を1ブロックとする飛び飛びの範囲となるため、1重のDOループでは表現できず複雑な2重ループとなっている。このような出力コードの複雑化は、実行効率の低下を招きやすい。
図26−1は、別の分散の例として、不規則分散を用いる並列言語プログラムの例を示す図である。この場合、グローバルインデックスとローカルインデックスの対応は図26−2に示すようになる。
図26−3は、図26−1に示した並列言語プログラムに対して生成される従来のコードを示す図である。このコードでは、インデックス変換は式では表現できず、コンパイラが生成したテーブルGTOLの参照となっている。
また、プロセッサ毎に実行するループインデックスの値は、FORTRANのDO文では表現することができないため、IF文によって実行が必要な反復を選び出している。つまり、全てのプロセッサで全てのループ範囲を実行するという無駄が生じる。この無駄はプロセッサ数が多くなるほど相対的に大きくなる。
この発明は、上述した従来技術による問題点を解消するためになされたものであり、ループインデックスの計算に起因するループの実行効率の低下を防ぐことができるトランスレータプログラム、プログラム変換方法およびトランスレータ装置を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明は、並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータプログラムであって、分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定手順と、前記分散パラメタ設定手順により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化手順と、をコンピュータに実行させることを特徴とする。
また、本発明は、並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するプログラム変換方法であって、分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定工程と、前記分散パラメタ設定工程により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化工程と、を含んだことを特徴とする。
また、本発明は、並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータ装置であって、分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定手段と、前記分散パラメタ設定手段により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化手段と、を備えたことを特徴とする。
かかる発明によれば、分散に関するパラメタである分散パラメタに値を設定するコードを生成し、生成したコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するよう構成したので、ループインデックス変換に起因するオーバヘッドを削減することができる。
本発明によれば、ループインデックス変換に起因するオーバヘッドを削減するので、ループの実行効率の低下を防ぐことができるという効果を奏する。
以下に添付図面を参照して、この発明に係るトランスレータプログラム、プログラム変換方法およびトランスレータ装置の好適な実施例を詳細に説明する。なお、本実施例では、本発明をHPFを用いて作成された並列言語プログラムに適用した場合を中心に説明する。また、ここでは、数学記号を図27に示すように定義し、使用する用語の定義は以下のとおりである。
SMP(Symmetric Multiprocessor)
複数CPUが同じメモリ空間を共有する並列実行。データの分散を考える必要がなく、すべてのデータはすべてのCPUから直接アクセス可能である。共有メモリ型計算機は通常SMP型の計算機であると言える。
SPMD(Single Program/Multiple Data)
複数のプロセッサに同じプログラムを与えて、プロセッサIDなどのパラメタの違いによって処理を分担させ、全体として並列実行を行わせる方法。
恒等的な整列
m=1, n=0の整列。
整列
Aの第d次元がBの第e次元に整列するとは、Aの第d次元のインデックスiからBの第e次元のインデックスjに一定の対応付けがあり、対応する配列要素どうしは同じプロセッサに対して分散されることを言う。HPFで定義される整列は、
j = m i + n (m, nは整数、m≠0)
という形であり、ARIGN指示文を使って以下のように表現する。
ALIGN A(i) WITH B(m*i+n)
HPFでは、ARIGN指示文によって、配列データから配列データまたはテンプレートへの整列が表現できる。また、ON指示文によって間接的に、ループから配列データまたはテンプレートへの整列が表現できる。VPP Fortranでは、配列データからテンプレート、ループからテンプレートへの整列が表現できる。OpenMPでは整列の表現はないが、並列ループからテンプレートへ常に恒等的な整列(m=1, n=0の整列)があると思えばよい。
テンプレート
配列要素やループの反復をプロセッサに分散するとき、仲介となる仮想的な配列。HPFの言語仕様(非特許文献1および2参照。)で定義されていて、VPP Fortranのインデックス(非特許文献5参照。)の概念にも近い。テンプレートは、図22に例示したような分散方法でプロセッサと対応づけられる。変数やループはテンプレートに対して整列することができる。
プロセッサ
並列計算処理を実行する仮想的な単位。プロセッサは任意の次元数の矩形状に配置することができ、プロセッサの総数が並列度となる。分散メモリ型計算機では、各プロセッサは固有のメモリ空間を持つ。共有メモリ型計算機(SMP)では、メモリ空間はプロセッサ間で共有される。プロセッサと物理的なCPUの対応は、言語仕様で定義されることもあるし、コンパイラやオペレーティングシステムが決定することもある。複数のプロセッサの実行が物理的には1つのCPUで実現される場合もある。複数のプロセッサ配列が定義されるとき、その配列要素間の対応もまた、言語仕様で定義されることもあるし、コンパイラやオペレーティングシステムが決定することもある。
ローカルアクセス
プロセッサ間の通信を伴わないデータのアクセス。参照の場合にはアクセスするプロセッサがそのデータを所有していることが条件であり、定義の場合には、それに加えて、複製を持つすべてのプロセッサが同じ値を定義することが条件となる。分散されていない変数(プロセッサに分割配置されず全要素のコピーが配置されている変数)は、分散されたDOループの中では、参照はローカルアクセスだが、定義はローカルアクセスでない。
また、分散種別と共に分散を特徴づけるパラメタには以下のものがある。
Nd:テンプレートの次元dの寸法。言い換えると、分割されるインデックスの長さ。例えば、HPFプログラムで、
!HPF$ PROCESSORS Q(4,6)
!HPF$ TEMPLATE U(100,0:29)
!HPF$ DISTRIBUTE U(block,cyclic) ONTO Q
とある場合、N1=100、N2=30となる。dを省略し単にNと書くこともある。
Pd:テンプレートの次元dに対応するプロセッサ群の次元の寸法。言い換えると、インデックスの分割数。分散先プロセッサ群が一次元配列の場合には、P1はプロセッサ群を構成するプロセッサの数となる。例えば、上の例で、P1=4、P2=6となる。ここではテンプレートのd次元目はプロセッサ群のd次元目に対応するよう正規化されていると仮定する。dを省略し単にPと書くこともある。
pd:テンプレートの次元dに対応するプロセッサ群の次元の中の自プロセッサの位置(0 ≦ pd < Pd)。例えば、上の例で、プロセッサQ(1,3)はp1=1、p2=3となる。pdの値は実行時にライブラリ呼出しなどによって得られる仮想プロセッサ番号から計算できる。dを省略し単にpと書くこともある。
w:ブロック分散またはブロック−サイクリック分散のときのブロック幅。ブロック分散でユーザ指定のない場合には、HPFとOpenMPでは
Figure 0004740561
と定義される。
W:不均等ブロック分散のときのブロック幅配列。長さPのベクトル。
W(p) (0 ≦ p < P)はプロセッサpに割り当てられるインデックスの幅となる。W(0) = W(1) = ... = W(P-1) = wであるとき幅wのブロック分散を意味する。
M:不規則分散のときの正規化されたマッピング配列。長さNdのベクトル。
M(k) (0 ≦ k < N)はテンプレートの各要素に対応するプロセッサの要素番号であり、0 ≦ M(k) < Pとなる。
また、以下は上記のパラメタから誘導されるパラメタである。
B:不均等ブロック分散のときのグローバルインデックスでの下限値の配列。長さPのベクトル。以下のように定義される。
Figure 0004740561
以降、これらを合せて分散パラメタと呼ぶ。
なお、それぞれの手順の中に数式を作成する処理が数多くあるが、定数評価や数式処理的な技法を使って、出来る限り簡単化した式として生成するか、コード生成後に定数伝播・畳み込みなどの最適化技術によりできる限り簡単化することが望ましい。
まず、本実施例に係るプログラム変換による並列化の例について説明する。図1−1は、本実施例に係るプログラム変換による並列化の例(1)を示す図である。この例は、図23−3に示した並列言語プログラム(入力例1)を並列化したものである。
同図に示すように、本実施例に係るプログラム変換では、配列データだけでなくループについてもインデックスをローカル化することにより、分散配列のループ内のローカルアクセスでは添字式の変換を全く必要としないコードを生成する。具体的には、配列aにアクセスする場合に、ローカルインデクスiを用いてアクセスするコードを生成する。
図1−2は、本実施例に係るプログラム変換による並列化の例(2)を示す図である。この例は、図25−1に示した並列言語プログラム(入力例2)を並列化したものである。同図に示すように、ブロック−サイクリック分散を用い、ループの上下限値が配列の上下限値と異なる場合にも、図25−3に示した従来の並列化のように複雑なインデックス変換式や2重ループを用いることなく、添字式の変換を全く必要としないコードを生成する。
図1−3は、本実施例に係るプログラム変換による並列化の例(3)を示す図である。この例は、図26−1に示した並列言語プログラム(入力例3)を並列化したものである。同図に示すように、不規則分散を用いる場合にも、図26−3に示した従来の並列化のようにテーブルGTOLを参照することなく、添字式の変換を全く必要としないコードを生成する。
このように、本実施例に係るプログラム変換では、配列データだけでなくループについてもインデックスをローカル化することにより、ループインデックスの計算に起因するループの実行効率の低下を防ぐことができる。
次に、本実施例に係るトランスレータプログラムの構成について説明する。図2は、本実施例に係るトランスレータプログラムの構成を示す機能構成図である。同図に示すように、このトランスレータプログラム100は、並列言語パーサ110と、最適化・正規化処理部120と、コード生成部130とを有する。
並列言語パーサ110は、HPFプログラムを入力して構文解析を行うパーサである。この並列言語パーサ110は、例えば、図23−3、図25−1、図26−1に示したHPFプログラムを入力する。
最適化・正規化処理部120は、並列言語パーサ110による構文解析結果に基づいてHPFプログラムの最適化および正規化を行う処理部である。
コード生成部130は、最適化・正規化処理部120により最適化および正規化が行われたHPFプログラムに対して、複数のプロセッサで分散処理されるFORTRANプログラムを生成する処理部である。
このコード生成部130は、ループインデックスをローカル化することによって、実行効率の良いFORTRANプログラムを生成し、生成されたFORTRANプログラムは、FORTRANコンパイラ10によってコンパイルされ、実行可能ファイルが生成される。なお、FORTRANコンパイラ10は、MPI(Message Passing Library)などの実行時ライブラリを結合して実行可能ファイルを生成する。
コード生成部130は、分散パラメタ設定部131と、ループインデックスローカル化部132と、配列形状ローカル化部133とを有する。
分散パラメタ設定部131は、テンプレートTの全ての分散次元dについて、分散パラメタpを実行時に計算して生成変数に設定する実行コードを生成する処理部である。生成する場所は各手続の入口である。あるいは、主プログラムの入口で外部変数に設定して全手続から見えるようにすることもできる。
なお、他の分散パラメタについては、同様に生成変数を設けて値を設定する実行コードを生成することもできる。ただし、コンパイル時に値が求められるパラメタは、実行コードを生成しない。
また、この分散パラメタ設定部131は、不規則分散の場合に、グローバルインデックスからローカルインデックスを得るためのテーブルとして形状(0:N)の1次元配列を宣言し、図3に示す漸化式で定義される値を設定するコードを生成する。ここで、配列名はテンプレートの次元毎に一意の名前とする(ここではgtolとする)。なお、このテーブルの値はプロセッサによって異なる。
また、この分散パラメタ設定部131は、不規則分散の場合に、ローカルインデックスからグローバルインデックスを得るためのテーブルとして形状(0: n-1)の領域を確保し、M(k)の値が自プロセッサ番号pと一致するkの値を昇順に並べたものを設定するコードを生成する。ここで、テーブルのサイズnは、n=Nとしてもよいが、少なくともこの設定で溢れないだけの大きさがあれば十分である。また、配列名はテンプレートの次元毎に一意の名前とする(ここではltogとする)。
ループインデックスローカル化部132は、ループインデックスをローカル化する処理部であり、ループパラメタローカル化部132aと、ループ変数変換部132bとを有する。
ループパラメタローカル化部132aは、テンプレートTの分散次元dに整列するループLについて、グローバルインデックスをローカルインデックスに変換するためのコードをループの前に生成する処理部である。
図4−1は、ループパラメタローカル化部132aが生成するコードを示す図である。同図に示すように、ループパラメタローカル化部132aは、グローバルインデックスの三つ組I1:I2:I3からローカルインデックスの三つ組i1:i2:i3を求めるコードをループの前に生成する。なお、グローバルインデックスの三つ組I1:I2:I3からローカルインデックスの三つ組i1:i2:i3を得る計算式は数学的に求めることができ、その解の一例については後述する。また、i1、i2、またはi3が1つの式の評価だけで計算できる場合、その式で直接ループパラメタを置き換えてもよい。
図4−2は、ループパラメタに増分が存在しない場合に、ループパラメタローカル化部132aが生成するコードを示す図である。同図に示すように、ループパラメタローカル化部132aは、グローバルインデックスの二つ組I1:I2からローカルインデックスの二つ組i1:i2を求めるコードをループの前に生成する。なお、グローバルインデックスの二つ組I1:I2からローカルインデックスの二つ組i1:i2を得る計算式は数学的に求めることができ、その解の一例についても後述する。また、i1またはi2が1つの式の評価だけで計算できる場合、その式で直接ループパラメタを置き換えてもよい。
図4−3は、不規則分散の場合に、ループパラメタローカル化部132aが生成するコードを示す図である。同図に示すように、ループパラメタローカル化部132aは、分散パラメタ設定部131が生成したグローバルインデックスからローカルインデックスを求めるテーブルgtolを用いて、ループ初期値および終値を置き換える。
なお、ループパラメタに増分が存在する場合、ループパラメタのローカル化の直前に、図5に示すようにループを変換することにより、増分を消し去ることができる。
ループ変数変換部132bは、ループLの中でループ変数の引用を検出し、それぞれグローバルインデックスに変換する式に置き換える処理部である。ただし、そのループ変数がローカルアクセスの添字式として引用されていて、かつ、その次元で配列がテンプレートTの次元dに整列している場合には、この変換は行わない。なお、ローカルインデックスをグローバルインデックスに変換する関数は数学的に求めることができ、その解の一例についても後述する。
配列形状ローカル化部133は、テンプレートTに整列する分散配列Aについて、配列インデックスのローカル化を行う処理部である。すなわち、この配列形状ローカル化部133は、テンプレートTのすべての分散している次元dに対して、配列Aの次元dに整列している次元について、下限を0に置き換え、上限をlsize_supより1小さい値を表現するコードに置き換える。
lsize_supは、max [ lsizeq | 0≦q<P ] 以上の任意の値であり、メモリ領域の無駄を小さくするためにはできるだけ小さな値であることが望ましい。ここで、lsizeqは、プロセッサqに分割割当てされるその次元のインデックスの数である。lsize_supは数学的に求めることができ、その解の一例については後述する。
なお、不規則分散の場合には、lsizeqは、M(k) = qとなる要素数だが、記憶領域の無駄を厭わないのであれば、lsize_sup=Nとしてもよい。
なお、ここでは、不規則分散の場合に、分散パラメタ設定部131が、グローバルインデックスからローカルインデックスを得るためのテーブルおよびローカルインデックスからグローバルインデックスを得るためのテーブルを生成するが、ループパラメタローカル化部132aが各ループに対して行うこともできる。その場合、コードの生成場所は手続の入口ではなく各ループの直前とする。
次に、コード生成部130の処理手順について説明する。図6は、コード生成部130の処理手順を示す流れ図である。同図に示すように、このコード生成部130は、全てのテンプレートTについて、分散パラメタの設定を行い(ステップS100)、ループインデックスのローカル化を行い(ステップS200)、配列インデックスのローカル化を行う(ステップS300)。
また、ステップS200のループインデックスのローカル化では、Tの全ての分散している次元dについて、dに整列する全てのループLについて、ループパラメタのローカル化を行い(ステップS210)、ループ変数引用の変換を行う(ステップS220)。
また、ステップS300の配列インデックスのローカル化では、Tに整列する全ての配列Aについて、Tの全ての分散している次元dについて、配列形状のローカル化を行う(ステップS310)。
このように、このコード生成部130が、全てのテンプレートTについて、分散パラメタの設定、ループインデックスのローカル化、配列インデックスのローカル化を行うことによって、実行効率の良いコードを生成することができる。
次に、グローバルインデックスとローカルインデックスの相互変換関数について説明する。図7は、分散Dの属性を示す図である。同図に示すように、分散Dは、分散種別d、プロセッサ数P、配列の寸法N、ブロック幅w、ブロック幅配列W、分散下限値Bおよびマッピング配列Mを有する。
ブロック分散の場合、以下のすべての関数で、自プロセッサ番号がpのときの部分式p wをmyLBに置き換えてもよい。不均等ブロック分散の場合、以下のすべての関数で、自プロセッサ番号がpのときの部分式B(p)をmyLBに置き換えてもよい。ただし、myLBはそれぞれp wおよびB(p)を自プロセッサ番号pについて事前に評価した値を持つ変数とする。
gtolは、分散Dについて、グローバルインデックスIに対応するプロセッサpのローカルインデックスiを得る関数であり、図8に各分散種別dに対応するgtolの定義を示す。
ltogは、分散Dについて、プロセッサpのローカルインデックスiに対応するグローバルインデックスIを得る関数であり、図9に各分散種別dに対応するltogの定義を示す。
gtol2は、(i1,i2) = gtol2(D,I1,I2,p)の形式で用いられ、分散Dについて、グローバルインデックス区間I1:I2に対応する、プロセッサpにおけるローカルインデックス区間i1:i2のi1とi2を得る関数であり、図10−1〜図10−2に各分散種別dに対応するgtol2の定義を示す。
なお、図10−1に示したブロック分散の他の実現方法のうち最初の方法は、元の方法に比べて場合分けが多いので生成コードが大きくなり実行時の判断分岐が多くなるが、並列化した後のループの上下限値が -1以上w以下であることが保証されるので、例えば4バイト整数では表現できないような巨大ループを分割して4バイト整数で扱えるようにするなど、スケーラビリティを重視する場合に適する。
gtol3は、(i1,i2,i3) = gtol3(D,I1,I2,I3,p)の形式で用いられ、分散Dについて、グローバルインデックス三つ組I1:I2:I3に対応する、プロセッサpにおけるローカルインデックス三つ組i1:i2:i3のi1とi2とi3を得る関数であり、図11−1〜図11−3に各分散種別dに対応するgtol3の定義を示す。
なお、サイクリック分散では一般にi1,i2の値を場合分け(IF文)と式による評価(代入文)だけで生成することはできないので、動的に計算するための実行時ライブラリを用意してオブジェクトと結合するか、または、インライン展開してソースに挿入するか、または、FORTRANなどの言語で実行手続をコンパイル時に生成して、オブジェクトと結合する(特願2000−596451参照。)。
Lsize_supは、n_sup = lsize_sup(D)の形式で用いられ、分散Dの分散後の大きさのうち、プロセッサ間で最大のものと等しいか、それよりも大きな値で、できるだけ小さな値を得る関数であり、図12に各分散種別dに対応するLsize_supの定義を示す。
次に、図23−3に示した入力例1に対するコード生成部130の処理について説明する。図13−1は、図23−3に示した入力例1に対してコード生成部130が入力する内部表現のイメージを示す図である。
図13−1に示すように、トランスレータプログラム100は、内部表現に落す際に、ループの分散は配列Aの1次元目に沿って行うという判断を加え、配列の下限値とDOループの初期値は0に正規化している。なお、この正規化は必須の処理ではなく、代りにグローバルインデックス/ローカルインデックスの相互変換式に下限値の考慮を加えて修正してもよい。または、特願2003−316137に記載した発明を使うなどして正規化すればよい。
また、前処理により、Aのアクセスは3個所ともローカル、つまりプロセッサ間通信なしでアクセスできることが保証されているとする。なお、ローカルアクセスの検出は特願2003−316137に記載した発明などで可能であり、ローカルでないアクセスを並列ループ外へ出す方法は、特許第3261239号に記載された技術やその他の既存技術が使用できる。また、ここでは、HPFプログラムを入力例としたが、自動並列化コンパイラの解析結果やツールによる生成コードをコード生成部130の入力としてもよい。
[ステップS100]
プロセッサ番号pを変数myIDに格納するため、手続の入口に以下のコードを挿入する。この値にはMPIライブラリが返す仮想プロセッサ番号をそのまま使用している。
CALL mpi_comm_rank(MPI_COMM_WORLD,myID,...)
ブロック分散の他のパラメタはそれぞれ、
Figure 0004740561
と定数となるので、実行コードとしては生成しない。
〔ステップS200〕
テンプレートに整列するループはdo Iだけである。
[ステップS210]ループインデックスはI1 = 0, I2 = 999であるので、変換後の初期値i1と終値i2はブロック分散のgtol2関数よりそれぞれ以下のように計算できる。これに対応するコードをループの直前に生成する。
i1 = -250*myID for myID ≦ 0
= 0 for myID > 0
i2 = 249 for myID < 3
= 999-250*myID for myID ≧ 3
[ステップS220]ループ内でループ変数Iは3個所で引用されているが、いずれも変換を行わない条件に該当する。
〔ステップS300〕
対象変数はAだけで、分散次元は1次元目である。w = 250 であるので、Aの1次元目の形状は0:249とする。
以上の変換を施した結果を、図13−2に示す。同図で太字で示した範囲が新しく生成または置換された部分である(以下同様)。さらに定数伝播・定数畳み込みなどの既存の最適化を施すことにより、図13−3のようなコードに簡単化できる。これは図1−1で示した結果と一致する。図24−2に示した従来のコンパイラが出力するコードと比較して、配列アクセスの添字式が簡単になることが分かる。
次に、図25−1に示した入力例2に対するコード生成部130の処理について説明する。図14−1は、図25−1に示した入力例2に対応してコード生成部130が入力する内部表現のイメージを示す図である。
〔ステップS100〕
入力例1と同様、myIDにpを設定するコードを生成する。N = 1000, P = 4, w = 5である。
〔ステップS200〕
[ステップS210]I1 = 1, I2 = 998であるので、変換後の初期値i1と終値i2はブロック−サイクリック分散のgtol2関数よりそれぞれ図14−2に示すように計算できる。これに対応するコードをループの直前に生成する。pの取り得る範囲が0以上P未満であることから、i1の計算におけるp<0のケースと、i2の計算におけるp>3のケースは省略することができる。
[ステップS220]変換を行わない。
〔ステップS300〕
Figure 0004740561
であるので、Aの1次元目の形状は0:249とする。
以上の変換を施した結果を、図14−3に示す。さらに外側ループ内のIFブロックをループの外に移動する最適化を施せば、図1−2で示した結果と一致する。図25−3に示した従来のコードではDOループネストが深くなることでループ実行のコストが増加するのに対し、この例ではDOループの深さを変化させない。また、添字式も複雑にならない。
次に、図26−1に示した入力例3に対するコード生成部130の処理について説明する。図15−1は、図26−1に示した入力例3に対応してコード生成部130が入力する内部表現のイメージを示す図である。
〔ステップS100〕
入力例1と同様にmyIDにプロセッサ番号pを設定する実行コードを生成する。また、以下のコードにより、実行時にmapArray(0:11)にマッピング配列Mを設定させる。
mapArray = MAP-1
または
do I=0,11
mapArray(I) = MAP(I-1)-1
end do
ここでMAP-1とするのは、プロセッサ配列の下限値を0に正規化するためのシフトである。また、変換テーブルgtol(0:12)とltog(0:11)を宣言し、値を設定するための実行コードを以下のように生成する。
gtol(0) = 0
i = 0
do k=0,11
if (myID.EQ.mapArray(k)) then
ltog(i) = k
i = i+1
end if
gtol(k+1) = i
end do
〔ステップS200〕
DO文の初期値Mをgtol(M)に、終値Nをgtol(N+1)-1に、それぞれ置換する。ループ内で変数Iは4個所で引用されていて、うち一個所だけは変換を行わない条件に該当しないので変換する。すなわち、3番目に出現するIだけをltog(I)に置換する。
〔ステップS300〕
N=12であるので、Aの1次元目の形状は0:11とする。
以上の変換を施した結果を、図15−2に示す。これは図1−3で示した結果と一致する。図26−3で示した従来のコードでは全プロセッサが内側ループの全範囲を実行することになり並列効果が得られにくいのに対し、この例では各プロセッサが担当範囲だけの実行に縮小されている。
次に、サイクリック分散に対するコード生成部130の処理について説明する。図16−1は、コード生成部130が入力する内部表現のイメージを示す図である。
〔ステップS100〕
入力例1と同様、myIDにpを設定するコードを生成する。N = 24, P = 6である。
〔ステップS200〕
[ステップS210]I1 = 4, I2 = 20, I3 = 4であるので、変換後の初期値i1、終値i2、および増分i3はサイクリック分散のgtol3関数より以下のように計算する。
(1)t = GCD(P, |I3|) = GCD(6, 4) = 2をコンパイル時の計算で得る。
(2)図17を実現するソースコードをコンパイル時にFORTRAN外部関数として生成する。ここでは、関数名をcyclic_fとし、解なしの場合に-1を返すインタフェースとしている。
(3)cyclic_fを呼び出して戻り値を変数n_cycに代入するコードをDOループの前に生成する。
(4)n_cycの値が-1でない場合に限ってDOループが実行されるように、DOループ全体をIFブロックで囲む。
(5)DOループパラメタをそれぞれ変数k1,k2,k3に置換し、k1,k2,k3の値を求めるコードをDOループの直前に生成する。
[ステップS220]ループ内で変数kは2個所で引用されていて、うち右辺式の出現は変換を行わない条件に該当しないので変換する。すなわち、式i*j*kのkをltog関数に従い(6*k+myID)に置き換える。
〔ステップS300〕
対象変数Xの形状について、下限を0、上限を
Figure 0004740561
に置き換える。
以上の変換を施した結果を、図16−2に示す。出力コードは関数cyclic_fのソースコードを含む。別の実現方法として、関数cyclic_fは作り付けのライブラリとして事前に用意してシステムの一部とし、必要に応じて出力コードと結合するように構成してもよい。あるいは、インライン展開によって出力コード中に展開してもよい。また、この例では最大公約数を求める計算をコンパイル時に行うとしたが、関数cyclic_fと同様にソースプログラムとして生成してもよいし、インライン展開してもよいし、ライブラリとして出力コードと結合してもよい。
次に、多次元に渡る分散に対するコード生成部130の処理について説明する。図18−1は、コード生成部130が入力する内部表現のイメージを示す図である。ここでは、配列の下限値は0、配列からテンプレートへは恒等的な整列に正規化された状態から考える。また、前処理によりデータのアクセスはすべてローカルアクセスと保証されているとする。これらの正規化や前処理は、必要に応じて事前に行うことができる。
入力プログラムは、図18−2に示すようなデータ分散を表現している。すなわち、配列AとCはプロセッサ群Pに対してブロック分散されている。配列Bはその2次元目がPに対してブロック分散されている。配列Dは2次元構成のプロセッサ群P2に対して2次元ブロック分散されている。配列Rは分散されず、すべてのプロセッサにその複製が配置されている。プロセッサ群PとP2との対応はここでは同図に示すようにする。
まず、テンプレートT1に対して以下の処理を行う。
[ステップS100]
テンプレートT1に対するプロセッサ番号pを変数myID1に格納するため、手続の入口に以下のコードを挿入する。この値にはMPIライブラリが返す仮想プロセッサ番号をそのまま使用している。
CALL mpi_comm_rank(MPI_COMM_WORLD,RANK,...)
myID1=RANK
なお、T1に対する他の分散パラメタはすべて定数であり、N=30、P=4、w=8である。また、自プロセッサの分割下限値を示す式p wすなわち8*myID1の評価回数を削減するため、以下のコードを生成する。
myLB1=8*myID1
[ステップS200]
T1に整列するループはL1のみである。
[ステップS210]I1 = 1, I2 = 28であるので、変換後の初期値i1と終値i2はブロック分散のgtol2関数よりそれぞれ図18−3に示すように計算できる。この値を実行時に変数ib1,ie1を介してループの初期値と終値に設定できるように、ループL1の直前に実行されるコードを生成する。
[ステップS220]ループL1内のループ変数iの引用は図18−1に示したプログラムの14行に4箇所と16行に2箇所ある。このうち、14行の変数Bの第1添字式に出現するiと、16行の右辺に出現するiは、対象から除外する条件に該当しないので、ブロック分散のltog関数に沿って(i+myLB1)に置換する。
[ステップS300]
T1に整列する変数はA,B,Cである。そこで、Aの宣言形状に対して、T1に整列している次元の宣言の下限を0、上限をw-1すなわち定数7に変換する。Bの2次元目の宣言形状と、Cの宣言形状に対しても、同様に変換する。
図18−4に、ここまでの変換後のイメージを示す。テンプレートT1および変数A,B,Cの整列に関する情報はここで不要になる。
また、テンプレートT2に対して以下の処理を行う。
[ステップS100]
ユーザが定義する多次元プロセッサ群とプロセッサとの対応付けは、入力プログラムの言語仕様や、処理系の実装方法や、実行時ライブラリの変換仕様による。ここでは図18−5に示すような対応付けを行うとする。この場合、p1、p2は以下の式で得られる。
Figure 0004740561
そして、次元d=1について、プロセッサ番号p1を変数myID2に設定するコードを以下のように生成する。
myID2=MOD(RANK,2)
なお、他の分散パラメタは、N1=30、P1=2、w=5となる。p1 * w = 5*myID2を変数myLB2に設定する。
また、次元d=2について、プロセッサ番号p2を変数myID3に設定するコードを以下のように生成する。
myID3=RANK/2
なお、他の分散パラメタは、N2=30、P2=2、w=5となる。p2 * w = 5*myID3を変数myLB3に設定する。
[ステップS200]
まず、T2の1次元目に対して以下の処理を行う。T2の第1次元に整列するループはL2のみである。
[ステップS210]I1 = 0, I2 = jであるので、gtol2関数を用いてL2の下限ib2および上限ie2は図18−6に示すように計算できる。myID2は0以上なので、ib2の値は常に定数0となる。ここでは最適化によりそのような簡単化ができたとする。
[ステップS220]ループL2内のループ変数iの引用は図18−1に示したプログラムの26行に2箇所ある。このうち、非分散配列Rの添字に出現するiは、対象から除外する条件に該当しないので、ltog関数を用いてi+myLB2に置換する。
また、T2の2次元目に対して以下の処理を行う。T2の第2次元に整列するループはL3のみである。
[ステップS210]I1 = 1, I2 = 9, I3 = 2であるので、gtol3関数でブロック分散でI3>0のケースを用いてL3の下限ib3、上限ie3、および増分is3は図18−7に示すように計算できる。この値を実行時に変数ib3,ie3を介してループの初期値と終値に設定できるように、ループL3の直前に実行されるコードを生成する。is3は定数なので直接DO文の増分に設定する。
[ステップS220]ループL3内のループ変数jの引用は図18−1に示したプログラム26行に2箇所ある。このうち、非分散配列Rの添字に出現するjは、対象から除外する条件に該当しないので、ltog関数を用いてi+myLB3に置換する。
[ステップS300]
T2に整列している変数はDだけである。まず、Dの1次元目の下限を0、上限をw-1すなわち定数4に変換する。また、Dの2次元目の下限を0、上限をw-1すなわち定数4に変換する。
以上の手順により、最終的に出力されるコードを図18−8に示す。
次に、本実施例に係るトランスレータプログラムを実行するコンピュータシステムについて説明する。図19は、本実施例に係るトランスレータプログラムを実行するコンピュータシステムを示す図である。
同図に示すように、このコンピュータシステム200は、本体部201と、本体部201からの指示により表示画面202aに情報を表示するディスプレイ202と、このコンピュータシステム200に種々の情報を入力するためのキーボード203と、ディスプレイ202の表示画面202a上の任意の位置を指定するマウス204と、LAN206または広域エリアネットワーク(WAN)に接続するLANインタフェースと、公衆回線207に接続するモデムとを有する。ここで、LAN206は、他のコンピュータシステム(PC)211、サーバ212、プリンタ213などとコンピュータシステム200とを接続している。
また、図20は、図19に示した本体部201の構成を示す機能ブロック図である。同図に示すように、この本体部201は、CPU221と、RAM222と、ROM223と、ハードディスクドライブ(HDD)224と、CD−ROMドライブ225と、FDドライブ226と、I/Oインタフェース227と、LANインタフェース228と、モデム229とを有する。
そして、このコンピュータシステム200において実行されるトランスレータプログラムは、フロッピィディスク(FD)208、CD−ROM209、DVDディスク、光磁気ディスク、ICカードなどの可搬型記憶媒体に記憶され、これらの記憶媒体から読み出されてコンピュータシステム200にインストールされる。
あるいは、このトランスレータプログラムは、LANインタフェース228を介して接続されたサーバ212のデータベース、他のコンピュータシステム(PC)211のデータベースなどに記憶され、これらのデータベースから読み出されてコンピュータシステム200にインストールされる。
そして、インストールされたトランスレータプログラムは、HDD224に記憶され、RAM222、ROM223などを利用してCPU221により実行される。
上述してきたように、本実施例では、分散パラメタ設定部131が分散に関するプロセッサ毎のパラメタを設定するコードを生成し、ループインデックスローカル化部132がループのインデックスのローカル化を行い、配列形状ローカル化部133が分散配列のローカル化を行うこととしたので、添字式でインデックス変換を避けることができ、インデックス変換に起因するオーバーヘッドを削減することができる。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムは、ループ上下限の式が簡単になり、プロセッサ番号に依存しない式や、定数にできることも多い。それにより、上下限値がコンパイル時に確定するため、一般的な最適化が促進される。また、並列ループの外側に逐次ループがある場合でも、ループ交換、ループ合体(loop coalescing)などの最適化が行いやすい。さらに、ループのコストがコンパイル時に見積もりやすい。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムは、並列ループ入口でのコストが非常に小さい。したがって、内側のループで並列化しても性能低下が小さいので、アプリケーションプログラムの自由度が大きくなる。従来は、並列ループは入口でコストが高いので、ループの並列化は最外ループで行うのがよいとされていた。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムは、ループ/配列のインデックスのローカル化により、扱うインデックスの絶対値を小さく抑えられる。したがって、32ビット整数ではインデックスが表現できないような巨大配列や巨大ループでも、並列化によって32ビットでも扱えるようになる。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムでは、配列割付けは連続領域に圧縮できる。したがって、メモリ領域を節約することができる。また、アクセス範囲が局所化されるため、キャッシュ効率が向上する。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムでは、ループはマスクなし一重にできる。すなわち、ブロック−サイクリック分散では従来2重化していたが、ループに増分がなければ効率よく一重化できる。また、増分ありでもマスク付きで一重化できる。不規則分散は、従来マスク付きアクセスでしか実装できなかったが、ループに増分がなければ効率よく一重化できる。
また、本実施例に係るトランスレータプログラム100によって生成されるプログラムでは、分散配列の手続間受渡しが自然であり、実引数と仮引数の次元数/形状不整合にも自然な対応が可能である。
また、本実施例では、FORTRANを基本とする並列プログラミング言語の場合について説明したが、本発明はこれに限定されるものではなく、例えばCなどの他のプログラミング言語を基本とする並列プログラミング言語の場合にも同様に適用することができる。
(付記1)並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータプログラムであって、
分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定手順と、
前記分散パラメタ設定手順により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化手順と、
をコンピュータに実行させることを特徴とするトランスレータプログラム。
(付記2)前記インデックスローカル化手順は、ループパラメタをローカル化するループパラメタローカル化手順と、ループ変数をグローバルインデックスに変換するループ変数変換手順をコンピュータに実行させることによってループインデックスをローカル化するコードを生成することを特徴とする付記1に記載のトランスレータプログラム。
(付記3)前記並列言語プログラムには、分散種別として不均等ブロック分散および不規則分散を指定可能であることを特徴とする付記1または2に記載のトランスレータプログラム。
(付記4)前記並列言語プログラムには、分散種別としてブロック分散、サイクリック分散およびブロック−サイクリック不均をさらに指定可能であることを特徴とする付記3に記載のトランスレータプログラム。
(付記5)前記並列言語プログラムは、FORTRANを基本とする並列プログラミング言語を用いて作成されたプログラムであることを特徴とする付記1または2に記載のトランスレータプログラム。
(付記6)前記分散パラメタ設定手順は、各手続きの入り口に分散パラメタに値を設定するコードを生成することを特徴とする付記1または2に記載のトランスレータプログラム。
(付記7)前記ループパラメタローカル化手順は、ループの初期値および終値をローカルインデックスに変換することを特徴とする付記2に記載のトランスレータプログラム。
(付記8)並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータプログラムを記録したコンピュータ読み取り可能な記録媒体であって、
分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定手順と、
前記分散パラメタ設定手順により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化手順と、
をコンピュータに実行させるトランスレータプログラムを記録したことを特徴とするコンピュータ読み取り可能な記録媒体。
(付記9)並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するプログラム変換方法であって、
分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定工程と、
前記分散パラメタ設定工程により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化工程と、
を含んだことを特徴とするプログラム変換方法。
(付記10)並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータ装置であって、
分散に関するパラメタである分散パラメタに値を設定するコードを生成する分散パラメタ設定手段と、
前記分散パラメタ設定手段により生成されたコードにより値が設定される分散パラメタを用いてループインデックスおよび配列インデックスをローカル化するコードを生成するインデックスローカル化手段と、
を備えたことを特徴とするトランスレータ装置。
以上のように、本発明に係るトランスレータプログラム、プログラム変換方法およびトランスレータ装置は、並列言語プログラムのコンパイラに有用であり、特に、並列言語プログラムが分散メモリ型計算機により分散処理される場合に適している。
本実施例に係るプログラム変換による並列化の例(1)を示す図である。 本実施例に係るプログラム変換による並列化の例(2)を示す図である。 本実施例に係るプログラム変換による並列化の例(3)を示す図である。 本実施例に係るトランスレータプログラムの構成を示す機能構成図である。 グローバルインデックスからローカルインデックスを求める漸化式を示す図である。 ループパラメタローカル化部が生成するコードを示す図である。 ループパラメタに増分が存在しない場合に、ループパラメタローカル化部が生成するコードを示す図である。 不規則分散の場合に、ループパラメタローカル化部が生成するコードを示す図である。 増分を消し去るループ変換を示す図である。 コード生成部の処理手順を示す流れ図である。 分散Dの属性を示す図である。 gtolの定義を示す図である。 ltogの定義を示す図である。 gtol2の定義を示す図(1)である。 gtol2の定義を示す図(2)である。 gtol3の定義を示す図(1)である。 gtol3の定義を示す図(2)である。 gtol3の定義を示す図(3)である。 Lsize_supの定義を示す図である。 図23−3に示した入力例1に対してコード生成部が入力する内部表現のイメージを示す図である。 入力例1の変換後のプログラムを示す図である。 汎用最適化後のプログラムを示す図である。 図25−1に示した入力例2に対してコード生成部が入力する内部表現のイメージを示す図である。 初期値i1と終値i2を計算する式を示す図である。 入力例2の変換後のプログラムを示す図である。 図26−1に示した入力例3に対してコード生成部が入力する内部表現のイメージを示す図である。 入力例3の変換後のプログラムを示す図である。 入力例4に対してコード生成部が入力する内部表現のイメージを示す図である。 入力例4の変換後のプログラムを示す図である。 サイクリック分散の計算式のnを求める処理手順を示すフローチャートである。 入力例5に対してコード生成部が入力する内部表現のイメージを示す図である。 指定されたデータ分散を示す図である。 ループパラメタの値を示す図である。 変換の途中結果を示す図である。 多次元プロセッサ群とプロセッサとの対応付けを示す図である。 ループパラメタの値を示す図である。 ループパラメタの値を示す図である。 入力例5の変換後のプログラムを示す図である。 本実施例に係るトランスレータプログラムを実行するコンピュータシステムを示す図である。 図19に示した本体部の構成を示す機能ブロック図である。 データの分散を示す図である。 ループの分散を示す図である。 インデックス分割による分散の種類を示す図である。 逐次プログラムを示す図である。 OpenMPによる並列化を示す図である。 HPFによる並列化(入力例1)を示す図である。 データおよびループのインデックス分割とプロセッサとの対応を示す図である。 図23−3に示した並列言語プログラムに対して従来のコンパイラが出力するコードを示す図である。 ブロック−サイクリック分散を用いる並列言語プログラムの例を示す図である。 グローバルインデックスとローカルインデックスの対応を示す図である。 図25−1に示した並列言語プログラムに対して生成される従来のコードを示す図である。 不規則分散を用いる並列言語プログラムの例を示す図である。 グローバルインデックスとローカルインデックスの対応を示す図である。 図26−1に示した並列言語プログラムに対して生成される従来のコードを示す図である。 数学記号の定義を示す図である。
符号の説明
10 FORTRANコンパイラ
100 トランスレータプログラム
110 並列言語パーサ
120 最適化・正規化処理部
130 コード生成部
131 分散パラメタ設定部
132 ループインデックスローカル化部
132a ループパラメタローカル化部
132b ループ変数変換部
133 配列形状ローカル化部
200,211 コンピュータシステム
201 本体部
202 ディスプレイ
202a 表示画面
203 キーボード
204 マウス
206 LAN
207 公衆回線
208 フロッピィディスク
209 CD−ROM
212 サーバ
213 プリンタ
221 CPU
222 RAM
223 ROM
224 ハードディスクドライブ
225 CD−ROMドライブ
226 フロッピィディスクドライブ
227 I/Oインタフェース
228 LANインタフェース
229 モデム

Claims (5)

  1. コンピュータに、並列言語プログラムを解析させ、複数のプロセッサで分散処理される逐次言語プログラムに変換させるトランスレータプログラムであって、
    分散に関するパラメタである、分散種別を含む分散パラメタに値を設定するコードを生成する分散パラメタ設定手順と、
    複数のプロセッサで共通して使用されるグローバルインデックスとローカルインデックスとを相互に変換する計算式を分散種別毎に記憶する記憶部から、前記分散パラメタ設定手順により生成されたコードにより値が設定される分散パラメタに対応した計算式を参照し、該参照した計算式および当該分散パラメタを用いて、ループで使用されるインデックスの範囲を示すループインデックスおよびループ内の配列で使用されるインデックスを示す配列インデックスについて、分散処理するプロセッサ内でローカル化処理を実行した結果として表されるコードを生成するインデックスローカル化手順と、
    をコンピュータに実行させることを特徴とするトランスレータプログラム。
  2. 前記インデックスローカル化手順は、前記ループインデックスが示す初期値および終値を含むループパラメタをローカル化するループパラメタローカル化手順と、ループ内で引用される変数を示すループ変数をグローバルインデックスに変換するループ変数変換手順をコンピュータに実行させることによってループインデックスについて、ローカル化処理を実行した結果として表されるコードを生成することを特徴とする請求項1に記載のトランスレータプログラム。
  3. 前記並列言語プログラムには、分散種別として不均等ブロック分散および不規則分散を指定可能であることを特徴とする請求項1または2に記載のトランスレータプログラム。
  4. コンピュータが、並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するプログラム変換方法であって、
    分散に関するパラメタである、分散種別を含む分散パラメタに値を設定するコードを生成する分散パラメタ設定工程と、
    複数のプロセッサで共通して使用されるグローバルインデックスとローカルインデックスとを相互に変換する計算式を分散種別毎に記憶する記憶部から、前記分散パラメタ設定工程により生成されたコードにより値が設定される分散パラメタに対応した計算式を参照し、該参照した計算式および当該分散パラメタを用いて、ループで使用されるインデックスの範囲を示すループインデックスおよびループ内の配列で使用されるインデックスを示す配列インデックスについて、分散処理するプロセッサ内でローカル化処理を実行した結果として表されるコードを生成するインデックスローカル化工程と、
    を含んだことを特徴とするプログラム変換方法。
  5. 並列言語プログラムを解析し、複数のプロセッサで分散処理される逐次言語プログラムに変換するトランスレータ装置であって、
    分散に関するパラメタである、分散種別を含む分散パラメタに値を設定するコードを生成する分散パラメタ設定手段と、
    複数のプロセッサで共通して使用されるグローバルインデックスとローカルインデックスとを相互に変換する計算式を分散種別毎に記憶する記憶部から、前記分散パラメタ設定手段により生成されたコードにより値が設定される分散パラメタに対応した計算式を参照し、該参照した計算式および当該分散パラメタを用いて、ループで使用されるインデックスの範囲を示すループインデックスおよびループ内の配列で使用されるインデックスを示す配列インデックスについて、分散処理するプロセッサ内でローカル化処理を実行した結果として表されるコードを生成するインデックスローカル化手段と、
    を備えたことを特徴とするトランスレータ装置。
JP2004203063A 2004-07-09 2004-07-09 トランスレータプログラム、プログラム変換方法およびトランスレータ装置 Expired - Fee Related JP4740561B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2004203063A JP4740561B2 (ja) 2004-07-09 2004-07-09 トランスレータプログラム、プログラム変換方法およびトランスレータ装置
US10/992,353 US7555745B2 (en) 2004-07-09 2004-11-18 Program and apparatus for translating language, and program converting method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2004203063A JP4740561B2 (ja) 2004-07-09 2004-07-09 トランスレータプログラム、プログラム変換方法およびトランスレータ装置

Publications (2)

Publication Number Publication Date
JP2006024088A JP2006024088A (ja) 2006-01-26
JP4740561B2 true JP4740561B2 (ja) 2011-08-03

Family

ID=35542781

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2004203063A Expired - Fee Related JP4740561B2 (ja) 2004-07-09 2004-07-09 トランスレータプログラム、プログラム変換方法およびトランスレータ装置

Country Status (2)

Country Link
US (1) US7555745B2 (ja)
JP (1) JP4740561B2 (ja)

Families Citing this family (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8104030B2 (en) * 2005-12-21 2012-01-24 International Business Machines Corporation Mechanism to restrict parallelization of loops
US8443351B2 (en) * 2006-02-23 2013-05-14 Microsoft Corporation Parallel loops in a workflow
EP2050002A2 (en) * 2006-08-01 2009-04-22 Massachusetts Institute of Technology Extreme virtual memory
US7921416B2 (en) * 2006-10-20 2011-04-05 Yahoo! Inc. Formal language and translator for parallel processing of data
US8255890B2 (en) * 2007-02-14 2012-08-28 The Mathworks, Inc. Media for performing parallel processing of distributed arrays
US20090037690A1 (en) * 2007-08-03 2009-02-05 Nema Labs Ab Dynamic Pointer Disambiguation
WO2009037731A1 (ja) * 2007-09-21 2009-03-26 Fujitsu Limited 翻訳装置と翻訳方法および翻訳プログラムとプロセッサコアの制御方法およびプロセッサ
EP2257873A4 (en) * 2008-02-12 2013-05-15 Scrutiny Inc SYSTEMS AND METHODS FOR ANALYZING INFORMATION FLOWS
US8776030B2 (en) * 2008-04-09 2014-07-08 Nvidia Corporation Partitioning CUDA code for execution by a general purpose processor
US8645933B2 (en) * 2008-08-01 2014-02-04 Leon Schwartz Method and apparatus for detection and optimization of presumably parallel program regions
US20100037214A1 (en) * 2008-08-11 2010-02-11 International Business Machines Corporation Method and system for mpi_wait sinking for better computation-communication overlap in mpi applications
US20110010690A1 (en) * 2009-07-07 2011-01-13 Howard Robert S System and Method of Automatically Transforming Serial Streaming Programs Into Parallel Streaming Programs
JP5148674B2 (ja) * 2010-09-27 2013-02-20 株式会社東芝 プログラム並列化装置およびプログラム
US20130055224A1 (en) * 2011-08-25 2013-02-28 Nec Laboratories America, Inc. Optimizing compiler for improving application performance on many-core coprocessors
JP6171658B2 (ja) 2013-07-19 2017-08-02 富士通株式会社 並列処理最適化プログラム、並列処理最適化方法および情報処理装置

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3208870B2 (ja) * 1992-10-30 2001-09-17 株式会社日立製作所 データ分割パタンの評価方法
JPH08221276A (ja) * 1995-02-16 1996-08-30 Hitachi Ltd コンパイラ
JPH08255086A (ja) * 1995-03-16 1996-10-01 Toshiba Corp オブジェクトコード生成方式
US6339840B1 (en) * 1997-06-02 2002-01-15 Iowa State University Research Foundation, Inc. Apparatus and method for parallelizing legacy computer code
JP3395646B2 (ja) * 1998-03-31 2003-04-14 日本電気株式会社 プログラム並列化装置及び並列化用プログラムを記録した記録媒体
US6106575A (en) * 1998-05-13 2000-08-22 Microsoft Corporation Nested parallel language preprocessor for converting parallel language programs into sequential code

Also Published As

Publication number Publication date
US20060010432A1 (en) 2006-01-12
JP2006024088A (ja) 2006-01-26
US7555745B2 (en) 2009-06-30

Similar Documents

Publication Publication Date Title
Elango et al. Diesel: DSL for linear algebra and neural net computations on GPUs
Sarkar Automatic partitioning of a program dependence graph into parallel tasks
Phothilimthana et al. Chlorophyll: Synthesis-aided compiler for low-power spatial architectures
JP4740561B2 (ja) トランスレータプログラム、プログラム変換方法およびトランスレータ装置
Kennedy et al. Automatic data layout for distributed-memory machines
Shin et al. Speeding up nek5000 with autotuning and specialization
Mendonça et al. DawnCC: automatic annotation for data parallelism and offloading
Gareev et al. High-performance generalized tensor operations: A compiler-oriented approach
KR101740093B1 (ko) 타일 통신 연산자
Arabnejad et al. Source-to-source compilation targeting OpenMP-based automatic parallelization of C applications
Ittah et al. QIRO: A static single assignment-based quantum program representation for optimization
Johnson et al. Automatic parallel code generation for message passing on distributed memory systems
Kataev et al. The experience of using DVM and SAPFOR systems in semi automatic parallelization of an application for 3D modeling in geophysics
Moses et al. Polygeist: Affine c in mlir
Su et al. Processor Tagged Descriptors: A Data Structure for Compiling for Distributed-Memory Multicomputers.
Palermo Compiler techniques for optimizing communication and data distribution for distributed-memory multicomputers
Hornung et al. A case for improved C++ compiler support to enable performance portability in large physics simulation codes
Belyaev et al. LuNA-ICLU compiler for automated generation of iterative fragmented programs
Becker et al. From scilab to high performance embedded multicore systems: The alma approach
Rodrigues et al. GPU support for automatic generation of finite-differences Stencil Kernels
Clement et al. Automatic Port to OpenACC/OpenMP for Physical Parameterization in Climate and Weather Code Using the CLAW Compiler
US11656857B2 (en) Method and apparatus for optimizing code for field programmable gate arrays
Ejjaaouani et al. InKS: a programming model to decouple algorithm from optimization in HPC codes
Liang et al. The Support of MLIR HLS Adaptor for LLVM IR
Li Mc2For: a MATLAB to Fortran 95 complier

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20070703

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20100225

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20100914

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20101112

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

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20110502

R150 Certificate of patent or registration of utility model

Ref document number: 4740561

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

Free format text: JAPANESE INTERMEDIATE CODE: R150

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20140513

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees