以下、図面を参照して、本発明にかかる情報処理装置、コンパイル方法、およびコンパイルプログラムの実施の形態を詳細に説明する。
(実施の形態1にかかるコンパイル方法の一実施例)
図1は、実施の形態1にかかるコンパイル方法の一実施例を示す説明図である。図1において、情報処理装置100は、プログラムコードに規定された機能が変更されない範囲で、プログラムコードに記述された処理内容を変更して、ソフトウェアの実行時の演算量を低減させるコンピュータである。プログラムコードは、例えば、ソースコード101である。
ここで、コンパイルの際に、ソフトウェアについての所定の性能が向上するようにプログラムコードを変換する最適化の技術がある。所定の性能とは、例えば、ソフトウェアの実行時の処理時間、メモリ使用量、または消費電力などである。最適化の技術には、例えば、ループ処理の演算量を低減することにより、ソフトウェアの実行時の演算量を低減させて、ソフトウェアの実行時の処理時間の短縮化を図るものがある。ループ処理とは、繰り返し条件にしたがって、ループ本体内の処理を繰り返し実行する処理である。最適化の技術には、具体的には、1つのループ処理において定数として扱うことが可能な式がループ本体内にあれば、ループ処理外で当該式の計算を行っておき、ループ処理においては計算結果で当該式を置き換えるものがある。
しかしながら、縮約演算する式が含まれるネスト構造の多重ループ処理のうちの複数のループ処理を通して計算される式の集まりのうちに、定数として扱うことが可能な式が含まれても、上述した最適化の技術を適用することができない。このため、縮約演算する式が含まれる多重ループ処理については、処理内容をどのように変更すれば演算量が低減されるか分からず、ソフトウェアの処理時間を短縮することができない場合がある。
そこで、本実施の形態では、縮約演算する式が含まれる多重ループ処理について処理内容を変更して、ソフトウェアの実行時の演算量を低減させることにより、ソフトウェアの処理時間の短縮化を図るコンパイル方法について説明する。縮約演算とは、複数のデータ値を1つのデータ値に縮約する計算である。縮約演算は、例えば、加算、乗算、最大値の計算、または最小値の計算などである。
図1の例では、プログラムコードとして、式110「s(i,j)=s(i,j)+a(i,j)*b(k,i)」についての計算を繰り返すループ箇所が記述されたソースコード101を例に挙げて、情報処理装置100の動作について説明する。
式110は、変数「a(i,j)」や変数「b(k,i)」を第1変数「s(i,j)」に対して縮約演算する式である。また、「=」は代入演算子である。ここで、例えば、n=2とした場合には、ループ箇所において式110についての計算を繰り返すという第1処理内容は、符号120に示す下記式(1)〜(4)について計算を行うという第2処理内容と等価である。
s(1,1)=s(1,1)+a(1,1)*b(1,1)+a(1,1)*b(2,1) ・・・(1)
s(1,2)=s(1,2)+a(1,2)*b(1,1)+a(1,2)*b(2,1) ・・・(2)
s(2,1)=s(2,1)+a(2,1)*b(1,2)+a(2,1)*b(2,2) ・・・(3)
s(2,2)=s(2,2)+a(2,2)*b(1,2)+a(2,2)*b(2,2) ・・・(4)
そして、上述した第2処理内容は、四則演算の交換法則、分配法則、および結合法則などにしたがえば、機能を変更せずに、符号130に示す下記式(5)〜式(8)についての計算を行うという第3処理内容に変更することが可能である。これにより、第3処理内容では、第2処理内容よりも演算子の数が減るため、演算量が低減される。
s(1,1)=s(1,1)+a(1,1)*{b(1,1)+b(2,1)}
・・・(5)
s(1,2)=s(1,2)+a(1,2)*{b(1,1)+b(2,1)}
・・・(6)
s(2,1)=s(2,1)+a(2,1)*{b(1,2)+b(2,2)}
・・・(7)
s(2,2)=s(2,2)+a(2,2)*{b(1,2)+b(2,2)}
・・・(8)
さらに、上述した第3処理内容は、機能を変更せずに、定数として扱うことが可能な、同一内容の式についての計算を行ってから、当該計算で得られた結果を利用して式(5)〜(8)について計算を行うという第4処理内容に変更することが可能である。例えば、式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算が行われた後に、当該計算で得られた結果を利用して式(5)〜(8)についての計算が行われる。これにより、第4処理内容では、定数として扱うことが可能な、同一内容の式についての計算を複数回行わなくてもよくなるため、演算量が低減される。
このように、複数のループ処理を通して計算される式の集まりのうちに、定数として扱うことが可能な式が含まれる場合には、ソースコード101に記述された処理内容を変更すれば、演算量を低減することが可能である。このため、情報処理装置100は、上述した処理内容の変更による演算量の低減化が実現されるように、ソースコード101のループ箇所を変換して、変換後のソースコード102を出力することになる。
図1の例では、(1−1)情報処理装置100は、ソースコード101を取得する。次に、情報処理装置100は、ソースコード101に対して字句解析や文法解析を行い、ソースコード101に対応する抽象構文木を作成する。そして、情報処理装置100は、抽象構文木に基づいて、ソースコード101に記述された、式110「s(i,j)=s(i,j)+a(i,j)*b(k,i)」についての計算を繰り返すループ箇所を特定する。
(1−2)情報処理装置100は、式110のうちの部分式「b(k,i)」を第2変数「t(i)」に対して縮約演算する式140「t(i)=t(i)+b(k,i)」についての計算を繰り返す第1コードを生成する。第1コードは、上述した式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算を行うという処理内容に対応するコードである。第2変数は、一時的に演算結果を記憶するための変数である。
また、情報処理装置100は、式110のうちの部分式が第2変数に置換された式150「s(i,j)=s(i,j)+a(i,j)*t(i)」についての計算を繰り返す第2コードを生成する。第2コードは、式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算で得られた結果を利用して、式(5)〜(8)についての計算を行うという処理内容に対応するコードである。
(1−3)情報処理装置100は、ソースコード101のうちのループ箇所を第1コードおよび第2コードに変換する。そして、情報処理装置100は、変換後のソースコード102を、表示装置に出力し、他のコンピュータに送信し、または記憶装置に記憶する。結果として、情報処理装置100、または他のコンピュータが、ソースコード102をコンパイルして、オブジェクトコードを作成可能になる。
このように、情報処理装置100によれば、式110の部分式を第2変数に縮約演算する式140を含むループ処理を示す第1コードと、第2変数で部分式を置換した式150を含むループ処理を示す第2コードとを生成することができる。そして、情報処理装置100によれば、縮約演算する式110を含むループ箇所を、第1コードと第2コードとに変換することができる。これにより、情報処理装置100は、複数のループ処理を通して計算される式の集まりに含まれる、定数として扱うことが可能な式を用いて式140を作成し、式140についての計算が予め行われるように、ソースコード101を変換することができる。
結果として、情報処理装置100は、ソフトウェアの実行時の演算量を低減して、ソフトウェアの処理時間の短縮化を図ることができる。例えば、ソースコード101では、加算「+」と乗算「*」とが、「n^3」回繰り返して実行されるため、演算量は「2n^3」である。これに対し、変換後のソースコード102では、加算「+」が「n^2」回実行され、加算「+」と乗算「*」とが「n^2」回実行されるため、演算量は「n^2+2n^2」である。結果として、変換後のソースコード102では、n>2であれば、演算量が低減される。
ここでは、情報処理装置100が、抽象構文木に基づいてループ箇所を特定する場合について説明したが、これに限らない。例えば、情報処理装置100は、抽象構文木を作成せずにソースコード101からループ箇所を特定してもよい。また、ここでは、情報処理装置100が、ソースコード101を変換する場合について説明したが、これに限らない。例えば、情報処理装置100は、ソースコード101に対応する抽象構文木を、ソースコード102に対応する抽象構文木に変換して、出力してもよい。
(実施の形態1にかかる情報処理装置100のハードウェア構成例)
次に、図2を用いて、実施の形態1にかかる情報処理装置100のハードウェア構成例について説明する。
図2は、実施の形態1にかかる情報処理装置100のハードウェア構成例を示すブロック図である。図2において、情報処理装置100は、CPU(Central Processing Unit)201と、メモリ202と、I/F(Interface)203と、ディスクドライブ204と、ディスク205と、を有する。また、各構成部は、バス200によってそれぞれ接続される。
ここで、CPU201は、情報処理装置100の全体の制御を司る。メモリ202は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU201のワークエリアとして使用される。メモリ202に記憶されるプログラムは、CPU201にロードされることで、コーディングされている処理をCPU201に実行させる。
I/F203は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、I/F203は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。I/F203には、例えば、モデムやLAN(Local Area Network)アダプタなどを採用することができる。
ディスクドライブ204は、CPU201の制御にしたがってディスク205に対するデータのリード/ライトを制御する。ディスクドライブ204は、例えば、磁気ディスクドライブである。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する不揮発メモリである。ディスク205は、例えば、磁気ディスク、光ディスクなどである。
情報処理装置100は、上述した構成部のほか、例えば、SSD(Solid State Drive)、半導体メモリ、キーボード、マウス、ディスプレイなどを有することにしてもよい。また、情報処理装置100は、ディスクドライブ204およびディスク205の代わりに、SSDおよび半導体メモリなどを有していてもよい。
(実施の形態1にかかる情報処理装置100の機能的構成例)
次に、図3を用いて、実施の形態1にかかる情報処理装置100の機能的構成例について説明する。
図3は、実施の形態1にかかる情報処理装置100の機能的構成例を示すブロック図である。情報処理装置100は、特定部301と、分類部302と、算出部303と、選択部304と、生成部305と、出力部306とを含む。
特定部301〜出力部306は、制御部となる機能であり、例えば、図2に示したメモリ202、ディスク205に記憶されたプログラムをCPU201に実行させることにより、または、I/F203により、その機能を実現する。各機能部の処理結果は、例えば、図2に示したメモリ202、ディスク205などの記憶装置に記憶される。
特定部301は、ソフトウェアのプログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定する。プログラムコードとは、ソフトウェアの処理内容が記述されたコードである。プログラムコードは、例えば、ソースコードである。プログラムコードは、抽象構文木を示すコードであってもよい。第1式は、第1演算子により、複数の項や因数を第1変数に対して縮約演算する式である。ループ箇所は、例えば、ネスト構造の複数のループ文と、ループ本体とが記述された箇所である。
特定部301は、例えば、ソースコードのうち、第1変数「s(i,j)」に対して縮約演算する第1式「s(i,j)=s(i,j)+a(i,j)*b(k,i)」についての計算を繰り返すループ箇所を特定する。これにより、特定部301は、ソフトウェアの実行時の演算量を低減させることができる可能性があるループ箇所を特定することができる。
分類部302は、第1式についての計算を繰り返す条件に使用される変数を、第1式のうちの各部分式における第1種別の変数と、第1種別の変数とは異なる第2種別の変数とに分類する。部分式は、第1変数に対して縮約演算される単位部分式の一部である。単位部分式の一部は、単位部分式を「1*単位部分式」として扱う場合には、単位部分式自体であってもよい。
第1種別の変数は、第1変数のインデックスに使用される変数、第1変数の初期化を行う式についての計算を繰り返す条件に使用される変数および部分式と単位部分式の残余の部分式とに共通してインデックスに使用される変数のいずれかと一致する変数である。以下の説明では、第1種別の変数を「パラメータ」と表記する場合がある。また、以下の説明では、第2種別の変数を「縮約可能変数」と表記する場合がある。
分類部302は、例えば、第1式についての計算を繰り返す条件に使用される変数「i,j,k」を、第1式のうちの部分式「b(k,i)」におけるパラメータと縮約可能変数とに分類する。分類部302は、具体的には、第1変数「s(i,j)」のインデックスi、jを特定する。また、分類部302は、第1変数「s(i,j)」の初期化を行う式についての計算を繰り返す条件に使用される変数i,jを特定する。また、分類部302は、第1式のうちの部分式「b(k,i)」と、第1式に対して縮約演算される単位部分式「a(i,j)*b(k,i)」の残余の部分式「a(i,j)」とに共通してインデックスに使用される変数iを特定する。
そして、分類部302は、特定した変数i,jを、パラメータに分類する。また、分類部302は、特定されなかった変数kを、縮約可能変数に分類する。これにより、分類部302は、第1式のうちの部分式を基に、特定部301が特定したループ箇所を変換した場合に削減される演算量を算出する際に用いる情報を得ることができる。
算出部303は、第1式のうちの各部分式について、当該部分式を第2変数に対して縮約演算する第2式についての計算の種類および繰り返し回数を特定する。第2式は、部分式を第1演算子により第2変数に対して縮約演算する式である。また、算出部303は、第1式のうちの当該部分式が第2変数に置換された第3式についての計算の種類および繰り返し回数を特定する。そして、算出部303は、特定した種類および繰り返し回数に基づいて、第2式についての計算を繰り返す演算量、および、第3式についての計算を繰り返す演算量の合計と、ループ箇所の演算量との差分を算出する。
算出部303は、例えば、分類した第1種別の変数および第2種別の変数に基づいて、第1式のうちの各部分式について、当該部分式を第2変数に対して縮約演算する第2式についての計算の種類および繰り返し回数を特定する。また、算出部303は、分類した第1種別の変数および第2種別の変数に基づいて、第1式のうちの各部分式について、第1式のうちの当該部分式が第2変数に置換された第3式についての計算の種類および繰り返し回数を特定する。
そして、算出部303は、第2式について特定した種類ごとの演算子の数と、繰り返し回数とを乗算した値を、第2式についての計算を繰り返す演算量として算出する。また、算出部303は、第3式について特定した種類ごとの演算子の数と、繰り返し回数とを乗算した値を、第3式についての計算を繰り返す演算量として算出する。そして、算出部303は、第2式についての計算を繰り返す演算量および第3式についての計算を繰り返す演算量の合計と、ループ箇所の演算量との差分を算出する。
算出部303は、具体的には、パラメータ「i,j」と縮約可能変数「k」のうち、第1式のうちの部分式「b(k,i)」のインデックスになる変数「k,i」を特定する。次に、算出部303は、ループ箇所における変数「k,i」についての繰り返し回数を乗算した値「n^2」を、第2式についての繰り返し回数「n^2」として算出する。
また、算出部303は、縮約可能変数「k」が、第1式のうちの部分式「b(k,i)」のインデックスになる変数「k,i」に含まれれば、第2式についての計算の種類「+」を特定する。次に、算出部303は、第1式のうちの部分式「b(k,i)」に演算子が含まれれば当該演算子を第2式についての計算の種類として特定し、演算子が含まれなければ第2式についての計算の種類を特定しない。
また、算出部303は、パラメータ「i,j」と縮約可能変数「k」のうち、残余の部分式「a(i,j)」のインデックスになる変数「i,j」を特定する。次に、算出部303は、ループ箇所における変数「i,j」についての繰り返し回数を乗算した値「n^2」を、第3式についての繰り返し回数「n^2」として算出する。
また、算出部303は、残余の部分式「a(i,j)」に演算子が含まれれば当該演算子を第3式についての計算の種類として特定し、演算子が含まれなければ第3式についての計算の種類を特定しない。また、算出部303は、第2変数と残余の部分式「a(i,j)」を結合する際に用いられる演算子「*」を特定する。また、算出部303は、結合した結果を縮約演算する際に用いられる演算子「+」を特定する。
そして、算出部303は、第2式について特定した種類ごとの演算子の数「1」と、繰り返し回数とを乗算した値「n^2」を、第2式についての計算を繰り返す演算量「n^2」として算出する。また、算出部303は、第3式について特定した種類ごとの演算子の数「2」と、繰り返し回数とを乗算した値「2n^2」を、第3式についての計算を繰り返す演算量として算出する。
そして、算出部303は、ループ箇所の演算量「2n^3」を算出して、第2式についての計算を繰り返す演算量および第3式についての計算を繰り返す演算量の合計と、ループ箇所の演算量との差分「2n^3−3n^2」を算出する。これにより、算出部303は、プログラムコードを変換した場合に削減される演算量を算出することができる。
ここでは、演算子の種類が「+」でも「*」でも演算量が同一である場合について説明したが、これに限らない。例えば、算出部303は、演算子の種類によって演算量が異なる場合には、演算子の種類に応じて重み付けを行って演算量を算出してもよい。また、算出部303は、上述した算出方法以外を用いて、プログラムコードを変換した場合に削減される演算量を算出してもよい。また、算出部303は、削減される演算量の代わりに、削減される演算量と関連する指標値を算出してもよい。
選択部304は、算出部303が算出した差分に基づいて、第1式のうちのいずれかの部分式を選択する。選択部304は、例えば、算出部303が算出した差分が最も大きい部分式を選択する。これにより、選択部304は、ソフトウェアの実行時の演算量が最も低減されるように、プログラムコードを変換する場合に用いる部分式を選択することができる。
生成部305は、第1式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コード、および、第1式のうちの部分式が第2変数に置換された第3式についての計算を繰り返す第2コードを生成する。生成部305は、例えば、選択したいずれかの部分式について第1コードおよび第2コードを生成する。
生成部305は、具体的には、第1式のうちの各部分式について、当該部分式を縮約演算する第2式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。また、生成部305は、当該部分式が置換された第3式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。生成部305は、特定した変数および繰り返し回数に基づいて、ループ文を用いて第1コードを生成し、ループ文を用いて第2コードを生成する。
生成部305は、より具体的には、分類した第1種別の変数および第2種別の変数に基づいて、第1式のうちの各部分式について、当該部分式を縮約演算する第2式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。また、生成部305は、当該部分式が置換された第3式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。生成部305は、特定した変数および繰り返し回数に基づいて、ループ文を用いて第1コードを生成し、ループ文を用いて第2コードを生成する。これにより、生成部305は、ソフトウェアの実行時の演算量を低減させることができるプログラムコードを生成することができる。
出力部306は、プログラムコードのうちのループ箇所を第1コードおよび第2コードに変換した変換後のプログラムコードを出力する。出力部306は、例えば、変換後のプログラムコードを、ディスプレイに表示し、プリンタに印刷出力し、I/F203によって外部装置へ送信し、または、メモリ202やディスク205などの記憶領域に記憶する。これにより、出力部306は、コンパイラに、変換後のプログラムコードを提供することができる。
以下、図4〜図18を用いて、実施の形態1にかかる情報処理装置100の動作例について説明する。
(ソースコード400の一例)
図4は、ソースコード400の一例を示す説明図である。ソースコード400は、例えば、FORTRAN、C、BASICなどのプログラミング言語を用いて、コンピュータに実行させる処理の内容が記述されたテキストデータである。
図4の例では、ソースコード400の1,12行目には、ループ文「DO i=1,n (ループ本体) ENDDO」が記述される。ソースコード400の2〜11行目には、ループ文「DO i=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード400の1〜12行目には、変数iを1から開始して変数iがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード400の2,11行目には、ループ文「DO j=1,n (ループ本体) ENDDO」が記述される。ソースコード400の3〜10行目には、ループ文「DO j=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード400の2〜11行目には、変数jを1から開始して変数jがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード400の3行目には、代入文「s(i,j)=0」が記述される。これにより、ソースコード400の3行目には、配列変数s(i,j)の値に、数値「0」を代入する初期化処理の内容が記述される。
ソースコード400の4,10行目には、ループ文「DO k=1,n (ループ本体) ENDDO」が記述される。ソースコード400の5〜9行目には、ループ文「DO k=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード400の4〜10行目には、変数kを1から開始して変数kがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード400の5,9行目には、ループ文「DO l=1,n (ループ本体) ENDDO」が記述される。ソースコード400の6〜8行目には、ループ文「DO l=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード400の5〜9行目には、変数lを1から開始して変数lがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード400の6,8行目には、ループ文「DO m=1,n (ループ本体) ENDDO」が記述される。ソースコード400の7行目には、ループ文「DO m=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード400の6〜8行目には、変数mを1から開始して変数mがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード400の7行目には、代入文「s(i,j)=s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」が記述される。これにより、ソースコード400の7行目には、配列変数s(i,j)の値に、配列変数s(i,j)+配列変数a(i,k,m,l)*配列変数w(k,l)*配列変数v(j,m)の値を代入する代入処理が記述される。
このように、ソースコード400の1〜12行目は、入れ子構造になった複数のループ文の集まりが記述された多重ループ箇所である。また、ソースコード400の1〜3,11,12行目は、変数i,jを変化させ、縮約演算が行われる配列変数s(i,j)を切り替え、切り替えた配列変数s(i,j)を初期化する、入れ子構造になったループ文の集まりが記述されたループ箇所である。以下の説明では、縮約演算が行われる配列変数を切り替えて初期化するループ箇所を「初期化ループ箇所」と表記する場合がある。
また、ソースコード400の4〜10行目は、初期化された配列変数s(i,j)に対する代入演算を繰り返すことによって、初期化された配列変数s(i,j)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述されたループ箇所である。以下の説明では、縮約演算を行うループ箇所を「縮約演算ループ箇所」と表記する場合がある。
(多重ループを検出する一例)
図5は、多重ループを検出する一例を示す説明図である。図5において、情報処理装置100は、ソースコード400に基づいて抽象構文木(Abstract Syntax Tree)、変数表、関数表などを生成する。そして、情報処理装置100は、生成した抽象構文木に基づいて、多重ループ箇所を検出する。以下の説明では、抽象構文木を「AST」と表記する場合がある。
情報処理装置100は、例えば、ソースコード400内の関数や制御構文、関数や制御構文の引数、関数内の命令文、制御構文の分岐先の命令文、命令文内の変数や演算子などを属性とするノードを生成する。ノードには、例えば、ループ本体(Body)を属性とし、ループ本体内の命令文を属性とする子ノードが接続されたノードがある。また、ノードには、例えば、ループ文の繰り返し条件(cond)を属性とし、繰り返し条件に使用される変数を属性とする子ノードが接続されたノードがある。図5の例では、説明の簡略化のため、condの子ノードや、変数のインデックスを属性とするノードなどについて、図示を省略する。
次に、情報処理装置100は、ソースコード400に記述された処理の内容にしたがって、生成したノード間の接続関係を特定して、生成したノード間を接続することにより、抽象構文木を生成する。そして、情報処理装置100は、ループ文を属性とするノードから、ループ本体を属性とするノードを経由して、ループ文を属性とするノードを検索することにより、多重ループ箇所を検出する。
(アドレスを割り当てる一例)
図6は、アドレスを割り当てる一例を示す説明図である。図6において、情報処理装置100は、検出した多重ループ箇所に含まれる命令文や演算子などに対応するASTのノードに、多重ループ箇所の複数のループ文の入れ子構造に対応する階層構造のアドレスを対応付けて記憶する。
情報処理装置100は、例えば、ソースコード400の1行目に記述されたループ文「DO i=1,n (ループ本体) ENDDO」に対応するノードに、アドレス(1)を対応付けて記憶する。また、情報処理装置100は、ソースコード400の2行目に記述されたループ文「DO j=1,n (ループ本体) ENDDO」に対応するノードに、アドレス(1,1)を対応付けて記憶する。また、情報処理装置100は、3行目に記述された代入文「s(i,j)=0」に対応するノードに、アドレス(1,1)(1)を対応付けて記憶する。
また、情報処理装置100は、7行目に用いられた演算子「=」に対応するノードに、アドレス(1,1,1,1,1)(1,1)を対応付ける。また、情報処理装置100は、7行目に用いられた演算子「+」に対応するノードに、アドレス(1,1,1,1,1)(1,1,2)を対応付ける。同様に、情報処理装置100は、ソースコード400に記述された命令文や演算子などに対応するASTのノードに、アドレスを対応付けて記憶する。
(縮約演算ループ箇所を検出する一例)
図7および図8は、縮約演算ループ箇所を検出する一例を示す説明図である。図7において、情報処理装置100は、代入文を記憶するリスト1を生成する。そして、情報処理装置100は、検出した多重ループ箇所に含まれる代入文を抽出して、抽出した代入文を左辺の変数ごとに分類してリスト1に追加することにより、リスト1を更新する。
次に、情報処理装置100は、縮約演算を行う式に対応する代入文を記憶するリスト2を生成し、抽出した代入文のうち、縮約演算の形式「r=r+(rを含まない式)」に対応する代入文を特定して、特定した代入文をリスト2に追加して、リスト2を更新する。以下の説明では、縮約演算を行う式を「縮約演算式」と表記する場合がある。
そして、情報処理装置100は、初期化を行う式に対応する代入文を記憶するリスト3を生成して、リスト1に含まれ、かつリスト2に含まれない代入文をリスト3に追加して、リスト3を更新する。以下の説明では、初期化を行う式を「初期化式」と表記する場合がある。
情報処理装置100は、例えば、アドレス(1,1)(1)が対応付けられた代入文「s(i,j)=0」をリスト1に追加する。また、情報処理装置100は、アドレス(1,1,1,1,1)(1)が対応付けられた代入文「s(i,j)=s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」をリスト1に追加する。
次に、情報処理装置100は、アドレス(1,1,1,1,1)(1)が対応付けられた代入文「s(i,j)=s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」をリスト2に追加する。そして、情報処理装置100は、アドレス(1,1)(1)が対応付けられた代入文「s(i,j)=0」をリスト3に追加する。
図8において、情報処理装置100は、同一の変数に対する初期化式と縮約演算式とを対応付けて記憶するリスト4を生成し、リスト2とリスト3との要素を対応付けて追加して、リスト4を更新する。次に、情報処理装置100は、リスト4に記憶された、リスト2のアドレスのうちで、リスト3のアドレスに一致する要素および一致しない要素を特定する。そして、情報処理装置100は、特定した要素に基づいて、多重ループ箇所のうちで1つのスカラー変数に対する縮約演算が行われる縮約演算ループ箇所を特定する。
情報処理装置100は、例えば、リスト2のアドレス(1,1,1,1,1)のうちでリスト3のアドレス(1,1)に一致する要素が、リスト2のアドレスの1番目と2番目の要素であることを特定する。そして、情報処理装置100は、リスト2のアドレスの1番目と2番目の要素に対応するループ文が、縮約演算が行われるスカラー変数を切り替えるループ文の集まりであって、スカラー変数を初期化する初期化ループ箇所であると特定する。
一方で、情報処理装置100は、リスト2のアドレス(1,1,1,1,1)のうちでリスト3のアドレス(1,1)に一致しない要素が、リスト2のアドレスの3〜5番目の要素であることを特定する。そして、情報処理装置100は、リスト2のアドレスの3〜5番目の要素に対応するループ文が、初期化されたスカラー変数に対する縮約演算が行われるループ文の集まりであって、縮約演算が行われる縮約演算ループ箇所であると特定する。
(部分式を抽出する一例)
図9〜図14は、部分式を抽出する一例を示す説明図である。図9において、情報処理装置100は、代入文に対応付けられたアドレスと、代入文に含まれる部分式とを対応付けて記憶する、部分式のリスト5を生成する。
(9−1)情報処理装置100は、抽象構文木のうち、縮約演算に用いられる代入文「s(i,j)=s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」に対応する部分木を抽出する。
(9−2)情報処理装置100は、抽出した部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が「=」であるため、縮約演算式の右辺に対応する子ノードを参照する。情報処理装置100は、子ノードの属性となる演算子が「+」であるため、対象演算子として演算子「+」を設定する。
(9−3)情報処理装置100は、縮約演算式の右辺「s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」を対象部分式として設定する。情報処理装置100は、縮約演算式の左辺「s(i,j)」を足し込み先部分式として設定する。
(9−4)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が「+」であって対象演算子「+」と一致するため、いずれか一方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「s(i,j)」を対象部分式として設定する。
(9−5)情報処理装置100は、対象部分式「s(i,j)」が、足し込み先部分式と一致するため、(9−4)で未選択の他方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「a(i,k,m,l)*w(k,l)*v(j,m)」を対象部分式として設定する。
(9−6)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が「*」であって対象演算子「+」と一致せず、かつ、対象部分式「a(i,k,m,l)*w(k,l)*v(j,m)」が足し込み先部分式と一致しないため、リスト5に対象部分式を追加する。
図10のように、リスト5は、例えば、対象部分式「a(i,k,m,l)*w(k,l)*v(j,m)」と、縮約演算式に対応するアドレス(1,1,1,1,1)(1)とを対応付けたレコード5−1を記憶する。
図11において、情報処理装置100は、代入文に対応付けられたアドレスと、代入文に含まれる部分式を2つの部分式にさらに分割して得られた分割部分式の組み合わせとを対応付けて記憶する、分割部分式のリスト6を生成して、リスト6を更新する。リスト6の記憶内容は、図14に後述する。
(11−1)情報処理装置100は、リスト5から部分式「a(i,k,m,l)*w(k,l)*v(j,m)」を抽出して、現在の部分式として設定する。情報処理装置100は、現在の部分式「a(i,k,m,l)*w(k,l)*v(j,m)」と数値「1」との組み合わせをリスト6に追加して、リスト6を更新する。
ここで、情報処理装置100は、代入文に対応付けられたアドレスと、代入文に含まれる部分式とを対応付けて記憶する、部分式のリスト5’を生成する。
(11−2)情報処理装置100は、現在の部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が2項演算子「*」であるため、対象演算子として演算子「*」を設定する。
(11−3)情報処理装置100は、現在の部分式「a(i,k,m,l)*w(k,l)*v(j,m)」を対象部分式として設定する。情報処理装置100は、「NULL」を足し込み先部分式として設定する。
(11−4)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が「*」であって対象演算子「*」と一致するため、いずれか一方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「a(i,k,m,l)」を対象部分式として設定する。
(11−5)情報処理装置100は、対象部分式「a(i,k,m,l)」に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性が演算子ではなく、かつ、対象部分式「a(i,k,m,l)」が足し込み先部分式と一致しないため、リスト5’に対象部分式を追加する。
(11−6)情報処理装置100は、(11−4)で未選択の他方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「w(k,l)*v(j,m)」を対象部分式として設定する。
(11−7)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性となる演算子が「*」であって対象演算子「*」と一致するため、いずれか一方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「w(k,l)」を対象部分式として設定する。
(11−8)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性が演算子ではなく、かつ、対象部分式「w(k,l)」が足し込み先部分式と一致しないため、リスト5’に対象部分式を追加する。
(11−9)情報処理装置100は、(11−7)で未選択の他方の子ノードを選択する。情報処理装置100は、選択した子ノードが根となる部分木に対応する式「v(j,m)」を対象部分式として設定する。
(11−10)情報処理装置100は、対象部分式に対応する部分木の根ノードを参照する。情報処理装置100は、根ノードの属性が演算子ではなく、かつ、対象部分式「v(j,m)」が足し込み先部分式と一致しないため、リスト5’に対象部分式を追加する。
図12のように、リスト5’は、例えば、縮約演算式に対応するアドレス(1,1,1,1,1)(1)と、部分式「a(i,k,m,l)」とを対応付けたレコード5’−1を記憶する。また、リスト5’は、縮約演算式に対応するアドレス(1,1,1,1,1)(1)と、部分式「w(k,l)」とを対応付けたレコード5’−2を記憶する。リスト5’は、縮約演算式に対応するアドレス(1,1,1,1,1)(1)と、部分式「v(j,m)」とを対応付けたレコード5’−3を記憶する。
図13において、情報処理装置100は、リスト5に記憶した部分式を2つに分割して得られる分割部分式を、リスト5’に記憶した部分式を組み合わせることにより生成して、生成した分割部分式をリスト6に追加して、リスト6を更新する。以下の説明では、部分式を2つに分割して得られる分割部分式を「分割部分式Aおよび分割部分式B」と表記する場合がある。
(13−1)情報処理装置100は、リスト5’に記憶した部分式を組み合わせるパターンを示す変数bを用意し、変数bに「1(0b00000001)」を設定する。括弧内は2進数8ビットでの表記である。変数bの末尾からのビットの番号は、リスト5’の先頭からのレコードの番号に対応する。例えば、変数bの末尾から1番目のビットは、リスト5’の先頭から1番目のレコードに対応する。
情報処理装置100は、変数bのうちのビット「0」に対応するレコードから、部分式「w(k,l)」と部分式「v(j,m)」とを抽出する。情報処理装置100は、抽出した部分式「w(k,l)」と部分式「v(j,m)」とを対象演算子「*」で接続した部分式「w(k,l)*v(j,m)」を、一方の分割部分式として生成する。
また、情報処理装置100は、変数bのうちのビット「1」に対応するレコードから、部分式「a(i,k,m,l)」を抽出する。情報処理装置100は、抽出した部分式「a(i,k,m,l)」を、他方の分割部分式「a(i,k,m,l)」として生成する。情報処理装置100は、生成した一方の分割部分式と他方の分割部分式との組み合わせを、リスト6に追加して、リスト6を更新する。
(13−2)情報処理装置100は、bをインクリメントし、bに「2(0b00000010)」を設定する。情報処理装置100は、変数bのうちのビット「0」に対応するレコードから、部分式「a(i,k,m,l)」と部分式「v(j,m)」とを抽出する。情報処理装置100は、抽出した部分式「a(i,k,m,l)」と部分式「v(j,m)」とを対象演算子「*」で接続した部分式「a(i,k,m,l)*v(j,m)」を、一方の分割部分式として生成する。
また、情報処理装置100は、変数bのうちのビット「1」に対応するレコードから、部分式「w(k,l)」を抽出する。情報処理装置100は、抽出した部分式「w(k,l)」を、他方の分割部分式「w(k,l)」として生成する。情報処理装置100は、生成した一方の分割部分式と他方の分割部分式との組み合わせを、リスト6に追加して、リスト6を更新する。
(13−3)情報処理装置100は、bをインクリメントし、bに「3(0b00000011)」を設定する。情報処理装置100は、変数bのうちのビット「0」に対応するレコードから、部分式「v(j,m)」を抽出する。情報処理装置100は、抽出した部分式「v(j,m)」を、一方の分割部分式として生成する。
また、情報処理装置100は、変数bのうちのビット「1」に対応するレコードから、部分式「a(i,k,m,l)」と部分式「w(k,l)」とを抽出する。情報処理装置100は、抽出した部分式「a(i,k,m,l)」と部分式「w(k,l)」とを対象演算子「*」で接続した部分式「a(i,k,m,l)*w(k,l)」を他方の分割部分式「a(i,k,m,l)*w(k,l)」として生成する。情報処理装置100は、生成した一方の分割部分式と他方の分割部分式との組み合わせを、リスト6に追加して、リスト6を更新する。
図14のように、リスト6は、例えば、アドレス(1,1,1,1,1)(1)と、分割部分式「a(i,k,m,l)*w(k,l)*v(j,m)」および「1」の組み合わせと、組み合わせのID「0」とを対応付けたレコード6−1を記憶する。また、リスト6は、アドレス(1,1,1,1,1)(1)と、分割部分式「w(k,l)*v(j,m)」および「a(i,k,m,l)」の組み合わせと、組み合わせのID「1」とを対応付けたレコード6−2を記憶する。
また、リスト6は、アドレス(1,1,1,1,1)(1)と、分割部分式「a(i,k,m,l)*v(j,m)」および分割部分式「w(k,l)」の組み合わせと、組み合わせのID「2」とを対応付けたレコード6−3を記憶する。また、リスト6は、アドレス(1,1,1,1,1)(1)と、分割部分式「v(j,m)」および分割部分式「a(i,k,m,l)*w(k,l)」の組み合わせと、組み合わせのID「3」とを対応付けたレコード6−4を記憶する。
(スカラー変数を分類する一例)
図15は、スカラー変数を分類する一例を示す説明図である。図15において、情報処理装置100は、リスト6のレコードごとに、縮約演算式においてインデックスに使用されるスカラー変数を、パラメータと縮約可能変数とに分類して、分類結果をリスト7に記憶する。
情報処理装置100は、例えば、縮約演算式の左辺が配列変数であれば、左辺の配列変数のインデックスに使用されるスカラー変数を、パラメータとして設定する。情報処理装置100は、スカラー変数を初期化する初期化ループ箇所におけるループ文に使用されるスカラー変数を、パラメータとして設定する。
情報処理装置100は、リスト6のレコードの分割部分式の組み合わせの両方において共通してインデックスに使用されるスカラー変数を、パラメータとして設定する。情報処理装置100は、リスト6のレコードの分割部分式の組み合わせにおいてインデックスに使用されるスカラー変数のうち、パラメータに設定されていないスカラー変数を、縮約可能変数に設定する。
情報処理装置100は、レコード6−1について、スカラー変数i,jをパラメータとして設定する。情報処理装置100は、レコード6−1について、スカラー変数k,l,mを、縮約可能変数として設定する。情報処理装置100は、レコード6−1の記憶内容と、パラメータと、縮約可能変数とを対応付けたレコード7−1を生成して、リスト7に追加して、リスト7を更新する。
情報処理装置100は、レコード6−2について、スカラー変数i,j,mをパラメータとして設定する。情報処理装置100は、レコード6−2について、スカラー変数k,lを、縮約可能変数として設定する。情報処理装置100は、レコード6−2の記憶内容と、パラメータと、縮約可能変数とを対応付けたレコード7−2を生成して、リスト7に追加して、リスト7を更新する。
情報処理装置100は、レコード6−3について、スカラー変数i,j,k,l,mをパラメータとして設定する。情報処理装置100は、レコード6−3について、縮約可能変数を設定しない。情報処理装置100は、レコード6−3の記憶内容と、パラメータを対応付けたレコード7−3を生成して、リスト7に追加して、リスト7を更新する。
情報処理装置100は、レコード6−4について、スカラー変数i,j,k,lをパラメータとして設定する。情報処理装置100は、レコード6−4について、スカラー変数mを、縮約可能変数として設定する。情報処理装置100は、レコード6−4の記憶内容と、パラメータと、縮約可能変数とを対応付けたレコード7−4を生成して、リスト7に追加して、リスト7を更新する。
図15のように、リスト7は、例えば、リスト6のレコード6−1の記憶内容と、パラメータ「i,j」と、縮約可能変数「k,l,m」とを対応付けたレコード7−1を記憶する。また、リスト7は、リスト6のレコード6−2の記憶内容と、パラメータ「i,j,m」と、縮約可能変数「k,l」とを対応付けたレコード7−2を記憶する。
また、リスト7は、リスト6のレコード6−3の記憶内容と、パラメータ「i,j,k,l,m」と、縮約可能変数「なし」とを対応付けたレコード7−3を記憶する。また、リスト7は、リスト6のレコード6−4の記憶内容と、パラメータ「i,j,k,l」と、縮約可能変数「m」とを対応付けたレコード7−4を記憶する。
(削減される演算量を算出する一例)
図16および図17は、削減される演算量を算出する一例を示す説明図である。図16において、情報処理装置100は、それぞれの分割部分式を別々に計算した場合に、ループ処理全体として削減される演算量を算出して、リスト8に記憶する。以下の説明では、ループ処理全体として削減される演算量を「削減量」と表記する場合がある。
情報処理装置100は、例えば、縮約演算式の演算を多重ループ箇所において行う場合にかかる演算量を算出する。以下の説明では、多重ループ箇所において行う場合にかかる演算量を「元の演算量」と表記する場合がある。
そして、情報処理装置100は、リスト7のレコードごとに、縮約演算式から分割部分式を抽出し、抽出した分割部分式の演算と、抽出した分割部分式の演算結果を用いた縮約演算式の演算とを、別々のループ箇所において行う場合にかかる演算量を算出する。以下の説明では、別々のループ箇所において行う場合にかかる演算量を「ループ分割後の演算量」と表記する場合がある。最後に、情報処理装置100は、元の演算量からループ分割後の演算量を減算した差分を、削減量として算出する。
図16において、情報処理装置100は、リスト7のレコード7−1から、分割部分式「a(i,k,m,l)*w(k,l)*v(j,m)」を抽出して、対象分割部分式として設定する。情報処理装置100は、対象分割部分式に縮約可能変数が含まれるため、対象分割部分式についての縮約演算に使用される演算子「+」を対象演算子に追加して、演算子「+」の数として「1」を設定する。また、情報処理装置100は、対象分割部分式に含まれる演算子「*」を対象演算子に追加して、演算子「*」の数として「2」を設定する。
情報処理装置100は、繰り返し総数に1を設定する。情報処理装置100は、縮約演算式においてインデックスに使用されるスカラー変数「i,j,k,l,m」のうちで、対象分割部分式に使用されるスカラー変数「i,j,k,l,m」を特定する。情報処理装置100は、繰り返し総数に、スカラー変数「i,j,k,l,m」のそれぞれのスカラー変数の繰り返し回数を乗算することにより、繰り返し総数に「n^5」を設定する。
情報処理装置100は、「繰り返し総数=n^5」を、演算単位として設定する。情報処理装置100は、それぞれの対象演算子の数に演算単位を乗算した値「3n^5」を、ループ分割後の演算量のうちの対象分割部分式についての演算量として設定する。
情報処理装置100は、リスト7のレコード7−1から、分割部分式「1」を抽出して、対象分割部分式として設定する。対象分割部分式に縮約可能変数が含まれず、対象分割部分式についての縮約演算に使用される演算子がないため、対象演算子の数はカウントされない。対象分割部分式に含まれる演算子がないため、対象演算子の数はカウントされない。
情報処理装置100は、繰り返し総数に1を設定する。情報処理装置100は、対象分割部分式に使用されるスカラー変数がないため、繰り返し総数を「1」のままにする。情報処理装置100は、「繰り返し総数=1」を、演算単位として設定する。情報処理装置100は、それぞれの対象演算子の数に演算単位を乗算した値「0」を、ループ分割後の演算量のうちの対象分割部分式についての演算量として設定する。
情報処理装置100は、リスト7のレコード7−1の分割部分式の組み合わせを結合し、縮約演算式を実現する際に使用される演算子を特定し、演算子の種類ごとに演算子の数をカウントする。ここで、情報処理装置100は、分割部分式の組み合わせを結合する演算子「*」の数として「1」を設定する。また、情報処理装置100は、結合した対象分割部分式についての縮約演算に使用される演算子「+」の数として「1」を設定する。
情報処理装置100は、結合単位に1を設定する。情報処理装置100は、リスト7のレコード7−1のパラメータ「i,j」を特定する。情報処理装置100は、結合単位に、パラメータ「i,j」のそれぞれのパラメータの繰り返し回数を乗算することにより、結合単位に「n^2」を設定する。
情報処理装置100は、それぞれの演算子の数に結合単位を乗算した値「2n^2」を、ループ分割後の演算量のうち、分割部分式の組み合わせの結合と、結合した結果についての縮約演算とにかかる演算量として設定する。以下の説明では、分割部分式の組み合わせの結合と、結合した結果についての縮約演算とにかかる演算量をまとめて「結合についての演算量」と表記する場合がある。また、情報処理装置100は、スカラー変数「i,j,k,l,m」のそれぞれのスカラー変数の繰り返し回数を乗算することにより、元の演算量として「n^5」を設定する。
図17において、情報処理装置100は、元の演算量から、リスト8の各レコードの分割部分式についてのループ分割後の演算量を減算した差分を算出する。ループ分割後の演算量は、対象分割部分式についての演算量と、結合についての演算量との合計である。次に、情報処理装置100は、算出した差分を、削減量としてリスト9に記憶する。そして、情報処理装置100は、リスト9のレコードのうちで削減量が最大のレコードを取得する。その後、情報処理装置100は、取得したレコードに記憶された分割部分式の組み合わせを、ループ最適化する部分式として決定する。
(ソースコード400を最適化する一例)
図18は、ソースコード400を最適化する一例を示す説明図である。図18の例は、ソースコード400を最適化して得られたソースコード1800の一例である。
図18の例では、ソースコード1800の1,10行目には、ループ文「DO i=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の2〜9行目には、ループ文「DO i=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の1〜10行目には、変数iを1から開始して変数iがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード1800の2,9行目には、ループ文「DO m=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の3〜8行目には、ループ文「DO m=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の2〜9行目には、変数mを1から開始して変数mがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード1800の3行目には、代入文「t(i,m)=0」が記述される。これにより、ソースコード1800の3行目には、配列変数t(i,m)の値に、数値「0」を代入する初期化処理の内容が記述される。
ソースコード1800の4,8行目には、ループ文「DO k=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の5〜7行目には、ループ文「DO k=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の4〜8行目には、変数kを1から開始して変数kがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード1800の5,7行目には、ループ文「DO l=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の6行目には、ループ文「DO l=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の5〜7行目には、変数lを1から開始して変数lがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード1800の6行目には、代入文「t(i,m)=t(i,m)+a(i,k,m,l)*w(k,l)」が記述される。これにより、ソースコード1800の6行目には、配列変数t(i,m)の値に、配列変数t(i,m)+配列変数a(i,k,m,l)*配列変数w(k,l)の値を代入する代入処理が記述される。
このように、ソースコード1800の1〜10行目は、入れ子構造になった複数のループ文の集まりが記述された多重ループ箇所である。また、ソースコード1800の1〜3,9,10行目は、変数i,mを変化させ、縮約演算が行われる配列変数t(i,m)を切り替え、切り替えた配列変数t(i,m)を初期化する、入れ子構造になったループ文の集まりが記述された初期化ループ箇所である。また、ソースコード1800の4〜8行目は、初期化された配列変数t(i,m)に対する代入演算を繰り返すことによって、配列変数t(i,m)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
ソースコード1800の11,18行目には、ループ文「DO i=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の12〜17行目には、ループ文「DO i=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の11〜18行目には、変数iを1から開始して変数iがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード1800の12,17行目には、ループ文「DO j=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の13〜16行目には、ループ文「DO j=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の12〜17行目には、変数jを1から開始して変数jがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード1800の13行目には、代入文「s(i,j)=0」が記述される。これにより、ソースコード1800の13行目には、配列変数s(i,j)の値に、数値「0」を代入する初期化処理の内容が記述される。
ソースコード1800の14,16行目には、ループ文「DO m=1,n (ループ本体) ENDDO」が記述される。ソースコード1800の15行目には、ループ文「DO m=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード1800の14〜16行目には、変数mを1から開始して変数mがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード1800の15行目には、代入文「s(i,j)=s(i,j)+t(i,m)*v(j,m)」が記述される。これにより、ソースコード1800の15行目には、配列変数s(i,j)の値に、配列変数s(i,j)+配列変数t(i,m)*配列変数v(j,m)の値を代入する代入処理が記述される。
このように、ソースコード1800の11〜18行目は、入れ子構造になった複数のループ文の集まりが記述された多重ループ箇所である。また、ソースコード1800の11〜13,17,18行目は、変数i,jを変化させ、縮約演算が行われる配列変数s(i,j)を切り替え、配列変数s(i,j)を初期化する、入れ子構造になったループ文の集まりが記述された初期化ループ箇所である。また、ソースコード1800の14〜16行目は、初期化された配列変数s(i,j)に対する代入演算を繰り返すことによって、配列変数s(i,j)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
(コンパイル処理手順の一例)
次に、図19を用いて、コンパイル処理手順の一例について説明する。
図19は、コンパイル処理手順の一例を示すフローチャートである。図19において、情報処理装置100は、ソースコードを取得し、AST、変数表、および関数表を生成する、フロントエンド処理を実行する(ステップS1901)。次に、情報処理装置100は、図20に後述するループ分割処理を実行する(ステップS1902)。そして、情報処理装置100は、最適化処理を実行する(ステップS1903)。
次に、情報処理装置100は、最適化後のASTや変数表などに基づいて、オブジェクトコードを生成するバックエンド処理を実行する(ステップS1904)。そして、情報処理装置100は、コンパイル処理を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させて最適化が行われたオブジェクトコードを生成することができる。
(ループ分割処理手順の一例)
次に、図20を用いて、図19のステップS1902に示したループ分割処理手順の一例について説明する。
図20は、ループ分割処理手順の一例を示すフローチャートである。図20において、情報処理装置100は、ASTに基づいて、多重ループ箇所を検出する(ステップS2001)。次に、情報処理装置100は、ASTのノードにアドレスを割り当てる(ステップS2002)。そして、情報処理装置100は、変数の依存関係を特定する(ステップS2003)。
次に、情報処理装置100は、ASTのうち、検出した多重ループ箇所に含まれる縮約演算式に対応する部分木を抽出する(ステップS2004)。そして、情報処理装置100は、図21に後述する部分式抽出処理を実行する(ステップS2005)。次に、情報処理装置100は、図27に後述する変数分類処理を実行する(ステップS2006)。そして、情報処理装置100は、図33に後述する削減量算出処理を実行する(ステップS2007)。
次に、情報処理装置100は、図37に後述する最適化対象決定処理を実行する(ステップS2008)。そして、情報処理装置100は、図38に後述するAST変形処理を実行する(ステップS2009)。その後、情報処理装置100は、ループ分割処理手順を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させて、最適化を行うことができる。
(部分式抽出処理手順の一例)
次に、図21を用いて、図20のステップS2005に示した部分式抽出処理手順の一例について説明する。
図21は、部分式抽出処理手順の一例を示すフローチャートである。図21において、情報処理装置100は、いずれかの縮約演算式を選択する(ステップS2101)。次に、情報処理装置100は、選択した縮約演算式に対して、図22および図23に後述する抽出コア処理を実行する(ステップS2102)。
そして、情報処理装置100は、すべての縮約演算式を選択したか否かを判定する(ステップS2103)。ここで、未選択の縮約演算式がある場合(ステップS2103:No)、情報処理装置100は、ステップS2101の処理に戻る。
一方で、すべての縮約演算式を選択した場合(ステップS2103:Yes)、情報処理装置100は、部分式抽出処理を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させる際に用いられる部分式の候補となる、縮約演算式内の部分式を抽出することができる。
(抽出コア処理手順の一例)
次に、図22〜図24を用いて、抽出コア処理手順の一例について説明する。
図22〜図24は、抽出コア処理手順の一例を示すフローチャートである。図22において、情報処理装置100は、縮約演算式に対応する部分木の根ノードを参照して、根ノードの属性となる演算子が「+=」であるか否かを判定する(ステップS2201)。
ここで、演算子が「+=」である場合(ステップS2201:Yes)、情報処理装置100は、対象演算子として演算子「+」を設定して(ステップS2202)、ステップS2204の処理に移行する。
一方で、演算子が「=」である場合(ステップS2201:No)、情報処理装置100は、縮約演算式の右辺に対応する子ノードを参照して、対象演算子として子ノードの属性となる演算子を設定する(ステップS2203)。そして、情報処理装置100は、ステップS2204の処理に移行する。
ステップS2204において、情報処理装置100は、縮約演算式の右辺を対象部分式として設定する(ステップS2204)。次に、情報処理装置100は、縮約演算式の左辺を足し込み先部分式として設定する(ステップS2205)。そして、情報処理装置100は、部分式のリストを空に設定する(ステップS2206)。
次に、情報処理装置100は、図25に後述する抽出サブ処理を実行する(ステップS2207)。そして、情報処理装置100は、変数nに0を設定する(ステップS2208)。その後、情報処理装置100は、図23のステップS2301の処理に移行する。
図23において、情報処理装置100は、変数nが、部分式のリストの長さよりも小さいか否かを判定する(ステップS2301)。ここで、部分式のリストの長さ以上である場合(ステップS2301:No)、情報処理装置100は、抽出コア処理を終了する。
一方で、部分式のリストの長さよりも小さい場合(ステップS2301:Yes)、情報処理装置100は、分割部分式のリストを空に設定する(ステップS2302)。次に、情報処理装置100は、nにn+1を設定する(ステップS2303)。そして、情報処理装置100は、現在の部分式に、部分式のリストのn番目の部分式を設定する(ステップS2304)。
次に、情報処理装置100は、分割部分式のリストに、現在の部分式と「1」との組み合わせを、分割部分式の組み合わせとして追加する(ステップS2305)。そして、情報処理装置100は、現在の部分式に対応する部分木の根ノードを参照して、根ノードの属性となる演算子が2項演算子であるか否かを判定する(ステップS2306)。ここで、2項演算子ではない場合(ステップS2306:No)、情報処理装置100は、抽出コア処理を終了する。
一方で、2項演算子である場合(ステップS2306:Yes)、情報処理装置100は、現在の部分式を対象部分式として設定する(ステップS2307)。次に、情報処理装置100は、根ノードの属性となる2項演算子を対象演算子として設定する(ステップS2308)。そして、情報処理装置100は、「NULL」を足し込み先部分式として設定する(ステップS2309)。次に、情報処理装置100は、部分式のリストを、部分式のリストのセーブにコピーする(ステップS2310)。そして、情報処理装置100は、図24のステップS2401の処理に移行する。
図24において、情報処理装置100は、部分式のリストを空に設定する(ステップS2401)。次に、情報処理装置100は、図25に後述する抽出サブ処理を実行する(ステップS2402)。そして、情報処理装置100は、変数bに1を設定する(ステップS2403)。
次に、情報処理装置100は、変数bが、2^(部分式のリストの長さ−1)以下であるか否かを判定する(ステップS2404)。ここで、2^(部分式のリストの長さ−1)より大きい場合(ステップS2404:No)、情報処理装置100は、ステップS2408の処理に移行する。
一方で、2^(部分式のリストの長さ−1)以下である場合(ステップS2404:Yes)、情報処理装置100は、図26に後述する分割部分式生成処理を実行する(ステップS2405)。次に、情報処理装置100は、分割部分式のリストに、分割部分式の組み合わせを追加する(ステップS2406)。そして、情報処理装置100は、変数bに変数b+1を設定して(ステップS2407)、ステップS2404の処理に戻る。
ステップS2408において、情報処理装置100は、部分式のリストのセーブを、部分式のリストにコピーする(ステップS2408)。次に、情報処理装置100は、部分式のリストのn番目に、部分式のアドレスと、分割部分式のリストとを追加する(ステップS2409)。そして、情報処理装置100は、図23のステップS2301の処理に戻る。これにより、情報処理装置100は、縮約演算式内の部分式を抽出することができる。
(抽出サブ処理手順の一例)
次に、図25を用いて、図22のステップS2207や図24のステップS2402に示した抽出サブ処理手順の一例について説明する。
図25は、抽出サブ処理手順の一例を示すフローチャートである。図25において、情報処理装置100は、対象部分式に対応する部分木の根ノードを参照して、根ノードの属性となる演算子が対象演算子と一致するか否かを判定する(ステップS2501)。ここで、一致する場合(ステップS2501:Yes)、情報処理装置100は、対象部分式をXとして設定する(ステップS2502)。
次に、情報処理装置100は、Xに対応する部分木のいずれか一方の子ノードを選択し、選択した子ノードが根となる部分木に対応する式を、対象部分式として設定する(ステップS2503)。そして、情報処理装置100は、対象部分式に対して抽出サブ処理を実行する(ステップS2504)。
次に、情報処理装置100は、Xに対応する部分木の他方の子ノードを選択し、選択した子ノードが根となる部分木に対応する式を、対象部分式として設定する(ステップS2505)。そして、情報処理装置100は、対象部分式に対して抽出サブ処理を実行する(ステップS2506)。その後、情報処理装置100は、抽出サブ処理を終了する。
一方で、一致しない場合(ステップS2501:No)、情報処理装置100は、対象部分式が、足し込み先部分式と一致するか否かを判定する(ステップS2507)。ここで、一致しない場合(ステップS2507:No)、情報処理装置100は、部分式のリストに、対象部分式を追加する(ステップS2508)。そして、情報処理装置100は、抽出サブ処理を終了する。
一方で、一致する場合(ステップS2507:Yes)、情報処理装置100は、抽出サブ処理を終了する。これにより、情報処理装置100は、縮約演算式内の部分式を抽出することができる。
(分割部分式生成処理手順の一例)
次に、図26を用いて、分割部分式生成処理手順の一例について説明する。
図26は、分割部分式生成処理手順の一例を示すフローチャートである。図26において、情報処理装置100は、分割部分式1と分割部分式2とに「NULL」を設定する(ステップS2601)。
次に、情報処理装置100は、変数mに0を設定する(ステップS2602)。そして、情報処理装置100は、mが、部分式のリストの長さよりも小さいか否かを判定する(ステップS2603)。ここで、大きい場合(ステップS2603:No)、情報処理装置100は、分割部分式生成処理を終了する。
一方で、小さい場合(ステップS2603:Yes)、情報処理装置100は、変数bのmビット目が1であるか否かを判定する(ステップS2604)。ここで、0である場合(ステップS2604:No)、情報処理装置100は、ステップS2608の処理に移行する。
一方で、1である場合(ステップS2604:Yes)、情報処理装置100は、分割部分式2がNULLであるか否かを判定する(ステップS2605)。ここで、NULLである場合(ステップS2605:Yes)、情報処理装置100は、分割部分式2に部分式のリストのm+1番目のレコードの部分式を設定して(ステップS2606)、ステップS2611の処理に移行する。
一方で、NULLではない場合(ステップS2605:No)、情報処理装置100は、分割部分式2に、分割部分式2と部分式のリストのm+1番目のレコードの部分式とを対象演算子で接続した部分式を設定する(ステップS2607)。そして、情報処理装置100は、ステップS2611の処理に移行する。
ステップS2608において、情報処理装置100は、分割部分式1がNULLであるか否かを判定する(ステップS2608)。ここで、NULLである場合(ステップS2608:Yes)、情報処理装置100は、分割部分式1に部分式のリストのm+1番目のレコードの部分式を設定して(ステップS2609)、ステップS2611の処理に移行する。
一方で、NULLではない場合(ステップS2608:No)、情報処理装置100は、分割部分式1に、分割部分式1と部分式のリストのm+1番目のレコードの部分式とを対象演算子で接続した部分式を設定する(ステップS2610)。そして、情報処理装置100は、ステップS2611の処理に移行する。
ステップS2611において、情報処理装置100は、mにm+1を設定して(ステップS2611)、ステップS2603の処理に戻る。これにより、情報処理装置100は、縮約演算式内の部分式をさらに分割して得られる、ソフトウェアの実行時の演算量を低減させる際に用いられる部分式の候補となる、分割部分式を生成することができる。
(変数分類処理手順の一例)
次に、図27および図28を用いて、図20のステップS2006に示した変数分類処理手順の一例について説明する。
図27および図28は、変数分類処理手順の一例を示すフローチャートである。図27において、情報処理装置100は、分割部分式のリストのいずれかのレコードを選択する(ステップS2701)。次に、対象分割部分式に、選択したレコードに記憶された分割部分式の組み合わせを設定する(ステップS2702)。そして、情報処理装置100は、パラメータのリストを空に設定する(ステップS2703)。
次に、情報処理装置100は、図29に後述する第1パラメータ抽出処理を実行する(ステップS2704)。そして、情報処理装置100は、図30に後述する第2パラメータ抽出処理を実行する(ステップS2705)。次に、情報処理装置100は、図31に後述する第3パラメータ抽出処理を実行する(ステップS2706)。そして、情報処理装置100は、図28のステップS2801の処理に移行する。
図28において、情報処理装置100は、選択したレコードに記憶された一方の分割部分式についての縮約可能変数のリストを空に設定する(ステップS2801)。次に、情報処理装置100は、対象分割部分式に、選択したレコードに記憶された一方の分割部分式を設定する(ステップS2802)。そして、情報処理装置100は、図32に後述する縮約可能変数抽出処理を実行する(ステップS2803)。その後、情報処理装置100は、一方の分割部分式の縮約可能変数のリストに、抽出された縮約可能変数を設定する(ステップS2804)。
次に、情報処理装置100は、選択したレコードに記憶された他方の分割部分式についての縮約可能変数のリストを空に設定する(ステップS2805)。次に、情報処理装置100は、対象分割部分式に、選択したレコードに記憶された他方の分割部分式を設定する(ステップS2806)。そして、情報処理装置100は、図32に後述する縮約可能変数抽出処理を実行する(ステップS2807)。その後、情報処理装置100は、他方の分割部分式の縮約可能変数のリストに、抽出された縮約可能変数を設定する(ステップS2808)。
次に、情報処理装置100は、すべてのレコードを選択したか否かを判定する(ステップS2809)。ここで、未選択のレコードがある場合(ステップS2809:No)、情報処理装置100は、図27のステップS2701の処理に戻る。
一方で、すべてのレコードを選択した場合(ステップS2809:Yes)、情報処理装置100は、変数分類処理を終了する。これにより、情報処理装置100は、削減される演算量の算出およびASTの変形の際に用いられる、パラメータおよび縮約可能変数を分類した結果を得ることができる。
(第1パラメータ抽出処理手順の一例)
次に、図29を用いて、図27のステップS2704に示した第1パラメータ抽出処理手順の一例について説明する。
図29は、第1パラメータ抽出処理手順の一例を示すフローチャートである。図29において、情報処理装置100は、対象分割部分式が含まれる縮約演算式のうちの足し込み先部分式に対応する部分木の根ノードをSとする(ステップS2901)。
次に、情報処理装置100は、Sの属性となる変数の種類が、配列変数であるか否かを判定する(ステップS2902)。ここで、スカラー変数である場合(ステップS2902:No)、情報処理装置100は、第1パラメータ抽出処理を終了する。
一方で、配列変数である場合(ステップS2902:Yes)、情報処理装置100は、Sの子ノードのうち、属性がインデックスである子ノードを選択する(ステップS2903)。次に、情報処理装置100は、選択した子ノードをAとする(ステップS2904)。そして、情報処理装置100は、Aの属性となるインデックスを、対象分割部分式のパラメータのリストに追加する(ステップS2905)。
次に、情報処理装置100は、属性がインデックスである子ノードをすべて選択したか否かを判定する(ステップS2906)。ここで、未選択の子ノードがある場合(ステップS2906:No)、情報処理装置100は、ステップS2903の処理に戻る。
一方で、子ノードをすべて選択した場合(ステップS2906:Yes)、情報処理装置100は、第1パラメータ抽出処理を終了する。これにより、情報処理装置100は、パラメータを抽出することができる。
(第2パラメータ抽出処理手順の一例)
次に、図30を用いて、図27のステップS2705に示した第2パラメータ抽出処理手順の一例について説明する。
図30は、第2パラメータ抽出処理手順の一例を示すフローチャートである。図30において、情報処理装置100は、対象分割部分式が含まれる縮約演算式のうちの足し込み先部分式に対応する部分木の根ノードをSとする(ステップS3001)。
次に、情報処理装置100は、縮約演算を行うループ箇所の最も外側のループ文をAとする(ステップS3002)。そして、情報処理装置100は、Aよりも外側のループ文を選択する(ステップS3003)。
次に、情報処理装置100は、選択したループ文の繰り返し回数を規定するインデックスを、対象分割部分式のパラメータのリストに追加する(ステップS3004)。そして、情報処理装置100は、Aよりも外側にあるすべてのループ文を選択したか否かを判定する(ステップS3005)。ここで、未選択のループ文がある場合(ステップS3005:No)、情報処理装置100は、ステップS3003の処理に戻る。
一方で、すべてのループ文を選択した場合(ステップS3005:Yes)、情報処理装置100は、第2パラメータ抽出処理を終了する。これにより、情報処理装置100は、パラメータを抽出することができる。
(第3パラメータ抽出処理手順の一例)
次に、図31を用いて、図27のステップS2706に示した第3パラメータ抽出処理手順の一例について説明する。
図31は、第3パラメータ抽出処理手順の一例を示すフローチャートである。図31において、情報処理装置100は、対象分割部分式のうちの一方の分割部分式をAとする(ステップS3101)。次に、情報処理装置100は、対象分割部分式のうちの他方の分割部分式をBとする(ステップS3102)。そして、情報処理装置100は、Aについての変数のリストを空にする(ステップS3103)。
次に、情報処理装置100は、Aの子孫ノードを走査し、Aの子孫ノードを選択する(ステップS3104)。そして、情報処理装置100は、選択したノードの属性がインデックスであれば、選択したノードの属性となるインデックスを、Aについての変数のリストに追加する(ステップS3105)。
その後、情報処理装置100は、子孫ノードの走査が終了したか否かを判定する(ステップS3106)。ここで、走査が終了していない場合(ステップS3106:No)、情報処理装置100は、ステップS3104の処理に戻る。
一方で、走査が終了した場合(ステップS3106:Yes)、情報処理装置100は、Bの子孫ノードを走査し、Bの子孫ノードを選択する(ステップS3107)。そして、情報処理装置100は、選択したノードの属性がインデックスであり、Aについての変数のリストにもあれば、選択したノードの属性となるインデックスを対象分割部分式のパラメータのリストに追加する(ステップS3108)。
その後、情報処理装置100は、子孫ノードの走査が終了したか否かを判定する(ステップS3109)。ここで、走査が終了していない場合(ステップS3109:No)、情報処理装置100は、ステップS3107の処理に戻る。
一方で、走査が終了した場合(ステップS3109:Yes)、情報処理装置100は、第3パラメータ抽出処理を終了する。これにより、情報処理装置100は、パラメータを抽出することができる。
(縮約可能変数抽出処理手順の一例)
次に、図32を用いて、図28のステップS2803に示した縮約可能変数抽出処理手順の一例について説明する。
図32は、縮約可能変数抽出処理手順の一例を示すフローチャートである。図32において、情報処理装置100は、縮約可能変数のリストを空にする(ステップS3201)。次に、情報処理装置100は、縮約演算式に対応する抽象構文木を走査し、縮約演算式に含まれる変数のリストを生成する(ステップS3202)。
そして、情報処理装置100は、変数のリストのうち、パラメータのリストに含まれない変数を、縮約可能変数のリストに追加する(ステップS3203)。その後、情報処理装置100は、縮約可能変数抽出処理を終了する。これにより、情報処理装置100は、縮約可能変数を抽出することができる。
(削減量算出処理手順の一例)
次に、図33を用いて、図20のステップS2007に示した削減量算出処理手順の一例について説明する。
図33は、削減量算出処理手順の一例を示すフローチャートである。図33において、情報処理装置100は、分割部分式のリストのいずれかのレコードを選択する(ステップS3301)。次に、情報処理装置100は、選択したレコードの一方の分割部分式を、対象分割部分式に設定する(ステップS3302)。そして、情報処理装置100は、図34に後述する算出サブ処理を実行する(ステップS3303)。その後、情報処理装置100は、一方の分割部分式の演算量に、算出サブ処理によって算出した合計演算量を設定する(ステップS3304)。
次に、情報処理装置100は、選択したレコードの他方の分割部分式を、対象分割部分式に設定する(ステップS3305)。そして、情報処理装置100は、図34に後述する算出サブ処理を実行する(ステップS3306)。その後、情報処理装置100は、一方の分割部分式の演算量に、算出サブ処理によって算出した合計演算量を設定する(ステップS3307)。
次に、情報処理装置100は、パラメータについての繰り返し回数に基づいて、分割部分式同士の結合についての演算量を算出する(ステップS3308)。そして、情報処理装置100は、すべてのレコードを選択したか否かを判定する(ステップS3309)。ここで、未選択のレコードがある場合(ステップS3309:No)、情報処理装置100は、ステップS3301の処理に戻る。
一方で、すべてのレコードを選択した場合(ステップS3309:Yes)、情報処理装置100は、削減量算出処理を終了する。これにより、情報処理装置100は、ループ分割後の演算量のうち、それぞれの部分式についての演算量を算出することができる。
(算出サブ処理手順の一例)
次に、図34〜図36を用いて、図33のステップS3303やステップS3306に示した算出サブ処理手順の一例について説明する。
図34〜図36は、算出サブ処理手順の一例を示すフローチャートである。図34において、情報処理装置100は、演算量のリストを空にする(ステップS3401)。また、情報処理装置100は、対象分割部分式に対応する部分木を走査して、対象分割部分式が縮約可能変数を含めば、縮約演算にかかる演算子と、カウント「1」を対応付けたレコードを、演算量のリストに追加する(ステップS3402)。
次に、情報処理装置100は、対象分割部分式に対応する部分木を走査して、属性が演算子であるノードを選択する(ステップS3403)。そして、情報処理装置100は、選択したノードの属性が演算量のリストに記憶されていない演算子であれば、選択したノードの属性となる演算子と、カウント「0」とを対応付けたレコードを、演算量のリストに追加する(ステップS3404)。
次に、情報処理装置100は、演算量のリストにおける、選択したノードの属性となる演算子に対応するカウントをインクリメントする(ステップS3405)。そして、情報処理装置100は、走査が終了したか否かを判定する(ステップS3406)。ここで、走査が終了していない場合(ステップS3406:No)、情報処理装置100は、ステップS3402の処理に戻る。
一方で、走査が終了した場合(ステップS3406:Yes)、情報処理装置100は、繰り返し総数に1を設定する(ステップS3407)。そして、情報処理装置100は、図35のステップS3501の処理に移行する。
図35において、情報処理装置100は、ループ文の繰り返し回数を規定するループ変数のいずれかの変数を選択する(ステップS3501)。次に、情報処理装置100は、選択したループ変数に対応するループ処理をLとする(ステップS3502)。そして、情報処理装置100は、Lの開始値、終了値、増分の少なくともいずれかに、未定値があるか否かを判定する(ステップS3503)。ここで、未定値がない場合(ステップS3503:No)、情報処理装置100は、ステップS3506の処理に移行する。
一方で、未定値がある場合(ステップS3503:Yes)、情報処理装置100は、Lの開始値、終了値、増分にヒントとして値が設定されていれば、当該値をLの開始値、終了値、増分に使用する(ステップS3504)。次に、情報処理装置100は、ヒントとして値が設定されていなければ、システムのデフォルト値をLの開始値、終了値、増分に使用する(ステップS3505)。
そして、情報処理装置100は、選択した変数が、対象分割部分式に含まれるパラメータまたは縮約可能変数と一致するか否かを判定する(ステップS3506)。ここで、一致する場合(ステップS3506:Yes)、情報処理装置100は、繰り返し総数に、繰り返し総数*Lの繰り返し回数を設定して(ステップS3507)、ステップS3508の処理に移行する。
一方で、一致しない場合(ステップS3506:No)、情報処理装置100は、すべての変数を選択したか否かを判定する(ステップS3508)。ここで、未選択の変数がある場合(ステップS3508:No)、情報処理装置100は、ステップS3501の処理に戻る。一方で、すべての変数を選択した場合(ステップS3508:Yes)、情報処理装置100は、図36のステップS3601の処理に移行する。
図36において、情報処理装置100は、繰り返し総数を、演算単位として設定する(ステップS3601)。次に、情報処理装置100は、合計演算量に0を設定する(ステップS3602)。そして、情報処理装置100は、演算量のリストのレコードを選択する(ステップS3603)。
次に、情報処理装置100は、選択したレコードに記憶されたカウントに、カウント*演算単位を設定する(ステップS3604)。そして、情報処理装置100は、合計演算量に、合計演算量+カウント*演算の重みを設定する(ステップS3605)。次に、情報処理装置100は、すべてのレコードを選択したか否かを判定する(ステップS3606)。ここで、未選択のレコードがある場合(ステップS3606:No)、情報処理装置100は、ステップS3603の処理に戻る。
一方で、すべてのレコードを選択した場合(ステップS3606:Yes)、情報処理装置100は、算出サブ処理を終了する。これにより、情報処理装置100は、ループ分割後の演算量のうち、対象分割部分式についての演算量を算出することができる。
(最適化対象決定処理手順の一例)
次に、図37を用いて、図20のステップS2008に示した最適化対象決定処理手順の一例について説明する。
図37は、最適化対象決定処理手順の一例を示すフローチャートである。図37において、情報処理装置100は、元の演算量を算出する(ステップS3701)。次に、情報処理装置100は、部分式のリストのいずれかの部分式を選択する(ステップS3702)。そして、情報処理装置100は、部分式に対応する分割部分式の組み合わせのうち、元の演算量から分割部分式の演算量と結合についての演算量とを減算した差分が最大の組み合わせを最適化対象に決定し、最適化対象のリストに追加する(ステップS3703)。
次に、情報処理装置100は、すべての部分式を選択したか否かを判定する(ステップS3704)。ここで、未選択の部分式がある場合(ステップS3704:No)、情報処理装置100は、ステップS3702の処理に戻る。一方で、すべての部分式を選択した場合(ステップS3704:Yes)、情報処理装置100は、最適化対象決定処理を終了する。これにより、情報処理装置100は、最も削減量が大きい部分式を用いて、最適化を行うことができる。
(AST変形処理手順の一例)
次に、図38を用いて、図20のステップS2009に示したAST変形処理手順の一例について説明する。
図38は、AST変形処理手順の一例を示すフローチャートである。図38において、情報処理装置100は、最適化対象のリストのいずれかの分割部分式の組み合わせを、対象要素として選択する(ステップS3801)。次に、情報処理装置100は、選択した対象要素について、図39に後述する縮約演算式挿入処理を実行する(ステップS3802)。そして、情報処理装置100は、ループ分割処理を実行する(ステップS3803)。
次に、情報処理装置100は、対象分割部分式に、対象要素のうちの一方の分割部分式を設定する(ステップS3804)。そして、情報処理装置100は、対象分割部分式について、図40に後述する変形サブ処理を実行する(ステップS3805)。
次に、情報処理装置100は、対象分割部分式に、対象要素のうちの他方の分割部分式を設定する(ステップS3806)。そして、情報処理装置100は、対象分割部分式について、図40に後述する変形サブ処理を実行する(ステップS3807)。
次に、情報処理装置100は、すべての組み合わせを選択したか否かを判定する(ステップS3808)。ここで、未選択の組み合わせがある場合(ステップS3808:No)、情報処理装置100は、ステップS3801の処理に戻る。
一方で、すべての組み合わせを選択した場合(ステップS3808:Yes)、情報処理装置100は、AST変形処理を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させることができる。
(縮約演算式挿入処理手順の一例)
次に、図39を用いて、図38のステップS3802に示した縮約演算式挿入処理手順の一例について説明する。
図39は、縮約演算式挿入処理手順の一例を示すフローチャートである。図39において、情報処理装置100は、対象要素に対応する部分木の親ノードの属性が、演算子「+=」であるか否かを判定する(ステップS3901)。ここで、演算子「+=」である場合(ステップS3901:Yes)、情報処理装置100は、縮約演算式挿入処理を終了する。
一方で、演算子「+=」ではない場合(ステップS3901:No)、情報処理装置100は、対象要素に対応する部分木の親ノードの属性が、演算子「=」であるか否かを判定する(ステップS3902)。ここで、演算子「+」である場合(ステップS3902:Yes)、情報処理装置100は、縮約演算式挿入処理を終了する。
一方で、演算子「+」ではない場合(ステップS3902:No)、情報処理装置100は、対象要素が含まれる縮約演算式と並列した、対象要素を縮約演算する縮約演算式に対応する部分木を生成する(ステップS3903)。そして、情報処理装置100は、縮約演算式挿入処理を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させるように、ASTを変形する準備として、縮約演算式を挿入することができる。
(変形サブ処理手順の一例)
次に、図40を用いて、図38のステップS3805やステップS3807に示した変形サブ処理手順の一例について説明する。
図40は、変形サブ処理手順の一例を示すフローチャートである。図40において、情報処理装置100は、対象分割部分式の削減量が0より大きいか否かを判定する(ステップS4001)。ここで、0以下である場合(ステップS4001:No)、情報処理装置100は、変形サブ処理を終了する。
一方で、0より大きい場合(ステップS4001:Yes)、情報処理装置100は、対象要素が含まれる縮約演算式の多重ループの直前に、対象分割部分式のパラメータをループ変数とする多重ループに対応する部分木を生成する(ステップS4002)。次に、情報処理装置100は、多重ループの一番内側に、対象分割部分式のインデックス、かつ、パラメータである変数をインデックスにした配列変数の初期化式に対応する部分木を生成する(ステップS4003)。
そして、情報処理装置100は、初期化式の直後に、縮約可能変数をループ変数とする多重ループに対応する部分木を生成する(ステップS4004)。次に、情報処理装置100は、多重ループの一番内側に、初期化した配列変数に対象分割部分式を縮約演算する縮約演算式に対応する部分木を生成する(ステップS4005)。そして、情報処理装置100は、対象分割部分式が元々含まれていた縮約演算式のうちの対象部分式を配列変数に置換する(ステップS4006)。
次に、情報処理装置100は、対象分割部分式が元々含まれていた縮約演算式についての多重ループのうちの、縮約可能変数をループ変数とするループ文に対応する部分木を削除する(ステップS4007)。そして、情報処理装置100は、変形サブ処理を終了する。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させるように、ASTを変形することができる。
以上説明したように、情報処理装置100によれば、プログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定することができる。次に、情報処理装置100によれば、第1式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コード、および、第1式のうちの部分式が第2変数に置換された第3式についての計算を繰り返す第2コードを生成することができる。そして、情報処理装置100によれば、プログラムコードのうちのループ箇所を第1コードおよび第2コードに変換したプログラムコードを出力することができる。これにより、情報処理装置100は、ソフトウェアの実行時の演算量を低減させて、ソフトウェアの処理時間の短縮化を図ることができる。
情報処理装置100によれば、第1式のうちの各部分式について、第2式についての計算の種類および繰り返し回数と、第3式についての計算の種類および繰り返し回数とを特定することができる。次に、情報処理装置100によれば、特定した結果に基づいて、第1式のうちの各部分式について、第2式についての計算を繰り返す演算量および第3式についての計算を繰り返す演算量の合計と、ループ箇所の演算量との差分を算出することができる。そして、情報処理装置100によれば、算出した差分に基づいて、第1式のうちのいずれかの部分式を選択し、選択したいずれかの部分式について第1コードおよび第2コードを生成することができる。これにより、情報処理装置100は、プログラムコードを変換した場合に、削減される演算量を算出することができる。そして、情報処理装置100は、ソフトウェアの実行時の演算量が最も低減されるようにプログラムコードを変換する場合に、第2式において使用する部分式を選択することができる。
情報処理装置100によれば、第1式についての計算を繰り返す条件に使用される変数を、第1種別の変数と、第1種別の変数とは異なる第2種別の変数とに分類することができる。そして、情報処理装置100によれば、分類した結果に基づいて、第1式のうちの各部分式について、第2式についての計算の種類および繰り返し回数と、第3式についての計算の種類および繰り返し回数とを特定することができる。これにより、情報処理装置100は、第1コードや第2コードを生成しなくても、ループ箇所を第1コードや第2コードに変換した場合に削減される演算量を算出することができる。
情報処理装置100によれば、第1式のうちの各部分式について、第2式についての計算の繰り返し条件に使用する変数および繰り返し回数と、第3式についての計算の繰り返し条件に使用する変数および繰り返し回数とを特定することができる。そして、情報処理装置100によれば、特定した変数および繰り返し回数に基づいて、ループ文を用いて第1コードを生成し、ループ文を用いて第2コードを生成することができる。これにより、情報処理装置100は、用いなくてもよいループ文を含まない第1コードや第2コードを生成することができる。
情報処理装置100によれば、第1式についての計算を繰り返す条件に使用される変数を、第1種別の変数と、第1種別の変数とは異なる第2種別の変数とに分類することができる。そして、情報処理装置100によれば、分類した結果に基づいて、第1式のうちの各部分式について、第2式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定することができる。また、情報処理装置100によれば、分類した結果に基づいて、第1式のうちの各部分式について、第3式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定することができる。これにより、情報処理装置100は、第1コードや第2コードに、どのループ文を用いるかを判定する際に用いる情報を得ることができる。
情報処理装置100によれば、第1式が「第1演算子」により第1変数に対して縮約演算する式であれば、部分式を同一の演算子である「第1演算子」により第2変数に対して縮約演算する式を第2式として採用することができる。これにより、情報処理装置100は、第1式のうちの部分式と置換可能な定数が、第2変数の値として算出されるように、第2式を生成することができる。
(実施の形態2にかかるコンパイル方法の一実施例)
図41は、実施の形態2にかかるコンパイル方法の一実施例を示す説明図である。図41において、情報処理装置100は、プログラムコードに規定された機能が変更されない範囲で、プログラムコードに記述された処理内容を変更して、ソフトウェアの処理時間の短縮化を図る。
ここで、最適化の技術には、例えば、1つのループ処理において、ループ本体内の複数箇所に同一内容の式があれば、当該式についての計算を1箇所で1回行っておき、当該式の計算結果で複数箇所の当該式を置き換える技術がある。
しかしながら、縮約演算する式が含まれるネスト構造の多重ループ処理のうちの複数のループ処理を通して計算される式の集まりが複数ある場合に、それぞれの集まりに同一内容の式が含まれても、上述した最適化の技術を適用することができない。このため、縮約演算する式が含まれる多重ループ処理については、処理内容をどのように変更すれば演算量が低減されるか分からず、ソフトウェアの処理時間を短縮することができない場合がある。
そこで、本実施の形態では、縮約演算する式が含まれる多重ループ処理について処理内容を変更して、ソフトウェアの実行時の演算量の低減化を図ることにより、ソフトウェアの処理時間の短縮化を図るコンパイル方法について説明する。
図41の例では、プログラムコードとして、式4110についての計算、および式4120についての計算を繰り返すループ箇所が記述されたソースコード4101を例に挙げて、情報処理装置100の動作について説明する。
式4110は、「s(i,j)=s(i,j)+a(i,j)*b(l,i)*c(k)」である。式4110は、変数「a(i,j)」や変数「b(l,i)」や変数「c(k)」を第1変数「s(i,j)」に対して縮約演算する式である。式4120は、「s(i,j)=s(i,j)+a(i,j)*b(k,i)」である。式4120は、変数「a(i,j)」や変数「b(k,i)」を第1変数「s(i,j)」に対して縮約演算する式である。
ここで、例えば、n=2とした場合には、ループ箇所において式4110についての計算を繰り返すという第1処理内容は、機能を変更せずに、符号4140に示す下記式(9)〜式(12)についての計算を行うという第2処理内容に変更することが可能である。これにより、第2処理内容では、第1処理内容よりも演算子の数が減るため、演算量が低減される。
s(1,1)=s(1,1)+a(1,1)*{b(1,1)+b(2,1)}
・・・(9)
s(1,2)=s(1,2)+a(1,2)*{b(1,1)+b(2,1)}
・・・(10)
s(2,1)=s(2,1)+a(2,1)*{b(1,2)+b(2,2)}
・・・(11)
s(2,2)=s(2,2)+a(2,2)*{b(1,2)+b(2,2)}
・・・(12)
また、例えば、n=2とした場合には、ループ箇所において式4120についての計算を繰り返すという第3処理内容は、機能を変更せずに、符号4150に示す下記式(13)〜式(16)についての計算を行うという第4処理内容に変更することが可能である。これにより、第4処理内容では、第3処理内容よりも演算子の数が減るため、演算量が低減される。
s(1,1)=s(1,1)+a(1,1)*{b(1,1)+b(2,1)}*c(1)+a(1,1)*{b(1,1)+b(2,1)}*c(2) ・・・(13)
s(1,2)=s(1,2)+a(1,2)*{b(1,1)+b(2,1)}*c(1)+a(1,2)*{b(1,1)+b(2,1)}*c(2) ・・・(14)
s(2,1)=s(2,1)+a(2,1)*{b(1,2)+b(2,2)}*c(1)+a(2,1)*{b(1,2)+b(2,2)}*c(2) ・・・(15)
s(2,2)=s(2,2)+a(2,2)*{b(1,2)+b(2,2)}*c(1)+a(2,2)*{b(1,2)+b(2,2)}*c(2) ・・・(16)
さらに、上述した第2処理内容および第4処理内容は、定数として扱うことが可能な、複数の式に共通する同一内容の式が含まれる。このため、第2処理内容および第4処理内容は、機能を変更せずに、共通する同一内容の式についての計算を行ってから、当該計算で得られた結果を利用して式(9)〜(16)について計算を行うという第5処理内容に変更することが可能である。
例えば、式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算が行われた後に、当該計算で得られた結果を利用して式(9)〜(16)についての計算が行われる。これにより、第5処理内容では、定数として扱うことが可能な、複数の式に共通する同一内容の式についての計算を複数回ずつ行わなくてもよくなるため、演算量が低減される。
このように、複数のループ処理を通して計算される式の集まりが複数ある場合に、それぞれの集まりに共通して、定数として扱うことが可能な式が含まれる場合には、ソースコード4101に記述された処理内容を変更すれば、演算量を低減することが可能である。このため、情報処理装置100は、上述した処理内容の変更による演算量の低減化が実現されるように、ソースコード4101のループ箇所を変換して、変換後のソースコード4102を出力することになる。
図41の例では、(41−1)情報処理装置100は、ソースコード4101を取得する。次に、情報処理装置100は、ソースコード4101に対して字句解析や文法解析を行い、ソースコード4101に対応する抽象構文木を作成する。そして、情報処理装置100は、抽象構文木に基づいて、ソースコード4101に記述された、式4110「s(i,j)=s(i,j)+a(i,j)*b(l,i)*c(k)」についての計算を繰り返すループ箇所を特定する。また、情報処理装置100は、式4110のうちの部分式「b(l,i)」を特定する。
(41−2)情報処理装置100は、特定したループ箇所内にある、式4110とは異なる式4120「s(i,j)=s(i,j)+a(i,j)*b(k,i)」を特定する。そして、情報処理装置100は、式4120のうち、式4110のうちの部分式「b(l,i)」と少なくとも変数および変数間の関係が同一である他の部分式「b(k,i)」を特定する。
(41−3)情報処理装置100は、特定した他の部分式「b(k,i)」を第2変数「t(i)」に対して縮約演算する式4160「t(i)=t(i)+b(k,i)」についての計算を繰り返す第1コードを生成する。式4160は、式4110のうちの部分式「b(l,i)」を第2変数「t(i)」に対して縮約演算する式「t(i)=t(i)+b(l,i)」と等価である。第1コードは、上述した式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算を行うという処理内容に対応するコードである。第2変数は、式4110のうちの部分式および式4120のうちの他の部分式のそれぞれと置換可能な変数である。
また、情報処理装置100は、式4110のうちの部分式が第2変数に置換された式4170「s(i,j)=s(i,j)+a(i,j)*t(i)*c(k)」を特定する。また、情報処理装置100は、式4120のうちの他の部分式が第2変数に置換された式4180「s(i,j)=s(i,j)+a(i,j)*t(i)」を特定する。そして、情報処理装置100は、式4170および式4180についての計算を繰り返す第2コードを生成する。第2コードは、式「b(1,1)+b(2,1)」や式「b(1,1)+b(2,2)」についての計算で得られた結果を利用して、式(9)〜(16)についての計算を行うという処理内容に対応するコードである。
(41−4)情報処理装置100は、ソースコード4101のうちのループ箇所を第1コードおよび第2コードに変換する。そして、情報処理装置100は、変換後のソースコード4102を、表示装置に出力し、他のコンピュータに送信し、または記憶装置に記憶する。
このように、情報処理装置100によれば、縮約演算する式4110の部分式、および縮約演算する式4120の他の部分式のそれぞれを縮約演算した場合の演算結果を、一度にまとめて算出する式4160を含む第1コードを生成することができる。そして、情報処理装置100によれば、ソースコード4101のうちのループ箇所を、第1コードと、演算結果を利用した式4170および式4180を含むループ処理を示す第2コードとに変換することができる。これにより、情報処理装置100は、複数のループ処理を通して計算される複数の式の集まりに共通して、定数として扱うことが可能な式について式4160を作成し、式4160についての計算を予め行うように、ソースコード4101を変換することができる。
結果として、情報処理装置100は、ソフトウェアの実行時の演算量を低減して、ソフトウェアの処理時間の短縮化を図ることができる。例えば、ソースコード4101では、加算「+」と乗算「*」とが、「n^3」回繰り返して実行され、加算「+」と2回分の乗算「*」とが、「n^4」回繰り返して実行される。このため、ソースコード4101では、演算量は「2n^3+3n^4」である。
これに対し、変換後のソースコード4102では、加算「+」が「n^2」回実行され、加算「+」と乗算「*」とが「n^2」回実行され、加算「+」と2回分の乗算「*」とが「n^3」回実行される。このため、変換後のソースコード4102では、演算量は「n^2+2n^2+3n^3」である。結果として、変換後のソースコード4102では、n>2であれば、演算量が低減される。
ここでは、式4170と式4180とがまとめて1つのループ処理に含まれる場合について説明したが、これに限らない。例えば、情報処理装置100は、第2コードの代わりに、式4170を含むループ処理を示すコードと、式4180を含むループ処理を示すコードとの組み合わせを採用してもよい。
(実施の形態2にかかる情報処理装置100のハードウェア構成例)
次に、情報処理装置100のハードウェア構成例について説明する。情報処理装置100のハードウェア構成例は、図2に示したハードウェア構成例と同様であるため、説明を省略する。
(実施の形態2にかかる情報処理装置100の機能的構成例)
次に、情報処理装置100の機能的構成例について説明する。情報処理装置100は、図3に示したように、特定部301と、分類部302と、算出部303と、選択部304と、生成部305と、出力部306とを含む。
特定部301は、実施の形態1と同様に、ソフトウェアのプログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定する。そして、特定部301は、第1式のうちの部分式を特定する。特定部301は、さらに、特定したループ箇所内にある、第3変数に縮約演算する第4式のうち、第1式のうちの部分式と少なくとも変数および変数間の関係が同一である他の部分式を特定する。
特定部301は、例えば、第1式「s(i,j)=s(i,j)+a(i,j)*b(l,i)*c(k)」についての計算を繰り返すループ箇所を特定する。そして、特定部301は、第1式のうちの部分式「b(l,i)」などを特定する。特定部301は、さらに、ループ箇所内にある、第4式「s(i,j)=s(i,j)+a(i,j)*b(k,i)」を特定する。そして、特定部301は、第1式のうちの部分式「b(l,i)」との間で、インデックスが異なっていても、変数および変数間の関係が同一である、第4式のうちの部分式「b(k,i)」を特定する。これにより、特定部301は、ソフトウェアの実行時の演算量を低減させることができる可能性があるループ箇所を特定することができる。
分類部302は、実施の形態1と同様に、第1式についての計算を繰り返す条件に使用される変数を、第1式のうちの各部分式における第1種別の変数と、第1種別の変数とは異なる第2種別の変数とに分類する。分類部302は、さらに、第4式についての計算を繰り返す条件に使用される変数を、第4式のうちの各部分式における第1種別の変数と、第1種別の変数とは異なる第2種別の変数とに分類する。これにより、分類部302は、第1式のうちの部分式および第4式のうちの部分式の組み合わせを基にループ箇所を変換した場合に削減される演算量を算出する際に用いる情報を得ることができる。
算出部303は、第4式のうちで特定した各部分式について、当該部分式を第2変数に対して縮約演算する第2式についての計算の種類および繰り返し回数を特定する。ここで、第2変数は、第1式のうちの部分式、および第4式のうちの部分式と置換可能な変数である。また、算出部303は、第1式のうちの当該部分式が第2変数に置換された第3式についての計算の種類および繰り返し回数を特定する。また、算出部303は、第4式のうちの部分式が第2変数に置換された第5式についての計算の種類および繰り返し回数を特定する。
そして、算出部303は、特定した種類および繰り返し回数に基づいて、第2式についての計算を繰り返す演算量、第3式についての計算を繰り返す演算量、および第5式についての計算を繰り返す演算量の合計と、ループ箇所の演算量との差分を算出する。
算出部303は、例えば、分類した結果に基づいて、第4式のうちで特定した各部分式について、当該部分式を第2変数に対して縮約演算する第2式についての計算の種類および繰り返し回数を特定する。また、算出部303は、分類した結果に基づいて、第1式のうちの各部分式について、第1式のうちの当該部分式が第2変数に置換された第3式についての計算の種類および繰り返し回数を特定する。また、算出部303は、分類した結果に基づいて、第4式のうちの各部分式について、第4式のうちの当該部分式が第2変数に置換された第5式についての計算の種類および繰り返し回数を特定する。
そして、算出部303は、第2式について特定した種類ごとの演算子の数と、繰り返し回数とを乗算した値を、第2式についての計算を繰り返す演算量として算出する。また、算出部303は、第3式について特定した種類ごとの演算子の数と、繰り返し回数とを乗算した値を、第3式についての計算を繰り返す演算量として算出する。また、算出部303は、第5式について特定した種類ごとの演算子の数と、繰り返し回数とを乗算した値を、第3式についての計算を繰り返す演算量として算出する。
そして、算出部303は、第2式についての計算を繰り返す演算量、第5式についての計算を繰り返す演算量および第3式についての計算を繰り返す演算量の合計とループ箇所の演算量との差分を算出する。これにより、算出部303は、プログラムコードを変換した場合に削減される演算量を特定することができる。
選択部304は、算出部303が算出した差分に基づいて、第4式のうちの部分式を選択する。選択部304は、例えば、算出部303が算出した差分が最も大きい、第4式のうちの部分式との組み合わせを選択する。これにより、選択部304は、ソフトウェアの実行時の演算量が最も低減されるように、プログラムコードを変換する場合に用いる部分式を選択することができる。
生成部305は、選択した第4式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コードを生成する。また、生成部305は、選択した第4式のうちの部分式と、当該部分式との間で変数および変数間の関係が同一の、第1式のうちの部分式を特定する。次に、生成部305は、第1式のうちの部分式が第2変数に置換された第3式についての計算を繰り返し、かつ、第4式のうちの他の部分式が第2変数に置換された第5式についての計算を繰り返す第2コードを生成する。生成部305は、例えば、選択した部分式の組み合わせについて第1コードおよび第2コードを生成する。
生成部305は、具体的には、第4式のうちで特定した各部分式について、当該部分式を縮約演算する第2式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。また、生成部305は、第1式のうちの部分式が第2変数に置換された第3式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。また、生成部305は、第4式のうちの部分式が第2変数に置換された第5式についての計算の繰り返し条件に使用する変数および繰り返し回数を特定する。そして、生成部305は、特定した変数および繰り返し回数に基づいて、ループ文を用いて第1コードを生成し、ループ文を用いて第2コードを生成する。
生成部305は、より具体的には、分類した結果に基づいて、上述した変数および繰り返し回数を特定する。そして、生成部305は、特定した変数および繰り返し回数に基づいて、ループ文を用いて第1コードを生成し、ループ文を用いて第2コードを生成する。これにより、生成部305は、ソフトウェアの実行時の演算量を低減させることができるプログラムコードを生成することができる。
出力部306は、実施の形態1と同様に、プログラムコードのうちのループ箇所を第1コードおよび第2コードに変換した変換後のプログラムコードを出力する。これにより、出力部306は、コンパイラに、変換後のプログラムコードを提供することができる。
次に、図42〜図46を用いて、実施の形態2にかかる情報処理装置100の動作例について説明する。
(実施の形態2にかかるソースコード4200の一例)
図42は、実施の形態2にかかるソースコード4200の一例を示す説明図である。図42の例では、ソースコード4200の1,13行目には、ループ文「DO i=1,n (ループ本体) ENDDO」が記述される。ソースコード4200の2〜12行目には、ループ文「DO i=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード4200の1〜13行目には、変数iを1から開始して変数iがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード4200の2,12行目には、ループ文「DO j=1,n (ループ本体) ENDDO」が記述される。ソースコード4200の3〜11行目には、ループ文「DO j=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード4200の2〜12行目には、変数jを1から開始して変数jがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード4200の3行目には、代入文「s(i,j)=0」が記述される。これにより、ソースコード4200の3行目には、配列変数s(i,j)の値に、数値「0」を代入する初期化処理の内容が記述される。
ソースコード4200の4,11行目には、ループ文「DO k=1,n (ループ本体) ENDDO」が記述される。ソースコード4200の5〜10行目には、ループ文「DO k=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード4200の4〜11行目には、変数kを1から開始して変数kがnになるまでループ本体内の処理を繰り返し実行するループ処理の内容が記述される。
ソースコード4200の5,10行目には、ループ文「DO l=1,n (ループ本体) ENDDO」が記述される。ソースコード4200の6〜9行目には、ループ文「DO l=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード4200の5〜10行目には、変数lを1から開始して変数lがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード4200の6行目には、代入文「s(i,j)=s(i,j)+a(i,k,j,l)*w(k,l)」が記述される。これにより、ソースコード4200の6行目には、配列変数s(i,j)の値に、配列変数s(i,j)+配列変数a(i,k,j,l)*配列変数w(k,l)の値を代入する代入処理が記述される。
ソースコード4200の7,9行目には、ループ文「DO m=1,n (ループ本体) ENDDO」が記述される。ソースコード4200の8行目には、ループ文「DO m=1,n (ループ本体) ENDDO」によって繰り返し実行されるループ本体が記述される。これにより、ソースコード4200の7〜9行目には、変数mを1から開始して変数mがnになるまでループ本体内の処理を繰り返し実行するループ処理が記述される。
ソースコード4200の8行目には、代入文「s(i,j)=s(i,j)+a(i,k,m,l)*w(k,l)*v(j,m)」が記述される。これにより、ソースコード4200の8行目には、配列変数s(i,j)の値に、配列変数s(i,j)+配列変数a(i,k,m,l)*配列変数w(k,l)*配列変数v(j,m)の値を代入する代入処理が記述される。
このように、ソースコード4200の1〜13行目は、入れ子構造になった複数のループ文の集まりが記述された多重ループ箇所である。また、ソースコード4200の1〜3,12,13行目は、変数i,jを変化させ、縮約演算が行われる配列変数s(i,j)を切り替え、切り替えた配列変数s(i,j)を初期化する、入れ子構造になったループ文の集まりが記述された初期化ループ箇所である。
また、ソースコード4200の4〜11行目は、初期化された配列変数s(i,j)に対する代入演算を繰り返すことによって、配列変数s(i,j)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
(部分式を正準化する一例)
図43〜図45は、部分式を正準化する一例を示す説明図である。情報処理装置100は、実施の形態1と同様にして部分式を抽出した後に、部分式内の項を並べ替えて、部分式内の変数に番号を割り当てて、部分式を正準化する。
図43において、情報処理装置100は、例えば、部分式内の項を並べ替えた結果を記憶するリスト10を生成する。次に、情報処理装置100は、部分式のリストから部分式を抽出する。
そして、情報処理装置100は、部分式の項を、ASTにおける演算子を属性とするノードの深さが浅い順に並べ替える。また、情報処理装置100は、深さが同じ部分式の項であれば、演算子の優先度の高い順に並べ替える。また、情報処理装置100は、優先度が同じ部分式の項であれば、参照される変数にコンパイラが割り当てた番号、またはアルファベットの順に並べ替える。
情報処理装置100は、並べ替えた順序にしたがって、各変数に番号を割り当てる。情報処理装置100は、例えば、変数a(i,k,j,l)に番号1を割り当てる。情報処理装置100は、変数w(k,l)に番号2を割り当てる。情報処理装置100は、変数v(k,l)に番号3を割り当てる。ここで、情報処理装置100は、部分式のうちに定数があれば、変数と同様に扱い、番号を割り当て、変数よりも前に並べる。
図44において、情報処理装置100は、ループ変数について、部分式の先頭から出現した順番にしたがって、番号を割り当てる。このとき、情報処理装置100は、交換可能な演算子の列で結合された同一の配列変数のインデックスについては、出現したとして扱わない。ここで、ループ変数については、部分式ごとに出現した順番にしたがって割り当てるため、異なる部分式において同じ番号が割り当てられた変数であっても、異なる変数である場合がある。
さらに、情報処理装置100は、ループ変数に番号を割り当てた後に、再度、部分式の項を並べ替える。そして、情報処理装置100は、番号を割り当てていないループ変数があれば、番号を割り当てる。情報処理装置100は、番号を割り当てた結果を、リスト11に記憶する。
図45において、情報処理装置100は、実施の形態1と同様に、分割部分式のリストを生成する。情報処理装置100は、分割部分式のリスト、およびリスト11に基づいて、番号が割り当てられた分割部分式のリスト12を生成する。
(共通する部分式を特定する一例)
図46は、共通する部分式を特定する一例を示す説明図である。情報処理装置100は、実施の形態1と同様にしてスカラー変数を分類した後に、共通する部分式を特定する。
図46において、情報処理装置100は、少なくとも変数および変数間の関係が同一である部分式の組み合わせを記憶するリスト13を生成する。ここでは、説明の簡略化のため、組み合わせ可能な部分式が3つ以上ある場合には、2つの部分式の組み合わせを記憶するレコードを複数用いて実現することにする。
情報処理装置100は、リスト12の分割部分式のうち、異なるアドレスに対応付けられた分割部分式の組み合わせであって、少なくとも変数および変数間の関係が同一である部分式の組み合わせを抽出して、リスト13に追加する。また、情報処理装置100は、リスト12の分割部分式のうち、同じレコードに記憶された分割部分式の組み合わせであって、少なくとも変数および変数間の関係が同一である部分式の組み合わせを抽出して、リスト13に追加する。
その後、情報処理装置100は、実施の形態1と同様に、削減量を算出する。このとき、情報処理装置100は、変数および変数間の関係が同一である分割部分式の組み合わせのそれぞれを縮約演算した場合の演算結果を一度にまとめて算出する場合については、組み合わせの一方の演算量を0として扱う。さらに、情報処理装置100は、実施の形態1と同様に、ループ最適化する部分式を決定して、ソースコード4200を最適化する。
(ソースコード4200を最適化する一例)
図47は、ソースコード4200を最適化する一例を示す説明図である。図47の例は、ソースコード4200を最適化して得られたソースコード4700の一例である。
図47の例では、ソースコード4700の1〜10行目は、図18に示したソースコード1800の1〜10行目と同様の処理内容が記述された箇所であるため、説明を省略する。このように、ソースコード4700の1〜10行目は、ソースコード内の複数の箇所の部分式と置換可能な変数「t(i,j)」についての計算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
ソースコード4700の11〜15行目は、初期化処理に対応する箇所を除いて、図18に示したソースコード1800の11〜18行目と同様の処理内容が記述された箇所であるため、説明を省略する。このように、ソースコード4700の11〜15行目には、配列変数s(i,j)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
ソースコード4700の16〜22行目は、初期化処理に対応する箇所を除いて、図18に示したソースコード1800の11〜18行目と同様の処理内容が記述された箇所であるため、説明を省略する。このように、ソースコード4700の16〜22行目には、配列変数s(i,j)に対する縮約演算を行う、入れ子構造になったループ文の集まりが記述された縮約演算ループ箇所である。
(実施の形態2にかかるコンパイル処理手順の一例)
実施の形態2にかかるコンパイル処理手順の一例は、図19に示した実施の形態1にかかるコンパイル処理手順の一例と同様であるため、説明を省略する。また、コンパイル処理手順によって呼び出される各種処理手順は、削減量算出処理手順および最適化対象決定処理手順を除いて、図21〜図40に示した実施の形態1にかかる各種処理手順と同様であるため、説明を省略する。
(実施の形態2にかかる削減量算出処理手順の一例)
次に、図48を用いて、実施の形態2にかかる削減量算出処理手順の一例について説明する。
図48は、実施の形態2にかかる削減量算出処理手順の一例を示すフローチャートである。図48において、情報処理装置100は、分割部分式のリストに基づいて、正準化された分割部分式のリストを生成する(ステップS4801)。
次に、情報処理装置100は、正準化された分割部分式のリストに基づいて、変数および変数間の関係が同一である分割部分式の組み合わせのリストを生成する(ステップS4802)。そして、情報処理装置100は、正準化された分割部分式のリストのレコードの組み合わせを選択する(ステップS4803)。
次に、情報処理装置100は、選択したレコードの組み合わせから分割部分式を抽出する(ステップS4804)。そして、情報処理装置100は、抽出した分割部分式のうち、変数および変数間の関係が同一である分割部分式の組み合わせがあれば、いずれかの分割部分式を残して、他の分割部分式を削除する(ステップS4805)。
次に、情報処理装置100は、残った分割部分式のうちのいずれかの分割部分式を選択して、対象分割部分式に設定する(ステップS4806)。そして、情報処理装置100は、算出サブ処理を実行する(ステップS4807)。
次に、情報処理装置100は、選択した分割部分式の演算量に、算出サブ処理によって算出した合計演算量を設定する(ステップS4808)。そして、情報処理装置100は、すべての分割部分式を選択したか否かを判定する(ステップS4809)。ここで、未選択の分割部分式がある場合(ステップS4809:No)、情報処理装置100は、ステップS4806の処理に戻る。
一方で、すべての分割部分式を選択した場合(ステップS4809:Yes)、情報処理装置100は、すべてのレコードの組み合わせを選択したか否かを判定する(ステップS4810)。ここで、未選択のレコードがある場合(ステップS4810:No)、情報処理装置100は、ステップS4803の処理に戻る。
一方で、すべてのレコードの組み合わせを選択した場合(ステップS4810:Yes)、情報処理装置100は、削減量算出処理を終了する。これにより、情報処理装置100は、削減量を算出することができる。
(実施の形態2にかかる最適化対象決定処理手順の一例)
次に、実施の形態2にかかる最適化対象決定処理手順の一例について説明する。情報処理装置100は、正準化された分割部分式のリストのレコードの組み合わせのうち、元の演算量から、算出された分割部分式の演算量の合計を減算した差分が最大の組み合わせを、最適化対象に決定する。
以上説明したように、情報処理装置100によれば、ループ箇所内にある第3変数に縮約演算する第4式のうち、第1式のうちの部分式と少なくとも変数および変数間の関係が同一である他の部分式を特定することができる。そして、情報処理装置100によれば、第1コード、第1式のうちの部分式が第2変数に置換された第3式についての計算を繰り返し、かつ、第4式のうちの他の部分式が第2変数に置換された第5式についての計算を繰り返す第2コードを生成することができる。
これにより、情報処理装置100は、縮約演算する第1式の部分式、および縮約演算する第4式の他の部分式のそれぞれを縮約演算した場合の演算結果を、一度にまとめて算出することができる第2式を含むループ処理を示す第1コードを生成することができる。そして、情報処理装置100によれば、ソースコードのうちのループ箇所を、第1コードと、第1コードでの演算結果を利用した第1式を含むループ処理および第1コードでの演算結果を利用した第4式を含むループ処理を示す第2コードとに変換することができる。これにより、情報処理装置100は、複数のループ処理を通して計算される複数の式の集まりに共通して定数として扱うことが可能な式について、縮約演算をまとめて行うことができ、ソフトウェアの実行時の演算量を低減させることができる。
なお、本実施の形態で説明したコンパイル方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイルプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイルプログラムは、インターネット等のネットワークを介して配布してもよい。
上述した各実施の形態に関し、さらに以下の付記を開示する。
(付記1)ソフトウェアのプログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定し、
前記第1式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コード、および、前記第1式のうちの前記部分式が前記第2変数に置換された第3式についての計算を繰り返す第2コードを生成し、
前記プログラムコードのうちの前記ループ箇所を前記第1コードおよび前記第2コードに変換したプログラムコードを出力する、
制御部を有することを特徴とする情報処理装置。
(付記2)前記制御部は、
前記ループ箇所内にある第3変数に縮約演算する第4式のうち、前記部分式と少なくとも変数および変数間の関係が同一である他の部分式を特定し、
前記第1コード、前記第1式のうちの前記部分式が前記第2変数に置換された前記第3式についての計算を繰り返し、かつ、前記第4式のうちの前記他の部分式が前記第2変数に置換された第5式についての計算を繰り返す前記第2コードを生成する、
ことを特徴とする付記1に記載の情報処理装置。
(付記3)前記制御部は、
前記第1式のうちの各部分式について、当該部分式を縮約演算する前記第2式についての計算の種類および繰り返し回数と、当該部分式が置換された前記第3式についての計算の種類および繰り返し回数とを特定し、
特定した前記種類および前記繰り返し回数に基づいて、前記第1式のうちの各部分式について、当該部分式を縮約演算する前記第2式についての計算を繰り返す演算量、および、当該部分式が置換された前記第3式についての計算を繰り返す演算量の合計と、前記ループ箇所の演算量との差分を算出し、
算出した前記差分に基づいて、前記第1式のうちのいずれかの部分式を選択し、
選択した前記いずれかの部分式について前記第1コードおよび前記第2コードを生成する、
ことを特徴とする付記1または2に記載の情報処理装置。
(付記4)前記部分式は、前記第1変数に縮約演算する単位部分式の一部であって、
前記制御部は、
前記第1式についての計算を繰り返す条件に使用される変数を、少なくとも前記第1変数のインデックスに使用される変数、前記第1変数の初期化式についての計算を繰り返す条件に使用される変数、および前記部分式と前記単位部分式の残余の部分式とに共通してインデックスに使用される変数のいずれかと一致する第1種別の変数と、前記第1種別の変数とは異なる第2種別の変数とに分類し、
分類した前記第1種別の変数および前記第2種別の変数に基づいて、前記第1式のうちの各部分式について、当該部分式を縮約演算する前記第2式についての計算の種類および繰り返し回数と、当該部分式が置換された前記第3式についての計算の種類および繰り返し回数とを特定する、
ことを特徴とする付記3に記載の情報処理装置。
(付記5)前記制御部は、
前記第1式のうちの各部分式について、当該部分式を縮約演算する前記第2式についての計算の繰り返し条件に使用する変数および繰り返し回数と、当該部分式が置換された前記第3式についての計算の繰り返し条件に使用する変数および繰り返し回数とを特定し、
特定した前記変数および前記繰り返し回数に基づいて、ループ文を用いて前記第1コードを生成し、ループ文を用いて前記第2コードを生成する、
ことを特徴とする付記1〜4のいずれか一つに記載の情報処理装置。
(付記6)前記部分式は、前記第1変数に縮約演算する単位部分式の一部であって、
前記制御部は、
前記第1式についての計算を繰り返す条件に使用される変数を、少なくとも前記第1変数のインデックスに使用される変数、前記第1変数の初期化式についての計算を繰り返す条件に使用される変数、および前記部分式と前記単位部分式の残余の部分式とに共通してインデックスに使用される変数のいずれかと一致する第1種別の変数と、前記第1種別の変数とは異なる第2種別の変数とに分類し、
分類した前記第1種別の変数および前記第2種別の変数に基づいて、前記第1式のうちの各部分式について、当該部分式を縮約演算する前記第2式についての計算の繰り返し条件に使用する変数および繰り返し回数と、当該部分式が置換された前記第3式についての計算の繰り返し条件に使用する変数および繰り返し回数とを特定する、
ことを特徴とする付記5に記載の情報処理装置。
(付記7)前記第1式は、第1演算子により前記第1変数に対して縮約演算する式であって、
前記第2式は、前記部分式を前記第1演算子により前記第2変数に対して縮約演算する式である、
ことを特徴とする付記1〜4のいずれか一つに記載の情報処理装置。
(付記8)コンピュータが、
ソフトウェアのプログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定し、
前記第1式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コード、および、前記第1式のうちの前記部分式が前記第2変数に置換された第3式についての計算を繰り返す第2コードを生成し、
前記プログラムコードのうちの前記ループ箇所を前記第1コードおよび前記第2コードに変換したプログラムコードを出力する、
処理を実行することを特徴とするコンパイル方法。
(付記9)コンピュータに、
ソフトウェアのプログラムコードのうち、第1変数に対して縮約演算する第1式についての計算を繰り返すループ箇所を特定し、
前記第1式のうちの部分式を第2変数に対して縮約演算する第2式についての計算を繰り返す第1コード、および、前記第1式のうちの前記部分式が前記第2変数に置換された第3式についての計算を繰り返す第2コードを生成し、
前記プログラムコードのうちの前記ループ箇所を前記第1コードおよび前記第2コードに変換したプログラムコードを出力する、
処理を実行させることを特徴とするコンパイルプログラム。