JPH0814817B2 - 自動ベクトル化方法 - Google Patents
自動ベクトル化方法Info
- Publication number
- JPH0814817B2 JPH0814817B2 JP61239007A JP23900786A JPH0814817B2 JP H0814817 B2 JPH0814817 B2 JP H0814817B2 JP 61239007 A JP61239007 A JP 61239007A JP 23900786 A JP23900786 A JP 23900786A JP H0814817 B2 JPH0814817 B2 JP H0814817B2
- Authority
- JP
- Japan
- Prior art keywords
- loop
- variable
- statement
- value
- sentence
- 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
Links
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/45—Exploiting coarse grain parallelism in compilation, i.e. parallelism between groups of instructions
- G06F8/451—Code distribution
- G06F8/452—Loops
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Complex Calculations (AREA)
- Devices For Executing Special Programs (AREA)
Description
【発明の詳細な説明】 〔産業上の利用分野〕 本発明は、ソースプログラムからスーパーコンピュー
タにおけるベクトル処理が可能となるようなオブジェク
トコードを生成するコンパイル方式に係り、特に、最内
側ループの実行比率が低いプログラムにおいて、多重ル
ープの外側ループをベクトル処理して実行効率の高いオ
ブジェクトコードになるようプログラム変換する方式に
関する。
タにおけるベクトル処理が可能となるようなオブジェク
トコードを生成するコンパイル方式に係り、特に、最内
側ループの実行比率が低いプログラムにおいて、多重ル
ープの外側ループをベクトル処理して実行効率の高いオ
ブジェクトコードになるようプログラム変換する方式に
関する。
スーパーコンピュータたとえば、本譲受人によるスー
パーコンピュータS-810には、配列の各要素を同時に保
持できるベクトルレジスタと、このベクトルレジスタ上
の演算を高速に実行するベクトル演算器が用意されてお
り、これらを有効に用いることにより、ソースプログラ
ムの繰り返しループで要求される処理を高速に実行する
ことができる。ソースプログラム中の繰り返しループを
ベクトルレジスタとベクトル演算器を用いるベクトル命
令からなるオブジェクトコードに変換することをベクト
ル化という。また、全プログラムのうち、ベクトル演算
器により実行される部分の割合をベクトル化率と呼ぶ。
一般に、スーパーコンピュータでは、ベクトル化率が高
い方がオブジェクトコードの実行効率が高いことが知ら
れている。
パーコンピュータS-810には、配列の各要素を同時に保
持できるベクトルレジスタと、このベクトルレジスタ上
の演算を高速に実行するベクトル演算器が用意されてお
り、これらを有効に用いることにより、ソースプログラ
ムの繰り返しループで要求される処理を高速に実行する
ことができる。ソースプログラム中の繰り返しループを
ベクトルレジスタとベクトル演算器を用いるベクトル命
令からなるオブジェクトコードに変換することをベクト
ル化という。また、全プログラムのうち、ベクトル演算
器により実行される部分の割合をベクトル化率と呼ぶ。
一般に、スーパーコンピュータでは、ベクトル化率が高
い方がオブジェクトコードの実行効率が高いことが知ら
れている。
従来のコンパイラは、最内側ループをベクトル演算の
対象として、その最内側ループのベクトル化のために様
々なプログラム変換を施してきた。そのなかに変数を配
列に置き換える配列化という変換がある。これは次のよ
うな手法である。
対象として、その最内側ループのベクトル化のために様
々なプログラム変換を施してきた。そのなかに変数を配
列に置き換える配列化という変換がある。これは次のよ
うな手法である。
DO 10 I=1,100 S=X(I)/Y(I) 10 B(I)=S*A(I)+S このようなソースプログラム対して、このままベクト
ル化して得られるオブジェクトコードは、以下の処理を
するものとなる。まず、配列X,Yの第1〜第100要素群を
各々第1、第2のベクトルレジスタにロードし、第1、
第2のベクトルレジスタ内の対応する要素間で除算を行
い、最終結果を変数Sにストアする。次に、配列Aの第
1〜第100要素を第3のベクトルレジスタにロードし、
それらとスカラデータSとかけ合わせた結果を第4のベ
クトルレジスタに格納し、その第4のベクトルレジスタ
からメモリ上に、配列Bの第1〜第100要素としてスト
アする。
ル化して得られるオブジェクトコードは、以下の処理を
するものとなる。まず、配列X,Yの第1〜第100要素群を
各々第1、第2のベクトルレジスタにロードし、第1、
第2のベクトルレジスタ内の対応する要素間で除算を行
い、最終結果を変数Sにストアする。次に、配列Aの第
1〜第100要素を第3のベクトルレジスタにロードし、
それらとスカラデータSとかけ合わせた結果を第4のベ
クトルレジスタに格納し、その第4のベクトルレジスタ
からメモリ上に、配列Bの第1〜第100要素としてスト
アする。
即ち、次のようにプログラム変換することと等しい。
DO 10 I=1,100 10 S=X(I)/Y(I) DO 11 I=1,100 11 B(I)=S*A(I)+S しかしこのまま実行すると、DO10のループが終了した
時のS=X(100)/Y(100)の値しかDO11の計算では使
うことができないため、変換前のプログラムとは計算結
果が異ってしまう。変換前と同じ計算を行うためには、
Sを配列にして、I=1,100の全ての値を保存し、それ
をDO11のループで使うよう、次のように置き換える必要
がある。
時のS=X(100)/Y(100)の値しかDO11の計算では使
うことができないため、変換前のプログラムとは計算結
果が異ってしまう。変換前と同じ計算を行うためには、
Sを配列にして、I=1,100の全ての値を保存し、それ
をDO11のループで使うよう、次のように置き換える必要
がある。
DO 10 I=1,100 10 S′(I)=X(I)/Y(I) DO 11 I=1,100 11 B(I)=S′(I)*A(I)+S′(I) このような変数から配列への変換を配列化という。この
S′のようにコンパイラが作り出した配列をテンポラリ
配列という。
S′のようにコンパイラが作り出した配列をテンポラリ
配列という。
配列化に関する公知例としては、Kuckらの論文「Depend
ence Graphs and Compiler Optimization」SIGPLAN,Pri
nciples of Programming Languages,Jan.1981,p207〜21
8があげられる。
ence Graphs and Compiler Optimization」SIGPLAN,Pri
nciples of Programming Languages,Jan.1981,p207〜21
8があげられる。
上記論文では、多重ループの最内側ループにのみ現れ
る変数を配列化する方式について論じられている。すな
わち、対象とする最内側ループがn重ループの最内側ル
ープである場合は、n次元の配列に変数を置き換えてい
る。
る変数を配列化する方式について論じられている。すな
わち、対象とする最内側ループがn重ループの最内側ル
ープである場合は、n次元の配列に変数を置き換えてい
る。
例えば、次のプログラムの場合に変数P,Sの内、 DO 20 I=1,N S=Y(I)/X(I) DO 10 J=1,N P=A(I,J)+X(J) B(I,J)=P*S/A(I,J) 10 CONTINUE 20 CONTINUE 最内側ループ内のみに表れる変数Pの配列化を論じてお
り、Sのように、2つのループにまたがって現れる変数
については論じられていない。
り、Sのように、2つのループにまたがって現れる変数
については論じられていない。
上記従来技術では、最内側ループについては、変数を
配列に置換し、遂次実行の時と等しい計算結果を生じ
る、ベクトル演算器で実行可能なオブジェクトコードを
生成できるしかし、オブジェクトコードの実行効率を高
めるために多重ループの最内側ループばかりではなく、
その外側ループもベクトル演算させる必要がある。
配列に置換し、遂次実行の時と等しい計算結果を生じ
る、ベクトル演算器で実行可能なオブジェクトコードを
生成できるしかし、オブジェクトコードの実行効率を高
めるために多重ループの最内側ループばかりではなく、
その外側ループもベクトル演算させる必要がある。
30 B(I)=…+S+… }外側部 このようなプログラムに対して、最内部の変数Sを配
列に置き換え、ベクトル処理を施すことはできるが、外
側部のSの配列化に対しては考慮されておらず、公知技
術を適用しただけでは、ベクトル演算を行うと、逐次演
算したした場合と結果が異なるという問題がある。
列に置き換え、ベクトル処理を施すことはできるが、外
側部のSの配列化に対しては考慮されておらず、公知技
術を適用しただけでは、ベクトル演算を行うと、逐次演
算したした場合と結果が異なるという問題がある。
本発明の目的は、上記プログラムの変数Sのように、
外側部で足義した値を内側ループで用いていたり、内側
ループで定義した値を外側部で用いるような変数を配列
に置き換え、外側部にもベクトル処理を施すことができ
るようにオブジェクトコードを生成するコンパイル方法
を提供することにある。
外側部で足義した値を内側ループで用いていたり、内側
ループで定義した値を外側部で用いるような変数を配列
に置き換え、外側部にもベクトル処理を施すことができ
るようにオブジェクトコードを生成するコンパイル方法
を提供することにある。
本発明のもう一つの目的は、上記の配列化により導入
する配列の大きさを最小限にし、もって、必要とするメ
モリ容量が小さくてすむオブジェクトコードを生成する
コンパイル方法を提供することにある。
する配列の大きさを最小限にし、もって、必要とするメ
モリ容量が小さくてすむオブジェクトコードを生成する
コンパイル方法を提供することにある。
上記目的は、コンパイラの自動ベクトル化処理におい
て、コンパイルすべき多重ループ中の変数の定義と参照
の順序を示すデータ依存グラフの有向線分でつながって
いる連結成分を検出し、この連結成分ごとに変数を配列
に置き換え、この配列に対して、ループを実行する前の
変数の値を設定する代入文を最内側ループ直前に挿入
し、ループ実行後の配列の適切な要素の値を元の変数に
設定する代入文を多重ループの後に挿入することによ
り、達成される。
て、コンパイルすべき多重ループ中の変数の定義と参照
の順序を示すデータ依存グラフの有向線分でつながって
いる連結成分を検出し、この連結成分ごとに変数を配列
に置き換え、この配列に対して、ループを実行する前の
変数の値を設定する代入文を最内側ループ直前に挿入
し、ループ実行後の配列の適切な要素の値を元の変数に
設定する代入文を多重ループの後に挿入することによ
り、達成される。
変数の値を決める定義とその値を使う参照の順序を示
すフロー依存グラフの連結成分を検出して、異なる計算
に使われている同じ名称の変数に異なる名称を付ける。
各連結成分ごとに、ベクトル処理の対象としているルー
プにおける変数の定義と参照の順序に応じて添字付変数
すなわち配列への変換要、不要を判定し、必要な場合は
配列でもって、その変数をテンポラリ配列に置き換え
る。テンポラリ配列とソースプログラムには現れず、コ
ンパイラがオブジェクトコードの実効性能向上のために
作った一時的な作業用配列である。ある変数に関してル
ープのi回目に定義した値を、次のi+1回目のループ
で用いていたり、ベクトル化処理の対象ループの内側の
ループで用いている場合はその変数の配列化が必要であ
ると判断する。これはメモリを介して、データの受け渡
しをする必要があるためである。
すフロー依存グラフの連結成分を検出して、異なる計算
に使われている同じ名称の変数に異なる名称を付ける。
各連結成分ごとに、ベクトル処理の対象としているルー
プにおける変数の定義と参照の順序に応じて添字付変数
すなわち配列への変換要、不要を判定し、必要な場合は
配列でもって、その変数をテンポラリ配列に置き換え
る。テンポラリ配列とソースプログラムには現れず、コ
ンパイラがオブジェクトコードの実効性能向上のために
作った一時的な作業用配列である。ある変数に関してル
ープのi回目に定義した値を、次のi+1回目のループ
で用いていたり、ベクトル化処理の対象ループの内側の
ループで用いている場合はその変数の配列化が必要であ
ると判断する。これはメモリを介して、データの受け渡
しをする必要があるためである。
ベクトル化処理の対象としているループの中で使用さ
れるテンポラリ配列について、ループ1回目の計算に用
いられる値が、ループの外側で定義されている場合は、
テンポラリ配列にベクトル化処理の対象としているルー
プを実行する直前の変数の値を代入して初期値を保証す
る。さらに、当該ループ中で定義した値をループの外側
で使用される場合は、テンポラリ配列の最終要素の値を
置換前の変数に代入して終値を保証する。当該ループが
内側ループを含んでいる場合には、同様に内側ループに
対しても初期値と終値を保証する代入文を挿入するか否
かを判別する。
れるテンポラリ配列について、ループ1回目の計算に用
いられる値が、ループの外側で定義されている場合は、
テンポラリ配列にベクトル化処理の対象としているルー
プを実行する直前の変数の値を代入して初期値を保証す
る。さらに、当該ループ中で定義した値をループの外側
で使用される場合は、テンポラリ配列の最終要素の値を
置換前の変数に代入して終値を保証する。当該ループが
内側ループを含んでいる場合には、同様に内側ループに
対しても初期値と終値を保証する代入文を挿入するか否
かを判別する。
前記手段により、第2図の(a)、(b)、(c)、
(d)のソースプログラムは各々第7図のように変換し
てからベクトル化される。図中「…」はSとは無関係な
演算を表す。
(d)のソースプログラムは各々第7図のように変換し
てからベクトル化される。図中「…」はSとは無関係な
演算を表す。
(a)外側ループi回目で値を定義した変数の値を、そ
の外側ループのi回目の内側ループで使用する場合 第2図(a)のように、外側ループで変数Sを定義す
る文19とその内側ループでその変数Sを使用する文20と
が含まれている場合、外側部のベクトル化のためには、
第7図(a)のようにDO20ループの直前でDO10のループ
を2つに分割する必要がある。第7図(a)のようにS
をテンポラリ配列TV1で置き置えれば第2図(a)と同
様の計算を行うことができる。即ち、第7図(a)のDO
10ループでI=1〜Nの各回のSを計算し、その結果を
TV1[1:N]に保持し、次のDO11ループで、TV1の要素の
値を順に変数Sに代入すれば、DO20ループはこのままベ
クトル化することができ、第2図(a)と同様の計算を
行うことになる。
の外側ループのi回目の内側ループで使用する場合 第2図(a)のように、外側ループで変数Sを定義す
る文19とその内側ループでその変数Sを使用する文20と
が含まれている場合、外側部のベクトル化のためには、
第7図(a)のようにDO20ループの直前でDO10のループ
を2つに分割する必要がある。第7図(a)のようにS
をテンポラリ配列TV1で置き置えれば第2図(a)と同
様の計算を行うことができる。即ち、第7図(a)のDO
10ループでI=1〜Nの各回のSを計算し、その結果を
TV1[1:N]に保持し、次のDO11ループで、TV1の要素の
値を順に変数Sに代入すれば、DO20ループはこのままベ
クトル化することができ、第2図(a)と同様の計算を
行うことになる。
(b)外側ループi回目の時に実行した内側ループで定
義した変数の値を、外側ループi+1回目の計算で用い
る場合 第2図(b)のように、内側ループで変数Sを定義す
る文22と、その変数を次の外側ループの繰り返し時に使
用する文21とがある場合、文21を含む外側部をベクトル
化するためには、DO20ループの直前で、DO10ループを2
つに分割する必要がある。ループを分割しても同じ計算
を実行させるためには、外側ループの各回で計算した文
22のSの値を配列に保持し、その値を文21の計算に使用
できるよう変形しなければならない。第6図(b)の文
64のようにSをテンポラリ配列TV1で置き換えると、文2
1の計算に、I=1の時は、ループの外のSの値を用
い、I>1の時は、1回目の文21′の計算に、I-1回目
の内側ループの文22の計算結果を使用することができ
る。これより、DO20のループと文21′を入れ換えても計
算結果は保証され、第7図(b)に示すようにループを
分割しても、第2図(b)と同じ計算を実行させること
ができる。(c)外側ループi回目に実行した内側ルー
プで定義した変数の値を、外側ループi回目の計算で用
いる場合 第2図(c)のように、内側ループに変数Sを定義す
る文23を含み、外側ループにこの変数を使用する文24を
含む場合、外側部のベクトル処理のためには、DO20ルー
プの直後で、第7図(c)のように、DO10ループを2つ
のループを分割する必要がある。ループを分割しても同
じ計算をさせるためには、外側ループの各回で計算した
文23のSの値を保持し、その値を文24の計算に使用でき
るよう変形しなければならない。第6図(c)の文58の
ように変数Sをテンポラリ配列TV1で置き換えると、外
側ループI回目に内側ループで計算した値を、I回目の
文24の計算に使用することができる。この後、第7図
(c)に示すようにループを分割しても、第2図(c)
と同じ計算を実行させることができる。(d)外側ルー
プi回目で定義した値を、外側ループi+1回目の内側
ループで使用する場合 第2図(d)のように、外側ループで変数Sを定義す
る文25と、その変数Sを、外側ループの次回の実行時に
使用する、内側ループ内の文25とがある場合、文26を含
む外側部をベクトル化するためには、DO20のループの直
後でDO10ループを2つに分割する必要がある。第7図
(d)のようにSをテンポラリ配列TV1で置き換える
と、第2図(d)と同じ計算を行うことができる。文2
5′の計算に外側ループのI=1の時は、ループの外の
Sの値を用い、I>1の時は、I回目の内側ループの文
25′の計算に、I-1回目の文26の計算結果を用いること
ができる。これにより、DO20のループと文26を入れ換え
ても計算結果は保証され、第7図(d)に示すようにル
ープを分割しても、第2図(d)と同じ計算を実行させ
ることができる。
義した変数の値を、外側ループi+1回目の計算で用い
る場合 第2図(b)のように、内側ループで変数Sを定義す
る文22と、その変数を次の外側ループの繰り返し時に使
用する文21とがある場合、文21を含む外側部をベクトル
化するためには、DO20ループの直前で、DO10ループを2
つに分割する必要がある。ループを分割しても同じ計算
を実行させるためには、外側ループの各回で計算した文
22のSの値を配列に保持し、その値を文21の計算に使用
できるよう変形しなければならない。第6図(b)の文
64のようにSをテンポラリ配列TV1で置き換えると、文2
1の計算に、I=1の時は、ループの外のSの値を用
い、I>1の時は、1回目の文21′の計算に、I-1回目
の内側ループの文22の計算結果を使用することができ
る。これより、DO20のループと文21′を入れ換えても計
算結果は保証され、第7図(b)に示すようにループを
分割しても、第2図(b)と同じ計算を実行させること
ができる。(c)外側ループi回目に実行した内側ルー
プで定義した変数の値を、外側ループi回目の計算で用
いる場合 第2図(c)のように、内側ループに変数Sを定義す
る文23を含み、外側ループにこの変数を使用する文24を
含む場合、外側部のベクトル処理のためには、DO20ルー
プの直後で、第7図(c)のように、DO10ループを2つ
のループを分割する必要がある。ループを分割しても同
じ計算をさせるためには、外側ループの各回で計算した
文23のSの値を保持し、その値を文24の計算に使用でき
るよう変形しなければならない。第6図(c)の文58の
ように変数Sをテンポラリ配列TV1で置き換えると、外
側ループI回目に内側ループで計算した値を、I回目の
文24の計算に使用することができる。この後、第7図
(c)に示すようにループを分割しても、第2図(c)
と同じ計算を実行させることができる。(d)外側ルー
プi回目で定義した値を、外側ループi+1回目の内側
ループで使用する場合 第2図(d)のように、外側ループで変数Sを定義す
る文25と、その変数Sを、外側ループの次回の実行時に
使用する、内側ループ内の文25とがある場合、文26を含
む外側部をベクトル化するためには、DO20のループの直
後でDO10ループを2つに分割する必要がある。第7図
(d)のようにSをテンポラリ配列TV1で置き換える
と、第2図(d)と同じ計算を行うことができる。文2
5′の計算に外側ループのI=1の時は、ループの外の
Sの値を用い、I>1の時は、I回目の内側ループの文
25′の計算に、I-1回目の文26の計算結果を用いること
ができる。これにより、DO20のループと文26を入れ換え
ても計算結果は保証され、第7図(d)に示すようにル
ープを分割しても、第2図(d)と同じ計算を実行させ
ることができる。
以下、本発明のFORTRANコンパイラにおける実施例を
図表を参照しつつ説明する。
図表を参照しつつ説明する。
第1図に、本発明が適用されたコンパイラ1の全体の
構造を示す。FORTRANソースプログラム11を入力として
処理2は構文解析を行い、中間語12を出力する。処理3
は、これを入力としてベクトル化や最適化を行ない、中
間語12を変換する。この中間語12を入力として、処理4
は、オブジェクトコード14を生成する。本発明の特徴は
処理3にあり、ベクトル化率の高いオブジェクトコード
14を生成するものである。
構造を示す。FORTRANソースプログラム11を入力として
処理2は構文解析を行い、中間語12を出力する。処理3
は、これを入力としてベクトル化や最適化を行ない、中
間語12を変換する。この中間語12を入力として、処理4
は、オブジェクトコード14を生成する。本発明の特徴は
処理3にあり、ベクトル化率の高いオブジェクトコード
14を生成するものである。
第1図では処理3の内、特に自動ベクトル化処理に係
わる部分を示し、他は簡単化のために省略してある。処
理7には、自動ベクトル化処理のうち特に変数の配列化
に係る部分を示し、他は簡単化のために省略してある。
わる部分を示し、他は簡単化のために省略してある。処
理7には、自動ベクトル化処理のうち特に変数の配列化
に係る部分を示し、他は簡単化のために省略してある。
ソースプログラム11が、二重ループを含み、その二重
ループの内の外側ループで計算した値を内側ループで使
用したり、逆に内側ループで計算した値と外側ループで
使うような変数を含む場合、その変数を配列にて置換す
る配列化について説明する。
ループの内の外側ループで計算した値を内側ループで使
用したり、逆に内側ループで計算した値と外側ループで
使うような変数を含む場合、その変数を配列にて置換す
る配列化について説明する。
フロー依存は、第2図の(a),(b),(c),
(d)のよつの型に分類することができる。第2図
(a)〜(d)の図中「・・・」は、Sとは無関係な演
算を現わす。
(d)のよつの型に分類することができる。第2図
(a)〜(d)の図中「・・・」は、Sとは無関係な演
算を現わす。
まず、第1図の処理5が制御構造を解析しソースプロ
グラム11に対して2重ループを検出し、次に第1図の処
理6では、まずデータフローを解析し、計算してある変
数の値を決める定義文と、その値を他の計算に用いる使
用文との間を有向線分で結ぶフロー依存グラフを検出す
る。第2図(a)〜(d)の27,28,29,30は検出される
有向線分を示す。さらに、このデータフロー解析6で
は、検出されたフロー依存があるループのi回目に計算
されたある変数値を、i回目に使うフロー依存なのか、
i+1回目に使うフロー依存なのかの区別を行う。i回
目に計算した値をi回目に使う依存ループ独立な依存、
次のi+1回目に使う依存をループ運搬2回の依存とい
う。このようなデータフロー解析方法については公知で
あり、情報処理学会論文誌、第28巻第6号p567〜576の
金田らの論文「配列の大域データフロー解析法」に論じ
られている。
グラム11に対して2重ループを検出し、次に第1図の処
理6では、まずデータフローを解析し、計算してある変
数の値を決める定義文と、その値を他の計算に用いる使
用文との間を有向線分で結ぶフロー依存グラフを検出す
る。第2図(a)〜(d)の27,28,29,30は検出される
有向線分を示す。さらに、このデータフロー解析6で
は、検出されたフロー依存があるループのi回目に計算
されたある変数値を、i回目に使うフロー依存なのか、
i+1回目に使うフロー依存なのかの区別を行う。i回
目に計算した値をi回目に使う依存ループ独立な依存、
次のi+1回目に使う依存をループ運搬2回の依存とい
う。このようなデータフロー解析方法については公知で
あり、情報処理学会論文誌、第28巻第6号p567〜576の
金田らの論文「配列の大域データフロー解析法」に論じ
られている。
このようなフロー依存グラフと、ソースプログラムの
中間表現が、第1図の処理7の自動ベクトル化処理の入
力となる。
中間表現が、第1図の処理7の自動ベクトル化処理の入
力となる。
第1図の処理8は、ベクトル化の対象とする2重ルー
プ内の変数のフロー依存について、グラフ上有向線分で
連結されている連結成分ごとのグループに分類する。連
結成分検出のアルゴリズムはグラフ理論の文野では基本
的であり、公知である。
プ内の変数のフロー依存について、グラフ上有向線分で
連結されている連結成分ごとのグループに分類する。連
結成分検出のアルゴリズムはグラフ理論の文野では基本
的であり、公知である。
第2図(a)〜(d)のプログラムでは、いずれも、
1つの連結成分のみであるから、変数Sについて、グル
ープ分けすることはない。
1つの連結成分のみであるから、変数Sについて、グル
ープ分けすることはない。
次に第1図の処理9が、変数をテンポラリ配列に置き
換える。これを配列化と呼ぶ。この処理の流れを第3図
に示す。外側ループから順に配列化処理を行うため、ま
ず、外側のDO10ループを対象とする。この時には、内側
ループの変数についてはいかなる変換も施さない。各ル
ープのネストレベルごとに独立に処理を行うためであ
る。すなわち、外側ループの処理の終了後に、内側ルー
プについて処理を施す。
換える。これを配列化と呼ぶ。この処理の流れを第3図
に示す。外側ループから順に配列化処理を行うため、ま
ず、外側のDO10ループを対象とする。この時には、内側
ループの変数についてはいかなる変換も施さない。各ル
ープのネストレベルごとに独立に処理を行うためであ
る。すなわち、外側ループの処理の終了後に、内側ルー
プについて処理を施す。
第3図は、この配列化処理の詳細を示す。第3図の判
定31においては、処理8で検出した連結成分内のフロー
依存にある変数の値を計算した図の次の回にその値を使
うというループ運搬依存性2回の変数があるか否かを判
定する。第2図(b)のフロー依存28や、第2図(d)
のフロー依存30がこの例である。処理33では、そのよう
なループ運搬依存性2回のフローを有し、その値を定義
するのに用いられている変数(これを定義点にある変数
と呼ぶ)が配列化処理9の対象となっているループ中に
ある場合に、その定義点にある変数を、配列化処理9の
対象としているループの繰り返し回数Iに対して、添字
I+1を付けて配列化する。たとえば第2図(b)の文
22の変数Sは、内側ループにて定義される変数であるた
め、外側ループに対して配列化処理9をしているときに
は上記配列化はしないが、第2図(d)の文26中の変数
Sは、外側ループで定義される変数であるため外側ルー
プに対して配列化処理9をするときに、その外側ループ
の繰り返し回数Iに対して、添字I+1を付けてテンポ
ラリ配列TV1(I+1)で置き換えて配列化し、第4図
(d)の文26′をしたる。上記ループ運搬依存性2回を
有する変数で定義点において定義された、同じ変数につ
いての、値を使用する位置にある変数(これを参照点に
ある変数と呼ぶ)が配列化処理9の対象としているルー
プ中にある場合に、その定義点にある変数とその参照点
にある変数の間のフロー依存に、ループ運搬性があるか
否かに応じて処理35と処理34のいずれかを行う。すなわ
ち、両者の間にループ運搬性がない場合、つまり当該ル
ープ中のi回目で定義された変数をその同じループ回数
で使用する場合は、定義点の変数についての処理33と同
様、その参照点の変数もループ回数Iに対して、添字I
+1を付けた配列に配列化する(処理34)。ループ運搬
性がある場合、つまり、あるループのi回目に定義され
た変数をi+1回目に使用する場合は、その参照点にあ
る変数を、そのループのループ回数Iに対して、添字I
を付けて配列に配列化する(処理35)。第2図(b)の
文21中の変数Sがこの例で、この変数を、添字Iを付け
たテンポラリ配列TV1(I)で置き換えて配列化し、第
4図(b)の文21′を作る。
定31においては、処理8で検出した連結成分内のフロー
依存にある変数の値を計算した図の次の回にその値を使
うというループ運搬依存性2回の変数があるか否かを判
定する。第2図(b)のフロー依存28や、第2図(d)
のフロー依存30がこの例である。処理33では、そのよう
なループ運搬依存性2回のフローを有し、その値を定義
するのに用いられている変数(これを定義点にある変数
と呼ぶ)が配列化処理9の対象となっているループ中に
ある場合に、その定義点にある変数を、配列化処理9の
対象としているループの繰り返し回数Iに対して、添字
I+1を付けて配列化する。たとえば第2図(b)の文
22の変数Sは、内側ループにて定義される変数であるた
め、外側ループに対して配列化処理9をしているときに
は上記配列化はしないが、第2図(d)の文26中の変数
Sは、外側ループで定義される変数であるため外側ルー
プに対して配列化処理9をするときに、その外側ループ
の繰り返し回数Iに対して、添字I+1を付けてテンポ
ラリ配列TV1(I+1)で置き換えて配列化し、第4図
(d)の文26′をしたる。上記ループ運搬依存性2回を
有する変数で定義点において定義された、同じ変数につ
いての、値を使用する位置にある変数(これを参照点に
ある変数と呼ぶ)が配列化処理9の対象としているルー
プ中にある場合に、その定義点にある変数とその参照点
にある変数の間のフロー依存に、ループ運搬性があるか
否かに応じて処理35と処理34のいずれかを行う。すなわ
ち、両者の間にループ運搬性がない場合、つまり当該ル
ープ中のi回目で定義された変数をその同じループ回数
で使用する場合は、定義点の変数についての処理33と同
様、その参照点の変数もループ回数Iに対して、添字I
+1を付けた配列に配列化する(処理34)。ループ運搬
性がある場合、つまり、あるループのi回目に定義され
た変数をi+1回目に使用する場合は、その参照点にあ
る変数を、そのループのループ回数Iに対して、添字I
を付けて配列に配列化する(処理35)。第2図(b)の
文21中の変数Sがこの例で、この変数を、添字Iを付け
たテンポラリ配列TV1(I)で置き換えて配列化し、第
4図(b)の文21′を作る。
第3図の判定31で、ループ運搬依存2回のフロー依存
が無ければ、判定32が、フロー依存の相手が内側ループ
にあるか否かを判定し、フロー依存の相手が内側ループ
にあれば、処理36で、配列化処理対象のループの変数
を、その変数が定義点の変数と参照点の変数のいずれで
あってもループ回数Iに対して添字Iを付けて配列化す
る。この時も、内側ループの変数は配列化しない。第2
図(a)の文19の変数Sや第2図(c)中の文24中の変
数Sがこの例で、それぞれの変数Sを外側ループの繰り
返し回数Iに対して、添字Iを付けてテンポラリ配列TV
1(I)に書き換えて配列化し、第4図(a)の文19′
や第4図(c)の文24′を作る。
が無ければ、判定32が、フロー依存の相手が内側ループ
にあるか否かを判定し、フロー依存の相手が内側ループ
にあれば、処理36で、配列化処理対象のループの変数
を、その変数が定義点の変数と参照点の変数のいずれで
あってもループ回数Iに対して添字Iを付けて配列化す
る。この時も、内側ループの変数は配列化しない。第2
図(a)の文19の変数Sや第2図(c)中の文24中の変
数Sがこの例で、それぞれの変数Sを外側ループの繰り
返し回数Iに対して、添字Iを付けてテンポラリ配列TV
1(I)に書き換えて配列化し、第4図(a)の文19′
や第4図(c)の文24′を作る。
以上の第3図の処理を内側ループに対しても実施す
る。こうして配列化処理9(第1図)が終了する。
る。こうして配列化処理9(第1図)が終了する。
次に、第1図の初期値・終値保証代入文挿入処理10で
は当該ループの前後や内側ループの前後に各々のループ
に対する、配列化した変数の初期値や終値を保証するた
めの代入文を挿入する。この処理の流れを第5図のフロ
ーチャートに示す。判定46で終了と判定されるまで、全
てのテンポラリ配列について以下の処理を施す。
は当該ループの前後や内側ループの前後に各々のループ
に対する、配列化した変数の初期値や終値を保証するた
めの代入文を挿入する。この処理の流れを第5図のフロ
ーチャートに示す。判定46で終了と判定されるまで、全
てのテンポラリ配列について以下の処理を施す。
判定47で、配列化した変数がその値を使われる参照点
かその値を決定する定義点かを分ける。定義点であれ
ば、判定48で、処理中の2重ループの外へフロー依存が
届くか否かにより、当該2重ループに対する終値保証の
必要性を判定する。外側へフロー依存が届く場合は、処
理49で、配列の最終要素の値をもとの変数の値に代入す
る文を挿入する。
かその値を決定する定義点かを分ける。定義点であれ
ば、判定48で、処理中の2重ループの外へフロー依存が
届くか否かにより、当該2重ループに対する終値保証の
必要性を判定する。外側へフロー依存が届く場合は、処
理49で、配列の最終要素の値をもとの変数の値に代入す
る文を挿入する。
第4図(a),(b),(c),(d)の例だと、各
々DO10ループの直後に、代入文60,61,62,63(第61
(a)〜(d))を挿入する。
々DO10ループの直後に、代入文60,61,62,63(第61
(a)〜(d))を挿入する。
判定50では、当該ループの内側ループへフロー依存が
届くか否かにより、内側ループに対する初期値保証の必
要性を判定する。内側ループにフロー依存が届く場合
は、処理51が、内側ループに対する初期値保証の代入文
を内側ループの直前に挿入する。内側ループへのフロー
依存がループ独立であれば、定義点の添字と同じ添字で
表わされる要素の値をもとの変数に代入する文を内側ル
ープの直前に挿入する。第4図(a)の文19′がこの例
で、文19′の定義点と同様、第I要素の値を変数Sに代
入する文を内側ループの直前に挿入し、第6図(a)の
文56のようにする。内側ループへのフロー依存が、ルー
プ運搬依存2回であれば、定義点の添字より1小さい添
字で表わされる要素の値のもとの変数に挿入する文を内
側ループの直前に挿入する。第4図(d)の文26′がこ
の例で、文26′の定義点の添字I+1より1小さい、第
I要素の値を変数Sに代入する文を内側ループの直前に
挿入し、第6図(d)の文59のようにする。
届くか否かにより、内側ループに対する初期値保証の必
要性を判定する。内側ループにフロー依存が届く場合
は、処理51が、内側ループに対する初期値保証の代入文
を内側ループの直前に挿入する。内側ループへのフロー
依存がループ独立であれば、定義点の添字と同じ添字で
表わされる要素の値をもとの変数に代入する文を内側ル
ープの直前に挿入する。第4図(a)の文19′がこの例
で、文19′の定義点と同様、第I要素の値を変数Sに代
入する文を内側ループの直前に挿入し、第6図(a)の
文56のようにする。内側ループへのフロー依存が、ルー
プ運搬依存2回であれば、定義点の添字より1小さい添
字で表わされる要素の値のもとの変数に挿入する文を内
側ループの直前に挿入する。第4図(d)の文26′がこ
の例で、文26′の定義点の添字I+1より1小さい、第
I要素の値を変数Sに代入する文を内側ループの直前に
挿入し、第6図(d)の文59のようにする。
配列化した変数が参照点であれば、第5図の判定52
が、当該ループの外からフロー依存が届くか否かによ
り、当該ループに対する初期値保証の必要性を判定す
る。外からフロー依存が届く場合は、処理53が、もとの
変数の値を配列の第1要素へ代入する文を、当該ループ
の直前に挿入する。第6図(b)や(d)がこの例でDO
10ループの直前に文64,文65を挿入し、TV1の第1要素に
値を改定する。
が、当該ループの外からフロー依存が届くか否かによ
り、当該ループに対する初期値保証の必要性を判定す
る。外からフロー依存が届く場合は、処理53が、もとの
変数の値を配列の第1要素へ代入する文を、当該ループ
の直前に挿入する。第6図(b)や(d)がこの例でDO
10ループの直前に文64,文65を挿入し、TV1の第1要素に
値を改定する。
判定54は、当該ループの内側ループからのフロー依存
が届くか否かにより、内側ループの終値保証の必要性を
判定する。内側ループからのフロー依存が届く場合は、
処理55が、内側ループの終値を保証する代入文を内側ル
ープの直後に挿入する。内側フロー依存からのフロー依
存がループ独立であれば、参照点の添字と添字で表わさ
れる要素へもとの変数の値を代入する文を内側ループの
直後に挿入する。第4図(c)の文24′がこの例で、文
24′の参照点と同様、第I要素へ変数Sの値を代入する
文を内側ループの直後に挿入し、第6図(c)の文58の
ようにする。内側ループへのフロー依存が、ループ運搬
依存2回であれば、参照点の添字より1大きい添字で表
わされる要素へもとの変数の値を代入する文を内側ルー
プの直後に挿入する。第4図(b)の文21′がこの例
で、文21′の参照点の添字Iより1大きい、第I+1要
素に変数Sの値を代入する文を内側ループの直後に挿入
し、第6図(b)の文57のようにする。
が届くか否かにより、内側ループの終値保証の必要性を
判定する。内側ループからのフロー依存が届く場合は、
処理55が、内側ループの終値を保証する代入文を内側ル
ープの直後に挿入する。内側フロー依存からのフロー依
存がループ独立であれば、参照点の添字と添字で表わさ
れる要素へもとの変数の値を代入する文を内側ループの
直後に挿入する。第4図(c)の文24′がこの例で、文
24′の参照点と同様、第I要素へ変数Sの値を代入する
文を内側ループの直後に挿入し、第6図(c)の文58の
ようにする。内側ループへのフロー依存が、ループ運搬
依存2回であれば、参照点の添字より1大きい添字で表
わされる要素へもとの変数の値を代入する文を内側ルー
プの直後に挿入する。第4図(b)の文21′がこの例
で、文21′の参照点の添字Iより1大きい、第I+1要
素に変数Sの値を代入する文を内側ループの直後に挿入
し、第6図(b)の文57のようにする。
以上のようにして、内側ループと依存関係がある変数
について、外側ループの配列化と初期値・終値保証用代
入文の追加が終了する。
について、外側ループの配列化と初期値・終値保証用代
入文の追加が終了する。
このようにすることにより、文の移動が可能になり、
内側ループの前後で次のループ分割処理100(第1図)
を施すと、外側ループもベクトル化可能とすることがで
きる。
内側ループの前後で次のループ分割処理100(第1図)
を施すと、外側ループもベクトル化可能とすることがで
きる。
第7図(a)は、第6図(a)の内、外側ループ部分
に属するテンポラリ配列を含む文19′を単一のループと
して分割した結果を示す。第7図(b)は、第6図
(b)の文21′を外側ループの末尾に移動した後、単一
のループとして分割した結果を示す。第7図(c)は、
第6図(c)の文24′を単一のループとして分割した結
果を示す。第7図(d)は、第6図(d)の文26を外側
ループの先頭部分に移動した後単一のループとして分割
した結果を示す。第7図(b)では第6図(b)の文2
1′を、第7図(d)では文26′を移動しかつ、外側ル
ープを分割したが、第4図(b),(d)とそれぞれ全
く同一の計算を行う。
に属するテンポラリ配列を含む文19′を単一のループと
して分割した結果を示す。第7図(b)は、第6図
(b)の文21′を外側ループの末尾に移動した後、単一
のループとして分割した結果を示す。第7図(c)は、
第6図(c)の文24′を単一のループとして分割した結
果を示す。第7図(d)は、第6図(d)の文26を外側
ループの先頭部分に移動した後単一のループとして分割
した結果を示す。第7図(b)では第6図(b)の文2
1′を、第7図(d)では文26′を移動しかつ、外側ル
ープを分割したが、第4図(b),(d)とそれぞれ全
く同一の計算を行う。
この後、第7図(a),(b),(c),(d)の内
側ループDO20の変数Sについても、必要と判断すれば、
配列に置き換える。第7図(a)は文20で、第7図
(d)は文25で、Sの値を使うばかりで、DC20のループ
内で新しく定義をしていないため、フロー依存の関係は
なく配列化は行わない。第7図(b),(c)は、前述
の実行例で示した処理と同様の処理を施すと、第8図
(a),(b)のようになる。
側ループDO20の変数Sについても、必要と判断すれば、
配列に置き換える。第7図(a)は文20で、第7図
(d)は文25で、Sの値を使うばかりで、DC20のループ
内で新しく定義をしていないため、フロー依存の関係は
なく配列化は行わない。第7図(b),(c)は、前述
の実行例で示した処理と同様の処理を施すと、第8図
(a),(b)のようになる。
こうして、第7図(a)のDO10とDO20、第7図(d)
のDO10とDO20のループを、第8図(a)のDO20とDO11、
第8図(b)のDO20とDO11のループをそれぞれベクトル
化する。すなわち、ベクトル命令を使用するオブジェク
トコードを生成する。
のDO10とDO20のループを、第8図(a)のDO20とDO11、
第8図(b)のDO20とDO11のループをそれぞれベクトル
化する。すなわち、ベクトル命令を使用するオブジェク
トコードを生成する。
本発明によれば、多重ループにまたがって、値を決め
る定義とそれを用いる参照がある変数を、配列化するこ
とができる。このことにより、内部にループに含むよう
なループも最内側ループと同様に取扱うことができ、文
の移動など、ベクトル化のためのプログラム変換を施
し、ベクトル処理を行う形に変換することができる。
る定義とそれを用いる参照がある変数を、配列化するこ
とができる。このことにより、内部にループに含むよう
なループも最内側ループと同様に取扱うことができ、文
の移動など、ベクトル化のためのプログラム変換を施
し、ベクトル処理を行う形に変換することができる。
従来、ベクトル化の対象としていなかった、最内側以
外のループをベクトル化の対象とすることにより、ベク
トル化の範囲は広がり、ベクトル化率が上がる。その結
果、生成するオブジェクトコードの実行効率が高まる効
果がある。
外のループをベクトル化の対象とすることにより、ベク
トル化の範囲は広がり、ベクトル化率が上がる。その結
果、生成するオブジェクトコードの実行効率が高まる効
果がある。
第1図は、本発明によるコンパイラ処理のフロー図、 第2図(a)はソースプログラム中の2重ループの一例
を示す図、 第2図(b)はソースプログラム中の2重ループの他の
例を示す図、 第2図(c)はソースプログラム中の2重ループの他の
例を示す図、 第2図(d)はソースプログラム中の2重ループの他の
例を示す図、 第3図第1図の配列化処理(9)のフローチャート、 第4図(a)は第2図(a)のプログラムに対する配列
化処理の結果を示す図、 第4図(b)は第2図(b)のプログラムに対する配列
化処理の結果を示す図、 第4図(c)は第2図(c)のプログラムに対する配列
化処理の結果を示す図、 第4図(d)は第2図(d)のプログラムに対する配列
化処理の結果を示す図、 第5図は第1図の初期値・終値保証代入文挿入処理(1
0)のフローチャート、 第6図(a)は、第4図(a)のプログラムに対する初
期値・終値保証処理の結果を示す図、 第6図(b)は第4図(b)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第6図(c)は第4図(c)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第6図(d)は第4図(d)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第7図(a)は第6図(a)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(b)は第6図(b)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(c)は第6図(c)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(d)は第6図(d)のプログラムに対してルー
プ分割処理をした結果を示す図、 第8図(a)は第7図(b)の内側ループに対する配列
化処理の結果を示す図、 第8図(b)は第7図(c)の内側ループに対する配列
化処理の結果を示す図。
を示す図、 第2図(b)はソースプログラム中の2重ループの他の
例を示す図、 第2図(c)はソースプログラム中の2重ループの他の
例を示す図、 第2図(d)はソースプログラム中の2重ループの他の
例を示す図、 第3図第1図の配列化処理(9)のフローチャート、 第4図(a)は第2図(a)のプログラムに対する配列
化処理の結果を示す図、 第4図(b)は第2図(b)のプログラムに対する配列
化処理の結果を示す図、 第4図(c)は第2図(c)のプログラムに対する配列
化処理の結果を示す図、 第4図(d)は第2図(d)のプログラムに対する配列
化処理の結果を示す図、 第5図は第1図の初期値・終値保証代入文挿入処理(1
0)のフローチャート、 第6図(a)は、第4図(a)のプログラムに対する初
期値・終値保証処理の結果を示す図、 第6図(b)は第4図(b)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第6図(c)は第4図(c)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第6図(d)は第4図(d)のプログラムに対する初期
値・終値保証処理の結果を示す図、 第7図(a)は第6図(a)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(b)は第6図(b)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(c)は第6図(c)のプログラムに対してルー
プ分割処理をした結果を示す図、 第7図(d)は第6図(d)のプログラムに対してルー
プ分割処理をした結果を示す図、 第8図(a)は第7図(b)の内側ループに対する配列
化処理の結果を示す図、 第8図(b)は第7図(c)の内側ループに対する配列
化処理の結果を示す図。
Claims (8)
- 【請求項1】ソースプログラム内の多重ループ内に、そ
の多重ループの内側ループの前に位置し、ある変数の値
を定義する第1の文と、その内側ループに含まれ、その
変数を使用する第2の文との組み合せがあるか否かを判
別し、 その組み合せがあるときには、上記変数の代わりに一時
的に使用する配列の、上記外側ループの繰返し変数を添
え字とする要素でもって上記変数を定義する第3の文
を、上記多重ループ内で、かつ、上記内側ループの前に
付加し、 上記配列の各要素の値を定義するための新たなループと
して、上記多重ループの外側のループの各繰返し時に上
記第1の文により定義される上記変数の値でもって、該
配列の各要素を定義する第4の文を有するループを、該
外側ループに先行する位置に付加し、かつ、該第1の文
を削除し、 上記二つの付加および削除を行なった後の上記ソースプ
ログラムをベクトル化する自動ベクトル化方法。 - 【請求項2】上記ソースプログラム内に、上記多重ルー
プの処理を実行した後の上記変数の最終値を使用する第
5の文がある場合には、上記置換後の多重ループと上記
第5の文の間に、上記変数の最終値を、上記配列の最後
の要素でもって定義する文を追加するステップをさらに
有する請求項1記載の自動ベクトル化方法。 - 【請求項3】ソースプログラム内の多重ループ内に、そ
の多重ループの内側ループに含まれた、ある変数の値を
定義する第1の文と、その内側ループの後に位置する、
その変数を使用する第2の文との組み合せがあるか否か
を判別し、 その組み合せがあるときには、上記変数の代わりに一時
的に使用する配列の、上記外側ループの繰返し変数を添
え字とする要素をその時の上記変数の値により定義する
第3の文を、該内側ループの後に付加し、かつ、該第2
の文を削除し、 上記第2の文で使用される上記変数に代えて上記配列の
各要素を使用するための第4の文を有する新たなループ
を上記多重ループの後に付加し、 上記多重ループに対する付加および削除、ならびに上記
新たなループの付加を行なった後の上記ソースプログラ
ムをベクトル化する自動ベクトル化方法。 - 【請求項4】上記ソースプログラム内に、上記多重ルー
プの処理を実行した後の上記変数の最終値を使用する第
5の文がある場合には、上記追加されたループと上記第
5の文の間に、上記変数の最終値を、上記配列の最後の
要素でもって定義する文を追加するステップをさらに有
する請求項3記載の自動ベクトル化方法。 - 【請求項5】ソースプログラム内の多重ループ内に、そ
の多重ループの内側ループに含まれた、ある変数の値を
定義する第1の文と、その外側ループに含まれ、その内
側ループの前に位置する、その変数を使用する第2の文
との組み合せがあるか否かを判別し、 その組み合せがあるときには、上記変数の代わりに一時
的に使用する配列の、上記外側ループの繰返し変数の次
の値を添え字とする要素を、その時の上記変数の値によ
り定義する第3の文を、該多重ループ内の該内側ループ
の後に付加し、かつ、該第2の文を削除し、 上記第2の文で使用される上記変数に代えて上記配列の
各要素を使用するための第4の文を有する新たなループ
を上記多重ループの後に付加し、 上記外側ループの前に、上記配列の要素のうち、上記外
側ループで使用される最初の要素でもって上記変数の初
期値を定義する第5の文を付加し、 上記多重ループに対する付加および削除、ならびに上記
新たなループの付加および上記第5の文の付加を行なっ
た後の上記ソースプログラムをベクトル化する自動ベク
トル化方法。 - 【請求項6】上記ソースプログラム内に、上記多重ルー
プの処理を実行した後の上記変数の最終値を使用する第
6の文がある場合には、上記追加されたループと上記第
6の文の間に、上記変数の最終値を、上記配列の最後の
要素でもって定義する文を追加するステップをさらに有
する請求項5記載の自動ベクトル化方法。 - 【請求項7】ソースプログラム内の多重ループ内に、そ
の多重ループの内側ループの後に位置する、ある変数の
値を定義する第1の文と、その内側ループに含まれ、そ
の変数を使用する第2の文との組み合せがあるか否かを
判別し、 その組み合せがあるときには、上記変数の代わりに一時
的に使用する配列の、上記外側ループの繰返し変数を添
え字とする要素でもって上記変数を定義する第3の文
を、該多重ループ内で、かつ、内側ループの前に付加
し、かつ、上記第1の文を削除し、 上記配列の各要素の値を定義するための新たなループと
して、上記多重ループの外側のループの各繰返し時に上
記第1の文により定義される上記変数の値でもって、上
記外側ループの繰返し変数の次の値を添え字とする該配
列の各要素を定義する第4の文を有するループを、該外
側ループに先行する位置に付加し、 上記新たなループの前に、上記配列の要素のうち、上記
外側ループで使用される最初の要素でもって上記変数の
初期値を定義する第5の文を付加し、 上記多重ループに対する置換および付加ならびに第5の
文の付加を行なった後の上記ソースプログラムをベクト
ル化する自動ベクトル化方法。 - 【請求項8】上記ソースプログラム内に、上記多重ルー
プの処理を実行した後の上記変数の最終値を使用する第
6の文がある場合には、上記置換後の多重ループと上記
第6の文の間に、上記変数の最終値を、上記配列の最後
の要素でもって定義する文を追加するステップをさらに
有する請求項7記載の自動ベクトル化方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP61239007A JPH0814817B2 (ja) | 1986-10-09 | 1986-10-09 | 自動ベクトル化方法 |
US07/106,120 US4833606A (en) | 1986-10-09 | 1987-10-07 | Compiling method for vectorizing multiple do-loops in source program |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP61239007A JPH0814817B2 (ja) | 1986-10-09 | 1986-10-09 | 自動ベクトル化方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
JPS6394368A JPS6394368A (ja) | 1988-04-25 |
JPH0814817B2 true JPH0814817B2 (ja) | 1996-02-14 |
Family
ID=17038506
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP61239007A Expired - Lifetime JPH0814817B2 (ja) | 1986-10-09 | 1986-10-09 | 自動ベクトル化方法 |
Country Status (2)
Country | Link |
---|---|
US (1) | US4833606A (ja) |
JP (1) | JPH0814817B2 (ja) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104201394A (zh) * | 2014-09-23 | 2014-12-10 | 浙江南都电源动力股份有限公司 | 铅酸蓄电池集流体 |
Families Citing this family (55)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP3053092B2 (ja) * | 1987-06-05 | 2000-06-19 | 株式会社日立製作所 | 並列化コンパイル方法 |
US5396627A (en) * | 1987-11-06 | 1995-03-07 | Hitachi, Ltd. | Method of producing object program based on interprocedural dataflow analysis of a source program |
JP2749039B2 (ja) * | 1987-11-06 | 1998-05-13 | 株式会社日立製作所 | オブジェクト生成方法 |
CA1319757C (en) * | 1988-07-29 | 1993-06-29 | Digital Equipment Corporation | Echelon method for execution of nested loops in multiple processor computers |
EP0353819B1 (en) * | 1988-08-02 | 1997-04-09 | Koninklijke Philips Electronics N.V. | Method and apparatus for synchronizing parallel processors using a fuzzy barrier |
US5313387A (en) * | 1989-06-30 | 1994-05-17 | Digital Equipment Corporation | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers |
US5182806A (en) * | 1989-06-30 | 1993-01-26 | Digital Equipment Corporation | Incremental compiler for source-code development system |
US5325531A (en) * | 1989-06-30 | 1994-06-28 | Digital Equipment Corporation | Compiler using clean lines table with entries indicating unchanged text lines for incrementally compiling only changed source text lines |
US5301327A (en) * | 1989-06-30 | 1994-04-05 | Digital Equipment Corporation | Virtual memory management for source-code development system |
US5201050A (en) * | 1989-06-30 | 1993-04-06 | Digital Equipment Corporation | Line-skip compiler for source-code development system |
US5170465A (en) * | 1989-06-30 | 1992-12-08 | Digital Equipment Corporation | Incremental-scanning compiler for source-code development system |
US5193191A (en) * | 1989-06-30 | 1993-03-09 | Digital Equipment Corporation | Incremental linking in source-code development system |
JPH03111971A (ja) * | 1989-09-27 | 1991-05-13 | Toshiba Corp | ベクトル化診断方式 |
JPH03150636A (ja) * | 1989-11-08 | 1991-06-27 | Matsushita Electric Ind Co Ltd | コンパイル方法 |
US5623650A (en) * | 1989-12-29 | 1997-04-22 | Cray Research, Inc. | Method of processing a sequence of conditional vector IF statements |
US5197130A (en) * | 1989-12-29 | 1993-03-23 | Supercomputer Systems Limited Partnership | Cluster architecture for a highly parallel scalar/vector multiprocessor system |
JPH04211830A (ja) * | 1990-02-05 | 1992-08-03 | Matsushita Electric Ind Co Ltd | 並列化コンパイル方式 |
JPH0475139A (ja) * | 1990-07-18 | 1992-03-10 | Toshiba Corp | ループ並列化装置 |
WO1992003782A1 (en) * | 1990-08-23 | 1992-03-05 | Super-Computer Systems Limited Partnership | Parsing program data streams |
US5247696A (en) * | 1991-01-17 | 1993-09-21 | Cray Research, Inc. | Method for compiling loops having recursive equations by detecting and correcting recurring data points before storing the result to memory |
US5437034A (en) * | 1991-04-19 | 1995-07-25 | Hitachi, Ltd. | Method of generating from source program object program by which final values of variables for parallel execution are guaranteed |
US5293631A (en) * | 1991-08-06 | 1994-03-08 | Hewlett-Packard Company | Analysis and optimization of array variables in compiler for instruction level parallel processor |
JPH05250341A (ja) * | 1991-11-11 | 1993-09-28 | Matsushita Electric Ind Co Ltd | 並列可能性判定装置、及び並列可能性判定方法、並びにそれを用いたプログラム変換装置 |
US5278986A (en) * | 1991-12-13 | 1994-01-11 | Thinking Machines Corporation | System and method for compiling a source code supporting data parallel variables |
US6055627A (en) * | 1992-06-22 | 2000-04-25 | Hitachi, Ltd. | Compiling method of accessing a multi-dimensional array and system therefor |
US5442792A (en) * | 1992-08-07 | 1995-08-15 | Hughes Aircraft Company | Expert system compilation method |
JP2634137B2 (ja) * | 1993-01-27 | 1997-07-23 | インターナショナル・ビジネス・マシーンズ・コーポレイション | ユーザ・インターフェースシステム及び方法 |
AU6774894A (en) * | 1993-04-26 | 1994-11-21 | Comdisco Systems, Inc. | Method for scheduling synchronous data flow graphs |
US5485619A (en) * | 1993-12-29 | 1996-01-16 | International Business Machines Corporation | Array variable transformation system employing subscript table mapping to scalar loop indices |
US5802375A (en) * | 1994-11-23 | 1998-09-01 | Cray Research, Inc. | Outer loop vectorization |
US6049864A (en) * | 1996-08-20 | 2000-04-11 | Intel Corporation | Method for scheduling a flag generating instruction and a subsequent instruction by executing the flag generating instruction in a microprocessor |
US6415264B1 (en) | 1997-07-08 | 2002-07-02 | Walker Digital, Llc | System and method for determining a posting payment amount |
JP3196675B2 (ja) * | 1996-12-27 | 2001-08-06 | 日本電気株式会社 | 言語処理方式 |
US6029005A (en) * | 1997-04-01 | 2000-02-22 | Intel Corporation | Method for identifying partial redundancies in a new processor architecture |
US6031994A (en) * | 1997-04-01 | 2000-02-29 | Intel Corporation | Method for determining the set of variables that may be ambiguously defined at a point in a computer program |
US5991540A (en) * | 1997-04-01 | 1999-11-23 | Intel Corporation | Method for identifying partial redundancies in existing processor architectures |
US6151704A (en) * | 1997-04-01 | 2000-11-21 | Intel Corporation | Method for optimizing a loop in a computer program by speculatively removing loads from within the loop |
US6038398A (en) * | 1997-05-29 | 2000-03-14 | Hewlett-Packard Co. | Method and apparatus for improving performance of a program using a loop interchange, loop distribution, loop interchange sequence |
US7185330B1 (en) * | 2001-01-05 | 2007-02-27 | Xilinx, Inc. | Code optimization method and system |
US7257808B2 (en) * | 2002-01-03 | 2007-08-14 | Intel Corporation | System and method to reduce the size of source code in a processing system |
US7581215B1 (en) * | 2003-06-30 | 2009-08-25 | Sun Microsystems, Inc. | Dependency analysis system and method |
US7487497B2 (en) * | 2004-08-26 | 2009-02-03 | International Business Machines Corporation | Method and system for auto parallelization of zero-trip loops through induction variable substitution |
US8954484B2 (en) * | 2009-06-12 | 2015-02-10 | Cray Inc. | Inclusive or bit matrix to compare multiple corresponding subfields |
US8433883B2 (en) | 2009-06-11 | 2013-04-30 | Cray Inc. | Inclusive “OR” bit matrix compare resolution of vector update conflict masks |
US8583898B2 (en) * | 2009-06-12 | 2013-11-12 | Cray Inc. | System and method for managing processor-in-memory (PIM) operations |
US8826252B2 (en) * | 2009-06-12 | 2014-09-02 | Cray Inc. | Using vector atomic memory operation to handle data of different lengths |
US8458685B2 (en) * | 2009-06-12 | 2013-06-04 | Cray Inc. | Vector atomic memory operation vector update system and method |
US8621448B2 (en) | 2010-09-23 | 2013-12-31 | Apple Inc. | Systems and methods for compiler-based vectorization of non-leaf code |
US9529574B2 (en) | 2010-09-23 | 2016-12-27 | Apple Inc. | Auto multi-threading in macroscalar compilers |
US8949808B2 (en) | 2010-09-23 | 2015-02-03 | Apple Inc. | Systems and methods for compiler-based full-function vectorization |
US8881124B2 (en) | 2010-12-21 | 2014-11-04 | Panasonic Corporation | Compiler device, compiler program, and loop parallelization method |
US9361079B2 (en) * | 2012-01-30 | 2016-06-07 | Nvidia Corporation | Method for compiling a parallel thread execution program for general execution |
US9244677B2 (en) | 2012-09-28 | 2016-01-26 | Intel Corporation | Loop vectorization methods and apparatus |
WO2014142972A1 (en) | 2013-03-15 | 2014-09-18 | Intel Corporation | Methods and systems to vectorize scalar computer program loops having loop-carried dependences |
US10346144B2 (en) * | 2017-09-29 | 2019-07-09 | Intel Corporation | Methods and apparatus to map single static assignment instructions onto a data flow graph in a data flow architecture |
Family Cites Families (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US4374408A (en) * | 1971-06-16 | 1983-02-15 | Burroughs Corporation | Multi-pass system and method for source to source code translation |
US4330822A (en) * | 1971-09-02 | 1982-05-18 | Burroughs Corporation | Recursive system and method for binding compiled routines |
US4435753A (en) * | 1980-10-31 | 1984-03-06 | International Business Machines Corporation | Register allocation system using recursive queuing during source code compilation |
US4437184A (en) * | 1981-07-09 | 1984-03-13 | International Business Machines Corp. | Method of testing a data communication system |
US4456958A (en) * | 1982-06-08 | 1984-06-26 | Burroughs Corporation | System and method of renaming data items for dependency free code |
US4466061A (en) * | 1982-06-08 | 1984-08-14 | Burroughs Corporation | Concurrent processing elements for using dependency free code |
US4468736A (en) * | 1982-06-08 | 1984-08-28 | Burroughs Corporation | Mechanism for creating dependency free code for multiple processing elements |
US4463423A (en) * | 1982-07-14 | 1984-07-31 | Burroughs Corporation | Method of transforming high level language statements into multiple lower level language instruction sets |
US4567574A (en) * | 1983-03-14 | 1986-01-28 | International Business Machines Corporation | Optimizing cobol object code instruction path length with respect to perform statements |
JPS6120129A (ja) * | 1984-07-06 | 1986-01-28 | Hitachi Ltd | 複数コ−ド系情報処理方式 |
JPS6123275A (ja) * | 1984-07-11 | 1986-01-31 | Nec Corp | ベクトル処理装置 |
US4710872A (en) * | 1985-08-07 | 1987-12-01 | International Business Machines Corporation | Method for vectorizing and executing on an SIMD machine outer loops in the presence of recurrent inner loops |
-
1986
- 1986-10-09 JP JP61239007A patent/JPH0814817B2/ja not_active Expired - Lifetime
-
1987
- 1987-10-07 US US07/106,120 patent/US4833606A/en not_active Expired - Lifetime
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104201394A (zh) * | 2014-09-23 | 2014-12-10 | 浙江南都电源动力股份有限公司 | 铅酸蓄电池集流体 |
Also Published As
Publication number | Publication date |
---|---|
US4833606A (en) | 1989-05-23 |
JPS6394368A (ja) | 1988-04-25 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JPH0814817B2 (ja) | 自動ベクトル化方法 | |
JP3664473B2 (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
EP0214751B1 (en) | A method for vectorizing and compiling object code | |
Krall et al. | Compilation techniques for multimedia processors | |
US8024718B2 (en) | System and method for optimizing source code | |
JP3311462B2 (ja) | コンパイル処理装置 | |
Berlin et al. | Compiling scientific code using partial evaluation | |
JP2921190B2 (ja) | 並列実行方式 | |
JPH01121938A (ja) | オブジェクト生成方法 | |
US5396627A (en) | Method of producing object program based on interprocedural dataflow analysis of a source program | |
US6009273A (en) | Method for conversion of a variable argument routine to a fixed argument routine | |
US6993756B2 (en) | Optimization apparatus that decreases delays in pipeline processing of loop and computer-readable storage medium storing optimization program | |
JP3539613B2 (ja) | ループ飛び出し文を含むループに対する配列サマリ解析方法 | |
EP1164477A2 (en) | A loop optimization method and a compiler | |
Naumann et al. | Control flow reversal for adjoint code generation | |
JPH04293150A (ja) | コンパイル方法 | |
Custers | Algorithmic species: Classifying program code for parallel computing | |
EP0423597A2 (en) | Cross iteration common sub-expression elimination | |
JP3551352B2 (ja) | ループ分割方法 | |
JPH09160784A (ja) | 並列化コンパイル方式 | |
JP2801193B2 (ja) | インダクション変数のベクトル化処理装置 | |
JPS62169272A (ja) | ベクトル演算列ル−プアンロ−リング処理方式 | |
JP2853604B2 (ja) | 無限ループのベクトル化処理方式 | |
JP3734658B2 (ja) | コンパイラ装置およびコンパイラプログラムを記録したコンピュータ読取可能な記録媒体 | |
JPH0512033A (ja) | 並列化コンパイル方式 |