JP2006107338A - プログラム処理装置 - Google Patents
プログラム処理装置 Download PDFInfo
- Publication number
- JP2006107338A JP2006107338A JP2004296287A JP2004296287A JP2006107338A JP 2006107338 A JP2006107338 A JP 2006107338A JP 2004296287 A JP2004296287 A JP 2004296287A JP 2004296287 A JP2004296287 A JP 2004296287A JP 2006107338 A JP2006107338 A JP 2006107338A
- Authority
- JP
- Japan
- Prior art keywords
- program
- information
- hint information
- analysis
- hint
- 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.)
- Withdrawn
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/423—Preprocessors
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
【課題】 ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができるプログラム処理装置を提供する。
【解決手段】 プログラム中に、コンパイラに対して与えられるヒント情報を自動的に挿入するプログラム処理装置102であって、プログラム100の構文を解析して、解析情報を生成する構文解析部104と、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報をプログラム100に付加したプログラム101を出力するヒント情報挿入部とを備える。
【選択図】 図1
【解決手段】 プログラム中に、コンパイラに対して与えられるヒント情報を自動的に挿入するプログラム処理装置102であって、プログラム100の構文を解析して、解析情報を生成する構文解析部104と、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報をプログラム100に付加したプログラム101を出力するヒント情報挿入部とを備える。
【選択図】 図1
Description
本発明は、C言語等の高級言語で記述されたソースプログラムを修正するプログラム処理装置に関し、特に、ソースプログラムを機械語プログラムに変換するコンパイラに対して与えられるヒント情報を挿入することにより、ソースプログラムを修正するプログラム処理装置に関する。
近年、メディア処理アプリケーションの増大化、多様化により、開発工数が増大し、メディア処理分野においても高級言語によるアプリケーション開発が必要とされるようになってきている。そのために、高級言語によるメディア処理アプリケーション開発を実現する試みが行われている。その際、ユーザは、高級言語による開発であっても、より精密なチューニングができることを期待している。このため、コンパイラが行う最適化戦略を詳細に制御することが必要となる。
その最適化戦略の制御方法は、大きく2つに分けられる。
一方の制御方法としては、コンパイラに対して、ある最適化に関する指示を直接行う制御方法が挙げられる。他方の制御方法としては、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行う制御方法が挙げられる。
一方の制御方法としては、コンパイラに対して、ある最適化に関する指示を直接行う制御方法が挙げられる。他方の制御方法としては、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行う制御方法が挙げられる。
そして、これらの2通りの制御方法を具体的に実現するための方法の1つとして、プラグマによるコンパイラに対する指示が上げられる。「プラグマ」とは、言語処理系に依存した記述であり、コンパイラに対して何らかの情報を与えるものである。
以下に、プラグマの例を示す。図49は、最適化に関する指示を直接行うプラグマを含むソースプログラムの一例を示す図である。「#pragma _software_pipelining」は、その直後に記述されたループ処理に対してソフトウェアパイプライニングによる最適化を施すように指示を行なうためのプラグマであり、ユーザによって記述されたものである。コンパイラは、このプラグマによる指示に基づいて、当該ループ処理に対してソフトウェアパイプライニングによる最適化を施す。ソフトウェアパイプライニングとは、異なるイタレーション(繰り返し処理)を同時にいくつか実行する技術である。
図50は、プログラム全体の静的情報をコンパイラに対して示すプラグマを含むソースプログラムの一例を示す図である。「#pragma _min_iteration=5」は、その直後に記述されたループ処理に対して、ループ処理の繰り返しが少なくとも5回は実行されることをユーザが保証するプラグマである。コンパイラは、このプラグマに基づいて、例えば、ソフトウェアパイプライニングによる最適化が可能か否かを判断し、可能であればそのような最適化を行う。
このようなプラグマについては、特許文献1においても詳細に説明されている。
特開2004−38597号公報
しかし、上述の2通りの制御方法においては、ユーザは、実際のプログラムと論理的に矛盾が生じないようにプラグマを記述しなければならない。誤った機械語プログラムの生成を避けるために、ユーザは、自身が解析可能な範囲内での消極的なプラグマしか付加することができず、良好な最適化が行われないという問題がある。
また、ユーザは、プログラム中の複数のモジュールを自ら分析して、プラグマをプログラム中に記述しなければならないが、モジュールの呼出し関係の煩雑さにより、ユーザは矛盾したプラグマをプログラム中に付加してしまう可能性がある。そのような場合には、コンパイラは、誤ったプラグマの指示に基づいて、中間コードの最適化等を行なう。このため、コンパイラが誤った機械語プログラムを生成してしまうという問題がある。
本発明は、上述の課題を解決するためになされたもので、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができるプログラム処理装置を提供することを第1の目的とする。
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックをし、ソースプログラムを修正することができるプログラム処理装置を提供することを第2の目的とする。
さらに、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報をチェックし、ソースプログラムを修正することができるプログラム処理装置を提供することを第3の目的とする。
上記目的を達成するために、本発明に係るプログラム処理装置は、第1のプログラムを受け、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力する。好ましくは、上述のプログラム処理装置は、第1のプログラムの構文を解析して、解析情報を生成する構文解析手段と、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力するヒント情報付加手段とを備える。
解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報が第1のプログラムに付加される。このため、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができる。なお、このようなヒント情報には、コンパイラに対して、ある最適化に関する指示を直接行うヒント情報と、プログラム全体の静的情報をコンパイラに対して示すことにより、コンパイラによる最適化のサポートを行うヒント情報の両者が含まれる。
好ましくは、前記構文解析手段は、前記第1のプログラムの構文を静的に解析し、前記解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、プログラムの静的な解析により得ることが可能な静的情報を前記ヒント情報として、前記第1のプログラムに付加した前記第2のプログラムを出力する。また、前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、ループ処理の繰り返し回数に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力するようにしてもよい。例えば、前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれるループ処理の繰り返し回数の最小回数または最大回数をヒント情報として付加した前記第2のプログラムを出力する。
ループ処理の繰り返し回数に関するヒント情報をプログラム中に自動的に挿入することができる。例えば、ループ処理の繰り返し回数の最小回数をヒント情報として付加することにより、当該ヒント情報で指定されるループ処理の最低繰り返し回数により、当該ループ処理に対して、ソフトウェアパイプライニングを適用可能か否かの判定が行われ、可能な場合には、当該ループ処理にソフトウェアパイプライニングを行うような最適化が行なわれる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、データの配置位置に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。また、前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれるデータが所定値でアラインメントされているか否かを判断するアラインメント判断部と、前記アラインメント判断部の判断結果が真の場合には、当該データと、当該データが所定値でアラインメントされていることとをヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有していてもよい。
データの配置に関するヒント情報をプログラム中に自動的に挿入することができる。上述のようなヒント情報を付加することにより、コンパイラは、ペア命令を利用して、複数のデータをメモリから一度にロードしたり、ライトしたりする最適化を行うことができる。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、ポインタ変数のアクセスする領域に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。また、前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを判断する重複判断部と、前記重複判断部の判断結果が偽の場合には、前記第1のプログラムに含まれる前記ポインタ変数がアクセスする領域が、前記他のポインタ変数がアクセスする領域との間で重複する領域を有しないことを示す情報をヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有していてもよい。例えば、前記第1および第2のプログラムは、ISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである。
restrict記述を挿入することにより、例えば、ポインタ変数r1が指す領域とポインタr2が指す領域とが互いにオーバーラップしていないことがわかる。このような場合には、コンパイラは、前者の領域にデータを書き込む命令と、後者の領域にデータを書き込む命令との実行順序を入れ替えるような最適化を行うことができ、処理を高速化させることができる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析結果に基づいて、変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。例えば、前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれる変数へのアクセスが、データの書き込みから始まっているか否かを判断する書き込み判断部と、前記書き込み判断部の判断結果が真の場合には、当該変数と、当該変数へのアクセスがデータの書き込みから始まることとをヒント情報として、前記第1のプログラム中の、前記変数へのデータの書き込みが行われる位置の直前に前記ヒント情報を挿入し、前記第2のプログラムを作成し、出力するプログラム出力部とを有する。
変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報をプログラム中に自動的に挿入することができる。変数と、変数へのアクセスがデータの書き込みから始まることとをヒント情報として挿入することにより、コンパイラは、このヒント情報を手がかりとして、キャッシュメモリを備えるコンピュータにおいて、当該ヒント情報で指定された変数へのメモリアクセスが生じた場合には、その変数の値を記憶するための領域を確保するのみとし、かつメインメモリからキャッシュメモリへはその変数の値を転送(プリフェッチ処理)しないような最適化を行うことができる。これにより、機械語プログラム実行時のメモリアクセス時間を減少させることができる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析結果に基づいて、分岐条件の成立頻度に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。例えば、前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれる分岐条件が成立する可能性を判断する可能性判断部と、前記可能性判断部の判断結果が真となる確率が高いと判断できる場合には、前記分岐条件が成立する可能性が高いことを示すヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。
分岐条件の成立頻度に関するヒント情報をプログラム中に自動的に挿入することができる。また、分岐条件が成立する可能性が高いことを示すヒント情報を挿入することにより、コンパイラは、このヒント情報に従い、例えば、C言語におけるif文の条件式が成立時に実行される命令列を、if文の不成立時に実行される命令列すなわちelse文で指定される命令列よりも優先的に実行されるような機械語命令配置の最適化を行うことができる。これにより、機械語プログラム実行時の処理時間を向上させることができる。
さらに好ましくは、前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報である。また、前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、ループアンローリングによるループ処理の最適化を指示するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力するようにしてもよい。
ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報をプログラム中に自動的に挿入することができる。このようなヒント情報を第1のプログラムに付加することにより、コンパイラは、指定されたループ処理に対してループアンローリングによる最適化を施すことができる。これにより、機械語プログラム実行時において、ループ処理を高速に実行させることができる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、前記ヒント情報付加手段は、前記解析情報に基づいて、ソフトウェアパイプライニングによるループ処理の最適化を指示するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する。
ソフトウェアパイプライニングによる最適化を直接コンパイラへ指示するヒント情報をプログラム中に自動的に挿入することができる。このようなヒント情報を第1のプログラムに付加することにより、コンパイラは、指定されたループ処理に対してソフトウェアパイプライニングによる最適化を施すことができる。これにより、機械語プログラム実行時において、ループ処理を高速に実行させることができる。
さらに好ましくは、前記構文解析手段は、前記第1のプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析手段に基づいて、第1のプログラムに含まれるデータのアラインメント値が、当該データの型のサイズの2倍以上であるという条件を満たすか否かを判断する条件判断部と、前記第1のプログラムに含まれる、前記条件を満たすデータに対して、ペア命令の生成によるデータアクセスの最適化を指示するヒント情報を付加した前記第2のプログラムを出力する。
ペア命令の出力をコンパイラに直接指示するヒント情報をプログラム中に自動的に挿入することができる。このようなヒント情報を上述のデータに対して付加することにより、コンパイラは、当該データをメモリから一度にロードしたり、メモリへライトしたりするペア命令を発行することができる。これにより、機械語プログラム実行時のメモリアクセスの回数を減少させることができ、処理を高速化させることができる。
さらに好ましくは、前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である。例えば、前記構文解析手段は、前記第1のプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、前記ヒント情報付加手段は、前記解析手段に基づいて、前記第1のプログラムに含まれる変数へのアクセスが、データの書き込みから始まっているか否かを判断する書き込み判断部と、前記書き込み判断部の判断結果が真の場合には、当該変数と、当該変数の値を記憶するための領域を前記キャッシュメモリ上に確保することとをヒント情報として、前記第1のプログラム中の、前記変数へのデータの書き込みが行われる位置の直前に前記ヒント情報を挿入し、前記第2のプログラムを作成し、出力するプログラム出力部とを有する。
キャッシュメモリ等の制御処理を指示するヒント情報をプログラム中に自動的に挿入することができる。上述のヒント情報を第1のプログラム中に挿入することにより、コンパイラは、このヒント情報を手がかりとして、キャッシュメモリを備えるコンピュータにおいて、当該ヒント情報で指定された変数の値を記憶するための領域をキャッシュメモリ上に確保するような最適化を行うことができる。これにより、機械語プログラム実行時のメモリアクセス時間を減少させることができる。
さらに好ましくは、前記第1のプログラムは、第1のヒント情報を含み、前記ヒント情報付加手段は、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のない第2のヒント情報を前記第1のプログラムに付加した第2のプログラムを出力する。
第1のプログラム内に、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックをし、ソースプログラム(第1のプログラム)を修正することができる。また、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報をチェックし、ソースプログラム(第1のプログラム)を修正することができる。
また、前記ヒント情報付加手段は、前記第1のヒント情報の論理的な誤りを前記第2のヒント情報に訂正するものであってもよい。
第2のヒント情報しか使用できないコンパイラであっても、第1のヒント情報を含むプログラムをコンパイルすることができるようになり、資産の活用が図られる。
本発明の他の局面に係るプログラム処理装置は、プログラム中に、コンパイラに対して与えられるヒント情報を挿入するプログラム処理装置であって、第1のプログラムと、前記第1のプログラムとは別のプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力するヒント情報付加手段を備える
外部より入力された解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報が第1のプログラムに付加される。このため、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができる。
外部より入力された解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報が第1のプログラムに付加される。このため、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができる。
なお、本発明は、このような特徴的な手段を備えるプログラム処理装置として実現することができるだけでなく、プログラム処理装置が備える特徴的な手段をステップとするプログラム処理方法としても実現することができる。また、プログラム処理装置が備える特徴的な手段としてコンピュータを機能させるプログラムとして実現したりすることもできる。そして、そのようなプログラムは、CD−ROM等の記録媒体やインターネット等の通信ネットワークを介して流通させることができるのは言うまでもない。
本発明によると、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができるプログラム処理装置を提供することができる。
また、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックをし、ソースプログラムを修正することができるプログラム処理装置を提供することができる。
さらに、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報をチェックし、ソースプログラムを修正することができるプログラム処理装置を提供することができる。
以下、本発明の実施の形態に係るプログラム処理装置について、図面を参照しながら説明する。
図1は、プログラム処理装置の構成を示す機能ブロック図である。プログラム処理装置102は、高級言語で記述されたプログラム100を受け、プラグマに代表されるコンパイラに対するヒント情報を含むプログラム101を自動的に生成する装置であり、構文解析部104と、ヒント情報挿入部108とを備える。ここでプログラム処理装置102に入力されるプログラム100は、通常ユーザが記述するプログラムであり、ヒント情報を含まないプログラムである。
構文解析部104は、プログラム100(プログラム100が複数のファイルからなる場合には、適宜、プログラム100aおよびプログラム100bと称する)を受け、プログラム100に対して、コンパイラ等で用いられる通常の構文解析処理を行ない、解析結果を解析情報106として出力する処理部である。
ヒント情報挿入部108は、プログラム100および解析情報106に基づいて、プログラム100に挿入可能なヒント情報の挿入を行い、ヒント情報を含むプログラム101(プログラム101が複数のファイルからなる場合には、適宜、プログラム101aおよびプログラム101bと称する)を出力する処理部である。
なお、構文解析部104およびヒント情報挿入部108の実行する処理は、後述する実施の形態毎に異なる。このため、それぞれの実施の形態を説明する際に、その詳細を説明する。
[実施の形態1、繰り返し回数に関するヒント情報]
本実施の形態では、ループ処理(for, while, do)の繰り返し回数に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。ループ処理の繰り返し回数に関するヒント情報には、例えば次のようなものがある。
(1) ループ処理の繰り返しの最大回数を指定するヒント情報
(2) ループ処理の繰り返しの最低回数を指定するヒント情報
(3) ループ処理の繰り返し回数が必ず偶数回であることを指定するヒント情報
(4) ループ処理の繰り返し回数が必ず奇数回であることを指定するヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
[実施の形態1、繰り返し回数に関するヒント情報]
本実施の形態では、ループ処理(for, while, do)の繰り返し回数に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。ループ処理の繰り返し回数に関するヒント情報には、例えば次のようなものがある。
(1) ループ処理の繰り返しの最大回数を指定するヒント情報
(2) ループ処理の繰り返しの最低回数を指定するヒント情報
(3) ループ処理の繰り返し回数が必ず偶数回であることを指定するヒント情報
(4) ループ処理の繰り返し回数が必ず奇数回であることを指定するヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図2は、プログラム処理装置102に入力されるプログラムの一例を示す図である。図2(a)は、ループ処理を含む関数func1を含むプログラムの一例を示す図であり、図2(b)は、main関数、関数func2および関数func3を含むプログラムの一例を示す図である。
これらのプログラム100aおよび100bを入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
図3は、構文解析部104の実行する処理のフローチャートである。構文解析部104は、プログラム100(プログラム100aおよびプログラム100b)全体を解析して、各関数のコールフローグラフを作成する(S202)。これは、通常コンパイラ等で作成されるコールフローグラフと同様のものである。
図4は、コールフローグラフの一例を示す図である。図4に示されるコールフローグラフ107は、図2(a)および図2(b)にそれぞれ示したプログラム100aおよびプログラム100bより作成されたコールフローグラフ107である。このコールフローグラフ107より、main関数が関数func2および関数func3を呼び出していることがわかる。また、関数func2が関数func1を呼び出し、関数func3も関数func1を呼び出していることもわかる。このように、コールフローグラフ107は、矢印の向きにより関数間の呼び出し関係を示している。
次に、図3に示されるように、構文解析部104は、作成したコールフローグラフ107に基づいて、大域変数または各関数が呼ばれる際に仮引数がどのような値を取るかを解析する(S203)。本実施の形態では、構文解析部104は、大域変数または仮引数が取り得る値の最大値および最小値を解析するとともに、偶数の値を取り得るか否かおよび奇数の値を取り得るか否かを解析する。なお、関数内の局所変数を解析するようにしてもよい。
構文解析部104は、解析した結果を解析情報106として出力する(S204)。図5は、解析情報の一例を示す図である。図5に示した解析情報106は、解析結果の一部を示している。例えば、関数func3の仮引数sについては、最大値および最小値がともに「5」であり、偶数の値は取り得ず、奇数の値を取り得ることが示されている。これは、以下のような解析を行うことにより求められる。すなわち、図4に示したコールフローフラグ107より、関数func3はmain関数より呼び出されることがわかる。プログラム101bより、main関数中での関数func3の実引数は「5」であり、関数func3は1回のみ呼ばれていることがわかる。このため、上述のような解析結果が得られる。
また、関数func1内での大域変数yについては、最大値が「6」で、最小値が「5」で、偶数の値および奇数の値のいずれをも取り得ることが解析情報106に示されている。これは、以下のような解析を行うことにより求められる。すなわち、コールフローグラフ107より、関数func1は関数func2および関数func3から呼び出されることがわかる。関数func2内では、大域変数yに「6」が代入されている。また、関数func3内では大域変数yに仮引数sの値が代入されている。ここで、コールフローグラフ107より関数func1はmain関数より呼び出されていることがわかる。そこでmain関数内の関数func3の実引数を調べると、「5」であることがわかる。このため、関数func3の仮引数sの値は「5」となる。すなわち、関数func3内の大域変数yの値も「5」となる。以上のことより、関数func3内の大域変数の取り得る値は「5」または「6」である。このため、上述のような解析結果が得られる。同様にして、図5に示すような解析情報106が得られる。
次に、ヒント情報挿入部108の実行する処理について説明する。
図6は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100aおよびプログラム100b中に含まれる各ループ処理について以下の処理を繰り返す。図2(a)に示すように、プログラム100aにはループ処理Aおよびループ処理Bの2つのループ処理が含まれている。したがって、これら2つのループ処理の各々について以下の処理が実行されることとなる。
図6は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100aおよびプログラム100b中に含まれる各ループ処理について以下の処理を繰り返す。図2(a)に示すように、プログラム100aにはループ処理Aおよびループ処理Bの2つのループ処理が含まれている。したがって、これら2つのループ処理の各々について以下の処理が実行されることとなる。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目しているループ処理の取り得る繰り返し回数の可能性を調べる(S301)。ヒント情報挿入部108は、着目しているループ処理の最低繰り返し回数が算出可能であるかをチェックする(S302)。当該最低繰り返し回数が算出可能であれば(S302でYES)、その最低繰り返し回数をn回とした場合に、着目しているループ処理の最低繰り返し回数を指定するヒント情報であるプラグマ「#pragma _min_iteration=n」をプログラム100a中に挿入する(S303)。このプラグマは、上述の(2)番目のヒント情報の一種である。
次に、ヒント情報挿入部108は、着目しているループ処理の繰り返し回数が偶数のみであるか、または奇数のみであるかの算出可能性を調べる(S304)。算出可能であれば(S304でYES)、着目しているループ処理の繰り返し回数が偶数のみの場合には、ループ処理の繰り返し回数が必ず偶数回であることを指定するヒント情報であるプラグマ「#pragma _iteration_even」をプログラム100a中に挿入し、着目しているループ処理の繰り返し回数が奇数のみの場合には、ループ処理の繰り返し回数が必ず奇数回であることを指定するヒント情報であるプラグマ「#pragma _iteration_odd」をプログラム100a中に挿入する(S305)。ヒント情報挿入部108が、プログラム100a中にこのようなプラグマを挿入することにより、ヒント情報を含むプログラム101aが作成される。
ここで、プラグマ「#pragma _iteration_even」およびプラグマ「#pragma _iteration_odd」は、それぞれ上述の(3)番目のヒント情報および(4)番目のヒント情報の一種である。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図2(a)に示したプログラム100aのループ処理Aに着目すると、ループ処理の繰り返し回数を規定する仮引数xの値の最小値が「2」であることが、解析情報106よりわかる。このため、ループ処理Aの最低繰り返し回数は「2」であることが求められる。よって、図7に示されるヒント情報挿入部108の出力結果であるプログラム101aの3行目に、ループ処理Aに対するヒント情報として、プラグマ「#pragma _min_iteration=2」が挿入されている。
また、ループ処理Aの場合には、ループ処理の繰り返し回数を規定する仮引数xの値は、偶数のみを取り、奇数はとならないことが、解析情報106よりわかる。このため、プログラム101aの4行目に、ループ処理Aに対するヒント情報として、プラグマ「#pragma _iteration_even」が挿入されている。
同様に、ループ処理Bに着目すると、ループ処理Bの最低繰り返し回数は「5」である。このため、プログラム101aの14行目には、ループ処理Bに対するヒント情報として、プラグマ「#pragma _iteration_odd」が挿入されている。
以上説明したように、本実施の形態によると、ループ処理の繰り返し回数に関するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _min_iteration」を挿入することにより、プラグマ「#pragma _min_iteration」で指定されるループ処理の最低繰り返し回数により、当該ループ処理に対して、ソフトウェアパイプライニングを適用可能か否かの判定が行われ、可能な場合には、当該ループ処理にソフトウェアパイプライニングを行うような最適化が行なわれる。ソフトウェアパイプライニングとは、異なるイタレーション(繰り返し処理)を同時にいくつか実行する技術である。
また、プラグマ「#pragma _iteration_even」またはプラグマ「#pragma _iteration_odd」を挿入することにより、コンパイラは、当該プラグマに対してループアンローリングを行うような最適化を行うことができる。ループアンローリングとは、ループ処理高速化手法の一つであり、複数(ここでは「2つ」)のイタレーション(繰り返し処理)を同時に実行することにより、ループ処理内の実行速度を高速化する手法である。ループアンローリングは、展開する繰り返しの数が2回であれば、ループ処理の繰り返し回数が偶数の場合と、奇数の場合とでは、最適化の処理の仕方が異なってくる。偶数の場合は、そのままアンローリングすればよいが、奇数の場合、半端な1回分をループ処理の外側で実行させてやる必要がある。
なお、上述の実施の形態では、(2)番目から(4)番目までのヒント情報の一種であるプラグマを用いて説明を行ったが、(1)番目のヒント情報の一種として、プラグマ「#pragma _max_iteration」を用いてもよい。このプラグマは、ヒント情報の直後に来るループ処理(for, while, do)の繰り返し回数が最大何回であるかを示している。例えば、プログラム100中のループ処理の繰り返し回数が最高10回であることがわかる場合には、プラグマ「#pragma _max_iteration=10」をプログラム100中に挿入し、ヒント情報を含むプログラム101を作成するようにしてもよい。
また、ヒント情報挿入部108は、解析情報106を利用することなく、ヒント情報を挿入可能な場合には、そのような処理をおこなってもよい。例えば、ループ処理の繰り返し回数が変数ではなく、定数で定義されているような場合には、解析情報106を参照することなく、ヒント情報挿入部108がループ処理の最低繰り返し回数等を求めることが可能だからである。
[実施の形態2、ポインタ変数に関するヒント情報]
本実施の形態では、ポインタ変数に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。ポインタ変数に関するヒント情報には、例えば次のようなものがある。
(1) ポインタ変数が示すデータのアラインメント値を指定するヒント情報
(2) ポインタ変数が示す領域がオーバーラップしないことを示すヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
[実施の形態2、ポインタ変数に関するヒント情報]
本実施の形態では、ポインタ変数に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。ポインタ変数に関するヒント情報には、例えば次のようなものがある。
(1) ポインタ変数が示すデータのアラインメント値を指定するヒント情報
(2) ポインタ変数が示す領域がオーバーラップしないことを示すヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図8は、プログラム処理装置102に入力されるプログラムの一例を示す図である。図8(a)は、関数func1、関数func2および関数func3を含むプログラムの一例を示す図であり、図8(b)は、main関数を含むプログラムの一例を示す図である。
図8(a)に示されるプログラム101aおよび図8(b)に示されるプログラム101bは、それぞれコンパイルされた後、リンクされる関係にある。
プログラム100aに含まれるプラグマ「#pragma _align_object」は、その後に示されるデータを指定されたバイト数でアラインメントせよというユーザの指示である。例えば、関数func1内のプラグマ「#pragma _align_object=4 a,b」という記述は、変数aおよびbを4バイト単位でメインメモリ上にアラインメントせよという指示である。変数aおよびbはshort型の変数であり、通常short型の変数は2バイトの変数である。したがって、本実施の形態では、プラグマ「#pragma _align_object」による指定がない場合には、short型の変数は2バイト単位でアラインメントされるものとする。
これらのプログラム100aおよび100bを入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、関数のポインタ引数が指すデータのアラインメント値を解析するとともに、ポインタ引数が指す領域について解析を行って、他のポインタと同一領域を指す可能性があるか否かを解析する。
図9は、図8(a)および図8(b)に示されたプログラム101aおよび101bに基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、main関数は、関数func1および関数func2を呼び出している。また、関数func1および関数func2の各々は、関数func3を呼び出している。
図10は、構文解析部104により作成された解析情報106の一例を示す図である。図3のS203の処理において、構文解析部104は、プログラム101aおよび101bに基づいて、各関数呼出し時のポインタ引数および大域ポインタ変数のアラインメントおよび同一領域を指示する可能性について解析する。
例えば、関数func3の仮引数q1について考える。コールフローグラフ107に基づいて、関数func3は、関数func1および関数func2から呼び出されていることがわかる。関数func3の仮引数q1に対応する関数func1内での関数func3の実引数「&a」の指すデータは、プラグマ「#pragma _align_object=4 a,b」により4バイト単位でアラインメントされている。また、関数func3の仮引数q1に対応する関数func2内での関数func3の実引数「&x」の指すデータは、プラグマ「#pragma _align_object=8 x」により8バイト単位でアラインメントされている。このため、関数func3の仮引数q1が指すデータのアラインメント値は、4および8である。
また、関数func3の仮引数q1とq2とは、関数func1内での関数func3の実引数「&a」およびp1にそれぞれ対応する。関数func1内で関数func3を呼び出す直前に、p1に「&a」の値が代入されている。このため、p1と「&a」とは同じ値を示す。したがって、仮引数q1の指す領域と同一領域を指定する可能性のあるポインタとして、仮引数q2が求められる。
以下、同様に、仮引数q2およびq3についても、解析を行うと、図10に示すような解析情報106が得られる。
次に、ヒント情報挿入部108の実行する処理について説明する。
図11は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100aおよびプログラム100b中に含まれる各ポインタ変数について以下の処理を繰り返す。図8(a)に示すように、プログラム100aには、ポインタ変数q1、q2およびq3等が含まれる。
図11は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100aおよびプログラム100b中に含まれる各ポインタ変数について以下の処理を繰り返す。図8(a)に示すように、プログラム100aには、ポインタ変数q1、q2およびq3等が含まれる。
ヒント情報挿入部108は、解析情報106をチェックしながらポインタ変数が指すデータの配置や、当該ポインタ変数によるデータアクセスについて調べる(S401)。ヒント情報挿入部108は、着目しているポインタ変数が指すデータのデフォルトのアラインメント値と異なるアラインメント値が算出可能か否かをチェックする(S402)。ポインタ変数が指すデータのデフォルトのアラインメント値というのは、ポインタ変数の型により決まり、例えば、ポインタ変数がshort型の場合には2バイトである。
デフォルトのアラインメント値と異なるアラインメント値が算出可能であれば(S402でYES)、ヒント情報挿入部108は、着目しているポインタ変数が指すデータのアラインメント値のうちの最小値を指定するヒント情報であるプラグマ「#pragma _align_pointer」をプログラム100aに挿入する(S403)。例えば、ポインタ変数qに対するアラインメント値の最小値がnであれば、プラグマ「#pragma _align_pointer=n q」がプログラム100a中に挿入される。このプラグマは、上述の(1)番目のヒント情報の一種である。
次に、ヒント情報挿入部108は、着目しているポインタ変数が指すデータ領域が他のポインタ変数が指すデータ領域と互いにオーバーラップしないことが判別可能か否かを調べる(S404)。
オーバーラップしないことが判別可能な場合には(S404でYES)、着目しているポインタ変数の直前に、restrict記述を挿入する(S405)。restrict記述は、C99言語(ISO/IEC 9899:1999 - Programming Language C)で導入されたものであり、そのスコープにおいて指定された全てのポインタ変数の指すメインメモリ上の領域が互いにオーバーラップしていないことを示している。restrict記述は、上述の(2)番目のヒント情報の一種である。プログラム100a中にこのようなプラグマまたはrestrict記述を挿入することにより、ヒント情報を含むプログラム101aが作成される。
次に、ヒント情報挿入部108によるプラグマおよびrestrict記述の挿入結果の一例について説明する。例えば、図8(a)に示したプログラム100aの関数func3の仮引数(ポインタ変数)q1に着目すると、仮引数q1で指されるデータのアラインメント値は、4または8であることが、解析情報106よりわかる。このため、図12に示されるヒント情報挿入部108の出力結果であるプログラム101aの関数func3の直前には、仮引数q1が指すデータのアラインメント値の最小値である「4」をアラインメント値として指定するプラグマ「#pragma _align_pointer=4 q1」が挿入されている。同様にして、関数func3の直前には、プラグマ「#pragma _align_pointer=4 q2」が挿入されている。なお、これら2つのプラグマをあわせて、図12中では、プラグマ「#pragma _align_pointer=4 q1,q2」と記述している。
また、仮引数q3が指すデータ領域は、他のポインタ変数が指すデータ領域と互いにオーバーラップしないことが、解析情報106よりわかる。このため、プログラム101a中の仮引数q3の直前に、restrict記述が挿入されている。
以上説明したように、本実施の形態によると、データの配置に関するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _align_pointer」を挿入することにより、コンパイラは、ペア命令を利用して、複数のデータをメモリから一度にロードしたり、ライトしたりする最適化を行うことができる。これにより、メモリアクセスの回数を減少させることができ、処理を高速化させることができる。
また、restrict記述を挿入することにより、例えば、ポインタ変数r1が指す領域とポインタr2が指す領域とが互いにオーバーラップしていないことがわかる。このような場合には、コンパイラは、前者の領域にデータを書き込む命令と、後者の領域にデータを書き込む命令との実行順序を入れ替えるような最適化を行うことができ、処理を高速化させることができる。
なお、上述の実施の形態では、関数の仮引数であるポインタ変数を具体例として説明を行ったが、仮引数に限定されるものではなく、大域変数であるポインタについても同様の処理が実行され、プログラム中にヒント情報が挿入される。
[実施の形態3、変数の読み書きに関するヒント情報]
本実施の形態では、変数の読み書きに関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。変数の読み書きに関するヒントには、例えば次のようなものがある。
[実施の形態3、変数の読み書きに関するヒント情報]
本実施の形態では、変数の読み書きに関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。変数の読み書きに関するヒントには、例えば次のようなものがある。
(1)ヒント情報の配置位置以降では、指定された変数へのアクセスはデータの書き込みから始まることを示すヒント情報
このヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
このヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図13は、プログラム処理装置102に入力されるプログラムの一例を示す図である。プログラム100には、関数func1、関数func2および関数func3が含まれている。
このプログラム100を入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、各関数について、大域変数への読み出し、書き込みが存在するか否かの解析を行う。
図14は、図13に示したプログラム101に基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、関数func1が関数func2および関数func3を呼び出している。
図15は、構文解析部104により作成された解析情報106の一例を示す図である。図3のS203の処理において、構文解析部104は、各関数の大域変数ごとに読み書きの有無をチェックする。
例えば、関数func2では、大域変数yへのデータの書き込みと、大域変数xからのデータの読み出しとがあり、関数func3では、大域変数zへのデータの書き込みと、大域変数yからのデータの読み出しとがあるため、解析情報106は、図15のようになる。なお、関数func1についても同様の処理が行われ、解析情報106が作成される。
次に、ヒント情報挿入部108の実行する処理について説明する。
図16は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各大域変数について以下の処理を繰り返す。図13に示すようにプログラム100には、3つの大域変数x、yおよびzが含まれる。
図16は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各大域変数について以下の処理を繰り返す。図13に示すようにプログラム100には、3つの大域変数x、yおよびzが含まれる。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目している大域変数からのデータの読み出しおよび着目している大域変数へのデータの書き込みについて調べる(S501)。着目している大域変数へのアクセスがデータの書き込みから開始している場合には(S502でYES)、その大域変数への書き込みが起こる直前にプラグマ「#pragma _start_from_write」を挿入する(S503)。例えば、大域変数がaの場合には、プラグマ「#pragma _start_from_write a」が、その大域変数aへの書き込みが起こる直前に挿入される。このプラグマは、上述の(1)番目のヒント情報の一種である。プログラム100中にこのようなプラグマを挿入することにより、図17に示すようなヒント情報を含むプログラム101が作成される。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図13に示したプログラム100の大域変数yに着目する。大域変数yへのデータの書き込みについて解析情報106を調べると、関数func2において、データの書き込みのみが行われている。このため、関数func2を呼び出した際には、大域変数yへのアクセスはデータの書き込みから始まることがわかる。また、関数func2はコールフローグラフ107より関数func1より呼び出されていることがわかる。このため、関数func1内で関数func2を呼び出している位置の直前に、プラグマ「#pragma _start_from_write y」が挿入される。
同様にして、関数func1内で関数func3を呼び出している位置の直前に、プラグマ「#pragma _start_from_write z」が挿入される。このようにして、ヒント情報を含むプログラム101が作成される。
以上説明したように、本実施の形態によると、変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _start_from_write」を挿入することにより、コンパイラは、このプラグマを手がかりとして、キャッシュメモリを備えるコンピュータにおいて、当該プラグマで指定された変数へのメモリアクセスが生じた場合には、その変数の値を記憶するための領域を確保するのみとし、かつメインメモリからキャッシュメモリへはその変数の値を転送(プリフェッチ処理)しないような最適化を行うことができる。これにより、機械語プログラム実行時のメモリアクセス時間を減少させることができる。
[実施の形態4、静的頻度に関するヒント情報]
本実施の形態では、静的頻度に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。静的頻度に関するヒント情報には、例えば次のようなものがある。
(1) 分岐条件の成立頻度が高いことを示すヒント情報
(2) 分岐条件の不成立頻度が高いことを示すヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
[実施の形態4、静的頻度に関するヒント情報]
本実施の形態では、静的頻度に関するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。静的頻度に関するヒント情報には、例えば次のようなものがある。
(1) 分岐条件の成立頻度が高いことを示すヒント情報
(2) 分岐条件の不成立頻度が高いことを示すヒント情報
これらのヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図18は、プログラム処理装置102に入力されるプログラムの一例を示す図である。プログラム100には、関数func1および関数func2が含まれている。
このプログラム100を入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203で解析する対象が異なる。すなわち、構文解析部104は、各関数の仮引数および大域変数について、値の頻度解析を行う。
図19は、図18に示したプログラム100に基づいて、構文解析部104により作成されたコールフローグラフの一例を示す図である。このコールフローグラフ107によると、関数func1が関数func2を呼び出している。
図20は、構文解析部104により作成された解析情報106の一例を示す図である。上述したように、図3のS203の処理において、構文解析部104は、各関数の仮引数および大域変数ごとに、値の頻度解析を行う。
例えば、関数func2の仮引数iの頻度を解析すると、関数func2は関数func1から合計17回呼び出される可能性があり、そのときの仮引数iの値の頻度が解析情報106として示されている。例えば、仮引数iが0となる回数は2回である。このため、2/17の確率で仮引数iが0となることが示されている。
次に、ヒント情報挿入部108が実行する処理について説明する。
図21は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各if文について以下の処理を繰り返す。図18に示すようにプログラム100中には、「if(i%5==0)」というif文が含まれる。
図21は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各if文について以下の処理を繰り返す。図18に示すようにプログラム100中には、「if(i%5==0)」というif文が含まれる。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目しているif文の条件式の成立または不成立の頻度について調べる(S601)。当該条件式が真となる確率が高いと判断できる場合には(S602でYES)、分岐条件の成立頻度が高いことを示すヒント情報の一種であるプラグマ「#pragma _likely_true」を当該if文の直前に挿入する(S603)。このプラグマは、上述の(1)番目のヒント情報の一種である。
if文の条件式が偽となる確率が高いと判断できる場合には(S604でYES)、分岐条件の不成立頻度が高いことを示すヒント情報の一種であるプラグマ「#pragma _likely_false」を当該if文の直前に挿入する(S605)。このプラグマは、上述の(2)番目のヒント情報の一種である。プログラム100中にこのようなプラグマを挿入することにより、ヒント情報を含むプログラム101が作成される。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図18に示したプログラム100のif文「if(i%5==0)」に着目すると、このif文の条件式「(i%5==0)」が真となる確率は、解析情報106より、4/17(仮引数iが0となる確率2/17と仮引数iが5となる確率2/17との和)である。同様にして、このif文の条件式「(i%5==0)」が偽となる確率は、解析情報106より、13/17である。したがって、ヒント情報挿入部108は、if文の条件式「(i%5==0)」が偽となる確率が1/2を超えているため、当該条件式が偽となる確率が高いとの判断を行う。このため、図22に示すように、if文「if(i%5==0)」の直前にプラグマ「#pragma _likely_false」が挿入される。このようにして、ヒント情報を含むプログラム101作成される。
以上説明したように本実施の形態によると、静的頻度(分岐条件の成立頻度)に関するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _likely_true」を挿入することにより、コンパイラは、このプラグマに従い、if文の条件式が成立時に実行される命令列を、if文の不成立時に実行される命令列すなわちelse文で指定される命令列よりも優先的に実行されるような機械語命令配置の最適化を行うことができる。これにより、機械語プログラム実行時の処理時間を向上させることができる。
また、プラグマ「#pragma _likely_false」を挿入することにより、コンパイラは、このプラグマに従い、if文の条件式が不成立時に実行される命令列すなわちelse文で指定される命令列を、if文の成立時に実行される命令列よりも優先的に実行されるような機械語命令配置の最適化を行うことができる。これにより、機械語プログラム実行時の処理時間を向上させることができる。
[実施の形態5、最適化手法を指定するヒント情報1]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ループアンローリングを指定するヒント情報またはソフトウェアパイプライニングを指定するヒント情報がある。
[実施の形態5、最適化手法を指定するヒント情報1]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入するプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、ループアンローリングを指定するヒント情報またはソフトウェアパイプライニングを指定するヒント情報がある。
このヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図23は、プログラム処理装置102に入力されるプログラムの一例を示す図である。プログラム100には、関数func1、関数func2および関数func3が含まれている。
このプログラム100を入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。図24は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func2および関数func3が各々関数func1を呼び出していることがわかる。
図25は、図3のS203およびS204の処理の結果作成される解析情報を示す図である。解析情報106によると、関数func1の仮引数xの最大値は「6」、最小値は「4」であり、奇数の値は取り得ず、偶数の値を取ることが示されている。解析情報106の作成処理は、実施の形態1と同様であるため、その詳細な説明はここでは繰り返さない。
次に、ヒント情報挿入部108が実行する処理について説明する。
図26は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100に含まれる各ループ処理について以下の処理を繰り返す。
図26は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100に含まれる各ループ処理について以下の処理を繰り返す。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目しているループ処理の繰り返し回数について調べる(S701)。着目しているループ処理の繰り返し回数が2回以上であり、かつ偶数回数のみしか取らないか、または奇数回数のみしか取らない場合には(S702でYES)、当該ループ処理の直前にプラグマ「#pragma _loop_unrolling」を挿入する(S703)。このプラグマは、着目しているループ処理をループアンローリングにより最適化せよとのコンパイラに対するヒント情報である。ここでは、展開する繰り返しの数が2回の場合を想定している。
着目しているループ処理の繰り返し回数が偶数および奇数の双方を取りうるが、着目しているループ処理の繰り返し回数が2回以上の場合には(S704でYES)、当該ループ処理の直前にプラグマ「#pragma _software_pipelining」を挿入する(S705)。このプラグマは、着目しているループ処理をソフトウェアパイプライニングにより最適化せよとのコンパイラに対するヒント情報である。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図23に示したプログラム100中のforループ処理について着目すると、図25に示した解析情報106より、当該forループ処理の繰り返し回数は必ず2回以上で、かつ偶数回であることがわかる。よって、図27に示されるヒント情報挿入部108の出力結果であるプログラム101には、当該forループ処理に対するヒント情報として、プラグマ「#pragma _loop_unrolling」が挿入されている。
図28に示すプログラム100がプログラム処理装置102に入力された場合には、構文解析部104は、図29に示すようなコールフローグラフ107と、図30に示すような解析情報106を作成する。図28に示すプログラム100のforループ処理に着目すると、解析情報106より当該forループ処理の繰り返し回数は、偶数および奇数のいずれをも取るが、最小値が2回以上である。このため、図31に示されるヒント情報挿入部108の出力結果であるプログラム101には、当該forループ処理に対するヒント情報として、プラグマ「#pragma _software_pipelining」が挿入されている。
以上説明したように、本実施の形態によると、ループアンローリングによる最適化を直接コンパイラへ指示するヒント情報をプログラム中に自動的に挿入することができる。
また、ソフトウェアパイプライニングによる最適化を直接コンパイラへ指示するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _loop_unrolling」を挿入することにより、コンパイラは、指定されたループ処理に対してループアンローリングによる最適化を施すことができる。これにより、機械語プログラム実行時において、ループ処理を高速に実行させることができる。
また、プラグマ「#pragma _software_pipelining」を挿入することにより、コンパイラは、指定されたループ処理に対してソフトウェアパイプライニングによる最適化を施すことができる。これにより、機械語プログラム実行時において、ループ処理を高速に実行させることができる。
[実施の形態6、最適化手法を指定するヒント情報2]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入する他のプログラム処理装置について説明する。コンパイラ装置へ最適化手法を直接指定するヒント情報として、例えば、ペア命令の出力を指定するヒント情報がある。
[実施の形態6、最適化手法を指定するヒント情報2]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入する他のプログラム処理装置について説明する。コンパイラ装置へ最適化手法を直接指定するヒント情報として、例えば、ペア命令の出力を指定するヒント情報がある。
このヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図32は、プログラム処理装置102に入力されるプログラムの一例を示す図である。プログラム100には、関数func1および関数func2が含まれている。
このプログラム100を入力とした場合の構文解析部104およびヒント情報挿入部108の実行する処理について説明する。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203の処理においては、関数の仮引数が指す配列の要素のアラインメント値を解析する点が異なる。なお、アラインメント値の解析方法は、実施の形態2に示したものと同様である。このため、その詳細な説明はここでは繰り返さない。
図33は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図33は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図34は、図3のS203およびS204の処理の結果作成される解析情報を示す図である。解析情報106によると、関数func2の仮引数aで指し示される領域のデータ、すなわち配列aの各要素は4バイト単位でアラインメントされていることがわかる。
次に、ヒント情報挿入部108が実行する処理について説明する。
図35は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100に含まれる各ポインタ変数について、以下の処理を繰り返す。
図35は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100に含まれる各ポインタ変数について、以下の処理を繰り返す。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目しているポインタ変数が指すデータの配置について調べる(S901)。ヒント情報挿入部108は、着目しているポインタ変数が指すデータのアラインメント値がデフォルトのアラインメント値の2倍以上になっているか否かを調べる(S902)。デフォルトのアラインメント値の2倍以上になっていれば(S902でYES)、プログラム100中の当該ポインタ変数が宣言されてから参照されるまでの間に、プラグマ「#pragma _pair_inst」を挿入する。着目しているポインタ変数がaの場合には、実際にはプラグマ「#pragma _pair_inst a」が挿入される。このプラグマは、着目しているポインタ変数aで指定されたデータ(例えば、配列aの要素)をメモリから一度にロードしたり、メモリへライトしたりするペア命令を発行し、最適化せよとのコンパイラに対する指示である。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図32に示した関数func2のポインタ変数からなる仮引数aに着目する。図34に示した解析情報106より、仮引数aのアラインメント値は4であることがわかる。仮引数aはshort型であり、short型のサイズは2バイトである。このため、仮引数aのアラインメント値はデフォルトのアラインメント値の2倍になっていることがわかる。よって、図36に示されるヒント情報挿入部108の出力結果であるプログラム101には、当該仮引数a(ポインタ変数a)に対するヒント情報として、プラグマ「#pragma _pair_inst a」が挿入されている。
以上説明したように、本実施の形態によると、ペア命令の出力をコンパイラに直接指示するヒント情報をプログラム中に自動的に挿入することができる。
プラグマ「#pragma _pair_inst a」を挿入することにより、コンパイラは、ポインタaが指すデータをメモリから一度にロードしたり、メモリへライトしたりするペア命令を発行することができる。これにより、機械語プログラム実行時のメモリアクセスの回数を減少させることができ、処理を高速化させることができる。
[実施の形態7、最適化手法を指定するヒント情報3]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入するさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報がある。
[実施の形態7、最適化手法を指定するヒント情報3]
本実施の形態では、コンパイラに対して最適化手法を直接指定するヒント情報をプログラム中に自動的に挿入するさらに他のプログラム処理装置について説明する。コンパイラへ最適化手法を直接指定するヒント情報として、例えば、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報がある。
このヒント情報を含むプログラム101を自動的に生成するプログラム処理装置102が実行する処理について説明する。
図37は、プログラム処理装置102に入力されるプログラムの一例を示す図である。プログラム100には、関数func1および関数func2が含まれている。
構文解析部104は、図3に示したフローチャートと同様の処理を実行する。ただし、S203の処理においては、実施の形態3と同様に、各関数について、大域変数からのデータの読み出しおよび大域変数へのデータの書き込みが存在するか否かの解析を行う。
図38は、図3のS202の処理の結果作成されるコールフローグラフを示す図である。コールフローグラフ107より、関数func1が関数func2を呼び出していることがわかる。
図39は、図3のS203およびS204の結果作成される解析情報を示す図である。解析情報106によると、例えば、関数func2内では、大域変数xからの読み出しと、大域変数yへの書き込みとが行われていることがわかる。
次に、ヒント情報挿入部108が実行する処理について説明する。
図40は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各大域変数について、以下の処理を繰り返す。
図40は、ヒント情報挿入部108が実行する処理のフローチャートである。ヒント情報挿入部108は、プログラム100中に含まれる各大域変数について、以下の処理を繰り返す。
ヒント情報挿入部108は、解析情報106をチェックしながら、着目している大域変数からのデータの読み出しおよび着目している大域変数へのデータの書き込みについて調べる(S1001)。着目している大域変数へのアクセスがデータの書き込みから開始している場合には(S1002でYES)、その大域変数への書き込みが起こる直前に組み込み関数reserve_region()を挿入する(S1003)。例えば、大域変数がaの場合には、組み込み関数reserve_region(a)が挿入される。組み込み関数reserve_region(a)は、キャッシュメモリ等の制御処理を指示するヒント情報の一種である。組み込み関数reserve_region(a)は、実引数aで指定された変数の値を記憶するための領域をキャッシュメモリ上に確保するのみであり、かつメインメモリからキャッシュメモリへはその変数の値を転送(プリフェッチ)しないという処理を実行する組み込み関数である。
プログラム100中にこのようなプラグマを挿入することにより、図41に示すようなヒント情報を含むプログラム101が作成される。
次に、ヒント情報挿入部108によるプラグマの挿入結果の一例について説明する。例えば、図37に示したプログラム100の大域変数yに着目する。大域変数yへのデータの書き込みについて解析情報106を調べると、関数func2において、データの書き込みのみが行われている。このため、関数func2を呼び出した際には、大域変数yへのアクセスはデータの書き込みから始まることがわかる。また、関数func2はコールフローグラフ107より関数func1より呼び出されていることがわかる。このため、関数func1内で関数func2を呼び出している位置の直前に、組み込み関数reserve_region(y)が挿入される。このようにして、ヒント情報を含むプログラム101が作成される。
以上説明したように、本実施の形態によると、キャッシュメモリ等の制御処理を指示する組込み関数によるヒント情報をプログラム中に自動的に挿入することができる。
組み込み関数reserve_region()を挿入することにより、コンパイラは、この組み込み関数を手がかりとして、キャッシュメモリを備えるコンピュータにおいて、当該組み込み関数が呼び出された場合には、その組み込み関数の実引数で指定された変数の値を記憶するための領域をキャッシュメモリ上に確保するのみとし、かつメインメモリからキャッシュメモリへはその変数の値を転送(プリフェッチ)しないような最適化を行うことができる。これにより、機械語プログラム実行時のメモリアクセス時間を減少させることができる。
上述の実施の形態1〜7によると、ユーザがプラグマに代表されるヒント情報をコンパイラに与えなかったとしても、良好な最適化ができるように、自動的にヒント情報を挿入することにより、ソースプログラムを修正することができる。
以上、本発明に係るプログラム処理装置について、実施の形態に基づいて説明したが、本発明は、この実施の形態に限定されるものではない。
例えば、プログラム処理装置は、ヒント情報をあらかじめ含むプログラムを受け、ヒント情報の誤りを修正したり、他のヒント情報に置き換えたりしてもよい。
図42は、ヒント情報の修正および置き換えを説明するための図である。図42(a)に示すような、プラグマ「#pragma _min_iteration=5」を含むプログラム100が与えられた場合に、プログラム処理装置102は、実施の形態1と同様の処理を行うことにより、関数func1のforループに付与されるべきプラグマとして、プラグマ「#pragma _min_iteration=2」を求めることができる。このため、プログラム処理装置102は、図42(a)のプログラム100に含まれるプラグマ「#pragma _min_iteration=5」を、図42(b)に示すようにプラグマ「#pragma _min_iteration=2」に修正したプログラム101を生成するようにしてもよい。
また、プログラム処理装置102は、さらに、実施の形態5と同様の処理を行うことにより、関数func1のforループに付与されるべきプラグマとして、プラグマ「#pragma _software_pipelining」を求めることができる。このため、プログラム処理装置102は、図42(b)のプログラム101に含まれるプラグマ「#pragma _min_iteration=2」を、図42(c)に示すようにプラグマ「#pragma _software_pipelining」に修正したプログラム101を生成するようにしてもよい。
以上のような処理を行うことにより、ユーザがプラグマに代表されるヒント情報をコンパイラに積極的に与えたとしても、良好な最適化ができるように、ヒント情報のチェックをし、ソースプログラムを修正することができる。
また、コンパイラが誤った機械語プログラムを生成してしまうことがないように、プラグマに代表されるヒント情報をチェックし、ソースプログラムを修正することができる。
なお、プラグマを解析しなくとも、プログラム中に、プラグマ「#pragma _min_iteration=n」(nは2以上の整数)があれば、そのプラグマを自動的に、プラグマ「#pragma _software_pipelining」に変換するようにしてもよい。このようにすることにより、プラグマ「#pragma _software_pipelining」は解釈可能であるが、プラグマ「#pragma _min_iteration」を解釈することができないようなコンパイラを用いてプログラムのコンパイルを行うことができるようになる。このため、プログラムの資産価値を高めることができる。
図43は、ヒント情報の修正および置き換えを説明するための他の図である。図43(a)に示すような、プラグマ「#pragma _align_pointer=8 a」を含むプログラム100が与えられた場合に、プログラム処理装置102は、実施の形態2と同様の処理を行うことにより、関数func2の仮引数であるポインタ変数aに付与されるべきプラグマとして、プラグマ「#pragma _align_pointer=4 a」を求めることができる。このため、プログラム処理装置102は、図43(a)に含まれるプラグマ「#pragma _align_pointer=8 a」を、図43(b)に示すようにプラグマ「#pragma _align_pointer=4 a」に修正したプログラム101を生成するようにしてもよい。
また、プログラム処理装置102は、さらに、実施の形態6と同様の処理を行うことにより、関数func2の仮引数であるポインタ変数aに付与されるべきプラグマとして、プラグマ「#pragma _pair_inst a」を求めることができる。このため、プログラム処理装置102は、図43(b)のプログラム101に含まれるプラグマ「#pragma _align_pointer=4 a」を、図43(c)に示すようにプラグマ「#pragma _pair_inst a」に修正したプログラム101を生成するようにしてもよい。
また、プログラム処理装置102は、プログラム中にプラグマを挿入するとともにコンパイルオプションを出力するようにしてもよい。図44は、プログラム処理装置102によるコンパイルオプションの出力処理について説明するための図である。
例えば、図44(a)に示すようなプログラム100が入力された場合には、上述の実施の形態によれば、プログラム処理装置102は、図44(b)に示されるように、例えば、プラグマ「#pragma _align_pointer=8 a」が挿入されたプログラム101を出力するが、図44(c)に示すように、コンパイル時に必要なコンパイルオプションを出力するようにしてもよい。なお、「コンパイルオプション」とは、コンパイラを起動する際に、コンパイルの対象となるプログラム100の指定とともに、ユーザが任意に指定することができるコンパイラへの指示である。例えば、ユーザは、プログラム100「foo.c」をコンパイルするときに、コマンド「cc」を用いて、コンピュータのコマンドライン上で、
cc -falign-all-array=8 foo.c
と入力することができる。
cc -falign-all-array=8 foo.c
と入力することができる。
さらにまた、図1に示したプログラム処理装置102の代わりに、図45に示すようなプログラム処理装置202を用いるようにしてもよい。プログラム処理装置202は、高級言語で記述されたプログラム100と、当該プログラム100に対する解析情報106とを受け、プラグマに代表されるコンパイラに対するヒント情報を含むプログラム101を自動的に生成する装置であり、構文解析部204と、ヒント情報挿入部108を備える。構文解析部204は、プログラム100(100a,100b)を受け、プログラム100(100a,100b)に対して、コンパイラ等で用いられる通常の構文解析処理を行う処理部である。なお、解析情報106は、構文解析部204で構文解析されるプログラム100(100a,100b)とは異なるプログラム100(100a,100b)に対する解析結果である。例えば、プログラム100がプログラム100aとプログラム100bとからなるような場合にあっては、解析情報106はプログラム100aに対する解析情報106であり、構文解析部204に入力されるプログラムは、プログラム100bのような場合である。
ヒント情報挿入部108の構成は、上述した実施の形態と同様である。このため、その詳細な説明はここでは繰り返さない。図46は、プログラム処理装置202に入力されるプログラム100aの一例を示しており、図47は、プログラム処理装置202に入力される解析情報106の一例を示している。その結果、プログラム処理装置202からは図48に示すようなヒント情報を含むプログラム101aが得られる。
また、プログラム100および101は、C言語で記述されたソースプログラムとして説明を行ったが、それ以外のC++言語等の高級言語で記述されたソースプログラムであってもよいし、オブジェクトプログラム、中間言語で記述されたプログラム、アセンブリ言語で記述されたプログラムであってもよい。
さらにまた、上述の実施の形態では、ヒント情報として主にプラグマを例に説明を行ったが、ヒント情報は、プラグマに限られるものではなく、組み込み関数や、コンパイルオプションや、プログラミング言語の予約語等であってもよい。
また、ループアンローリングにおいて展開する繰り返しの回数は2回に限定されるものではなく、それよりも多い回数であっても、同様の趣旨に基づく処理を行うことにより、ヒント情報を含むプログラム101を生成することができる。
本発明は、コンパイラに対して与えるヒント情報を自動生成し、プログラムに追加するプログラム処理装置として利用可能であり、特に、コンパイル時の最適化処理のためのヒント情報をプログラムに自動挿入するプリプロセッサ等として利用可能である。
100,100a,100b,101,101a,101b プログラム
102,202 プログラム処理装置
104,204 構文解析部
106 解析情報
108 ヒント情報挿入部
102,202 プログラム処理装置
104,204 構文解析部
106 解析情報
108 ヒント情報挿入部
Claims (44)
- 第1のプログラムを受け、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力する
ことを特徴とするプログラム処理装置。 - 前記第1のプログラムの構文を解析して、解析情報を生成する構文解析手段と、
前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力するヒント情報付加手段とを備える
ことを特徴とする請求項1に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムの構文を静的に解析し、前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、プログラムの静的な解析により得ることが可能な静的情報を前記ヒント情報として、前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項2に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラム中の関数間の情報を静的に解析して前記解析情報を生成する
ことを特徴とする請求項2に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、ループ処理の繰り返し回数に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項3または4に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、前記解析情報に基づいて、前記第1のプログラムに含まれるループ処理の繰り返し回数の最小回数または最大回数をヒント情報として付加した前記第2のプログラムを出力する
ことを特徴とする請求項5に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれるループ処理の繰り返し回数が必ず偶数であるか否かを判断する偶数判断部と、
前記偶数判断部の判断結果が真の場合には、当該ループ回数の繰り返し回数が必ず偶数であることをヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有する
ことを特徴とする請求項5に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれるループ処理の繰り返し回数が必ず奇数であるか否かを判断する奇数判断部と、
前記奇数判断部の判断結果が真の場合には、当該ループ回数の繰り返し回数が必ず奇数であることをヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有する
ことを特徴とする請求項5に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるデータの配置位置を解析して、当該データの配置位置を含む前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、データの配置位置に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項3または4に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれるデータが所定値でアラインメントされているか否かを判断するアラインメント判断部と、
前記アラインメント判断部の判断結果が真の場合には、当該データと、当該データが所定値でアラインメントされていることとをヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有する
ことを特徴とする請求項9に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるポインタ変数のアクセスする領域を解析して、解析結果を含む前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、ポインタ変数のアクセスする領域に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項3または4に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれるポインタ変数がアクセスする領域が、他のポインタ変数がアクセスする領域との間で重複する領域を有するか否かを判断する重複判断部と、
前記重複判断部の判断結果が偽の場合には、前記第1のプログラムに含まれる前記ポインタ変数がアクセスする領域が、前記他のポインタ変数がアクセスする領域との間で重複する領域を有しないことを示す情報をヒント情報として前記第1のプログラムに付加した前記第2のプログラムを出力するプログラム出力部とを有する
ことを特徴とする請求項11に記載のプログラム処理装置。 - 前記第1および第2のプログラムは、ISO/IEC 9899:1999 - Programming Language Cに準拠した言語で記述されており、
前記ヒント情報は、前記ポインタ変数と、restrict記述との組み合わせである
ことを特徴とする請求項12に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析結果に基づいて、変数からのデータの読み出しまたは変数へのデータの書き込みに関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項3または4に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれる変数へのアクセスが、データの書き込みから始まっているか否かを判断する書き込み判断部と、
前記書き込み判断部の判断結果が真の場合には、当該変数と、当該変数へのアクセスがデータの書き込みから始まることとをヒント情報として、前記第1のプログラム中の、前記変数へのデータの書き込みが行われる位置の直前に前記ヒント情報を挿入し、前記第2のプログラムを作成し、出力するプログラム出力部とを有する
ことを特徴とする請求項14に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれる分岐条件の静的な成立頻度を解析して、解析結果を含む前記解析情報を生成し、
前記ヒント情報付加手段は、前記解析結果に基づいて、分岐条件の成立頻度に関するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項3または4に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれる分岐条件が成立する可能性を判断する可能性判断部と、
前記可能性判断部の判断結果が真となる確率が高いと判断できる場合には、前記分岐条件が成立する可能性が高いことを示すヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項16に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
前記解析情報に基づいて、前記第1のプログラムに含まれる分岐条件が成立する可能性を判断する可能性判断部と、
前記可能性判断部の判断結果が偽となる確率が高いと判断できる場合には、前記分岐条件が不成立となる可能性が高いことを示すヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項16に記載のプログラム処理装置。 - 前記ヒント情報は、コンパイラによるプログラムの最適化処理方法を指示する情報である
ことを特徴とする請求項1〜4のいずれか1項に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、ループアンローリングによるループ処理の最適化を指示するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項19に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
ループアンローリング時に展開する繰り返しの数が2の場合には、前記解析情報に基づいて、前記第1のプログラムに含まれるループ処理の繰り返し回数が2回以上で、かつ奇数回または偶数回のいずれかのみであるという条件を満たすか否かを判断する条件判断部と、
前記第1のプログラムに含まれる、前記条件を満たすループ処理に対して、ループアンローリングによるループ処理の最適化を指示するヒント情報を付加した前記第2のプログラムを出力する
ことを特徴とする請求項20に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるループ処理の繰り返し回数を解析して、当該繰り返し回数を含む解析情報を生成し、
前記ヒント情報付加手段は、前記解析情報に基づいて、ソフトウェアパイプライニングによるループ処理の最適化を指示するヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力する
ことを特徴とする請求項19に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、
同時に実行される繰り返しの数がn(nは2以上の整数)の場合には、前記解析情報に基づいて、前記ヒント情報に対応するループ処理の繰り返し回数がn回以上であるか否かを判断する繰り返し回数判断部と、
前記第1のプログラムに含まれる、前記繰り返し回数判断部の判断結果が真となるループ処理に対して、ソフトウェアパイプライニングによるループ処理の最適化を指示するヒント情報を付加した前記第2のプログラムを出力する
ことを特徴とする請求項22に記載のプログラム装置。 - 前記構文解析手段は、前記第1のプログラムに含まれるデータのアラインメント値を解析して、解析結果を含む前記解析情報を生成し、
前記ヒント情報付加手段は、
前記解析手段に基づいて、第1のプログラムに含まれるデータのアラインメント値が、当該データの型のサイズの2倍以上であるという条件を満たすか否かを判断する条件判断部と、
前記第1のプログラムに含まれる、前記条件を満たすデータに対して、ペア命令の生成によるデータアクセスの最適化を指示するヒント情報を付加した前記第2のプログラムを出力する
ことを特徴とする請求項19に記載のプログラム処理装置。 - 前記ヒント情報は、変数と、キャッシュメモリの制御処理の最適化とを指示する情報である
ことを特徴とする請求項19に記載のプログラム処理装置。 - 前記構文解析手段は、前記第1のプログラムに含まれる変数からのデータの読み出しまたは当該変数へのデータの書き込みを解析して、解析結果を含む前記解析情報を生成し、
前記ヒント情報付加手段は、
前記解析手段に基づいて、前記第1のプログラムに含まれる変数へのアクセスが、データの書き込みから始まっているか否かを判断する書き込み判断部と、
前記書き込み判断部の判断結果が真の場合には、当該変数と、当該変数の値を記憶するための領域を前記キャッシュメモリ上に確保することとをヒント情報として、前記第1のプログラム中の、前記変数へのデータの書き込みが行われる位置の直前に前記ヒント情報を挿入し、前記第2のプログラムを作成し、出力するプログラム出力部とを有する
ことを特徴とする請求項25に記載のプログラム処理装置。 - 前記第1および第2のプログラムはC言語またはC++言語で記述されており、
前記ヒント情報は、前記プログラム中に記述可能なコンパイラへの指示であるプラグマ記述である
ことを特徴とする請求項1〜26のいずれか1項に記載のプログラム処理装置。 - 前記ヒント情報は、組込み関数である
ことを特徴とする請求項1〜26のいずれか1項に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、前記ヒント情報として、コンパイラを起動する際に、コンパイルの対象となる前記第1のプログラムに対してユーザが指定するコンパイルオプションを出力する
ことを特徴とする請求項2〜28のいずれか1項に記載のプログラム処理装置。 - 前記コンパイルオプションは、前記第1のプログラムに含まれるデータの配置方法を指示するコンパイルオプションである
ことを特徴とする請求項29に記載のプログラム処理装置。 - 前記第1のプログラムは、第1のヒント情報を含み、
前記ヒント情報付加手段は、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のない第2のヒント情報を前記第1のプログラムに付加した第2のプログラムを出力する
ことを特徴とする請求項2に記載のプログラム処理装置。 - 前記ヒント情報付加手段は、前記第1のヒント情報の論理的な誤りを前記第2のヒント情報に訂正する
ことを特徴とする請求項31に記載のプログラム処理装置。 - 前記第1のヒント情報は、前記第1のプログラムの静的な解析により得ることが可能な静的情報であり、
前記第2のヒント情報は、前記第2のプログラムの最適化処理方法を指示する最適化指示情報である
ことを特徴とする請求項32に記載のプログラム処理装置。 - 前記第1のヒント情報は、前記第1のプログラム中のループ処理の繰り返し回数に関する情報であり、
前記第2のヒント情報は、前記ループ処理に対して、ソフトウェアパイプライニングによる最適化を指示する情報である
ことを特徴とする請求項33に記載のプログラム処理装置。 - 前記第1のヒント情報は、前記第1のプログラムに含まれるデータの配置位置に関する情報であり、
前記第2のヒント情報は、当該情報に対して、ペア命令の生成による最適化を指示する情報である
ことを特徴とする請求項33に記載のプログラム処理装置。 - プログラム中に、コンパイラに対して与えられるヒント情報を挿入するプログラム処理装置であって、
第1のプログラムと、前記第1のプログラムとは別のプログラムの構文解析結果である解析情報とを入力とし、前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力するヒント情報付加手段を備える
ことを特徴とするプログラム処理装置。 - 前記解析情報には、関数の引数に関する情報が含まれる
ことを特徴とする請求項36に記載のプログラム処理装置。 - 前記解析情報には、大域変数に関する情報が含まれる
ことを特徴とする請求項36に記載のプログラム処理装置。 - 前記解析情報には、データの配置位置に関する情報が含まれる
ことを特徴とする請求項36に記載のプログラム処理装置。 - 前記解析情報には、ポインタ変数のアクセスする領域に関する情報が含まれる
ことを特徴とする請求項36に記載のプログラム処理装置。 - 請求項2〜40のいずれか1項に記載のプログラム処理装置に含まれる手段としてコンピュータを機能させる
ことを特徴とするプログラム。 - 請求項41に記載のプログラムを記録したコンピュータ読み取り可能な記録媒体。
- 第1のプログラムを受け、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した第2のプログラムを出力する
ことを特徴とするプログラム処理方法。 - 前記第1のプログラムの構文を解析して、解析情報を生成する構文解析ステップと、
前記解析情報に基づいて、コンパイラに対して与える論理的に矛盾のないヒント情報を前記第1のプログラムに付加した前記第2のプログラムを出力するヒント情報付加ステップとを含む
ことを特徴とするプログラム処理方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004296287A JP2006107338A (ja) | 2004-10-08 | 2004-10-08 | プログラム処理装置 |
US11/233,023 US20060080643A1 (en) | 2004-10-08 | 2005-09-23 | Program processing apparatus |
CNB200510108602XA CN100476735C (zh) | 2004-10-08 | 2005-10-08 | 程序处理装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2004296287A JP2006107338A (ja) | 2004-10-08 | 2004-10-08 | プログラム処理装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2006107338A true JP2006107338A (ja) | 2006-04-20 |
Family
ID=36146830
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2004296287A Withdrawn JP2006107338A (ja) | 2004-10-08 | 2004-10-08 | プログラム処理装置 |
Country Status (3)
Country | Link |
---|---|
US (1) | US20060080643A1 (ja) |
JP (1) | JP2006107338A (ja) |
CN (1) | CN100476735C (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010050128A1 (ja) * | 2008-10-30 | 2010-05-06 | パナソニック株式会社 | コンパイル方法及びコンパイルプログラム |
JP2011008682A (ja) * | 2009-06-29 | 2011-01-13 | Fujitsu Ltd | コンパイル方法、プログラム実行方法及びプログラム |
Families Citing this family (14)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
GB0510657D0 (en) * | 2005-05-25 | 2005-06-29 | Ibm | Generating an application software library |
JP2007304840A (ja) * | 2006-05-11 | 2007-11-22 | Matsushita Electric Ind Co Ltd | コンパイル方法、デバッグ方法、コンパイルプログラムおよびデバッグプログラム |
JP2008293378A (ja) * | 2007-05-25 | 2008-12-04 | Panasonic Corp | プログラム書き換え装置 |
JP2009187285A (ja) * | 2008-02-06 | 2009-08-20 | Panasonic Corp | プログラム変換方法、プログラム変換装置およびプログラム |
US8214795B2 (en) * | 2008-11-26 | 2012-07-03 | Optumsoft, Inc. | Efficient automated translation of procedures in constraint-based language |
US20110289485A1 (en) * | 2010-05-21 | 2011-11-24 | International Business Machines Corporation | Software Trace Collection and Analysis Utilizing Direct Interthread Communication On A Network On Chip |
CN102521250B (zh) * | 2011-11-16 | 2014-09-17 | 中国电子科技集团公司第四十一研究所 | 一种智能测量仪器通用语法分析的实现方法 |
US9081586B2 (en) * | 2011-11-29 | 2015-07-14 | Futurewei Technologies, Inc. | Systems and methods for customizing optimization/transformation/ processing strategies |
US9798548B2 (en) * | 2011-12-21 | 2017-10-24 | Nvidia Corporation | Methods and apparatus for scheduling instructions using pre-decode data |
US9250877B2 (en) * | 2013-09-20 | 2016-02-02 | Cray Inc. | Assisting parallelization of a computer program |
CN103760965B (zh) * | 2014-02-21 | 2016-08-17 | 中南大学 | 一种能量受限嵌入式系统的算法源程序节能优化方法 |
US9330224B2 (en) * | 2014-04-30 | 2016-05-03 | Oracle International Corporation | Method and apparatus for dummy cell placement management |
KR101623174B1 (ko) * | 2014-08-27 | 2016-05-20 | 주식회사 파수닷컴 | 소스 코드 분석 장치, 이를 위한 컴퓨터 프로그램, 그 기록매체 |
US10996989B2 (en) | 2016-06-13 | 2021-05-04 | International Business Machines Corporation | Flexible optimized data handling in systems with multiple memories |
Family Cites Families (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5450585A (en) * | 1991-05-15 | 1995-09-12 | International Business Machines Corporation | Compiler with delayed conditional branching |
US5655122A (en) * | 1995-04-05 | 1997-08-05 | Sequent Computer Systems, Inc. | Optimizing compiler with static prediction of branch probability, branch frequency and function frequency |
US6064818A (en) * | 1997-04-10 | 2000-05-16 | International Business Machines Corporation | Straight path optimization for compilers |
US6826752B1 (en) * | 1998-12-17 | 2004-11-30 | California Institute Of Technology | Programming system and thread synchronization mechanisms for the development of selectively sequential and multithreaded computer programs |
JP4044756B2 (ja) * | 2001-12-11 | 2008-02-06 | 松下電器産業株式会社 | プログラム変換装置、プログラム変換方法、及び当該プログラム変換装置を実現するプログラム |
JP3847672B2 (ja) * | 2002-07-03 | 2006-11-22 | 松下電器産業株式会社 | コンパイラ装置及びコンパイル方法 |
JP3801545B2 (ja) * | 2002-08-02 | 2006-07-26 | 松下電器産業株式会社 | コンパイラ用プログラム、コンパイラ装置及びコンパイル方法 |
JP4934267B2 (ja) * | 2003-10-17 | 2012-05-16 | パナソニック株式会社 | コンパイラ装置 |
-
2004
- 2004-10-08 JP JP2004296287A patent/JP2006107338A/ja not_active Withdrawn
-
2005
- 2005-09-23 US US11/233,023 patent/US20060080643A1/en not_active Abandoned
- 2005-10-08 CN CNB200510108602XA patent/CN100476735C/zh not_active Expired - Fee Related
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2010050128A1 (ja) * | 2008-10-30 | 2010-05-06 | パナソニック株式会社 | コンパイル方法及びコンパイルプログラム |
JP2010108258A (ja) * | 2008-10-30 | 2010-05-13 | Panasonic Corp | コンパイル方法及びコンパイルプログラム |
JP2011008682A (ja) * | 2009-06-29 | 2011-01-13 | Fujitsu Ltd | コンパイル方法、プログラム実行方法及びプログラム |
Also Published As
Publication number | Publication date |
---|---|
CN1758221A (zh) | 2006-04-12 |
CN100476735C (zh) | 2009-04-08 |
US20060080643A1 (en) | 2006-04-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US20060080643A1 (en) | Program processing apparatus | |
US7353508B2 (en) | Method, apparatus and article for generation of debugging information | |
US20060080642A1 (en) | Program processing apparatus | |
US5778212A (en) | Interprocedural analysis user interface | |
US7610545B2 (en) | Annotations for tracking provenance | |
JP5893038B2 (ja) | ユーザ定義型のコンパイル時境界検査 | |
US7917899B2 (en) | Program development apparatus, method for developing a program, and a computer program product for executing an application for a program development apparatus | |
US8949808B2 (en) | Systems and methods for compiler-based full-function vectorization | |
US7530061B2 (en) | Programmatic access to the widest mode floating-point arithmetic supported by a processor | |
US8843920B2 (en) | Systems and methods for deferring software implementation decisions until load time | |
US20080052693A1 (en) | Method of simd-ization through data reshaping, padding, and alignment | |
US8122440B1 (en) | Method and apparatus for enumerating external program code dependencies | |
JP2008505423A (ja) | 最適化されたプログラムのためのアンワインド情報の生成 | |
US20020019973A1 (en) | Compiler and method for compiling easily adaptable to processor specifications | |
US10409559B2 (en) | Single-source-base compilation for multiple target environments | |
US8966461B2 (en) | Vector width-aware synchronization-elision for vector processors | |
US6684394B1 (en) | Relocation format for linking with relocation instructions containing operations for combining section data | |
KR20170014613A (ko) | 전자 장치, 컴파일링 방법 및 컴퓨터 판독가능 기록매체 | |
US6687899B1 (en) | Relocation format for linking | |
US6704928B1 (en) | Relocation format for linking | |
US20170075668A1 (en) | Methods and Systems for Generating Client-Server Applications for Target Devices | |
CA2240584C (en) | Compile-time data dependency verification | |
US20050125783A1 (en) | Program optimization with intermediate code | |
JPH10320212A (ja) | キャッシュ向け最適化方法 | |
CN107562430B (zh) | 一种针对移动π演算语言的文件处理功能的编译方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20071004 |
|
A761 | Written withdrawal of application |
Free format text: JAPANESE INTERMEDIATE CODE: A761 Effective date: 20091008 |