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

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

Info

Publication number
JPH07152576A
JPH07152576A JP5296269A JP29626993A JPH07152576A JP H07152576 A JPH07152576 A JP H07152576A JP 5296269 A JP5296269 A JP 5296269A JP 29626993 A JP29626993 A JP 29626993A JP H07152576 A JPH07152576 A JP H07152576A
Authority
JP
Japan
Prior art keywords
array
function
virtual
programming language
macro
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP5296269A
Other languages
English (en)
Other versions
JP2794523B2 (ja
Inventor
Hideaki Komatsu
秀昭 小松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
IBM Japan Ltd
Original Assignee
IBM Japan 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 IBM Japan Ltd filed Critical IBM Japan Ltd
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

Landscapes

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

Abstract

(57)【要約】 【目的】 APLやFORTRAN90などのアレイ関
数をもつプログラミング言語において、アレイ関数や配
列演算の複合した様々な式に対して、個別のテンプレー
トあるいはマクロを用意することなく、汎用的に適用可
能なインライン展開方法を提供すること。 【構成】 本発明によれば、次の手順で、TIF(組み
込みアレイ変換関数)をインライン展開する手順は以下
のようになる。 (1) TIFを仮想配列化する。この際に、TIFをマク
ロ拡張し、実配列へのマッピングを生成する。 (2) 仮想配列のままインライン展開する。 (3) 仮想配列を実際の配列に逆変換する。 本発明の方法は、コンパイル時にTIF式を解析して、
インライン展開のためのテンプレートを生成する。この
インライン展開のテンプレートが実配列へのマッピング
であり、これを生成する際にマクロ処理を用いる。この
方法によれば、マクロ・テンプレートはTIF1つに対
して1つ用意するだけで、任意の組み合わせのTIFを
インライン展開できる。

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次元のテンポラリ配列が必要となる。一方、最適に
インライン展開されたプログラムでは、これらのテンポ
ラリがまったく必要なくなるため、メモリの使用量が劇
的に少なくなる。さらに、非常に多くのデータの複写が
削減されるため、かなりの高速化が見込まれる。
【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】ここで、SUM、SPREADは、FORTRAN
90の組み込み関数であり、次のような意味をもつ。
【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】このパターンマッチ方式の欠点は、パター
ンとして登録パターンに登録されていないような記述
や、登録されているパターンを複合して記述するような
ものに対してインライン展開されたコードを生成できな
い点である。
【0026】現実的には、すべてTIFや配列に対する
演算の組み合わせをパターンとしてを登録しておくこと
は不可能である。
【0027】これをある程度緩和するためにマクロ展開
方式がある。これは、マッチング・テンプレートの記述
に柔軟性を持たせ、かつ、展開型をプログラムによって
指定できる。この方式では、単純なパターンマッチによ
るものより、強力な記述が行なえるけれども、本質的な
問題点、すなわち、すべでのパターンを用意しなければ
ならないことを解決してはいない。
【0028】特公昭63−19908号公報は、スカラ
配列化による並列処理化処理方式、特に、複数の並列演
算部を備えたベクトル処理プロセッサに対して、与えら
れたソース・プログラムから目的プログラムを生成する
コンパイラにおいて、単純変数をもつループに関して、
その単純変数についてループの入口と出口とにおけるビ
ジー状態を調べて分類を行い、その分類に基づいてそれ
ぞれの並列処理化のための処理を行うようにした、スカ
ラ配列化による並列化処理方式を開示する。しかし、こ
の刊行物には、配列演算の展開自体については、何も記
載されていない。
【0029】
【発明が解決しようとする課題】この発明の目的は、組
み込み配列操作関数や配列演算の複合した様々な式に対
して、個別のテンプレートあるいはマクロを用意するこ
となく、汎用的に適用可能なインライン展開方法を提供
することにある。
【0030】
【課題を解決するための手段】本発明は、TIFのテン
プレートマッチングやマクロ処理による置換でなく、プ
ログラムの意味を保持しながら統一的に処理する手法を
提供する。この技法によれば、統一的に処理するため、
いかなるTIF、RIFや配列演算の複合した式であっ
ても、最適なインライン展開が可能ならしめられる。
【0031】本発明では、TIFの式をインライン展開
としてコンパイルするために、TIFの式全体を仮想配
列として表現する。仮想配列は以下の情報より構成され
ている。
【0032】・仮想的な次元数及び各インデックスの範
囲 インライン展開されるTIF式全体の結果となるテンポ
ラリ配列の次元数とインックスの範囲を記述する。
【0033】・仮想的な配列及びインデックスと実際の
配列及びインデックスのマッピング 仮想配列が実際の配列のどのような式で実現されるかを
記述する。
【0034】・仮想配列の表現式(ソースプログラム情
報) ソースプログラムにおけるTIF式の情報であり、イン
ライン展開ができない場合この情報によりTIFに対応
するサブルーチンを呼び出すように変換される。
【0035】TIFをインライン展開する手順は以下の
ようになる。 (1) TIFを仮想配列化する。 (2) 仮想配列のままインライン展開する。 (3) 仮想配列を実際の配列に逆変換する。 まず最初に実行されるのが、(1)のTIFの仮想配列化
である。この際に、TIFをマクロ拡張し、実配列への
マッピングを生成する。
【0036】ユーザの記述全体をマクロ処理によってイ
ンライン展開する従来の方法と、本発明の方法が用いて
いるマクロ処理が決定的に異なっているのは、これまで
の方法が、あらかじめ様々なTIFを組み合わせた、テ
ンプレートを用意するのに対し、本発明の方法では、コ
ンパイル時にTIF式を解析して、インライン展開のた
めのテンプレートを生成することである。このインライ
ン展開のテンプレートが実配列へのマッピングであり、
これを生成する際にマクロ処理を用いる。本方式では、
マクロ・テンプレートはTIF1つに対して1つ用意す
るだけで、任意の組み合わせの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.仮想配列 先ず、用意する仮想配列の次元、及び、配列の開始及び
終了の数を決定する規則について説明する。
【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】アレイ関数が入れ子になっていなければ、
この仮想配列とマッピングはそのままマクロ・テンプレ
ートとなる。ここでは、アレイ関数 MERGE を用いて、
マクロ・テンプレートの生成の例を説明する。因に、ME
RGE の定義は、次のとおりである。
【数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 で reduc
tion する。 この例は比較的単純なマクロ・テンプレートを生成する
だけで、インライン展開が可能な例である。1つめの S
PREAD 関数の結果である仮想配列 $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】
【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】
【発明の効果】以上説明したように、この発明によれ
ば、TIFまたはRIF毎に個別にテンプレートを用意
しておき、配列とTIFまたはRIFを含むソース・コ
ードを一旦仮想配列化した式にテンプレートを適用する
ことによって、TIFやRIFが入れ子になった複雑な
式にも、最適なインライン展開を適用することが可能と
なる。

Claims (10)

    【特許請求の範囲】
  1. 【請求項1】アレイ関数を有するプログラミング言語の
    コンパイラにおいて、(a) ソース・コード中の上記アレ
    イ関数をマクロ拡張し、実配列へのマッピング関数を生
    成することによって、上記アレイ関数の仮想配列を作成
    する段階と、(b) 上記アレイ関数の仮想配列を、仮想配
    列のままインライン展開する段階と、(c) 上記インライ
    ン展開された仮想配列を、実際の配列に逆変換する段階
    を有する、 アレイ関数をもつプログラミング言語におけるインライ
    ン展開方法。
  2. 【請求項2】上記プログラミング言語がFORTRAN
    90であり、上記アレイ関数が、TIFである、請求項
    1に記載のアレイ関数をもつプログラミング言語におけ
    るインライン展開方法。
  3. 【請求項3】上記TIFが、SPREADまたはCSHIFTであ
    る、請求項2に記載のアレイ関数をもつプログラミング
    言語におけるインライン展開方法。
  4. 【請求項4】上記プログラミング言語がFORTRAN
    90であり、上記アレイ関数が、RIFである、請求項
    1に記載のアレイ関数をもつプログラミング言語におけ
    るインライン展開方法。
  5. 【請求項5】上記RIFが、MERGE である、請求項2に
    記載のアレイ関数をもつプログラミング言語におけるイ
    ンライン展開方法。
  6. 【請求項6】上記インライン展開された仮想配列を、実
    際の配列に逆変換する段階が、個別のTIF毎を解析す
    ることによって生成されたマクロ・テンプレートを用い
    て行われる、請求項1に記載のアレイ関数をもつプログ
    ラミング言語におけるインライン展開方法。
  7. 【請求項7】アレイ関数を有するプログラミング言語の
    コンパイラにおいて、(a) アレイ関数毎に個別に、仮想
    配列に変換する機能と、引数に従いマクロ・テンプレー
    トを作成する機能を用意しておく段階と、(b) ソース・
    コード中で、アレイ関数を含む式を見出だす段階と、
    (c) 上記アレイ関数を見出したことに応答して、上記段
    階(a)で、該見出だされたアレイ関数に対応して用意さ
    れた仮想配列に変換する形式に従い、上記式を仮想配列
    を含む式に変換する段階と、(d) 上記見出だされたアレ
    イ関数の引数に従い、仮想配列を実配列に変換するマク
    ロ・テンプレートを作成する段階と、(e) 上記仮想配列
    を含む式をインライン展開する段階と、(f) 上記インラ
    イン展開された式中の仮想配列を、上記段階(d)で作成
    されたマクロ・テンプレートを使用して、実際の配列に
    逆変換する段階を有する、 アレイ関数をもつプログラミング言語におけるインライ
    ン展開方法。
  8. 【請求項8】上記仮想配列に変換する機能は、仮想配列
    の次元の決定と、仮想配列と実配列のインデックスとを
    対応づける機能を含む、請求項7に記載のアレイ関数を
    もつプログラミング言語におけるインライン展開方法。
  9. 【請求項9】入れ子のアレイ関数の存在に応答して、入
    れ子の各々のアレイ関数毎にマクロ・テンプレートを作
    成し、結果的に、入れ子の外側のアレイ関数に基づき作
    成したマクロ・テンプレートに、入れ子の内側のアレイ
    関数に基づき作成したマクロ・テンプレートを順次適用
    することによって、上記段階(f)で利用されるマクロ・
    テンプレートを作成する段階を有する、請求項7に記載
    のアレイ関数をもつプログラミング言語におけるインラ
    イン展開方法。
  10. 【請求項10】入れ子のアレイ関数の存在に応答して、
    入れ子の各々のアレイ関数毎にマクロ・テンプレートを
    作成し、結果的に、入れ子の内側のアレイ関数に基づき
    作成したマクロ・テンプレートに、入れ子の外側のアレ
    イ関数に基づき作成したマクロ・テンプレートを順次適
    用することによって、上記段階(f)で利用されるマクロ
    ・テンプレートを作成する段階を有する、請求項7に記
    載のアレイ関数をもつプログラミング言語におけるイン
    ライン展開方法。
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 true JPH07152576A (ja) 1995-06-16
JP2794523B2 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 プログラム開発装置
WO2014115613A1 (ja) * 2013-01-23 2014-07-31 学校法人 早稲田大学 並列性の抽出方法及びプログラムの作成方法

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04287230A (ja) * 1991-03-18 1992-10-12 Hitachi Ltd インライン展開の引数結合方法

Family Cites Families (5)

* 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 スカラ配列化による並列化処理方式
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

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04287230A (ja) * 1991-03-18 1992-10-12 Hitachi Ltd インライン展開の引数結合方法

Also Published As

Publication number Publication date
US5640568A (en) 1997-06-17
JP2794523B2 (ja) 1998-09-10

Similar Documents

Publication Publication Date Title
Barham et al. Machine learning systems are stuck in a rut
Krall et al. Compilation techniques for multimedia processors
Grosser et al. Polyhedral AST generation is more than scanning polyhedra
US5485619A (en) Array variable transformation system employing subscript table mapping to scalar loop indices
Elango et al. Diesel: DSL for linear algebra and neural net computations on GPUs
US4833606A (en) Compiling method for vectorizing multiple do-loops in source program
US5442790A (en) Optimizing compiler for computers
US8327321B2 (en) Synthetic partitioning for imposing implementation design patterns onto logical architectures of computations
Verdoolaege et al. Scheduling for PPCG
US6041181A (en) Method of, system for, and computer program product for providing quick fusion in WHERE constructs
Susungi et al. Meta-programming for cross-domain tensor optimizations
Voronenko et al. Computer generation of general size linear transform libraries
JPH07152576A (ja) アレイ関数をもつプログラミング言語におけるインライン展開方法
Peverelli et al. OXiGen: a tool for automatic acceleration of c functions into dataflow FPGA-based kernels
Jubertie et al. Data layout and simd abstraction layers: decoupling interfaces from implementations
Dias et al. SparseLNR: accelerating sparse tensor computations using loop nest restructuring
US8225277B2 (en) Non-localized constraints for automated program generation
Selgrad et al. A High-Performance Image Processing DSL for Heterogeneous Architectures.
Silber et al. The Nestor library: A tool for implementing fortran source to source transfromations
JP3196625B2 (ja) 並列化コンパイル方式
Wende C++ data layout abstractions through proxy types
Özkan et al. A journey into DSL design using generative programming: FPGA mapping of image border handling through refinement
JPH0540780A (ja) ベクトル化処理方式
Cornwall et al. High-performance SIMT code generation in an active visual effects library
Tayeb et al. Autovesk: Automatic vectorization of unstructured static kernels by graph transformations