JP2794523B2 - アレイ関数をもつプログラミング言語におけるインライン展開方法 - Google Patents

アレイ関数をもつプログラミング言語におけるインライン展開方法

Info

Publication number
JP2794523B2
JP2794523B2 JP5296269A JP29626993A JP2794523B2 JP 2794523 B2 JP2794523 B2 JP 2794523B2 JP 5296269 A JP5296269 A JP 5296269A JP 29626993 A JP29626993 A JP 29626993A JP 2794523 B2 JP2794523 B2 JP 2794523B2
Authority
JP
Japan
Prior art keywords
array
function
built
template
virtual
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
JP5296269A
Other languages
English (en)
Other versions
JPH07152576A (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.)
NIPPON AI BII EMU KK
Original Assignee
NIPPON AI BII EMU KK
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 NIPPON AI BII EMU KK filed Critical NIPPON AI BII EMU KK
Priority to JP5296269A priority Critical patent/JP2794523B2/ja
Priority to US08/344,423 priority patent/US5640568A/en
Publication of JPH07152576A publication Critical patent/JPH07152576A/ja
Application granted granted Critical
Publication of JP2794523B2 publication Critical patent/JP2794523B2/ja
Anticipated expiration legal-status Critical
Expired - Lifetime legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/423Preprocessors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】この発明は、一般的にはコンパイ
ラの最適化方法に関し、より詳しくは、APL、FOR
TRAN90などのような、アレイ操作関数を有するプ
ログラミング言語におけるインライン展開方法に関す
る。
【0002】
【従来の技術】一般的なプログラミング言語は、操作対
照がスカラ変数であろうと、配列や構造体であろうと、
それらの要素のデータ(単一な値を持つ)を操作するこ
とによって記述される。これに対し、APLやFORT
RAN90などでは、配列の1要素だけでなく、配列全
体の操作を記述することができる。以下にFORTRA
N90におけるスカラによる表現、及びそれと同一のア
レイ表現を示す。
【0003】スカラ表現による配列の処理
【数1】
【0004】アレイ表現による配列の処理
【数2】A(10:90) = B(11:91)
【0005】このアレイ表現を用いることの利点は、以
下の2点である。 ・操作を簡略かつ論理的に記述することができる。 ・処理の持つ並列性を自然に記述することができる。
【0006】前者の利点によって、プログラムの記述お
よび解読が容易になる。さらに、後者の利点によって、
ベクトル計算機や、並列計算機のように、並列処理が可
能な計算機にとって、プログラムをより並列化する機会
を与えるものである。
【0007】一般的な並列処理の機能を持っていないス
カラ・プロセッサでは、並列化のメリットは得られな
い。さらに、スカラ処理のためにプログラムの変換を行
わないと効率が悪くなる場合がある。このアレイ表現で
記述されたプログラムをスカラ・プロセッサで効率的に
なるよう変換することをスカラー化(Scalarize)と呼
ぶ。
【0008】スカラー化の最適化は以下のように分類さ
れる。 (1)組み込み関数(Intrinsic Functions)のインラ
イン展開 (2)アレイ・テンポラリの削減 (3)ループの効率化
【0009】(1)の組み込み関数のインライン展開
は、既存のコンパイラでも行われている最適化であり、
サブルーチンを呼ぶ代わりにインライン展開されたコー
ドを実行することで高速化を図るものである。
【0010】(2)アレイ・テンポラリの削減に関し
て、アレイ表現を単純にスカラライズすると、式の右辺
のアレイ値を記憶しておくためのアレイ・テンポラリが
必要になる。依存性を解析して、ループを反転させるこ
とによって、このアレイ・テンポラリを削減することが
可能となる。その例を以下に示す。
【0011】もとのアレイ表現
【数3】A(10:90) = A(1:81) - B(10:90)
【0012】単純にスカラー化されたコード
【数4】 DO I=10,90 T(I) = A(I-9) - B(I) ここでアレイ・テンポラリに代入 END DO DO I=10,90 A(I) = T(I) 本来のアレイに代入 END DO
【0013】ループ反転によるアレイ・テンポラリの削
【数5】
【0014】(3)のループの効率化は複数のアレイ表
現を1つのループで実行することによって、ループのオ
ーバーヘッドを削減するものである。
【0015】これらの3つの最適化のうちもっとも効果
の高いのが、組み込み関数のインライン展開である。通
常の組み込み関数に加えてFORTRAN90などのア
レイ表現をサポートする言語では、組み込み変換関数
(Transformational Intrinsic Functions:TIF)や
組み込み簡約関数 (Reduction Intrinsic Functions:
RIF)などのインライン展開が必要である。TIFは
シフト、回転、転置、拡大、マージ、パックなどのアレ
イの変換を行うものであり、RIFはアレイを入力とし
て合計、最大、最少、カウントなどのスカラ値を返すも
のである。以下に、組み込み関数のインライン展開の例
を示す。
【0016】このプログラムはまず、配列Bを3次元方
向に拡張し、10×100×200の配列を生成する。
また、配列Cを2次元方向に拡張し、同じサイズの3次
元配列を生成する。これらの加算を求め、それを1次元
方向に合計を求め2次元配列(サイズは100×200
となる)を生成し、配列Aに代入する。
【0017】このプログラムを単純に変換すると、3つ
の3次元のテンポラリ配列が必要となる。一般に、1つ
の組み込み関数に対して、1つのアレイ・テンポラリが
必要なくなるからである。一方、最適にインライン展開
されたプログラムでは、これらのテンポラリがまったく
必要なくなるため、メモリの使用量が劇的に少なくな
る。さらに、非常に多くのデータの複写が削減されるた
め、かなりの高速化が見込まれる。
【0018】ソースプログラム:
【数6】 A(1:100,1:200) = SUM( SPREAD( B(1:10,1:100), 3, 200 ) + SPREAD( C(1:10,1:200), 2, 100 ), 1 )
【0019】単純に変換したプログラム:
【数7】 T1(1:10,1:100,1:200) = SPREAD( B(1:10,1:100), 3, 200 ) T2(1:10,1:100,1:200) = SPREAD( C(1:10,1:200), 2, 100 ) T3(1:10,1:100,1:200) = T1(1:10,1:100,1:200) + T2(1:10,1:100,1:200) A(1:100,1:200) = SUM( T2(1:10, 1:100, 1:200), 1 )
【0020】最適にインライン変換されたプログラム:
【数8】
【0021】このように、最適にインライン変換できる
場合には、アレイ・テンポラリ(数7におけるT1
2、T3、T4)が必要でなくなるために、そのための
メモリ領域を確保する必要はない。従って、システムの
メモリ・リソースを有効に活用できる。なお、SUM、SPR
EADは、FORTRAN90の組み込み関数であり、次
のような意味をもつ。
【0022】先ず、SPREADは、SPREAD( SOURCE, DIM, N
COPIES ) という形式であり、SOURCEで指定された配列
のDIM次元のNCOPYの分だけコピーして、次元拡張した配
列を作るものである。例えば、上記の例で、T1(1:10,1:
100,1:200) = SPREAD( B(1:10,1:100), 3, 200 )という
式は、B(1:10,1:100)という配列の第3の次元を拡張し
て200個のコピーを行い、T1(1:10,1:100,1:200)とい
う配列を作るものであるが、その結果、i=1〜10,j=1〜1
00,k=1〜200の範囲で、T1(i,j,k)は、B(i,j)と同じ値を
もつことになる。一方、T2(1:10,1:100,1:200) = SPREA
D( C(1:10,1:200), 2, 100 )という式は、C(1:10,1:20
0)という配列の第2の次元を拡張して100個のコピー
を行い、T2(1:10,1:100,1:200)という配列を作るもので
あるが、その結果、i=1〜10,j=1〜100,k=1〜200の範囲
で、T1(i,j,k)は、C(i,k)と同じ値をもつことになる。
【0023】次に、SUMは、SUM( ARRAY, DIM, MASK )
という形式であり、ターゲットのARRAYのDIMで指定され
た次元のMASKが真になった要素の合計を求め、次元縮小
した配列を生成する。DIM, MASKは、オプションであ
り、何も指定しないと、ARRAY全体の要素の和を求め、
スカラの値を返す。例えば、上記の例で、A(1:100,1:20
0)= SUM( T2(1:10, 1:100, 1:200), 1 )は、配列 T2(1:
10, 1:100, 1:200)の1次元目の要素を合計し、その結
果、i=1〜100,j=1〜200の範囲で、A(i,j)には、T2(1,i,
j)+T2(2,i,j)+ … +T2(10,i,j)の値が格納される。
【0024】ところで、これまでのインライン展開はイ
デオム認識(パターンマッチ)によるものがほとんどで
あった。この方式は、マッチング・テンプレートとその
展開型をそれぞれ用意し、テンプレートにマッチするも
のをその展開型で置換するものである。
【0025】このパターンマッチ方式の欠点は、パター
ンとして登録パターンに登録されていないような記述
や、登録されているパターンを複合して記述するような
ものに対してインライン展開されたコードを生成できな
い点である。すべてTIFや配列に対する演算の組み合
わせをパターンとしてを登録しておくことは不可能で
あ。従って、現実的には、複雑な表現に対しては、従来
の技術では対応できない。
【0026】このように、インライン展開されたコード
を生成できない場合、組み込み関数毎にアレイ・テンポ
ラリを用意する必要があり、そのためにメモリ領域を確
保する必要がある。アレイ・テンポラリが、2次元配
列、3次元配列となるに従い、必要となるメモリ領域が
飛躍的に増大するるため、システムのメモリ・リソース
を効率的に活用することが困難である。
【0027】これをある程度緩和するためにマクロ展開
方式がある。これは、マッチング・テンプレートの記述
に柔軟性を持たせ、かつ、展開型をプログラムによって
指定できる。この方式では、単純なパターンマッチによ
るものより、強力な記述が行なえるけれども、本質的な
問題点、すなわち、すべでのパターンを用意しなければ
ならないことを解決してはいない。
【0028】特公昭63−19908号公報は、スカラ
配列化による並列処理化処理方式、特に、複数の並列演
算部を備えたベクトル処理プロセッサに対して、与えら
れたソース・プログラムから目的プログラムを生成する
コンパイラにおいて、単純変数をもつループに関して、
その単純変数についてループの入口と出口とにおけるビ
ジー状態を調べて分類を行い、その分類に基づいてそれ
ぞれの並列処理化のための処理を行うようにした、スカ
ラ配列化による並列化処理方式を開示する。しかし、こ
の刊行物には、配列演算の展開自体については、何も記
載されていない。
【0029】
【発明が解決しようとする課題】この発明の目的は、組
み込み配列操作関数や配列演算の複合した様々な式に対
して、個別のテンプレートあるいはマクロを用意するこ
となく、汎用的に適用可能なインライン展開方法を提供
することにある。また、本発明の別の目的は、システム
のメモリ・リソースを有効に活用することである。
【0030】
【課題を解決するための手段】本発明は、TIF等のア
レイ表現を有する組み込み関数をテンプレートマッチン
グやマクロ処理による置換でなく、コンパイラが用意し
ている特徴的な変換規則によって、組み込み関数の意味
を保持しながら、統一的に処理する手法を提供する。こ
の技法によれば、統一的に処理するため、いかなるTI
F、RIFや配列演算の複合した式であっても、最適な
インライン展開が可能ならしめられる。また、本発明で
は、組み込み関数を仮想配列に変換して、インライン展
開するので、アレイ・テンポラリを用いる必要がなくな
る。
【0031】本発明では、TIFなどのアレイ表現され
た組み込み関数の式をインライン展開としてコンパイル
するために、ソース・コード中に存在するTIFの式全
体を組み込み関数ごとに仮想配列に置き換えて表現す
る。この置き換えられた仮想配列は、インライン展開後
に実配列へ置き換える必要があるので、テンプレートと
して以下の情報を有している。
【0032】・仮想的な次元数及び各インデックスの範
囲 インライン展開されるTIF式全体の結果となるテンポ
ラリ配列の次元数とインックスの範囲を記述する。
【0033】・仮想的な配列及びインデックスと実際の
配列及びインデックスのマッピング 仮想配列が実際の配列のどのような式で実現されるかを
記述する。
【0034】・仮想配列の表現式(ソースプログラム情
報) ソースプログラムにおけるTIF式の情報であり、イン
ライン展開ができない場合この情報によりTIFに対応
するサブルーチンを呼び出すように変換される。
【0035】TIFをインライン展開する手順は以下の
ようになる。 (1) ソース・プログラム中のTIFを仮想配列で表現
し、コンパイラに予め用意されている生成規則に従い、
これを実配列に変換するためのテンプレートを生成す
る。 (2) 仮想配列で表現されたTIPままインライン展開す
る。 (3) テンプレートに従い、仮想配列を実際の配列に逆変
換する。 まず最初に実行されるのが、(1)のTIFの仮想配列化
である。この際に、TIFをマクロ拡張し、実配列への
マッピングを生成する。
【0036】ユーザの記述全体をマクロ処理によってイ
ンライン展開する従来の方法と、本発明の方法が用いて
いるマクロ処理が決定的に異なっているのは、これまで
の方法が、あらかじめ様々なTIFを組み合わせた、テ
ンプレートを用意するのに対し、本発明の方法では、上
記の様々なTIPの組み合わせにマッチするようなテン
プレートを予め用意しておく必要はない。本発明では、
コンパイル時に、単一の組み込み関数をある仮想配列で
表現し、以下の述べるような変換規則に従って、それの
テンプレートを生成する。このテンプレートは、仮想配
列を実配列へ変換するためのマッピングであり、これを
生成する際にマクロ処理を用いる。本方式では、TIF
ごとに1つの変換規則を用意し、これによりTIFごと
のテンプレートを生成するだけで、任意の組み合わせの
TIF式に関するテンプレートを生成することができ
る。従って、複雑な組み込み関数を有する式に関しても
インライン展開できる。
【0037】次に示す式は、仮想配列による SPREAD 関
数の単純な場合の変換例を示す。ここで $1 は仮想配列
の名前である。実配列へのマッピングの右側の式 A($$
1) はコンパイル時に変換規則に従って生成されたテン
プレートである。
【数9】 X(1:100,1:10) = SPREAD( A(1:100), 2 , 10 ) X(1:100,1:10) = $1(1:100, 1:10) (仮想配列の名前とサイズ) [ $1($$1,$$2) -> A($$1) ] (実配列へのマッピング) [ SPREAD( A(1:100), 2, 10 ) ](ソースプログラム)
【0038】次に、(2)の仮想配列のままのインライン
展開を行なう。仮想配列を単純な配列と見なして、実際
のループコードを生成する。このフェーズにおいてRI
Fや配列演算子などはインライン展開される。次の式
は、上記式のプログラムを仮想配列のままインライン展
開したものである。
【数10】
【0039】最後に、(1) の段階で生成したテンプレー
トを用いて、インライン展開されたコードに含まれる仮
想配列を、実際の配列に対するマッピングに変換する。
図6のマクロ展開に示されるように、仮想配列は実際の
配列Aへのアクセスに展開される。さらに、全体のプロ
グラムは以下のようになる。
【0040】マクロ展開:
【数11】$1(I1,I2) -> A(I1)
【0041】インライン展開の結果:
【数12】
【0042】
【実施例】以下、プログラミング言語としてFORTR
AN90を使用するものとして説明を行う。尚、FOR
TRAN90自体のより詳しい仕様については、Jeanne
C. Adams et al. "FORTRAN90 HANDBOOK Complete ANS
I/ISO Reference", McGrawHill Inc.などに記載されて
いる。本発明の原理 1.仮想配列 先ず、ソース・コード中に存在する1つの組み込み関数
をある1つの仮想配列で置換する。従って、複数の組み
込み関数が複雑に組み合わさった組み込み関数は、複数
の仮想配列で表現されることになる。置換される仮想配
列は、その次元、及び配列の開始及び終了の数(インデ
ックス値)に関する情報を有する必要がある。これらは
以下の変換規則により決定され、テンプレートとなる。
【0043】仮想配列の次元およびそのインデックスの
値は、アレイ関数の動作と引数となっている配列によっ
て決定する。実際には、関数1つずつに仮想配列を生成
するプログラムを作成する必要がある。この機能は、 ・仮想配列の次元の決定 ・仮想配列と実配列のインデックスの対応 ・インデックスの正規化 の3つである。
【0044】例えば、SPREAD 関数は、次に示すよう
に、1次元だけ、次元拡張するため、引数の配列の次元
に1を足したものが仮想配列の次元となる。
【数13】SPREAD( A(100:200), 2 , 10 )
【0045】また、次元対応は、拡張される次元だけを
考慮すればよく、この拡張される次元が変数であった場
合は、このプログラムのインライン展開に失敗するの
で、インライン展開は行わない。その場合は、通常の関
数呼び出しが行われることになる。定数である場合は簡
単で、インライン展開が行われる。拡張次元までは、引
数のままであり、拡張次元以降は1加えたものとなる。
【0046】この例の SPREAD 関数の引数は1次元配列
なので、仮想配列の次元は2となる。また、各次元のイ
ンデックスは、1を開始値とするように正規化するた
め、 1次元目は 1:100 2次元目は 1:10 である。
【0047】このインデックスの正規化は、必ずしも必
要でないが、入れ子になった複雑なアレイ関数をループ
にまとめる際に、正規化しておいた方が効率的である。
【0048】2.テンプレートの生成 ソース・コード中に存在するアレイ表現された組み込み
関数が入れ子構造のような組み合わせである場合、入れ
子構造を形成するそれぞれの組み込み関数に関する変換
規則を、入れ子になったアレイ関数の内側から適用する
ことで、目的とするテンプレートを生成する。まず、も
っとも内側の仮想配列とテンプレートが生成される。次
により外側のテンプレートが生成される。この際に、外
側のテンプレートを内側のテンプレートを用いて合成す
る。この合成を外側に向かって、テンプレートを再帰的
に適用していくことによって、どのような入れ子構造の
組み込み関数のテンプレートでも、生成可能となる。
【0049】ソース・コード中に存在するアレイ表現さ
れた組み込み関数が入れ子になっていなければ、これは
1つの仮想配列に置換され、仮想配列を実配列にマッピ
ングしたものがそのままテンプレートとなる。ここで
は、アレイ関数 MERGE を用いて、マクロ・テンプレー
トの生成の例を説明する。因に、MERGE の定義は、次の
とおりである。
【数14】 MERGE( TSOURCE, ISOURCE, MASK )
【0050】すなわち、2つの配列TSOURCE、ISOURCEを
マージして1つの配列を生成する。要素の値は対応する
MASK が真なら TSOURCE の要素の値となり、偽なら ISO
URCEの値となる。
【数15】 X(201:300) = MERGE( MERGE( A(1:100), B(1:100), M1(1:100)), MERGE( C(2:101), D(0:99), M2(3:102), M3(1:100) )
【0051】このプログラムに対して、まずもっとも内
側の MERGE 関数
【数16】MERGE( A(1:100), B(1:100), M1(1:100) )
【0052】に対して、テンプレートが生成される。こ
のような生成規則は、個別のアレイ関数毎に、予め用意
しておく必要がある。
【数17】
【0053】となる。これは、MERGE 関数のテンプレー
ト生成プログラムによって行なわれる。
【0054】内側の2つめの MERGE 関数
【数18】MERGE( C(2:101), D(0:99), M2(1:100) )
【0055】によって同様に以下のテンプレートが生成
される。
【数19】
【0056】仮想配列のインデックスは1から開始する
ように正規化されるため、配列C及び配列Dへのアクセ
スはこのように記述される。
【0057】さらに以下のような外側のテンプレートが
展開されて、
【数20】
【0058】この際、$1 及び $2 が仮想配列なので、
マクロ展開される。結果的に、次のようなテンプレート
が最終的に生成される。
【数21】
【0059】このテンプレートの生成は外側のテンプレ
ートから行なっても可能である。
【0060】このテンプレートによって生成されるルー
プは1つだけである。( $$ のループ変数が1つだけ)
【0061】さらにこのテンプレートをインライン展開
する際に、左辺のインデクスも正規化しなければならな
い。こうして、
【数22】 を得る。
【0062】以下、具体的な例に基づき、本発明につい
て説明する。具体例として、FORTRAN90におけ
る典型的な複合したTIFの使用例を示す。これらの例
はこれまでの、あらかじめテンプレートを用意しておく
方式では、インライン展開できないものである。 例1: SPREAD 関数 + SPREAD 関数 を SUM で reduction する。 この例は比較的単純なテンプレートを生成するだけで、
インライン展開が可能な例である。1つめの SPREAD 関
数の結果である仮想配列 $1($$1,$$2,$$3)が、実際には
B($$1,$$2) のアクセスによって置換される。また、2
つめのSPREAD関数の結果である仮想配列は同様に C($$
1, $$2 ) によって置換される。このテンプレートの生
成が(1)の段階で行なわれる。 ソースプログラム:
【数23】 A(1:100,1:200) = SUM( SPREAD( B(1:10,1:200), 2, 100 ) + SPREAD( C(1:10,1:100), 3, 200 ), 1 )
【0063】(1)仮想配列化されたプログラム:
【数24】 A(1:100,1:200) = SUM( $1(1:10,1:100,1:200) [ $1($$1,$$2,$$3) -> B($$1,$$3) ] [ SPREAD( B(1:10,1:200), 2, 100 ) ] + $2(1:10,1:100,1:200) [ $2($$1,$$2,$$3) -> C($$1,$$2) ] [ SPREAD( C(1:10,1:200), 3, 200 ) ] , 1 )
【0064】(2)仮想配列のままインライン展開され
たコード:
【数25】 DO I2=1,200 DO I1=1,100 $SUM = 0 DO ISUM=1,10 $SUM = $SUM + $1(ISUM,I1,I2) + $2(ISUM,I1,I2) END DO A(I1,I2) = $SUM END DO END DO
【0065】ここで、$SUM という仮変数があらわれる
のは、ソース・コードに SUM が含まれているからであ
り、関数SUMの値を格納するために$SUMが用意される。
【0066】(3)実配列へ逆変換されたインライン展
開コード:
【数26】 DO I2=1,200 DO I1=1,100 $SUM = 0 DO ISUM=1,10 $SUM = $SUM + B(ISUM,I1) + C(ISUM,I2) END DO A(I1,I2) = $SUM END DO END DO
【0067】(2)では、reduction 関数である SUM
関数のインライン展開がおこなわれる。
【0068】実際の仮想配列は次のようなインデックス
を用いるように展開されているので、本方式の最終段階
(3)では、
【数27】$1(ISUM,I1,I2) -> B(ISUM,I2) $2(ISUM,I1,I2) -> C(ISUM,I1)
【0069】のようにマクロ展開され、最終的に最適に
インライン展開されたコードを得る。
【0070】例2: 配列を斜め方向にシフトする( cs
hift of cshift ) 次の例では、(1)の段階において、より複雑なテンプ
レートの生成がおこなわれる。入れ子になった TIF 関
数は内側のものより評価される。因に、cshiftの定義は
次のとおりである。
【数28】CSHIFT( ARRAY, SHIFT, DIM )
【0071】これは、要素の Circular Shift 関数であ
り、ターゲットの ARRAY の DIMで指定された次元を SH
IFT で指定された数だけ、シフトする。端の部分は、循
環する(ぐるっと回る)。
【0072】ソースプログラム:
【数29】 X(1:100,1:200) = CSHIFT( CSHIFT( Y(1:100,1:200), dim=2, shift=1 ), dim=1, shift=-1 )
【0073】(1)仮想配列化されたプログラム:
【数30】 X(1:100,1:200) = $1( 1:100,1:200 ) ) [ $1($$1,$$2) -> if( $$1-1 < 1 ) if( $$2+1 > 100 ) Y(100, 1) Y(100, $$2+1) if( $$2+1 > 100 ) Y($$1-1, 1) Y($$1-1, $$2+1) ] [ CSHIFT( CSHIFT( Y(1:100,1:200), dim=2, shift=1 ), dim=1, shift=-1 ) ]
【0074】(2)仮想配列のままインライン展開され
たコード:
【数31】
【0075】(3)実配列へ逆変換されたインライン展
開コード:
【数32】
【0076】この式で、
【数33】CSHIFT( Y(1:100,1:200), dim=2, shift=1 ) に対して
【0077】ここで用いられている if オペレータは条
件を記述するためのものであり、指定された条件が真な
ら1つめの値を持ち、偽なら2つめの値をもつもので
る。この例では、2次元めのインデックスを1シフトし
て100を越えるならインデックスを1として、配列Y
をアクセスすることを意味する。
【0078】このテンプレートに対して、さらに外側の
CSHIFT 関数によって
【数34】 [ $1($$1,$$2) -> if ( $$1-1 < 1 ) if ( $$2+1 > 100 ) Y(100, 1) Y(100, $$2+1) if ( $$2+1 > 100 ) Y($$1-1, 1) Y($$1-1, $$2+1) ]
【0079】という複雑なテンプレートが合成される。
このテンプレートによって(3)の段階で、最適にイン
ラインされたコードが生成される。
【0080】例3: 4つの配列をトーナメント式に3
つのマスクを用いてマージする。次の例でも同様に入れ
子構造をもった TIF関数 MERGE が 用いられてい
る。
【0081】ソースプログラム:
【数35】 X(1:100) = MERGE( MERGE( A(1:100), B(1:100), M1(1:100) ), MERGE( C(1:100), D(1:100), M2(1:100) ), M3(1:100) )
【0082】(1)仮想配列化されたプログラム:
【数36】 X(1:100) = $1(1:100) [ $1($$1) -> if( M3($$1) ) if( M1($$1) ) A($$1) B($$1) if( M2($$1) ) C($$1) D($$1) ] [ MERGE( MERGE( A(100), B(100), M1(100) ), MERGE( C(100), D(100), M2(100) ), M3(100) ) ]
【0083】(2)仮想配列のままインライン展開され
たコード:
【数37】
【0084】(3)実配列へ逆変換されたインライン展
開コード:
【数38】
【0085】この例について説明すると、内側の1つめ
の MERGE 関数によって以下のテンプレートが生成され
る。
【数39】
【0086】内側の2つめの MERGE 関数によって同様
に以下のテンプレートが生成される。
【数40】
【0087】さらに以下のような外側のテンプレートが
展開されて、
【数41】
【0088】次のようなテンプレートが最終的に生成さ
れる。
【数42】
【0089】尚、上記の例では、SPREAD、SUM、MERGE、
CSHIFT というFORTRAN90の配列操作関数に関
して説明を行ったが、本発明は、これらの関数に限定さ
れるものではなく、次元減少関数としての ALL, ANY, C
OUNT, MAXVAL, MINVAL, PRODUCT、アレイ構成関数とし
ての PACK, UNPACK、アレイ整形関数としての RESHAP
E、アレイ操作関数としての EOSHIFT, TRANSPOSE、アレ
イ位置関数としての MAXLOC, MINLOC、及びこれらの関
数の任意の組み合わせを含むソース・コードに対して適
用可能である。これらの関数の詳細については、前記の
Jeanne C. Adams etal. "FORTRAN90 HANDBOOK Complet
e ANSI/ISO Reference", McGrawHill Inc.などを参照さ
れたい。この技術分野の当業者であれば、上記の例で S
PREAD、CSHIFT、SUM、MERGE に関して生成されたテン
プレートの例に基づき、各々の関数につき、テンプレー
トを生成するようにシステムを構成することが可能であ
ると思料する。
【0090】また、本発明は、FORTRAN90のみ
ならず、APL、HPF(FORTRAN90をベース
とする並列処理言語)、C*(Cをベースとする並列言
語)などの、配列を直接操作する関数をもつ言語に適用
可能である。
【0091】さらにまた、本発明は、インライン化が本
来の目的であり、その用途は、スカラ・プロセッサに限
定したものではない。実際、インライン化によって、組
み込み関数をループ化できるため、そのループ全体に対
して、並列化が効率的に行える。従って、本発明を並列
プロセッサ用のコンパイラに適用しても、十分な効率化
を図ることができる。
【0092】
【発明の効果】以上説明したように、この発明によれ
ば、ソース・プログラム中に存在するアレイ表現を有す
る組み込み関数をそれぞれの関数ごとに仮想配列に置換
する。そして、コンパイラが予め用意している組み込み
関数毎の変換規則に従い、実配列へのマッピングを示す
テンプレートをそれぞれ生成する。これを用いて、入れ
子になった複雑な式にも、最適なインライン展開を適用
することが可能となる。また、組み込み関数を仮想配列
に変換して、インライン展開しているため、テンポラリ
・アレイのためのメモリ領域を確保する必要がないの
で、システムのメモリ・リソースを有効に活用すること
が可能となる。

Claims (4)

    (57)【特許請求の範囲】
  1. 【請求項1】アレイ関数を有するプログラミング言語の
    コンパイラにおいて、 (a) 実配列及び仮想配列間の変換規則を、アレイ表現を
    有する組み込み関数ごとに用意するステップと、 (b) ソース・コード中に存在する前記組み込み関数を、
    前記変換規則に基づき、前記仮想配列で表現すると共
    に、前記仮想配列を前記実配列にマッピングしたテンプ
    レートを生成するステップと、 (c) 前記仮想配列により表現されたソース・コード中の
    前記組み込み関数をインライン展開するステップと、 (d) 前記テンプレートに基づき、インライン展開された
    前記アレイ関数中の前記仮想配列を実配列に逆変換する
    ステップとを有することを特徴とするアレイ関数をもつ
    プログラミング言語におけるインライン展開方法。
  2. 【請求項2】ソースプログラム中に存在する前記組み込
    み関数が、複数の前記組み込み関数の入れ子構造からな
    る場合、上記ステップ(b)は、前記組み込み関数ごとに
    前記仮想配列に変換することにより、前記入れ子構造の
    組み込み関数を前記仮想配列で表現すると共に、前記入
    れ子構造の組み込み関数中に存在する前記仮想配列を前
    記実配列にマッピングしたテンプレートを生成するステ
    ップであることを特徴とする請求項1に記載の方法。
  3. 【請求項3】前記変換規則は、前記仮想配列の次元の決
    定に関する規則及び前記仮想配列及び前記実配列間のイ
    ンデックスの対応付けに関する規則を有すること特徴と
    する請求項1または2に記載の方法。
  4. 【請求項4】前記変換規則は、さらに前記仮想配列のイ
    ンデックスの正規化を行うことを特徴とする請求項1ま
    たは2に記載の方法。
JP5296269A 1993-11-26 1993-11-26 アレイ関数をもつプログラミング言語におけるインライン展開方法 Expired - Lifetime JP2794523B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP5296269A JP2794523B2 (ja) 1993-11-26 1993-11-26 アレイ関数をもつプログラミング言語におけるインライン展開方法
US08/344,423 US5640568A (en) 1993-11-26 1994-11-22 Inline expansion method for programming languages having array functions

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP5296269A JP2794523B2 (ja) 1993-11-26 1993-11-26 アレイ関数をもつプログラミング言語におけるインライン展開方法

Publications (2)

Publication Number Publication Date
JPH07152576A JPH07152576A (ja) 1995-06-16
JP2794523B2 true JP2794523B2 (ja) 1998-09-10

Family

ID=17831390

Family Applications (1)

Application Number Title Priority Date Filing Date
JP5296269A Expired - Lifetime JP2794523B2 (ja) 1993-11-26 1993-11-26 アレイ関数をもつプログラミング言語におけるインライン展開方法

Country Status (2)

Country Link
US (1) US5640568A (ja)
JP (1) JP2794523B2 (ja)

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6074433A (en) * 1995-08-25 2000-06-13 Fujitsu Limited Optimization control apparatus and optimization control method for array descriptions
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
US5794044A (en) * 1995-12-08 1998-08-11 Sun Microsystems, Inc. System and method for runtime optimization of private variable function calls in a secure interpreter
US5758061A (en) * 1995-12-15 1998-05-26 Plum; Thomas S. Computer software testing method and apparatus
US6263493B1 (en) * 1998-07-08 2001-07-17 International Business Machines Corporation Method and system for controlling the generation of program statements
JP2002073333A (ja) * 2000-08-25 2002-03-12 Hitachi Ltd 手続き呼び出し先のデータ依存の解析表示方法
US20030046259A1 (en) * 2001-08-29 2003-03-06 International Business Machines Corporation Method and system for performing in-line text expansion
JP2006243838A (ja) * 2005-02-28 2006-09-14 Toshiba Corp プログラム開発装置
US20150363230A1 (en) * 2013-01-23 2015-12-17 Waseda University Parallelism extraction method and method for making program

Family Cites Families (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS58149569A (ja) * 1982-02-27 1983-09-05 Fujitsu Ltd スカラ配列化による並列化処理方式
JPH04287230A (ja) * 1991-03-18 1992-10-12 Hitachi Ltd インライン展開の引数結合方法
US5347654A (en) * 1992-02-03 1994-09-13 Thinking Machines Corporation System and method for optimizing and generating computer-based code in a parallel processing environment
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
US5450313A (en) * 1994-03-24 1995-09-12 Xerox Corporation Generating local addresses and communication sets for data-parallel programs

Also Published As

Publication number Publication date
US5640568A (en) 1997-06-17
JPH07152576A (ja) 1995-06-16

Similar Documents

Publication Publication Date Title
US5485619A (en) Array variable transformation system employing subscript table mapping to scalar loop indices
US8327321B2 (en) Synthetic partitioning for imposing implementation design patterns onto logical architectures of computations
JP5118745B2 (ja) メモリアクセス命令のベクトル化
Orchard et al. Ypnos: declarative, parallel structured grid programming
JP2794523B2 (ja) アレイ関数をもつプログラミング言語におけるインライン展開方法
Jacob et al. CUDACL: A tool for CUDA and OpenCL programmers
Voronenko et al. Computer generation of general size linear transform libraries
Tran Tan et al. Automatic task-based code generation for high performance domain specific embedded language
US5781777A (en) Optimization method for computation partitioning oriented to a distributed memory
Lueh et al. C-for-metal: High performance simd programming on intel gpus
Matsuzaki et al. Implementing fusion-equipped parallel skeletons by expression templates
Dias et al. SparseLNR: accelerating sparse tensor computations using loop nest restructuring
US6279152B1 (en) Apparatus and method for high-speed memory access
Kronawitter et al. Automatic data layout transformations in the ExaStencils code generator
Frankel The C*® Language
Marsolf Techniques for the interactive development of numerical linear algebra libraries for scientific computation
Silber et al. The Nestor library: A tool for implementing fortran source to source transfromations
Masliah et al. Meta-programming and Multi-stage Programming for GPGPUs
DONGEN Compiling distributed loops onto SPMD code
Wende C++ data layout abstractions through proxy types
Svensson et al. A language for hierarchical data parallel design-space exploration on GPUs
JPH0540780A (ja) ベクトル化処理方式
Cornwall et al. High-performance SIMT code generation in an active visual effects library
Süß et al. And now for something completely different: running Lisp on GPUs
JPH08255086A (ja) オブジェクトコード生成方式