JP2023166881A - コンパイラプログラム、情報処理装置およびコンパイラ方法 - Google Patents

コンパイラプログラム、情報処理装置およびコンパイラ方法 Download PDF

Info

Publication number
JP2023166881A
JP2023166881A JP2022077718A JP2022077718A JP2023166881A JP 2023166881 A JP2023166881 A JP 2023166881A JP 2022077718 A JP2022077718 A JP 2022077718A JP 2022077718 A JP2022077718 A JP 2022077718A JP 2023166881 A JP2023166881 A JP 2023166881A
Authority
JP
Japan
Prior art keywords
loop
array
argument
index
subscript
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.)
Pending
Application number
JP2022077718A
Other languages
English (en)
Inventor
茂 木村
Shigeru Kimura
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 JP2022077718A priority Critical patent/JP2023166881A/ja
Priority to US18/160,418 priority patent/US20230367570A1/en
Publication of JP2023166881A publication Critical patent/JP2023166881A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level
    • G06F8/4452Software pipelining
    • 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/451Code distribution
    • G06F8/452Loops
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • G06F9/322Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address
    • G06F9/325Address formation of the next instruction, e.g. by incrementing the instruction counter for non-sequential address for loops, e.g. loop detection or loop counter

Abstract

【課題】多次元ループの配列処理を含むソースコードのコンパイルを最適化する。【解決手段】情報処理装置1は、複数階層のループを含むソースプログラム21において、最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける第1の引数に対応する第1のインデックスおよび第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定し、それぞれ一致する場合には、第1のインデックスおよび第2のインデックスの開始がそれぞれ1であり、且つ第1のインデックスおよび第2のインデックスの増分値が1である場合に、命令コードに含まれるn次元配列の第1の引数と第2の引数とを別の引数に置き換えてn-1次元の配列に変更し、第1のインデックスおよび第2のインデックスのそれぞれのループを統合する。【選択図】図1

Description

本発明は、コンパイラプログラムなどに関する。
コンパイラの最適化手法として、多次元ループの配列処理をループ一重化にするLoop collapseがある。Loop collapse(以降、Lcという場合がある)は、例えば、3次元配列の領域を3重ループでアクセスしている処理を、あたかも1次元配列の領域を1ループでアクセスしているとみなす処理である。
図12は、3次元配列のループ1重化を示す参考図である。図12に示すように、3重ループで処理される3次元配列C(k,j,i)、A(k,j,i)およびB(k,j,i)が、それぞれ1重ループで処理される1次元配列CX(I)、CA(I)およびCB(I)に置き換えられる。
これにより、Lcの最適化処理は、ループネストが減るため、ループ中の分岐命令を減らすことができる。Lcの最適化処理は、分岐命令を減らすことで、有限なハードウェア資源である、分岐予測に使用される分岐テーブルを効率的に利用できる。また、ループ長(ループの中の命令数)が長くなるため、ループ長が長いと有効であるソフトウェアパイプラインなどの最適化がされやすくなる。また、Lcの最適化処理は、1重化処理に先だって、ループのインデックスの最適化により、最内ループの配列の内側からアクセスするように変更することで、メモリを飛び飛びから連続してアクセスすることができる。この結果、キャッシュ効率が向上し、さらに連続域アクセスのハードウェアプリフェッチなどが適用されることとなり、データアクセスの効率が向上する。
すなわち、Loop collapseは、配列を一次元化、および連続域のメモリアクセスになることに着目した最適化手法である。
また、コンパイラの最適化手法として、ループアンロール機能がある。ループアンロール機能は、単純な繰り返しの処理を展開することでループ処理の回数を減らし、プログラムの処理速度を上げる機能である。ループアンロール機能は、分岐命令を減らすことで、有限なハードウェア資源である、分岐予測に使用される分岐テーブルを効率的に利用できる。また、ループアンロール機能は、分岐命令を含まない命令列(基本ブロック)の長さが長くなるので、命令の入れ換えやレジスタの使用の範囲を多く組合せられるため、最適化を促進できる。
特開2017-21726号公報
しかしながら、多次元ループの配列処理を含むソースコードにおいて、コンパイルを最適化できない場合があるという問題がある。例えば、ループを一重化にするLcの最適化では、配列の一次元化および連続域アクセスとなることで性能向上が期待される反面、連続域アクセスとならない場合には、最適化できない。すなわち、完全に1重ループで処理される1次元配列に置き換えられない場合には、最適化できない。
また、ループアンロール機能による最適化では、ハードウェア資源の分岐テーブルの削減効果には貢献できるものの、基本ブロックのコードサイズが増加し、基本ブロックのコード当たりの実行回数が減る現象が発生する。すなわち、コード効率が低下する。また、基本ブロックのコードサイズが増加すると、命令列を一旦命令バッファに貯めておき、命令デコードを省略して命令バッファから直接命令を取り出して実行するハードウェア機構(ショートループ機構)の適用効率が低下してしまう。また、基本ブロックのコードサイズが増加すると、基本ブロックの命令数が増えるので、キャッシュ効率が低下してしまう。
本発明は、1つの側面では、多次元ループの配列処理を含むソースコードのコンパイルを最適化することを目的とする。
1つの態様では、コンパイラプログラムは、複数階層のループを含むソースコードにおいて、最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける前記第1の引数に対応する第1のインデックスおよび前記第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定し、それぞれ一致する場合には、前記第1のインデックスおよび前記第2のインデックスの開始がそれぞれ1であり、且つ前記第1のインデックスおよび前記第2のインデックスの増分値が1である場合に、前記命令コードに含まれる前記n次元配列の前記第1の引数と前記第2の引数とを第3の引数に置き換えてn-1次元の配列に変更し、前記第1のインデックスおよび前記第2のインデックスのそれぞれのループを統合する処理をコンピュータに実行させる。
1実施態様によれば、多次元ループの配列処理を含むソースコードのコンパイルを最適化することができる。
図1は、実施例に係る情報処理装置の機能構成の一例を示すブロック図である。 図2は、ソースプログラムの一例を示す図である。 図3は、ループ管理テーブルの一例を示す図である。 図4は、配列構文情報の一例を示す図である。 図5は、配列定義情報の一例を示す図である。 図6Aは、実施例に係る最適化を説明する図(1)である。 図6Bは、実施例に係る最適化を説明する図(2)である。 図6Cは、実施例に係る最適化を説明する図(3)である。 図6Dは、実施例に係る最適化を説明する図(4)である。 図7は、配列のメモリ領域を用いて最適化を説明する図である。 図8Aは、実施例に係る最適化の一例を示す図(1)である。 図8Bは、実施例に係る最適化の一例を示す図(2)である。 図8Cは、実施例に係る最適化の一例を示す図(3)である。 図9は、実施例に係る最適化の別の例を示す図である。 図10は、実施例に係る最適化処理のフローチャートの一例を示す図である。 図11は、コンパイラプログラムを実行するコンピュータの一例を示す図である。 図12は、3次元配列のループ1重化を示す参考図である。
以下に、本願の開示するコンパイラプログラム、情報処理装置およびコンパイラ方法の実施例を図面に基づいて詳細に説明する。なお、本発明は、実施例により限定されるものではない。
[実施例に係る情報処理装置の機能構成]
図1は、実施例に係る情報処理装置の機能構成の一例を示すブロック図である。図1に示す情報処理装置1は、多重ループを含むソースプログラム21のコンパイラの最適化手法に関わり、ループネストを削減し、ループの回転数を多くして、基本ブロックのコード当たりの実行回数を増加させる。これにより、情報処理装置1は、ループネストを削減することで、ループ中の分岐命令を削減することができ、分岐予測に使用される分岐テーブルを効率的に利用できるようになる。また、情報処理装置1は、ループネストを削減することで、基本ブロックのコード当たりの実行回数を増加させることができ、ループの実行密度を高めることができる。そして、情報処理装置1は、命令列を一旦命令バッファに貯めておき、命令デコードを省略して命令バッファから直接命令を取り出して実行するハードウェア機構(ショートループ機構)の適用効率を向上させることができる。なお、多重ループとは、ループが入れ子となった階層構造のループのことをいう。基本ブロックとは、分岐命令を含まない命令列のことをいう。
ここで、実施例に係る情報処理装置1で扱うソースプログラム21の一例を、図2を参照して説明する。図2は、ソースプログラムの一例を示す図である。図2には、FORTRAN言語で記述されたソースプログラム21が表わされている。図2に示すソースプログラム21は、3次元配列を、3重ループで処理するプログラムである。各DOループについて、ネストレベルが「1」を示す制御変数「x」は、初期値として「1」、終値として「10」、増分値として「1」を示している。ネストレベルが「2」を示す制御変数「y」は、初期値として「1」、終値として「20」、増分値として「1」を示している。ネストレベルが「3」を示す制御変数「z」は、初期値として「1」、終値として「30」、増分値として「1」を示している。配列のサイズは、図示していないが、ソースプログラム21に配列の宣言として記述される。ここでは、ソースプログラム21は、3次元配列を3重ループで処理する一例を示したが、配列の次元数やループ数に限定されない。また、言語についても、FORTRANに限定されず、C言語などであっても良い。
図1に戻って、情報処理装置1は、制御部10と、記憶部20とを有する。制御部10は、構文解析部11、最適化部12およびコード生成部13を有する。記憶部20は、ループデータ記憶部20-1および配列データ記憶部20-2を有する。ループデータ記憶部20-1は、ソースプログラム21に記述されるループに関する情報を記憶する。ループデータ記憶部20-1は、ループ管理テーブル22を有する。配列データ記憶部20-2は、ソースプログラム21に記述される配列に関する情報を記憶する。配列データ記憶部20-2は、配列構文情報23および配列定義情報24を有する。
ループ管理テーブル22は、ソースプログラム21に記述される多重ループごとのループに関する情報である。なお、ループ管理テーブル22は、後述する構文解析部11によって生成される。
ここで、ループ管理テーブル22の一例を、図3を参照して説明する。図3は、ループ管理テーブルの一例を示す図である。図3に示すように、ループ管理テーブル22は、1つの多重ループについて、ネストレベル、制御変数、初期値、終値、増分値、配列構文情報および兄弟フラグを対応付けて記憶する。ネストレベルは、最内ループを1としてループの入れ子の深さを示す。制御変数は、インデックスを制御する変数である。初期値は、制御変数の初期値を示す。終値は、制御変数の終値を示す。終値は、定数である。増分値は、制御変数の増分値を示す。配列構文情報は、多重ループに対応する配列の配列構文情報23のアドレスを示す。なお、配列構文情報23については、後述する。
兄弟フラグは、ループの階層構造のネスト中に並行して、ループ以外の処理を含むか否かを示すフラグである。例えば、兄弟フラグは、FORTRAN言語の場合、ループの階層構造のネスト中に並行して、DO文以外の処理を含む場合に「1」が設定され、DO文以外の処理を含まない場合に「0」が設定される。
一例として、ネストレベルが「1」である場合に、制御変数として「x」、初期値として「1」、終値として「10」、増分値として「1」、配列構文情報として配列構文情報アドレス、兄弟フラグとして「0」を記憶している。ネストレベルが「2」である場合に、制御変数として「y」、初期値として「1」、終値として「20」、増分値として「1」、配列構文情報として「-」、兄弟フラグとして「0」を記憶している。ネストレベルが「3」である場合に、制御変数として「z」、初期値として「1」、終値として「30」、増分値として「1」、配列構文情報として「-」、兄弟フラグとして「0」を記憶している。
配列構文情報23は、ソースプログラム21に記述される配列の構文情報である。配列構文情報23は、ループのネストレベルに対応する配列の添字次元ごとに添字を格納したテーブルである。なお、配列構文情報23は、後述する構文解析部11によって生成される。
ここで、配列構文情報23の一例を、図4を参照して説明する。図4は、配列構文情報の一例を示す図である。図4に示すように、配列構文情報23は、配列名に対し、添字次元と、添字とを対応付けた情報である。添字は、配列が示す要素に割り振られた添字次元ごとの番号を示し、変数で与えられる。添字は、関数で与えられる場合もある。一例として、配列名が「a3」である場合に、添字次元が「1」の添字が関数「mod(x,3)+1」、添字次元が「2」の添字が変数「y」、添字次元が「3」の添字が変数「z」を記憶している。この情報は、配列がa3(mod(x,3)+1,y,z)の場合である。同様に、配列名が「b3」である場合に、添字次元が「1」の添字が関数「mod(x,3)+1」、添字次元が「2」の添字が変数「y」、添字次元が「3」の添字が変数「z」を記憶している。この情報は、配列がb3(mod(x,3)+1,y,z)の場合である。
図1に戻って、配列定義情報24は、ソースプログラム21に記述される配列の定義情報である。なお、配列定義情報24は、後述する構文解析部11によって生成される。
ここで、配列定義情報24の一例を、図5を参照して説明する。図5は、配列定義情報の一例を示す図である。図5に示すように、配列定義情報24は、配列名、次元数、添字次元および定義サイズを対応付けた情報である。次元数は、配列名が示す配列の次元の数を示す。添字次元は、配列構文情報23の添字次元に対応する。定義サイズは、添字次元ごとの配列のサイズである。
一例として、配列名が「a3」である場合に、次元数として「3」を記憶している。そして、添字次元が「1」の定義サイズとして「10」、添字次元が「2」の定義サイズとして「20」、添字次元が「3」の定義サイズとして「30」を記憶している。
図1に戻って、構文解析部11は、ソースプログラム21の構文を解析する。例えば、構文解析部11は、ソースプログラム21に記述されたループを解析し、解析結果をループ管理テーブル22に格納する。構文解析部11は、ソースプログラム21に記述されたループ内の配列を解析し、解析結果を配列構文情報23および配列定義情報24に格納する。一例として、構文解析部11は、ソースプログラム21に記述された配列の宣言を解析し、解析した配列名に対する添字次元ごとの定義サイズを配列定義情報24に格納する。
最適化部12は、ソースプログラム21を最適化する。最適化部12は、配列解析部121、抽出部122および統合部123を有する。なお、配列解析部121は、判定部、変更部の一例である。抽出部122は、変更部の一例である。統合部123は、統合部の一例である。
配列解析部121は、最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の添字および第2の添字の配列サイズと、ループにおける第1の添字に対応する第1のインデックスおよび前記第2の添字に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定する。なお、配列解析部121は、ループ管理テーブル22を参照して、対象の多重ループのいずれかのネストレベルで兄弟フラグが設定されている場合には、兄弟処理を別処理にするようにする。すなわち、配列解析部121は、兄弟処理をループ分割したうえで、兄弟処理を含まない多重ループ構成に変換してから配列を解析する。この後または並行して、配列解析部121は、兄弟処理の配列を解析する。
例えば、配列解析部121は、多重ループの最内ループで、命令コードに含まれる配列を選択する。配列解析部121は、選択した配列の1からn(次元数)までの添字次元kについて、以下の<1><2>の条件を満たすかを判定する。
<1>配列構文情報23の対象の配列の添字次元kに対応する添字と、ループ管理テーブル22の、添字次元kと同一のネストレベルkに対応する制御変数が一致すること。
<2>ループ管理テーブル22のネストレベルkに対応する初期値が「1」であり、増分値が「1」であり且つ終値が配列定義情報24の添字次元kに対応する定義サイズと一致すること。
すなわち、<2>の条件は、ループのネストレベルkの回転数が添字次元kの配列の定義サイズと一致するか否かを判定する。
抽出部122は、命令コードに含まれるn次元配列の連続した添字次元について、<1><2>の条件を満たすと判定した場合には、連続した添字次元に対応するネストレベルのループを削減対象として抽出する。
統合部123は、命令コードに含まれるn次元配列の第1の添字と第2の添字とを別名の添字に置き換えてn-1次元の配列に変更する。加えて、統合部123は、第1の添字に対応する第1のインデックスを用いたループを削除し、別名の添字に対応する第2のインデックスの終値を変更することで、ループを統合する。
例えば、統合部123は、配列について、<1><2>の条件を満たすと判定された、連続した添字次元の小さい方の次元を置き換え次元とし、置き換え次元の添字を各次元の添字(制御変数)を結合して得られた添字(制御変数)に置き換える。そして、統合部123は、ループ中の配列を置き換える。
加えて、統合部123は、ループについて、連続する添字次元のうち最大次元以外のネストレベルのループを削除する。そして、統合部123は、ループ管理テーブル22を参照して、最大次元のループの終値を、連続する添字次元に対応するネストレベルの終値を乗算した値に変更する。そして、統合部123は、対応するループの制御変数を、配列において置き換えた制御変数(添字)に変更する。
コード生成部13は、変更したソースプログラムを中間コードに変換する。そして、コード生成部13は、中間コードを機械語プログラム30に変換する。
[最適化の説明]
ここで、実施例に係る最適化について、図6A~図6Dを参照して説明する。図6A~図6Dは、実施例に係る最適化を説明する図である。
まず、図6Aを用いて、配列サイズが(x,y)の2次元配列A(i,j)に対するメモリアクセスについて考える。ここでは、配列サイズは、図6A右図に示すように、xを「5」とし、yを「10」として、宣言されるとする。ソースプログラム21は、図6A左図に示すプログラムを一部に含むものとする。最内ループ内に2次元配列A(i,j)が記述されている。かかるソースプログラム21では、添字jが1である場合に、最内ループの添字iが1~5の順に、2次元配列A(i,1)のアドレスがアクセスされる。次に、添字jが2である場合に、最内ループの添字iが1~5の順に、2次元配列A(i,2)のアドレスがアクセスされる。
かかる2次元配列Aの先頭域から添字(i,j)の配列要素の相対位置は、要素サイズをLとすると、以下の式(1)で求められる。Lは、Integerである場合には、4バイトである。
添字(i,j)の配列要素の相対位置={(i-1)+(j-1)*x}*L・・(1)
例えば、図6A中図に示すように、A(1,1)の配列要素の相対位置は、0である。A(2,1)の配列要素の相対位置は、1である。A(5,1)の配列要素の相対位置は、4である。A(5,2)の配列要素の相対位置は、9である。したがって、かかるソースプログラム21および配列サイズの場合には、かかる配列サイズのメモリは、昇順にアクセスされる。
同様に、配列サイズがLである3次元配列A(i,j,k)の場合、3次元配列Aの先頭域から添字(i,j,k)の配列要素の相対位置は、以下の式(2)で求められる。
添字(i,j,k)の配列要素の相対位置={(i-1)+(j-1)*x+(k-1)*(x*y)}*L・・(2)
つまり、前提として、配列Aの配置アドレス方向に(昇順に)メモリをアクセスするためには、配列Aの添字の次元の小さい方から順にメモリをアクセスするようにループを対応付けることが必要である。
図6Bに示すように、配列サイズが(x,y,z)の3次元配列A(i,j,k)についてメモリアクセスするとする。ここでは、ソースプログラム21は、図6B上段に示すプログラムであるとする。最内ループ内に3次元配列A(i,j,t(k))が記述されている。かかる3次元配列Aの添字次元が「3」の添字は、「t(k)」であり、最外ループのループ変数kを用いた関数「t(k)」で計算される番号である。
かかる3次元配列Aの先頭域からの位置のオフセットOffset3は、要素サイズをLとすると、式(2)を用いて、以下の式(3)で求められる。
Offset3(A(i,j,t(k)))={(i-1)+(j-1)*x+(t(k)-1)*(x*y)}*L・・(3)
ここで、3次元配列Aについて、添字次元が「2」の添字を「1」とし、添字次元が「1」の添字を「ij」とした場合の3次元配列A(ij,1,t(k))の先頭域からの位置のオフセットoffset3は、式(2)を用いて、以下の式(4)で求められる。
Offset3(A(ij,1,t(k)))={(ij-1)+(t(k)-1)*(x*y)}*L・・(4)
かかる3次元配列Aのソースプログラム21は、図6B中段で表わされる。すなわち、3次元配列Aについて、添字次元「2」の添字が「1」であり、添字次元「1」の添字が「ij」である。加えて、ネストレベル「2」の制御変数「j」の終値が「1」であり、ネストレベル「1」の制御変数「ij」の終値が変更前の制御変数「j」の終値「y」と制御変数「i」の終値「x」とを乗じた値(回転数)「xy」になる。
一方、配列サイズが((x*y),*)の2次元配列A(ij,t(k))の先頭域からの位置のオフセットoffset2は、式(1)を用いて、以下の式(5)で求められる。
Offset2(A(ij,t(k)))={(ij-1)+(t(k)-1)*(x*y}}*L・・(5)
そして、かかる2次元配列Aのソースプログラム21は、図6B下段で表わされる。
かかる式(5)は、式(4)と一致する。
Offset2(A(ij,t(k)))=Offset3(A(ij,1,t(k)))
つまり、2次元配列A(ij,t(k))の先頭域からアクセスする位置のオフセットは、3次元配列A(ij,1,t(k))の先頭域からの位置のオフセットと一致する。
すなわち、ある配列のアクセスサイズ(定義サイズ)がループの回転数(x*y)と等しい場合には、3次元配列を2次元配列のループアクセスとみなすことができる。これは、n次元配列Aをn-1次元配列Aに置き換え、ループ統合することで、ループネストを削減することができることを意味する。つまり、n-1次元配列Aは、n次元配列Aの配列次元を1つ減らしたアクセスとなるため、ソースプログラム21は、ループを統合することでループネストを減らすことができる。ループネストを減らすことで、ソースプログラム21は、ループ中の分岐削減、基本ブロックの実行回数の増大、ループの実行密度を高めることができる。そして、ソースプログラム21は、分岐予測に使用される分岐テーブルを効率的に利用できる。ソースプログラム21は、命令列を一旦命令バッファに貯めておき、命令デコードを省略して命令バッファから直接命令を取り出して実行するハードウェア機構(ショートループ機構)を効率的に適用できる。
図6C左図に示す3次元配列も、図6C右図に示す2次元配列のループアクセスとみなすことができる。ここでは、配列サイズが(x,y,z)の3次元配列Aの先頭域から添字(i,j,k)の配列要素の相対位置を、Offset3(A(i,j,k),d(x,y,z))とする。同様に、配列サイズが(x,y)の2次元配列Aの先頭域から添字(i,j)の配列要素の相対位置をOffset2(A(i,j),d(x,y))とする。
すると、3次元配列Aの先頭域からの位置のオフセットOffset3(A(i,j,k),d(x,y,*))は、以下のように求められる。
Offset3(A(i,j,k),d(x,y,*))={(i-1)+(j-1)*x+(k-1)*(x*y)}*L
また、添字次元が「2」の添字を「1」とした場合の、Offset3(A(ij,1,k),d(x,y,*))は、以下のように求められる。
Offset3(A(ij,1,k),d(x,y,*))={(ij-1)+(k-1)*(x*y)}*L
かかるOffset3(A(ij,1,k),d(x,y,*))は、2次元配列のアクセスサイズがループ回転数(x*y)と等しいので、Offset2(A(ij,k),d(x,y,*))と一致する。
また、添字次元が「3」の添字を「1」とした場合の、Offset3(A(i,jk,1),d(x,y,*))は、以下のように求められる。
Offset3(A(i,jk,1),d(x,y,*))={(i-1)+(jk-1)*(x*y)}*L
かかるOffset3(A(i,jk,1),d(x,y,*))は、2次元配列のアクセスサイズがループ回転数(x*y)と等しいので、Offset2(A(i,jk),d(x,y,*))と一致する。
したがって、添字次元が「1」の添字を関数i(k)とした場合であっても、図6Cに示すように、3次元配列A(i(k),j,k)を2次元配列A(i(k),jk)のループアクセスとみなすことができる。これは、配列のアクセスサイズ(定義サイズ)がループの回転数(x*y)と等しいからである。
図6D左図に示す4次元配列も、図6D右図に示す3次元配列のループアクセスとみなすことができる。ここでは、配列サイズが(x,y,z,w)の4次元配列Aの先頭域から添字(i,j,k,m)の配列要素の相対位置を、Offset4(A(i,j,k,m),d(x,y,z,w))とする。
すると、4次元配列Aの先頭域からの位置のオフセットOffset4(A(i,j,k,m),d(x,y,z,*))は、以下のように求められる。
Offset4(A(i,j,k,m),d(x,y,z,*))={(i-1)+(j-1)*x+(k-1)*(x*y)+(m-1)*(x*y*z)}*L
また、添字次元が「2」の添字を「1」とした場合の、Offset4(A(ij,1,k,m),d(x,y,z,*))は、以下のように求められる。
Offset4(A(ij,1,k,m),d(x,y,z,*))={(ij-1)+(k-1)*(x*y)+(m-1)*(x*y*z)}*L
かかるOffset4(A(ij,1,k,m),d(x,y,z,*))は、Offset3(A(ij,k,m),d(x*y,z,*))と一致する。
したがって、添字次元が「4」の添字を関数「t(m)」とした場合であっても、図6Dに示すように、4次元配列A(i,j,k,t(m))を3次元配列A(ij,k,t(m))のループアクセスとみなすことができる。これは、配列のアクセスサイズ(定義サイズ)がループの回転数(x*y)と等しいからである。
同様に、4次元配列A(i,j,k,m)の隣り合う添字j,kについて、ループ回転数y*zが定義サイズと一致する場合、4次元配列A(i,jk,1,m)を3次元配列A(i,jk,m)とみなし、ループネストを4ループから3ループに削減できる。同様に、4次元配列A(i,j,km,1)からループ回転数x*yの3次元配列A(i,j,km)にみなしてループネストを4ループから3ループに削減できる。同様に、4次元配列A(ijk,1,1,m)からループ回転数x*y*zの2次元配列A(ijk,m)とみなしてループネストを4ループから2ループに削減できる。同様に、同様に、4次元配列A(i,j,k,m)をA(ij,1,km,1)と変形し、ループ回転数をx*y、z*wの2次元配列A(ij,kj)とみなしてループネストを4ループから2ループに削減できる。
図7は、配列のメモリ領域を用いて最適化を説明する図である。なお、図7では、3次元配列の配列サイズが(4,6,2)である場合とする。
図7上段には、配列サイズが(4,6,2)の3次元配列A3(i,j,k)におけるメモリ領域の位置オフセットOffset3(A3(i,j,k))が表わされている。各行の配列のメモリ領域には、添字iが1~4に対応する要素が位置付けられる。各列の配列のメモリ領域には、添字jが1~6に対応する要素が位置付けられる。そして、1行~6行の配列のメモリ領域には、添字kが1に対応する要素が位置付けられ、7行~12行の配列のメモリ領域には、添字kが2に対応する要素が位置付けられる。
図7中段には、配列サイズが(24,1,2)の3次元配列A3(i,1,k)におけるメモリ領域の位置オフセットOffset3(A3(i,1,k))が表わされている。1行~6行の配列のメモリ領域には、添字kが1および添字jが1に対応する要素が添字i(1~24)を替えてアドレス方向に位置付けられる。7行~12行の配列のメモリ領域には、添字kが2および添字jが1に対応する要素が添字i(1~24)を替えてアドレス方向に位置付けられる。すなわち、配列サイズが(4,6,2)のA3(i,j,k)の先頭域からアクセスする位置のオフセットは、配列サイズが(24,1,2)のA3(i,1,k)の先頭域からの位置のオフセットと一致する。どちらの配列も、配列の先頭域から昇順にアクセスすることがわかる。
一方、図7下段には、配列サイズ(24,2)の2次元配列A2(i,k)におけるメモリ領域の位置オフセットOffset2(A2(i,k))が表わされている。1行~6行の配列のメモリ領域には、添字kが1に対応する要素が添字i(1~24)を替えてアドレス方向に位置付けられる。7行~12行の配列のメモリ領域には、添字kが2に対応する要素が添字i(1~24)を替えてアドレス方向に位置付けられる。
そうすると、Offset2(A2(i,k))は、Offset3(A3(i,1,k))と一致する。つまり、2次元配列A2(i,k)の先頭域からアクセスする位置のオフセットは、3次元配列A3(i,1,k)の先頭域からの位置のオフセットと一致する。どちらの配列も、配列の先頭域から昇順にアクセスする。
すなわち、配列のアクセスサイズ(定義サイズ)がループの回転数(6*4)と等しい場合には、3次元配列を2次元配列のループアクセスとみなすことができる。これは、n次元配列Aをn-1次元配列Aに置き換え、ループ統合することで、ループネストを削減することができることを意味する。つまり、n-1次元配列Aは、n次元配列Aの配列次元を1つ減らしたアクセスとなるため、ソースプログラム21は、ループを統合することでループネストを減らすことができる。
このように、実施例に係る最適化処理では、3次元配列A(i,j,k)を2次元配列A(ij,k)に置き換え、ループ統合することでループネストを削減できると説明した。ここで、コンパイラ内部では、ループ統合する添字部分を「1」と扱う(A(ij,1,k)に置き換える)ようにすることで、配列の次元を減らさなくても同一の次元数の配列定義情報24をそのまま使用できる。したがって、以降では、配列の次元削減では、削減対象となる次元の添字を「1」として同一の次元数の配列定義情報24を使用する例について説明する。
[最適化の一例]
図8Aは、実施例に係る最適化の一例を示す図(1)である。図8A左図には、ソースプログラム21が表わされている。構文解析部11は、このソースプログラム21に記述されたループを解析し、解析結果を図3に示すループ管理テーブル22に格納したとする。構文解析部11は、ソースプログラム21に記述されたループ内の配列を解析し、解析結果を図4に示す配列構文情報23および図5に示す配列定義情報24に格納したとする。
配列解析部121は、ループ管理テーブル22のネストレベルを1から最終レベルまで検索する。配列解析部121は、ループ管理テーブル22のネストレベルkに対応する制御変数と、配列構文情報23の対象の配列の添字次元kに対応する添字が一致する(<1>)か否かを判定する。また、配列解析部121は、ループ管理テーブル22のネストレベルkに対応する初期値が「1」であり、増分値が「1」である、且つ終値が配列定義情報24の添字次元kに対応する定義サイズと一致する(<2>)か否かを判定する。すなわち、<2>の条件は、ループのネストレベルkの回転数が添字次元kの配列サイズと一致するか否かを判定する。
ここでは、ネストレベルが「1」の場合には、<1>について、ネストレベルk(=1)の制御変数は「x」であるが、配列a3の添字次元k(=1)の添字が「mod(x,3)+1」であり、一致しないため、条件を満たさない。
ネストレベルが「2」の場合には、<1>について、ネストレベルk(=2)の制御変数は「y」であり、配列a3の添字次元k(=2)の添字が「y」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=2)に対応する初期値は「1」であり、増分値は「1」であり、終値「10」は、配列定義情報24の添字次元k(=2)に対応する定義サイズ「10」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
次に、ネストレベルが「3」の場合には、<1>について、ネストレベルk(=3)の制御変数は「z」であり、配列a3の添字次元k(=3)の添字が「z」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=3)に対応する初期値は「1」であり、増分値は「1」であり、終値「30」は、配列定義情報24の添字次元k(=3)に対応する定義サイズ「30」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
配列b3も配列a3と同じ結果となる。
そして、連続したネストレベルkで<1><2>の条件を満たしたので、抽出部122は、対象の配列a3、b3を抽出する。抽出部122は、連続したネストレベルkのループ2,3を削減可能なループとして抽出する。
そして、統合部123は、連続する次元「2」,「3」の小さい方「2」を置き換え次元とし、各次元の添字を結合して得られた変数「yz」に置き換える。また、統合部123は、置き換え次元でない方「3」の添字「z」を定数「1」に置き換える。ここでは、配列a3、b3は、以下の左式から右式へ置き換えられる。
a3(mod(x,3)+1,y,z)→a3(mod(x,3)+1,yz,1)
b3(mod(x,3)+1,y,z)→a3(mod(x,3)+1,yz,1)
そして、統合部123は、連続する次元の小さい方「2」に対応するネストレベル「2」のループを削減する。そして、統合部123は、統合するループの終値を、ループ管理テーブル22を参照して、連続したネストレベルの各ループの終値を乗じた回転数(20*30)に変更する。そして、統合部123は、統合するループの制御変数を、配列で置き換えられた変数yzに変更する。ここでは、「do y=1,20」が削除される。そして、「do z=1,30」が「do yz=1,20*30」に変更される。
この結果、図8A左図に示すソースプログラム21は、図8A右図に示すプログラムに変更される。
図8Aでは、2つのループを1つのループに統合する場合を説明した。しかしながら、2つのループを1つのループに統合する場合に限定されず、3つ以上のループを1つのループに統合する場合であっても良い。そこで、3つ以上のループを1つのループに統合する場合を、図8Bを参照して説明する。
図8Bは、実施例に係る最適化の一例を示す図(2)である。なお、図8Bに示す配列名がa4およびb4の定義サイズは、それぞれ(10,20,30,40)であるとする。図8B左図には、ソースプログラム21が表わされている。ネストレベルが「1」の場合には、<1>について、ネストレベルk(=1)の制御変数は「x」であるが、配列a4の添字次元k(=1)の添字が「mod(x,3)+1」であり、一致しないため、条件を満たさない。
ネストレベルが「2」の場合には、<1>について、ネストレベルk(=2)の制御変数は「y」であり、配列a4の添字次元k(=2)の添字が「y」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=2)に対応する初期値は「1」であり、増分値は「1」であり、終値「20」は、配列定義情報24の添字次元k(=2)に対応する定義サイズ「20」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
次に、ネストレベルが「3」の場合には、<1>について、ネストレベルk(=3)の制御変数は「z」であり、配列a4の添字次元k(=3)の添字が「z」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=3)に対応する初期値は「1」であり、増分値は「1」であり、終値「30」は、配列定義情報24の添字次元k(=3)に対応する定義サイズ「30」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
次に、ネストレベルが「4」の場合には、<1>について、ネストレベルk(=4)の制御変数は「w」であり、配列a4の添字次元k(=4)の添字が「w」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=4)に対応する初期値は「1」であり、増分値は「1」であり、終値「40」は、配列定義情報24の添字次元k(=4)に対応する定義サイズ「40」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
配列b4も配列a4と同じ結果となる。
そして、連続したネストレベルkで<1><2>の条件を満たしたので、抽出部122は、対象の配列a4、b4を抽出する。抽出部122は、連続したネストレベルkのループ2,3,4を削減可能なループとして抽出する。
そして、統合部123は、連続する次元「2」,「3」、「4」の小さい方「2」を置き換え次元とし、各次元の添字を結合して得られた変数「yzw」に置き換える。また、統合部123は、置き換え次元でない方「3」および「4」の添字「z」および「w」をそれぞれ定数「1」に置き換える。ここでは、配列a4、b4は、以下の左式から右式へ置き換えられる。
a4(mod(x,3)+1,y,z,w)→a4(mod(x,3)+1,yzw,1,1)
b4(mod(x,3)+1,y,z,w)→a4(mod(x,3)+1,yzw,1,1)
そして、統合部123は、連続する次元の小さい方「2」および「3」に対応するネストレベル「2」および「3」のループを削減する。そして、統合部123は、統合するループの終値を、ループ管理テーブル22を参照して、連続したネストレベルの各ループの終値を乗じた回転数(20*30*40)に変更する。そして、統合部123は、統合するループの制御変数を、配列で置き換えられた変数yzwに変更する。ここでは、「do y=1,20」および「do z=1,30」が削除される。そして、「do w=1,40」が「do yzw=1,20*30*40」に変更される。
また、図8Aでは、2つのループを1つのループに統合する場合を説明した。図8Bでは、3つ以上のループを1つのループに統合する場合を説明した。しかしながら、3つ以上のループを1つのループに統合する場合に限定されず、ループ内に複数の削減対象のループがある場合であっても良い。そこで、ループ内に複数の削減対象のループがある場合を、図8Cを参照して説明する。
図8Cは、実施例に係る最適化の一例を示す図(3)である。なお、図8Cに示す配列名がa5およびb5の定義サイズは、それぞれ(10,20,30,40,50)であるとする。図8C左図には、ソースプログラム21が表わされている。
ネストレベルが「3」の場合には、<1>について、ネストレベルk(=3)の制御変数は「z」であるが、配列a5の添字次元k(=3)の添字が「mod(z,DV1)+1」であり、一致しないため、条件を満たさない。
ネストレベルが「1」の場合には、<1>について、ネストレベルk(=1)の制御変数は「x」であり、配列a5の添字次元k(=1)の添字が「x」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=1)に対応する初期値は「1」であり、増分値は「1」であり、終値「10」は、配列定義情報24の添字次元k(=1)に対応する定義サイズ「10」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
また、ネストレベルが2の場合には、<1>について、ネストレベルk(=2)の制御変数は「y」であり、配列a5の添字次元k(=2)の添字が「y」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=2)に対応する初期値は「1」であり、増分値は「1」であり、終値「20」は、配列定義情報24の添字次元k(=2)に対応する定義サイズ「20」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
次に、ネストレベルが4の場合には、<1>について、ネストレベルk(=4)の制御変数は「w」であり、配列a5の添字次元k(=4)の添字が「w」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=4)に対応する初期値は「1」であり、増分値は「1」であり、終値「40」は、配列定義情報24の添字次元k(=4)に対応する定義サイズ「40」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
また、ネストレベルが5の場合には、<1>について、ネストレベルk(=5)の制御変数は「a」であり、配列a5の添字次元k(=5)の添字が「a」であり、一致するため、条件を満たす。また、<2>について、ネストレベルk(=5)に対応する初期値は「1」であり、増分値は「1」であり、終値「50」は、配列定義情報24の添字次元k(=5)に対応する定義サイズ「50」と一致するため、条件を満たす。ループの回転数は、配列定義(配列のアクセスサイズ)と一致する。
配列b4も配列a4と同じ結果となる。
そして、連続したネストレベル「1」,「2」および「4」,「5」で<1><2>の条件を満たしたので、抽出部122は、対象の配列a5、b5を抽出する。抽出部122は、連続したネストレベルkのループ「1」,「2」および「4」,「5」を削減可能なループとして抽出する。
そして、統合部123は、連続する次元「1」,「2」の小さい方「1」を置き換え次元とし、各次元の添字を結合して得られた変数「xy」に置き換える。また、統合部123は、置き換え次元でない方「2」の添字「y」を定数「1」に置き換える。また、統合部123は、連続する次元「4」,「5」の小さい方「4」を置き換え次元とし、各次元の添字を結合して得られた変数「wa」に置き換える。また、統合部123は、置き換え次元でない方「5」の添字「a」を定数「1」に置き換える。ここでは、配列a5、b5は、以下の左式から右式へ置き換えられる。
a5(x,y,mod(z,DV1)+1,w,a)→a5(xy,1,mod(z,DV1)+1,wa,1)
b5(x,y,mod(z,DV1)+1,w,a)→b5(xy,1,mod(z,DV1)+1,wa,1)
そして、統合部123は、連続する次元の小さい方「1」に対応するネストレベル「1」のループを削減する。そして、統合部123は、統合するループの終値を、ループ管理テーブル22を参照して、連続したネストレベルの各ループの終値を乗じた回転数(10*20)に変更する。そして、統合部123は、統合するループの制御変数を、配列で置き換えられた変数「xy」に変更する。また、統合部123は、もう1つの連続する次元の小さい方「4」に対応するネストレベル「4」のループを削減する。そして、統合部123は、統合するループの終値を、ループ管理テーブル22を参照して、連続したネストレベルの各ループの終値を乗じた回転数(40*50)に変更する。そして、統合部123は、統合するループの制御変数を、配列で置き換えられた変数「wa」に変更する。ここでは、「do x=1,10」および「do w=1,40」が削除される。そして、「do y=1,20」が「do xy=1,10*20」に変更される。「do a=1,50」が「do wa=1,40*50」に変更される。
[最適化の別の例]
図9は、実施例に係る最適化の別の例を示す図である。図9に示すソースプログラム21には、ネストレベルが「2」のループに兄弟処理が含まれている。ループ管理テーブル22のネストレベル「2」に対応する兄弟フラグに「1」が設定される。
配列解析部121は、ループ管理テーブル22を参照して、多重ループのネストレベル「2」で兄弟フラグが設定されているので、兄弟処理を別処理とする。すなわち、配列解析部121は、兄弟処理を符号d1に示すようにループ分割する。そして、配列解析部121は、符号d2に示すように兄弟処理を含まない多重ループ構成にしてから配列を解析する。また、配列解析部121は、ループ分割した兄弟処理の多重ループ構成の配列を解析する。これにより、配列解析部121は、兄弟処理を別処理とすることで、最適化を簡易化できる。
[最適化処理のフローチャート]
図10は、実施例に係る最適化処理のフローチャートの一例を示す図である。なお、構文解析部11は、ソースプログラム21に対するループ管理テーブル22、配列構文情報23および配列定義情報24を生成したものとする。
図10に示すように、配列解析部121は、ループ管理テーブル22(DOTBLと略記)のネストレベル(lvl)を選択する(ステップS11)。
そして、配列解析部121は、ネストレベルに対応する兄弟フラグが設定されているか否かを判定する(ステップS12)。兄弟フラグが設定されていると判定した場合には(ステップS12;Yes)、配列解析部121は、兄弟処理をループ分割する(ステップS13)。そして、配列解析部121は、兄弟処理を含まない多重ループ構成と、兄弟処理とをそれぞれ最適化処理を実行すべく、ステップS14に移行する。
一方、兄弟フラグが設定されていないと判定した場合には(ステップS12;No)、配列解析部121は、ステップS14に移行する。
ステップS14において、配列解析部121は、配列構文情報23を参照する(ステップS14)。配列解析部121は、配列名の添字次元(lvl)に対応する記述ASTRがDOTBLの制御変数と一致するか否かを判定する(ステップS15)。すなわち、配列解析部121は、配列構文情報23の対象の配列の添字次元lvlに対応する添字と、ループ管理テーブル22の、添字次元と同一のネストレベルlvlに対応する制御変数が一致するか否かを判定する(<1>の条件)。
配列名の添字次元(lvl)に対応する記述ASTRがDOTBLの制御変数と一致しないと判定した場合には(ステップS15;No)、配列解析部121は、次のネストレベル(lvl)を選択すべく、ステップS18に移行する。
一方、配列名の添字次元(lvl)に対応する記述ASTRがDOTBLの制御変数と一致すると判定した場合には(ステップS15;Yes)、配列解析部121は、以下の処理を行う。配列解析部121は、DOTBLの初期値が「1」、増分値が「1」且つ終値が配列定義情報24の定義サイズと一致するか否かを判定する(<2>の条件)(ステップS16)。すなわち、配列解析部121は、ループのネストレベル(lvl)の回転数が添字次元(lvl)の配列の定義サイズと一致するか否かを判定する。
DOTBLの初期値が「1」、増分値が「1」または終値が配列定義情報24の定義サイズと一致しないと判定した場合には(ステップS16;No)、配列解析部121は、次のネストレベル(lvl)を選択すべく、ステップS18に移行する。
一方、DOTBLの初期値が「1」、増分値が「1」且つ終値が配列定義情報24の定義サイズと一致すると判定した場合には(ステップS16;Yes)、配列解析部121は、配列名に対し、ネストレベルに対応する添字次元(lvl)と添字を統合配列候補テーブルに格納する(ステップS17)。そして、配列解析部121は、ステップS18に移行する。なお、統合配列候補テーブルは、ループを統合するために用いられるテーブルを示す。統合配列候補テーブルは、配列名ごとに、統合候補のループのネストレベルに対応する添字次元ごとの添字を記憶する。
ステップS18において、配列解析部121は、ネストレベル(lvl)を全て選択したか否かを判定する(ステップS18)。ネストレベル(lvl)を全て選択していないと判定した場合には(ステップS18;No)、配列解析部121は、次のネストレベルを選択すべく、ステップS11に移行する。
一方、ネストレベル(lvl)を全て選択したと判定した場合には(ステップS18;Yes)、抽出部122は、統合配列候補テーブルを参照し、次元数が連続するか否かを判定する(ステップS19)。次元数が連続しないと判定した場合には(ステップS19;No)、抽出部122は、ループ統合できないので、最適化処理を終了する。
次元数が連続すると判定した場合には(ステップS19;Yes)、抽出部122は、連続した次元数に対応するネストレベルのループを削減対象として抽出する。そして、統合部123は、連続する次元の最小値を置き換え次元とし、置き換え次元の添字を各次元の添字(制御変数)を結合して得られる添字に置き換える。そして、統合部123は、最小次元以外の添字(制御変数)を定数「1」として置き換える(ステップS20)。例えば、統合配列候補テーブルが、配列名a3に対し、次元数「2」に対応する添字(制御変数)として「y」、次元数「3」に対応する添字(制御変数)として「z」を記憶する。すると、統合部123は、配列a3(x,y,z)を配列a3(x,yz,1)に置き換える。
そして、統合部123は、連続する次元の最大次元以外の次元に対応するループネストのループを削除する(ステップS21)。そして、統合部123は、連続する最大次元のループの終値および制御変数名を変更する(ステップS22)。例えば、連続する次元は、「2」「3」である。次元「2」に対応するループネストは「2」であり、ループネスト「2」のループの制御変数は「y」である。次元「3」に対応するループネストは「3」であり、ループネスト「3」のループの制御変数は「z」である。すると、統合部123は、例えば「do y=1,20」を削除する。そして、統合部123は、「do z=1,30」を「do yz=1,20*30」に変更する。
そして、コード生成部13は、置き換えたソースプログラム21を翻訳する(ステップS23)。例えば、コード生成部13は、置き換えたソースプログラム21を中間コードに変換する。そして、コード生成部13は、中間コードを機械語プログラムに変換する。そして、コード生成部13は、最適化処理を終了する。
これにより、情報処理装置1は、ループネストを削減することで、ループ中の分岐命令を削減することができ、分岐予測に使用される分岐テーブルを効率的に利用できるようになる。また、情報処理装置1は、ループネストを削減することで、基本ブロックのコード当たりの実行回数を増加させることができ、ループの実行密度(実行回数/コードサイズ)を高めることができる。そして、情報処理装置1は、命令列を一旦命令バッファに貯めておき、命令デコードを省略して命令バッファから直接命令を取り出して実行するハードウェア機構(ショートループ機構)の適用効率を向上させることができる。
なお、実施例では、配列解析部121が、ソースプログラム21について、最内ループ内のn次元配列(n≧3)における連続する添字の配列サイズと、ループにおける連続する添字に対応する制御変数の回転数とを用いて削減するループを抽出する。そして、配列解析部121は、抽出するループのループネストを削減すると説明した。しかしながら、配列解析部121は、さらに、プロファイル情報を基に、コンパイラが高コストで効果のある、削減するループを抽出し、ループネストを削減しても良い。ここでいうプロファイル情報とは、ループごとのループ長、ループ回数および配列アクセス回数を対応付けた情報である。ループ長(L)とは、ループ内のコードの長さのことをいう。ループ回数(M)とは、ループの初期値から終値までのループの回転数のことをいう。配列アクセス回数(D)とは、1回のループの中で配列をアクセスする回数のことをいう。プロファイル情報は、ソースプログラム21を翻訳した結果得られるオブジェクトを実行した際に出力される情報である。
例えば、ループ長(L)が長すぎると、命令デコードや命令フェッチを省略できなくなるので、ある閾値以下である程、プログラムの命令デコードや命令フェッチのコストを削減できる。ループ内の配列の配列アクセス回数(D)やループ回数(M)が多い程、ループ実行密度を高めることができる。そこで、性能向上が期待できるのは、Mが大、Lが大、Dが大の場合である。そこで、M、L、Dが大きい程、効果が大きくなる評価値(重み係数)が予め用意されるようにする。そして、配列解析部121は、プロファイル情報からループiごとのループ長(L)、配列アクセス回数(D)およびループ回数(M)を取得し、これらの値に応じた重み係数を掛け合わせて加算した値(L(i)*I(i)+M(i)*m(i)+D(i)*d(i))を計算する。なお、I(i)、m(i)、d(i)は、それぞれループiのループ長、配列アクセス回数、ループ回数の重み係数である。そして、配列解析部121は、ループ毎の計算値を予め定められた閾値と比較して、削減するループの候補を抽出しても良い。そして、配列解析部121は、実施例に係る最適化処理によって抽出された、削減するループの候補と、プロファイル情報を参照して抽出された、削減するループの候補とを用いて、削減するループを抽出し、ループネストを削減すれば良い。
評価関数は、(L(i)*I(i)+M(i)*m(i)+D(i)*d(i))に限定されるものではない。また、評価関数は、M,L,D以外の属性を追加したり、組み合わせたりしても良い。また、予め定められた閾値は、プロセッサの取得した実測値(経験値)や論理値でも良く、限定されるものではない。
また、実施例では、配列解析部121が、ソースプログラム21について、最内ループ内のn次元配列(n≧3)における連続する添字の配列サイズと、ループにおける連続する添字に対応する制御変数の回転数とを用いて削減するループを抽出し、ループネストを削減すると説明した。しかしながら、配列解析部121は、これに限定されず、ユーザによって指定されたループを取得し、ループネストを削減しても良い。例えば、ユーザはソースプログラム21にOCL(Object Constraint Language)文で明示的に削減するループを指定する。そして、配列解析部121は、ソースプログラム21からOCL文で指定されたループを取得し、ループネストを削減すれば良い。
また、実施例では、ループ管理テーブル22のループの終値が定数である場合を説明した。しかしながら、配列解析部121が、回転数を格納する終値が配列の定義サイズと同じであるか否かを判定できれば、回転数は定数でなく変数であっても良い。
また、上記実施例では、情報処理装置1は、ソースプログラム21を内部的に別のソースプログラムに置き換えて、中間言語から機械語にオブジェクト展開する場合を説明した。しかしながら、情報処理装置1は、ソースプログラム21を中間言語に展開してから、中間言語レベルで配列の置き換えやループの統合を実施し、その後機械語にオブジェクト展開しても良い。
また、上記実施例では、配列の定義サイズは、翻訳時に確定している固定のサイズである場合を説明した。しかしながら、配列の定義サイズは、実行時に動的に獲得した配列の定義サイズであっても良い。すなわち、配列解析部121が、回転数を格納する終値が配列の定義サイズと同じであるか否かを判定できれば良い。
[実施例の効果]
上記実施例によれば、情報処理装置1は、複数階層のループを含むソースコードにおいて、最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける第1の引数に対応する第1のインデックスおよび第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定する。情報処理装置1は、それぞれ一致する場合には、第1のインデックスおよび第2のインデックスの開始がそれぞれ1であり、且つ第1のインデックスおよび第2のインデックスの増分値が1である場合に、命令コードに含まれるn次元配列の第1の引数と第2の引数とを第3の引数に置き換えてn-1次元の配列に変更する。そして、情報処理装置1は、第1のインデックスおよび第2のインデックスのそれぞれのループを統合する。かかる構成によれば、情報処理装置1は、ループを統合することで、ループネストを削減できる。この結果、情報処理装置1は、ループ中の分岐命令を削減することができ、分岐予測に使用できる分岐テーブルを効率的に利用できるようになる。また、情報処理装置1は、ループネストを削減することで、基本ブロックのコード当たりの実行回数を増加させることができ、ループの実行密度を高めることができる。
また、上記実施例によれば、情報処理装置1は、さらに、第1の引数を示す変数と第1のインデックスの制御変数とが一致し、且つ第2の引数の変数と第2のインデックスの制御変数とが一致する場合に、n次元の配列をnー1次元の配列に変更する。かかる構成によれば、情報処理装置1は、同じレベルの配列の引数を示す変数とループのインデックスの制御変数とが一致する場合には、配列サイズから割り当てられたメモリ領域に対して連続アクセスになるのでループネストの削減を実現できる。一方、情報処理装置1は、同じレベルの配列の引数を示す変数とループのインデックスの制御変数とが一致しない場合には、飛び飛びのアクセスになるので、ループネストを削減できない。
また、上記実施例によれば、情報処理装置1は、さらに、前記第1の引数と前記第2の引数とが隣り合う場合に、n次元の配列をn-1次元の配列に変更する。かかる構成によれば、情報処理装置1は、配列の次元を削減することができる。この結果、情報処理装置1は、削減した引数に対応するループを削減することができる。
また、上記実施例によれば、情報処理装置1は、第1の引数に対応する第1のインデックスを用いたループを削除し、第3の引数に対応する前記第2のインデックスの終値を変更する。かかる構成によれば、情報処理装置1は、ループネストを削減することができる。
また、上記実施例によれば、情報処理装置1は、ソースコードを実行する際に取得される、ループごとのループ内コード長、ループの回転数および1回のループでn次元配列をアクセスする回数を含むプロファイル情報を用いて、統合するループ候補を取得し、取得したループ候補を含んで統合するループを決定する。かかる構成によれば、情報処理装置1は、さらにソースコードのコンパイルを最適化することができる。
また、上記実施例によれば、情報処理装置1は、ユーザの指定に基づいて、統合するループを決定する。かかる構成によれば、情報処理装置1は、ソースコードのコンパイルを柔軟に最適化することができる。
[その他]
なお、図示した情報処理装置1の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、情報処理装置1の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。例えば、配列解析部121を、<1>の条件を満たすかを判定する判定部と、<2>の条件を満たすかを判定する判定部とに分散しても良い。一方、配列解析部121と抽出部122とを1つの部として統合しても良い。また、記憶部20を情報処理装置1の外部装置としてネットワーク経由で接続するようにしても良い。
また、上記実施例で説明した各種の処理は、予め用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。そこで、以下では、図1に示した情報処理装置1と同様の機能を実現するコンパイラプログラムを実行するコンピュータの一例を説明する。図11は、コンパイラプログラムを実行するコンピュータの一例を示す図である。
図11に示すように、コンピュータ700は、各種演算処理を実行するCPU703と、ユーザからのデータの入力を受け付ける入力装置715と、表示装置709を制御する表示制御部707とを有する。また、コンピュータ700は、記憶媒体からプログラムなどを読取るドライブ装置713と、ネットワークを介して他のコンピュータとの間でデータの授受を行う通信制御部717とを有する。また、コンピュータ700は、各種情報を一時記憶するメモリ701と、HDD705を有する。そして、メモリ701、CPU703、HDD705、表示制御部707、ドライブ装置713、入力装置715、通信制御部717は、バス719で接続されている。
ドライブ装置713は、例えばリムーバブルディスク711用の装置である。HDD705は、コンパイラプログラム705aおよびコンパイラ処理関連情報705bを記憶する。
CPU703は、コンパイラプログラム705aを読み出して、メモリ701に展開し、プロセスとして実行する。かかるプロセスは、情報処理装置1の各機能部に対応する。コンパイラ処理関連情報705bは、ループ管理テーブル22、配列構文情報23、配列定義情報24などに対応する。そして、例えばリムーバブルディスク711が、コンパイラプログラム705aなどの各情報を記憶する。
なお、コンパイラプログラム705aについては、必ずしも最初からHDD705に記憶させておかなくても良い。例えば、コンピュータ700に挿入されるフレキシブルディスク(FD)、CD-ROM、DVDディスク、光磁気ディスク、ICカードなどの「可搬用の物理媒体」に当該プログラムを記憶させておく。そして、コンピュータ700がこれらからコンパイラプログラム705aを読み出して実行するようにしても良い。
1 情報処理装置
10 制御部
11 構文解析部
12 最適化部
121 配列解析部
122 抽出部
123 統合部
13 コード生成部
20 記憶部
20-1 ループデータ記憶部
22 ループ管理テーブル
20-2 配列データ記憶部
21 ソースプログラム
23 配列構文情報
24 配列定義情報
30 機械語プログラム

Claims (8)

  1. 複数階層のループを含むソースコードにおいて、
    最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける前記第1の引数に対応する第1のインデックスおよび前記第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定し、
    それぞれ一致する場合には、前記第1のインデックスおよび前記第2のインデックスの開始がそれぞれ1であり、且つ前記第1のインデックスおよび前記第2のインデックスの増分値が1である場合に、前記命令コードに含まれる前記n次元配列の前記第1の引数と前記第2の引数とを第3の引数に置き換えてn-1次元の配列に変更し、
    前記第1のインデックスおよび前記第2のインデックスのそれぞれのループを統合する
    処理をコンピュータに実行させるコンパイラプログラム。
  2. 該変更する処理は、さらに、前記第1の引数を示す変数と前記第1のインデックスの制御変数とが一致し、且つ前記第2の引数の変数と前記第2のインデックスの制御変数とが一致する場合に、前記n-1次元の配列に変更する
    ことを特徴とする請求項1に記載のコンパイラプログラム。
  3. 該変更する処理は、さらに、前記第1の引数と前記第2の引数とが隣り合う場合に、前記n-1次元の配列に変更する
    ことを特徴とする請求項2に記載のコンパイラプログラム。
  4. 該統合する処理は、前記第1の引数に対応する前記第1のインデックスを用いたループを削除し、前記第3の引数に対応する前記第2のインデックスの終値を変更する
    ことを特徴とする請求項1に記載のコンパイラプログラム。
  5. 該統合する処理は、前記ソースコードを実行する際に取得される、ループごとのループ内コード長、ループの回転数および1回のループで前記n次元配列をアクセスする回数を含むプロファイル情報を用いて、統合するループ候補を取得し、取得したループ候補を含んで統合するループを決定する
    ことを含むことを特徴とする請求項1に記載のコンパイラプログラム。
  6. 該統合する処理は、ユーザの指定に基づいて、統合するループを決定する
    ことを含むことを特徴とする請求項1に記載のコンパイラプログラム。
  7. 複数階層のループを含むソースコードにおいて、
    最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける前記第1の引数に対応する第1のインデックスおよび前記第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定する判定部と、
    それぞれ一致する場合には、前記第1のインデックスおよび前記第2のインデックスの開始がそれぞれ1であり、且つ前記第1のインデックスおよび前記第2のインデックスの増分値が1である場合に、前記命令コードに含まれる前記n次元配列の前記第1の引数と前記第2の引数とを第3の引数に置き換えてn-1次元の配列に変更する変更部と、
    前記第1のインデックスおよび前記第2のインデックスのそれぞれのループを統合する統合部と、
    を有することを特徴とする情報処理装置。
  8. 複数階層のループを含むソースコードにおいて、
    最内ループ内の命令コードに含まれるn次元配列(n≧3)に関し、第1の引数および第2の引数の配列サイズと、ループにおける前記第1の引数に対応する第1のインデックスおよび前記第2の引数に対応する第2のインデックスの回転数とがそれぞれ一致するか否かを判定し、
    それぞれ一致する場合には、前記第1のインデックスおよび前記第2のインデックスの開始がそれぞれ1であり、且つ前記第1のインデックスおよび前記第2のインデックスの増分値が1である場合に、前記命令コードに含まれる前記n次元配列の前記第1の引数と前記第2の引数とを第3の引数に置き換えてn-1次元の配列に変更し、
    前記第1のインデックスおよび前記第2のインデックスのそれぞれのループを統合する
    処理をコンピュータが実行するコンパイラ方法。
JP2022077718A 2022-05-10 2022-05-10 コンパイラプログラム、情報処理装置およびコンパイラ方法 Pending JP2023166881A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2022077718A JP2023166881A (ja) 2022-05-10 2022-05-10 コンパイラプログラム、情報処理装置およびコンパイラ方法
US18/160,418 US20230367570A1 (en) 2022-05-10 2023-01-27 Information processing device and compiler method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2022077718A JP2023166881A (ja) 2022-05-10 2022-05-10 コンパイラプログラム、情報処理装置およびコンパイラ方法

Publications (1)

Publication Number Publication Date
JP2023166881A true JP2023166881A (ja) 2023-11-22

Family

ID=88698886

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2022077718A Pending JP2023166881A (ja) 2022-05-10 2022-05-10 コンパイラプログラム、情報処理装置およびコンパイラ方法

Country Status (2)

Country Link
US (1) US20230367570A1 (ja)
JP (1) JP2023166881A (ja)

Also Published As

Publication number Publication date
US20230367570A1 (en) 2023-11-16

Similar Documents

Publication Publication Date Title
US5442790A (en) Optimizing compiler for computers
Yang et al. A GPGPU compiler for memory optimization and parallelism management
KR100997024B1 (ko) 스캔 연산을 수행하기 위한 시스템, 방법 및 컴퓨터 판독가능한 기록 매체
US8296746B2 (en) Optimum code generation method and compiler device for multiprocessor
US8261252B2 (en) Method and system for automated code conversion
Prihozhy et al. Synthesis and optimization of pipelines for HW implementations of dataflow programs
US7143404B2 (en) Profile-guided data layout
Chang et al. Efficient vectorization of SIMD programs with non-aligned and irregular data access hardware
US7107583B2 (en) Method and apparatus for reducing cache thrashing
US6016398A (en) Method for using static single assignment to color out artificial register dependencies
Su et al. Automatic support for irregular computations in a high-level language
Lobeiras et al. Designing efficient index-digit algorithms for CUDA GPU architectures
Kelefouras et al. A methodology for speeding up fast fourier transform focusing on memory architecture utilization
JP2023166881A (ja) コンパイラプログラム、情報処理装置およびコンパイラ方法
Baradaran et al. A compiler approach to managing storage and memory bandwidth in configurable architectures
JP4787456B2 (ja) 並列プログラム生成装置,並列プログラム生成方法および並列プログラム生成プログラム
Cruz et al. Accelerating set similarity joins using gpus
JP7407192B2 (ja) フィールド・プログラマブル・ゲート・アレイのためのコードを最適化する方法および装置
CN115437637A (zh) 一种编译方法及相关装置
JP2008071128A (ja) プリフェッチ制御方法及びコンパイル装置
Nawaz et al. Recursive variable expansion: A loop transformation for reconfigurable systems
JP6442967B2 (ja) 情報処理プログラム、情報処理装置、情報処理方法
JP7239827B2 (ja) 情報処理装置及びコンパイラプログラム
JP2007200240A (ja) 情報処理装置及び情報処理方法
Salamy et al. An ILP solution to address code generation for embedded applications on digital signal processors