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

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

Info

Publication number
JP6572610B2
JP6572610B2 JP2015091855A JP2015091855A JP6572610B2 JP 6572610 B2 JP6572610 B2 JP 6572610B2 JP 2015091855 A JP2015091855 A JP 2015091855A JP 2015091855 A JP2015091855 A JP 2015091855A JP 6572610 B2 JP6572610 B2 JP 6572610B2
Authority
JP
Japan
Prior art keywords
function
call
calls
evaluation value
function call
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2015091855A
Other languages
English (en)
Other versions
JP2016207161A (ja
Inventor
貴之 松浦
貴之 松浦
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2015091855A priority Critical patent/JP6572610B2/ja
Priority to US15/070,048 priority patent/US9760354B2/en
Publication of JP2016207161A publication Critical patent/JP2016207161A/ja
Application granted granted Critical
Publication of JP6572610B2 publication Critical patent/JP6572610B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4443Inlining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • G06F8/4442Reducing the number of cache misses; Data prefetching

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)

Description

本発明は情報処理装置、コンパイル方法およびコンパイルプログラムに関する。
ソフトウェア開発においては、人間が理解容易な高級言語を用いてソースコードを作成し、コンパイラを用いてソースコードを機械可読なオブジェクトコードに変換することが多い。ソースコードを作成する際、再利用性が高くなるように1つの纏まった処理を関数として定義し、関数呼び出しによって関数を繰り返し利用することが行われている。
しかし、関数呼び出しをそのままプロセッサに実行させると、レジスタの値などの内部状態を退避して入れ替えるオーバヘッドが発生する。関数呼び出しが頻繁に実行されると、実行効率が低下するおそれがある。そこで、コンパイラの中には、コンパイラ最適化の1つとして関数呼び出しのインライン展開を行うものがある。関数呼び出しのインライン展開は、関数呼び出し命令を呼び出し先の関数に含まれる命令に置き換えて、オブジェクトコードから関数呼び出し命令を削減する最適化である。関数呼び出しのインライン展開によって、オブジェクトコードの実行効率が向上することがある。
ただし、関数呼び出しをインライン展開すると、呼び出し元のプログラムモジュールでは命令数が増大することが多い。命令数が増大すると、そのプログラムモジュールの命令全体がプロセッサの命令キャッシュに収容されなくなるおそれがあり、命令キャッシュにおける命令の入れ替えが頻発してかえって実行効率が低下するおそれがある。そこで、コンパイラにおいて、ある関数呼び出しをインライン展開した場合のオブジェクトコード量を見積もり、見積もったオブジェクトコード量が命令キャッシュのサイズを超えない場合のみ、当該関数呼び出しをインライン展開する最適化方法が提案されている。
また、関数呼び出し毎にインライン展開の要否を判定するコンパイラが提案されている。提案のコンパイラは、ある関数呼び出しについて、当該関数呼び出しが属するループの実行回数を推定する。コンパイラは、推定したループ回数と、呼び出し先関数のオブジェクトコード量と、ターゲットとするプロセッサの特性とに基づいて、当該関数呼び出しの判定値を算出する。コンパイラは、算出した判定値が所定の閾値を超えている場合に、当該関数呼び出しをインライン展開することを決定する。
また、複数の関数の中から最適化対象とする関数を選択するプログラム変換装置が提案されている。提案のプログラム変換装置は、複数の関数それぞれについて、関数の中で変数にアクセスする命令をカウントする。プログラム変換装置は、カウントした命令数が最も大きい関数を選択し、選択した関数を呼び出す関数呼び出しをインライン展開する。
特開平5−120029号公報 特開平6−202875号公報 特開2001−282546号公報
複数の関数呼び出しの中には、インライン展開することによる実行効率の向上の効果が大きいものと小さいものとが存在する。そのため、命令キャッシュのサイズなどの制約のもとで、できる限り実行効率の向上の効果が大きい関数呼び出しを選択してインライン展開することが好ましい。しかし、上記の特許文献2に記載の技術は、インライン展開するか否かを関数呼び出し毎に個別に判定するものであり、複数の関数呼び出しの中からインライン展開するものを選択するものではない。また、上記の特許文献3に記載の技術は、変数にアクセスする命令が多い関数を呼び出し先とする関数呼び出しをインライン展開するものであり、実行効率の向上という点から改善の余地がある。
1つの側面では、本発明は、実行効率の点から適切な関数呼び出しをインライン展開できるようにする情報処理装置、コンパイル方法およびコンパイルプログラムを提供することを目的とする。
1つの態様では、記憶部と変換部とを有する情報処理装置が提供される。記憶部は、複数の関数とそれぞれが複数の関数の何れかを呼び出す複数の関数呼び出しとを含むコードを記憶する。変換部は、コードに含まれる複数の関数それぞれについて、関数内のループの繰り返し状況を示す第1の指標値および関数のコード量を示す第2の指標値を含む複数の指標値を算出する。変換部は、コードに含まれる複数の関数呼び出しそれぞれについて、呼び出し先の関数について算出した複数の指標値に基づいて評価値を算出する。変換部は、評価値に基づいて複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した1以上の関数呼び出しをインライン展開する。
また、1つの態様では、コンピュータが実行するコンパイル方法が提供される。また、1つの態様では、コンピュータに実行させるコンパイルプログラムが提供される。
1つの側面では、実行効率の点から適切な関数呼び出しをインライン展開できる。
情報処理装置の例を示す図である。 コンパイル装置のハードウェア例を示すブロック図である。 コンパイル装置の機能例を示すブロック図である。 インライン展開の例を示す図である。 階層的な関数呼び出しのインライン展開の例を示す図である。 関数呼び出しグラフの例を示す図である。 キューおよびスタックの例を示す図である。 関数データの例を示す図である。 関数呼び出し指標データと関数指標データの例を示す図である。 関数呼び出し指標の抽出例を示す図である。 関数指標の抽出例を示す図である。 評価基準テーブルの例を示す図である。 評価値テーブルの例を示す図である。 関数データの更新例を示す図である。 評価値の再算出例を示す図である。 コンパイルの手順例を示すフローチャートである。 順方向関数走査の手順例を示すフローチャートである。 関数呼び出し指標抽出の手順例を示すフローチャートである。 逆方向関数走査の手順例を示すフローチャートである。 関数指標抽出の手順例を示すフローチャートである。 インライン展開の手順例を示すフローチャートである。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、情報処理装置の例を示す図である。
第1の実施の形態の情報処理装置10は、高級言語で記載されたソースコードをコンパイルし、機械可読なオブジェクトコードを生成する。情報処理装置10は、コンパイル装置と呼ぶこともできる。情報処理装置10は、コンピュータであってもよい。例えば、情報処理装置10は、ソフトウェアとしてのコンパイラを実行する。情報処理装置10は、ユーザが操作する端末装置(クライアントコンピュータなど)でもよいし、端末装置からアクセスされるサーバ装置(サーバコンピュータなど)であってもよい。
情報処理装置10は、記憶部11および変換部12を有する。記憶部11は、例えば、RAM(Random Access Memory)などの揮発性の記憶装置、または、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性の記憶装置である。変換部12は、例えば、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサである。ただし、変換部12は、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、RAMなどのメモリに記憶されたプログラムを実行する。例えば、プロセッサは、ソースコードをコンパイルするコンパイルプログラムを実行する。複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼ぶこともある。
記憶部11は、コード13を記憶する。コード13は、例えば、ソースコードまたはソースコードから変換された中間コードである。コード13には、関数14a,14b,14cを含む複数の関数が記載されている。図1の例では、関数14aは呼び出されると処理Aを実行し、関数14bは呼び出されると処理Bを実行し、関数14cは呼び出されると処理Cを実行する。また、コード13には、関数呼び出し15a,15b,15cを含む複数の関数呼び出しが記載されている。各関数呼び出しは、何れかの関数を呼び出す。図1の例では、関数呼び出し15aは関数14aを呼び出し、関数呼び出し15bは関数14bを呼び出し、関数呼び出し15cは関数14cを呼び出す。
変換部12は、コード13に記載された各関数について、指標値16a(第1の指標値)および指標値16b(第2の指標値)を含む複数の指標値を算出する。指標値16aは、関数内のループの繰り返し状況(例えば、ループ回数)を示す。指標値16bは、関数のコード量(例えば、ソースコードの行数や中間コードの命令数など)を示す。
変換部12が算出する複数の指標値には、第3の指標値、第4の指標値および第5の指標値の少なくとも1つが更に含まれてもよい。第3の指標値は、関数に対してインライン展開を指示する付加情報が付加されているか否かを示す。付加情報は、例えば、ユーザによってソースコードに付加される。第4の指標値は、関数に含まれる他の関数呼び出しの数を示す。第5の指標値は、関数に含まれる命令のうちパイプライン化されない命令の数を示す。パイプライン化されない命令の種類は、ターゲットとするプロセッサに依存し、例えば、SIMD(Single Instruction Multiple Data)命令などである。
変換部12は、コード13に記載された各関数呼び出しについて評価値17を算出する。評価値17は、呼び出し先の関数について算出した上記の複数の指標値を用いて算出する。例えば、変換部12は、指標値16a,16bそれぞれに所定の重みをかけて合算した値を評価値17とする。重みは、ターゲットとするプロセッサに応じて変えてもよい。図1の例では、関数呼び出し15aの評価値を、関数14aの指標値を用いて算出する。関数呼び出し15bの評価値を、関数14bの指標値を用いて算出する。関数呼び出し15cの評価値を、関数14cの指標値を用いて算出する。
このとき、変換部12は、関数呼び出しを含むモジュール(例えば、当該関数呼び出しを含む関数)に応じた他の指標値を算出し、呼び出し先の関数の指標値に加えて他の評価値を用いて評価値17を算出してもよい。他の評価値として、例えば、第6の指標値や第7の指標値を用いることができる。第6の指標値は、関数呼び出しが属するループの繰り返し状況(例えば、ループ回数)を示す。第7の指標値は、関数呼び出しが属するモジュールに含まれる命令のうちパイプライン化されない命令の数を示す。
変換部12は、評価値17に基づいて複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した関数呼び出しをインライン展開する。すなわち、変換部12は、選択した関数呼び出しの命令を、呼び出し先の関数に含まれる命令に置き換える。選択する関数呼び出しは、例えば、評価値17が大きいものを優先する。ただし、インライン展開後の各モジュールのコード量が、ターゲットとするプロセッサの命令キャッシュ(例えば、L1(レイヤ1)命令キャッシュ)のサイズを超えないことを条件としてもよい。
図1の例では、関数呼び出し15a,15b,15cがメイン関数に含まれている。関数呼び出し15aの評価値が「60」、関数呼び出し15bの評価値が「100」、関数呼び出し15cの評価値が「80」である。この場合、メイン関数のコード量が命令キャッシュのサイズを超えないことを条件として、関数呼び出し15a,15b,15cのうち関数呼び出し15bが優先的に選択され、次に関数呼び出し15cが選択される。その結果、関数呼び出し15b,15cがインライン展開され、先頭に記載された関数呼び出し15aはインライン展開されないことになる可能性がある。
第1の実施の形態の情報処理装置10によれば、関数14a,14b,14cそれぞれについて、関数内のループの繰り返し状況を示す指標値16aおよび関数のコード量を示す指標値16bを含む複数の指標値が算出される。関数呼び出し15a,15b,15cそれぞれについて、呼び出し先の関数について算出した複数の指標値に基づいて評価値17が算出される。そして、評価値17に基づいて関数呼び出し15a,15b,15cの中から1以上の関数呼び出しが選択されてインライン展開される。
これにより、命令キャッシュのサイズなどの制約によって一部の関数呼び出しのみをインライン展開する場合であっても、オブジェクトコードの実行効率向上の効果が大きい関数呼び出しを優先的にインライン展開することができる。すなわち、実行効率の点から適切な関数呼び出しをインライン展開することができる。また、関数呼び出しの全通りの組み合わせについて実行効率向上の効果を直接評価しなくてもよく、コンパイル最適化の負荷を低減しコンパイル時間を短縮することが可能となる。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
第2の実施の形態のコンパイル装置100は、高級言語で記述されたソースコードをコンパイルし、機械可読なオブジェクトコードを生成する。コンパイル装置100は、ユーザが操作する端末装置でもよいし、端末装置からアクセスされるサーバ装置でもよい。コンパイル装置100は、例えば、コンピュータを用いて実装される。その場合、コンパイル装置100は、ソフトウェアとしてのコンパイラおよびリンカを実行する。
図2は、コンパイル装置のハードウェア例を示すブロック図である。
コンパイル装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。上記ユニットはバス108に接続される。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、コンパイル装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、コンパイル装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、コンパイルプログラムやリンクプログラムが含まれる。なお、コンパイル装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、コンパイル装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、コンパイル装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、コンパイル装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他のコンピュータと通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
なお、コンパイル装置100は、媒体リーダ106を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部104や入力信号処理部105を備えていなくてもよい。また、ディスプレイ111や入力デバイス112が、コンパイル装置100の筐体と一体に形成されていてもよい。
図3は、コンパイル装置の機能例を示すブロック図である。
コンパイル装置100は、ファイル記憶部120、コンパイラ130およびリンカ150を有する。ファイル記憶部120は、例えば、RAM102またはHDD103に確保した記憶領域として実現される。コンパイラ130およびリンカ150は、例えば、CPU101が実行するプログラムのモジュール(コンパイルプログラムおよびリンクプログラム)として実現できる。ただし、コンパイラ130およびリンカ150の機能の一部または全部を、ソフトウェアでなく電子回路として実現することも可能である。
ファイル記憶部120は、ソースファイル121、オブジェクトファイル122および実行ファイル123を記憶する。ソースファイル121は、C++などの高級言語で記述されたソースコードを含む。オブジェクトファイル122は、機械可読なオブジェクトコードを含む。実行ファイル123は、ターゲットのプロセッサが実行できる形式のファイルであり、生成されたオブジェクトコードとライブラリなどへのリンクを含む。なお、実行ファイル123は、CPU101が実行してもよいし、コンパイル装置100が備える他のCPUまたはコンパイル装置100以外のコンピュータのCPUが実行してもよい。
コンパイラ130は、ファイル記憶部120からソースファイル121を読み出し、ソースコードをオブジェクトコードに変換し、オブジェクトファイル122をファイル記憶部120に格納する。コンパイラ130は、入出力制御部131、ファイル入力部132、中間コード生成部133、中間コード記憶部134、アセンブリコード生成部135、ファイル出力部136、最適化部140および制御情報記憶部143を有する。
入出力制御部131は、ファイルの種類に応じた入出力方法を選択し、ファイル入力部132およびファイル出力部136を制御する。ファイル入力部132は、入出力制御部131からの指示に応じて、ソースファイル121をオープンし、ソースファイル121からソースコードを読み出す。中間コード生成部133は、ファイル入力部132が読み出したソースコードを解析して、コンパイラ130の内部で利用される中間言語で記述された中間コードに変換し、中間コードを中間コード記憶部134に格納する。ソースコードの解析には、字句解析、構文解析、意味解析などが含まれる。中間コード記憶部134は、RAM102に確保された記憶領域であり、中間コードを記憶する。
アセンブリコード生成部135は、最適化部140によって最適化された中間コードを、低級言語であるアセンブリ言語で記述されたアセンブリコードに変換する。ファイル出力部136は、入出力制御部131からの指示に応じて、オブジェクトファイル122を生成し、アセンブリコード生成部135が生成したアセンブリコードをオブジェクトコードに変換し、オブジェクトファイル122に書き込む。
最適化部140は、中間コード記憶部134に記憶された中間コードを、実行速度が向上するように最適化する。最適化部140は、解析部141および最適化実行部142を有する。解析部141は、中間コードを解析して最適化方法を決定する。解析部141が行う最適化方法の決定には、関数呼び出しのインライン展開、すなわち、関数呼び出し命令を呼び出し先の関数に含まれる命令に置き換えて関数呼び出しを削減することが含まれる。最適化実行部142は、解析部141が決定した最適化方法に従って中間コードを最適化する。最適化実行部142が行う最適化には、インライン展開が含まれる。
制御情報記憶部143は、RAM102またはHDD103に確保された記憶領域であり、最適化部140が最適化処理の中で生成または参照する各種の制御情報を記憶する。制御情報の詳細については後述する。
リンカ150は、ファイル記憶部120からオブジェクトファイル122を読み出し、オブジェクトコードを解析して、参照されている他のオブジェクトファイルやライブラリを検出する。そして、リンカ150は、オブジェクトファイル122と、検出した他のオブジェクトファイルやライブラリとをリンクし、実行ファイル123を生成する。なお、コンパイラ130にリンカ150の機能が統合されていてもよい。
次に、関数呼び出しのインライン展開について説明する。
図4は、インライン展開の例を示す図である。
ここでは説明を簡単にするため、ソースコードレベルで関数呼び出しのインライン展開について説明する。コンパイル装置100は、実際には、図4に記載されたソースコードに対応する中間コードに対して関数呼び出しのインライン展開を行う。
ソースコード21は、ソースファイル121に含まれるソースコードの一例である。ソースコード21は、関数mainと関数big_subAと関数big_subBと関数inline_subとを含む。関数big_subAには、1990行の命令文によって処理Aが定義されている。関数big_subBには、1990行の命令文によって処理Bが定義されている。関数inline_subには、20行の命令文によって処理Cが定義されている。関数mainは、関数big_subAを呼び出す関数呼び出し21aと、関数big_subBを呼び出す関数呼び出し21bと、関数inline_subを呼び出す関数呼び出し21cとを含む。関数呼び出し21cは、ループ回数が100のループ内に存在する。関数呼び出し21a,21bはループ外に存在する。
ここで、ソースコード21に対してインライン展開の最適化を行う場合を考える。ただし、L1命令キャッシュのサイズの制約から、関数mainの行数が4000を超えないことを条件とする。ここで言う「行数」は、セミコロンで終わる実質的な命令文の数であり、図4に示したソースコード21における関数mainの行数は5である。インライン展開の方法として、以下の2つの方法が考えられる。
第1の方法は、ソースコード21の先頭に近い方から順に関数呼び出しをインライン展開する方法である。第1の方法によれば、ソースコード21がソースコード22に変換される。すなわち、まず関数呼び出し21aが選択される。関数呼び出し21aをインライン展開すると、関数mainの行数が1994になるため、選択された関数呼び出し21aがインライン展開される。次に、関数呼び出し21bが選択される。関数呼び出し21bをインライン展開すると、関数mainの行数が3983になるため、選択された関数呼び出し21bがインライン展開される。次に、関数呼び出し21cが選択される。関数呼び出し21cをインライン展開すると、関数mainの行数が4002になるため、選択された関数呼び出し21cはインライン展開されず最適化が終了する。
しかし、第1の方法によれば、1回しか実行されない関数呼び出し21a,21bがインライン展開され、100回実行される関数呼び出し21cがインライン展開されない。このため、ソースコード22に対応するオブジェクトコードには、実行効率に改善の余地がある。そこで、第2の方法は、関数呼び出し21a,21b,21cを評価し、評価値の大きい関数呼び出しを優先的に選択するようにする。ここでは、評価値に応じて関数呼び出し21c,21a,21bの順に選択されるものとする。
第2の方法によれば、ソースコード21がソースコード23に変換される。すなわち、まず関数呼び出し21cが選択される。関数呼び出し21cをインライン展開すると、関数mainの行数が24になるため、選択された関数呼び出し21cがインライン展開される。次に、関数呼び出し21aが選択される。関数呼び出し21aをインライン展開すると、関数mainの行数が2023になるため、選択された関数呼び出し21aがインライン展開される。次に、関数呼び出し21bが選択される。関数呼び出し21bをインライン展開すると、関数mainの行数が4002になるため、選択された関数呼び出し21bはインライン展開されず最適化が終了する。
第2の方法によって生成されたソースコード23に対応するオブジェクトコードは、第1の方法によって生成されたソースコード22に対応するオブジェクトコードと比べて関数呼び出しの回数が少なくなる。よって、実行効率が向上していると言える。
図5は、階層的な関数呼び出しのインライン展開の例を示す図である。
ここでは、階層的な関数呼び出しの一部をインライン展開する場合について説明する。関数31(rootSub)は、関数32(subA)を呼び出す関数呼び出しと、関数33(subB)を呼び出す関数呼び出しと、関数34(subC)を呼び出す関数呼び出しとを含む。関数32は、「A=A+1」という命令文を含む。関数33は、関数35(subX)を呼び出す関数呼び出しと、関数36(subY)を呼び出す関数呼び出しとを含む。関数34は、関数37(subZ)を呼び出す関数呼び出しを含む。関数35は、「X=X+2」という命令文を含む。関数36は、「Y=Y*3」という命令文を含む。関数37は、「Z=Z/2」という命令文を含む。
ここで、関数31から関数32を呼び出す関数呼び出しと、関数31から関数34を呼び出す関数呼び出しとをインライン展開するとする。また、関数33から関数35を呼び出す関数呼び出しと、関数33から関数36を呼び出す関数呼び出しと、関数34から関数37を呼び出す関数呼び出しとをインライン展開するとする。一方、関数31から関数33を呼び出す関数呼び出しはインライン展開しないとする。
この場合、関数35の命令文「X=X+2」が関数33に組み込まれ、関数36の命令文「Y=Y*3」が関数33に組み込まれる。また、関数37の命令文「Z=Z/2」が関数34に組み込まれる。また、関数32の命令文「A=A+1」が関数31に組み込まれる。また、関数34に組み込まれた命令文「Z=Z/2」が関数31に組み込まれる。その結果、関数31は、命令文「A=A+1」と関数33の関数呼び出しと命令文「Z=Z/2」とを含むことになる。関数33は、命令文「X=X+2」と命令文「Y=Y*3」とを含むことになる。なお、関数32,34,35,36,37は、他の関数から参照されていない場合にはオブジェクトコードから削除してもよい。
次に、各関数呼び出しの評価に用いるデータ構造について説明する。
図6は、関数呼び出しグラフの例を示す図である。
関数呼び出しグラフ40は、解析部141が中間コード記憶部134に記憶された中間コードを解析することで生成する。関数呼び出しグラフ40は、関数を示すノードと関数呼び出しを示すリンクとを含む。関数呼び出しグラフ40は、階層的な関数呼び出しを表現したグラフであり、ツリーの形状またはツリーに類似する形状をもつ。具体的には、関数呼び出しグラフ40は、ルートとなる1つのノードを有する点でツリーと共通する。ただし、関数呼び出しグラフ40は、同じノード間に複数のリンクが設定され得る点、および、異なる親ノードが同じ子ノードと接続され得る点で、ツリーと異なることがある。
一例として、関数呼び出しグラフ40は、関数#1〜#12に対応するノードと関数呼び出し#A〜#Kに対応するリンクとを有する。#1〜#12は、中間コードに含まれる各関数に対して解析部141が付与したIDである。#A〜#Mは、中間コードに含まれる各関数呼び出しに対して解析部141が付与したIDである。
関数#12は、関数#9を呼び出す関数呼び出し#Aと、関数#10を呼び出す関数呼び出し#Bと、関数#11を呼び出す関数呼び出し#Cとを含む。関数#11は、関数#7を呼び出す関数呼び出し#Dと、関数#8を呼び出す関数呼び出し#Eとを含む。関数#9は、関数#5を呼び出す関数呼び出し#Fと、関数#6を呼び出す関数呼び出し#Gとを含む。関数#8は、関数#3を呼び出す関数呼び出し#Hと、関数#3を呼び出す関数呼び出し#Iと、関数#4を呼び出す関数呼び出し#Jとを含む。関数#6は、関数#1を呼び出す関数呼び出し#Kと、関数#2を呼び出す関数呼び出し#Lとを含む。関数#7は、関数#2を呼び出す関数呼び出し#Mを含む。
以下で説明するように、関数呼び出し#A〜#Mの評価値は、関数呼び出しグラフ40に従って関数#1〜#12全体を2回走査することで算出することができる。1回目の走査は、関数呼び出しグラフ40のルートから葉ノードに向かって幅優先順に関数を走査するものであり、順方向関数走査と言うことができる。すなわち、解析部141は、1回目の走査において、関数#12,#11,#10,#9,#8,#7,#6,#5,#4,#3,#2,#1の順に関数#1〜#12を走査する。2回目の走査は、1回目とは逆順に関数を走査するものであり、逆方向関数走査と言うことができる。すなわち、解析部141は、2回目の走査において、関数#1,#2,#3,#4,#5,#6,#7,#8,#9,#10,#11,#12の順に関数#1〜#12を走査する。
図7は、キューおよびスタックの例を示す図である。
キュー161およびスタック162は、制御情報記憶部143に形成されている記憶領域である。キュー161およびスタック162はそれぞれ、関数#1〜#12を識別する関数IDを記憶する。キュー161は、先入れ先出し(FIFO:First In First Out)のデータ構造をもち、先に挿入された関数IDから先に抽出することができる。スタック162は、後入れ先出し(LIFO:Last In First Out)のデータ構造をもち、後に挿入された関数IDから先に抽出することができる。
解析部141は、上記の順方向関数走査において、検出した関数の関数IDをキュー161およびスタック162に挿入する。キュー161に挿入された関数IDは、以降の順方向関数走査に使用される。解析部141は、順方向関数走査においてキュー161の末尾(入口の逆側)から関数IDを抽出する。スタック162に挿入された関数IDは、上記の2回目の走査(逆方向関数走査)に使用される。解析部141は、逆方向関数走査においてスタック162の先頭(入口)から関数IDを抽出する。
図8は、関数データの例を示す図である。
解析部141は、関数IDをキュー161およびスタック162に挿入したとき、併せて関数データ163を生成する。関数データ163は、制御情報記憶部143に記憶される。関数データ163は、各関数に対応するレコードを含む。1つのレコードは、関数ID、アドレス、呼び出し元および呼び出し先の項目を有する。
アドレスの項目は、当該関数の先頭位置を示す。呼び出し元の項目は、当該関数を呼び出す他の関数のアドレスを示す。呼び出し元の項目には、複数の他の関数のアドレスが含まれることがある。ただし、ルートの関数(図6の例では関数#12)に対応するレコードでは、呼び出し元の項目は空となる。呼び出し先の項目は、当該関数から呼び出される他の関数のアドレスと関数呼び出しを識別する関数呼び出しIDとを示す。呼び出し先の項目には、複数の他の関数のアドレスおよび複数の関数呼び出しIDが含まれることがある。ただし、葉ノードの関数(図6の例では関数#1,#2,#3,#4,#5,#10)に対応するレコードでは、呼び出し先の項目は空となる。
一例として、関数#8に対応するレコードは、関数ID「8」、アドレス「0x0888」、呼び出し元「0x1111」、呼び出し先「0x0333,H」,「0x0333,I」,「0x0444,J」を含む。「0x1111」は関数#11のアドレス、「0x0333」は関数#3のアドレス、「0x0444」は関数#4のアドレスである。
図9は、関数呼び出し指標データと関数指標データの例を示す図である。
解析部141は、順方向関数走査で、各関数呼び出しについての指標値を中間コードから抽出し、抽出した指標値を含む関数呼び出し指標データ164を生成する。関数呼び出し指標データ164は、制御情報記憶部143に記憶される。関数呼び出し指標データ164は、各関数呼び出しに対応するレコードを含む。1つのレコードは、関数呼び出しID、ループ回数、最内ループフラグおよび非パイプライン命令数の項目を有する。
ループ回数の項目は、当該関数呼び出しが属するループの繰り返し回数を示す。当該関数呼び出しが属するブロック(ひと纏まりのコンパイル単位)にループがない場合、ループ回数は0になる。繰り返し回数が中間コードから不明な場合(例えば、実行時に動的に決まる場合)、ループ回数を0などの所定値とみなしてもよい。
最内ループフラグの項目は、当該関数呼び出しが最内ループに属している(当該関数呼び出しが属するループの内側に他のループが存在しない)か否かを示す。当該関数呼び出しの属するブロックにループがない場合、または、当該関数呼び出しが属するループの内側に他のループが存在しない場合、最内ループフラグはTrueになる。非パイプライン命令数の項目は、当該関数呼び出しが属するブロックに含まれる命令のうち、パイプライン化されない命令の数を示す。パイプライン化されない命令は、ターゲットのプロセッサのアーキテクチャに依存する。一例として、SIMD命令が挙げられる。
解析部141は、逆方向関数走査で、各関数についての指標値を中間コードから抽出し、抽出した指標値を含む関数指標データ165を生成する。関数指標データ165は、制御情報記憶部143に記憶される。関数指標データ165は、各関数に対応するレコードを含む。1つのレコードは、関数ID、ループ回数、ソースコード行数、中間コード命令数、ユーザ指示フラグ、関数呼び出し数および非パイプライン命令数の項目を有する。
ループ回数の項目は、当該関数に含まれるループの繰り返し回数を示す。当該関数にループがない場合、ループ回数は0になる。繰り返し回数が中間コードから不明な場合(例えば、実行時に動的に決まる場合)、ループ回数を0などの所定値とみなしてもよい。ソースコード行の項目は、当該関数を定義したソースコードの行数を示す。ただし、「行数」としては実質的な命令文のみをカウントし、関数名や括弧やコメントの行は除外する。中間コード命令数の項目は、当該関数を定義した中間コードの命令数を示す。
ユーザ指示フラグは、当該関数に対してインライン展開を指示する指示文が付加されているか否かを示す。インライン展開の指示文は、ユーザによってソースコードに記載されるものである。インライン展開の指示文が付加されている場合、ユーザ指示フラグがTrueになる。関数呼び出し数の項目は、当該関数に含まれる関数呼び出し命令の数を示す。非パイプライン命令数の項目は、当該関数に含まれる命令のうち、パイプライン化されない命令(例えば、SIMD命令など)の数を示す。
図10は、関数呼び出し指標の抽出例を示す図である。
ソースコード24は、ソースファイル121に含まれるソースコードの一例である。ソースコード24は、関数#11(func11と表記)を含む。関数#11は、関数#8(func8と表記)を呼び出す関数呼び出し#Eを含む。関数呼び出し#Eは、ループ回数が100回のループに属している。すなわち、関数#8が100回繰り返し呼び出されることになる。ソースコード24は、中間コード生成部133によって中間コード51に変換される。中間コード51は、中間コード記憶部134に記憶される。
この場合、解析部141は、順方向関数走査において、関数呼び出し#Eに対応するレコード164aを生成して関数呼び出し指標データ164に追加する。レコード164aは、関数呼び出しID「E」を含む。また、関数呼び出し#Eの属するループの繰り返し回数が100であるため、レコード164aはループ回数「100」を含む。ループ回数は、例えば、ループ変数の代入文を検索することで中間コード51から抽出できる。また、関数呼び出し#Eが最内ループに属しているため、レコード164aは最内ループフラグ「True」を含む。また、関数#11にはパイプライン化されない命令が存在しないため、レコード164aは非パイプライン命令数「0」を含む。
図11は、関数指標の抽出例を示す図である。
ソースコード25は、ソースファイル121に含まれるソースコードの一例である。ソースコード25は、関数#8(func8と表記)を含む。関数#8は、関数#4(func4と表記)を呼び出す関数呼び出し#Jと、関数#3(func3と表記)を呼び出す関数呼び出し#Iと、関数#3を呼び出す関数呼び出し#Hとを含む。関数呼び出し#J,#Iは、ループ回数が10回のループに属している。すなわち、関数#3,#4が交互に10回呼び出される。ソースコード25は、中間コード生成部133によって中間コード52に変換される。中間コード51は、中間コード記憶部134に記憶される。
この場合、解析部141は、逆方向関数走査において、関数#8に対応するレコード165aを生成して関数指標データ165に追加する。レコード165aは、関数ID「8」を含む。また、関数#8に10回繰り返されるループが含まれるため、レコード165aはループ回数「10」を含む。ループ回数は、例えば、ループ変数の代入文を検索することで中間コード52から抽出できる。また、ソースコード25がセミコロンで終わる命令文を4個含むため、レコード165aはソースコード行数「4」を含む。また、中間コード2がmove命令2個、callpe命令3個、add命令1個およびbct命令1個含むため、レコード165aは中間コード命令数「7」を含む。
また、ソースコード25にインライン展開の指示文が付加されていないため、レコード165aはユーザ指示フラグ「False」を含む。また、関数#8が3個の関数呼び出し命令(callpe命令)を含むため、レコード165aは関数呼び出し数「3」を含む。また、関数#8にはパイプライン化されない命令が存在しないため、レコード165aは非パイプライン命令数「0」を含む。
図12は、評価基準テーブルの例を示す図である。
評価基準テーブル166は、関数呼び出し指標データ164および関数指標データ165から各関数呼び出しの評価値を算出する算出方法を示す。評価基準テーブル166は、プロセッサのアーキテクチャ毎に予め用意されて制御情報記憶部143に記憶されている。アーキテクチャ毎に用意されるのは、命令キャッシュのサイズや命令長がアーキテクチャによって異なり、実行効率が向上するか否かの基準がアーキテクチャに依存するためである。評価基準テーブル166は、アーキテクチャ名、L1命令キャッシュ、命令長、ループ回数、ソースコード行数、中間コード命令数、最内ループフラグ、ユーザ指示フラグ、関数呼び出し数および非パイプライン命令数の項目を有する。
アーキテクチャ名の項目は、プロセッサのアーキテクチャの名称、すなわち、プロセッサの種類を示す。L1命令キャッシュの項目は、L1命令キャッシュのサイズを示す。命令長の項目は、オブジェクトコードにおける命令1個当たりのサイズを示す。命令によってサイズが異なる場合、命令長の項目は平均サイズを示す。ここで、係数A=L1命令キャッシュ/命令長と定義する。以下では係数Aを用いて、指標値を評価値に換算する。
ループ回数の項目は、関数呼び出し指標データ164および関数指標データ165に含まれるループ回数を評価値に換算する換算方法を示す。一例として、ある関数呼び出しのループ回数と当該関数呼び出しによって呼び出される関数のループ回数の合計をNとすると、当該関数呼び出しの評価値に10×A×Nが加算される。ループ回数が多いほど実行コストが高くインライン展開の効果が大きいため、評価値が高くなる。
ソースコード行数の項目は、関数指標データ165に含まれるソースコード行数を評価値に換算する換算方法を示す。一例として、ある関数呼び出しによって呼び出される関数のソースコード行数をNとすると、当該関数呼び出しの評価値に10×A×Nが加算される。中間コード命令数の項目は、関数指標データ165に含まれる中間コード命令数を評価値に換算する換算方法を示す。一例として、ある関数呼び出しによって呼び出される関数の中間コード命令数をNとすると、当該関数呼び出しの評価値に100×A−Nが加算される。命令数が少ないほど関数呼び出しの相対的なオーバヘッドが大きくなりインライン展開の効果が大きいため、評価値が高くなる。
最内ループフラグの項目は、関数呼び出し指標データ164に含まれる最内ループフラグを評価値に換算する換算方法を示す。一例として、ある関数呼び出しの最内ループフラグがTrueの場合、当該関数呼び出しの評価値にAが加算される。最内ループフラグがFalseの場合、当該関数呼び出しの評価値は増加しない。最内ループは最適化の効果が大きいことが多いため、最内ループに属する関数呼び出しの評価値は高くなる。
ユーザ指示フラグの項目は、関数指標データ165に含まれるユーザ指示フラグを評価値に換算する換算方法を示す。一例として、ある関数呼び出しによって呼び出される関数のユーザ指示フラグがTrueの場合、当該関数呼び出しの評価値に20×Aが加算される。ユーザ指示フラグがFalseの場合、当該関数呼び出しの評価値は増加しない。ユーザからの指定がある場合、インライン展開の効果が大きいことが多いためである。
関数呼び出し数の項目は、関数指標データ165に含まれる関数呼び出し数を評価値に換算する換算方法を示す。一例として、ある関数呼び出しによって呼び出される関数がもつ他の関数呼び出し(子の関数呼び出し)の数をNとすると、当該関数呼び出しの評価値からA×Nが減算される。子の関数呼び出しが多いほどインライン展開を行っても関数呼び出し削減の効果が小さいため、評価値が低くなる。
非パイプライン命令数の項目は、関数呼び出し指標データ164および関数指標データ165に含まれる非パイプライン命令数を評価値に換算する換算方法を示す。一例として、ある関数呼び出しの非パイプライン命令数と当該関数呼び出しによって呼び出される関数の非パイプライン命令数の合計をNとすると、当該関数呼び出しの評価値からA×Nが減算される。非パイプライン命令数が多いほど命令実行の並列化が難しくなり実行効率が低下するおそれがあるため、評価値が低くなる。
図13は、評価値テーブルの例を示す図である。
解析部141は、上記の関数呼び出し指標データ164、関数指標データ165および評価基準テーブル166に基づいて、各関数呼び出しの評価値を算出して評価値テーブル167を生成する。評価値テーブル167は、制御情報記憶部143に記憶される。評価値テーブル167は、関数呼び出しIDおよび評価値の項目を有する。
関数呼び出しIDの項目は、関数呼び出しを識別する。評価値の項目は、当該関数呼び出しについて算出された評価値を示す。解析部141は、関数呼び出し#A〜#Mを評価値の高い順にソートし、評価値の高い方から優先的にインライン展開の候補として選択する。インライン展開しても関数1つ当たりの命令数が閾値を超えない場合、解析部141は、選択した関数呼び出しをインライン展開する。例えば、関数呼び出し#A〜#Mの評価値がそれぞれ、10,30,50,40,100,20,60,70,30,90,30,20,10と算出されたとする。この場合、解析部141は、評価値の最も高い関数呼び出し#Eを最初のインライン展開の候補として選択する。
1つの関数呼び出しがインライン展開されると、関数呼び出しの階層構造が変化する。そこで、解析部141は、関数データ163を更新する。また、1つの関数呼び出しがインライン展開されると、一部の関数の指標値および一部の他の関数呼び出しの指標値が変化する。そこで、解析部141は、関数呼び出し指標データ164および関数指標データ165を更新し、評価値を再算出する。ただし、インライン展開の影響を受ける関数および関数呼び出しの指標値を更新すればよく、全ての関数および関数呼び出しの指標値を更新しなくてよい。また、更新された指標値の影響を受ける関数呼び出しの評価値を再算出すればよく、全ての評価値を再算出しなくてよい。解析部141は、再算出された評価値に基づいて関数呼び出しをソートし、次のインライン展開の候補を選択する。
図14は、関数データの更新例を示す図である。
レコード163aは、関数#11に対応する関数データ163のレコードである。レコード163bは、関数#8に対応する関数データ163のレコードである。関数#11から関数#8を呼び出す関数呼び出し#Eがインライン展開されると、関数#8の命令が関数#11に組み込まれる。関数#8が有する関数呼び出し#H,#I,#Jも関数#11に組み込まれることになる。そこで、解析部141は、関数呼び出し#Eのインライン展開を決定すると、図14に示すようにレコード163aを更新する。
すなわち、レコード163aの関数IDおよびアドレスは維持される。また、関数#11を呼び出す関数呼び出し#Cは変化しないため、レコード163aの呼び出し元の情報は維持される。一方、関数呼び出し#Eはインライン展開によって消滅したため、レコード163aの呼び出し先の情報から関数呼び出し#Eが削除される。また、インライン展開によって関数#11は関数#8の関数呼び出し#H,#I,#Jを引き継いだため、レコード163aの呼び出し先の情報に関数呼び出し#H,#I,#Jが追加される。なお、関数#8の呼び出し元が存在しなくなった場合、レコード163bを削除してもよい。
図15は、評価値の再算出例を示す図である。
ここでは、前述の関数呼び出しグラフ40において、関数呼び出し#Eがインライン展開された場合を考える。関数呼び出し#Eがインライン展開されると、関数#11のコードが変化するため、関数#11の指標値が変化する。そこで、解析部141は、関数指標データ165に含まれる関数#11のレコードを更新する。また、関数#11に組み込まれることで関数呼び出し#H,#I,#Jの周辺コードが変化するため、関数呼び出し#H,#I,#Jの指標値が変化する。また、関数呼び出し#Dの周辺コードが変化するため、関数呼び出し#Dの指標値も変化する。そこで、解析部141は、関数呼び出し指標データ164に含まれる関数呼び出し#D,#H,#I,#Jのレコードを更新する。
関数#11の指標値および関数呼び出し#D,#H,#I,#Jの指標値が変化すると、解析部141は、その影響を受ける評価値を再算出する。すなわち、関数#11の指標値が変化したため、解析部141は、関数#11を呼び出し先とする関数呼び出し#Cの評価値を再算出する。また、関数呼び出し#D,#H,#I,#Jの指標値が変化したため、解析部141は、関数呼び出し#D,#H,#I,#Jの評価値を再算出する。また、関数呼び出し#Eが消滅したため、解析部141はその評価値を消去する。関数呼び出し#A,#B,#F,#G,#K,#L,#Mについては、関数呼び出し#Eのインライン展開の影響を受けないため、評価値を再算出しなくてよい。
その結果、例えば、関数呼び出し#A〜#D,#F〜#Mの評価値がそれぞれ、10,30,20,30,20,60,90,40,50,30,20,10と算出される。解析部141は、関数呼び出し#A〜#D,#F〜#Mを評価値の高い順にソートし、評価値の最も高い関数呼び出し#Hを次のインライン展開の候補として選択する。
次に、コンパイル装置100によるコンパイルの手順について説明する。
図16は、コンパイルの手順例を示すフローチャートである。
(S1)中間コード生成部133は、ソースファイル121からソースコードを呼び出し、ソースコードを解析する。ソースコードの解析には、字句解析、構文解析および意味解析が含まれる。そして、中間コード生成部133は、ソースコードを中間コードに変換し、中間コードを中間コード記憶部134に格納する。
(S2)解析部141は、中間コード記憶部134に記憶された中間コードから関数を抽出し、関数を呼び出し元から呼び出し先に向かって(順方向に)走査する。順方向関数走査において、解析部141は、関数呼び出し毎に当該関数呼び出しについての指標値を抽出する。順方向関数走査の詳細は後述する。
(S3)解析部141は、ステップS2で抽出した関数を呼び出し先から呼び出し元に向かって(ステップS2とは逆方向に)走査する。逆方向関数走査において、解析部141は、関数毎に当該関数についての指標値を抽出する。また、解析部141は、各関数呼び出しについて、当該関数呼び出しの指標値と呼び出し先の関数の指標値から評価値を算出する。逆方向関数走査の詳細は後述する。
(S4)解析部141は、ステップS3で算出した評価値に基づいて、インライン展開する関数呼び出しを決定する。最適化実行部142は、解析部141が決定した関数呼び出しがインライン展開されるように、中間コード記憶部134に記憶された中間コードを更新する。インライン展開の詳細は後述する。
(S5)アセンブリコード生成部135は、中間コード記憶部134に記憶された最適化後の中間コードをアセンブリコードに変換する。
(S6)ファイル出力部136は、アセンブリコード生成部135が生成したアセンブリコードをオブジェクトコードに変換し、オブジェクトファイル122に書き込む。
図17は、順方向関数走査の手順例を示すフローチャートである。
順方向関数走査は、上記のステップS2において実行される。
(S10)解析部141は、中間コードから最初の関数(例えば、メイン関数)を検出し、最初の関数の関数IDをキュー161およびスタック162に挿入する。
(S11)解析部141は、キュー161が空であるか判断する。キュー161が空である場合は順方向関数走査が終了し、空でない場合はステップS12に処理が進む。
(S12)解析部141は、キュー161から関数IDを1つ抽出する。抽出される関数IDは、キュー161に記憶されている関数IDのうち最も早く挿入されたものである。図17において、ここで抽出された関数IDが示す関数を関数F1と表記する。
(S13)解析部141は、関数F1に対応するレコードを生成して関数データ163に追加する。生成したレコードの関数IDは、関数F1に付与した識別情報とする。生成したレコードのアドレスは、中間コードにおける関数F1の先頭アドレスとする。
(S14)解析部141は、中間コードを参照して、関数F1が関数呼び出しを含むか判断する。関数F1が関数呼び出しを含む場合はステップS15に処理が進み、関数F1が関数呼び出しを含まない場合はステップS11に処理が進む。前者の場合、図17において、関数F1に含まれる関数呼び出しを関数呼び出しC1と表記する。なお、関数F1に複数の関数呼び出しが含まれる場合、関数F1に含まれる関数呼び出し毎に以下のステップS15〜S19の処理が実行される。
(S15)解析部141は、ステップS13で生成したレコードに、関数呼び出しC1の情報を呼び出し先として登録する。すなわち、解析部141は、関数呼び出しC1の呼び出し先関数のアドレスと、関数呼び出しC1に付与した識別情報を登録する。
(S16)解析部141は、関数呼び出しC1についての指標値を抽出し、関数呼び出し指標データ164に追加する。関数呼び出し指標抽出の詳細は後述する。
(S17)解析部141は、関数呼び出しC1の呼び出し先関数は検出済であるか、すなわち、呼び出し先関数の関数IDがスタック162に存在するか判断する。検出済である場合はステップ19に処理が進み、未検出である場合はステップS18に処理が進む。図17において、関数呼び出しC1の呼び出し先関数を関数F2と表記する。
(S18)解析部141は、関数F2の関数ID(関数呼び出しグラフ40における子関数の関数ID)をキュー161およびスタック162に挿入する。
(S19)解析部141は、関数F1のアドレスを、関数F2の呼び出し元として保存する。関数F2に対応するレコードが関数データ163に存在する場合、解析部141は、当該レコードに関数F1のアドレスを登録する。関数F2に対応するレコードがまだ関数データ163に存在しない場合、解析部141は、当該レコードが生成されたときにステップS13において関数F1のアドレスが登録されるように、関数F1のアドレスを別途保存しておく。そして、ステップS11に処理が進む。
図18は、関数呼び出し指標抽出の手順例を示すフローチャートである。
関数呼び出し指標抽出は、上記のステップS16において実行される。
(S20)解析部141は、関数呼び出しC1(上記のステップS14で関数F1に含まれていた関数呼び出し)が属するブロックを特定する。ブロックは、ひと纏まりの処理を示す中間コードの単位であり、コンパイル処理の単位である。図18において、ここで特定されたブロックをブロックB1と表記する。
(S21)解析部141は、ブロックB1がループを含むか判断する。ループを含む場合はステップS22に処理が進み、含まない場合はステップS23に処理が進む。
(S22)解析部141は、中間コードからループ回数を抽出する。
(S23)解析部141は、関数呼び出しC1が最内ループの中にあるか判定する。関数呼び出しC1がループに属していない場合はFalseと判定する。関数呼び出しC1が多重ループでないループ(単一のループ)に属している場合はTrueと判定する。ブロックB1が多重ループを含み、関数呼び出しC1がその最内ループの外にある場合はFalseと判定する。ブロックB1が多重ループを含み、関数呼び出しC1がその最内ループの中にある場合はTrueと判定する。
(S24)解析部141は、中間コードにおけるブロックB1の命令を1つ選択する。図18において、ここで選択した命令を命令I1と表記する。
(S25)解析部141は、命令I1がパイプライン化可能であるか判断する。命令I1がパイプライン化可能か否かは、当該命令を実行するプロセッサのアーキテクチャに依存する。パイプライン化可能な命令の例として、算術演算命令、論理演算命令、メモリアクセス命令などが挙げられる。パイプライン化可能でない命令の例として、SIMD命令などの複合命令が挙げられる。命令I1がパイプライン化可能である場合はステップS27に処理が進み、パイプライン化可能でない場合はステップS26に処理が進む。
(S26)解析部141は、非パイプライン命令数を1だけカウントアップする。
(S27)解析部141は、ステップS24においてブロックB1の全ての命令を選択したか判断する。ブロックB1の全ての命令を選択した場合はステップS28に処理が進み、未選択の命令がある場合はステップS24に処理が進む。
(S28)解析部141は、関数呼び出しC1に対応するレコードを生成する。解析部141は、ステップS22で抽出したループ回数と、ステップS23の判定結果を示す最内ループフラグと、ステップS26でカウントした非パイプライン命令数とを、レコードに登録する。解析部141は、関数呼び出し指標データ164にレコードを追加する。
図19は、逆方向関数走査の手順例を示すフローチャートである。
逆方向関数走査は、上記のステップS3において実行される。
(S30)解析部141は、スタック162が空であるか判断する。スタック162が空である場合は逆方向関数走査が終了し、空でない場合はステップS31に処理が進む。
(S31)解析部141は、スタック162から関数IDを1つ抽出する。抽出される関数IDは、スタック162に記憶されている関数IDのうち最後に挿入されたものである。図19において、ここで抽出された関数IDが示す関数を関数F1と表記する。
(S32)解析部141は、関数F1に対応する関数データ163のレコードを参照して、関数F1を呼び出す関数があるか判断する。関数F1を呼び出す関数がある場合はステップS33に処理が進み、ない場合はステップS30に処理が進む。
(S33)解析部141は、関数F1についての指標値を抽出し、関数指標データ165に追加する。関数指標抽出の詳細は後述する。
(S34)解析部141は、関数F1に対応する関数データ163のレコードを参照して、関数F1が関数呼び出しを含むか判断する。関数F1が関数呼び出しを含む場合はステップS35に処理が進み、関数F1が関数呼び出しを含まない場合はステップS30に処理が進む。前者の場合、図19において、関数F1に含まれる関数呼び出しを関数呼び出しC1と表記する。なお、関数F1に複数の関数呼び出しが含まれる場合、関数F1に含まれる関数呼び出し毎に以下のステップS35〜S37の処理が実行される。
(S35)解析部141は、関数呼び出し指標データ164から関数呼び出しC1の指標値を検索する。検索する指標値には、ループ回数、最内ループフラグおよび非パイプライン命令数が含まれる。図19では、検索された指標値を指標値P1と表記する。
(S36)解析部141は、関数呼び出しC1の呼び出し先関数を特定し、関数指標データ165から呼び出し先関数の指標値を検索する。検索する指標値には、ループ回数、ソースコード行数、中間コード命令数、ユーザ指示フラグ、関数呼び出し数および非パイプライン命令数が含まれる。図19では、検索された指標値を指標値P2と表記する。
(S37)解析部141は、検索された指標値P1,P2から関数呼び出しC1の評価値を算出する。すなわち、解析部141は、検索された指標値P1,P2を、評価基準テーブル166に基づいて評価値に換算する。複数の評価基準テーブルが制御情報記憶部143に記憶されている場合、解析部141は、ターゲットのプロセッサのアーキテクチャに対応する評価基準テーブルを選択する。解析部141は、算出した評価値を評価値テーブル167に登録する。そして、ステップS30に処理が進む。
図20は、関数指標抽出の手順例を示すフローチャートである。
関数指標抽出は、上記のステップS33において実行される。
(S40)解析部141は、関数F1(上記のステップS31の関数)のソースコードを検索する。解析部141は、検索したソースコードに含まれる実質的な命令文(セミコロンで終わる行)をカウントすることで、関数F1のソースコード行数を算出する。
(S41)解析部141は、関数F1に対応する関数データ163のレコードを参照して、関数F1の中間コードを検索する。解析部141は、検索した中間コードに含まれる命令をカウントすることで、関数F1の中間コード命令数を算出する。
(S42)解析部141は、関数F1のソースコードにインライン展開指示文(インライン展開を指示する制御用の付加情報)が付加されていたか判定する。
(S43)解析部141は、関数F1がループを含むか判断する。ループを含む場合はステップS44に処理が進み、含まない場合はステップS45に処理が進む。
(S44)解析部141は、中間コードからループ回数を抽出する。
(S45)解析部141は、中間コードにおける関数F1の命令を1つ選択する。図20において、ここで選択した命令を命令I1と表記する。
(S46)解析部141は、命令I1がパイプライン化可能であるか判断する。命令I1がパイプライン化可能である場合はステップS48に処理が進み、パイプライン化可能でない場合はステップS47に処理が進む。
(S47)解析部141は、非パイプライン命令数を1だけカウントアップする。
(S48)解析部141は、命令I1が関数呼び出し命令(図11のcallpe命令に相当)であるか判断する。関数呼び出し命令である場合はステップS49に処理が進み、それ以外の場合はステップS50に処理が進む。
(S49)解析部141は、関数呼び出し数を1だけカウントアップする。
(S50)解析部141は、ステップS45において関数F1の全ての命令を選択したか判断する。関数F1の全ての命令を選択した場合はステップS51に処理が進み、未選択の命令がある場合はステップS45に処理が進む。
(S51)解析部141は、関数F1に対応するレコードを生成する。解析部141は、ステップS44で抽出したループ回数と、ステップS40,S41で算出したソースコード行および中間コード命令数と、ステップS42の判定結果を示すユーザ指示フラグとを、レコードに登録する。また、解析部141は、ステップS40でカウントした関数呼び出し数と、ステップS47でカウントした非パイプライン命令数とを、レコードに登録する。解析部141は、関数指標データ165にレコードを追加する。
図21は、インライン展開の手順例を示すフローチャートである。
インライン展開は、上記のステップS4において実行される。
(S60)解析部141は、算出した評価値を登録した評価値テーブル167に基づいて、関数呼び出しを評価値の高い順にソートする。
(S61)解析部141は、未選択の関数呼び出しの中で最も評価値の高い関数呼び出しを選択する。ただし、既にインライン展開された関数呼び出しは除外される。また、選択済であるという状態は、後述するステップS69においてインライン展開されていない関数呼び出しが再ソートされることで取り消される。図21において、ここで選択された関数呼び出しを関数呼び出しC1、関数呼び出しC1の呼び出し元関数を関数F1、関数呼び出しC1の呼び出し先関数を関数F2と表記する。
(S62)解析部141は、関数F1の命令数と関数F2の命令数の合計が閾値以下であるか判断する。関数F1,F2の命令数は、関数F1,F2に対応する関数指標データ165のレコードを参照することで特定できる。閾値は、例えば、L1命令キャッシュに格納可能な命令数=L1命令キャッシュのサイズ/命令長とする。合計命令数が閾値以下の場合はステップS63に処理が進み、それ以外の場合はステップS70に処理が進む。
(S63)解析部141は、関数呼び出しC1をインライン展開すると決定する。最適化実行部142は、中間コード記憶部134に記憶された中間コードに対して、解析部141が決定した関数呼び出しC1をインライン展開する更新を行う。
(S64)解析部141は、関数F1に対応する関数データ163のレコードを更新する。すなわち、解析部141は、関数F1に対応するレコードから関数呼び出しC1の情報(アドレスおよび関数呼び出しID)を削除する。また、解析部141は、関数F1に対応するレコードに、関数F2が有する関数呼び出しの情報を登録する。
(S65)解析部141は、更新後の関数F1の中間コードに基づいて、関数F1についての指標値を再抽出する。再抽出する指標値には、ループ回数、ソースコード行数、中間コード命令数、ユーザ指示フラグ、関数コール数および非パイプライン命令数が含まれる。解析部141は、関数F1に対応する関数指標データ165のレコードを更新する。
(S66)解析部141は、ステップS64で更新した関数F1に対応する関数データ163のレコードを参照して、関数F1が関数呼び出しを含むか判断する。関数F1が関数呼び出しを含む場合はステップS67に処理が進み、関数F1が関数呼び出しを含まない場合はステップS69に処理が進む。前者の場合、図21において、関数F1に含まれる関数呼び出しを関数呼び出しC2と表記する。なお、関数F1に複数の関数呼び出しが含まれる場合、関数呼び出し毎に以下のステップS67,S68の処理が実行される。
(S67)解析部141は、更新後の関数F1の中間コードに基づいて、関数呼び出しC2についての指標値を抽出する。抽出する指標値には、ループ回数、最内フープフラグおよび非パイプライン命令数が含まれる。解析部141は、関数呼び出しC2に対応する関数呼び出し指標データ164のレコードを更新する。
(S68)解析部141は、関数呼び出し指標データ164から関数呼び出しC2の指標値を検索する。また、解析部141は、関数指標データ165から呼び出し先関数の指標値を検索する。解析部141は、検索された指標値と評価基準テーブル166とに基づいて、関数呼び出しC2の評価値を算出する。解析部141は、評価値テーブル167に含まれる関数呼び出しC2の評価値を更新する。
(S69)解析部141は、関数データ163を参照して、関数F1を呼び出し先とする関数呼び出しを検索する。図21において、ここで検索された関数呼び出しを関数呼び出しC3と表記する。解析部141は、関数呼び出し指標データ164から関数呼び出しC3の指標値を検索する。また、解析部141は、関数指標データ165から関数F1の指標値を検索する。解析部141は、検索された指標値と評価基準テーブル166とに基づいて、関数呼び出しC3の評価値を再算出する。解析部141は、評価値テーブル167に含まれる関数呼び出しC3の評価値を更新する。そして、解析部141は、評価値テーブル167に基づいて、関数呼び出しを評価値の高い順に再ソートする。
(S70)解析部141は、ステップS61において選択可能な全ての関数呼び出しを選択したか判断する。全ての関数呼び出しを選択した場合はインライン展開が終了し、未選択の関数呼び出しがある場合はステップS61に処理が進む。
第2の実施の形態のコンパイル装置100によれば、呼び出し元の関数のコードから、ループ回数、最内ループフラグおよび非パイプライン命令数が抽出される。また、呼び出し先の関数のコードから、ループ回数、ソースコード行、中間コード命令数、ユーザ指示フラグ、関数呼び出し数および非パイプライン命令数が抽出される。そして、これらの指標値に基づいて関数呼び出しの評価値が算出され、評価値の高い関数呼び出しが優先的にインライン展開される。これにより、インライン展開の効果が大きい関数呼び出しから優先的に選択することができ、コードの先頭から順に選択する方法や階層構造の末端から順に選択する方法と比べて、オブジェクトコードの実行効率を向上できる。
また、関数呼び出し毎に評価値を算出すればよいため、全ての関数呼び出しの組み合わせについて網羅的にインライン展開の効果を評価する方法と比べて、コンパイラ最適化の負荷を低減しコンパイル時間を短縮することができる。また、関数のコードの走査は順方向および逆方向に2回だけ行えばよいため、コンパイラ最適化の中でインライン展開を行うことによる負荷の増大を抑制することができる。
なお、前述のように、第1の実施の形態の情報処理は、情報処理装置10にプログラムを実行させることで実現することができる。第2の実施の形態の情報処理は、コンパイル装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムをコピーして(インストールして)実行してもよい。
10 情報処理装置
11 記憶部
12 変換部
13 コード
14a,14b,14c 関数
15a,15b,15c 関数呼び出し
16a,16b 指標値
17 評価値

Claims (6)

  1. 複数の関数とそれぞれが前記複数の関数の何れかを呼び出す複数の関数呼び出しとを含むコードを記憶する記憶部と、
    前記コードに含まれる前記複数の関数それぞれについて、当該関数内のループの繰り返し状況を示す第1の指標値、当該関数のコード量を示す第2の指標値、および、当該関数に含まれる命令のうちパイプライン化されない命令の数を示す第3の指標値を含む複数の指標値を算出し、前記コードに含まれる前記複数の関数呼び出しそれぞれについて、呼び出し先の関数について算出した前記複数の指標値に基づいて評価値を算出し、前記評価値に基づいて前記複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した前記1以上の関数呼び出しをインライン展開する変換部と、
    を有し、
    前記変換部は、前記複数の関数のうちの一の関数に含まれる第1の関数呼び出しをインライン展開すると、前記一の関数について前記複数の指標値を更新し、前記一の関数を呼び出す第2の関数呼び出しについて前記評価値を更新し、更新後の前記評価値に基づいて次にインライン展開する関数呼び出しを選択する情報処理装置。
  2. 前記複数の指標値は、当該関数に対してインライン展開を指示する付加情報が付加されているか否かを示す第4の指標値、および、当該関数に含まれる他の関数呼び出しの数を示す第5の指標値のうちの少なくとも1つを更に含む、
    請求項1記載の情報処理装置。
  3. 前記変換部は更に、前記複数の関数呼び出しそれぞれについて、当該関数呼び出しが属するループの繰り返し状況を示す他の指標値を算出し、
    前記評価値は、呼び出し先の関数について算出した前記複数の指標値に加えて、当該関数呼び出しについて算出した前記他の指標値に基づいて算出される
    請求項1または2記載の情報処理装置。
  4. 複数の関数とそれぞれが前記複数の関数の何れかを呼び出す複数の関数呼び出しとを含むコードを記憶する記憶部と、
    前記コードに含まれる前記複数の関数それぞれについて、当該関数内のループの繰り返し状況を示す第1の指標値および当該関数のコード量を示す第2の指標値を含む複数の指標値を算出し、前記コードに含まれる前記複数の関数呼び出しそれぞれについて、呼び出し先の関数について算出した前記複数の指標値に基づいて評価値を算出し、前記評価値に基づいて前記複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した前記1以上の関数呼び出しをインライン展開する変換部と、
    を有し、
    前記変換部は、前記複数の関数のうちの一の関数に含まれる第1の関数呼び出しをインライン展開すると、前記一の関数について前記複数の指標値を更新し、前記一の関数を呼び出す第2の関数呼び出しについて前記評価値を更新し、更新後の前記評価値に基づいて次にインライン展開する関数呼び出しを選択する情報処理装置。
  5. コンピュータが実行するコンパイル方法であって、
    複数の関数それぞれについて、当該関数内のループの繰り返し状況を示す第1の指標値、当該関数のコード量を示す第2の指標値、および、当該関数に含まれる命令のうちパイプライン化されない命令の数を示す第3の指標値を含む複数の指標値を算出し、
    前記複数の関数の何れかを呼び出す複数の関数呼び出しそれぞれについて、呼び出し先の関数について算出した前記複数の指標値に基づいて評価値を算出し、
    前記評価値に基づいて前記複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した前記1以上の関数呼び出しをインライン展開し、
    前記複数の関数のうちの一の関数に含まれる第1の関数呼び出しをインライン展開すると、前記一の関数について前記複数の指標値を更新し、前記一の関数を呼び出す第2の関数呼び出しについて前記評価値を更新し、更新後の前記評価値に基づいて次にインライン展開する関数呼び出しを選択する、
    コンパイル方法。
  6. コンピュータに、
    複数の関数それぞれについて、当該関数内のループの繰り返し状況を示す第1の指標値、当該関数のコード量を示す第2の指標値、および、当該関数に含まれる命令のうちパイプライン化されない命令の数を示す第3の指標値を含む複数の指標値を算出し、
    前記複数の関数の何れかを呼び出す複数の関数呼び出しそれぞれについて、呼び出し先の関数について算出した前記複数の指標値に基づいて評価値を算出し、
    前記評価値に基づいて前記複数の関数呼び出しの中から1以上の関数呼び出しを選択し、選択した前記1以上の関数呼び出しをインライン展開し、
    前記複数の関数のうちの一の関数に含まれる第1の関数呼び出しをインライン展開すると、前記一の関数について前記複数の指標値を更新し、前記一の関数を呼び出す第2の関数呼び出しについて前記評価値を更新し、更新後の前記評価値に基づいて次にインライン展開する関数呼び出しを選択する、
    処理を実行させるコンパイルプログラム。
JP2015091855A 2015-04-28 2015-04-28 情報処理装置、コンパイル方法およびコンパイルプログラム Expired - Fee Related JP6572610B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015091855A JP6572610B2 (ja) 2015-04-28 2015-04-28 情報処理装置、コンパイル方法およびコンパイルプログラム
US15/070,048 US9760354B2 (en) 2015-04-28 2016-03-15 Information processing apparatus and compiling method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015091855A JP6572610B2 (ja) 2015-04-28 2015-04-28 情報処理装置、コンパイル方法およびコンパイルプログラム

Publications (2)

Publication Number Publication Date
JP2016207161A JP2016207161A (ja) 2016-12-08
JP6572610B2 true JP6572610B2 (ja) 2019-09-11

Family

ID=57204045

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015091855A Expired - Fee Related JP6572610B2 (ja) 2015-04-28 2015-04-28 情報処理装置、コンパイル方法およびコンパイルプログラム

Country Status (2)

Country Link
US (1) US9760354B2 (ja)
JP (1) JP6572610B2 (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102063966B1 (ko) * 2015-10-21 2020-01-09 엘에스산전 주식회사 Plc 명령어 컴파일 최적화 방법
US11977484B2 (en) 2016-07-19 2024-05-07 Sap Se Adapting in-memory database in hybrid memory systems and operating system interface
US10452539B2 (en) 2016-07-19 2019-10-22 Sap Se Simulator for enterprise-scale simulations on hybrid main memory systems
US10387127B2 (en) 2016-07-19 2019-08-20 Sap Se Detecting sequential access data and random access data for placement on hybrid main memory for in-memory databases
US10783146B2 (en) 2016-07-19 2020-09-22 Sap Se Join operations in hybrid main memory systems
US10540098B2 (en) 2016-07-19 2020-01-21 Sap Se Workload-aware page management for in-memory databases in hybrid main memory systems
US10474557B2 (en) 2016-07-19 2019-11-12 Sap Se Source code profiling for line-level latency and energy consumption estimation
US10083183B2 (en) * 2016-07-19 2018-09-25 Sap Se Full system simulator and memory-aware splay tree for in-memory databases in hybrid memory systems
US10437798B2 (en) 2016-07-19 2019-10-08 Sap Se Full system simulator and memory-aware splay tree for in-memory databases in hybrid memory systems
US10698732B2 (en) 2016-07-19 2020-06-30 Sap Se Page ranking in operating system virtual pages in hybrid memory systems
US10261763B2 (en) * 2016-12-13 2019-04-16 Palantir Technologies Inc. Extensible data transformation authoring and validation system
US11010379B2 (en) 2017-08-15 2021-05-18 Sap Se Increasing performance of in-memory databases using re-ordered query execution plans
US10754763B2 (en) * 2018-07-09 2020-08-25 International Business Machines Corporation Bypassing user-selected functions during test case generation
US11327802B2 (en) * 2019-07-31 2022-05-10 Microsoft Technology Licensing, Llc System and method for exporting logical object metadata

Family Cites Families (13)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH04336333A (ja) * 1991-05-13 1992-11-24 Nec Corp 原始プログラムの自動インライン展開方式
JPH05120029A (ja) 1991-10-29 1993-05-18 Hitachi Ltd 最適化方法
JPH06202875A (ja) 1992-12-28 1994-07-22 Nec Corp インライン展開による最適化を行うコンパイラ
US5740443A (en) * 1995-08-14 1998-04-14 International Business Machines Corporation Call-site specific selective automatic inlining
JP3284956B2 (ja) * 1998-01-26 2002-05-27 日本電気株式会社 プログラム変換方法、プログラム変換装置及びプログラム変換プログラムを記憶した記憶媒体
US6367071B1 (en) * 1999-03-02 2002-04-02 Lucent Technologies Inc. Compiler optimization techniques for exploiting a zero overhead loop mechanism
JP3431568B2 (ja) 2000-03-30 2003-07-28 松下電器産業株式会社 プログラム変換装置、プログラム変換方法及びプログラム記録媒体
JP2004102597A (ja) * 2002-09-09 2004-04-02 Fujitsu Ltd コンパイル処理プログラム、コンパイル処理方法、およびコンパイル処理プログラム記録媒体
AU2003903652A0 (en) * 2003-07-16 2003-07-31 Infology Pty Ltd Muvium
US7383529B2 (en) * 2004-02-13 2008-06-03 The Regents Of The University Of California Method and apparatus for designing circuits using high-level synthesis
JP2006065682A (ja) * 2004-08-27 2006-03-09 Fujitsu Ltd コンパイラプログラム、コンパイル方法およびコンパイラ装置
JP5589479B2 (ja) * 2010-03-25 2014-09-17 富士ゼロックス株式会社 データ処理装置
JP6080602B2 (ja) * 2013-02-22 2017-02-15 インターナショナル・ビジネス・マシーンズ・コーポレーションInternational Business Machines Corporation 実フットプリント算出方法、該算出方法を用いたインラインするメソッドの決定方法、装置及びプログラム

Also Published As

Publication number Publication date
JP2016207161A (ja) 2016-12-08
US9760354B2 (en) 2017-09-12
US20160321048A1 (en) 2016-11-03

Similar Documents

Publication Publication Date Title
JP6572610B2 (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
US8291398B2 (en) Compiler for optimizing program
US7856627B2 (en) Method of SIMD-ization through data reshaping, padding, and alignment
EP3572952A1 (en) Unified optimization of iterative analytical query processing
JP3901181B2 (ja) プログラム並列化装置及びその方法並びにプログラム
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
JP6432450B2 (ja) 並列計算装置、コンパイル装置、並列処理方法、コンパイル方法、並列処理プログラムおよびコンパイルプログラム
US9658855B2 (en) Compile method and compiler apparatus
US9823911B2 (en) Method and apparatus for compiling code based on a dependency tree
JP6718119B2 (ja) コンパイルプログラム、コンパイル方法および情報処理装置
US20120079467A1 (en) Program parallelization device and program product
US8468508B2 (en) Parallelization of irregular reductions via parallel building and exploitation of conflict-free units of work at runtime
JP2006018445A (ja) プログラム並列化装置及びその方法並びにプログラム
US20130262842A1 (en) Code generation method and information processing apparatus
JP2015201119A (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP2015094960A (ja) 情報処理装置、コンパイル方法およびコンパイラプログラム
US7530063B2 (en) Method and system for code modification based on cache structure
JP2014112327A (ja) 変換プログラム、変換装置及び変換方法
JP6536266B2 (ja) コンパイル装置、コンパイル方法およびコンパイルプログラム
US20160371066A1 (en) Computer that performs compiling, compiling method and storage medium that stores compiler program
JP4293223B2 (ja) プログラム並列化装置及びその方法並びにプログラム
JP5272346B2 (ja) キャッシュカラーリング方法
Tetzel et al. Graph traversals for regular path queries
JP6442967B2 (ja) 情報処理プログラム、情報処理装置、情報処理方法
JP2023045347A (ja) プログラムおよび情報処理方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20180918

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20181016

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20181114

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20190423

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20190522

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20190522

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20190522

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20190716

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20190729

R150 Certificate of patent or registration of utility model

Ref document number: 6572610

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees