JP2017010123A - コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム - Google Patents

コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム Download PDF

Info

Publication number
JP2017010123A
JP2017010123A JP2015122279A JP2015122279A JP2017010123A JP 2017010123 A JP2017010123 A JP 2017010123A JP 2015122279 A JP2015122279 A JP 2015122279A JP 2015122279 A JP2015122279 A JP 2015122279A JP 2017010123 A JP2017010123 A JP 2017010123A
Authority
JP
Japan
Prior art keywords
information
computer
data
partial
partial object
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
Application number
JP2015122279A
Other languages
English (en)
Inventor
昌浩 荒川
Masahiro Arakawa
昌浩 荒川
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 JP2015122279A priority Critical patent/JP2017010123A/ja
Priority to US15/164,298 priority patent/US20160371066A1/en
Publication of JP2017010123A publication Critical patent/JP2017010123A/ja
Withdrawn legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation

Abstract

【課題】ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させること。【解決手段】計算機101は、部分オブジェクトo2のアクセス回数に、メンバm21、m22のアクセス回数を加算するとともに、部分オブジェクトo3のアクセス回数に、メンバm31、m32のアクセス回数を加算する。次に、計算機101は、加算した加算後の部分オブジェクトo2、o3のアクセス回数に基づいて、ターゲットの記憶領域に配置する際の部分オブジェクトo2、o3の順序を決定する。具体的には、図1の(b)で示すように、計算機101は、アクセス回数が多い順に、部分オブジェクトo3を1番目、部分オブジェクトo2を2番目に決定する。これにより、アクセス回数が多い部分オブジェクトo3がキャッシュメモリに記憶されやすくなるため、オブジェクトo1へのアクセス性能が向上することになる。【選択図】図1

Description

本発明は、コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムに関する。
従来、ソースプログラムをコンパイルして、コンピュータが実行可能なプログラムを生成する技術がある。また、プログラムのアクセス性能を向上させるために、プログラムの一部のデータをキャッシュメモリに記憶させる技術がある。関連する先行技術として、例えば、入力プログラムの解析結果からメモリアクセスする命令を解析し、構造体要素の配列上の配置、アクセス回数、アクセス順序を含むアクセスパターンに基づいて、構造体の要素の配列上の配置を変更するものがある。
特開2010−003031号公報
しかしながら、従来技術によれば、ソースプログラムに規定されたオブジェクトに含まれるいずれかのデータに他のデータが含まれるという入れ子構造があると、ソースプログラムをコンパイルして得られるプログラムのアクセス性能を向上させることが困難である。具体的には、例えば、ソースプログラムから、入れ子構造の外側のデータが表記された回数を入れ子構造の外側のデータのアクセス回数としても、正確なアクセス回数とはならない場合がある。そして、正確でないアクセス回数に従ってデータの配置を変更しても、プログラムのアクセス性能が向上するとは限らない。また、アクセス回数が多いデータの配置を入れ子構造を無視して変更すると、プログラムが正しく動作しない場合がある。
1つの側面では、本発明は、ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させることができるコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムを提供することを目的とする。
本発明の一側面によれば、ソースプログラムに基づき計数したソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、ソースプログラムに基づき計数した各々のデータに含まれるデータへのアクセス回数を加算し、加算した加算後の各々のデータへのアクセス回数に基づいて、ソースプログラムをコンパイルして記憶領域に配置する際の各々のデータの順序を決定するコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムが提案される。
本発明の一態様によれば、ソースプログラムをコンパイルしたプログラムのアクセス性能を向上させることができるという効果を奏する。
図1は、計算機101の動作例を示す説明図である。 図2は、計算機101のハードウェア構成例を示す説明図である。 図3は、計算機101の機能構成例を示す説明図である。 図4は、C++言語で記載されたソースプログラム111の一例を示す説明図である。 図5は、ソースチューニング前における中間言語1情報321の型情報の一例を示す説明図である。 図6は、ソースチューニング前におけるデータ構造の一例を示す説明図である。 図7は、ソースチューニング前における中間言語1情報321の式情報の一例を示す説明図である。 図8は、コンパイル処理手順の一例を示すフローチャートである。 図9は、チューニング情報322の記憶内容の一例を示す説明図である。 図10は、アクセス回数収集処理手順の一例を示すフローチャート(その1)である。 図11は、アクセス回数収集処理手順の一例を示すフローチャート(その2)である。 図12は、アクセス回数収集処理手順の一例を示すフローチャート(その3)である。 図13は、部分オブジェクトアクセス回数更新処理手順の一例を示すフローチャートである。 図14は、メンバ情報配置場所決定処理手順の一例を示すフローチャート(その1)である。 図15は、メンバ情報配置場所決定処理手順の一例を示すフローチャート(その2)である。 図16は、メンバ情報配置場所反映処理手順の一例を示すフローチャート(その1)である。 図17は、メンバ情報配置場所反映処理手順の一例を示すフローチャート(その2)である。 図18は、ソースチューニング後における中間言語1情報323の型情報の一例を示す説明図である。 図19は、ソースチューニング後におけるデータ構造の一例を示す説明図である。 図20は、データ構造の変更結果を示す説明図である。
以下に図面を参照して、開示のコンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラムの実施の形態を詳細に説明する。
図1は、計算機101の動作例を示す説明図である。図1に示す計算機101は、コンパイルを行う計算機である。計算機101は、例えば、自動計算機、すなわちコンピュータである。例えば、計算機101は、利用者が用意したソースプログラムをコンパイルして、実行可能なプログラムを作成する。以下、実行可能なプログラムを、「オブジェクトプログラム」と称する。ここで、作成したオブジェクトプログラムは、計算機101をターゲットとするものでもよいし、他のコンピュータをターゲットとするものでもよい。また、計算機101は、例えば、ハイ・パフォーマンス・コンピューティング(HPC:High Performance Computing)分野で使用されるコンピュータである。
利用者が用意したソースプログラムは、プログラム言語に従って記述される。そして、作成されたオブジェクトプログラムを高性能にするためには、性能を意識したプログラミングが行われていることが要求される。
ここで、性能を向上させる技術としては、例えば、与えられたソースプログラムを、コンパイラの最適化オプションを指定してコンパイルし、性能評価するものがある。また、さらに性能を向上させたい場合には、複数の最適化オプションを組み合わせて指定することによるオプションチューニングを行うことも考えられる。加えて、チューニングツールによりボトルネックである処理を抽出し、ソースプログラムを理解した上で、ソースレベルのチューニング作業を行うことも考えられる。チューニング作業の例としては、ソースプログラム中のループ構造を変更したり、最適化を指示する制御行を挿入したり、アクセス頻度の高い変数に最適化を適用しやすくする属性を記述したりするという作業である。
しかしながら、ソースレベルのチューニング作業はノウハウが要求される場合が多く、一般の利用者には困難な場合がある。また、経験豊かなチューニング担当者であっても、チューニングにかかる時間が多くなる場合がある。
また、プログラム言語の観点からも、チューニングを困難にする要因がある。ここで、コンパイルの工程には、字句解析、構文解析、意味解析を行うフロントエンドと、最適化処理やコード生成を行うバックエンドとがある。フロントエンドは、プログラム言語の仕様に依存する処理であり、ターゲットのアーキテクチャには依存しない。一方、バックエンドは、プログラム言語の仕様には依存せず、ターゲットのアーキテクチャに依存する処理である。
フロントエンドは、元のソースプログラムから、ソースプログラム内の宣言、文、式等の情報が保持された中間言語1情報を生成する。そして、フロントエンドは、中間言語1情報から、アーキテクチャに近い情報に変換された中間言語2情報に変換する。そして、バックエンドは、中間言語2情報に対して最適化を行い、コード生成を行う。従って、元となるソースプログラムの内容によっては、利用者が期待したほどの最適化が行われない場合がある。
最適化の一例として、FortranやC言語といったプログラム言語において、構造体の中のアクセスが多いデータを、データの先頭側に移動することにより、実行時にターゲットのキャッシュメモリに格納しやすくして、アクセス性能の向上を図る技術がある。
しかしながら、ソースプログラムに規定されたオブジェクトに含まれるいずれかのデータに他のデータが含まれるという入れ子構造があると、ソースプログラムをコンパイルして得られるオブジェクトプログラムのアクセス性能を向上させることが困難である。具体的には、例えば、ソースプログラムから、入れ子構造の外側のデータが表記された回数を入れ子構造の外側のデータのアクセス回数としても、入れ子構造の内側のデータが考慮されていないため、正確なアクセス回数とはならない場合がある。そして、正確でないアクセス回数に従ってデータの配置を変更しても、オブジェクトプログラムのアクセス性能が向上するとは限らない。また、アクセス回数が多いデータの配置を入れ子構造を無視して変更すると、オブジェクトプログラムが正しく動作しない場合がある。
特に、C++言語のようなオブジェクト指向言語では、複数の階層のオブジェクトのそれぞれにアクセスする際に、全て同一のアドレスでアクセスする可能性がある。従って、要素別のアクセス頻度を参照するだけでは、アクセス頻度の高いアドレスの正確な検出が困難である。例えば、C++言語において、派生クラスのオブジェクトの先頭アドレスと、派生クラス内の基底クラスのデータの先頭アドレスとは同一となる。ここで、派生クラス内の基底クラスのデータを、部分オブジェクトと称する。
そして、C++言語では、部分オブジェクトの単位で処理する式が記述される場合が多く、さらにC++言語の処理論理上、処理系が部分オブジェクトへのアクセスを内部生成する場合がある。部分オブジェクトのデータ構造は、入れ子構造と同様のデータ構造になるため、基底クラス内のアクセス回数が多いメンバだけをデータ構造変更の対象にすることができない。さらに、バックエンドでは、メンバへのアクセスを、「データの先頭アドレス+メンバのオフセット+メンバのサイズ」で処理する。従って、バックエンドでは、派生クラス内の部分オブジェクトの情報は失われているため、バックエンドでデータ構造変更を行おうとする場合、対象のメンバが含まれる部分オブジェクトを含む派生クラスのアクセス状況をチェックすることができない。
そこで、本実施の形態では、コンパイル時に、オブジェクト内の各データのアクセス回数に、各データに含まれるデータのアクセス回数を加えた各値に基づいて、各データの配置順序を決定する方法について説明する。以下の例では、ソースプログラムがC++言語で記載された例を用いて説明する。C++言語では、オブジェクトの中に、データとしてメンバを有する。また、オブジェクトが派生クラスであれば、オブジェクトの中に、データとして部分オブジェクトを有する。
図1を用いて、計算機101の動作について説明する。図1の(a)に示すソースプログラム111は、オブジェクトo1を規定する。そして、オブジェクトo1は、部分オブジェクトo2、o3を有する。部分オブジェクトo2は、メンバm21、m22を有する。また、部分オブジェクトo3は、メンバm31、m32を有する。そして、オブジェクトo2自身のアクセス回数は、2回である。そして、メンバm21、m22のアクセス回数は、それぞれ、2回、1回である。また、オブジェクトo3自身のアクセス回数は、1回である。そして、メンバm31、m32のアクセス回数は、それぞれ、4回、2回である。ここで、図1の(a)におけるオブジェクトo1〜o3、メンバm21〜m32のそれぞれのアクセス回数は、中間言語1情報に含まれる式情報に表記された回数から計数することにより得られたものである。中間言語1情報に含まれる式情報の具体例については、図7で示す。
計算機101は、部分オブジェクトo2のアクセス回数に、メンバm21、m22のアクセス回数を加算するとともに、部分オブジェクトo3のアクセス回数に、メンバm31、m32のアクセス回数を加算する。図1の(a)の例では、計算機101は、部分オブジェクトo2のアクセス回数である2にメンバm21、m22のアクセス回数2、1を加算し、5を得る。同様に、計算機101は、部分オブジェクトo3のアクセス回数である1にメンバm31、m32のアクセス回数4、2を加算し、7を得る。
次に、計算機101は、加算した加算後の部分オブジェクトo2、o3のアクセス回数に基づいて、ターゲットの記憶領域に配置する際の部分オブジェクトo2、o3の順序を決定する。具体的には、図1の(b)で示すように、計算機101は、アクセス回数が多い順に、部分オブジェクトo3を1番目、部分オブジェクトo2を2番目に決定する。
図1の(c)では、コンパイル後のオブジェクトプログラムを実行した際の例である。図1の(c)におけるハッチを付与した領域は、ターゲットのキャッシュメモリに記憶された領域を示す。このように、アクセス回数が多い部分オブジェクトo3がキャッシュメモリに記憶されるため、オブジェクトo1へのアクセス性能が向上することになる。
なお、本実施の形態では、プログラム言語の例としてC++言語を用いて説明したが、Java(登録商標)等の他のオブジェクト指向言語に対しても適用可能である。次に、計算機101のハードウェア構成について、図2を用いて説明する。
図2は、計算機101のハードウェア構成例を示す説明図である。図2において、計算機101は、CPU201と、ROM(Read−Only Memory)202と、RAM(Random Access Memory)203と、を含む。また、計算機101は、ディスクドライブ204およびディスク205と、通信インターフェース206と、を含む。また、CPU201〜ディスクドライブ204、通信インターフェース206はバス207によってそれぞれ接続される。
CPU201は、計算機101の全体の制御を司る演算処理装置である。また、計算機101は、複数のCPUを有してもよい。ROM202は、ブートプログラムなどのプログラムを記憶する不揮発性メモリである。RAM203は、CPU201のワークエリアとして使用される揮発性メモリである。
ディスクドライブ204は、CPU201の制御に従ってディスク205に対するデータのリードおよびライトを制御する制御装置である。ディスクドライブ204には、例えばディスクドライブ、光ディスクドライブ、ソリッドステートドライブなどを採用することができる。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する不揮発性メモリである。例えばディスクドライブ204が磁気ディスクドライブである場合、ディスク205には、磁気ディスクを採用することができる。また、ディスクドライブ204が光ディスクドライブである場合、ディスク205には、光ディスクを採用することができる。また、ディスクドライブ204がソリッドステートドライブである場合、ディスク205には、半導体素子によって形成された半導体メモリ、いわゆる半導体ディスクを採用することができる。
通信インターフェース206は、ネットワークと内部のインターフェースを司り、他の装置からのデータの入出力を制御する制御装置である。具体的に、通信インターフェース206は、通信回線を通じてネットワークを介して計算機101を利用する利用者端末等の他の装置に接続される。通信インターフェース206には、例えば、モデムやLAN(Local Area Network)アダプタなどを採用することができる。
また、計算機101の管理者が、計算機101を直接操作する場合、計算機101は、ディスプレイ、キーボード、マウスといったハードウェアを有してもよい。
(計算機101の機能構成例)
図3は、計算機101の機能構成例を示す説明図である。計算機101は、制御部を有する。制御部は、意味解析部301と、ソースチューニング部302と、中間言語変換部303と、最適化・コード生成部304とを有する。ここで、意味解析部301〜中間言語変換部303が、図1で説明したフロントエンドに相当する。また、最適化・コード生成部304が、図1で説明したバックエンドに相当する。
ソースチューニング部302は、加算部311と、決定部312と、設定部313とを含む。制御部は、記憶装置に記憶されたプログラムをCPU201が実行することにより、各部の機能を実現する。記憶装置とは、具体的には、例えば、図2に示したROM202、RAM203、ディスク205などである。また、各部の処理結果は、CPU201のレジスタや、CPU201のキャッシュメモリ等に格納される。
意味解析部301は、ソースプログラム111を読み込んで、意味解析を行い、中間言語1情報321を生成する。ソースプログラム111の具体例を、図4で示す。中間言語1情報321には、型情報と式情報とが含まれる。中間言語1情報321の型情報の具体例を、図5で示す。また、中間言語1情報321の式情報の具体例を、図7で示す。
ソースチューニング部302は、チューニング情報322を用いながら中間言語1情報321のソースチューニングを行い、チューニング実施後の中間言語1情報323を生成する。具体的には、ソースチューニング部302は、下記3つのフェーズによりソースチューニングを行う。
1つ目のフェーズは、アクセス回数を収集する処理である。具体的には、ソースチューニング部302は、中間言語1情報321を走査し、メンバおよび単独でアクセスされる部分オブジェクトのアクセス回数を収集する。収集した情報を、型情報の単位でチューニング情報322に記録する。ここで、ソースチューニング部302に含まれる加算部311は、部分オブジェクト自身のアクセス回数に、所有する部分オブジェクトやメンバのアクセス回数を加算する。そして、加算部311は、加算した値を、部分オブジェクトのアクセス回数とする。これにより、アクセス回数が多いメンバが含まれる部分オブジェクトは、並び替え時の移動の優先度が高くなる。チューニング情報322の具体例を、図9で示す。また、アクセス回数を収集する処理のフローチャートを、図10〜図12で示す。
2つ目のフェーズは、メンバや部分オブジェクトの配置場所を決定する処理である。ソースチューニング部302に含まれる決定部312は、チューニング情報322に記録されたメンバおよび部分オブジェクトのアクセス回数に基づいて、メンバおよび部分オブジェクトの順序を決定する。例えば、決定部312は、アクセス回数が多いメンバおよび部分オブジェクトを優先して先頭になるように順序を決定する。また、決定部312は、アクセス回数が少ないメンバおよび部分オブジェクトが末尾になるように順序を決定してもよい。
また、決定部312は、アクセス回数が同一であるメンバおよび部分オブジェクトについて、メンバおよび部分オブジェクトのサイズの小さい順を、メンバおよび部分オブジェクトの順序として決定してもよい。
また、決定部312は、決定したメンバおよび部分オブジェクトの順序と、中間言語1情報321の型情報から得られるメンバおよび部分オブジェクトのサイズとに基づいて、メンバおよび部分オブジェクトのオフセット値を決定する。
例えば、あるオブジェクトに3つの部分オブジェクトがあり、順序が決定したとする。この場合、決定部312は、1番目に決定した部分オブジェクトのオフセット値を0に決定する。また、決定部312は、2番目に決定した部分オブジェクトのオフセット値を、1番目に決定した部分オブジェクトのサイズに決定する。さらに、決定部312は、3番目に決定した部分オブジェクトのオフセット値を、1番目と2番目に決定した部分オブジェクトのサイズの合計に設定する。また、決定部312は、コンパイラオプション等により4バイト境界、8バイト境界等のアライメントが設定されているならば、決定した順序に従い、かつ、アライメントに従ってメンバおよび部分オブジェクトのオフセット値を決定する。
2つ目のフェーズとなる、メンバや部分オブジェクトの配置場所を決定する処理のフローチャートを、図14、図15で示す。
3つ目のフェーズは、決定したオフセット値を反映する処理である。具体的には、ソースチューニング部302は、決定したオフセット値を使用して、中間言語1情報321に対してデータ構造変更を行い、中間言語1情報323を得る。このとき、ソースチューニング部302に含まれる設定部313は、決定したオフセット値を、メンバおよび部分オブジェクトのオフセット値を取得する命令の算出結果に設定する。メンバおよび部分オブジェクトのオフセット値を取得する命令の一例は、図7で示す。
中間言語変換部303は、中間言語1情報323から、中間言語2情報324を生成する。最適化・コード生成部304は、中間言語2情報324からオブジェクトプログラム325を生成する。
図4は、C++言語で記載されたソースプログラム111の一例を示す説明図である。図4に示すソースプログラム111は、クラスC1〜C4と、get_subobj()関数とを定義する。
クラスC1は、メンバ変数mem11とmem12とを有し、メンバ関数add()と、access()と、mem12_ofs()とを有する。クラスC2は、メンバ変数mem21とmem22とを有する。
クラスC3は、クラスC1を基底クラスとした派生クラスである。さらに、クラスC3は、メンバ変数mem31とmem32とを有する。
クラスC4は、クラスC2とクラスC3とを基底クラスとした派生クラスである。さらに、クラスC4は、メンバ変数mem41とmem42とを有する。
get_subobj()関数は、クラスC4のオブジェクトc4objとクラスC1のオブジェクトc1objとをローカル変数として確保し、オブジェクトc4objのメンバ変数mem42に0を代入する。そして、get_subobj()関数は、c4obj内にあるクラスC1の部分オブジェクトを取り出してc1objに代入する。このとき、クラスC1の個々のメンバにはアクセスされず、クラスC1をひとまとめにしたアクセスが行われる。
図5は、ソースチューニング前における中間言語1情報321の型情報の一例を示す説明図である。型情報は、メンバまたは部分オブジェクトを1以上有する。図5では、ソースプログラム111の意味解析によって得られた中間言語1情報321の型情報501〜504を示す。ここで、部分オブジェクトとは、派生クラス内の基底クラスのデータのことである。また、部分オブジェクトの名称を、「subobj_派生クラス_基底クラス」と呼称する。また、派生クラス1からさらに派生した派生クラス2の部分オブジェクトの名称を、「subobj_派生クラス2_派生クラス1_基底クラス」と呼称する。
また、型情報が有するメンバは、メンバの名称と、メンバのオフセット値と、メンバのサイズとを有する。メンバのオフセット値には、メンバが配置される先頭アドレスを、型情報が示すクラスのオブジェクトが配置される先頭アドレスからのオフセット値が格納される。また、メンバのサイズには、メンバのサイズが格納される。
また、型情報が有する部分オブジェクトは、部分オブジェクトの名称と、部分オブジェクトのオフセット値と、部分オブジェクトの型情報と、部分オブジェクトのサイズとを有する。メンバのオフセット値には、部分オブジェクトが配置される先頭アドレスを、型情報が示すクラスのオブジェクトが配置される先頭アドレスからのオフセット値が格納される。部分オブジェクトの型情報には、部分オブジェクトの型情報が格納される。また、部分オブジェクトのサイズには、部分オブジェクトのサイズが格納される。
以下、図示された型情報が有するメンバを、メンバの名称を符号として付与して示す。同様に、図示された型情報が有する部分オブジェクトを、部分オブジェクトの名称を符号として付与して示す。
例えば、型情報501となるクラスC1の型情報は、メンバmem11とメンバmem12とを有する。そして、メンバmem11は、オフセット値が0、すなわち、クラスC1のオブジェクトが配置される先頭アドレスに配置され、サイズが4であることを示す。また、メンバmem12は、オフセット値が4、すなわち、クラスC1のオブジェクトが配置される先頭アドレスに4加えたアドレスに配置され、サイズが4であることを示す。
また、型情報502となるクラスC2の型情報は、メンバmem21とメンバmem22とを有する。
また、型情報503となるクラスC3の型情報は、部分オブジェクトsubobj_C3_C1とメンバmem31とメンバmem32とを有する。そして、例えば、部分オブジェクトsubobj_C3_C1は、オフセット値が0、すなわち、クラスC3のオブジェクトが配置される先頭アドレスに配置され、型情報がC1であり、サイズが8であることを示す。
また、型情報504となるクラスC4の型情報は、部分オブジェクトsubobj_C4_C2と部分オブジェクトsubobj_C4_C3とメンバmem41とメンバmem42とを有する。そして、例えば、部分オブジェクトsubobj_C4_C2は、オフセット値が0、すなわち、クラスC4のオブジェクトが配置される先頭アドレスに配置され、型情報がC2であり、サイズが8であることを示す。また、部分オブジェクトsubobj_C4_C3は、オフセット値が8、すなわち、クラスC4のオブジェクトが配置される先頭アドレスに8加えたアドレスに配置され、型情報がC2であり、サイズが8であることを示す。
図6は、ソースチューニング前におけるデータ構造の一例を示す説明図である。図6では、図5で示したクラスC4の型情報に従った場合における図4で示したget_subobj()関数内のc4objのデータ構造を示す。
c4objのデータ構造は、型情報504となるクラスC4の型情報に従って、部分オブジェクトsubobj_C4_C2、部分オブジェクトsubobj_C4_C3、メンバmem41、メンバmem42の順で記憶領域上に配置される構造となる。
また、部分オブジェクトsubobj_C4_C2のデータ構造は、型情報502となるクラスC2の型情報に従って、メンバmem21、メンバmem22の順で記憶領域上に配置される構造となる。
また、部分オブジェクトsubobj_C4_C3のデータ構造は、型情報503となるクラスC3の型情報に従って、部分オブジェクトsubobj_C4_C3_C1、メンバmem31、メンバmem32の順で記憶領域上に配置される構造となる。さらに、部分オブジェクトsubobj_C4_C3_C1のデータ構造は、型情報501となるクラスC1の型情報に従って、メンバmem11、メンバmem12の順で記憶領域上に配置される構造となる。
図7は、ソースチューニング前における中間言語1情報321の式情報の一例を示す説明図である。図7では、ソースプログラム111の意味解析によって得られた中間言語1情報の式情報701〜706を示す。
例えば、式情報701は、演算子が「+」であり、「+」演算子を実行することによりアクセスされるメンバがメンバmem11とメンバmem12とであることを示す。次に、計算機101が行うコンパイル処理を、図8を用いて説明する。
また、図3で説明した、メンバおよび部分オブジェクトのオフセット値を取得する命令の一例が、式情報705である。式情報705は、メンバmem12のオフセット値を取得する命令である。ソースチューニング前では、メンバmem12のオフセット値は、型情報501が示すように、4となる。
また、式情報706は、ソースプログラム111では「c1obj=c4obj」という単純な代入文であるが、c4obj内の一部分であるC1を有する。従って、計算機101は、中間言語1情報321生成時において、「c1obj=c4obj」の代わりに、「c1obj=c4obj.subobj_C4_C3_C1」という式を自動生成する。
次に、図8〜図15を用いて、計算機101が実行するフローチャートを示す。
図8は、コンパイル処理手順の一例を示すフローチャートである。コンパイル処理は、ソースプログラム111をコンパイルする処理である。計算機101は、ソースプログラムを読み込んで、意味解析を実行する(ステップS801)。次に、計算機101は、解析結果から、中間言語1情報321を生成する(ステップS802)。そして、計算機101は、コンパイル時のチューニングオプションを確認する(ステップS803)。チューニングオプションがありの場合(ステップS803:あり)、計算機101は、アクセス回数収集処理を実行する(ステップS804)。アクセス回数収集処理は、図10〜図12で説明する。
次に、計算機101は、メンバ情報配置場所決定処理を実行する(ステップS805)。メンバ情報配置場所決定処理は、図14で説明する。そして、計算機101は、メンバ情報配置場所反映処理を実行する(ステップS806)。
ステップS806の処理終了後、または、チューニングオプションがなしの場合(ステップS803:なし)、計算機101は、中間言語1情報321、またはチューニング実施後の中間言語1情報323から中間言語2情報324を生成する(ステップS807)。そして、計算機101は、中間言語2情報324からオブジェクトプログラム325を生成する(ステップS808)。ステップS808の処理終了後、計算機101は、コンパイル処理を終了する。コンパイル処理を実行することにより、計算機101は、クラスを使用したプログラムにおいても、データ構造を変更したオブジェクトプログラムを生成することができる。
次に、コンパイル処理により生成したチューニング情報322を、図9を用いて説明する。
図9は、チューニング情報322の記憶内容の一例を示す説明図である。チューニング情報322は、型情報テーブル901と、メンバ情報とを有する。型情報テーブル901は、符号化されたクラスの型情報を記憶するテーブルである。ここで、符号化されたクラスの型情報は、派生クラスから基底クラスへのアクセス状況が判るように符号化された型情報である。
図9に示す型情報テーブル901は、C1、C2、C3、C3::C1、C4、C4::C2、C4::C3、C4::C3::C1という8つの符号化された型情報を有する。そして、各符号化された型情報は、メンバ情報に対応付けられる。以下、符号化された型情報に対応付けられたメンバ情報を、「符号化された型情報_メンバ名」の符号を付与して示す。
符号化された型情報に対応付けられたメンバ情報は、種類と、アクセス回数と、オフセット値という項目を有する。種類項目は、メンバ情報の種類を示す。具体的には、種類項目には、「メンバ」識別子か、「部分オブジェクト」識別子かのいずれかが格納される。アクセス回数は、メンバ情報が示すメンバまたは部分オブジェクトへのアクセス回数を示す。オフセット値は、符号化された型情報のオブジェクトの先頭アドレスからのオフセット値を示す。ここで、図9で示したオフセット値のうち、矢印によって値が更新しているものは、矢印の左の値が、アクセス回数収集処理が終了した時点での値を示す。また、矢印の右の値が、メンバ情報配置場所決定処理が終了した時点での値を示す。また、種類項目が「部分オブジェクト」識別子であるメンバ情報は、さらに、符号化されたクラスの型情報という項目を有する。符号化されたクラスの型情報は、部分オブジェクトの符号化されたクラスの型情報を示す。
例えば、符号化された型情報C1は、メンバ情報C1_mem11と、C1_mem12とを有する。例えば、メンバ情報C1_mem12は、種類がメンバであり、アクセス回数が0回であり、オフセット値が4であることを示す。アクセス回数やオフセット値の具体的な更新例は、アクセス回数収集処理や、メンバ情報配置場所決定処理内の各処理を用いて説明する。
図10は、アクセス回数収集処理手順の一例を示すフローチャート(その1)である。また、図11は、アクセス回数収集処理手順の一例を示すフローチャート(その2)である。また、図12は、アクセス回数収集処理手順の一例を示すフローチャート(その3)である。アクセス回数収集処理は、アクセス回数を計数する処理である。
計算機101は、中間言語1情報321内の型情報を走査する(ステップS1001)。以下、走査する処理について、計算機101は、対象を検出した後、次に走査を開始する際には、対象を検出した個所の次の個所から走査を開始する。
走査した結果、計算機101は、中間言語1情報321内に、型情報があるか否かを判断する(ステップS1002)。型情報がある場合(ステップS1002:Yes)、計算機101は、型情報が有するメンバおよび部分オブジェクトを走査する(ステップS1003)。そして、走査した結果、計算機101は、メンバまたは部分オブジェクトがあるか否かを判断する(ステップS1004)。メンバおよび部分オブジェクトがない場合(ステップS1004:No)、計算機101は、別の型情報を走査すべく、ステップS1001の処理に移行する。
一方、メンバまたは部分オブジェクトがある場合(ステップS1004:Yes)、計算機101は、メンバまたは部分オブジェクトの登録として、符号化されたクラスの型情報をキーにして、クラスが保持するメンバおよび部分オブジェクトをチューニング情報322に登録する(ステップS1005)。このとき、計算機101は、メンバ情報を作成して、型情報テーブル901から指標させる。具体的には、例えば、計算機101は、作成したメンバ情報の先頭アドレスと、符号化されたクラスの型情報とを一つのレコードとして型情報テーブル901に格納する。また、計算機101は、作成したメンバ情報のアクセス回数を0に設定する。また、計算機101は、作成したメンバ情報のオフセット値を、中間言語1情報321の型情報のオフセット値と同一の値に設定する。
次に、計算機101は、部分オブジェクトの登録中か否かを判断する(ステップS1006)。部分オブジェクトの登録中である場合(ステップS1006:Yes)、計算機101は、部分オブジェクトの型情報をキーにして、部分オブジェクトが有するメンバまたは子の部分オブジェクトをチューニング情報322に登録する(ステップS1007)。ここで、チューニング情報322を登録する際には、部分オブジェクトが有するメンバまたは子の部分オブジェクトに対して、ステップS1003の処理、ステップS1005の処理を適用する。また、子の部分オブジェクトがさらに部分オブジェクトを有する場合には、計算機101は、ステップS1003の処理、ステップS1005の処理を再帰的に繰り返す。
ステップS1007、または、部分オブジェクトの登録中でない場合(ステップS1006:No)、計算機101は、ステップS1003の処理に移行する。また、型情報がない場合(ステップS1002:No)、計算機101は、チューニング情報322の全てのメンバ情報を登録し終えたことになる。そして、計算機101は、中間言語1情報321内の式情報を走査する(ステップS1101)。
走査した結果、計算機101は、式情報があるか否かを判断する(ステップS1102)。式情報がある場合(ステップS1102:Yes)、計算機101は、メンバまたは部分オブジェクトのアクセス式が見つかったか否かを判断する(ステップS1103)。ここで、メンバまたは部分オブジェクトのアクセス式を見つける処理として、計算機101は、式情報のメンバまたは部分オブジェクトに、メンバまたは部分オブジェクトの名称が含まれていれば、メンバまたは部分オブジェクトのアクセス式が見つかったとする。
メンバまたは部分オブジェクトのアクセス式が見つかった場合(ステップS1103:Yes)、計算機101は、見つかったメンバまたは部分オブジェクトが含まれる派生クラスの型情報をキーにして、チューニング情報322から対象となるメンバおよび部分オブジェクトを取得する(ステップS1104)。そして、計算機101は、取得したメンバおよび部分オブジェクトのアクセス回数をインクリメントする(ステップS1105)。
具体的には、例えば、ステップS1102において、式情報701があるとする。この場合、式情報701には、メンバとして、mem11とmem12があるため、ステップS1104において、計算機101は、見つかったメンバmem11、mem12が含まれる派生クラスをキーとする。そして、計算機101は、チューニング情報322から、メンバ情報C3::C1_mem11、C3::C1_mem12、メンバ情報C3::C1_mem11、C3::C1_mem12を取得し、それぞれのアクセス回数をインクリメントする。なお、メンバ情報C1_mem11と、C1_mem12とは、基底クラスの型情報のメンバ情報であるため、インクリメントしなくてよい。
ステップS1105の処理終了後、または、メンバおよび部分オブジェクトのアクセス式が見つからなかった場合(ステップS1103:No)、別の式情報を走査すべく、計算機101は、ステップS1101の処理に移行する。
式情報がない場合(ステップS1102:No)、計算機101は、チューニング情報322のメンバ情報における直接のアクセス回数を計数し終えたことになる。ステップS1102:Noとなった段階において、1以上のアクセス回数となっているのは下記のメンバ情報である。メンバ情報と、メンバ情報のアクセス回数とを併せて下記に示す。
メンバ情報C3::C1_mem11 アクセス回数:2
メンバ情報C3::C1_mem12 アクセス回数:4
メンバ情報C4_mem42 アクセス回数:1
メンバ情報C4::C3_subobj_C4_C3_C1 アクセス回数:1
メンバ情報C4::C3::C1_mem11 アクセス回数:2
メンバ情報C4::C3::C1_mem12 アクセス回数:4
なお、メンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数が、図9で示す値と異なるが、これは、この段階では、メンバ情報C4::C3_subobj_C4_C3_C1自身のアクセス回数を示しているためである。以降に示す、部分オブジェクトアクセス回数更新処理を実行することにより、メンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数が図9で示す値となる。
ステップS1102:Noとなった場合、計算機101は、チューニング情報322のメンバ情報を走査する(ステップS1201)。走査した結果、計算機101は、部分オブジェクトのメンバ情報が見つかったか否かを判断する(ステップS1202)。部分オブジェクトのメンバ情報が見つかった場合(ステップS1202:Yes)、計算機101は、見つかった部分オブジェクトを引数として、部分オブジェクトアクセス回数更新処理を実行する(ステップS1203)。部分オブジェクトアクセス回数更新処理については、図13で説明する。
一方、部分オブジェクトのメンバ情報が見つからなかった場合(ステップS1202:No)、計算機101は、アクセス回数収集処理を終了する。アクセス回数収集処理を実行することにより、計算機101は、チューニング情報322の正確なアクセス回数を得ることができる。
図13は、部分オブジェクトアクセス回数更新処理手順の一例を示すフローチャートである。部分オブジェクトアクセス回数更新処理は、部分オブジェクトとなる各メンバ情報へのアクセス回数を更新する処理である。
計算機101は、引数として入力された部分オブジェクトのメンバ情報に登録されている符号化されたクラスの型情報を取得する(ステップS1301)。次に、計算機101は、取得した型情報を型情報テーブル901から探索する(ステップS1302)。そして、計算機101は、探索して見つかった型情報に登録されているメンバ情報を取り出して順番に走査する(ステップS1303)。
走査した結果、計算機101は、部分オブジェクトのメンバ情報が見つかったか否かを判断する(ステップS1304)。部分オブジェクトのメンバ情報が見つかった場合(ステップS1304:Yes)、計算機101は、見つかった部分オブジェクトを引数として、部分オブジェクトアクセス回数更新処理を実行する(ステップS1305)。そして、計算機101は、ステップS1304の処理に移行する。
一方、部分オブジェクトのメンバ情報が見つからなかった場合(ステップS1304:No)、計算機101は、見つかった型情報を再度取り出して順番に走査する(ステップS1306)。そして、計算機101は、部分オブジェクトアクセス回数更新処理で用いるローカル変数である、アクセス回数の合計変数に0を代入する(ステップS1307)。
走査した結果、計算機101は、型情報に、種類がメンバであるメンバ情報があるか否かを判断する(ステップS1308)。種類がメンバであるメンバ情報がある場合(ステップS1308:Yes)、計算機101は、アクセス回数の合計変数に、メンバ情報に登録されているアクセス回数の値を加算する(ステップS1309)。そして、計算機101は、ステップS1308の処理に移行する。
一方、種類がメンバであるメンバ情報がない場合(ステップS1308:No)、計算機101は、引数として入力された部分オブジェクトのメンバ情報のアクセス回数に、アクセス回数の合計変数の値を加算する(ステップS1310)。ステップS1310の処理終了後、計算機101は、部分オブジェクトアクセス回数更新処理を終了する。
ここで、メンバ情報C4_subobj_C4_C3の例を用いて、部分オブジェクトアクセス回数更新処理を説明する。計算機101は、ステップS1202の処理において、メンバ情報C4_subobj_C4_C3が部分オブジェクトのメンバ情報であるため、メンバ情報C4_subobj_C4_C3を引数として部分オブジェクトアクセス回数更新処理を呼び出す。
そして、計算機101は、ステップS1301の処理において、引数として入力されたメンバ情報C4_subobj_C4_C3の符号化されたクラスの型情報C4::C3を取得する。次に、計算機101は、符号化されたクラスの型情報C4::C3からメンバ情報C4::C3_subobj_C3_C1を見つけ、メンバ情報C4::C3_subobj_C4_C3_C1を引数として部分オブジェクトアクセス回数更新処理を再び呼び出す。
計算機101は、ステップS1301の処理において、引数として入力されたメンバ情報C4::C3_subobj_C4_C3_C1の符号化されたクラスの型情報C4::C3::C1を取得する。次に、計算機101は、ステップS1309の処理において、符号化されたクラスの型情報C4::C3::C1のメンバ情報C4::C3::C1_mem11、mem12のアクセス回数の値となる2、4を、それぞれ、アクセス回数の合計変数に加算する。そして、計算機101は、ステップS1310の処理において、引数として入力されたメンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数に、アクセス回数の合計変数の値を加算する。この時点で、メンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数は、1+(2+4)=7となる。
そして、計算機101は、1回目の部分オブジェクトアクセス回数更新処理に戻る。次に、計算機101は、ステップS1310の処理において、メンバ情報C4_subobj_C3_C1のアクセス回数を、メンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数を加えて7にする。
部分オブジェクトアクセス回数更新処理を実行することにより、計算機101は、各メンバ情報自身へのアクセス回数と、各メンバ情報に含まれるメンバ情報へのアクセス回数とを考慮して、各メンバ情報への正確なアクセス回数を得ることができる。
図14は、メンバ情報配置場所決定処理手順の一例を示すフローチャート(その1)である。また、図15は、メンバ情報配置場所決定処理手順の一例を示すフローチャート(その2)である。計算機101は、チューニング情報322を走査する(ステップS1401)。
走査した結果、計算機101は、アクセス回数が1以上の部分オブジェクトがあるか否かを判断する(ステップS1402)。アクセス回数が1以上の部分オブジェクトがある場合(ステップS1402:Yes)、計算機101は、見つかった部分オブジェクトのメンバ情報に設定されている型情報を型情報テーブル901から探索する(ステップS1403)。そして、計算機101は、探索して見つかった型情報に登録されているメンバ情報を、アクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する(ステップS1404)。そして、計算機101は、決定したメンバ情報の順序と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する(ステップS1405)。次に、計算機101は、決定したメンバ情報のオフセット値をチューニング情報のメンバ情報に登録する(ステップS1406)。
ここで、部分オブジェクトが子の部分オブジェクトを有する場合には、計算機101は、子の部分オブジェクトに対して、ステップS1402〜ステップS1406の処理を適用する。
具体的な例を用いて、ステップS1402〜ステップS1406の処理について説明する。計算機101は、チューニング情報322を走査して、ステップS1402の処理において、符号化されたクラスの型情報C4に、アクセス回数が1以上の部分オブジェクトがあるか否かを判断する。この場合、条件を満たすメンバ情報C4_subobj_C4_C3があるため、計算機101は、ステップS1403の処理において、見つかった部分オブジェクトのメンバ情報に設定されている型情報C4::C3を型情報テーブル901から探索する。
そして、計算機101は、ステップS1404の処理において、メンバ情報C4::C3_subobj_C4_C3_C1、mem31、mem32をアクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する。この場合、メンバ情報C4::C3_subobj_C4_C3_C1のアクセス回数が最も多いため、計算機101は、メンバ情報C4::C3_subobj_C4_C3_C1を1番目に決定する。メンバ情報C4::C3_mem31、mem32については、アクセス回数もサイズも同一であるから、計算機101は、そのままの順序として、メンバ情報C4::C3_mem31を2番目、メンバ情報C4::C3_mem32を3番目に決定する。
そして、計算機101は、ステップS1405の処理において、決定したメンバ情報の順序となるメンバ情報C4::C3_subobj_C4_C3_C1、mem31、mem32と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する。この場合、結果的に順序は代わっていないため、メンバ情報のオフセット値もそのままとなる。
また、メンバ情報C4_subobj_C4_C3は、メンバ情報C4::C3_subobj_C4_C3_C1を有する。従って、計算機101は、メンバ情報C4::C3_subobj_C4_C3_C1に対して、ステップS1402〜ステップS1406の処理を適用する。計算機101は、ステップS1404の処理において、符号化されたクラスの型情報C4_C3_C1が有するメンバ情報C4_C3_C1_mem11、mem12をアクセス回数が多い順、サイズが小さい順になるように各メンバ情報の順序を決定する。この場合、メンバ情報C4_C3_C1_mem12がアクセス回数が最も高いため、計算機101は、メンバ情報C4_C3_C1_mem12を1番目、メンバ情報C4_C3_C1_mem11を2番目に決定する。
そして、計算機101は、ステップS1405の処理において、決定したメンバ情報の順序となるメンバ情報C4_C3_C1_mem12、mem11と、メンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する。この場合、計算機101は、1番目に決定したメンバ情報C4_C3_C1_mem12のオフセット値を0に決定する。さらに、計算機101は、2番目に決定したメンバ情報C4_C3_C1_mem11のオフセット値を、メンバ情報C4_C3_C1_mem11のサイズ=4に決定する。
アクセス回数が1以上の部分オブジェクトがない場合(ステップS1402:No)、計算機101は、オフセット値が決まっていないアクセス回数1以上のメンバおよび部分オブジェクトを収集し、最外の派生クラスとなる型情報を型情報テーブル901から探索する(ステップS1501)。
次に、計算機101は、最外の派生クラスとなる型情報から、収集したメンバおよび部分オブジェクトを要素とする単方向のリストを生成する(ステップS1502)。
次に、計算機101は、リストの各要素を、アクセス回数が多い順、サイズが小さい順になるように並び替える(ステップS1503)。そして、計算機101は、並び替えたリストの各要素の順序と、各要素に対応するメンバ情報のサイズとに基づいて、メンバ情報のオフセット値を決定する(ステップS1504)。次に、計算機101は、決定したメンバ情報のオフセット値をチューニング情報322のメンバ情報に登録する(ステップS1505)。ステップS1505の処理終了後、計算機101は、メンバ情報配置場所決定処理を終了する。
具体的な例を用いて、ステップS1501〜ステップS1504の処理について説明する。ステップS1402:Noの時点で、オフセット値が決まっていないアクセス回数1以上のメンバおよび部分オブジェクトは、メンバ情報C4_subobj_C4_C3、mem42である。計算機101は、ステップS1501の処理において、メンバ情報C4_subobj_C4_C3、mem42の最外の派生クラスとなる型情報C4を型情報テーブル901から探索する。
そして、計算機101は、ステップS1502の処理において、型情報C4から、メンバ情報C4_subobj_C4_C3、C4_mem42を要素とする単方向のリストを生成する。生成したリストの先頭の要素は、メンバ情報C4_subobj_C4_C3を示すアドレスと、次の要素を示すアドレスを有する。生成したリストの2番目の要素は、メンバ情報C4_mem42を有する。
次に、計算機101は、ステップS1503の処理において、生成したリストを、アクセス回数が多い順、サイズが小さい順になるように並び替える(ステップS1503)。この例では、メンバ情報C4_subobj_C4_C3のアクセス回数が最も多いので、計算機101は、順序を変えずこのままとする。
そして、計算機101は、ステップS1504の処理において、リストの1番目の要素に対応するメンバ情報C4_subobj_C4_C3のオフセット値を0に決定する。また、計算機101は、リストの1番目の要素に対応するメンバ情報C4_mem42のオフセット値を、メンバ情報C4_subobj_C4_C3のサイズである16に決定する。
図16は、メンバ情報配置場所反映処理手順の一例を示すフローチャート(その1)である。図17は、メンバ情報配置場所反映処理手順の一例を示すフローチャート(その2)である。メンバ情報配置場所反映処理は、決定したオフセット値をチューニング実施後の中間言語1情報323へ反映する処理である。ここで、メンバ情報配置場所反映処理は、中間言語1情報321を更新することにより、チューニング実施後の中間言語1情報323を生成する。
計算機101は、中間言語1情報321内の型情報を走査する(ステップS1601)。走査した結果、計算機101は、型情報があるか否かを判断する(ステップS1602)。型情報がある場合(ステップS1602:Yes)、計算機101は、チューニング情報322から、中間言語1情報321内の型情報に対応する型情報を抽出する(ステップS1603)。そして、計算機101は、抽出した型情報に対応するリストを生成したか否かを判断する(ステップS1604)。
抽出した型情報に対応するリストを生成した場合(ステップS1604:Yes)、計算機101は、中間言語1情報321から、リストに登録されているメンバ情報に対応するメンバおよび部分オブジェクトを探索する(ステップS1605)。そして、計算機101は、探索して見つかったメンバおよび部分オブジェクトのオフセット値を、リストで決定したオフセット値に設定する(ステップS1606)。次に、計算機101は、探索して見つかったメンバおよび部分オブジェクトをオフセット値順に並び替えて、中間言語1情報321の型情報に設定する(ステップS1607)。ここで、計算機101は、中間言語1情報321の型情報に元々設定されていたメンバおよび部分オブジェクトを、並び替えたメンバおよび部分オブジェクトに継続するように登録し、オフセット値を更新する。また、中間言語1情報321において、計算機101は、並び替えたメンバおよび部分オブジェクトが元々存在していた個所を取り除く。ステップS1607の処理終了後、計算機101は、ステップS1601の処理に移行する。
具体的な例を用いて、ステップS1607の処理について説明する。計算機101は、中間言語1情報321内の型情報504となるクラスC4の型情報について設定し、リストで決定したように、部分オブジェクトsubobj_C4_C3のオフセット値を0、メンバmem42のオフセット値を16に設定する。そして、計算機101は、メンバmem42に継続するように、部分オブジェクトsubobj_C4_C2のオフセット値を20に設定し、メンバmem41のオフセット値を28に設定する。
一方、抽出した型情報に対応するリストを生成していない場合(ステップS1604:No)、計算機101は、チューニング情報322の型情報からメンバおよび部分オブジェクトを取得し、登録されているオフセット値を中間言語1情報321の型情報に設定する(ステップS1608)。次に、計算機101は、中間言語1情報の型情報が有するメンバおよび部分オブジェクトを、設定されたオフセット値順に並び替える(ステップS1609)。ステップS1609の処理終了後、計算機101は、ステップS1601の処理に移行する。
走査した結果、型情報がない場合(ステップS1602:No)、計算機101は、中間言語1情報内の式情報を走査する(ステップS1701)。走査した結果、計算機101は、式情報があるか否かを判断する(ステップS1702)。式情報がある場合(ステップS1702:Yes)、計算機101は、メンバまたは部分オブジェクトのアクセス式が見つかったか否かを判断する(ステップS1703)。メンバまたは部分オブジェクトのアクセス式が見つかった場合(ステップS1703:Yes)、計算機101は、決定したメンバまたは部分オブジェクトのオフセット値を、メンバまたは部分オブジェクトのオフセット値を取得する命令の算出結果に設定する(ステップS1704)。ここで、メンバまたは部分オブジェクトのオフセット値を取得する命令を既に計算済であれば、計算機101は、再計算を行うことになる。
具体的な例を用いて、ステップS1703、ステップS1704の処理について説明する。計算機101は、ステップS1703において、メンバまたは部分オブジェクトのアクセス式として、式情報705を見つける。そして、計算機101は、ステップS1704において、メンバmem12のオフセット値を取得する命令の算出結果を0に設定する。
ステップS1704の処理終了後、または、メンバまたは部分オブジェクトのアクセス式が見つからなかった場合(ステップS1703:No)、計算機101は、ステップS1701の処理に移行する。一方、式情報がない場合(ステップS1702:No)、計算機101は、メンバ情報配置場所反映処理を終了する。メンバ情報配置場所反映処理を実行することにより、計算機101は、チューニング情報322の内容を反映した中間言語1情報321を生成することができる。
次に、ソースチューニングを行ったソースチューニング後における中間言語1情報323の型情報、データ構造について、図18、図19を用いて説明する。
図18は、ソースチューニング後における中間言語1情報323の型情報の一例を示す説明図である。図18では、ソースチューニングが行われた中間言語1情報323の型情報1801〜1804を示す。図18において、ハッチを付与した領域は、図5に示す型情報501〜504から変更した箇所を示す。
具体的には、型情報1801となるクラスC1の型情報は、型情報501となるクラスC1の型情報から、メンバmem11、mem12の順序が変更されており、かつ、メンバmem11、mem12のオフセット値が変更されている。型情報1802となるクラスC2の型情報は、型情報502となるクラスC2の型情報と同一である。また、型情報1803となるクラスC3の型情報は、型情報503となるクラスC3の型情報と同一である。
型情報1804となるクラスC4の型情報は、型情報504となるクラスC4の型情報から、部分オブジェクトsubobj_C4_C3、メンバmem42、部分オブジェクトsubobj_C4_C2、メンバmem41の順に順序が変更されている。さらに、型情報1804となるクラスC4の型情報は、部分オブジェクトsubobj_C4_C3、メンバmem42、部分オブジェクトsubobj_C4_C2、メンバmem41のオフセット値が変更されている。
図19は、ソースチューニング後におけるデータ構造の一例を示す説明図である。図19では、図18で示したクラスC4の型情報に従った場合における図4で示したget_subobj()関数内のc4objのデータ構造を示す。
c4objのデータ構造は、型情報1804となるクラスC4の型情報に従って、部分オブジェクトsubobj_C4_C3、メンバmem42、部分オブジェクトsubobj_C4_C2、メンバmem41の順で記憶領域上に配置される構造となる。
また、部分オブジェクトsubobj_C4_C3のデータ構造は、型情報1803となるクラスC3の型情報に従って、部分オブジェクトsubobj_C4_C3_C1、メンバmem31、メンバmem32の順で記憶領域上に配置される構造となる。さらに、部分オブジェクトsubobj_C4_C3_C1のデータ構造は、型情報1801となるクラスC1の型情報に従って、メンバmem12、メンバmem11の順で記憶領域上に配置される構造となる。
また、部分オブジェクトsubobj_C4_C2のデータ構造は、型情報1802となるクラスC2の型情報に従って、メンバmem21、メンバmem22の順で記憶領域上に配置される構造となる。次に、ソースチューニング前後のデータ構造について、図20を用いて説明する。
図20は、データ構造の変更結果を示す説明図である。図20では、図20の(a)では図6で示したc4objのデータ構造を示し、図20の(b)では図19で示したc4objのデータ構造を示す。ここで、図20において、二重線の枠は、部分オブジェクトを示す。
図20の(a)、(b)で示すように、計算機101は、左斜線のハッチを付与したクラスC1の部分オブジェクトだけでなく、クラスC1の部分オブジェクトをメンバとして有するクラスC3の部分オブジェクト単位で再配置する。また、アクセスがないクラスC2の部分オブジェクトについて、計算機101は、クラスC3の部分オブジェクトとクラスC2の部分オブジェクトの順番を入れ替える。入れ替えた結果、クラスC2の部分オブジェクトは、クラスC4のオブジェクトの中で下位側に移動することになる。
図20で示すように、計算機101は、アクセス回数が多いC1をキャッシュメモリに記憶させやすくすることができる。さらに、計算機101は、クラスC1の部分オブジェクトをメンバとして有するクラスC3の部分オブジェクト単位で移動することにより、クラスC3の部分オブジェクトを一括して処理する式にも対応することができる。
以上説明したように、計算機101は、コンパイル時に、オブジェクト内の部分オブジェクトのアクセス回数に、部分オブジェクト内のメンバまたは部分オブジェクトのアクセス回数を加えた各値に基づいて、各メンバおよび部分オブジェクトの配置順序を決定する。これにより、計算機101は、入れ子構造を考慮したアクセス回数を基に配置でき、オブジェクトプログラムのアクセス性能を向上させることができる。また、計算機101は、入れ子構造を考慮して配置を変更するため、入れ子構造の外側となる部分オブジェクトを一括して処理する式があっても、正しく動作させることができる。
また、計算機101は、決定した各メンバおよび部分オブジェクトの配置順序と、各メンバおよび部分オブジェクトのサイズに基づいて、各メンバおよび部分オブジェクトのオフセット値を決定してもよい。これにより、計算機101は、ターゲットの記憶領域における各メンバおよび部分オブジェクトの配置場所を得ることができる。
また、計算機101は、決定したメンバおよび部分オブジェクトのオフセット値を、ソースプログラム111に含まれるメンバおよび部分オブジェクトのオフセット値を取得する命令の算出結果に設定してもよい。これにより、生成されたオブジェクトプログラム325は、メンバおよび部分オブジェクトを並び替えた後でも、メンバおよび部分オブジェクトのオフセット値を取得する命令を正しく動作することができる。
また、計算機101は、アクセス回数が同一であるメンバまたは部分オブジェクトについて、メンバおよび部分オブジェクトのサイズの小さい順を、メンバまたは部分オブジェクトの順序に決定してもよい。これにより、サイズの小さいメンバまたは部分オブジェクトが優先してターゲットのキャッシュメモリに記憶されるようになる。従って、サイズの大きいメンバまたは部分オブジェクトが優先してターゲットのキャッシュメモリに記憶される場合に比べて、より多くのメンバまたは部分オブジェクトがキャッシュメモリに記憶されるようになり、アクセス性能を向上させることができる。
また、本実施の形態は、プログラム言語がC言語であっても適用可能である。この場合には、オブジェクトを構造体とし、ある構造体に含まれる別の構造体自身へのアクセス回数に、別の構造体に含まれるデータへのアクセス回数を加算し、加算した値に基づいて、ある構造体に含まれる要素の順序を決定すればよい。
なお、本実施の形態で説明したコンパイラ方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本コンパイラプログラムは、ハードディスク、フレキシブルディスク、CD−ROM(Compact Disc−Read Only Memory)、DVD(Digital Versatile Disk)等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本コンパイラプログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形に関し、さらに以下の付記を開示する。
(付記1)ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
制御部を有することを特徴とするコンパイルを行う計算機。
(付記2)前記制御部は、
決定した前記各々のデータの順序と前記各々のデータのサイズとに基づいて、前記記憶領域に配置する際の前記オブジェクトの先頭アドレスからの前記各々のデータのオフセット値を決定することを特徴とする付記1に記載のコンパイルを行う計算機。
(付記3)前記制御部は、
決定した前記各々のデータのオフセット値を、前記ソースプログラムに含まれる前記各々のデータのオフセット値を取得する命令の算出結果に設定することを特徴とする付記2に記載のコンパイルを行う計算機。
(付記4)前記制御部は、
アクセス回数が同一である前記各々のデータについて、前記各々のデータのサイズの小さい順を、前記記憶領域に配置する際の前記各々のデータの順序として決定することを特徴とする付記1〜3のいずれか一つに記載のコンパイルを行う計算機。
(付記5)コンピュータが、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行することを特徴とするコンパイラ方法。
(付記6)コンピュータに、
ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
処理を実行させることを特徴とするコンパイラプログラム。
101 計算機
111 ソースプログラム
301 意味解析部
302 ソースチューニング部
303 中間言語変換部
304 最適化・コード生成部
311 加算部
312 決定部
313 設定部
321、323 中間言語1情報
322 チューニング情報
324 中間言語2情報
325 オブジェクトプログラム

Claims (5)

  1. ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
    加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
    制御部を有することを特徴とするコンパイルを行う計算機。
  2. 前記制御部は、
    決定した前記各々のデータの順序と前記各々のデータのサイズとに基づいて、前記記憶領域に配置する際の前記オブジェクトの先頭アドレスからの前記各々のデータのオフセット値を決定することを特徴とする請求項1に記載のコンパイルを行う計算機。
  3. 前記制御部は、
    決定した前記各々のデータのオフセット値を、前記ソースプログラムに含まれる前記各々のデータのオフセット値を取得する命令の算出結果に設定することを特徴とする請求項2に記載のコンパイルを行う計算機。
  4. コンピュータが、
    ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
    加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
    処理を実行することを特徴とするコンパイラ方法。
  5. コンピュータに、
    ソースプログラムに基づき計数した前記ソースプログラムで規定されたオブジェクトに含まれる複数のデータの各々のデータへのアクセス回数に、前記ソースプログラムに基づき計数した前記各々のデータに含まれるデータへのアクセス回数を加算し、
    加算した加算後の前記各々のデータへのアクセス回数に基づいて、前記ソースプログラムをコンパイルして記憶領域に配置する際の前記各々のデータの順序を決定する、
    処理を実行させることを特徴とするコンパイラプログラム。
JP2015122279A 2015-06-17 2015-06-17 コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム Withdrawn JP2017010123A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2015122279A JP2017010123A (ja) 2015-06-17 2015-06-17 コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム
US15/164,298 US20160371066A1 (en) 2015-06-17 2016-05-25 Computer that performs compiling, compiling method and storage medium that stores compiler program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2015122279A JP2017010123A (ja) 2015-06-17 2015-06-17 コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム

Publications (1)

Publication Number Publication Date
JP2017010123A true JP2017010123A (ja) 2017-01-12

Family

ID=57588120

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015122279A Withdrawn JP2017010123A (ja) 2015-06-17 2015-06-17 コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム

Country Status (2)

Country Link
US (1) US20160371066A1 (ja)
JP (1) JP2017010123A (ja)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115543350A (zh) * 2021-06-30 2022-12-30 华为技术有限公司 一种编译优化方法和装置
US11860780B2 (en) 2022-01-28 2024-01-02 Pure Storage, Inc. Storage cache management

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10124325A (ja) * 1996-10-25 1998-05-15 Toshiba Corp 変数の最適配置方法、変数の最適配置装置及び変数の最適配置プログラムを格納したコンピュータ読み取り可能な記録媒体
US8122442B2 (en) * 2008-01-31 2012-02-21 Oracle America, Inc. Method and system for array optimization
JP5583514B2 (ja) * 2010-08-11 2014-09-03 インターナショナル・ビジネス・マシーンズ・コーポレーション バイナリコードを最適化するコンパイル方法、及びそのコンパイラシステム、並びにコンピュータ・プログラム

Also Published As

Publication number Publication date
US20160371066A1 (en) 2016-12-22

Similar Documents

Publication Publication Date Title
CN106471476B (zh) 用于对经优化代码的编辑并继续以及增强的经优化调试的技术
JP6572610B2 (ja) 情報処理装置、コンパイル方法およびコンパイルプログラム
US10157055B2 (en) Code refactoring mechanism for asynchronous code optimization using topological sorting
US20130139137A1 (en) Systems and Methods for Customizing Optimization/Transformation/ Processing Strategies
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
US20170017475A1 (en) Information processing apparatus and compile method
US20190188049A1 (en) Apparatus and method to select services for executing a user program based on a code pattern included therein
JP6253521B2 (ja) プログラム可視化装置、プログラム可視化方法、及びプログラム可視化プログラム
US20160357529A1 (en) Parallel computing apparatus and parallel processing method
CN109313547A (zh) 用于cpu利用率和代码重构的查询优化器
US20160124795A1 (en) Evaluation method and apparatus
JP2018510445A (ja) プログラム性能を向上させる領域特化システムおよび方法
JPWO2013105158A1 (ja) データ依存解析支援装置、データ依存解析支援プログラム、及びデータ依存解析支援方法
JP6651977B2 (ja) 情報処理装置、コンパイル方法、およびコンパイルプログラム
JP2017010123A (ja) コンパイルを行う計算機、コンパイラ方法、およびコンパイラプログラム
JP5656602B2 (ja) ポインタを解析する方法、並びにそのコンピュータ及びコンピュータ・プログラム
US20160350090A1 (en) Information processing apparatus, method of compiling, and storage medium
JP2017204080A (ja) 情報処理装置、コンパイル方法及びコンパイラプログラム
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
CN108369499B (zh) 一种代码虚拟化系统和方法
JP2014099108A (ja) 実行時間算出装置、実行時間算出方法、およびプログラム
JP2019179383A (ja) Api処理方法、端末、api処理プログラム
JP4299228B2 (ja) ライブラリ変換プログラム
WO2023037506A1 (ja) システム構成導出装置、システム構成導出方法、及びコンピュータ可読媒体
US10929589B1 (en) Generating routing structure for clock network based on edge intersection detection

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20180306

A761 Written withdrawal of application

Free format text: JAPANESE INTERMEDIATE CODE: A761

Effective date: 20181115

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20181121