以下に添付図面を参照して、本発明にかかるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムの実施の形態を詳細に説明する。本実施の形態では、評価対象となる第1プロセッサがターゲットプログラムを実行した場合の機能や性能のシミュレーションを、シミュレーション装置が有する第2プロセッサによって実行する。第2プロセッサによってシミュレーションを行う際に第1プロセッサのターゲットプログラムから第2プロセッサが実行可能なコードへの変換手法として、例えば、インタープリタ方式またはJIT(Just−in−Time)コンパイラ方式がある。本実施の形態にかかるシミュレーション装置は、JITコンパイラ方式による性能のシミュレーションを行う。
図1は、本発明にかかるシミュレーション装置による一動作例を示す説明図である。シミュレーション装置100は、アウト・オブ・オーダー実行のプロセッサがターゲットプログラムpgrを実行した場合の動作シミュレーションsimを実行するコンピュータである。アウト・オブ・オーダー実行のプロセッサをターゲットCPU(Central Processing Unit)と称する。シミュレーション装置100が有するプロセッサをホストCPUと称する。図1の例では、ターゲットCPUがARM(登録商標)アーキテクチャのCPUであり、シミュレーション装置100が有するホストCPUは、例えば、x86アーキテクチャのCPUである。ここでの動作シミュレーションsimは、例えば、ターゲットCPUと、ターゲットCPUがアクセス可能なハードウェア資源と、を有するシステムのモデルにターゲットプログラムpgrを与えることによるシミュレーションである。ここで使用されるシステムのモデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。
シミュレーション装置100は、ターゲットプログラムpgrのコードを分割して得られるブロックのうち動作シミュレーションsimの対象ブロックが変化した場合、動作シミュレーションsimにおけるターゲットCPUの内部状態を検出する。ターゲットCPUの内部状態とは、たとえば、ターゲットCPUが有するレジスタなどの設定値である。シミュレーション装置100は、動作シミュレーションsimにおけるターゲットCPUが有するレジスタなどの設定値によって、ターゲットプログラムpgrの実行状況を判別可能である。分割されるブロック単位は、例えば、ベーシック(基本)ブロック単位でよく、または、予め定められた任意のコード単位でよい。ここで、ベーシックブロックとは、一つの入口と一つの出口を持ち、内部に分岐コードを含まないコードをいう。ブロックに分割するタイミングは、事前にすべて分割しておいてもよいし、対象ブロックとなった時に対象ブロックだけを分割してもよい。
シミュレーション装置100は、対象ブロックが変化した場合、対象ブロックについての実行コードecを生成する。ここでの実行コードecとは、対象ブロックがターゲットCPUに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報101によってホストCPUが計算可能なコードである。対応情報101の具体例は図18に示す。性能値は、例えば、処理時間、サイクル数などが挙げられる。
例えば、実行コードecは、機能コードc1と、タイミングコードc2と、を含む。機能コードc1は、対象ブロックをコンパイルすることによって得られるホストCPUが実行可能なコードである。タイミングコードc2は、機能コードc1の性能値を見積もるコードである。例えば、性能値がサイクル数であると、タイミングコードc2は、例えば、以下のように内部状態を引数として性能値を得て、サイクル数cycleを加算していくようなコードである。
cycle=cycle+性能値[内部状態]
このように、本実施の形態で生成される実行コードecは、具体的な性能値が記述されたコードでなく、性能値を取得可能なコードである。これにより、同一のブロックについて複数回実行コードecを生成しなくてよい。そこで、シミュレーション装置100は、対象ブロックが以前に対象ブロックとなったか否かを判断する。例えば、対象ブロックが以前に対象ブロックとなっていなければ、対象ブロックについての実行コードecは生成済みでないため、あらたに対象ブロックについての実行コードecを生成しなければならない。一方、例えば、対象ブロックが以前に対象ブロックとなっていれば、すでに対象ブロックについての実行コードecは生成済みであるため、あらたに対象ブロックについての実行コードecを生成しなくてもよい。そのため、シミュレーション装置100は、以前に対象ブロックとなっていないと判断された場合、対象ブロックについての実行コードecを生成する。一方、シミュレーション装置100は、以前に対象ブロックとなっていると判断された場合、実行コードecを生成しない。これにより、同一のブロックについて複数回実行コードecが生成されないため、性能値の見積もりにおいて、省メモリ化を図ることができる。
そして、シミュレーション装置100は、検出した内部状態と、検出した内部状態における対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報101を生成する。検出された内部状態が異なる度に対象ブロックについての対応情報101は生成される。例えば、シミュレーション装置100は、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって対象ブロックに含まれる各命令の性能値を算出する。対象ブロックに含まれる各命令の基準となる性能値は、シミュレーション装置100がアクセス可能な記憶装置に予め記憶させたり、シミュレーション装置100の利用者によって入力させたり、シミュレーション装置100が他の装置から取得してもよい。具体的に、例えば、性能値がサイクル数や実行時間である場合、シミュレーション装置100は、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う。
より具体的には、シミュレーション装置100は、例えば、検出した内部状態によって、動作シミュレーションsimにおける直前の対象ブロックの命令の実行順や命令の完了状況などの実行状況を判断する。そして、シミュレーション装置100は、例えば、対象ブロックに含まれる各命令の基準となる性能値を実行状況に応じて加算または減算することによって、検出した内部状態における対象ブロックに含まれる各命令の性能値を得る。
性能値がサイクル数の場合について、検出された内部状態における対象ブロックに含まれる各命令の性能値を静的に見積もる方法について簡単に説明する。例えば、対象ブロックの直前のブロックに含まれる第1命令の実行結果を対象ブロックに含まれる第2命令が使用する場合において、第1命令が終了していない場合、シミュレーション装置100は、第2命令の基準となる性能値に第1命令の遅延分の性能値を加算する。また、例えば、シミュレーション装置100は、対象ブロックが変化したにもかかわらず、直前のブロックに含まれる命令の中に実行が完了していない第1命令が使用中の実行ユニットを使用予定の第2命令が対象ブロックに含まれていれば、第2命令の基準となる性能値に第1命令の遅延分の性能値を加算する。このように、シミュレーション装置100は、検出した内部状態に基づいて対象ブロックの各命令の性能値を静的に見積もる。
つぎに、シミュレーション装置100は、実行コードecを、対象ブロックについて生成した対応情報101と検出した内部状態とを用いて実行することにより、対象ブロックがターゲットCPUに実行された場合の性能値を計算する。
図1によれば、命令の実行順に追い越しが発生しても、内部状態に応じて性能値を算出しているため、アウト・オブ・オーダー実行のターゲットCPUが実行した場合のブロックの性能値を精度よく見積もることができる。
また、図1では、実行コードecの実行時に性能値の補正を行う処理についての詳細な説明を省略する。
(シミュレーション装置100のハードウェア構成例)
図2は、実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。シミュレーション装置100は、ホストCPU201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、ディスクドライブ204と、ディスク205と、を有する。シミュレーション装置100は、I/F(Inter Face)206と、入力装置207と、出力装置208と、を有する。また、各部はバス200によってそれぞれ接続される。
ここで、ホストCPU201は、シミュレーション装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶する。RAM203は、ホストCPU201のワークエリアとして使用される記憶部である。ディスクドライブ204は、ホストCPU201の制御にしたがってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205としては、磁気ディスク、光ディスクなどが挙げられる。
I/F206は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワークNETに接続され、このネットワークNETを介して他の装置に接続される。そして、I/F206は、ネットワークNETと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F206には、例えばモデムやLANアダプタなどを採用することができる。
入力装置207は、キーボード、マウス、タッチパネルなど利用者の操作により、各種データの入力を行うインターフェースである。また、入力装置207は、カメラから画像や動画を取り込むこともできる。また、入力装置207は、マイクから音声を取り込むこともできる。出力装置208は、ホストCPU201の指示により、データを出力するインターフェースである。出力装置208には、ディスプレイやプリンタが挙げられる。
ここでターゲットCPUがアウト・オブ・オーダーの場合のシミュレーション装置100の詳細な説明の前に、ターゲットCPUがイン・オーダーの場合のシミュレーション装置について説明する。
(ターゲットCPUがイン・オーダー実行の場合のシミュレーション装置)
はじめに、図3〜図11を用いてターゲットCPUがイン・オーダー実行の場合のシミュレーション装置の構成およびシミュレーション動作の概要について説明する。図3は、実施の形態のシミュレーション装置の構成例を示す図である。シミュレーション装置1は、パイプライン処理を制御するターゲットCPUにおける命令実行の性能シミュレーションを実行する装置である。ここでは、シミュレーション装置1のハードウェア構成も図2に示したシミュレーション装置のハードウェア構成と同様とする。
ターゲットCPUは、シミュレーションの対象となるCPUの制御モデルである。シミュレーション装置1は、ターゲットCPUの命令実行の性能シミュレーションとして各命令のサイクルシミュレーション情報を出力する。ここで、ターゲットCPUは、例えばARMアーキテクチャのCPUである。ホストCPUに相当するシミュレーション装置1は、例えばX86アーキテクチャのCPUを搭載するコンピュータである。
シミュレーション装置1は、コード変換部11とシミュレーション実行部12とシミュレーション情報収集部13とを有する。コード変換部11は、ターゲットCPUのプログラムの実行時に、ターゲットCPUが実行するプログラムのコード(ターゲットコード)から、シミュレーションを実行するホストCPUのコード(ホストコード)を生成する処理部である。シミュレーション装置1には、ターゲットプログラム2と、ターゲットプログラム2に関するタイミング情報3と、予測情報4とが入力される。
コード変換部11は、ブロック分割部111と、予測シミュレーション実行部113と、コード生成部115とを含む。ブロック分割部111は、シミュレーション装置1に入力されたプログラムのターゲットコードを、所定のブロックに分割する。分割されるブロック単位は、例えば、一般的なベーシックブロック単位でよく、または、予め定められた任意のコード単位でよい。予測シミュレーション実行部113は、タイミング情報3と予測情報4とを得て、入力されたブロックをある実行結果を前提とした条件下で実行する性能シミュレーションを行う処理部である。コード生成部115は、予測シミュレーション実行部113のシミュレーション結果をもとに、処理したブロックに対応するホストコードとして、設定された予測ケースにおける命令実行時の性能シミュレーションを行うためのホストコードを生成する処理部である。
シミュレーション実行部12は、コード生成部115が生成したホストコードを実行して、プログラム(ターゲットコード)を実行するターゲットCPUの命令実行の機能および性能シミュレーションを行う処理部である。シミュレーション実行部12は、コード実行部121、補正部123を有する。コード実行部121は、ホストコードを用いて、プログラム(ターゲットコード)を実行する処理部である。補正部123は、プログラムの実行中に、外部依存命令の実行結果が、設定されていた予測結果と異なる場合(予測外ケース)に、その命令の実行時間を、既に求めた予想ケースでの実行時間を補正して求める処理部である。補正部123は、外部依存命令に与えられるペナルティ時間、外部依存命令の前後で実行される命令の実行時間、1つ前の命令の遅延時間などを用いて補正を行う。なお、補正処理の詳細は後述する。
シミュレーション情報収集部13は、性能シミュレーションの実行結果として、各命令の実行時間を含むログ情報(シミュレーション情報)5を収集する処理部である。
図4は、ブロックに含まれる命令の例を示す図である。図4に示すように、あるブロックには、ターゲットコードの3つの命令;(1)“ld r1,r2”(ロード);(2)“mult r3,r4, r5(乗算)”;(3)“add r2,r5, r6(加算)”の命令が含まれ、(1)〜(3)の順でターゲットCPUのパイプラインに投入されて実行されるとする。各命令のr1〜r6は、レジスタ(アドレス)を表す。
タイミング情報3は、ターゲットコードの各命令について、命令実行時の各処理要素(段階)と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間(ペナルティサイクル数)とを示す情報である。外部依存命令は、外部環境が関係する処理を行う命令、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットCPU外の外部環境に依存するような処理、例えば、命令キャッシュ、データキャッシュ、TLB検索などであり、さらには、分岐予測、コール/リターンのスタックなどの処理を行う命令である。
図5は、タイミング情報の例を示す図である。図5に示すタイミング情報3では、ld命令について、ソースレジスタrs1(r1)は1番目の処理要素(e1)で、宛先レジスタrd(r2)は2番目の処理要素(e2)で使用可能であることを表す。また、mult命令では、第1ソースレジスタrs1(r3)は1番目の処理要素(e1)、第2ソースレジスタrs2(r4)は2番目の処理要素(e2)、宛先レジスタrd(r5)は3番目の処理要素(e3)で、それぞれ使用可能であることを示す。また、add命令では、第1ソースレジスタrs1(r2)、第2ソースレジスタrs2(r5)は1番目の処理要素(e1)、宛先レジスタrd(r6)は2番目の処理要素(e2)で使用可能であることを示す。
図6は、図4に示すブロックの各命令の実行タイミング例を示す図である。図5に示すタイミング情報3から、パイプラインに各命令が投入されるタイミングは、ld命令の実行開始をタイミングtとすると、mult命令はタイミングt+1、add命令はタイミングt+2となる。add命令の第1ソースレジスタ(r2)と第2ソースレジスタ(r5)は、ld命令とmult命令で使用されているため、add命令の開始は、ld命令とmult命令の実行完了のタイミングt+4以降となり、2サイクル分の待機時間(2サイクル分のストール)が生じる。
したがって、図6(A)に示すように、図4に示すブロックをシミュレーションした場合に、ld命令の実行結果がキャッシュヒットであるケースでは、ブロックの実行時間が6サイクルであることがわかる。図6(B)は、図4に示すブロックのld命令の実行結果がキャッシュミスである場合のタイミング例を表す。ld命令の結果がキャッシュミスであると、タイミング情報3に、ペナルティとして、再実行に十分と考えられる任意の時間(ここでは6サイクル分)が設定されているため、このペナルティサイクルが遅延時間として追加される。したがって、2番目の処理要素(e2)の実行は、タイミングt+7に遅延する。ld命令のつぎに実行されるmult命令は、遅延の影響を受けずにそのまま実行されるが、add命令は、ld命令の実行完了のタイミングt+8以降となり、4サイクル分の待機時間(4サイクル分のストール)が生じる。
したがって、図6(B)に示すように、図4に示すブロックの命令実行をシミュレーションした場合に、ld命令の実行結果がキャッシュミスであるケースでは、実行時間が10サイクルとなることがわかる。予測情報4は、ターゲットコードの外部依存命令の処理において、生じる確率が高い実行結果(予測結果)を定めた情報である。予測情報4には、例えば、
「命令キャッシュ:予測=ヒット、
データキャッシュ:予測=ヒット、
TLB検索:予測=ヒット、
分岐予測:予測=ヒット、
コール/リターン:予測=ヒット、…」
が定められる。
予測シミュレーション実行部113は、上記の予測情報4をもとに、入力されたブロックに含まれる外部依存命令の予測結果を設定し、タイミング情報3を参照して、設定した予測結果を前提とする場合(予測ケース)の命令を実行して、命令実行の進み具合をシミュレーションする。予測シミュレーション実行部113は、シミュレーション結果として、ブロックに含まれる各命令の実行時間(所要サイクル数)を求める。
コード生成部115は、ブロックのターゲットコードをもとに、外部依存命令が予測結果である予測ケースの場合の命令実行を行うホストコードを生成し、さらに、各命令の実行時間を加算して、ブロックの処理時間を計算する処理を行うシミュレーション用コードを組み込む。例えば、コード生成部115は、データのld命令の予測結果として“キャッシュヒット”が設定されている処理については、そのブロック内のld命令によるキャッシュアクセスが“ヒット”である場合の処理実行をシミュレーションして、この予測ケースでの実行時間を求め、ld命令によるキャッシュアクセスが“ミス”である場合の実行時間は、予測ケースである“ヒット”時の実行時間の加算/減算を用いた補正計算により求める処理を行うホストコードを生成する。
以下に、実施の形態におけるシミュレーション装置1の処理の流れを説明する。
〔コード変換処理〕
(1)シミュレーション装置1のコード変換部11のブロック分割部111は、ターゲットプログラム2のターゲットコードを得て図示しない記憶部に保持し、保持したターゲットコードを任意のブロックに分割する(図4参照)。
(2)予測シミュレーション実行部113は、入力されるターゲットプログラム2に関するタイミング情報3、予測情報4を得て記憶部に保存する。そして、予測シミュレーション実行部113は、予測情報4をもとに、分割されたブロックの外部依存命令のそれぞれについて予測結果を設定する。例えば、予測シミュレーション実行部113は、図4に示すブロックの命令のうち、ld命令のデータキャッシュの予測結果として「ヒット」を設定する。
(3)予測シミュレーション実行部113は、ブロックのコードを解釈して、設定された予測結果を前提とする場合の命令実行をシミュレーションする。すなわち、予測シミュレーション実行部113は、図6(A)に示すタイミング例の命令実行をシミュレーションすることになる。
(4)つぎに、コード生成部115は、予測ケースのシミュレーション結果をもとに、ターゲットコードからホストコードを生成する。さらに、コード生成部115は、ターゲットコードから変換したホストコード(機能コードのみ)に、性能シミュレーション(サイクルシミュレーション)を実行するためのサイクルシミュレーション用コードを組み込む。
図7は、サイクルシミュレーション用コードが組み込まれる例を示す図である。図7(A)には、ターゲットコードから機能コードのみのホストコードが生成される例を示し、図7(B)には、機能コードのみのホストコードに、サイクルシミュレーション用コードが組み込まれる例を示す。図7(A)に示すように、ターゲットコードInst_Aは、ホストコードHost_Inst_A0_func、Host_Inst_A1_funcに変換され、ターゲットコードInst_Bは、ホストコードHost_Inst_B0_func、Host_Inst_B1_func、Host_Inst_B2_func、…に変換されて、機能コードのみのホストコードが生成される。
さらに、機能コードのみのホストコードに、ターゲットコードInst_Aのサイクルシミュレーション用コードHost_Inst_A2_cycle、Host_Inst_A3_cycleが、ターゲットコードInst_Bのサイクルシミュレーション用コードHost_Inst_B4_cycle、Host_Inst_B5_cycleが、それぞれ組み込まれる。
サイクルシミュレーション用コードは、各命令の実行時間(所要サイクル数)を定数化し、各命令の実行時間を合計してブロックの処理時間を求めるコードである。これにより、ブロック実行中の進み具合を示す情報を得ることができる。ここで、ホストコードのうち、機能コード、外部依存命令以外の命令についてのサイクルシミュレーション用コードは既知のコードを使用して実施できるので、具体例の説明を省略する。外部依存命令についてのサイクルシミュレーション用コードは、ヘルパー関数呼び出し命令として用意される。ヘルパー関数は、予測ケースと、図1で説明したような動作シミュレーションsimにおける実行結果と、が一致しているか否かに基づいて実行時間を補正する補正処理を行う関数である。ヘルパー関数の詳細例については後述する。
〔シミュレーション処理〕
(1)シミュレーション実行部12のコード実行部121は、コード変換部11が生成したホストコードを用いて、ターゲットプログラム2の性能シミュレーションを行う。コード実行部121は、ターゲットプログラム2の命令実行をシミュレーションし、各命令の実行時間を得ていく。
(2)コード実行部121は、シミュレーションの実行中に、外部依存命令(例えばld命令)を検出した場合に、その実行結果が、設定された予測結果と異なっているかを判定し、実行結果が予測結果と異なっている場合に、補正部123の起動を要求する。例えば、命令「ld r1,r2」を検出し、データキャッシュの予測結果(キャッシュヒット)と、実際の実行結果(キャッシュミス)とが異なっていた場合に、補正部123が呼び出される。
(3)補正部123は、呼び出しを受けて起動し、検出された命令「ld r1,r2」の実行時間(サイクル数)を補正する。さらに、補正部123は、この補正により、次命令の実行タイミングt+nも変更する。補正部123は、外部依存命令の実行結果が予測結果と異なる度に、命令の実行時間を補正する。ここで、予測ケースでの外部依存命令の実行時間は既に定数化されているため、補正部123は、予測外ケースでの外部依存命令の実行時間を、その命令に対するペナルティ時間、前後に実行される命令の実行時間、前に処理された命令の遅延時間等の値を単に加算または減算して計算することができる。
図8は、シミュレーション装置の補正部の処理動作を示す図である。補正部123は、ヘルパー関数モジュールとして実施される。本実施の形態では、例えば、ld命令のキャッシュの実行結果ごとにシミュレーションを行う従来の関数「cache_ld(address)」の代わりに、ヘルパー関数「cache_ld(address,rep_delay,pre_delay)」がホストコードに組み込まれることにより、実現している。
ヘルパー関数の“rep_delay”は、このロード(ld)命令の返り値を使用するつぎの命令の実行までに、ペナルティ時間のうち遅延時間として処理されなかった時間(猶予時間)である。“pre_delay”は、1つ前の命令から受ける遅延時間である。“−1”は、前の命令に遅延がないことを示す。“rep_delay”と“pre_delay”は、性能シミュレーション結果とタイミング情報3との静的分析処理の結果から得られる時間情報である。
図8に示す動作例では、補正部123は、現タイミングcurrent_timeと1つ前のld命令の実行タイミングpreld_timeとの差が、1つ前のld命令の遅延時間分pre_delayを超えているときは、1つ前のld命令の実行タイミングpreld_timeと現タイミングcurrent_timeまでの時間で遅延時間pre_delayを調整して有効遅延時間avail_delayを求める。
つぎに、補正部123は、実行結果がキャッシュミスであれば、予測結果の誤りであり、有効遅延時間avail_delayにキャッシュミス時のペナルティ時間cache_miss_latencyを加算して、猶予時間rep_delayをもとに、ld命令の実行時間を補正する。
図9〜図11では、補正部のld命令の実行結果に対する補正例を示す。図9は、シミュレーション装置の補正部のld命令の実行結果に対する補正例を示す図である。図9では、1つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。
図9の例では、以下の3命令のシミュレーションが実行される。
「ld [r1],r2 :[r1]→r2;
mult r3,r4,r5 :r3*r4→r5;
add r2,r5,r6 :r2+r5→r6」
図9(A)は、予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースにおいて、3番目に実行されるadd命令に、2サイクルストールが生じている。図9(B)は、予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、ld命令の実行結果がキャッシュミスであると、ペナルティサイクル(6サイクル)分の遅延が生じる。そのため、mult命令は、遅延の影響を受けずに実行されるが、add命令の実行は、ld命令の完了を待つため、4サイクル分遅延することになる。図9(C)は、補正部123による補正後の命令実行タイミングチャートの例を示す図である。
補正部123は、ld命令の実行結果がキャッシュミスであるので(予測結果のミス)、残りの実行時間(2−1=1サイクル)に所定のキャッシュミス時のペナルティ時間(6サイクル)を加算して有効遅延時間(7サイクル)とする。有効遅延時間は、最大の遅延時間となる。さらに、補正部123は、つぎのmult命令の実行時間(3サイクル)を得て、次命令の実行時間が遅延時間を超過しないと判定して、有効遅延時間から次命令の実行時間を差し引いた時間(7−3=4サイクル)を、ld命令の遅延が生じた実行時間(遅延時間)とする。また、補正部123は、有効遅延時間から上記の遅延時間を差し引いた時間(3サイクル)を猶予時間とする。猶予時間は、ペナルティとしての遅延が猶予された時間である。補正部123は、ヘルパー関数cache_ld(addr,rep_delay,pre_delay)で、猶予時間rep_delay=3、前命令の遅延時間pre_delay=−1(遅延なし)を返す。
この補正により、ld命令の実行時間は、実行された時間と遅延時間を加算した実行時間(1+4=5サイクル)となり、実行完了のタイミングt1から、後続のmult命令、add命令の実行時間が計算される。すなわち、補正したld命令の実行時間(5サイクル)に、予測シミュレーション実行部113の処理結果(予測結果による予測シミュレーションの結果)で求められていたmult命令とadd命令の各々の実行時間(3サイクル、3サイクル)を単純に加算するだけで、このブロックの実行時間(サイクル数)を得ることができる。
よって、実行結果が予測と異なる命令の実行時間のみを加算または減算による補正処理を行って、その他の命令については、予測結果にもとづくシミュレーション時に求められた実行時間を加算するだけで、高精度に、キャッシュミス時のシミュレーションの実行サイクル数をも求めることができる。
図9(D)は、シミュレーション装置1の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図9(D)の場合には、ld命令の遅延時間をそのまま加算しているため、実際には、ld命令の実行中に実行が完了するmult命令の実行タイミングのずれによる誤差が生じていることがわかる。
図10は、シミュレーション装置の補正部のld命令の実行結果に対する補正例を示す図である。図10では、2つのキャッシュ処理が実行されるケースで2つのキャッシュミスが生じた場合の補正例を説明する。図10の例では、以下の5命令のシミュレーションが実行される。
「ld [r1],r2 :[r1]→r2;
ld [r3],r4 :[r3]→r4;
mult r5,r6,r7 :r5*r6→r7;
add r2,r4,r2 :r2+r4→r2;
add r2,r7,r2 :r2+r7→r2」
図10(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、2つのld命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。図10(B)は、2つのキャッシュ処理の両方が予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、2つのld命令のそれぞれでキャッシュミスがあり、ペナルティサイクル(6サイクル)分の遅延が生じる。しかし、2つのld命令の遅延時間は重なる時間があり、mult命令も、遅延の影響を受けずに実行され、2つのadd命令の実行が2つ目のld命令の完了まで遅延することになる。図10(C)は、補正部123による補正後の命令実行タイミングチャートの例を示す図である。
補正部123は、図9を用いて説明したように、タイミングt0において、1つ目のld命令の遅延時間を補正し、ヘルパー関数cache_ld(addr,3,−1)を返す。つぎに、現タイミングt1において、補正部123は、2つ目のld命令の実行結果がキャッシュミスであるので(予測結果のミス)、このld命令の残りの実行時間にペナルティサイクル(6)を追加して有効遅延時間(1+6=7サイクル)とする。
補正部123は、有効遅延時間から、現タイミングt1までに消費した遅延時間(<現タイミングt1−前命令の実行タイミングt0>−設定された間隔)を差し引いて、現タイミングt1から超過した有効遅延時間を求め(7−(6−2)=3サイクル)、この超過した有効遅延時間を、2つ目のld命令の実行時間とする。さらに、補正部123は、超過した有効遅延時間から本来の実行時間を差し引いて(3−1=2サイクル)、前命令の遅延時間とする。また、補正部123は、有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(3+3)=1サイクル)、猶予時間とする。
補正部123は、タイミングt1において、2つ目のld命令の遅延時間を補正した後、ヘルパー関数cache_ld(addr,2,1)を返す。この補正により、現タイミングt1に補正値(3サイクル)を付加したタイミングがld命令の実行完了のタイミングとなり、そのタイミングから、以降のmult命令、add命令の実行時間が加算されていくことになる。
図10(D)は、シミュレーション装置1の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図10(D)の場合には、2つのld命令それぞれに与えられたペナルティにもとづく遅延時間をそのまま加算しているため、大きな誤差(8サイクル)が生じていることがわかる。図10(C)に示す補正部123の処理でも、図10(B)に示すように正しくシミュレーションされる場合に比べて誤差(1サイクル)があるが、従来手法に比べて、非常に高精度に求められることがわかる。
図11は、補正部のld命令の実行結果に対する補正例を示す図である。2つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。図11の例では、図10で示す説明例と同様の5つの命令のシミュレーションが実行される。
図11(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、図10(A)の場合と同様に、2つのld命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。図11(B)は、1つ目のld命令が予測結果と異なる「キャッシュミス」となり、2つ目のld命令の結果が予測結果(キャッシュヒット)である場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、1つ目のld命令にペナルティサイクル(6サイクル)分の遅延が生じる。2つ目のld命令とmult命令は、遅延の影響を受けずに実行さる。2つのadd命令の実行は、1つ目のld命令の完了まで遅延することになる。図11(C)は、補正部123による補正後の命令実行タイミングチャートの例を示す図である。
補正部123は、図9を用いて説明したように、タイミングt0において、1つ目のld命令の遅延時間を補正し、ヘルパー関数cache_ld(addr,3,−1)を返す。つぎに、現タイミングt1において、補正部123は、2つ目のld命令の実行結果がキャッシュヒットであるので(予測結果)、このld命令の実行開始から現タイミングt1までの時間<t1−t0−設定された間隔(6−0−2=4サイクル)>が、このld命令の実行時間(2サイクル)より大きいかを判断する。補正部123は、2つ目のld命令の実行開始から現タイミングt1までの時間が、このld命令の実行時間(2サイクル)より大きいので、現タイミングt1を、次のmult命令の実行タイミングとする。
そして、補正部123は、2つ目のld命令の実行完了から現タイミングt1までの時間を(2サイクル)、次の命令に対する遅延時間として扱い、前命令の遅延時間pre_delay=2とする。また、補正部123は、1つ目のld命令の有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(6+0)=1サイクル)、猶予時間rep_delay=1とし、ヘルパー関数cache_ld(addr,1,2)を返す。
図11(D)は、シミュレーション装置1の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図11(D)の場合には、1つ目のld命令のペナルティによる遅延時間をそのまま加算しているため誤差が生じていることがわかる。
上述したシミュレーション装置1は、図3に示す構成例に、さらに、電力シミュレーション情報生成部を備えてもよい。電力シミュレーション情報生成部は、電力情報を得てシミュレーション情報収集部13が出力したシミュレーション情報をもとに、ブロックの実行時の消費電力を計算し、電力シミュレーション情報を出力する処理部である。電力シミュレーション情報生成部を、性能シミュレーション用のホストコードに組み込む関数(電力シミュレーション関数)として実施する例を説明すると、電力情報として、ld命令、mult命令、add命令の1実行当たりの消費電力を、例えば、4u[W]、0.5u[W]、0.3u[W]と設定する。そして、電力シミュレーション関数Host_Inst_A−C_powerは、シミュレーションで実行された各命令の実行回数にもとづいて、電力を計算する。
(本実施の形態にかかるターゲットCPUがアウト・オブ・オーダー実行の場合のシミュレーション装置100)
本実施の形態では、ターゲットCPUがアウト・オブ・オーダー実行の場合のシミュレーション装置100について説明する。まず、アウト・オブ・オーダー実行のターゲットCPUについて簡単に説明する。
図12は、ターゲットCPU例を示す説明図である。ここでは、アウト・オブ・オーダーのターゲットCPU1200の一例について、簡単に説明する。ターゲットCPU1200は、PC(Program Counter)1201と、命令フェッチ部1202と、デコード部1204と、命令キュー1209を有するリザベーションステーション1205と、を有する。ターゲットCPU1200は、複数の実行ユニット1206と、リオーダ・バッファ1207と、レジスタファイル1208と、を有する。PC1201は、レジスタの一種であり、次に実行すべき命令が格納されているメモリ1203のアドレスを保存する。命令キュー1209は、命令フェッチ部1202によって解読された命令を一時的に保存する。リザベーションステーション1205では、命令キュー1209に保存された命令のうち、実行可能になった命令を実行ユニット1206に入れるなどの制御を行う。実行ユニット1206は、例えば、各命令に応じた演算を実行可能なユニットである。リオーダ・バッファ1207は、命令フェッチ部1202によって解読された命令を一時的に保存する。リオーダ・バッファ1207は、保存した各命令について、実行待ちまたは完了のいずれかの状態を示す情報を有する。レジスタファイル1208は、複数のレジスタを有し、複数のレジスタから1つを選択して実行結果を書き込むなどの管理を行う。
ここで、ターゲットCPU1200の処理を順に説明する。
(1)ターゲットCPU1200はメモリ1203から命令フェッチ部1202によって命令フェッチ、命令デコード部1204によって命令デコードを行う。
(2)ターゲットCPU1200はデコードした命令を命令キュー1209に入れ、リオーダ・バッファ1207に記録する。
(3)ターゲットCPU1200はリザベーションステーション1205内の命令キュー1209にある命令のうち、実行可能になった命令をリザベーションステーション1205の制御により実行ユニット1206に入れる。
(4)ターゲットCPU1200は実行ユニット1206により命令の処理完了後、実行結果をリオーダ・バッファ1207に格納する。
(5)ターゲットCPU1200はリオーダ・バッファ1207内の命令のうち実行ユニット1206により処理が完了した命令の状態を完了に変更する。
(6)ターゲットCPU1200は、リオーダ・バッファ1207内の命令のうち、最も古い命令の実行が完了すると、その命令の実行結果はレジスタファイル1208に書き戻す。
(7)ターゲットCPU1200はリオーダ・バッファ1207から完了状態の命令を削除する。
そして、本実施の形態では、ターゲットCPU1200の内部状態として、命令キュー1209、実行ユニット1206の利用状態やリオーダ・バッファ1207の記憶内容などと、対象ブロックの直前に実行された命令のアドレスと、を利用する。
アウト・オブ・オーダー実行のターゲットCPU1200において、プログラムの実行順序が変化する例を説明する。例えば、プログラムが示す実行順序が以下とする。以下の命令例では()内の番号が実行順番を示し、「;」以降は注釈である。
(1)命令1:ldr r0,[r1];r0<−[r1]
(2)命令2:add r0,r0,1;r0<−r0+1
(3)命令3:mov r2,0;r2<−0
命令1は実行に時間がかかり、命令2は命令1の実行結果に依存する。そのため、プログラムが示す実行順序と、アウト・オブ・オーダー実行のターゲットCPU1200が実行する実行順序と、が異なる。以下の命令例では()内の番号が実行順番を示し、「;」以降は注釈である。
(1)命令1:ldr r0,[r1];r0<−[r1]
(2)命令3:mov r2,0;r2<−0
(3)命令2:add r0,r0,1;r0<−r0+1
また、アウト・オブ・オーダー実行のターゲットCPU1200では、命令の追い越しが発生するため、ある命令の実行が遅いことによって他のブロックにも影響を及ぼす可能性がある。プログラムに含まれるブロックの実行順序が以下であるとする。B1〜B3がブロックである。
B1:命令1(実行に時間がかかる命令)
B2:命令2(命令1に依存する命令)
B2:命令3(命令1に依存する命令)
B3:命令4(命令1に依存しない命令)
命令4は、命令1に依存せず、実行に時間がかからない命令であるため、以下のように、命令4は命令2と命令3の実行を追い越して完了する。
B1:命令1(実行に時間がかかる命令)
B3:命令4(命令1に依存しない命令)
B2:命令2(命令1に依存する命令)
B2:命令3(命令1に依存する命令)
そのため、本実施の形態にかかるシミュレーション装置100では、対象ブロックが変化した際にターゲットCPU1200の内部状態を検出し、検出した内部状態における対象ブロックに含まれる各命令の性能値を静的に算出しておく。これにより、アウト・オブ・オーダー実行のターゲットCPU1200が対象ブロックを実行した場合の性能値の見積もりの精度を向上させることができる。
(実施例1)
実施例1では、検出したターゲットCPU1200の内部状態ごとに該内部状態と該内部状態における対象ブロックに含まれる各命令の性能値との対応情報101を生成し、ブロックの性能値を該対応情報101により計算可能な実行コードecを1つ生成する。これにより、実行コードecが何度も生成されないため、ブロックの性能値の見積もりについて省メモリ化を図ることができる。
図13は、実施例1にかかるシミュレーション装置による動作例を示す説明図である。シミュレーション装置100は、アウト・オブ・オーダー実行のターゲットCPU1200がターゲットプログラムpgrを実行した場合の動作シミュレーションsimを実行するコンピュータである。シミュレーション装置100は、対象ブロックが以前に対象ブロックとなっていない場合、対象ブロックの性能値を対応情報101により計算可能な実行コードecを1つ生成する。性能値は、例えば、処理時間、クロック数などが挙げられる。さらに、シミュレーション装置100は、動作シミュレーションsimにおけるターゲットCPU1200の内部状態と、該内部状態と該内部状態での各命令の性能値との対応情報101を生成する。図13において、各対応情報101に付された「−アルファベット」は内部状態を識別するための情報である。
そして、シミュレーション装置100は、対象ブロックが以前に対象ブロックとなっている場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態ごとに対応情報101を生成する。対応情報101は、該内部状態と該内部状態における対象ブロックの各命令の性能値とを対応付ける。これにより、対象ブロックについての実行コードecが複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
また、シミュレーション装置100は、検出された内部状態が、以前に対象ブロックとなった時に検出された内部状態と同一であれば、あらたに検出された内部状態を対応付けた対応情報101を生成しない。これにより、対象ブロックについて同一の内部状態を対応付けた対応情報101が複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
(実施例1にかかるシミュレーション装置100の機能的構成例)
図14は、実施例1にかかるシミュレーション装置の機能的構成例を示すブロック図である。シミュレーション装置100は、コード変換部1401と、性能シミュレーション実行部1402と、シミュレーション情報収集部1403と、を有する。シミュレーション装置100は、ターゲットプログラムpgrと、タイミング情報1400と、予測情報4と、を得て、シミュレーション情報1430を出力する。シミュレーション装置100は、ターゲットプログラムpgrと、タイミング情報1400と、シミュレーション情報1430とは、たとえば、ディスク205などの記憶装置に記憶される。
コード変換部1401からシミュレーション情報収集部1403の処理は、例えば、ホストCPU201がアクセス可能なディスク205などの記憶装置に記憶されたシミュレーションプログラムにコーディングされる。そして、ホストCPU201が記憶装置に記憶されたシミュレーションプログラムを読み出して、シミュレーションプログラムにコーディングされている処理を実行する。これにより、コード変換部1401からシミュレーション情報収集部1403の処理が実現される。また、各部の処理結果は、例えば、RAM203、ディスク205などの記憶装置に記憶される。
コード変換部1401は、内部状態と対象ブロックの各命令の性能値とが対応付けられた対応情報101と、対応情報101によって対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出可能な実行コードecと、を生成する。具体的には、コード変換部1401は、ブロック分割部1411と、検出部1412と、判断部1413と、対応情報生成部1414と、実行コード生成部1415と、を有する。
性能シミュレーション実行部1402は、実行コードecを実行することによって、対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部1402は、コード実行部1416と、補正部1417と、を有する。
ブロック分割部1411は、シミュレーション装置100に入力されたターゲットプログラムpgrのコードを所定基準によってブロックに分割する。分割タイミングは、例えば、あらたに対象ブロックが変化した場合である。分割されるブロック単位は、例えば、ベーシックブロック単位でよく、または、予め定められた任意のコード単位でよい。
図15は、ターゲットプログラム例を示す説明図である。図15に示す例は、1×2×3×4×5×6×7×8×9×10を求めるターゲットプログラムpgrであり、1,2行目が初期化のブロックb1、3〜6行目がループ本体のブロックb2である。
まず、検出部1412は、ターゲットプログラムpgrのコードを分割して得られるブロックのうち動作シミュレーションsimの対象ブロックが変化した場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態を検出する。具体的には、例えば、検出部1412は、動作シミュレーションsimにおけるPC1201の値がつぎのブロックに含まれる命令のアドレスを示した場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態を検出する。ここでは、例えば、ブロックからブロックへ変化したとする。
図16は、ターゲットCPUの内部状態の例を示す図表である。たとえば、内部状態1600は、命令キュー1209と、実行ユニット1206と、リオーダ・バッファ1207と、の内容が検出された検出結果である。内部状態1600は、対象ブロックの前の命令が実行ユニット1206を利用している状態であることを示す。
つぎに、判断部1413は、対象ブロックが変化した場合、対象ブロックが以前に対象ブロックとなったか否かを判断する。具体的には、例えば、判断部1413は、対象ブロックについての実行コードecがディスク205などの記憶装置に記憶されているか否かを判断する。以前に対象ブロックとなっていれば、すでに対象ブロックについてコンパイル済みであるため、ディスク205などの記憶装置に対象ブロックについての実行コードecが記憶されてある。一方、以前に対象ブロックとなっていなければ、すでに対象ブロックについてコンパイルがされていないため、ディスク205などの記憶装置に対象ブロックについての実行コードecが記憶されていない。
実行コード生成部1415は、判断部1413によって以前に対象ブロックとなっていないと判断された場合、実行コードecを生成する。一方、実行コード生成部1415は、判断部1413によって以前に対象ブロックとなっていると判断された場合、実行コードecを生成しない。これにより、各ブロックについての実行コードecが複数回生成されないため、対象ブロックについての実行コードecが内部状態ごとに生成される場合と比較して、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。例えば、実行コードecのタイミングコードには、内部状態に対応付けられた対応情報101から性能値を取得するコードと、取得した性能値により対象ブロックがターゲットCPU1200に実行された場合の性能値を計算するコードと、を含む。
図17は、実行コードの例を示す図表である。実行コードecがx86命令の例を示す。実行コードecは、ターゲットプログラムpgrがコンパイルされて得られる機能コードc1と、タイミングコードc2と、を有する。機能コードc1は、実行コードecの1〜3、8行目である。タイミングコードc2は、実行コードecの4〜7行目である。実行コードec中のstateは、ターゲットCPU1200の内部状態のインデックス(内部状態A=0,B=1,…)であり、perf1は、命令1に対する性能値が格納されたアドレスを示す。これにより、実行コードecが実行されると、検出された内部状態を引数として、対応情報101から各命令の性能値が実行順に取得される。
対応情報生成部1414は、検出部1412によって検出された内部状態と、検出された内部状態における対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報101を生成する。また、対応情報生成部1414は、予測シミュレーション実行部1420を有する。具体的に、対応情報生成部1414は、対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を検出する。状況依存命令は、ターゲットCPU1200がアクセス可能な外部のハードウェア資源が関係する処理を行う命令である。具体的には、状況依存命令は、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットCPU1200の外部のハードウェア資源に依存するような処理、例えば、命令キャッシュ、データキャッシュ、TLB検索などである。また、状況依存命令は、分岐予測、コール/リターンのスタックなどの処理を行う命令である。状況依存命令は、上述した外部依存命令と同一であり、状況依存命令は、以降外部依存命令と称する。
そして、予測シミュレーション実行部1420は、検出した外部依存命令を複数通りの処理のうちの第1処理となった場合について、検出された内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う。これにより、対応情報生成部1414は、外部依存命令を複数通りの処理のうちの第1処理となった場合の対象ブロックに含まれる各命令の性能値を算出する。外部依存命令の第1処理については、入力された予測情報に定められた処理である。例えば、第1処理は、予め複数通りの処理のうちその処理となりうる確率が最も高いと推定される処理である。ここでは、第1処理を予測ケースと称する。予測ケースについては、予め予測情報4に登録されていることとする。予測情報4の詳細例については、ターゲットCPU1200がイン・オーダーの場合のシミュレーション装置100に記載された内容と同様であるため、詳細な説明を省略する。予測情報4については、予めディスク205などの記憶装置に記憶されていてもよいし、入力装置207を介して入力されてもよいし、ネットワークNETを介して他の装置から取得されてもよい。
基準となる性能値は、入力されたタイミング情報1400に含まれる。タイミング情報1400には、ターゲットプログラムpgrに含まれる各命令の基準となる性能値が含まれ、タイミング情報3と同様に補正部1417によって使用されるペナルティの性能値も含む。対応情報生成部1414は、内部状態によって、ブロック間の命令の依存関係、すなわち、命令の実行順などを判断可能である。図16に示す内部状態1600の例では、対応情報生成部1414は、ターゲットCPU1200の状態が対象ブロックの前の命令が実行ユニット1206を利用している状態であると判断でき、命令の実行順を判断できる。そして、例えば、対応情報生成部1414は、対象ブロックに含まれる各命令の基準となる性能値に対して内部状態による命令の実行順によって性能値を加算または減算することにより、対象ブロックに含まれる各命令の性能値を算出する。
そして、対応情報生成部1414は、例えば、検出された内部状態と、検出された内部状態における算出した対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報101を生成する。ここで、生成された対応情報101は、ディスク205などの記憶装置に記憶された対象ブロックについての性能値表に新たに追加される。
図18は、実施例1にかかる性能値表の例を示す図表である。実施例1にかかる性能値表1800は、内部状態、ブロックに含まれる各命令、および内部状態における各命令の性能値のフィールドを有する。各フィールドに情報が設定されることにより、レコードとして対応情報101(101−A,101−Bなど)が記憶される。性能値表1800は、ディスク205などの記憶装置によって実現される。
内部状態Aについての対応情報101−Aにおいて、内部状態Aにおける命令1の性能値は2クロックである。また、内部状態Bについての対応情報101−Bにおいて、内部状態Bにおける命令1の性能値は4クロックである。図18では、省略して命令1だけの性能値を示しているが、実際には対応情報101には機能コードに含まれる各命令についての性能値が含まれる。
また、判断部1413は、以前に対象ブロックとなっていると判断した場合、検出された内部状態が以前に対象ブロックとなった時に検出された内部状態と同一であるか否かを判断する。具体的には、判断部1413は、検出された内部状態を検索キーとして、性能値表1800から検索キーと一致する内部状態を有する対応情報101を検索する。例えば、判断部1413は、一致する内部状態を有する対応情報101が検索された場合、以前に対象ブロックとなった時に検出された内部状態と同一であると判断する。例えば、判断部1413は、一致する内部状態を有する対応情報101が検索されなかった場合、以前に対象ブロックとなった時に検出された内部状態と同一でないと判断する。
また、対応情報生成部1414は、以前に対象ブロックとなった時に検出された内部状態と同一であると判断部1413によって判断された場合、あらたに対応情報101を生成しない。一方、対応情報生成部1414は、以前に対象ブロックとなった時に検出された内部状態と同一でないと判断部1413によって判断された場合、あらたに検出された内部状態によってあらたに対応情報101を生成する。ここでの対応情報101は、あらたに検出された内部状態と検出された内部状態における対象ブロック内の各命令の性能値と、を対応付ける。これにより、対象ブロックについて同一の内部状態が複数回検出されたとしても、同一の内部状態における対応情報101の生成は1回であるため、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。
コード実行部1416は、実行コード生成部1415によって生成された実行コードecを実行する。性能シミュレーション実行部1402は、実行コードecを実行することによって、対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部1402は、コード実行部1416と、補正部1417と、を有する。
コード実行部1416は、対応情報生成部1414によって生成された対応情報101を用いて実行コードecを実行する。また、コード実行部1416は、以前に対象ブロックとなっていると判断され、かつ以前に対象ブロックとなった時に検出された内部状態と同一であると判断された場合、以前に対象ブロックとなった時に検出された内部状態を対応付けた対応情報101を取得する。そして、コード実行部1416は、検出された内部状態と取得した対応情報101とを用いて実行コードecを実行する。
補正部1417は、実行コードecをコード実行部1416による実行中に外部依存命令を検出すると、動作シミュレーションsimにおける実行結果において、外部依存命令が複数通りの処理のうち予測ケースである第1処理と異なる第2処理であるか否かを判断する。補正部1417は、動作シミュレーションsimにおける実行結果において外部依存命令が第2処理である場合に、第2処理に対応する所定性能値によって外部依存命令の性能値を補正する。所定性能値は、タイミング情報1400に含まれるペナルティの性能値であり、外部依存命令の種類と第2処理とに応じて予め定められた値である。これにより、補正部1417は、対象ブロックがターゲットCPU1200に実行された場合の性能値を補正する。補正部1417による詳細な補正方法については、ターゲットCPU1200がイン・オーダーの場合のシミュレーション装置1に記載された内容と同様であるため、詳細な説明を省略する。
また、シミュレーション情報収集部1403は、性能シミュレーション実行部1402による実行結果として、各命令の実行時間を含むログ情報であるシミュレーション情報1430を収集する。シミュレーション情報1430については、ディスク205などの記憶装置に記憶させてもよいし、ディスプレイなどの出力装置208によって出力してもよいし、ネットワークNETを介して他の装置に出力してもよい。
(実施例1にかかるシミュレーション装置100によるシミュレーション処理手順例)
図19および20は、シミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。まず、シミュレーション装置100は、ターゲットCPU1200のPC1201がつぎのブロック(対象ブロック)を示すアドレスをポイントしたか否かを判断する(ステップS1901)。シミュレーション装置100は、ステップS1901によって対象ブロックが変化したか否かを判断する。
つぎのブロック(対象ブロック)を示すアドレスをポイントしていない場合(ステップS1901:No)、シミュレーション装置100は、ステップS1901へ戻る。一方、つぎのブロック(対象ブロック)を示すアドレスをポイントした場合(ステップS1901:Yes)、シミュレーション装置100は、ターゲットCPU1200の内部状態を検出する(ステップS1902)。つぎに、シミュレーション装置100は、対象ブロックがコンパイル済みか否かを判断する(ステップS1903)。
コンパイル済みでないと判断された場合(ステップS1903:No)、シミュレーション装置100は、ターゲットプログラムpgrから対象ブロックを分割して取得する(ステップS2001)。シミュレーション装置100は、対象ブロックに含まれる外部依存命令を検出し(ステップS2002)、予測情報4から検出した外部依存命令についての予測ケースを取得する(ステップS2003)。シミュレーション装置100は、対象ブロックをコンパイルすることによって得られるコードと、予測ケースでの対象ブロックの性能値を対応情報101により計算可能なコードと、を含む実行コードecを生成して出力する(ステップS2004)。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
シミュレーション装置100は、予測ケースについて、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う(ステップS2005)。シミュレーション装置100は、検出した内部状態と、タイミング解析結果である対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報101を生成して性能値表1800に記録し(ステップS2006)、ステップS1909へ移行する。
コンパイル済みであると判断された場合(ステップS1903:Yes)、シミュレーション装置100は、対象ブロックについての性能値表1800に登録された対応情報101が対応付けた内部状態のうち、未選択の内部状態があるか否かを判断する(ステップS1904)。未選択の内部状態がある場合(ステップS1904:Yes)、シミュレーション装置100は、未選択の内部状態のうち、登録順に内部状態を1つ選択する(ステップS1905)。
シミュレーション装置100は、検出した内部状態と、選択した内部状態と、を比較する(ステップS1906)。そして、シミュレーション装置100は、一致しているか否かを判断する(ステップS1907)。一致していると判断された場合(ステップS1907:Yes)、シミュレーション装置100は、選択した内部状態を対応付けた対応情報101を性能値表1800から取得する(ステップS1908)。そして、シミュレーション装置100は、検出した内部状態と取得した対応情報101を用いて実行コードecの実行処理を行い(ステップS1909)、S1901へ戻る。一方、一致していないと判断された場合(ステップS1907:No)、シミュレーション装置100は、ステップS1904へ戻る。一方、未選択の内部状態がない場合(ステップS1904:No)、シミュレーション装置100は、ステップS2005へ移行する。
図21は、図19で示した実行処理の詳細な説明を示すフローチャートである。シミュレーション装置100は、検出した内部状態と対応情報101を用いて、実行コードecの各命令を順に実行する(ステップS2101)。シミュレーション装置100は、対象ブロックに含まれる外部依存命令を実行したか否かを判断する(ステップS2102)。
対象ブロックに含まれる外部依存命令を実行していないと判断された場合(ステップS2102:No)、シミュレーション装置100は、ステップS2104へ移行する。
対象ブロックに含まれる外部依存命令を実行したと判断された場合(ステップS2102:Yes)、シミュレーション装置100は、外部依存命令に応じた補正部による補正処理を実行する(ステップS2103)。そして、シミュレーション装置100は、実行結果を出力する(ステップS2104)。つぎに、シミュレーション装置100は、対象ブロックに含まれる命令の実行が終了したか否かを判断する(ステップS2105)。実行が終了したと判断された場合(ステップS2105:Yes)、シミュレーション装置100は、一連の処理を終了する。一方、実行が終了していないと判断された場合(ステップS2105:No)、ステップS2101へ戻る。
図22は、図21で示した補正部による補正処理の詳細な説明を示すフローチャートである。補正部1417とは、ヘルパー関数である。ここでは、ld命令についてのキャッシュアクセスがヒットしたか否かについてのヘルパー関数を例に挙げて説明する。
まず、シミュレーション装置100は、キャッシュアクセスが要求されているか否かを判断する(ステップS2201)。キャッシュアクセスが要求されていない場合(ステップS2201:No)、ステップS2205へ移行する。キャッシュアクセスが要求されている場合(ステップS2201:Yes)、ステップS2203におけるシミュレーションは、動作シミュレーションsimである。シミュレーション装置100は、キャッシュアクセスの結果は予測ケースと同じか否かを判断する(ステップS2202)。
同じでないと判断された場合(ステップS2202:No)、シミュレーション装置100は、性能値の補正を行う(ステップS2203)。そして、シミュレーション装置100は、補正された性能値を出力し(ステップS2204)、一連の処理を終了する。同じであると判断された場合(ステップS2202:Yes)、シミュレーション装置100は、対応情報101に含まれる予測された性能値を出力し(ステップS2205)、一連の処理を終了する。
以上説明したように、実施例1にかかるシミュレーション装置100は、検出したCPUの内部状態と該内部状態での各命令の性能値との対応情報101を生成し、ブロックの性能値を該対応情報101により計算可能な実行コードecを実行する。内部状態を考慮した性能値の見積もりを行うことができるため、アウト・オブ・オーダー実行の性能値の見積もりの精度を向上させることができる。
また、実施例1にかかるシミュレーション装置100は、検出したCPUの内部状態ごとに該内部状態と該内部状態での各命令の性能値との対応情報101を生成し、ブロックの性能値を該対応情報101により計算可能な実行コードecを1つ生成する。これにより、実行コードecが何度も生成されないため、ブロックの性能値の見積もり時に省メモリ化を図ることができる。
また、実施例1にかかるシミュレーション装置100は、検出したCPUの内部状態を対応付けた対応情報101がすでにある場合、あらたに対応情報101を生成しない。これにより、対象ブロックについての同一の内部状態を対応付けた対応情報101が何度も生成されないため、ブロックの性能値の見積もり時に省メモリ化を図ることができる。
(実施例2)
実施例2では、第1ブロックについての内部状態と性能値とを対応付けた対応情報に、第1ブロックのつぎに実行する第2ブロックについて以前実行された時に生成された対応情報を関連付けておく。これにより、性能値表から検出された内部状態を対応付けた対応情報の検索に要する処理を高速化することができる。実施例2にかかる性能値表は図25に示す。また、実施例2では、実施例1で説明した構成や機能については同一符号を付し、詳細な説明を省略する。
図23は、実施例2にかかるシミュレーション装置による動作例を示す説明図である。シミュレーション装置100は、第1ブロックについての内部状態と性能値とを対応付けた対応情報2300に、第1ブロックのつぎに実行する第2ブロックについて以前実行された時に生成された対応情報2300を関連付けておく。具体的には、各対応情報2300が内部状態と性能値とつぎのブロックのポインタとつぎの対応情報2300のポインタとを有する。つぎのブロックのポインタは、つぎのブロックについての実行コードecが記憶された記憶領域を示すアドレスである。つぎの対応情報2300のポインタは、生成されたつぎのブロックについての対応情報2300が記憶された記憶領域を示すアドレスである。図23の例では、各実行コードec、機能コードc1、タイミングコードc2、対応情報2300に付された「−番号」はいずれのブロックの対応情報であるかを示す。
図23の例では、各対応情報2300に付された「−アルファベット」は内部状態を識別するための情報である。図23の例では、対応情報2300−1−A内のつぎのブロックのポインタとして、第2ブロックについての実行コードec−2のポインタが設定される。さらに、対応情報2300−1−A内のつぎの対応情報のポインタとして、第2ブロックについての対応情報2300−2−xが設定される。
シミュレーション装置100は、第2ブロックがあらたに対象ブロックとなったときに検出した内部状態が、第1ブロックについての対応情報2300に関連付けられた第2ブロックについての対応情報2300が対応付けた内部状態と一致するか否かを判断する。
そして、一致する場合、シミュレーション装置100は、関連付けられた対応情報2300を用いて第2ブロックについての実行コードecを実行する。これにより、使用される可能性が高い対応情報2300を関連付けておくことにより、性能値表から検出された内部状態を対応付けた対応情報2300の検索に要する処理を高速化することができる。
(実施例2にかかるシミュレーション装置100の機能的構成例)
図24は、実施例2にかかるシミュレーション装置の機能的構成例を示すブロック図である。シミュレーション装置100は、コード変換部1401と、性能シミュレーション実行部1402と、シミュレーション情報収集部1403と、を有する。シミュレーション装置100は、ターゲットプログラムpgrと、タイミング情報1400と、予測情報4と、を得て、シミュレーション情報1430を出力する。
コード変換部1401からシミュレーション情報収集部1403の処理は、例えば、CPUがアクセス可能なディスク205などの記憶装置に記憶されたシミュレーションプログラムにコーディングされる。そして、CPUが記憶装置に記憶されたシミュレーションプログラムを読み出して、シミュレーションプログラムにコーディングされている処理を実行する。これにより、コード変換部1401からシミュレーション情報収集部1403の処理が実現される。
コード変換部1401は、内部状態と性能値とが対応付けられた対応情報2300と、対応情報2300によって対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出可能な実行コードecと、を生成する。具体的には、コード変換部1401は、ブロック分割部1411と、検出部1412と、判断部1413と、対応情報生成部1414と、実行コード生成部1415と、関連付け部2401と、を有する。
性能シミュレーション実行部1402は、実行コードecを実行することによって、対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部1402は、コード実行部1416と、補正部1417と、を有する。
関連付け部2401は、対象ブロックが第1ブロックから第2ブロックに変化した場合、生成された第1ブロックについての対応情報2300に、生成された第2ブロックについての対応情報2300を関連付ける。具体的には、関連付け部2401は、第1ブロックについての対応情報2300に、第2ブロックのポインタと、対応情報生成部1414によって生成された第2ブロックについての対応情報2300のポインタと、を関連付ける。
図25は、実施例2にかかる性能値表例を示す説明図である。実施例2における性能値表2500は、内部状態、命令、性能値、つぎのブロックのポインタ、つぎの対応情報のポインタのフィールドを有する。各フィールドに情報が設定されることにより、対応情報2300がレコードとして記憶される。
内部状態、命令、性能値のフィールドは、実施例1と同一であるため、詳細な説明を省略する。つぎのブロックのポインタのフィールドには、以前に対象ブロックとなったときにつぎに対象ブロックとなったブロックのポインタが設定される。つぎの対応情報のポインタのフィールドには、つぎに対象ブロックとなったときに使用された対応情報2300のポインタが設定される。例えば、対応情報生成部1414は、生成する対応情報2300のつぎに対象ブロックのポインタおよびつぎの対応情報2300のポインタとのフィールドには「null」を設定する。
対応情報2300−Aでは、つぎのブロックのポインタのフィールドに「0x80005000」が設定され、つぎの対応情報のポインタのフィールドに「0x80006000」が設定される。対応情報2300−Bでは、つぎのブロックのポインタのフィールドに「0x80001000」が設定され、つぎの対応情報のポインタのフィールドに「0x80001500」が設定される。
また、例えば、つぎの対応情報のポインタのフィールドには、例えば、つぎの対応情報2300へのオフセットが設定されてもよい。例えば、オフセットは、つぎのブロックのポインタとつぎの対応情報2300のポインタとの差である。例えば、対応情報2300−Aであれば、つぎのブロックのポインタのフィールドに「0x80005000」が設定され、つぎの対応情報のポインタのフィールドに「0x1000」が設定される。これにより、つぎの対応情報2300のポインタが「0x80006000」であると判断される。例えば、対応情報2300−Bであれば、つぎのブロックのポインタのフィールドに「0x80001000」が設定され、つぎの対応情報のポインタのフィールドに「0x500」が設定される。これにより、つぎの対応情報のポインタが「0x80001500」であると判断される。このように、つぎの対応情報2300へのオフセットが設定されることにより、対応情報2300の情報量を削減することができ、省メモリ化を図ることができる。
また、対象ブロックが第3ブロックから第4ブロックに変化した場合、判断部1413は、以前にも第3ブロックから第4ブロックに変化したか否かを判断する。具体的には、判断部1413は、第3ブロックについての対応情報2300に含まれるつぎのブロックのポインタが第4ブロックのポインタと一致しているか否かを判断する。判断部1413は、一致していないと判断した場合、以前に第3ブロックから第4ブロックに変化していないと判断し、実施例1と同様に以前に第4ブロックが対象ブロックになったか否かを判断する。以前に第4ブロックが対象ブロックになったか否かの判断後の処理については実施例1と同様である。
一方、判断部1413は、一致していると判断した場合、以前にも第3ブロックから第4ブロックに変化したと判断する。判断部1413は、第4ブロックが以前に対象ブロックになった時に第3ブロックについての対応情報2300に関連付けられた対応情報2300が対応付ける内部状態が、第4ブロックについて検出された内部状態と一致しているか否かを判断する。判断部1413は、第3ブロックについての対応情報2300に含まれるつぎの対応情報のポインタが示す対応情報2300が対応付けた内部状態と、検出部1412によって第4ブロックについて検出された内部状態と、が一致しているか否かを判断する。
判断部1413は、一致していないと判断された場合、実施例1と同様に以前に第4ブロックが対象ブロックになったか否かを判断する。以前に第4ブロックが対象ブロックになったか否かの判断後の処理については実施例1と同様であるため、詳細な説明を省略する。
一方、判断部1413によって一致していると判断された場合、性能シミュレーション実行部1402は、第4ブロックについての実行コードecを、第3ブロックについて生成された対応情報2300に関連付けられた対応情報2300を用いて実行する。
これにより、使用される可能性が高い対応情報2300を関連付けておくことにより、性能値表2500から検出された内部状態を対応付けた対応情報2300の検索に要する処理を高速化することができる。
(実施例2にかかるシミュレーション装置100によるシミュレーション処理手順例)
図26〜図28は、実施例2にかかるシミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。まず、シミュレーション装置100は、ターゲットCPU1200のPC1201がつぎのブロック(対象ブロック)を示すアドレスをポイントしたか否かを判断する(ステップS2601)。シミュレーション装置100は、ステップS2601によって対象ブロックが変化したか否かを判断する。
つぎのブロック(対象ブロック)を示すアドレスをポイントしていない場合(ステップS2601:No)、シミュレーション装置100は、ステップS2601へ戻る。一方、つぎのブロック(対象ブロック)を示すアドレスをポイントした場合(ステップS2601:Yes)、シミュレーション装置100は、ターゲットCPU1200の内部状態を検出する(ステップS2602)。つぎに、シミュレーション装置100は、対象ブロックがコンパイル済みか否かを判断する(ステップS2603)。
コンパイル済みでないと判断された場合(ステップS2603:No)、シミュレーション装置100は、ターゲットプログラムpgrから対象ブロックを分割して取得する(ステップS2801)。シミュレーション装置100は、対象ブロックに含まれる外部依存命令を検出し(ステップS2802)、予測情報4から検出した外部依存命令についての予測ケースを取得する(ステップS2803)。シミュレーション装置100は、対象ブロックをコンパイルすることによって得られるコードと、予測ケースでの対象ブロックの性能値を対応情報2300により計算可能なコードと、を含む実行コードecを生成して出力する(ステップS2804)。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
シミュレーション装置100は、予測ケースについて、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う(ステップS2805)。シミュレーション装置100は、検出した内部状態と、タイミング解析結果である対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報2300を生成して性能値表2500に記録する(ステップS2806)。そして、シミュレーション装置100は、対象ブロックの直前のブロックについての対応情報2300に、対象ブロックのポインタと、生成した対応情報2300のポインタと、を関連付け(ステップS2807)、ステップS2707へ移行する。対象ブロックの直前のブロックについての対応情報2300は、対象ブロックの直前のブロックの性能値の算出に用いた対応情報2300である。
コンパイル済みであると判断された場合(ステップS2603:Yes)、シミュレーション装置100は、対象ブロックを示すアドレスと、直前のブロックについての対応情報2300のつぎのブロックのポインタと、を比較する(ステップS2604)。対象ブロックを示すアドレスとは、対象ブロックについての実行コードecが記憶された記憶領域のアドレスである。シミュレーション装置100は、対象ブロックが示すアドレスと、直前のブロックについての対応情報2300のつぎのブロックのポインタと、が一致するか否かを判断する(ステップS2605)。一致すると判断された場合(ステップS2605:Yes)、シミュレーション装置100は、直前のブロックに関連付けられたポインタが示す対応情報2300が対応付けた内部状態と、検出した内部状態と、を比較する(ステップS2606)。
そして、シミュレーション装置100は、直前のブロックに関連付けられたポインタが示す対応情報2300が対応付けた内部状態と、検出した内部状態と、が一致するか否かを判断する(ステップS2607)。一致すると判断された場合(ステップS2607:Yes)、シミュレーション装置100は、直前のブロックに関連付けられたポインタが示す対応情報2300を取得し(ステップS2608)、ステップS2707へ移行する。
一方、ステップS2605において一致しないと判断された場合(ステップS2605:No)、またはステップS2607において一致しないと判断された場合(ステップS2607:No)のつぎに、シミュレーション装置100は、ステップS2701へ移行する。シミュレーション装置100は、対象ブロックについての性能値表2500に登録された対応情報2300が対応付けた内部状態のうち、未選択の内部状態があるか否かを判断する(ステップS2701)。
未選択の内部状態がない場合(ステップS2701:No)、ステップS2805へ移行する。これにより、対象ブロックについて検出した内部状態ごとに対応情報2300が生成され、対象ブロックについて実行コードecは1回だけ生成される。
未選択の内部状態がある場合(ステップS2701:Yes)、シミュレーション装置100は、未選択の内部状態のうち、登録順に内部状態を選択する(ステップS2702)。シミュレーション装置100は、検出した内部状態と、選択した内部状態と、を比較する(ステップS2703)。そして、シミュレーション装置100は、一致しているか否かを判断する(ステップS2704)。一致していると判断された場合(ステップS2704:Yes)、シミュレーション装置100は、選択した内部状態を対応付けた対応情報2300を性能値表2500から取得する(ステップS2705)。
シミュレーション装置100は、対象ブロックの直前のブロックについての対応情報2300に、対象ブロックのポインタと、取得した対応情報のポインタと、を関連付ける(ステップS2706)。そして、シミュレーション装置100は、取得した対応情報2300を用いて実行コードecの実行処理を行い(ステップS2707)、S2601へ戻る。一方、一致していないと判断された場合(ステップS2704:No)、シミュレーション装置100は、ステップS2701へ戻る。
以上説明したように、実施例2にかかるシミュレーション装置100は、第1ブロックについての内部状態と性能値とを対応付けた対応情報2300に、第1ブロックのつぎに実行する第2ブロックについての対応情報2300を関連付けておく。これにより、性能値表から検出された内部状態を対応付けた対応情報2300の検索に要する処理を高速化することができる。したがって、性能の見積もりを高速化することができる。
また、実施例1と実施例2について、実行時間やサイクル数などの性能値に代わって消費電力量の見積もりを行ってもよい。たとえば、消費電力量の見積もりが行われる場合、各命令についての基準となる消費電力量、ターゲットCPU内の各部の消費電力量などが予め用意されていることとする。
なお、実施例1および実施例2で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ディスク205やフラッシュメモリなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本シミュレーションプログラムは、インターネット等のネットワークNETを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション装置であって、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出する検出部と、
前記検出部によって検出された前記内部状態と、検出された前記内部状態における前記対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報を生成する対応情報生成部と、
前記対象ブロックが前記プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、前記検出部によって検出された前記内部状態と前記対応情報生成部によって前記対象ブロックについて生成された前記対応情報とを用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の性能値を計算する実行部と、
を有することを特徴とするシミュレーション装置。
(付記2)前記対象ブロックが変化した場合、前記対象ブロックが以前に対象ブロックとなったか否かを判断する判断部と、
前記判断部によって以前に前記対象ブロックとなっていないと判断された場合、前記実行コードを生成し、前記判断部によって以前に前記対象ブロックとなっていると判断された場合、前記実行コードを生成しない実行コード生成部と、
を有し、
前記実行部は、前記実行コード生成部によって生成された前記実行コードを実行することを特徴とする付記1に記載のシミュレーション装置。
(付記3)前記判断部は、以前に前記対象ブロックとなっていると判断した場合、検出された前記内部状態が、以前に前記対象ブロックとなった時に検出された前記内部状態と同一であるか否かを判断し、
前記対応情報生成部は、前記判断部によって以前に前記対象ブロックとなっていると判断され、かつ以前に前記対象ブロックとなった時に検出された前記内部状態と同一であると判断された場合、前記対応情報を生成しないことを特徴とする付記2に記載のシミュレーション装置。
(付記4)前記対象ブロックが第1ブロックから第2ブロックに変化した場合、前記対応情報生成部によって生成された前記第1ブロックについての前記対応情報に、前記対応情報生成部によって生成された前記第2ブロックについての前記対応情報を関連付ける関連付け部を有し、
前記対象ブロックが第3ブロックから第4ブロックに変化した場合、前記判断部は、以前にも前記第3ブロックから前記第4ブロックに変化したか否かを判断し、以前にも前記第3ブロックから前記第4ブロックに変化したと判断した場合、前記第4ブロックが以前に前記対象ブロックになった時に前記関連付け部によって前記第3ブロックについての前記対応情報に関連付けられた前記対応情報が対応付ける前記内部状態が、前記第4ブロックについて検出された前記内部状態と一致しているか否かを判断し、
前記実行部は、前記判断部によって一致していると判断された場合、前記第4ブロックについての前記実行コードを、前記第3ブロックについて生成された前記対応情報に関連付けられた前記対応情報を用いて実行することを特徴とする付記3に記載のシミュレーション装置。
(付記5)前記実行コードは、前記内部状態に対応付けられた前記対応情報から性能値を取得するコードと、取得した前記性能値により前記対象ブロックが前記プロセッサに実行された場合の性能値を計算するコードと、を含むことを特徴とする付記1〜4のいずれか一つに記載のシミュレーション装置。
(付記6)前記対応情報では、検出された前記内部状態と、前記対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を前記複数通りの処理のうちの第1処理となった場合の前記対象ブロックに含まれる各命令の性能値と、が対応付けられ、
前記実行部は、前記動作シミュレーションにおいて前記状況依存命令が前記複数通りの処理のうち前記第1処理と異なる第2処理の場合に、前記第2処理に対応する所定性能値によって前記状況依存命令の性能値を補正して前記対象ブロックが前記プロセッサに実行された場合の性能値を計算することを特徴とする付記1〜5のいずれか一つに記載のシミュレーション装置。
(付記7)アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション装置であって、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出する検出部と、
前記検出部によって検出された前記内部状態と、検出された前記内部状態における前記対象ブロックに含まれる各命令の前記プロセッサでの実行に要する消費電力量と、を対応付けた対応情報を生成する対応情報生成部と、
前記対象ブロックが前記プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、前記検出部によって検出された前記内部状態と前記対応情報生成部によって前記対象ブロックについて生成された前記対応情報とを用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の消費電力量を計算する実行部と、
を有することを特徴とするシミュレーション装置。
(付記8)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション方法であって、
第2プロセッサが、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の性能値を計算する、
処理を実行することを特徴とするシミュレーション方法。
(付記9)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション方法であって、
第2プロセッサが、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第1プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を計算する、
処理を実行することを特徴とするシミュレーション方法。
(付記10)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムであって、
第2プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の性能値を計算する、
処理を実行させることを特徴とするシミュレーションプログラム。
(付記11)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムであって、
第2プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第1プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を計算する、
処理を実行させることを特徴とするシミュレーションプログラム。
(付記12)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムを記録した記録媒体であって、
第2プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の性能値を計算する、
処理を実行させるシミュレーションプログラムを記録したことを特徴とする記録媒体。
(付記13)アウト・オブ・オーダー実行の第1プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムを記録した記録媒体であって、
第2プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第1プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第1プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第1プロセッサに実行された場合の消費電力量を計算する、
処理を実行させるシミュレーションプログラムを記録したことを特徴とする記録媒体。