JP2008015665A - プログラム解析方法及びプログラム解析装置 - Google Patents
プログラム解析方法及びプログラム解析装置 Download PDFInfo
- Publication number
- JP2008015665A JP2008015665A JP2006184395A JP2006184395A JP2008015665A JP 2008015665 A JP2008015665 A JP 2008015665A JP 2006184395 A JP2006184395 A JP 2006184395A JP 2006184395 A JP2006184395 A JP 2006184395A JP 2008015665 A JP2008015665 A JP 2008015665A
- Authority
- JP
- Japan
- Prior art keywords
- loop
- program
- variable
- dependency
- analysis method
- 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
Links
Images
Abstract
【課題】IF文などの条件式をもつ条件分岐がある場合でも、正確に解析することが可能なプログラム解析方法及びそのプログラム解析装置を提供する。
【解決手段】コンパイラにより変数の参照の有無を解析する際に、並列化の解析対象となっているループ中に別ループ(これを子ループとし、解析対象となっているループは親ループとする)がある場合、その子ループの最初の数回を展開し、最適化を実施し、IF文などの条件分岐の削除を試みる。条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなる。これにより、より正確な解析が可能となる。なお、本方法は、スカラ変数だけではなく、配列変数でも同様に解析可能である。
【選択図】図8
【解決手段】コンパイラにより変数の参照の有無を解析する際に、並列化の解析対象となっているループ中に別ループ(これを子ループとし、解析対象となっているループは親ループとする)がある場合、その子ループの最初の数回を展開し、最適化を実施し、IF文などの条件分岐の削除を試みる。条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなる。これにより、より正確な解析が可能となる。なお、本方法は、スカラ変数だけではなく、配列変数でも同様に解析可能である。
【選択図】図8
Description
本発明は、ソフトウェアの自動生成におけるコンパイラによるプログラム解析方法及びそのための装置に関するものである。
従来、コンパイラによるプログラムの自動並列化では、例えば、以下の非特許文献1により既に知られるように、プログラムのループ内にある変数の参照(変数の「定義」と「使用」の両者を含む)の有無を解析し、当該ループの繰り返しにまたがるデータの依存の有無を解析する。その結果、繰り返しにまたがるデータの依存がなければ、当該ループは並列化が可能とされる。
しかしながら、上記の従来技術では、そのループ中に「IF」で始まる文節(IF文)などの、所謂、条件分岐が存在し、そして、その条件分岐の条件式の値がコンパイル時に静的に解析することが出来ない場合には、分岐先にある変数の参照の有無については、静的には解析することが出来ない。そのため、安全なコードを出力することとなり、換言すれば、近似された解析結果を出力することとなる。また、この近似を原因として、実際には並列化が可能であるループであるにもかかわらず、並列化が不可能と解析されてしまう場合もある。
そこで、例えば、下記の特許文献1では、条件分岐により解析対象となっているループの内部から外部への飛び出し(以下、「ループ飛び出し」)がある場合、当該ループ飛び出しが起きる時のループ制御変数の値を用いることによって、解析精度を向上することが提案されている。
なお、上記した非特許文献1では、条件分岐の条件式を分岐先の変数の参照条件とすることによって解析精度を向上させることが記載されている。また、この非特許文献1では、分岐先にある変数に対して、プログラムの実行時に変数が参照された場合に、その参照があったことを記録し、データの依存を解析することが記載されている。
また、以下の非特許文献2では、所謂、ループピーリングについて記載されている。
特開平11-167492号公報
論文Byoungro So, et al., "Measuring the Effectiveness of Automatic Parallelization in SUIF", Proceedings of International Conference on Supercomputing (ISC’98), 1998.
Michael Wolfe, "High Performance Compilers For Parallel Computing", Addison-Wesley Publishing Company, Inc., 1996.
以上のように、従来技術、特に、非特許文献1では、参照条件として利用できる条件式で使用可能な変数は、ループの実行中に値が変わらない、所謂、ループ不変な変数か、または、解析対象となっているループの制御変数である必要がある。そのため、条件式に使われている変数がこれらの何れでもない場合は、変数の参照条件としては使えないという問題がある。
加えて、上記の非特許文献1では、プログラムを実際に動作をさせて解析することから、正確な解析が可能である。しかしながら、この従来技術では、その実行時において変数を参照する度にその参照を記録し、更には、その依存の有無を判定することから、これらの処理が実行時におけるオーバーヘッドとなり、プログラムの実行速度が遅くなってしまうという問題がある。
そこで、本発明の目的は、上記の従来技術における課題を解消することであり、より具体的には、プログラムの実行速度を速くするために、コンパイラによる静的な解析を行い、もって、上記非特許文献1では参照条件にできないような条件式をもつ条件分岐がある場合でも、正確に解析することが可能なプログラム解析方法、更には、そのためのプログラム解析装置を提供することである。
本発明によれば、上記の目的を達成するため、まず、ソースコードを入力として、当該ソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するためのプログラム解析方法であって、当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する処理と、当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する処理と、前記依存判定処理と前記子ループ判定処理において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する処理とを備えており、そして、前記変数参照情報解析処理は、当該子ループの少なくとも最初の回のループをピーリング展開する処理と、前記展開処理においてピーリング展開されたループに対して最適化を行なう処理と、さらに、前記最適化処理により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する処理とを備えているプログラム解析方法が提供される。
また、本発明では、前記に記載したプログラム解析方法において、前記変数参照情報解析処理における前記依存有無判定処理において、他のループ間にまたがる依存が存在すると判定された場合、再度、前記ピーリング展開処理、前記最適化処理を行い、更に、前記前記依存有無判定処理を実行することが好ましく、又は、前記ピーリング展開により生成されたループの文に印を付け、前記最適化実施後のコードに対して解析対象となる変数の参照を解析する時に、当該印の付いた文のみを解析することが好ましい。更には、前記ピーリング展開処理、前記最適化処理、前記前記依存有無判定処理の再度の繰り返し回数に制限を設けることが好ましい。
加えて、本発明によれば、やはり上記の目的を達成するため、少なくともプログラム解析方法を実行するための演算処理部と、前記演算処理部において実行されるプログラム解析方法のプログラムを格納する記憶装置とを備え、もって、入力したソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するプログラム解析装置であって、前記演算処理部は、前記記憶装置に格納したプログラム解析方法のプログラムに基づいて、当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する手段と、当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する手段と、そして、前記依存判定手段と前記子ループ判定手段において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する手段とを構成しており、更に、前記変数参照情報解析手段は、当該子ループの少なくとも最初の回のループをピーリング展開する手段と、前記展開手段においてピーリング展開されたループに対して最適化を行なう手段と、さらに、前記最適化手段により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する手段とを構成しているプログラム解析装置が提供される。
換言すれば、本発明では、コンパイラにより変数の参照の有無を解析する際に、並列化の解析対象となっているループ中に別ループ(これを子ループとし、解析対象となっているループは親ループとする)がある場合、その子ループの最初の数回を展開し、最適化を実施し、IF文などの条件分岐の削除を試みる。条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなる。これにより、より正確な解析が可能となる。なお、本方法は、スカラ変数だけではなく、配列変数でも同様に解析可能である。
以上のように、本発明になるプログラム解析方法、及び、そのプログラム解析装置によれば、正確な解析が可能になることにより、従来並列化できなかったループが並列化可能になり、プログラムの実行時間が短くなる。
以下、本発明の実施の形態になるプログラム解析方法について詳細に説明する。しかしながら、その前に、添付の図5により、従来の方法では並列化できないプログラムの例を示す。一般的に、ループの並列化を解析する際には、解析対象となるループの中において参照される変数の参照情報を解析する。この参照情報には、ループの1回の繰り返しに対して、「定義」(定義される可能性の有無)と、「使用」(使用される可能性の有無)と、「確定定義」(必ず実行される定義の有無)と、そして、「露出使用」(定義される前に使用される可能性の有無)とを含む4種類の情報があり、これらを解析することによりループの並列化を解析する。
例えば、上記図5において、ループ「L1」を解析対象ループとし、変数「X」を解析対象の変数とした場合、当該変数「X」の参照は、5行目のIF文の分岐先である6行目に使用があるため、「使用あり」となり、また、8行目には定義があるため(X=…)、「定義あり」となる。なお、「確定定義」については、8行目の定義である「X」がIF文の分岐先にあるため、確実な定義とはならず、そのため「確定定義なし」となる。また、「露出使用」については、6行目における使用(=…X…)の前には定義がないことから、「露出使用あり」となる。
そして、上記の結果からループL1の繰り返しにまたがる依存を解析すると、ある繰り返しで定義された変数「X」の値が、別の繰り返しの変数「X」の露出使用で使用される可能性がある。そのため、このプログラムの並列化は不可となる。
ここで、例えば、上述した非特許文献1に記載された解析方法を用いると、IF文の条件式を変数の参照条件として解析するが、しかしながら、上述したように、ループの実行中に値が変わらないループ不変な式でない場合や、又は、ループ制御変数を使っていない場合には、これを参照条件とすることができない。即ち、図5に示されたプログラムの例では、5行目のIF文の条件式となっている変数「Flag」は、4行目の文によりループを繰り返す度に、常に変わっており、また、ループ「L1」の制御変数「I」でもないことから、参照条件にすることができないこととなる。そのため、この非特許文献1に記載された解析方法による解析結果は、上述した従来のままであり、即ち、並列化も不可能である。
そこで、本発明では、コンパイラにより変数の参照の有無を解析する際、並列化の解析対象となっているループ中に別ループ(これを「子ループ」とし、解析対象となっているループは「親ループ」とする)が存在する場合には、その子ループの最初の数回を展開して最適化を実施し、もって、上記IF文などの条件分岐の削除を試みる。即ち、条件分岐が削除できれば、その分岐先にある変数の参照の有無は正確なものとなり、これによれば、より正確なプログラムの解析が可能となる。なお、本発明になるプログラムの解析方法によれば、スカラ変数だけではなく、配列変数であっても、同様に、解析可能である。
まず、添付の図2により、本発明の実施の形態になるプログラム解析方法であるコンパイラを実行する計算機システムの全体構成を示す。即ち、この計算機システムは、図から明らかなように、コンパイラの実行を行う演算処理部(CPU)201と、実行途中の情報を記憶するための主記憶装置202と、ユーザがコンパイラの起動やコンパイルオプションの入力等をするためのキーボード203と、ユーザへ情報を出力するためのディスプレイ204と、そして、外部記憶装置206とから構成されている。なお、外部記憶装置206には、プログラムであるコンパイラの207と、コンパイルの対象となるソースコードファイル208と、上記コンパイラが出力するオブジェクトファイル209とが記録されている。また、上述した各装置間は、バス205を介して、相互に繋がれている。
次に、添付の図3には、上記外部記憶装置206に記録されており、CPU201により実行されるプログラムであるコンパイラ207の処理構成を示す。
この図3において、コンパイラ207は、やはり上記外部記憶装置206内に記録されたソースコードである、所謂、ソースコードファイル208を入力とし、中間コード306を生成する中間コード生成部301と、生成された中間コード306を入力とし、条件分岐などの制御の流れを解析し、制御フロー情報307を出力する制御フロー解析部302と、上記中間コード306と共に制御フロー情報307をその入力とし、変数の参照情報などデータの流れを解析し、データフロー情報308を出力するデータフロー解析部303と、上記中間コード306と制御フロー情報307とデータフロー情報308とをその入力とし、並列化やコードの並び替え等の最適化を実施し、中間コードを更新する最適化部304と、そして、上記中間コード306をオブジェクトコードである、所謂、オブジェクトファイル209へ変換するオブジェクト生成部305とから構成されている。なお、この図3において、矢印はデータの流れを示し、白抜きの矢印は制御の流れを示している。
更に、以下には、上記でそのシステム構成、及び、その処理構成を示したコンパイラにおけるプログラム解析方法の詳細、即ち、ループを並列化するためのデータ依存を解析するためのデータフロー解析部303(図3を参照)のアルゴリズムについて、その詳細を示す。
まず、図4は、実施例1になるデータフロー解析部303のアルゴリズムを示す。この図において、処理が開始されると、まず、ステップ401において、プログラムのループ毎に、以下のステップ402から始まる一連の処理を実行する。
更に、ステップ402では、上記ステップ401で解析の対象となったループ内に存在する変数について、その変数毎に、以下のステップ403から始まる一連の処理を実行する。
すなわち、まず、ステップ403では、解析対象となっているループにおいて、ループの1回の繰り返しにおいて、解析対象となっている変数の「定義」、「使用」、「確定定義」、そして「露出使用」を調べる。次に、ステップ404では、上記ステップ403で解析した結果により、当該解析対象であるループに「定義」が存在するか否か、かつ、「露出使用」が存在するか否かを調べる。これは、複数のループ間にまたがったデータ間における依存の有無を調べるためのものである。その結果、「定義」があり、かつ、「露出使用」がある場合(図の「YES」)は、ループ間にまたがる依存があることになる。そして、このループにまたがる依存があると判断された場合には、処理はステップ405へ進み、他方、依存がない(図の「NO」)と判断された場合には、ステップ407へ進む。
次に、ステップ405では、解析対象であるループの中に子ループが存在するか否かを調べ、その結果、存在すると判定(図の「YES」)された場合には、次のステップ406へ進み、他方、存在しないと判定(図の「YES」)された場合には、上記406を飛び越して、更に次のステップ407へ進む。
即ち、ステップ406では、以下にも詳細に説明するが、変数の参照を解析するための処理である。そして、ステップ407では、上記ステップ403の解析処理を行っていない未処理変数があるか否かを調べ、当該未処理変数が存在する(図の「YES」)場合には、再び、上記ステップ407へ戻り、他方、未処理変数が存在しない(図の「NO」)場合には、次のステップ408へ進む。
なお、このステップ408では、上記ステップ403の解析処理を行っていない未処理ループの存在を調べ、その結果、当該未処理ループが存在する(図の「YES」)場合には、再び、上記401へ戻り、他方、未処理ループが存在しない(図の「NO」)場合には、一連の処理を終了する。
次に、上述したステップ406において実行される変数の参照情報を解析するためのアルゴリズムの詳細について、その一例を、添付の図1に示す。
この変数の参照情報を解析するための処理では、その処理が開始されると、まず、ステップ1101において、子ループの最初の1回分をピーリング展開する。なお、子ループが複数ある場合は、解析対象となっている変数において最初の使用があるループを子ループとする。なお、このピーリング展開の詳細については、非特許文献2の第311頁に記載があるように、ループの最初の(又は、最後の)繰り返しを取り除いて異なるコードにし、即ち、一般的に、ループの複数の繰り返しとして展開するものである。
その後、ステップ102では、上記ステップ1101で展開したループを含めて、プログラムに対して最適化を実施する。その後、ステップ1103では、上記図4のステップ403と同様に、変数の定義、使用、確定定義、露出使用を、再度、解析して、一連の処理を終了する。
続いて、上記にその詳細について詳細に説明した本発明の解析方法、即ち、上記図1に示した変数の参照情報を解析するためのアルゴリズムを、従来の方法では並列化できないプログラムの例として示した上記図5のプログラムに適用した結果を、以下に詳細に述べる。
まず、上記のステップ1101における子ループの最初の1回分のピーリング展開では、子ループである3行目の「L2」の1回目の「J=1」を展開する。なお、この展開した後の結果を、添付の図6に示す。そして、このJ=1回目の部分は、この図6における3行目から9行目までの部分である。
次に、上記のステップ102では、上記図6における変数「Flag」は、その2行目で「True」として定義されているため、定数伝播と呼ばれる最適化により、4行目の「Flag」の値が「False(Not.)」となる。また、4行目で変数「Flag」の値が「False」になるため、5行目のIF文の条件式は、常に成立しないことが分かる。よって、8行目のみが実行されることが分かる。その結果、この図6のプログラムは、添付の図7のようなプログラムに変換されることとなる。
さらに、上記のステップ1103では、上記のループ「L1」(図5の1行目)に対して定義、使用、露出使用、確定定義を解析する。変数「X」の参照情報に関し、その定義については、上記図6における8行目と15行目の文から、「定義あり」となる。その使用については、13行目の文から、「使用あり」となる。また、確定定義については、8行目の定義より、「確定定義あり」となる。更に、露出使用については、6行目の使用の前の8行目に定義があることから、「露出使用なし」となる。
以上の結果、ループの1回の繰り返しでは露出使用がないので、あるループの繰り返しで定義された値が、その後に実行される別の繰り返しで使用されることがない、ということが分かる。即ち、ループの繰り返しにまたがるデータの依存がないことが分るので、解析対象となっているループは並列化が可能となる。
次に、上述した図4のステップ406において実行される変数の参照情報を解析するためのアルゴリズムの他の例を添付の図8に示す。なお、この実施例2においても、上記図2に示す計算機システムにより、上記図3に示したコンパイラの処理構成におけるデータフロー回折部303のアルゴリズム、即ち、基本的には、上記図4に示したフローに基づいて実行される。
なお、上記図1に示したアルゴリズムの例では、ループのピーリング展開を1回しか実施していない。そのため、このピーリング展開を複数回繰り返すことで条件分岐を削除することができる場合には、上記図1に示したアルゴリズムでは対応できない。そこで、上記図1のアルゴリズムを拡張し、即ち、ピーリング展開を複数回行うアルゴリズムの一例を添付の図8に示す。
この図8に示すアルゴリズムにおいて、まず、そのステップ101では、上記図1におけるステップ1101と同様に、子ループに対してピーリング展開を行う。そして、その際に展開した文に印を付ける。
次に、ステップ102では、上記ステップ101で展開したループを含めて、プログラムに対して最適化を実施することは、上記図1のステップ102と同様である。
その後、ステップ103では、上記ステップ1101で印を着けた文に対して、その変数の定義、使用、確定定義、露出使用を調べる。
さらに、続くステップ104では、上記ステップ103で解析した結果に基づいて、定義又は使用があるか否かを調べる。その結果、それら両方とも存在しなければ、処理は上記のステップ101へ戻る。他方、上記定義と使用のうち、何れか一方でも存在すれば、処理は次のステップ105へ進む。
そして、最後のステップ105では、上記図4に示したステップ403において解析した結果と、上記のステップ103で解析した結果とを合わせる。より具体的には、定義と使用と確定定義については、その和集合を、一方、露出使用については、上記ステップ403における解析された露出使用から、上記ステップ103において解析された確定定義を除いたものとする。
次に、上記図4及び図8のアルゴリズム例をプログラムに適用した結果を、以下に、添付の図9〜11を参照しながら示す。
まず、上記図4におけるステップ403において、添付の図9のプログラムのループ「L1」に対して、定義、使用、確定定義、露出使用を解析する。なお、この例では、変数Yの参照は、図の6行目の文により、「定義あり」と、そして、その8行目の文により、「使用あり」となる。また、確定定義については、その6行目の文の変数Yの定義は、5行目のIF文により不確定となっているため、「確定定義はなし」となる。そして、露出使用については、その6行目の使用の前には定義はないので、「露出使用あり」となる。
次に、上記図8のステップ101では、子ループ「L2」の最初の1回分(J=1)を展開し、展開した文に印を付ける。
そして、上記のステップ102では、上記図9のプログラムに対し、上記のステップ103で取り出したループを含め、最適化を実施する。この例では、J=1のため、4行目だけの処理が残る。その結果、添付の図10に示すプログラムとなる。即ち、上記のステップ101で印を付けた文は、図10における2行目と3行目だけになる。
その後、上記のステップ103で、上記図10に示したプログラムにおいて印が付いた文、即ち、その2行目と3行目に対して、解析を実施する。なお、この例では、その2行目には変数Yの参照はないので、「定義、使用、確定定義、露出使用の参照はない」と解析される。
更に、上記の104では、変数Yの定義とその使用の有無を調べるが、この例では、上述したように、上記ステップ103では定義も使用もない(「NO」)ことから、処理は上記のステップ101へ進む。
ここで、このステップ101では、子ループL2の一回分、つまり、J=2のループを展開し、そして、この展開した文に印を付ける。
次に、上記のステップ102では、上記図10のプログラムに対し、上記のステップ101で取り出したループを含めて、最適化を実施する。ここでは、J=2であるため、その9行目の処理だけが残る。その結果、添付の図11に示すプログラムになる。ここで、上記のステップ101で印をつけた文は、2行目から4行目となる。
更に、上記のステップ103では、上記図11に示したプログラムに対し、特に、印の付いた文の3行目と4行目に対して、解析を実施する。この例では、その5行目の文の変数Yの定義により、「定義と確定定義がある」ことが解析される。他方、使用と露出使用については「なし」と解析される。
続いて、上記の104では、変数Yの定義と使用の有無を調べる。なお、この例では、上記のステップ103では、「定義がある」(YES)とされたので、処理は、ステップ105へ進む。
このステップ105では、上記図4に示したステップ403において「解析された定義あり」、「使用あり」、「確定定義なし」、「露出使用あり」という情報と、上記図8におけるステップ103で解析された「定義あり」、「使用なし」、「確定定義あり」、「露出使用なし」という情報とをマージする(和集合)。その結果、これらは、それぞれ、「定義あり」、「使用あり」、「確定定義あり」となる。一方、露出使用は、上記ステップ105における解析結果より確定定義が存在するので、「露出使用なし」となる。
なお、以上に詳細に説明した実施例2においても、その解析結果より、上記実施例1と同様、露出使用がないため、ループ間にまたがるデータの依存がないことが分かり、即ち、並列化が可能となる。
ところで、以上にその内容を詳述した図1及び図8に示したアルゴリズムの例では、その解析のために、プログラムの書き換えを行っている。そのため、本発明の解析を行うことにより、場合によっては、他の最適化の実施に影響を与える可能性がある。
そこで、かかる問題を解決するために、本発明では、以下に述べる実施例3により、その解析の実施時において、プログラムのコピーを作り、そのコピーに対して解析を行う。なお、この実施例2においても、上記図2に示す計算機システムにより、上記図3に示したコンパイラの処理構成におけるデータフロー回折部303のアルゴリズム、即ち、基本的には、上記図4に示したフローに基づいて実行される。
まず、添付の図12には、上記図8のアルゴリズムを更に拡張し、即ち、上記図8に示したフローにおいて、更に、解析対象ループをコピーする処理(ステップ)1201と、そのコピーにより生成されたループとそのループから展開された部分を消去する処理(ステップ)1202とを追加したアルゴリズムを示す。即ち、かかるアルゴリズムによれば、本発明の解析を実行した後に生成されるコードは、そのループが展開される前の状態のままを維持しており、そのため、上述したコードの書き換えによる他の最適化への悪影響を解消することが可能となる。
この図12において、ステップ1201では、まず、解析対象ループのコピーを作り、その後のステップ101〜104における処理は、このコピーにより生成されたループに対して実施されることとなる。
即ち、ステップ1202では、上記ステップ1201においてコピーにより生成したループを削除する。なお、その他のステップ101〜105における処理の内容は、上記図8において述べたと同様である。
そして、この図12のアルゴリズムを、上述した図5に示したプログラムへ適用した場合、その解析結果は、上記の実施例1と同様である。即ち、上記の実施例1では、出力されるコードは上述した図7のようになるが、しかしながら、この図12に示したアルゴリズムの例では、上記図5のままである。そして、このことにより、コードの変更を伴うことなく、その解析精度を向上させることが可能となる。
加えて、上述した図8に示したアルゴリズムの例では、特に、そのステップ101〜104の処理の繰り返しにより、解析時間が長くなる可能性がある。そこで、本発明では、かかる問題を解決するため、コンパイラオプションにより繰り返し回数を制御する方法を採用し、その一例を、以下に実施例4として、添付の図13に、そのアルゴリズムを示す。なお、この実施例4では、コンパイラ202(図2を参照)のユーザが、コンパイルオプションを介して、その繰り返し回数を指定することで、解析時間の制御を行うことを可能とするものである。
この実施例4では、図13に示すアルゴリズムからも明らかなように、上記図8のアルゴリズムに、更に、ステップ1301の処理を加えたものである。なお、その他のステップ101〜105における処理の内容は、上記図8において述べたと同様である。
そして、ステップ1301では、例えば、添付の図14に示すようなコンパイラオプションにより、その繰り返し回数の上限が与えられる。そして、繰り返し回数がその上限を超えた場合には、その解析処理を終了するようにし、他方、これを越えない場合は上記のステップ101へ進み、再び、上記ステップ101〜104の処理を繰り返す。
なお、上記図14に示したコンパイルオプションの例では、繰り返し回数の上限を、その一例として、10回としている。そのため、解析処理は、10回に至るまで(NO)は、上記ステップ101〜104の処理を繰り返すこととなるが、しかしながら、それ以上になる場合(YES)には、その処理を終了する。
以上に詳細に述べたように、本発明になるプログラム解析方法及びプログラム解析装置によれば、従来の解析方法では並列化できなかったプログラムを、自動的に並列化することが可能になる。また、本発明では、特に、上述したように、コンパイラによって静的に解析するため、実行時のオーバーヘッドはない。特に、近年においては、大規模な並列計算機だけではなく、一般的なPCにおいても、プロセッサを複数持つものが多くなって来ていることから、本発明になるプログラム解析方法及びプログラム解析装置を、プログラムを自動的に並列化するコンパイラとして利用する可能性は高い。
また、以上に詳細に述べたように、本発明になるプログラム解析方法及びプログラム解析装置によれば、ソースコードを入力とし、オブジェクトコードを出力するコンパイラにおいて、ループ中の変数の参照の有無を解析する際に、対象ループAの中にループBがある場合、ループBの最初の1または複数回のイタレーションをピーリング展開し、上記展開後のコードに最適化を実施し、上記最適化の実施後のコードに対して解析対象となる変数の参照を解析することとなる。
また、上記の本発明になるプログラム解析方法及びプログラム解析装置では、ピーリング展開により生成された文に印をつけ、上記最適化実施後のコードに対して解析対象となる変数の参照を解析するときに上記印のついた文のみ解析することが好ましい。そして、解析対象となる変数の参照を解析するときに印のついた文のみ解析した後に、上記解結果に使用も定義もない場合は上記のピーリング展開から繰り返すことが好ましい。更には、ピーリング展開からの繰り返しをコンパイラオプションで与えられた数を上限とすることが好ましい。そして、上記において、ピーリング展開前にループAをコピーして新たなループCを作成してループCを解析対象ループとし、変数の参照を解析した後に当該ループCを消去することが好ましい。
101…ループの最初の1回分の展開
102…最適化実施
103…定義、使用、露出使用、確定定義の解析
104…定義と使用の有無の判定
105…解析結果のマージ。
102…最適化実施
103…定義、使用、露出使用、確定定義の解析
104…定義と使用の有無の判定
105…解析結果のマージ。
Claims (5)
- ソースコードを入力として、当該ソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するためのプログラム解析方法であって、
当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する処理と、
当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する処理と、
前記依存判定処理と前記子ループ判定処理において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する処理とを備えており、そして、
前記変数参照情報解析処理は、
当該子ループの少なくとも最初の回のループをピーリング展開する処理と、
前記展開処理においてピーリング展開されたループに対して最適化を行なう処理と、さらに、
前記最適化処理により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する処理と
を備えていることを特徴とするプログラム解析方法。 - 前記請求項1に記載したプログラム解析方法において、前記変数参照情報解析処理における前記依存有無判定処理において、他のループ間にまたがる依存が存在すると判定された場合、再度、前記ピーリング展開処理、前記最適化処理を行い、更に、前記前記依存有無判定処理を実行することを特徴とするプログラム解析方法。
- 前記請求項1に記載したプログラム解析方法において、前記ピーリング展開により生成されたループの文に印を付け、前記最適化実施後のコードに対して解析対象となる変数の参照を解析する時に、当該印の付いた文のみを解析することを特徴とするプログラム解析方法。
- 前記請求項3に記載したプログラム解析方法において、前記ピーリング展開処理、前記最適化処理、前記前記依存有無判定処理の再度の繰り返し回数に制限を設けたことを特徴とするプログラム解析方法。
- 少なくともプログラム解析方法を実行するための演算処理部と、
前記演算処理部において実行されるプログラム解析方法のプログラムを格納する記憶装置とを備え、もって、入力したソースコードに所定の処理を施してオブジェクトコードを出力するため、当該ソースコードに含まれるループ中における変数の参照の有無を解析するプログラム解析装置であって、
前記演算処理部は、前記記憶装置に格納したプログラム解析方法のプログラムに基づいて、
当該入力したソースコードに含まれる解析対象のループにおいて、他のループ間にまたがる依存の有無を判定する手段と、
当該入力したソースコードに含まれる解析対象のループにおいて、子ループが存在するか否かを判定する手段と、そして、
前記依存判定手段と前記子ループ判定手段において、他のループ間にまたがる依存と子ループが存在すると判定された場合、変数の参照情報を解析する手段と構成しており、更に、前記変数参照情報解析手段は、
当該子ループの少なくとも最初の回のループをピーリング展開する手段と、
前記展開手段においてピーリング展開されたループに対して最適化を行なう手段と、さらに、
前記最適化手段により最適化されたループに対して、他のループ間にまたがる依存の有無を判定する手段と
を構成していることを特徴とするプログラム解析装置。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006184395A JP2008015665A (ja) | 2006-07-04 | 2006-07-04 | プログラム解析方法及びプログラム解析装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2006184395A JP2008015665A (ja) | 2006-07-04 | 2006-07-04 | プログラム解析方法及びプログラム解析装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008015665A true JP2008015665A (ja) | 2008-01-24 |
Family
ID=39072633
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2006184395A Pending JP2008015665A (ja) | 2006-07-04 | 2006-07-04 | プログラム解析方法及びプログラム解析装置 |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008015665A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013108730A1 (ja) * | 2012-01-20 | 2013-07-25 | 日立オートモティブシステムズ株式会社 | ソフトウェア検証支援装置、ソフトウェア検証支援方法、ソフトウェア検証支援プログラム |
US9588747B2 (en) | 2013-09-27 | 2017-03-07 | Samsung Electronics Co., Ltd. | Method and apparatus for converting programs |
-
2006
- 2006-07-04 JP JP2006184395A patent/JP2008015665A/ja active Pending
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013108730A1 (ja) * | 2012-01-20 | 2013-07-25 | 日立オートモティブシステムズ株式会社 | ソフトウェア検証支援装置、ソフトウェア検証支援方法、ソフトウェア検証支援プログラム |
US9588747B2 (en) | 2013-09-27 | 2017-03-07 | Samsung Electronics Co., Ltd. | Method and apparatus for converting programs |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4042604B2 (ja) | プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム | |
KR101279179B1 (ko) | 병렬 프로그램 생성 방법 | |
US9081586B2 (en) | Systems and methods for customizing optimization/transformation/ processing strategies | |
JP2002116916A (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
JP4886838B2 (ja) | 並列化方法、システム、及びプログラム | |
JP2010134614A (ja) | 並列化処理方法、システム、及びプログラム | |
US5790859A (en) | Method of, system for, and computer program product for efficient identification of private variables in program loops by an optimizing compiler | |
JP6164054B2 (ja) | 情報処理装置、コンパイル方法およびコンパイラプログラム | |
JP2009524866A (ja) | プログラムの並列実行のためのシステム及び方法 | |
JP2016224812A (ja) | 並列計算装置、並列処理方法、並列処理プログラムおよびコンパイルプログラム | |
Socała et al. | Automatic profile generation for live Linux Memory analysis | |
US7086047B1 (en) | Determining hardware generated by high level language compilation through loop optimizations | |
JP2011170732A (ja) | 並列化方法、システム、及びプログラム | |
JP2008276735A (ja) | プログラムコード変換装置及びプログラムコード変換方法 | |
JP2017204201A (ja) | 情報処理装置、コンパイル方法、およびコンパイルプログラム | |
US20170206068A1 (en) | Program optimization based on directives for intermediate code | |
JP2008015665A (ja) | プログラム解析方法及びプログラム解析装置 | |
Al-Kofahi et al. | Escaping AutoHell: a vision for automated analysis and migration of autotools build systems | |
JP2012014526A (ja) | プログラムコードの構造変換装置、並びにコード構造変換プログラム | |
US10761820B2 (en) | Assisting parallelization of a computer program | |
US20080282237A1 (en) | Method and Apparatus For Generating Execution Equivalence Information | |
Ferreira et al. | Graph-based code restructuring targeting HLS for FPGAs | |
Doroshenko et al. | Automated design of parallel programs for heterogeneous platforms using algebra-algorithmic tools | |
Saha et al. | On the fly mhp analysis | |
Bluemke et al. | A tool supporting C code parallelization |