JPH10320212A - キャッシュ向け最適化方法 - Google Patents
キャッシュ向け最適化方法Info
- Publication number
- JPH10320212A JPH10320212A JP9130670A JP13067097A JPH10320212A JP H10320212 A JPH10320212 A JP H10320212A JP 9130670 A JP9130670 A JP 9130670A JP 13067097 A JP13067097 A JP 13067097A JP H10320212 A JPH10320212 A JP H10320212A
- Authority
- JP
- Japan
- Prior art keywords
- cache
- compilation
- optimization
- program
- stage
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Landscapes
- Devices For Executing Special Programs (AREA)
- Memory System Of A Hierarchy Structure (AREA)
Abstract
(57)【要約】
【課題】正確なキャッシュミス率予測に基づくキャッシ
ュ向け最適化を行う。 【解決手段】ステップ202で、本コンパイルが第1段
階のコンパイルであるかを調べる。第1段階のコンパイ
ルである場合はステップ203に進み、キャッシュシミ
ュレーションコード埋め込み処理を行う。第1段階のコ
ンパイルでない場合は、ステップ204に進み、キャッ
シュ向け最適化処理を行う。コード生成処理203で
は、中間コード307を入力とし、機械語またはアセン
ブリ言語で記述されたオブジェクトプログラム309ま
たは313を生成する。(第1段階のコンパイルではキ
ャッシュシミュレーション用オブジェクトプログラム3
09を、第2段階のコンパイルでは最終的なオブジェク
トプログラム313を生成する。)
ュ向け最適化を行う。 【解決手段】ステップ202で、本コンパイルが第1段
階のコンパイルであるかを調べる。第1段階のコンパイ
ルである場合はステップ203に進み、キャッシュシミ
ュレーションコード埋め込み処理を行う。第1段階のコ
ンパイルでない場合は、ステップ204に進み、キャッ
シュ向け最適化処理を行う。コード生成処理203で
は、中間コード307を入力とし、機械語またはアセン
ブリ言語で記述されたオブジェクトプログラム309ま
たは313を生成する。(第1段階のコンパイルではキ
ャッシュシミュレーション用オブジェクトプログラム3
09を、第2段階のコンパイルでは最終的なオブジェク
トプログラム313を生成する。)
Description
【0001】
【発明の属する技術分野】計算機の利用技術において、
オブジェクトプログラムの実行時間を削減する、コンパ
イル方法に関する。特に、キャッシュミスに起因する性
能の低下を削減するための、コンパイラによる最適化方
法に関する。
オブジェクトプログラムの実行時間を削減する、コンパ
イル方法に関する。特に、キャッシュミスに起因する性
能の低下を削減するための、コンパイラによる最適化方
法に関する。
【0002】
【従来の技術】コンパイラの生成するオブジェクトプロ
グラムの実行時間を削減するための方法は、これまで数
多く開発されている。その中の1つに、コンパイラによ
るキャッシュ向けの最適化がある。
グラムの実行時間を削減するための方法は、これまで数
多く開発されている。その中の1つに、コンパイラによ
るキャッシュ向けの最適化がある。
【0003】キャッシュ向け最適化方法の1つとして、
ソフトウェアプリフェッチ最適化がある。ソフトウェア
プリフェッチ最適化は、データを主記憶装置(メモリ)
からキャッシュに移動する命令(プリフェッチ命令)
を、コンパイラがオブジェクトプログラムに挿入するこ
とにより、キャッシュミス時に発生する待ち時間(キャ
ッシュミスペナルティ)を削減(隠蔽)する最適化方法
である。ソフトウェアプリフェッチ最適化の方法につい
ては例えば「Bernstein他:Compiler Techniquesfor Da
ta Prefetching on the PowerPC, PACT '95, 1995, pp.
19-26」に記載がある。
ソフトウェアプリフェッチ最適化がある。ソフトウェア
プリフェッチ最適化は、データを主記憶装置(メモリ)
からキャッシュに移動する命令(プリフェッチ命令)
を、コンパイラがオブジェクトプログラムに挿入するこ
とにより、キャッシュミス時に発生する待ち時間(キャ
ッシュミスペナルティ)を削減(隠蔽)する最適化方法
である。ソフトウェアプリフェッチ最適化の方法につい
ては例えば「Bernstein他:Compiler Techniquesfor Da
ta Prefetching on the PowerPC, PACT '95, 1995, pp.
19-26」に記載がある。
【0004】ソフトウェアプリフェッチ最適化では、コ
ンパイラが、キャッシュミスを起こす可能性の高いデー
タのアクセス(ロードまたはストア)に対して、そのア
クセスの前にプリフェッチ命令を発行するようなコード
を生成する。すなわち、プリフェッチ命令でデータをメ
モリからキャッシュに移動し、実際のアクセス命令では
キャッシュミスを起こらないようにしておく。(プリフ
ェッチ命令とロードまたはストア命令の間には別の無関
係の命令を挿入することにより、待ち時間を隠蔽す
る。)つまり、1回のデータアクセスに対し、プリフェ
ッチ命令とアクセス命令の2つの命令を実行する必要が
ある。したがって、キャッシュミスを起こさないデータ
のアクセスに対してソフトウェアプリフェッチを行う
と、プリフェッチ命令の発行が無駄(オーバーヘッド)
になり、その分性能が低下してしまうという問題点があ
った。
ンパイラが、キャッシュミスを起こす可能性の高いデー
タのアクセス(ロードまたはストア)に対して、そのア
クセスの前にプリフェッチ命令を発行するようなコード
を生成する。すなわち、プリフェッチ命令でデータをメ
モリからキャッシュに移動し、実際のアクセス命令では
キャッシュミスを起こらないようにしておく。(プリフ
ェッチ命令とロードまたはストア命令の間には別の無関
係の命令を挿入することにより、待ち時間を隠蔽す
る。)つまり、1回のデータアクセスに対し、プリフェ
ッチ命令とアクセス命令の2つの命令を実行する必要が
ある。したがって、キャッシュミスを起こさないデータ
のアクセスに対してソフトウェアプリフェッチを行う
と、プリフェッチ命令の発行が無駄(オーバーヘッド)
になり、その分性能が低下してしまうという問題点があ
った。
【0005】この問題点を解決するため、従来のコンパ
イラでは、ソースプログラムを解析して、キャッシュミ
スを起こす可能性の高いデータのアクセスについてのみ
キャッシュ向け最適化(例えばソフトウェアプリフェッ
チ)を行うようにしている。キャッシュミスを起こす可
能性を静的に解析する方法として、「Wolf他:A DataLo
cality Optimizing Algorithm, ACM SIGPLAN '91, 199
1, pp.30-40」がある(リユース解析と呼ばれる)。こ
の方法では、プログラム中のループネスト(ループの入
れ子)の中に出現する配列参照コードの添字部分を調べ
ることにより、そのデータが再利用されるかどうか、ま
た再利用されるまでの時間的インターバルを解析する。
あるデータが比較的短いインターバルの間に再利用され
ることがわかれば、そのデータはキャッシュ上に残って
いると推定される。
イラでは、ソースプログラムを解析して、キャッシュミ
スを起こす可能性の高いデータのアクセスについてのみ
キャッシュ向け最適化(例えばソフトウェアプリフェッ
チ)を行うようにしている。キャッシュミスを起こす可
能性を静的に解析する方法として、「Wolf他:A DataLo
cality Optimizing Algorithm, ACM SIGPLAN '91, 199
1, pp.30-40」がある(リユース解析と呼ばれる)。こ
の方法では、プログラム中のループネスト(ループの入
れ子)の中に出現する配列参照コードの添字部分を調べ
ることにより、そのデータが再利用されるかどうか、ま
た再利用されるまでの時間的インターバルを解析する。
あるデータが比較的短いインターバルの間に再利用され
ることがわかれば、そのデータはキャッシュ上に残って
いると推定される。
【0006】
【発明が解決しようとする課題】上記従来技術(リユー
ス解析方法)を用いたキャッシュ向け最適化方法では、
キャッシュミス予測にどうしても間違いが生じるという
問題があった。たとえば従来方法では、キャッシュミス
を予測する際には、プログラム中の配列のサイズやルー
プの繰り返し回数などを手がかりして解析を進めること
が多いが、これらの値は実行時に決まる(静的な解析で
は求められない)ことが多いため、結果としてキャッシ
ュミス予測がはずれてしまうことが多い。
ス解析方法)を用いたキャッシュ向け最適化方法では、
キャッシュミス予測にどうしても間違いが生じるという
問題があった。たとえば従来方法では、キャッシュミス
を予測する際には、プログラム中の配列のサイズやルー
プの繰り返し回数などを手がかりして解析を進めること
が多いが、これらの値は実行時に決まる(静的な解析で
は求められない)ことが多いため、結果としてキャッシ
ュミス予測がはずれてしまうことが多い。
【0007】このようなプログラムの例を図4に示す。
図4はFortran言語で書かれたプログラムであり、FU
NCというサブルーチンを定義している。パラメタ宣言
部401から、FUNCはA,B,C,N,Mという4
つのパラメタ(引数)を入力とすることが示され、変数
宣言部402〜403から、A,B,Cは配列であり、
M,Nが整数であることが示される。また2次元配列A
のサイズは第1次元が1からN、第2次元が1からM、
1次元配列B,Cのサイズは1からNである。このよう
にプログラムで使われる配列のサイズは入力パラメタ
M,Nによって決まるので、コンパイラ側では判断でき
ない。また、プログラム実行部403〜407は2重ル
ープになっており、ループの範囲はJが1からM,Iが
1からNと、やはり入力パラメタM,Nによって決ま
る。このようなプログラムにおけるキャッシュミス率を
推測する場合、ループの範囲および配列のサイズが重要
な手がかりとなるので、これらが静的にわからないと予
測は不確かなものになってしまう。
図4はFortran言語で書かれたプログラムであり、FU
NCというサブルーチンを定義している。パラメタ宣言
部401から、FUNCはA,B,C,N,Mという4
つのパラメタ(引数)を入力とすることが示され、変数
宣言部402〜403から、A,B,Cは配列であり、
M,Nが整数であることが示される。また2次元配列A
のサイズは第1次元が1からN、第2次元が1からM、
1次元配列B,Cのサイズは1からNである。このよう
にプログラムで使われる配列のサイズは入力パラメタ
M,Nによって決まるので、コンパイラ側では判断でき
ない。また、プログラム実行部403〜407は2重ル
ープになっており、ループの範囲はJが1からM,Iが
1からNと、やはり入力パラメタM,Nによって決ま
る。このようなプログラムにおけるキャッシュミス率を
推測する場合、ループの範囲および配列のサイズが重要
な手がかりとなるので、これらが静的にわからないと予
測は不確かなものになってしまう。
【0008】また、従来の方法では競合性のキャッシュ
ミスを予測することが困難であるという問題点もあっ
た。競合性のキャッシュミスとは、ダイレクトマップ方
式またはセット連想方式のキャッシュで生じるキャッシ
ュミスであって、キャッシュの容量が十分大きいにもか
かわらず、2つ以上のデータのキャッシュアドレス(キ
ャッシュに格納するアドレス)が偶然一致してしまうた
めに生じるものである。このようなキャッシュミスはプ
ログラムの静的な解析では予測することが困難である。
ミスを予測することが困難であるという問題点もあっ
た。競合性のキャッシュミスとは、ダイレクトマップ方
式またはセット連想方式のキャッシュで生じるキャッシ
ュミスであって、キャッシュの容量が十分大きいにもか
かわらず、2つ以上のデータのキャッシュアドレス(キ
ャッシュに格納するアドレス)が偶然一致してしまうた
めに生じるものである。このようなキャッシュミスはプ
ログラムの静的な解析では予測することが困難である。
【0009】このようにプログラムの静的解析に基づい
てキャッシュミスを予測した場合は、その予測が外れや
すいので、本当にキャッシュ向け最適化が必要なところ
に最適化が適用されない、または必要のない(すなわち
キャッシュミス率が低い)部分に無駄な最適化を行わ
れ、それがオーバーヘッドになるという問題点があっ
た。
てキャッシュミスを予測した場合は、その予測が外れや
すいので、本当にキャッシュ向け最適化が必要なところ
に最適化が適用されない、または必要のない(すなわち
キャッシュミス率が低い)部分に無駄な最適化を行わ
れ、それがオーバーヘッドになるという問題点があっ
た。
【0010】本発明の目的は、プログラム中の各データ
アクセスに対するキャッシュミス率をより正確に求め、
それを利用してコンパイラによる無駄のない効率的キャ
ッシュ向け最適化を行う方法を与えることである。
アクセスに対するキャッシュミス率をより正確に求め、
それを利用してコンパイラによる無駄のない効率的キャ
ッシュ向け最適化を行う方法を与えることである。
【0011】
【課題を解決するための手段】前記目的は、次のように
フィードバックを用いる2段階からなるコンパイル方法
によって解決される。
フィードバックを用いる2段階からなるコンパイル方法
によって解決される。
【0012】第1段階のコンパイルでは、ソースプログ
ラム中の各メモリ参照コードに対して、そのメモリ参照
におけるキャッシュの動作をシミュレートするコードを
挿入し、オブジェクトプログラムを生成する。次に第1
段階のコンパイルで生成されたオブジェクトプログラム
を実行することにより、各メモリ参照のキャッシュミス
率を記録したデータ(キャッシュミス率記録ファイル)
を作成する。次に第2段階のコンパイルでは、前記キャ
ッシュミス率記録ファイルと元のソースプログラムを入
力として最終的なオブジェクトプログラムを生成する。
第2段階のコンパイルでは各メモリ参照でのキャッシュ
ミス率がわかるので、ソフトウェアプリフェッチ等のキ
ャッシュ向け最適化を適用するメモリ参照を適切に選択
することができ、効果的な最適化が行える。
ラム中の各メモリ参照コードに対して、そのメモリ参照
におけるキャッシュの動作をシミュレートするコードを
挿入し、オブジェクトプログラムを生成する。次に第1
段階のコンパイルで生成されたオブジェクトプログラム
を実行することにより、各メモリ参照のキャッシュミス
率を記録したデータ(キャッシュミス率記録ファイル)
を作成する。次に第2段階のコンパイルでは、前記キャ
ッシュミス率記録ファイルと元のソースプログラムを入
力として最終的なオブジェクトプログラムを生成する。
第2段階のコンパイルでは各メモリ参照でのキャッシュ
ミス率がわかるので、ソフトウェアプリフェッチ等のキ
ャッシュ向け最適化を適用するメモリ参照を適切に選択
することができ、効果的な最適化が行える。
【0013】またキャッシュシミュレーションでは、静
的解析では予測不能な競合性のキャッシュミスも正しく
シミュレートできるので、競合性キャッシュミスに対す
るキャッシュ向け最適化ももれなく適用可能となる。
的解析では予測不能な競合性のキャッシュミスも正しく
シミュレートできるので、競合性キャッシュミスに対す
るキャッシュ向け最適化ももれなく適用可能となる。
【0014】このため、コンパイラは現在のコンパイル
が第1段階のコンパイルであるかどうかを調べ、第1段
階のコンパイルである場合はキャッシュシミュレーショ
ンコード埋め込み処理を行い、そうでない場合は、キャ
ッシュ向け最適化処理を行うようし、キャッシュ向け最
適化処理では、キャッシュミス率データを利用してキャ
ッシュ向け最適化を適用する部分を選択する。
が第1段階のコンパイルであるかどうかを調べ、第1段
階のコンパイルである場合はキャッシュシミュレーショ
ンコード埋め込み処理を行い、そうでない場合は、キャ
ッシュ向け最適化処理を行うようし、キャッシュ向け最
適化処理では、キャッシュミス率データを利用してキャ
ッシュ向け最適化を適用する部分を選択する。
【0015】
【発明の実施の形態】以下、本発明の一実施例を説明す
る。
る。
【0016】図3は、本発明に係る計算機システムの構
成図である。図示するように、計算機システムはCPU
301、主記憶装置302、外部記憶装置303、ディ
スプレイ装置304、キーボード305より構成されて
いる。外部記憶装置303にはソースプログラム30
8、キャッシュシミュレーション用オブジェクトプログ
ラム309、キャッシュシミュレーション用ライブラリ
310、キャッシュシミュレーション用ロードモジュー
ル311、オブジェクトプログラム312、キャッシュ
ミス率記録ファイル313が格納される。主記憶装置3
02には、コンパイラ306と、コンパイル処理過程で
必要となる中間コード307が保持される。コンパイル
処理はCPU301がコンパイラプログラム306を実
行することにより行われる。キーボード305はユーザ
からのコマンドをコンパイラ311に与えるのに用い
る。ディスプレイ装置304はコンパイルの終了または
エラーをユーザに知らせる。
成図である。図示するように、計算機システムはCPU
301、主記憶装置302、外部記憶装置303、ディ
スプレイ装置304、キーボード305より構成されて
いる。外部記憶装置303にはソースプログラム30
8、キャッシュシミュレーション用オブジェクトプログ
ラム309、キャッシュシミュレーション用ライブラリ
310、キャッシュシミュレーション用ロードモジュー
ル311、オブジェクトプログラム312、キャッシュ
ミス率記録ファイル313が格納される。主記憶装置3
02には、コンパイラ306と、コンパイル処理過程で
必要となる中間コード307が保持される。コンパイル
処理はCPU301がコンパイラプログラム306を実
行することにより行われる。キーボード305はユーザ
からのコマンドをコンパイラ311に与えるのに用い
る。ディスプレイ装置304はコンパイルの終了または
エラーをユーザに知らせる。
【0017】図1は、本実施例に係るコンパイラにおい
て、ユーザによるコンパイル処理の手順を示したもので
ある。コンパイル処理は、第1段階のコンパイル10
1、リンク102、実行103、第2段階のコンパイル
104の4つの手順からなる。第1段階のコンパイル1
01により、ソースプログラム306に対して、そのプ
ログラムの実行時のキャッシュの動作をシミュレートす
るコードを埋め込んだオブジェクトプログラム(キャッ
シュシミュレーション用オブジェクトプログラム)30
7を作成する。次にリンク102で、キャッシュシミュ
レーション用オブジェクトプログラム307とキャッシ
ュシミュレーション用ライブラリ309をリンクするこ
とにより、キャッシュシミュレーション用ロードモジュ
ール310を作成する。リンク処理は公知の技術である
ので、ここでは詳しく説明しない。次に実行103で、
キャッシュシミュレーション用ロードモジュール310
を実行することにより、キャッシュミス率記録ファイル
313を作成する。最後に第2段階のコンパイル104
で、キャッシュミス率記録ファイル313を用いて、ソ
ースプログラム306に対してキャッシュ向け最適化を
行ったオブジェクトプログラム312を作成する。第1
段階および第2段階のコンパイルにおけるコンパイラ処
理の流れは図2を用いて説明する。
て、ユーザによるコンパイル処理の手順を示したもので
ある。コンパイル処理は、第1段階のコンパイル10
1、リンク102、実行103、第2段階のコンパイル
104の4つの手順からなる。第1段階のコンパイル1
01により、ソースプログラム306に対して、そのプ
ログラムの実行時のキャッシュの動作をシミュレートす
るコードを埋め込んだオブジェクトプログラム(キャッ
シュシミュレーション用オブジェクトプログラム)30
7を作成する。次にリンク102で、キャッシュシミュ
レーション用オブジェクトプログラム307とキャッシ
ュシミュレーション用ライブラリ309をリンクするこ
とにより、キャッシュシミュレーション用ロードモジュ
ール310を作成する。リンク処理は公知の技術である
ので、ここでは詳しく説明しない。次に実行103で、
キャッシュシミュレーション用ロードモジュール310
を実行することにより、キャッシュミス率記録ファイル
313を作成する。最後に第2段階のコンパイル104
で、キャッシュミス率記録ファイル313を用いて、ソ
ースプログラム306に対してキャッシュ向け最適化を
行ったオブジェクトプログラム312を作成する。第1
段階および第2段階のコンパイルにおけるコンパイラ処
理の流れは図2を用いて説明する。
【0018】図2は、コンパイル処理の流れを示したフ
ローチャートである。コンパイラの処理は、まずステッ
プ201で、構文解析201を行う。構文解析はソース
プログラム306を読み出し、コンパイラ内部で処理可
能な中間コード307を作成する。構文解析処理につい
ては、たとえば「エイホ、セシィ、ウルマン著:コンパ
イラI(サイエンス社、1990年)30頁〜74頁」
に記載されているので、ここでは詳しく説明しない。次
にステップ202で、本コンパイルが第1段階のコンパ
イルであるかを調べる。コンパイルが第1段階であるか
どうかはユーザからのコンパイルコマンドにより判定す
る。第1段階のコンパイルである場合はステップ203
に進み、キャッシュシミュレーションコード埋め込み処
理を行う。この処理では、この処理については図6のフ
ローチャートを用いて後で詳しく説明する。第1段階の
コンパイルでない場合は、ステップ204に進み、キャ
ッシュ向け最適化処理を行う。キャッシュ向け最適化処
理については図10を用いて後ほど説明する。コード生
成処理203では、中間コード307を入力とし、機械
語またはアセンブリ言語で記述されたオブジェクトプロ
グラム309または313を生成する。(第1段階のコ
ンパイルではキャッシュシミュレーション用オブジェク
トプログラム309を、第2段階のコンパイルでは最終
的なオブジェクトプログラム313を生成する。)コー
ド生成については、同様に「エイホ、セシィ、ウルマン
著:コンパイラII(サイエンス社、1990年)624
頁〜707頁」に記載があるので、ここでは詳しく説明
しない。
ローチャートである。コンパイラの処理は、まずステッ
プ201で、構文解析201を行う。構文解析はソース
プログラム306を読み出し、コンパイラ内部で処理可
能な中間コード307を作成する。構文解析処理につい
ては、たとえば「エイホ、セシィ、ウルマン著:コンパ
イラI(サイエンス社、1990年)30頁〜74頁」
に記載されているので、ここでは詳しく説明しない。次
にステップ202で、本コンパイルが第1段階のコンパ
イルであるかを調べる。コンパイルが第1段階であるか
どうかはユーザからのコンパイルコマンドにより判定す
る。第1段階のコンパイルである場合はステップ203
に進み、キャッシュシミュレーションコード埋め込み処
理を行う。この処理では、この処理については図6のフ
ローチャートを用いて後で詳しく説明する。第1段階の
コンパイルでない場合は、ステップ204に進み、キャ
ッシュ向け最適化処理を行う。キャッシュ向け最適化処
理については図10を用いて後ほど説明する。コード生
成処理203では、中間コード307を入力とし、機械
語またはアセンブリ言語で記述されたオブジェクトプロ
グラム309または313を生成する。(第1段階のコ
ンパイルではキャッシュシミュレーション用オブジェク
トプログラム309を、第2段階のコンパイルでは最終
的なオブジェクトプログラム313を生成する。)コー
ド生成については、同様に「エイホ、セシィ、ウルマン
著:コンパイラII(サイエンス社、1990年)624
頁〜707頁」に記載があるので、ここでは詳しく説明
しない。
【0019】図5は本実施例におけるコンパイラの中間
コードの例である。中間コードは構文解析201の処理
により作成される。図5の中間コードは図4のソースプ
ログラムに対応している。図5の中間コードは、基本ブ
ロック(Basic Block,BBと略される)を
エッジで結んだグラフで表現されている。(このような
グラフは制御フローグラフと呼ばれている。)501か
ら507は基本ブロックである。これらの基本ブロック
には、BB1からBB7までの番号がそれぞれ付けられ
ている。基本ブロックは途中で分岐や飛び込みのない、
一連のコード列を表している。エッジ(矢印)は基本ブ
ロック間の遷移を表している。たとえば基本ブロック5
01から502にエッジが張られているので、501が
終った後で、502へ制御が移ることを示している。基
本ブロックの解析方法や制御フローグラフの構成方法に
ついては前著(コンパイラII)642頁〜648頁に記
載されているので、ここでは詳しく述べない。各基本ブ
ロック中に書かれているものは実行文であり、その基本
ブロックに制御が移ったときに実行される。ただし、実
行文の中には、ソースプログラム中に陽に表れていない
ものもある。例えばBB5(505)中の最後の文「I
=I+1」はソースプログラム中にはないが、コンパイ
ラがソースプログラムの意味を表すために加えたもので
ある。基本ブロック中の各実行文には、コンパイラによ
って一意的な番号(実行文番号)が付けられている。こ
れを各実行文の左側の[]の中に示している。なお、ここ
では1つの文にはメモリ参照は1つしか現われないよう
にしているので、実行文番号によって対応するメモリ参
照が一意に決まる。
コードの例である。中間コードは構文解析201の処理
により作成される。図5の中間コードは図4のソースプ
ログラムに対応している。図5の中間コードは、基本ブ
ロック(Basic Block,BBと略される)を
エッジで結んだグラフで表現されている。(このような
グラフは制御フローグラフと呼ばれている。)501か
ら507は基本ブロックである。これらの基本ブロック
には、BB1からBB7までの番号がそれぞれ付けられ
ている。基本ブロックは途中で分岐や飛び込みのない、
一連のコード列を表している。エッジ(矢印)は基本ブ
ロック間の遷移を表している。たとえば基本ブロック5
01から502にエッジが張られているので、501が
終った後で、502へ制御が移ることを示している。基
本ブロックの解析方法や制御フローグラフの構成方法に
ついては前著(コンパイラII)642頁〜648頁に記
載されているので、ここでは詳しく述べない。各基本ブ
ロック中に書かれているものは実行文であり、その基本
ブロックに制御が移ったときに実行される。ただし、実
行文の中には、ソースプログラム中に陽に表れていない
ものもある。例えばBB5(505)中の最後の文「I
=I+1」はソースプログラム中にはないが、コンパイ
ラがソースプログラムの意味を表すために加えたもので
ある。基本ブロック中の各実行文には、コンパイラによ
って一意的な番号(実行文番号)が付けられている。こ
れを各実行文の左側の[]の中に示している。なお、ここ
では1つの文にはメモリ参照は1つしか現われないよう
にしているので、実行文番号によって対応するメモリ参
照が一意に決まる。
【0020】図6はシミュレーションコード挿入処理2
02の流れを示したフローチャートである。まずステッ
プ601で、中間コード中の未処理の実行文を取り出
す。未処理の実行文がなければステップ604へ進む。
ステップ602で、取り出した実行文がメモリ参照文で
あるかを調べる。メモリ参照文はたとえば配列要素参照
を含むような文である。メモリ参照文であれば、ステッ
プ603で、 sim(メモリアドレス、実行文番号) という関数呼び出し文を作成し、現在処理中の実行文の
直前に挿入する。ここで「メモリアドレス」は、参照し
ようとするメモリのアドレスを表す式である。関数si
m()はキャッシュの動作をシミュレートするためにコン
パイラが用意するライブラリ関数である。その動作につ
いては図8を用いて後ほど説明する。最後にステップ6
04で、プログラムの先頭にキャッシュシミュレーショ
ン初期化関数を、プログラムの最後にキャッシュシミュ
レーション結果出力関数を挿入する。これらの関数、お
よび関数sim()はいずれもキャッシュシミュレーション
用ライブラリ307に含まれる。
02の流れを示したフローチャートである。まずステッ
プ601で、中間コード中の未処理の実行文を取り出
す。未処理の実行文がなければステップ604へ進む。
ステップ602で、取り出した実行文がメモリ参照文で
あるかを調べる。メモリ参照文はたとえば配列要素参照
を含むような文である。メモリ参照文であれば、ステッ
プ603で、 sim(メモリアドレス、実行文番号) という関数呼び出し文を作成し、現在処理中の実行文の
直前に挿入する。ここで「メモリアドレス」は、参照し
ようとするメモリのアドレスを表す式である。関数si
m()はキャッシュの動作をシミュレートするためにコン
パイラが用意するライブラリ関数である。その動作につ
いては図8を用いて後ほど説明する。最後にステップ6
04で、プログラムの先頭にキャッシュシミュレーショ
ン初期化関数を、プログラムの最後にキャッシュシミュ
レーション結果出力関数を挿入する。これらの関数、お
よび関数sim()はいずれもキャッシュシミュレーション
用ライブラリ307に含まれる。
【0021】図7はシミュレーションコード挿入処理後
の中間コードを示した図である。図7では実行文番号
4,5,7にそれぞれ「B(I)」「C(I)」「A(I,J)」とい
うメモリ参照があるので、これらの文の直前にシミュレ
ーションコードが挿入されている。たとえば実行文4の
前には「sim(&B(I),4)」という文が挿入されている。こ
こで「&B(I)」というのは、配列要素B(I)のアドレスを
表す式である。同様に実行文5の前には「sim(&C(I),
5)」という文が、実行文7の前には「sim(&A(I,J),7)」
という文が挿入されている。
の中間コードを示した図である。図7では実行文番号
4,5,7にそれぞれ「B(I)」「C(I)」「A(I,J)」とい
うメモリ参照があるので、これらの文の直前にシミュレ
ーションコードが挿入されている。たとえば実行文4の
前には「sim(&B(I),4)」という文が挿入されている。こ
こで「&B(I)」というのは、配列要素B(I)のアドレスを
表す式である。同様に実行文5の前には「sim(&C(I),
5)」という文が、実行文7の前には「sim(&A(I,J),7)」
という文が挿入されている。
【0022】図8は関数sim()の動作を摸式的に示した
図である。以降この関数を便宜的にキャッシュシミュレ
ータと呼ぶことにする。キャッシュシミュレータはキャ
ッシュシミュレーション用ロードモジュール311を実
行するときに動作する。キャッシュシミュレータ801
は、大きく分けて制御部802、キャッシュテーブル8
03、キャッシュミス率記録テーブル804からなる。
またキャッシュシミュレータへの入力となるのはメモリ
アドレス805と実行文番号806である。(これは関
数simの2つの引数に対応する。)キャッシュモデルテ
ーブル803は実際のキャッシュをソフトウェア的にシ
ミュレートしたものである。制御部802は与えられた
メモリアドレスを基に、そのアドレスがキャッシュ上に
存在するか(キャッシュヒットしているか)をキャッシ
ュモデルテーブルを使って調べ、もしミスしていれば必
要に応じてキャッシュモデルテーブルの内容を変更する
とともに、その結果をキャッシュミス率記録テーブル8
04に登録する。登録するときには実行文番号を用い、
その実行文番号に対応するエントリに記録していく。な
お、キャッシュモデルテーブルおよびキャッシュミス率
記録テーブルはキャッシュシミュレーション初期化関数
の実行時(プログラムの最初)初期化される。また、キ
ャッシュミス率記録テーブルの内容はキャッシュシミュ
レーション結果出力関数の実行時(プログラムの最後)
キャッシュミス率記録ファイル313に出力される。キ
ャッシュモデルテーブル等を用いてキャッシュシミュレ
ーションを行う方法については例えば「T.M.Conte, C.
E.Gimac著:Fast Simulationof Computer Architectur
e, pp87-108, Kluwer, 1995」などに記載があるので、
ここでは詳しく説明しない。
図である。以降この関数を便宜的にキャッシュシミュレ
ータと呼ぶことにする。キャッシュシミュレータはキャ
ッシュシミュレーション用ロードモジュール311を実
行するときに動作する。キャッシュシミュレータ801
は、大きく分けて制御部802、キャッシュテーブル8
03、キャッシュミス率記録テーブル804からなる。
またキャッシュシミュレータへの入力となるのはメモリ
アドレス805と実行文番号806である。(これは関
数simの2つの引数に対応する。)キャッシュモデルテ
ーブル803は実際のキャッシュをソフトウェア的にシ
ミュレートしたものである。制御部802は与えられた
メモリアドレスを基に、そのアドレスがキャッシュ上に
存在するか(キャッシュヒットしているか)をキャッシ
ュモデルテーブルを使って調べ、もしミスしていれば必
要に応じてキャッシュモデルテーブルの内容を変更する
とともに、その結果をキャッシュミス率記録テーブル8
04に登録する。登録するときには実行文番号を用い、
その実行文番号に対応するエントリに記録していく。な
お、キャッシュモデルテーブルおよびキャッシュミス率
記録テーブルはキャッシュシミュレーション初期化関数
の実行時(プログラムの最初)初期化される。また、キ
ャッシュミス率記録テーブルの内容はキャッシュシミュ
レーション結果出力関数の実行時(プログラムの最後)
キャッシュミス率記録ファイル313に出力される。キ
ャッシュモデルテーブル等を用いてキャッシュシミュレ
ーションを行う方法については例えば「T.M.Conte, C.
E.Gimac著:Fast Simulationof Computer Architectur
e, pp87-108, Kluwer, 1995」などに記載があるので、
ここでは詳しく説明しない。
【0023】図9はキャッシュミス率記録テーブル80
4の内容(の例)を示した図である。キャッシュミス率
記録テーブルは、実行文番号901、アクセス回数90
2、キャッシュヒット回数903、キャッシュミス回数
904、キャッシュミス率905の5つのフィールドか
らなる。実行文番号901はメモリ参照のある実行文の
番号を表す。アクセス回数902はメモリ参照回数を表
すもので、これはキャッシュヒット回数903とキャッ
シュミス回数905の和となる(したがって902〜9
04の3つのうち、1つは他から計算できるので省略可
能)。キャッシュミス率905は「キャッシュミス回数
/アクセス回数」を表す(これも他から計算できるので
省略可能)。キャッシュミス率記録ファイル313の内
容もキャッシュミス率テーブル804と同じ構成であ
る。
4の内容(の例)を示した図である。キャッシュミス率
記録テーブルは、実行文番号901、アクセス回数90
2、キャッシュヒット回数903、キャッシュミス回数
904、キャッシュミス率905の5つのフィールドか
らなる。実行文番号901はメモリ参照のある実行文の
番号を表す。アクセス回数902はメモリ参照回数を表
すもので、これはキャッシュヒット回数903とキャッ
シュミス回数905の和となる(したがって902〜9
04の3つのうち、1つは他から計算できるので省略可
能)。キャッシュミス率905は「キャッシュミス回数
/アクセス回数」を表す(これも他から計算できるので
省略可能)。キャッシュミス率記録ファイル313の内
容もキャッシュミス率テーブル804と同じ構成であ
る。
【0024】図10はキャッシュ向け最適化処理204
の流れを示したフローチャートである。本実施例ではキ
ャッシュ向け最適化処理としてソフトウェアプリフェッ
チを行うものとする。まずステップ1001で、中間コ
ード中の未処理の実行文がまだあるか調べる。未処理の
実行文がなければ終了する。ステップ1002で、それ
がメモリ参照文であるかを調べる。メモリ参照文であれ
ば、ステップ1003で、キャッシュミス率記録ファイ
ルからその実行文に対応するエントリがあるかを調べ
る。エントリがなければその実行文は実行されなかった
ということであるので、スキップしてステップ1001
へ進む。エントリがあればステップ1004で、その実
行文のキャッシュミス率を取り出し、それが一定値以上
であるかを調べる。キャッシュミス率が一定値以上であ
れば、キャッシュ向け最適化の効果があるメモリ参照と
いうことなので、ステップ1005でキャッシュプリフ
ェッチ命令を挿入する。
の流れを示したフローチャートである。本実施例ではキ
ャッシュ向け最適化処理としてソフトウェアプリフェッ
チを行うものとする。まずステップ1001で、中間コ
ード中の未処理の実行文がまだあるか調べる。未処理の
実行文がなければ終了する。ステップ1002で、それ
がメモリ参照文であるかを調べる。メモリ参照文であれ
ば、ステップ1003で、キャッシュミス率記録ファイ
ルからその実行文に対応するエントリがあるかを調べ
る。エントリがなければその実行文は実行されなかった
ということであるので、スキップしてステップ1001
へ進む。エントリがあればステップ1004で、その実
行文のキャッシュミス率を取り出し、それが一定値以上
であるかを調べる。キャッシュミス率が一定値以上であ
れば、キャッシュ向け最適化の効果があるメモリ参照と
いうことなので、ステップ1005でキャッシュプリフ
ェッチ命令を挿入する。
【0025】図11は、図5の入力中間コードおよび図
9のキャッシュミス率記録ファイルのデータを基に、ソ
フトウェアプリフェッチ最適化を行った結果の中間語で
ある。図5のプログラムでは実行文番号4,5,7の3
箇所にメモリ参照があるが、そこに対応するキャッシュ
ミス率はそれぞれ0.19%,0.19%,25.0%で
あることがキャッシュミス率記録ファイルからわかる。
ここで、キャッシュミス率3%以上の参照にのみキャッ
シュ向け最適化を行うとすると、実行文7のメモリ参照
に対してのみプリフェッチ命令を挿入すればよい。した
がって図12の中間語では、実行文7に対するプリフェ
ッチ命令である実行文10「prefetch(&A(I+3,J)」が新
たに挿入されている。なお、プリフェッチ命令の挿入方
法については、例えば前記文献「Bernstein他:Compile
r Techniques for Data Prefetching on the PowerPC,
PACT '95, 1995, pp.19-26」に記載されているのでここ
では詳しく述べない。
9のキャッシュミス率記録ファイルのデータを基に、ソ
フトウェアプリフェッチ最適化を行った結果の中間語で
ある。図5のプログラムでは実行文番号4,5,7の3
箇所にメモリ参照があるが、そこに対応するキャッシュ
ミス率はそれぞれ0.19%,0.19%,25.0%で
あることがキャッシュミス率記録ファイルからわかる。
ここで、キャッシュミス率3%以上の参照にのみキャッ
シュ向け最適化を行うとすると、実行文7のメモリ参照
に対してのみプリフェッチ命令を挿入すればよい。した
がって図12の中間語では、実行文7に対するプリフェ
ッチ命令である実行文10「prefetch(&A(I+3,J)」が新
たに挿入されている。なお、プリフェッチ命令の挿入方
法については、例えば前記文献「Bernstein他:Compile
r Techniques for Data Prefetching on the PowerPC,
PACT '95, 1995, pp.19-26」に記載されているのでここ
では詳しく述べない。
【0026】なお本実施例では、キャッシュ向け最適化
としてソフトウェアプリフェッチを行うコンパイラの構
成を示したが、本発明はこれに限定されるものではな
く、ループブロッキングあるいはタイリングと呼ばれる
他のキャッシュ向け最適化にも同様に適用可能である。
また本発明では、キャッシュミス率記録ファイルでは主
にキャッシュミス率のみを記録したが、これに加えてキ
ャッシュミスの種類(初期ミス、容量性ミス、競合性ミ
ス)を記録することにより、適用するキャッシュ最適化
をより細かく選択することも可能である。
としてソフトウェアプリフェッチを行うコンパイラの構
成を示したが、本発明はこれに限定されるものではな
く、ループブロッキングあるいはタイリングと呼ばれる
他のキャッシュ向け最適化にも同様に適用可能である。
また本発明では、キャッシュミス率記録ファイルでは主
にキャッシュミス率のみを記録したが、これに加えてキ
ャッシュミスの種類(初期ミス、容量性ミス、競合性ミ
ス)を記録することにより、適用するキャッシュ最適化
をより細かく選択することも可能である。
【0027】
【発明の効果】本発明によれば、静的解析ではキャッシ
ュミス率が予測できないプログラムに対しても、プログ
ラム中の各データアクセスに対するキャッシュミス率を
より正確に求め、それを利用してコンパイラによる無駄
のない効率的キャッシュ向け最適化を行うことができ
る。
ュミス率が予測できないプログラムに対しても、プログ
ラム中の各データアクセスに対するキャッシュミス率を
より正確に求め、それを利用してコンパイラによる無駄
のない効率的キャッシュ向け最適化を行うことができ
る。
【図1】ユーザによるコンパイル処理の手順である。
【図2】コンパイラの処理の流れである。
【図3】計算機システムの構成図である。
【図4】ソースプログラム例である。
【図5】中間コードの例である。
【図6】キャッシュシミュレーションコード埋め込み処
理の流れである。
理の流れである。
【図7】キャッシュシミュレーションコード挿入後の中
間コードである。
間コードである。
【図8】キャッシュシミュレーション関数simの動作モ
デル図である。
デル図である。
【図9】キャッシュミス率記録テーブルである。
【図10】キャッシュ向け最適化処理の流れである。
【図11】キャッシュ向け最適化処理後の中間コードで
ある。
ある。
301…CPU、 302…主記憶装置、 3
03…外部記憶装置、304…ディスプレイ装置、30
5…キーボード。
03…外部記憶装置、304…ディスプレイ装置、30
5…キーボード。
Claims (7)
- 【請求項1】コンパイラにおけるキャッシュ向け最適化
方法であって、 コンパイルが第1段階のコンパイルであるか否かを判定
するステップと、 第1段階のコンパイルであるときに、プログラム中のメ
モリ参照に対してキャッシュシミュレーションを行うコ
ードを挿入するステップと、 第2段階のコンパイルであるときに、プログラム中のメ
モリ参照に対してキャッシュ向け最適化を行うステップ
とを有し、 上記キャッシュ向け最適化処理では、該メモリ参照にお
けるキャッシュ特性データを用いて処理を行うことを特
徴とするキャッシュ向け最適化方法。 - 【請求項2】請求項1のキャッシュ向け最適化方法であ
って、上記キャッシュ特性データは、キャッシュミス率
を含むことを特徴とするキャッシュ向け最適化方法。 - 【請求項3】請求項1のキャッシュ向け最適化方法であ
って、上記キャッシュ特性データは、キャッシュミスの
種類を含むことを特徴とする、キャッシュ向け最適化方
法。 - 【請求項4】請求項1のキャッシュ向け最適化方法であ
って、上記キャッシュ特性データは、該データがプログ
ラム中のどの参照に対するものであるかを示す情報を含
むことを特徴とする、キャッシュ向け最適化方法。 - 【請求項5】請求項1のキャッシュ向け最適化方法であ
って、上記キャッシュ向け最適化はソフトウェアプリフ
ェッチを行うことを特徴とする、キャッシュ向け最適化
方法。 - 【請求項6】請求項1のキャッシュ向け最適化方法を用
いたコンパイラ。 - 【請求項7】請求項6のコンパイラを格納した記憶媒
体。
Priority Applications (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP9130670A JPH10320212A (ja) | 1997-05-21 | 1997-05-21 | キャッシュ向け最適化方法 |
Applications Claiming Priority (1)
| Application Number | Priority Date | Filing Date | Title |
|---|---|---|---|
| JP9130670A JPH10320212A (ja) | 1997-05-21 | 1997-05-21 | キャッシュ向け最適化方法 |
Publications (1)
| Publication Number | Publication Date |
|---|---|
| JPH10320212A true JPH10320212A (ja) | 1998-12-04 |
Family
ID=15039816
Family Applications (1)
| Application Number | Title | Priority Date | Filing Date |
|---|---|---|---|
| JP9130670A Pending JPH10320212A (ja) | 1997-05-21 | 1997-05-21 | キャッシュ向け最適化方法 |
Country Status (1)
| Country | Link |
|---|---|
| JP (1) | JPH10320212A (ja) |
Cited By (7)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2000267901A (ja) * | 1999-03-16 | 2000-09-29 | Toshiba Corp | ソフトウェア実行システム |
| US7512591B2 (en) | 2005-12-09 | 2009-03-31 | International Business Machines Corporation | System and method to improve processing time of databases by cache optimization |
| JP2010055458A (ja) * | 2008-08-29 | 2010-03-11 | Fujitsu Ltd | キャッシュ制御方法及びキャッシュ制御装置 |
| JPWO2008093399A1 (ja) * | 2007-01-30 | 2010-05-20 | 富士通株式会社 | 演算処理装置、情報処理装置及び演算処理装置の制御方法 |
| US7788449B2 (en) | 2006-09-20 | 2010-08-31 | International Business Machines Corporation | Cache configuration in a database system |
| JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
| US8392405B2 (en) * | 2008-06-23 | 2013-03-05 | Oracle International Corporation | Performing cost-based optimizations of authorization checks in database systems |
-
1997
- 1997-05-21 JP JP9130670A patent/JPH10320212A/ja active Pending
Cited By (9)
| Publication number | Priority date | Publication date | Assignee | Title |
|---|---|---|---|---|
| JP2000267901A (ja) * | 1999-03-16 | 2000-09-29 | Toshiba Corp | ソフトウェア実行システム |
| US7512591B2 (en) | 2005-12-09 | 2009-03-31 | International Business Machines Corporation | System and method to improve processing time of databases by cache optimization |
| US7788449B2 (en) | 2006-09-20 | 2010-08-31 | International Business Machines Corporation | Cache configuration in a database system |
| JPWO2008093399A1 (ja) * | 2007-01-30 | 2010-05-20 | 富士通株式会社 | 演算処理装置、情報処理装置及び演算処理装置の制御方法 |
| JP4491500B2 (ja) * | 2007-01-30 | 2010-06-30 | 富士通株式会社 | 演算処理装置、情報処理装置及び演算処理装置の制御方法 |
| US8671246B2 (en) | 2007-01-30 | 2014-03-11 | Fujitsu Limited | Information processing system and information processing method |
| US8392405B2 (en) * | 2008-06-23 | 2013-03-05 | Oracle International Corporation | Performing cost-based optimizations of authorization checks in database systems |
| JP2010055458A (ja) * | 2008-08-29 | 2010-03-11 | Fujitsu Ltd | キャッシュ制御方法及びキャッシュ制御装置 |
| JP2010244208A (ja) * | 2009-04-02 | 2010-10-28 | Fujitsu Ltd | プリフェッチ生成プログラムおよびコンパイラ装置 |
Similar Documents
| Publication | Publication Date | Title |
|---|---|---|
| US6427234B1 (en) | System and method for performing selective dynamic compilation using run-time information | |
| US5805863A (en) | Memory pattern analysis tool for use in optimizing computer program code | |
| US7571432B2 (en) | Compiler apparatus for optimizing high-level language programs using directives | |
| JP3602857B2 (ja) | 多機種対応型情報処理システム、および、方法 | |
| CN1802632B (zh) | 用于在程序代码转换期间执行解释器优化的方法和装置 | |
| US7237234B2 (en) | Method for selective solicitation of user assistance in the performance tuning process | |
| JP3284956B2 (ja) | プログラム変換方法、プログラム変換装置及びプログラム変換プログラムを記憶した記憶媒体 | |
| JP2002149416A (ja) | プログラムの最適化方法及びこれを用いたコンパイラ | |
| JP3546341B2 (ja) | 多重ループ向けデータプリフェッチ方法およびプログラム生成方法 | |
| CN101520737A (zh) | 编译方法和使用该编译方法的处理器 | |
| JPH02217926A (ja) | コード生成方法 | |
| JP3539613B2 (ja) | ループ飛び出し文を含むループに対する配列サマリ解析方法 | |
| CN116775127B (zh) | 一种基于RetroWrite框架的静态符号执行插桩方法 | |
| JPH10320212A (ja) | キャッシュ向け最適化方法 | |
| JPH10133884A (ja) | 推測的なコードを含むプログラミング・コードを実行する方法 | |
| KR0125605B1 (ko) | 프로그램의 아키덱쳐 변환방법 및 장치와 그 방법 및 장치를 사용하여 프로그램의 동작을 검증하는 방법 및 장치 | |
| US20030070117A1 (en) | Simulation apparatus and simulation method | |
| JPH10333916A (ja) | ノンブロッキングキャッシュ対応のコードスケジューリング方式及びそのプログラムを記録した記憶媒体 | |
| JP2000207224A (ja) | ソフトウェアプリフェッチ方法 | |
| JPH02176938A (ja) | 機械語命令最適化方式 | |
| JP3309810B2 (ja) | プログラムリンクシステム、方法及び記録媒体 | |
| JP3758991B2 (ja) | 目的プログラムの実行ステップ数調整方法とその調整装置およびプログラムを記憶した記録媒体 | |
| US20050251795A1 (en) | Method, system, and program for optimizing code | |
| van Engelen et al. | Automatic validation of code-improving transformations on low-level program representations | |
| Huang | Improving processor performance through compiler-assisted block reuse |