JP6015865B2 - シミュレーション装置、シミュレーション方法およびシミュレーションプログラム - Google Patents

シミュレーション装置、シミュレーション方法およびシミュレーションプログラム Download PDF

Info

Publication number
JP6015865B2
JP6015865B2 JP2015538939A JP2015538939A JP6015865B2 JP 6015865 B2 JP6015865 B2 JP 6015865B2 JP 2015538939 A JP2015538939 A JP 2015538939A JP 2015538939 A JP2015538939 A JP 2015538939A JP 6015865 B2 JP6015865 B2 JP 6015865B2
Authority
JP
Japan
Prior art keywords
execution
instruction
target block
processing target
simulation
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2015538939A
Other languages
English (en)
Other versions
JPWO2015045472A1 (ja
Inventor
慎哉 桑村
慎哉 桑村
敦 池
敦 池
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Application granted granted Critical
Publication of JP6015865B2 publication Critical patent/JP6015865B2/ja
Publication of JPWO2015045472A1 publication Critical patent/JPWO2015045472A1/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • G06F9/45516Runtime code conversion or optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3409Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment
    • G06F11/3419Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment for performance assessment by assessing time
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • G06F11/3457Performance evaluation by simulation

Description

本発明は、シミュレーション装置、シミュレーション方法およびシミュレーションプログラムに関する。
システムが複雑化して、複数プロセッサ(例えばCPU)を搭載するマルチコア構成が一般的となっている現況では、各コア(CPU)の機能、性能等のシミュレーション処理について、より高い処理速度や処理精度を実現することが要求されている。機能、性能のシミュレーションで、評価対象となるターゲットCPUを、ホストCPUで動作させる場合のターゲットCPUの命令コード(ターゲットコード)からホストCPUの命令コード(ホストコード)への変換手法として、インタープリタ方式またはJIT(Just−in−Time)コンパイラ方式を採用することが知られている。
JITコンパイラ方式によるシミュレーションでは、シミュレーション対象である実行中のプログラムに出現するターゲットCPUの命令を、シミュレーションを実行するホストCPUの命令に置き換え、以降では、その置き換えた命令を実行する。そのため、JITコンパイラ方式の処理は、インタープリタ方式の処理に比べて高速であり、CPUの機能シミュレーションでは、特に高速性が求められる場合にJITコンパイラ方式が採用されていた。
David Thach et al.「Fast Cycle Estimation Methodology for Instruction−Level Emulator」EDAA、2012、ISBN:978−3−9810801−8−6
しかしながら、従来技術によれば、アウト・オブ・オーダー実行のプロセッサに対する性能シミュレーションにJITコンパイラ方式を採用した場合、性能シミュレーションの精度が低下するという問題がある。例えば、アウト・オブ・オーダー実行のプロセッサでは、命令の追い越しにより、ある命令が性能に影響を与える範囲が広くなり、性能シミュレーションの精度が低下する。
一つの側面では、本発明は、プロセッサの性能の見積もり精度の向上を図ることができるシミュレーション装置、シミュレーション方法およびシミュレーションプログラムを提供することを目的とする。
本発明の一側面によれば、アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成し、生成した前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出するシミュレーション装置、シミュレーション方法およびシミュレーションプログラムが提案される。
本発明の一態様によれば、プロセッサの性能の見積もり精度の向上を図ることができるという効果を奏する。
図1は、実施の形態1にかかるシミュレーション方法の一実施例を示す説明図である。 図2は、シミュレーション装置100のハードウェア構成例を示すブロック図である。 図3は、シミュレーション装置100の機能的構成例を示すブロック図である。 図4は、ホストコードリスト400の記憶内容の一例を示す説明図(その1)である。 図5は、タイミングコードが組み込まれる例を示す説明図である。 図6は、ターゲットCPUの構成例を示すブロック図である。 図7は、ターゲットコードの一例を示す説明図(その1)である。 図8は、ターゲットCPUの内部状態の変化例を示す説明図(その1)である。 図9は、ターゲットCPUの内部状態の変化例を示す説明図(その2)である。 図10は、ターゲットCPUの内部状態の変化例を示す説明図(その3)である。 図11は、ターゲットCPUの内部状態の変化例を示す説明図(その4)である。 図12は、ターゲットCPUの内部状態の変化例を示す説明図(その5)である。 図13は、ターゲットCPUの内部状態の変化例を示す説明図(その6)である。 図14は、ターゲットCPUの内部状態の変化例を示す説明図(その7)である。 図15は、ターゲットCPUの内部状態の変化例を示す説明図(その8)である。 図16は、ホストコードhcの具体例を示す説明図(その1)である。 図17は、ターゲットコードの一例を示す説明図(その2)である。 図18は、ホストコードhcの具体例を示す説明図(その2)である。 図19は、ターゲットCPUの内部状態の変化例を示す説明図(その9)である。 図20は、ターゲットCPUの内部状態の変化例を示す説明図(その10)である。 図21は、ターゲットCPUの内部状態の変化例を示す説明図(その11)である。 図22は、ターゲットCPUの内部状態の変化例を示す説明図(その12)である。 図23は、補正部322の処理動作を示す説明図である。 図24は、ld命令の実行結果に対する補正例を示す説明図(その1)である。 図25は、ld命令の実行結果に対する補正例を示す説明図(その2)である。 図26は、ld命令の実行結果に対する補正例を示す説明図(その3)である。 図27は、コード変換部310の処理手順の一例を示すフローチャートである。 図28は、シミュレーション実行部320の処理手順の一例を示すフローチャートである。 図29は、補正部322の処理手順の一例を示すフローチャートである。 図30は、ターゲットCPUの命令キューの状態の変化例を示す説明図である。 図31は、ターゲットコードの一例を示す説明図(その3)である。 図32は、ターゲットCPUの内部状態の変化例を示す説明図(その13)である。 図33は、ホストコードリスト400の記憶内容の一例を示す説明図(その2)である。 図34は、資源使用量情報の生成例を示す説明図である。 図35は、実施の形態2にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。 図36は、実施の形態2にかかるシミュレーション装置100のシミュレーション実行部320の処理手順の一例を示すフローチャートである。 図37は、ホストコードhcの具体例を示す説明図(その3)である。 図38は、実施の形態3にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。 図39は、実施の形態4にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。 図40は、実施の形態4にかかるシミュレーション装置100のシミュレーション実行部320の処理手順の一例を示すフローチャートである。
(実施の形態1)
(シミュレーション方法の一実施例)
図1は、実施の形態1にかかるシミュレーション方法の一実施例を示す説明図である。図1において、シミュレーション装置100は、アウト・オブ・オーダー実行のプロセッサの性能シミュレーションを実行するコンピュータである。ここで、アウト・オブ・オーダー実行とは、プロセッサの命令実行効率を向上させるための技術であり、プログラムに記述された命令の順番に関係なく、処理に必要なデータが揃った命令から実行する技術である。また、性能シミュレーションとは、プロセッサがプログラムを実行した場合の実行時間(例えば、サイクル数)を見積もるシミュレーションである。
以下の説明では、性能評価対象となるアウト・オブ・オーダー実行のプロセッサを「ターゲットCPU(Central Processing Unit)」と表記し、シミュレーション装置100のプロセッサを「ホストCPU」と表記する場合がある。また、ターゲットCPUが実行するプログラムを「ターゲットプログラムTP」と表記する場合がある。
ターゲットCPUは、例えば、ARM(登録商標)アーキテクチャのプロセッサである。ホストCPUは、例えば、x86アーキテクチャのプロセッサである。すなわち、ターゲットCPUとホストCPUのアーキテクチャが異なる。このため、シミュレーション装置100は、ホストCPUによってシミュレーションを行う際にターゲットCPUのターゲットプログラムTPをホストCPUが実行可能なコードへ変換する。
本実施の形態では、ターゲットプログラムTPの変換手法として、JITコンパイラ方式を採用する。JITコンパイラ方式によるシミュレーションでは、実行中のプログラムに出現するターゲットCPUの命令を、シミュレーションを実行するホストCPUの命令に置き換え、以降では、その置き換えた命令を実行することにより、処理の高速化を図ることができる。
具体的には、例えば、シミュレーション装置100は、ターゲットCPUのターゲットプログラムTPの実行時に、ターゲットプログラムTPのコードを区切って所定のブロックBに分割する。次に、シミュレーション装置100は、分割したブロックBについてホストCPUが実行可能なホストコードhcを生成する。そして、シミュレーション装置100は、生成したホストコードhcを実行することにより、ターゲットCPUがブロックBを実行した場合の実行時間を見積もる。
ホストコードhcは、機能コードfcとタイミングコードtcを含む、ホストCPUが実行可能なコードである。機能コードfcは、ターゲットプログラムTPから分割したブロックBをコンパイルすることによって得られるホストCPUが実行可能なコードである。タイミングコードtcは、ターゲットCPUがブロックBを実行した場合の実行時間をホストCPUが計算可能なコードである。
ここで、アウト・オブ・オーダー実行のターゲットCPUでは、ターゲットプログラムTPに記述された命令の順番に関係なく、処理に必要なデータが揃った命令から実行される。このため、命令の追い越しにより、ターゲットCPUが各ブロックBの実行を開始する時のターゲットCPUの内部状態が異なる場合がある。
ターゲットCPUの内部状態とは、ターゲットCPUがアウト・オブ・オーダー実行を実現するために有するモジュールの状態を示す。例えば、ターゲットCPUの内部状態は、処理対象ブロックの直前に実行した命令のアドレス、ターゲットCPUの命令キューの状態、実行ユニットの状態、リオーダ・バッファの状態などである。
命令キューは、デコードされた命令を一時的に保存する記憶領域である。実行ユニットは、ALU(Arithmetic Logic Unit)、ロード・ストアユニット、分岐ユニットなどの各命令を実行するモジュールである。リオーダ・バッファは、デコードされた命令を一時的に保存する記憶領域であり、格納した各命令について、実行待ちまたは完了のいずれかの状態を示す情報を有する。
ターゲットCPUの内部状態が異なると、ブロックB内の命令の実行順序が変化するため、同一ブロックBであっても、ターゲットCPUの内部状態に応じてブロックBの実行時間が異なる場合がある。すなわち、ターゲットCPUの内部状態は、命令の実行時間(性能値)に影響を与える情報となる。例えば、ターゲットプログラムTPに記述された順にブロックB内の命令を実行した場合のブロックBの実行時間を見積もると、処理に必要なデータが揃った命令から順次実行する実チップ(ターゲットCPU)に比べて遅い実行時間を見積もることになる場合がある。
そこで、本実施の形態では、シミュレーション装置100は、ターゲットCPUの内部状態に基づいて、ターゲットCPUがターゲットプログラムTPを実行した場合の動作を模擬する動作シミュレーションを行う。そして、シミュレーション装置100は、動作シミュレーションのシミュレーション結果に基づいて、ターゲットCPUがブロックBを実行した場合の実行時間を計算可能なホストコードhcを生成する。これにより、ターゲットCPUの内部状態に応じて変化する命令の実行順序を考慮してターゲットCPUの性能値を高精度に見積もる。以下、シミュレーション装置100の処理例について説明する。
(1)シミュレーション装置100は、ターゲットCPUが実行するターゲットプログラムTPのコードを区切って所定のブロックBに分割する。分割されるブロック単位は、例えば、ベーシック(基本)ブロック単位であってもよく、また、予め定められた任意のコード単位であってもよい。ベーシックブロックとは、一つの入口と一つの出口を持ち、内部に分岐コードを含まないコードである。
(2)シミュレーション装置100は、ターゲットプログラムTPのコードを分割して得られるブロックBのうち、処理対象ブロックが切り替わった場合、動作シミュレーションにおける処理対象ブロックの実行開始時のターゲットCPUの内部状態を検出する。
ここで、処理対象ブロックとは、性能シミュレーションおよび動作シミュレーションにおける処理対象となるブロックBである。また、動作シミュレーションとは、ターゲットCPUがターゲットプログラムTPを実行した場合の動作を模擬するシミュレーションである。
動作シミュレーションは、例えば、ターゲットCPUと、ターゲットCPUがアクセス可能なハードウェア資源と、を有するシステムのモデルにターゲットプログラムTPを与えることにより実行される。システムのモデルとしては、例えば、ハードウェア記述言語などによってシステムの機能のみを再現するビヘイビアモデルを用いることができる。
シミュレーション結果としては、例えば、処理対象ブロックの各命令の実行タイミングを示す情報(例えば、実行開始時刻および実行時間)が出力される。ただし、命令の実行が完了していない状態で処理対象ブロックが切り替わった場合は、その時点での命令の実行時間が出力される。
また、ターゲットCPUの内部状態は、例えば、動作シミュレーションにおいて、処理対象ブロックの直前に実行されたブロックBの実行終了時のターゲットCPUの命令キューの記憶内容、実行ユニットに投入されている命令、リオーダ・バッファの記憶内容などである。すなわち、シミュレーション装置100は、処理対象ブロックの直前に実行されたブロックBの実行終了時のターゲットCPUの内部状態を、処理対象ブロックの実行開始時のターゲットCPUの内部状態として検出する。
(3)シミュレーション装置100は、検出したターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を計算可能なホストコードhcを生成する。具体的には、例えば、まず、シミュレーション装置100は、処理対象ブロックのターゲットコードをコンパイルすることにより、ホストCPUが実行可能なホストコードhc(機能コードfcのみ)を生成する。
次に、シミュレーション装置100は、検出したターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。具体的には、例えば、シミュレーション装置100は、処理対象ブロックの直前に実行されたブロックBの実行終了時のターゲットCPUの命令キュー、実行ユニットおよびリオーダ・バッファの状態をもとに、ターゲットCPUの仕様に従って、処理対象ブロックに含まれる命令の実行の進み具合をシミュレーションする。
そして、シミュレーション装置100は、処理対象ブロックの動作シミュレーションのシミュレーション結果に基づいて、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を計算可能なタイミングコードtcを生成する。そして、シミュレーション装置100は、機能コードfcのみのホストコードhcにタイミングコードtcを組み込むことにより、処理対象ブロックのホストコードhcを生成する。
この際、シミュレーション装置100は、例えば、処理対象ブロックに対応付けて、処理対象ブロックのホストコードhcと、処理対象ブロックの実行開始時のターゲットCPUの内部状態と、処理対象ブロックの実行終了時のターゲットCPUの内部状態を記録する。これにより、処理対象ブロックのホストコードhcと処理対象ブロックの実行開始時のターゲットCPUの内部状態を特定することができる。また、処理対象ブロックの実行終了時のターゲットCPUの内部状態を、処理対象ブロックの次に実行するブロックBの実行開始時のターゲットCPUの内部状態として特定することができる。
(4)シミュレーション装置100は、生成した処理対象ブロックのホストコードhcを実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を算出する。これにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を見積もることができる。
このように、実施の形態1にかかるシミュレーション装置100によれば、ターゲットCPUの内部状態に応じて変化する命令の実行順序を考慮して、処理対象ブロックの実行時間を求めることができる。これにより、処理に必要なデータが揃った命令から実行するアウト・オブ・オーダー実行のターゲットCPUの性能の見積もり精度の向上を図ることができる。
また、シミュレーション装置100は、処理対象ブロックが切り替わった場合に、処理対象ブロックが以前に処理対象となったか否かを判断することにしてもよい。これにより、処理対象ブロックが機能コードfcを生成していない未コンパイル部分か否かを判断することができる。
また、シミュレーション装置100は、処理対象ブロックが以前に処理対象となっている場合、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出したターゲットCPUの内部状態と同一であるか否かを判断してもよい。そして、シミュレーション装置100は、ターゲットCPUの内部状態が同一でない場合に、処理対象ブロックのホストコードhcを生成することにしてもよい。
また、シミュレーション装置100は、ターゲットCPUの内部状態が同一である場合は、処理対象ブロックのホストコードhcを生成しないことにしてもよい。そして、シミュレーション装置100は、ターゲットCPUの内部状態が同一である場合は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcを実行することにより、処理対象ブロックの実行時間を算出することにしてもよい。
これにより、あるブロックBについて同一のホストコードhcが繰り返し生成されることを防ぐことができ、ターゲットCPUの性能シミュレーションにかかるメモリ使用量の増大を抑制することができる。また、同一のホストコードhcを繰り返し生成する処理を削減して性能シミュレーションの高速化を図ることができる。
(シミュレーション装置100のハードウェア構成例)
図2は、シミュレーション装置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の全体の制御を司る。また、CPU201は、ターゲットCPUの性能シミュレーションを実行するホストCPUである。ROM202は、ブートプログラムなどのプログラムを記憶する。RAM203は、CPU201のワークエリアとして使用される記憶部である。ディスクドライブ204は、CPU201の制御にしたがってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205としては、磁気ディスク、光ディスクなどが挙げられる。
I/F206は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク209に接続され、ネットワーク209を介して他のコンピュータに接続される。そして、I/F206は、ネットワーク209と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。I/F206には、例えばモデムやLANアダプタなどを採用することができる。
入力装置207は、キーボード、マウス、タッチパネルなどを用いたユーザの操作入力により、各種データの入力を行うインターフェースである。出力装置208は、CPU201の指示により、データを出力するインターフェースである。出力装置208としては、ディスプレイやプリンタなどが挙げられる。
(シミュレーション装置100の機能的構成例)
図3は、シミュレーション装置100の機能的構成例を示すブロック図である。図3において、シミュレーション装置100は、コード変換部310と、シミュレーション実行部320と、シミュレーション情報収集部330と、を有する。コード変換部310、シミュレーション実行部320およびシミュレーション情報収集部330は、制御部となる機能であり、具体的には、例えば、図2に示したROM202、RAM203、ディスク205などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F206により、その機能を実現する。各機能部の処理結果は、例えば、RAM203、ディスク205などの記憶装置に記憶される。
ここで、シミュレーション装置100には、ターゲットプログラムTPと、ターゲットプログラムTPに関するタイミング情報340と、予測情報350とが入力される。具体的には、例えば、シミュレーション装置100は、図2に示した入力装置207を用いたユーザの操作入力により、ターゲットプログラムTPとタイミング情報340と予測情報350の入力を受け付ける。
ターゲットプログラムTPは、性能評価対象となるターゲットCPUが実行するプログラムである。シミュレーション装置100は、ターゲットCPUがターゲットプログラムTPを実行した場合の実行時間を見積もる。また、タイミング情報340は、ターゲットコードの各命令について、命令実行時の実行時間の基準値と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間(ペナルティサイクル数)とを示す情報である。外部依存命令とは、命令の実行時にターゲットCPUがアクセスするハードウェア資源の状態に依存して実行時間が変化する命令である。
例えば、外部依存命令は、ロード命令やストア命令などのように、命令の実行結果が命令キャッシュ、データキャッシュ、TLB(Translation Lookaside Buffer)などの状態に依存して変化する命令であったり、分岐予測、コール/リターンのスタックなどの処理を行う命令である。また、タイミング情報340には、例えば、ターゲットコードの各命令について、命令実行時の各処理要素(段階)と使用可能なレジスタとの対応を示す情報が含まれていてもよい。
また、予測情報350は、ターゲットコードの外部依存命令の処理において、生じる確率が高い実行結果(予測結果)を定めた情報である。予測情報350には、例えば、「命令キャッシュ:予測=ヒット、データキャッシュ:予測=ヒット、TLB検索:予測=ヒット、分岐予測:予測=ヒット、コール/リターン:予測=ヒット、…」などが定められる。
コード変換部310は、ターゲットプログラムTPの実行時に、ターゲットCPUが実行するターゲットプログラムTPのコード(ターゲットコード)から、ホストCPUのコード(ホストコード)を生成する。具体的には、コード変換部310は、ブロック分割部311と、予測シミュレーション実行部312と、コード生成部313とを含む。
ブロック分割部311は、ターゲットプログラムTPのターゲットコードを区切って所定のブロックBに分割する。具体的には、例えば、ブロック分割部311は、ターゲットプログラムTPを分岐命令と分岐命令の分岐先で区切ることにより、所定のブロックBに分割する。
なお、ブロック分割部311がターゲットプログラムTPのコードをブロックBに分割するタイミングは、事前にすべて分割しておいてもよいし、処理対象ブロックが切り替わった時に、その都度、処理対象ブロックだけを分割することにしてもよい。
予測シミュレーション実行部312は、ターゲットCPUがターゲットプログラムTPを実行した場合の動作を模擬する動作シミュレーションを実行する。例えば、まず、予測シミュレーション実行部312は、処理対象ブロックが切り替わった場合、動作シミュレーションにおける処理対象ブロックの実行開始時のターゲットCPUの内部状態を検出する。
具体的には、例えば、予測シミュレーション実行部312は、後述の図4に示すホストコードリスト400から、処理対象ブロックの直前に実行されたブロックBの実行終了時のターゲットCPUの内部状態を、処理対象ブロックの実行開始時のターゲットCPUの内部状態として取得する。
ただし、処理対象ブロックが最初に実行されるブロックBの場合、処理対象ブロックの実行開始時の内部状態は初期状態となる。初期状態は、任意に設定可能であり、例えば、ターゲットCPUの命令キューやリオーダ・バッファが空の状態で、実行ユニットにいずれの命令も投入されていない状態である。
次に、予測シミュレーション実行部312は、検出したターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。具体的には、例えば、予測シミュレーション実行部312は、タイミング情報340と予測情報350とに基づいて、処理対象ブロックをある実行結果を前提とした条件下で実行する動作シミュレーションを行う。
より具体的には、例えば、予測シミュレーション実行部312は、予測情報350をもとに、処理対象ブロックに含まれる外部依存命令の予測結果を設定する。そして、予測シミュレーション実行部312は、検出したターゲットCPUの内部状態に基づいて、タイミング情報340を参照して、設定した予測結果を前提とする場合(予測ケース)の命令を実行して、命令実行の進み具合をシミュレーションする。
ここで、ロード命令(以下、「ld命令」と表記する場合がある)を例に挙げると、予測シミュレーション実行部312は、ld命令の予測結果として“キャッシュヒット”が設定されている処理については、処理対象ブロック内のld命令によるキャッシュアクセスが“ヒット”である場合の処理実行をシミュレーションする。
また、予測シミュレーション実行部312は、シミュレーション結果として、例えば、処理対象ブロックの各命令に実行開始時刻および実行時間(実行が完了していない場合もある)を出力する。また、予測シミュレーション実行部312は、例えば、処理対象ブロックについてのシミュレーションが終了した時点でのターゲットCPUの内部状態をホストコードリスト400(図4参照)に記録する。
具体的には、例えば、予測シミュレーション実行部312は、処理対象ブロックを識別するブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態と処理対象ブロックの実行終了時のターゲットCPUの内部状態をホストコードリスト400(図4参照)に記録する。なお、詳細は後述するが、処理対象ブロックの実行は、例えば、処理対象ブロックのすべての命令がターゲットCPUの命令キューに格納された場合に終了する。
コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を計算可能なホストコードhcを生成する。ここで、ホストコードhcは、機能コードfcとタイミングコードtcとを含む、ホストCPUが実行可能なコードである。
具体的には、例えば、コード生成部313は、処理対象ブロックのターゲットコードをコンパイルすることにより、ホストCPUが実行可能なホストコードhc(機能コードfcのみ)を生成する。さらに、コード生成部313は、シミュレーション結果に基づいて、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を計算可能なタイミングコードtcを生成して、ホストコードhc(機能コードfcのみ)に組み込む。
より具体的には、例えば、コード生成部313は、予測ケースでのld命令の実行時間を求め、ld命令によるキャッシュアクセスが“ミス”である場合の実行時間は、予測ケースである“ヒット”時の実行時間の加算/減算を用いた補正計算により求める処理を行うホストコードhcを生成する。これにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を計算可能なホストコードhcを生成することができる。
また、コード生成部313は、例えば、処理対象ブロックを識別するブロックIDと対応付けて、生成した処理対象ブロックのホストコードhcをホストコードリスト400(図4参照)に記録する。ここで、ホストコードリスト400の記憶内容について説明する。ホストコードリスト400は、例えば、図2に示したRAM203、ディスク205などの記憶装置により実現される。
図4は、ホストコードリスト400の記憶内容の一例を示す説明図(その1)である。図4において、ホストコードリスト400は、ブロックIDと、ホストコードと、実行開始時のターゲットCPUの内部状態と、実行終了時のターゲットCPUの内部状態とを対応付けて記憶する。
ここで、ブロックIDは、ターゲットコードを分割して得られるブロックBの識別子である。ホストコードは、ブロックBのホストコードhcである。実行開始時のターゲットCPUの内部状態は、動作シミュレーションにおけるブロックBの実行開始時のターゲットCPUの内部状態である。実行終了時のターゲットCPUの内部状態は、動作シミュレーションにおけるブロックBの実行終了時のターゲットCPUの内部状態である。
図4の例では、ホストコードリスト400には、ブロックB1のホストコードhc1と、ブロックB1の実行開始時のターゲットCPUの内部状態S0と、ブロックB1の実行終了時のターゲットCPUの内部状態S1とが対応付けて記憶されている。なお、内部状態S0は、初期状態である。
また、ブロックB2のホストコードhc2と、ブロックB2の実行開始時のターゲットCPUの内部状態S1と、ブロックB2の実行終了時のターゲットCPUの内部状態S2とが対応付けて記憶されている。また、ブロックB2のホストコードhc2+と、ブロックB2の実行開始時のターゲットCPUの内部状態S2と、ブロックB2の実行終了時のターゲットCPUの内部状態S2+とが対応付けて記憶されている。
なお、図示は省略するが、コード生成部313は、処理対象ブロックのホストコードhc(機能コードfcのみ)を流用するために、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックのホストコードhc(機能コードfcのみ)をホストコードリスト400に記録することにしてもよい。
図3の説明に戻り、シミュレーション実行部320は、コード生成部313が生成したホストコードhcを実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を算出する。すなわち、シミュレーション実行部320は、ターゲットプログラムTPを実行するターゲットCPUの命令実行の機能および性能のシミュレーションを行う。
具体的には、シミュレーション実行部320は、コード実行部321と、補正部322とを含む。コード実行部321は、処理対象ブロックのホストコードhcを実行する。具体的には、例えば、コード実行部321は、ホストコードリスト400から、処理対象ブロックのブロックIDに対応するホストコードhcを取得して、取得したホストコードhcを実行する。
処理対象ブロックのホストコードhcが実行されると、次に処理対象となるブロックBが特定され、そのブロックBの情報(例えば、ブロックID)がコード変換部310に出力される。これにより、コード変換部310は、性能シミュレーションにおいて処理対象ブロックが切り替わったことを認識することができるとともに、動作シミュレーションにおける次の処理対象ブロックを認識することができる。
補正部322は、外部依存命令の実行結果が、設定されていた予測結果と異なる場合(予測外ケース)に、その命令の実行時間を、既に求めた予測ケースでの実行時間を補正して求める。具体的には、例えば、補正部322は、ターゲットCPUがターゲットプログラムTPを実行した場合の動作を模擬する動作シミュレーションを実行することにより、外部依存命令の実行結果が、設定されていた予測結果と異なるか否かを判断する。
この動作シミュレーションは、例えば、ターゲットCPUと、ターゲットCPUがアクセス可能なキャッシュなどのハードウェア資源と、を有するシステムのモデルにターゲットプログラムTPを与えることにより実行される。
そして、補正部322は、外部依存命令に与えられるペナルティ時間、外部依存命令の前後で実行される命令の実行時間、1つ前の命令の遅延時間などを用いて補正を行う。なお、補正部322による補正処理の詳細な説明については、図24〜図26を用いて後述する。
シミュレーション情報収集部330は、性能シミュレーションの実行結果として、各ブロックBの実行時間を含むログ情報(シミュレーション情報360)を収集する。具体的には、例えば、シミュレーション情報収集部330は、各ブロックBの実行時間を加算することにより、ターゲットCPUがターゲットプログラムTPを実行した場合の全体の実行時間を含むシミュレーション情報360を出力することにしてもよい。
また、予測シミュレーション実行部312は、処理対象ブロックが切り替わった場合、処理対象ブロックが以前に処理対象となったか否かを判断する。具体的には、例えば、予測シミュレーション実行部312は、図4に示したホストコードリスト400を参照して、処理対象ブロックのブロックIDが登録されているか否かを判断する。
そして、処理対象ブロックのブロックIDが登録されている場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断する。一方、処理対象ブロックのブロックIDが未登録の場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となっていないと判断する。
ここで、処理対象ブロックが以前に処理対象となっていないと判断した場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
また、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断した場合、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態と同一であるか否かを判断する。
具体的には、例えば、予測シミュレーション実行部312は、ホストコードリスト400を参照して、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態が、処理対象ブロックのブロックIDと対応付けて記憶された実行開始時のターゲットCPUの内部状態と同一であるか否かを判断する。
ここで、ターゲットCPUの内部状態が同一でない場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
一方、ターゲットCPUの内部状態が同一の場合、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。すなわち、実行開始時のターゲットCPUの内部状態が同一であれば、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できるため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
また、コード実行部321は、検出されたターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出されたターゲットCPUの内部状態と同一である場合、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを実行する。
(JITコンパイルフェーズと実行フェーズ)
ここで、コード変換部310によるJITコンパイルフェーズと、シミュレーション実行部320による実行フェーズについて説明する。
JITコンパイルフェーズでは、1.ターゲットCPUの内部状態と予測に基づく動作シミュレーションを行う。2.処理対象ブロックのホストコードhcを生成する。3.ターゲットCPUの内部状態とホストコードhcを記録する。
実行フェーズでは、1.処理対象ブロックのホストコードhcを実行する。2.必要な箇所でヘルパー関数を実行する。ヘルパー関数とは、外部依存命令についての実行時間を補正する補正処理を呼び出すための関数である。ヘルパー関数についての詳細な説明は後述する。3.予測が当たっているかどうかを判定する。予測が当たっていなければ補正を行う。
そして、実行フェーズからJITコンパイルフェーズへの移行は、未コンパイル部分(ホストコードhcの未生成ブロック)を検出した場合、または、ターゲットCPUの内部状態の不一致を検出した場合のいずれかにより移行する。
JITコンパイルフェーズにおける処理手順の一例を説明すると、入力は、ターゲットコードと実行開始時のターゲットCPUの内部状態であり、出力は、処理対象ブロックのホストコードhcと、実行後のターゲットCPUの内部状態である。そして、1.ターゲットコードをブロックBに分割する。2.外部依存命令を検出する。3.上記2.において検出した命令について、確率が高い実行結果を設定する(予測ケース)。4.ターゲットCPUの内部状態と、予測ケースでの動作シミュレーションを実行する。5.上記4.のシミュレーション結果をもとに、予測ケースでの処理対象ブロックのホストコードhcを生成して、ターゲットCPUの内部状態とともに記録する。
図5は、タイミングコードが組み込まれる例を示す説明図である。図5(A)は、ターゲットコードからホストコードhc(機能コードfcのみ)が生成される例を示し、図5(B)は、ホストコードhc(機能コードfcのみ)に、タイミングコードtcが組み込まれる例を示す。
図5(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、…に変換されて、機能コードfcのみのホストコードhcが生成される。
さらに、図5(B)に示すように、機能コードfcのみのホストコードhcに、ターゲットコードInst_AのタイミングコードHost_Inst_A2_cycle、Host_Inst_A3_cycleが、ターゲットコードInst_BのタイミングコードHost_Inst_B4_cycle、Host_Inst_B5_cycleが、それぞれ組み込まれる。
タイミングコードtcは、対象ブロックに含まれる命令の実行時間(所要サイクル数)を定数化し、命令の実行時間を合計して処理対象ブロックの処理時間を求めるコードである。これにより、ブロック実行中の進み具合を示す情報を得ることができる。なお、ホストコードhcのうち、機能コードfc、外部依存命令以外の命令についてのタイミングコードtcは既知のコードを使用して実施できる。外部依存命令についてのタイミングコードtcは、補正処理を呼び出すヘルパー関数呼び出し命令として用意される。ヘルパー関数呼び出し命令については後述する。
(動作シミュレーション)
ここで、ターゲットCPUがターゲットプログラムTPを実行した場合の動作を模擬する動作シミュレーションについて説明する。ここでは、ターゲットCPUの仕様として、2命令を同時にデコードするアウト・オブ・オーダー実行のプロセッサを想定する。また、ターゲットCPUは、4段のパイプライン(F−D−E−W)を有する。
Fステージでは、メモリから命令を取り出す。Dステージでは、命令をデコードして命令キュー(IQ)に入れ、リオーダ・バッファ(ROB)に記録する。Eステージでは、命令キューにある命令のうち実行可能になった命令を実行ユニットに入れ、実行ユニットの処理完了後にリオーダ・バッファの命令の状態を完了に変更する。Wステージでは、リオーダ・バッファから完了状態の命令を削除する。
また、ターゲットCPUは、実行ユニットとして、2つのALUと、ロード・ストアユニットと、分岐ユニットとを有する。各実行ユニットでの各命令の実行サイクル数(基準値)は、任意に設定可能である。例えば、ALUでmul命令を実行した際の実行サイクル数を「2」とし、分岐ユニットで分岐命令を実行した際の実行サイクル数を「0」とし、その他の命令をいずれかの実行ユニットで実行した際の実行サイクル数を「1」とする。
図6は、ターゲットCPUの構成例を示すブロック図である。図6において、ターゲットCPU600は、命令キャッシュ601と、命令キュー602と、ALU603,604と、ロード・ストアユニット605と、分岐ユニット606と、リオーダ・バッファ607と、を含む。
命令キャッシュ601は、メモリ(不図示)から取り出した命令を格納する。命令キュー602は、デコードされた命令を格納する。ALU603,604は、mul命令、add命令等の算術論理演算を行う実行ユニットである。ロード・ストアユニット605は、ロード・ストア命令を実行する実行ユニットである。分岐ユニット606は、分岐命令を実行する実行ユニットである。リオーダ・バッファ607は、デコードされた命令を格納する。また、リオーダ・バッファ607は、格納した各命令について、実行待ちまたは完了のいずれかの状態を示す情報を有する。
予測シミュレーション実行部312は、例えば、ターゲットCPU600のようなモデルにターゲットプログラムTPを与えることにより動作シミュレーションを実行する。また、ここでは動作シミュレーションの前提条件として、外部要因はすべてヒットを予測ケースとして設定する。例えば、「命令キャッシュ:予測=ヒット、データキャッシュ:予測=ヒット、TLB検索:予測=ヒット、分岐予測:予測=ヒット、コール/リターンスタック:予測=ヒット」とする。
入力される情報は、処理対象ブロックのターゲットコードと、処理対象ブロックの実行開始時におけるターゲットCPUの内部状態となる。また、出力される情報は、例えば、処理対象ブロックの各命令の実行開始時刻および実行時間(実行が完了していない場合もある)と処理対象ブロックの実行が完了した時点のターゲットCPUの内部状態となる。
<メインルーチン>
動作シミュレーションのメインルーチンは、例えば、以下の通りである。ただし、1クロックサイクルごとに各ステージをシミュレーションしているとする。また、Fステージで命令がストールすることはないと仮定して、Fステージを省略する。
1.cycle=0
2.end=false
3.while end==false
4. end=stage_d()
5. stage_w()
6. stage_e()
7. cycle=cycle+1
8.return cycle
<サブルーチン>
動作シミュレーションのサブルーチンは、例えば、以下の通りである。
stage_d()
1.処理対象ブロックから命令を取り出す
2.命令の種類を判定する
3.リオーダ・バッファに命令を記録
4.命令を命令キャッシュに入れる
5.命令が処理対象ブロックの最後の命令の場合はtrueを返す
6.処理した命令が1個目の場合は、上記1.へ戻る。2個目の場合はfalseを返す(2命令同時デコード)
stage_w()
完了済みの命令をリオーダ・バッファの先頭から削除する
stage_e()
各実行ユニットについて、以下を実行する
1.実行中の命令があれば、実行が完了したか否かを判定し、完了した場合は実行中の命令をクリアし、リオーダ・バッファの中の該当する命令を完了済みの状態にする
2.実行中の命令がない場合、命令キューから命令を取り出し、実行ユニットの状態を命令実行中にする
(ターゲットプログラムTPのターゲットコード例)
図7は、ターゲットコードの一例を示す説明図(その1)である。図7において、ターゲットコード700は、1×2×3×4×5×6×7×8×9×10を求めるコードである。ターゲットコード700において、1,2行目が初期化処理のブロックBであり、3〜6行目がループ本体のブロックBである。
初期化処理は、r0の初期値を「1」とし、r1の初期値を「2」とする処理である。ループ本体は、r1の値が10より大きくなるまで、r0の値を「r0*r1」とし、r1の値をインクリメントする一連の処理を繰り返すループ処理である。ここでは、3〜6行目を処理対象ブロック701とし、1,2行目を処理対象ブロック701の直前に実行されたブロックBとする。
以下、図8〜図15を用いて、動作シミュレーションにおいてターゲットCPU600がターゲットコード700を実行した場合の動作を模擬したときのターゲットCPUの動作例について説明する。
(ターゲットCPUの内部状態の変化例)
図8〜図15は、ターゲットCPUの内部状態の変化例を示す説明図である。図8において、内部状態801は、動作シミュレーションにおける処理対象ブロック701の実行開始時のターゲットCPU600の内部状態を示している。ここでは、ターゲットCPU600の内部状態として、命令キュー602に格納されている命令と、実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)に投入されている命令と、リオーダ・バッファ607に格納されている命令とが示されている。
内部状態801では、命令キュー602は空の状態である。また、実行ユニットには、命令1(mov r0,#1)と命令2(mov r1,#2)が投入されている。また、リオーダ・バッファ607には、命令1(mov r0,#1)と命令2(mov r1,#2)が格納されている。
動作シミュレーションにおいて、まず、予測シミュレーション実行部312は、stage_d()を実行する。内部状態802は、stage_d()実行後のターゲットCPU600の内部状態を示している(図8参照)。
内部状態802では、命令キュー602には、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が格納されている。また、実行ユニットには、命令1(mov r0,#1)と命令2(mov r1,#2)が投入されている。また、リオーダ・バッファ607には、命令1(mov r0,#1)と命令2(mov r1,#2)と命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が格納されている。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、stage_w()を実行する。内部状態901は、stage_w()実行後のターゲットCPU600の内部状態を示している(図9参照)。
内部状態901では、命令キュー602には、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が格納されている。また、実行ユニットには、命令1(mov r0,#1)と命令2(mov r1,#2)が投入されている。また、リオーダ・バッファ607には、命令1(mov r0,#1)と命令2(mov r1,#2)と命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が格納されている。
ここでは、完了済みの命令がないため、stage_w()の実行前後において、ターゲットCPU600の内部状態は変わらない。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、stage_e()を実行する。この結果、メインルーチンのループが1回実行されたことになる。内部状態902は、stage_e()実行後のターゲットCPU600の内部状態を示している(図9参照)。
内部状態902では、命令キュー602は空の状態である。また、実行ユニットには、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が投入されている。また、リオーダ・バッファ607には、命令1(mov r0,#1)と命令2(mov r1,#2)と命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が格納されている。
ここでは、実行ユニットの命令1,2の実行が完了したため、実行ユニットから命令1,2が削除されている。また、実行ユニットが空いているため、命令キュー602から命令3,4が実行ユニットに投入されている。
メインルーチンのループを1回実行後の各変数(cycle、end)の値は以下の通りである。
cycle:1
end:false
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_d()を実行する。内部状態1001は、2回目のstage_d()実行後のターゲットCPU600の内部状態を示している(図10参照)。
内部状態1001では、命令キュー602には、命令5(cmp r1,#10)と命令6(bcc 3)が格納されている。また、実行ユニットには、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が投入されている。また、リオーダ・バッファ607には、命令1(mov r0,#1)と命令2(mov r1,#2)と命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)と命令5(cmp r1,#10)と命令6(bcc 3)が格納されている。
ここで、命令6は、処理対象ブロック701の最後の命令のため、変数(end)の値は「true」となる。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_w()を実行する。内部状態1002は、2回目のstage_w()実行後のターゲットCPU600の内部状態を示している(図10参照)。
内部状態1002では、命令キュー602には、命令5(cmp r1,#10)と命令6(bcc 3)が格納されている。また、実行ユニットには、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)が投入されている。また、リオーダ・バッファ607には、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)と命令5(cmp r1,#10)と命令6(bcc 3)が格納されている。
ここでは、命令1,2が完了済みのため、リオーダ・バッファ607から命令1,2が削除されている。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_e()を実行する。この結果、メインルーチンのループが2回実行されたことになる。内部状態1101は、2回目のstage_e()実行後のターゲットCPU600の内部状態を示している(図11参照)。
内部状態1101では、命令キュー602には命令6(bcc 3)が格納されている。また、実行ユニットには、命令3(mul r0,r0,r1)と命令5(cmp r1,#10)が投入されている。また、リオーダ・バッファ607には、命令3(mul r0,r0,r1)と命令4(add r1,r1,#1)と命令5(cmp r1,#10)と命令6(bcc 3)が格納されている。
ここでは、実行ユニットの命令4の実行が完了したため、実行ユニットから命令4が削除されている。命令3については、mul命令で2サイクルかかるため、命令3の実行は完了していない。また、ALUの実行ユニットが空いているため、命令キュー602から命令5が実行ユニットに投入されている。また、命令6は、命令5に依存するため、実行可能ではないことにより、実行されずに命令キュー602に残っている。
メインルーチンのループを2回実行後の各変数(cycle、end)の値は以下の通りである。
cycle:2
end:true
ここで、変数(end)の値が「true」となっているため、予測シミュレーション実行部312は、処理対象ブロック701の実行された命令の実行開始時刻と実行時間を示すシミュレーション結果を返す。これにより、動作シミュレーションにおける処理対象ブロック701の実行が終了する。この際、予測シミュレーション実行部312は、処理対象ブロック701の実行時間を示す実行サイクル数「2」を返すことにしてもよい。
また、処理対象ブロック701の最後の命令6が命令キュー602に格納されたため、動作シミュレーションにおける処理対象ブロックが切り替わる。ここでは、ターゲットコード700の6行目の分岐命令により、分岐予測がヒットしたと仮定して(予測ケース)、分岐先となる3行目に戻って3〜6行目のブロックBが再度処理対象ブロックとなる。
図12において、内部状態1201は、動作シミュレーションにおける2回目の処理対象ブロック701の実行開始時のターゲットCPU600の内部状態を示している。内部状態1201は、1回目の処理対象ブロック701の実行終了時の内部状態1101と同じである。
動作シミュレーションにおいて、まず、予測シミュレーション実行部312は、stage_d()を実行する。内部状態1202は、stage_d()実行後のターゲットCPU600の内部状態を示している(図12参照)。
内部状態1202では、命令キュー602には、命令6と命令3と命令4が格納されている。また、実行ユニットには、命令3と命令5が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6と命令3と命令4が格納されている。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、stage_w()を実行する。内部状態1301は、stage_w()実行後のターゲットCPU600の内部状態を示している(図13参照)。
内部状態1301では、命令キュー602には、命令6と命令3と命令4が格納されている。また、実行ユニットには、命令3と命令5が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6と命令3と命令4が格納されている。
ここでは、命令4が完了済みだが、命令3が実行中のため、stage_w()の実行前後において、ターゲットCPU600の内部状態は変わらない。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、stage_e()を実行する。この結果、メインルーチンのループが1回実行されたことになる。内部状態1302は、stage_e()実行後のターゲットCPU600の内部状態を示している(図13参照)。
内部状態1302では、命令キュー602は空の状態である。また、実行ユニットには、命令3と命令4が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6と命令3と命令4が格納されている。
ここでは、実行ユニットの命令3,5の実行が完了したため、実行ユニットから命令3,5が削除されている。また、実行ユニットが空いているため、命令キュー602から命令3,4が実行ユニットに投入されている。なお、命令6は、分岐命令であり、実行サイクル数が「0」のため実行ユニットには投入されず完了済みとする。
メインルーチンのループを1回実行後の各変数(cycle、end)の値は以下の通りである。
cycle:1
end:false
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_d()を実行する。内部状態1401は、2回目のstage_d()実行後のターゲットCPU600の内部状態を示している(図14参照)。
内部状態1401では、命令キュー602には、命令5と命令6が格納されている。また、実行ユニットには、命令3と命令4が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6と命令3と命令4と命令5と命令6が格納されている。
ここで、命令6は、処理対象ブロック701の最後の命令のため、変数(end)の値は「true」となる。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_w()を実行する。内部状態1402は、2回目のstage_w()実行後のターゲットCPU600の内部状態を示している(図14参照)。
内部状態1402では、命令キュー602には、命令5と命令6が格納されている。また、実行ユニットには、命令3と命令4が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6が格納されている。
ここでは、命令3,4,5,6が完了済みのため、リオーダ・バッファ607から命令3,4,5,6が削除されている。
動作シミュレーションにおいて、次に、予測シミュレーション実行部312は、2回目のstage_e()を実行する。この結果、メインルーチンのループが2回実行されたことになる。内部状態1501は、2回目のstage_e()実行後のターゲットCPU600の内部状態を示している(図15参照)。
内部状態1501では、命令キュー602には命令6が格納されている。また、実行ユニットには、命令3と命令5が投入されている。また、リオーダ・バッファ607には、命令3と命令4と命令5と命令6が格納されている。
ここでは、実行ユニットの命令4の実行が完了したため、実行ユニットから命令4が削除されている。命令3については、mul命令で2サイクルかかるため、命令3の実行は完了していない。また、ALUの実行ユニットが空いているため、命令キュー602から命令5が実行ユニットに投入されている。また、命令6は、命令5に依存するため、実行可能ではないことにより、実行されずに命令キュー602に残っている。
メインルーチンのループを2回実行後の各変数(cycle、end)の値は以下の通りである。
cycle:2
end:true
ここで、変数(end)の値が「true」となっているため、予測シミュレーション実行部312は、2回目の処理対象ブロック701の実行された命令の実行開始時刻と実行時間を示すシミュレーション結果を返す。これにより、動作シミュレーションにおける処理対象ブロック701の実行が終了する。
(ホストコードhcの具体例)
次に、処理対象ブロックに外部依存命令が含まれていない場合のホストコードhcの具体例について説明する。例えば、上述した動作シミュレーションの処理対象ブロック701のシミュレーション結果として出力される、処理対象ブロック701の各命令の実行開始時刻と実行時間は、例えば、以下の通りである。
<各命令の実行開始時刻>
命令3:0
命令4:0
命令5:1
命令6:2
<各命令の実行時間>
命令3:0
命令4:1
命令5:1
コード生成部313は、処理対象ブロック701のターゲットコードをコンパイルすることにより、ホストCPUが実行可能なホストコードhc(この時点では、機能コードfcのみ)を生成する。さらに、コード生成部313は、動作シミュレーションの処理対象ブロック701のシミュレーション結果に基づいて、処理対象ブロック701のタイミングコードtcを生成して、ホストコードhcに組み込む。
具体的には、例えば、コード生成部313は、命令4の直後に性能値を「+1」し、命令5の直後に性能値を「+1」するタイミングコードtcを生成する。なお、性能値は、ターゲットCPUが処理対象ブロック701の実行時間である。ここで、上述した処理対象ブロック701のシミュレーション結果に基づくホストコードhcについて説明する。
図16は、ホストコードhcの具体例を示す説明図(その1)である。図16において、ホストコード1600は、ターゲットCPUが処理対象ブロック701を実行した場合の実行時間をホストCPUが計算可能なコード(x86命令)である。
ホストコード1600において、1行目が命令3に対応するホストコード(機能コード)であり、2行目が命令4に対応するホストコード(機能コード)である。また、6行目が命令5に対応するホストコード(機能コード)であり、10行目が命令6に対応するホストコード(機能コード)である。
3〜5行目が命令4の直後に性能値を「+1」する性能計算命令(タイミングコード)であり、7〜9行目が命令5の直後に性能値を「+1」する性能計算命令(タイミングコード)である。ターゲットCPUが処理対象ブロック701を実行した場合の実行時間は、2サイクルとなる。
次に、処理対象ブロックに外部依存命令が含まれている場合のホストコードhcの具体例について説明する。まず、外部依存命令を含むターゲットプログラムTPのターゲットコードについて説明する。
図17は、ターゲットコードの一例を示す説明図(その2)である。図17において、ターゲットコード1700は、レジスタr0で示されたアドレスの10個のデータをすべて掛け合わせた値を求めるサブルーチンである。ターゲットコード1700をC言語で記述すると、例えば、以下のようになる。
int func(int a[])

int i;
int r=a[0];
for (i=; i<10; i++)
r *=a[i];
return r;
命令1,3のldr命令はメモリからロードする命令であり、外部依存命令となる。また、命令8,10は分岐命令である。ここで、ldr命令がキャッシュヒット時に2クロックサイクルかかるとする。また、命令5は、命令3の結果を利用するため、命令3の完了後に実行される。命令6は、命令3,4,5と依存関係がないため、命令5よりも先に実行される。命令7は、命令6の結果を利用するため、命令6の完了後に実行される。命令8は、命令7の結果を利用するため、命令7の完了後に実行される。
この場合、命令3〜8で構成される処理対象ブロック1701の各命令の実行開始時刻は、命令の依存関係により、以下のようになる。
<各命令の実行開始時刻>
命令3:0
命令4:0
命令5:2
命令6:1
命令7:2
命令8:3
また、処理対象ブロック1701の各命令の実行時間は、以下のようになる。ただし、命令3は、外部依存命令のため、命令3の実行時間はヘルパー関数により計算することになる。ここでは、ヘルパー関数呼び出し命令を「cache_ld(address,rep_delay,pre_delay)」とする。
<各命令の実行時間>
命令3:ヘルパー関数で計算:rep_delay=1,pre_delay=−1
命令4:0
命令5:0
命令6:0
命令7:1
コード生成部313は、処理対象ブロック1701のターゲットコードをコンパイルすることにより、ホストCPUが実行可能なホストコードhc(この時点では、機能コードfcのみ)を生成する。さらに、コード生成部313は、動作シミュレーションの処理対象ブロック1701のシミュレーション結果に基づいて、処理対象ブロック1701のタイミングコードtcを生成して、ホストコードhcに組み込む。
具体的には、例えば、コード生成部313は、命令3の直後にヘルパー関数を呼び出し、命令7の直後に性能値を「+1」するタイミングコードtcを生成する。ここで、上述した処理対象ブロック1701のシミュレーション結果に基づくホストコードhcについて説明する。
図18は、ホストコードhcの具体例を示す説明図(その2)である。図18において、ホストコード1800は、ターゲットCPUが処理対象ブロック1701を実行した場合の実行時間をホストCPUが計算可能なコード(x86命令)である。
ホストコード1800において、1行目が命令3に対応するホストコード(機能コード)であり、7行目が命令4に対応するホストコード(機能コード)である。また、8行目が命令5に対応するホストコード(機能コード)であり、9行目が命令6に対応するホストコード(機能コード)であり、10行目が命令7に対応するホストコード(機能コード)である。
2〜6行目が命令3の直後にヘルパー関数により命令3の実行時間を計算する性能計算命令(タイミングコード)であり、11〜13行目が命令7の直後に性能値を「+1」する性能計算命令(タイミングコード)である。ここでは、命令3〜6でヘルパー関数cache_ld(%esi,1,−1)呼び出しを実現している。
(ターゲットCPUの内部状態の変化例)
ここで、図19〜図22を用いて、動作シミュレーションにおいてターゲットCPU600がターゲットコード1700を実行した場合の動作を模擬したときのターゲットCPUの内部状態の変化例について説明する。
図19〜図22は、ターゲットCPUの内部状態の変化例を示す説明図である。ただし、ここでは、ターゲットCPU600がターゲットコード1700を実行した場合の動作を模擬したときのターゲットCPUの内部状態の一部を抜粋して説明する。
図19において、内部状態1900は、動作シミュレーションにおける処理対象ブロック1701の実行開始時のターゲットCPU600の内部状態を示している。ここでは、ターゲットCPU600の内部状態として、命令キュー602に格納されている命令と、実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)に投入されている命令と、リオーダ・バッファ607に格納されている命令とが示されている。
内部状態1900では、命令キュー602は空の状態である。また、実行ユニットには、命令1(ldr r2,[r0,#0])と命令2(mov r3,#1)が投入されている。また、リオーダ・バッファ607には、命令1(ldr r2,[r0,#0])と命令2(mov r3,#1)が格納されている。
動作シミュレーションにおいて、予測シミュレーション実行部312は、図8〜図15を用いて説明した場合と同様に、メインルーチンの変数(end)の値が「true」となるまでメインルーチンのループを繰り返し実行する。
図20において、内部状態2000は、動作シミュレーションにおける処理対象ブロック1701の実行終了時のターゲットCPU600の内部状態を示している。
内部状態2000では、命令キュー602には、命令3(ldr r1,[r0,#4])と命令5(mul r2,r1,r2)と命令8(bne 3)が格納されている。また、実行ユニットには、命令1(ldr r2,[r0,#0])と命令7(cmp r3,#10)が投入されている。
また、リオーダ・バッファ607には、命令1(ldr r2,[r0,#0])と命令2(mov r3,#1)と命令3(ldr r1,[r0,#4])と命令4(add r0,r0,#4)と命令5(mul r2,r1,r2)と命令6(add r3,r3,#1)と命令7(cmp r3,#10)と命令8(bne 3)が格納されている。
ここで、処理対象ブロック1701の最後の命令8が命令キュー602に格納されたため、動作シミュレーションにおける処理対象ブロックが切り替わる。ここでは、ターゲットコード1700の8行目の条件分岐命令により、r3の値が10よりも大きくなるまで、分岐先となる3行目に戻って3〜8行目のブロックBが再度処理対象ブロックとなる。
図21において、内部状態2100は、動作シミュレーションにおける6回目の処理対象ブロック1701の実行終了時のターゲットCPU600の内部状態を示している。
内部状態2100では、命令キュー602には、命令6(add r3,r3,#1)と命令7(cmp r3,#10)と命令8(bne 3)が格納されている。また、実行ユニットには、命令8(bne 3)と命令5(mul r2,r1,r2)が投入されている。ただし、命令8(bne 3)は、直前に実行されたブロックB(5回目の処理対象ブロック1701)の命令である。
また、リオーダ・バッファ607には、命令8(bne 3)と命令3(ldr r1,[r0,#4])と命令4(add r0,r0,#4)と命令5(mul r2,r1,r2)と命令6(add r3,r3,#1)と命令7(cmp r3,#10)と命令8(bne 3)が格納されている。ただし、一つ目の命令8(bne 3)は、直前に実行されたブロックB(5回目の処理対象ブロック1701)の命令である。
図22において、内部状態2200は、動作シミュレーションにおける7回目の処理対象ブロック1701の実行終了時のターゲットCPU600の内部状態を示している。
内部状態2200では、命令キュー602には、命令6(add r3,r3,#1)と命令7(cmp r3,#10)と命令8(bne 3)が格納されている。また、実行ユニットには、命令8(bne 3)と命令5(mul r2,r1,r2)が投入されている。ただし、命令8(bne 3)は、直前に実行されたブロックB(6回目の処理対象ブロック1701)の命令である。
また、リオーダ・バッファ607には、命令8(bne 3)と命令3(ldr r1,[r0,#4])と命令4(add r0,r0,#4)と命令5(mul r2,r1,r2)と命令6(add r3,r3,#1)と命令7(cmp r3,#10)と命令8(bne 3)が格納されている。ただし、一つ目の命令8(bne 3)は、直前に実行されたブロックB(6回目の処理対象ブロック1701)の命令である。
ここで、図21に示した6回目の処理対象ブロック1701の実行終了時のターゲットCPU600の内部状態2100と、図22に示した7回目の処理対象ブロック1701の実行終了時のターゲットCPU600の内部状態2200とを比較すると、ターゲットCPUの内部状態が一致している。
この場合、7回目の処理対象ブロック1701の実行開始時のターゲットCPU600の内部状態と、8回目の処理対象ブロック1701の実行開始時のターゲットCPU600の内部状態とが一致することになる。すなわち、7回目の処理対象ブロック1701について生成されたホストコードhcを、8回目の処理対象ブロック1701に流用できる。このため、コード生成部313は、8回目の処理対象ブロック1701についてのホストコードhcを生成しない。
具体的には、コード変換部310は、8回目の処理対象ブロック1701について、機能コードfcを生成しないだけでなく、動作シミュレーションを行わず、タイミングコードtcを生成しない。これにより、処理対象ブロック1701について同一のホストコードhcが繰り返し生成されることを防ぐことができ、ターゲットCPUの性能シミュレーションにかかるメモリ使用量の増大を抑制することができる。また、同一のホストコードhcを繰り返し生成する処理を削減して性能シミュレーションの高速化を図ることができる。
(性能シミュレーション)
次に、ターゲットCPUがターゲットプログラムTPを実行した場合の実行時間を見積もる性能シミュレーションについて説明する。
(1)シミュレーション実行部320のコード実行部321は、コード変換部310が生成したホストコードhcを用いて、ターゲットプログラムTPの性能シミュレーションを行う。コード実行部321は、ターゲットプログラムTPの命令実行をシミュレーションし、各命令の実行時間を得ていく。
(2)コード実行部321は、シミュレーションの実行中に、外部依存命令(例えばld命令)を検出した場合、その実行結果が、設定された予測結果と異なっているかを判定し、実行結果が予測結果と異なっている場合に、補正部322の起動を要求する。例えば、ロード命令ldを検出し、データキャッシュの予測結果(キャッシュヒット)と、実際の実行結果(キャッシュミス)とが異なっていた場合に、補正部322が呼び出される。
(3)補正部322は、呼び出しを受けて起動し、検出された命令の実行時間(サイクル数)を補正する。さらに、補正部322は、この補正により、次命令の実行タイミングt+nも変更する。補正部322は、外部依存命令の実行結果が予測結果と異なる度に、命令の実行時間を補正する。
ここで、予測ケースでの外部依存命令の実行時間は既に定数化されている。このため、補正部322は、予測外ケースでの外部依存命令の実行時間を、その命令に対するペナルティ時間、前後に実行される命令の実行時間、前に処理された命令の遅延時間等の値を単に加算または減算して計算することができる。
図23は、補正部322の処理動作を示す説明図である。補正部322は、ヘルパー関数モジュールとして実施される。本実施の形態では、例えば、ld命令のキャッシュの実行結果ごとにシミュレーションを行う関数「cache_ld(address)」の代わりに、ヘルパー関数呼び出し命令「cache_ld(address,rep_delay,pre_delay)」がホストコードに組み込まれることにより、実現している。
ヘルパー関数の“rep_delay”は、このロード(ld)命令の返り値を使用する次の命令の実行までに、ペナルティ時間のうち遅延時間として処理されなかった時間(猶予時間)である。“pre_delay”は、1つ前の命令から受ける遅延時間である。“−1”は、前の命令に遅延がないことを示す。“rep_delay”と“pre_delay”は、性能シミュレーション結果とタイミング情報340との静的分析処理の結果から得られる時間情報である。
図23に示す動作例では、補正部322は、現タイミングcurrent_timeと1つ前のld命令の実行タイミングpreld_timeとの差が、1つ前のld命令の遅延時間分pre_delayを超えているときは、1つ前のld命令の実行タイミングpreld_timeと現タイミングcurrent_timeまでの時間で遅延時間pre_delayを調整して有効遅延時間avail_delayを求める。
次に、補正部322は、実行結果がキャッシュミスであれば、予測結果の誤りであり、有効遅延時間avail_delayにキャッシュミス時のペナルティ時間cache_miss_latencyを加算して、猶予時間rep_delayをもとに、ld命令の実行時間を補正する。
以下、図24〜図26を用いて、補正部322のld命令の実行結果に対する補正例について説明する。
図24は、ld命令の実行結果に対する補正例を示す説明図(その1)である。図24では、1つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。
図24の例では、以下の3命令のシミュレーションが実行される。
「ld [r1],r2 :[r1]→r2;
mult r3,r4,r5 :r3*r4→r5;
add r2,r5,r6 :r2+r5→r6」
図24(A)は、予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す。この予測ケースにおいて、3番目に実行されるadd命令に、2サイクルストールが生じている。図24(B)は、予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す。この予測ミスのケースでは、ld命令の実行結果がキャッシュミスであると、ペナルティサイクル(6サイクル)分の遅延が生じる。そのため、mult命令は、遅延の影響を受けずに実行されるが、add命令の実行は、ld命令の完了を待つため、4サイクル分遅延することになる。図24(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す。
補正部322は、ld命令の実行結果がキャッシュミスであるので(予測結果のミス)、残りの実行時間(2−1=1サイクル)に所定のキャッシュミス時のペナルティ時間(6サイクル)を加算して有効遅延時間(7サイクル)とする。有効遅延時間は、最大の遅延時間となる。さらに、補正部322は、次のmult命令の実行時間(3サイクル)を得て、次命令の実行時間が遅延時間を超過しないと判定して、有効遅延時間から次命令の実行時間を差し引いた時間(7−3=4サイクル)を、ld命令の遅延が生じた実行時間(遅延時間)とする。また、補正部322は、有効遅延時間から上記の遅延時間を差し引いた時間(3サイクル)を猶予時間とする。猶予時間は、ペナルティとしての遅延が猶予された時間である。補正部322は、ヘルパー関数cache_ld(address,rep_delay,pre_delay)で、猶予時間rep_delay=3、前命令の遅延時間pre_delay=−1(遅延なし)を返す。
この補正により、ld命令の実行時間は、実行された時間と遅延時間を加算した実行時間(1+4=5サイクル)となり、実行完了のタイミングt1から、後続のmult命令、add命令の実行時間が計算される。すなわち、補正したld命令の実行時間(5サイクル)に、予測シミュレーション実行部312の処理結果(予測結果による予測シミュレーションの結果)で求められていたmult命令とadd命令の各々の実行時間(3サイクル、3サイクル)を単純に加算するだけで、このブロックの実行時間(サイクル数)を得ることができる。
よって、実行結果が予測と異なる命令の実行時間のみを加算または減算による補正処理を行って、その他の命令については、予測結果にもとづくシミュレーション時に求められた実行時間を加算するだけで、高精度に、キャッシュミス時のシミュレーションの実行サイクル数をも求めることができる。
図25は、ld命令の実行結果に対する補正例を示す説明図(その2)である。図25では、2つのキャッシュ処理が実行されるケースで2つのキャッシュミスが生じた場合の補正例を説明する。図25の例では、以下の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」
図25(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す。この予測ケースでは、2つのld命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。図25(B)は、2つのキャッシュ処理の両方が予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す。この予測ミスのケースでは、2つのld命令のそれぞれでキャッシュミスがあり、ペナルティサイクル(6サイクル)分の遅延が生じる。しかし、2つのld命令の遅延時間は重なる時間があり、mult命令も、遅延の影響を受けずに実行され、2つのadd命令の実行が2つ目のld命令の完了まで遅延することになる。図25(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す。
補正部322は、図24を用いて説明したように、タイミングt0において、1つ目のld命令の遅延時間を補正し、ヘルパー関数cache_ld(addr,3,−1)を返す。次に、現タイミングt1において、補正部322は、2つ目のld命令の実行結果がキャッシュミスであるので(予測結果のミス)、このld命令の残りの実行時間にペナルティサイクル(6)を追加して有効遅延時間(1+6=7サイクル)とする。
補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間(<現タイミングt1−前命令の実行タイミングt0>−設定された間隔)を差し引いて、現タイミングt1から超過した有効遅延時間を求め(7−(6−2)=3サイクル)、この超過した有効遅延時間を、2つ目のld命令の実行時間とする。さらに、補正部322は、超過した有効遅延時間から本来の実行時間を差し引いて(3−1=2サイクル)、前命令の遅延時間とする。また、補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(3+3)=1サイクル)、猶予時間とする。
補正部322は、タイミングt1において、2つ目のld命令の遅延時間を補正した後、ヘルパー関数cache_ld(addr,2,1)を返す。この補正により、現タイミングt1に補正値(3サイクル)を付加したタイミングがld命令の実行完了のタイミングとなり、そのタイミングから、以降のmult命令、add命令の実行時間が加算されていくことになる。
図26は、ld命令の実行結果に対する補正例を示す説明図(その3)である。2つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。図26の例では、図25で示す説明例と同様の5つの命令のシミュレーションが実行される。
図26(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す。この予測ケースでは、図25(A)の場合と同様に、2つのld命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。図26(B)は、1つ目のld命令が予測結果と異なる「キャッシュミス」となり、2つ目のld命令の結果が予測結果(キャッシュヒット)である場合の命令実行タイミングのチャート例を示す。この予測ミスのケースでは、2つのld命令のそれぞれにペナルティサイクル(6サイクル)分の遅延が生じる。しかし、2つのld命令の遅延時間は重なる時間があり、mult命令も、遅延の影響を受けずに実行され、2つのadd命令の実行が2つ目のld命令の完了まで遅延することになる。図26(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す。
補正部322は、図24を用いて説明したように、タイミングt0において、1つ目のld命令の遅延時間を補正し、ヘルパー関数cache_ld(addr,3,−1)を返す。次に、現タイミングt1において、補正部322は、2つ目のld命令の実行結果がキャッシュヒットであるので(予測結果)、このld命令の実行開始から現タイミングt1までの時間<t1−t0−設定された間隔(6−0−2=4サイクル)>が、このld命令の実行時間(2サイクル)より大きいかを判断する。補正部322は、2つ目のld命令の実行開始から現タイミングt1までの時間が、このld命令の実行時間(2サイクル)より大きいので、現タイミングt1を、次のmult命令の実行タイミングとする。
そして、補正部322は、2つ目のld命令の実行完了から現タイミングt1までの時間を(2サイクル)、次の命令に対する遅延時間として扱い、前命令の遅延時間pre_delay=2とする。また、補正部322は、1つ目のld命令の有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(6+0)=1サイクル)、猶予時間rep_delay=1とし、ヘルパー関数cache_ld(addr,1,2)を返す。
(シミュレーション装置100の各種処理手順)
次に、シミュレーション装置100の各種処理手順について説明する。まず、シミュレーション装置100のコード変換部310の処理手順について説明する。
図27は、コード変換部310の処理手順の一例を示すフローチャートである。図27のフローチャートにおいて、まず、コード変換部310は、動作シミュレーションの処理対象ブロックが切り替わった場合、ホストコードリスト400を参照して、処理対象ブロックの実行開始時におけるターゲットCPUの内部状態を検出する(ステップS2701)。
次に、コード変換部310は、ホストコードリスト400を参照して、処理対象ブロックが未コンパイル部分か否かを判断する(ステップS2702)。ここで、処理対象ブロックが未コンパイル部分の場合(ステップS2702:Yes)、コード変換部310は、ターゲットプログラムTPのターゲットコードから処理対象ブロックのターゲットコードを分割する(ステップS2703)。また、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
そして、コード変換部310は、処理対象ブロックに含まれる外部依存命令を検出する(ステップS2704)。次に、コード変換部310は、検出した全ての命令について、予測情報350をもとに、確率が高い実行結果を予測ケースとして設定する(ステップS2705)。
そして、コード変換部310は、ターゲットCPUの内部状態とタイミング情報340を参照して、処理対象ブロックの各命令について予測結果として設定された実行結果(予測ケース)を前提とする動作シミュレーションを実行する(ステップS2706)。
次に、コード変換部310は、動作シミュレーションのシミュレーション結果をもとに、処理対象ブロックの実行時間を計算可能なホストコードhcを生成し(ステップS2707)、生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行が終了した時点のターゲットCPUの内部状態とを出力する(ステップS2708)。この結果、処理対象ブロックのブロックIDと対応付けて、ホストコードhcと処理対象ブロックの実行終了時のターゲットCPUの内部状態とがホストコードリスト400に記録される。
また、ステップS2702において、処理対象ブロックがコンパイル済みの場合(ステップS2702:No)、コード変換部310は、ホストコードリスト400を参照して、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出されたターゲットCPUの内部状態と同一であるか否かを判断する(ステップS2709)。
ここで、ターゲットCPUの内部状態が同一ではない場合(ステップS2709:No)、コード変換部310は、ステップS2706に移行する。そして、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
一方、ターゲットCPUの内部状態が同一の場合(ステップS2709:Yes)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行が終了した時点のターゲットCPUの内部状態とを出力する(ステップS2708)。
これにより、処理対象ブロックのターゲットコードをコンパイルして得られる機能コードfcに、ターゲットCPUの内部状態を考慮してターゲットCPUの性能を見積もるタイミングコードtcが組み込まれたホストコードhcを出力することができる。また、あるブロックBについて同一のホストコードhcが繰り返し生成されることを防ぐことができる。また、ターゲットCPUの内部状態が不一致のためにホストコードhcを生成する場合(ステップS2709:No)、ターゲットCPUの内部状態に依存しないステップS2703〜S2705の処理を省略して処理効率を向上させることができる。
図28は、シミュレーション実行部320の処理手順の一例を示すフローチャートである。図28において、まず、シミュレーション実行部320は、ホストコードリスト400を参照して、コード変換部310が生成したホストコードhcを実行し、性能シミュレーションを行う(ステップS2801)。次に、シミュレーション実行部320は、実行中に外部依存命令を検出すると(ステップS2802)、その命令の実行結果が予測結果として設定されたものと同じであるかを判定する(ステップS2803)。
ここで、外部依存命令の実行結果が設定された予測結果と同じではない場合(ステップS2803:No)、シミュレーション実行部320は、その外部依存命令の実行時間を補正する(ステップS2804)。一方、外部依存命令の実行結果が設定された予測結果と同じ場合には(ステップS2803:Yes)、シミュレーション実行部320は、ステップS2804の補正を行わずにステップS2805に移行する。
そして、シミュレーション情報収集部330は、処理対象ブロックのシミュレーション情報360を出力する(ステップS2805)。この際、ターゲットCPUの性能シミュレーションが完了していない場合は、シミュレーション情報収集部330は、次の処理対象ブロックの情報(例えば、ブロックID)を出力する。
一方、ターゲットCPUの性能シミュレーションが完了した場合は、シミュレーション情報収集部330は、ターゲットCPUがターゲットプログラムTPを実行した場合の全体の実行時間を含むシミュレーション情報360を出力することにしてもよい。これにより、ターゲットプログラムTPを実行するターゲットCPUのシミュレーション情報360(サイクルシミュレーション情報)を出力することができる。
図29は、補正部322の処理手順の一例を示すフローチャートである。ここで、図28に示したステップS2802〜S2804の処理を実現する補正部322の処理手順について説明する。ここでは、外部依存命令の一例としてロード命令を例に挙げて、ロード命令の処理についての予測結果の判定および補正を行う場合について説明する。
図29のフローチャートにおいて、シミュレーション実行部320のコード実行部321は、処理対象ブロックの命令から、外部依存命令を検出すると、補正部322に相当するヘルパー関数を呼び出す(ステップS2901)。次に、コード実行部321は、ld命令で、キャッシュアクセスが要求されているかを判定する(ステップS2902)。
ここで、キャッシュアクセスが要求されていれば(ステップS2902:Yes)、コード実行部321は、キャッシュアクセスの試行(実行)をシミュレーションする(ステップS2903)。そして、キャッシュアクセスの結果が“キャッシュミス”であれば(ステップS2904:“ミス”)、補正部322は、ld命令の実行時間(サイクル数)の補正を行い(ステップS2905)、補正された実行時間(サイクル数)を出力する(ステップS2906)。
また、ステップS2902において、キャッシュアクセスが要求されていない場合(ステップS2902:No)、補正部322は、未補正の予測された実行時間(サイクル数)を出力する(ステップS2907)。また、ステップS2904において、要求されたキャッシュアクセスが“キャッシュヒット”であれば(ステップS2904:“ヒット”)、補正部322は、未補正の予測された実行時間(サイクル数)を出力する(ステップS2907)。
これにより、ホストコードhcを実行した実行結果において、外部依存命令の実行結果が予測結果と異なる場合に、外部依存命令の実行時間を補正することができる。
以上説明したように、実施の形態1にかかるシミュレーション装置100によれば、動作シミュレーションにおける処理対象ブロックが切り替わった場合に、処理対象ブロックの実行開始時のターゲットCPUの内部状態を検出することができる。また、シミュレーション装置100によれば、検出したターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行することにより、処理対象ブロックを実行した場合の実行時間を計算可能なホストコードhcを生成することができる。そして、シミュレーション装置100によれば、生成したホストコードhcを実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を算出することができる。
これにより、ターゲットCPUの内部状態や命令間の依存関係に応じて変化する命令の実行順序を考慮して、処理対象ブロックの実行時間を求めることができ、アウト・オブ・オーダー実行のターゲットCPUの性能の見積もり精度の向上を図ることができる。例えば、あるブロックBの命令のうち他の命令に依存しない命令が順次実行されて、ブロックBを跨がって命令の追い越しが発生するような場合であっても、各ブロックBの実行時間を高精度に見積もることができる。
また、シミュレーション装置100によれば、処理対象ブロックが切り替わった場合に、処理対象ブロックが以前に処理対象となったか否かを判断することができる。これにより、処理対象ブロックが機能コードfcを生成していない未コンパイル部分か否かを判断することができる。
また、シミュレーション装置100によれば、処理対象ブロックが以前に処理対象となっている場合、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出したターゲットCPUの内部状態と同一であるか否かを判断することができる。そして、シミュレーション装置100によれば、ターゲットCPUの内部状態が同一でない場合に、処理対象ブロックのホストコードhcを生成することができる。また、シミュレーション装置100によれば、ターゲットCPUの内部状態が同一である場合は、処理対象ブロックのホストコードhcを生成しないようにすることができる。また、シミュレーション装置100によれば、ターゲットCPUの内部状態が同一である場合は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcを実行することにより、処理対象ブロックの実行時間を算出することができる。
これにより、あるブロックBについて同一のホストコードhcが繰り返し生成されることを防ぐことができ、ターゲットCPUの性能シミュレーションにかかるメモリ使用量の増大を抑制することができる。また、同一のホストコードhcを繰り返し生成する処理を削減して性能シミュレーションの高速化を図ることができる。
また、シミュレーション装置100によれば、処理対象ブロックに含まれる命令のうち、外部依存命令の処理の実行結果を予測結果として設定することにより、検出したターゲットCPUの内部状態に基づく動作シミュレーションを実行することができる。これにより、外部依存命令の実行結果に応じた様々なパターンに対応するためのコードを盛り込むことによる機能コードfcのコード量の増大を抑制することができる。この結果、性能シミュレーションにかかる負荷の増大を抑制するとともに、性能シミュレーションの高速化を図ることができる。
また、シミュレーション装置100によれば、ホストコードhcを実行した実行結果において、外部依存命令の実行結果が予測結果と異なる場合に、予め設定した補正値を用いて、外部依存命令の実行時間を補正し、処理対象ブロックの実行時間を算出することができる。これにより、ターゲットCPUの性能の見積もり精度の向上を図ることができる。
(実施の形態2)
次に、実施の形態2にかかるシミュレーション装置100について説明する。なお、実施の形態1で説明した箇所と同一箇所については、同一符号を付して図示および説明を省略する。
上述したように、ターゲットCPUの内部状態は、ターゲットCPUの命令キュー、実行ユニット、リオーダ・バッファなど様々な状態がある。しかし、ターゲットCPUの内部状態の数が多くなると、処理対象ブロックの実行開始時のターゲットCPUの内部状態が、以前に処理対象ブロックが処理対象となった際のターゲットCPUの内部状態と一致しないことが多くなる。
例えば、あるレジスタの値をインクリメントしていくような単純なループ処理であっても、n回目のループと(n+1)回目のループとの間でターゲットCPUの内部状態が一致しないことがよくある。また、ターゲットCPUの内部状態が一致しないことが多くなると、ホストコードhcを再利用できる回数が少なくなる。
ここで、ターゲットCPUの命令キューを例に挙げて、単純なループ処理を実行する際の命令キューの状態の変化例について説明する。
図30は、ターゲットCPUの命令キューの状態の変化例を示す説明図である。ここでは、ターゲットCPUの命令キュー3000に格納できる命令数の上限を「3」とし、ループの度に、命令キュー3000の命令数が「1」増える場合を想定する。また、命令キュー3000以外のモジュール(例えば、実行ユニット、リオーダ・バッファなど)については、その上限を超えない場合を想定する。
この場合、3回目のループで命令キュー3000の命令数が「3」となり、4回目以降のループでは、命令キュー3000に空きができるまでの待ちが発生して、命令の実行時間(サイクル数)が増えることになる。一方、1日目〜3回目までのループでは、命令キュー3000に空きがあり待ちが発生しないため、命令の実行時間(サイクル数)は変わらない。
このように、n回目のループと(n+1)回目のループとの間で、命令キュー3000の状態が変化していても、命令キュー3000の上限を超えるまでは、命令の実行時間(サイクル数)は変わらない。すなわち、ターゲットCPUの内部状態が一致していなくても、命令の実行時間(サイクル数)が変わらないことがある。
そこで、実施の形態2では、シミュレーション装置100は、ターゲットCPUの内部状態が一致していなくても、処理対象ブロックの実行に使用される命令キューなどの資源の量が上限を超えなければ、生成済みの処理対象ブロックのホストコードhcを再利用する。これにより、性能シミュレーションの精度を確保しつつ高速化を図る。
(ターゲットプログラムTPのターゲットコード例)
まず、ターゲットプログラムTPのターゲットコード例について説明する。
図31は、ターゲットコードの一例を示す説明図(その3)である。図31において、ターゲットコード3100は、ユークリッドの互除法を用いて最大公約数を求めるプログラムである。ターゲットコード3100では、r0,r1(r0≧r1)が入力となり、r0,r1の最大公約数が出力となる。
ターゲットコード3100は、(i)r1=0なら、r0を出力して処理を終了し、(ii)r1=0でないなら、r0をr1で割った余りを新たなr1とし、元のr1を新たなr0として上記(i)に戻って処理を繰り返すものである。ターゲットコード3100をC言語で記述すると、例えば、以下のようになる。
unsigned Euclid(unsigned a, unsigned b)

unsigned r;

if (b==0)
return a;
do{
r=a%b;
a=b;
b=r;
}while(r!=0);
return a;
(ターゲットCPUの内部状態の変化例)
次に、動作シミュレーションにおいて、図6に示したターゲットCPU600がターゲットコード3100を実行した場合のターゲットCPU600の内部状態の変化例について説明する。
図32は、ターゲットCPUの内部状態の変化例を示す説明図(その13)である。ここでは、ターゲットコード3100の3〜8行目を処理対象ブロックであるブロックB2(図31参照)とし、1,2行目を処理対象ブロックの直前に実行されたブロックB1(図31参照)とする。また、ターゲットCPU600の命令キュー602に格納できる命令数の上限を「4」とする。
図32において、内部状態3201は、動作シミュレーションにおける処理対象ブロック(ブロックB2)の実行開始時のターゲットCPU600の内部状態を示している。ここでは、ターゲットCPU600の内部状態として、命令キュー602に格納されている命令と、実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)に投入されている命令と、リオーダ・バッファ607に格納されている命令とが示されている。
内部状態3201では、命令キュー602には、命令1(cmp r1,#0)と命令2(bz 9)が格納されている。実行ユニットは、空の状態である。リオーダ・バッファ607には、命令1(cmp r1,#0)と命令2(bz 9)が格納されている。
内部状態3202は、動作シミュレーションにおける処理対象ブロック(ブロックB2)の実行終了時のターゲットCPU600の内部状態を示している。内部状態3202では、命令キュー602には、命令6(mov r1,r3)と命令7(cmp r3,#0)と命令8(bne 3)が格納されている。
また、実行ユニットには、命令4(mls r3,r1,r3,r0)が投入されている。また、リオーダ・バッファ607には、命令3(udiv r3,r0,r1)と命令4(mls r3,r1,r3,r0)と命令5(mov r0,r1)と命令6(mov r1,r3)と命令7(cmp r3,#0)と命令8(bne 3)が格納されている。
このように、処理対象ブロック(ブロックB2)を1回実行すると、命令キュー602の命令数が「1」増える。このため、2回目の処理対象ブロック(ブロックB2)の実行終了後に命令キュー602がいっぱいになり、3回目の処理対象ブロック(ブロックB2)の実行開始が遅れることになる。
(ホストコードリスト400の記憶内容)
次に、実施の形態2にかかるシミュレーション装置100が用いるホストコードリスト400の記憶内容について説明する。
図33は、ホストコードリスト400の記憶内容の一例を示す説明図(その2)である。図33において、ホストコードリスト400は、ブロックIDと、ホストコードと、実行開始時のターゲットCPUの内部状態と、実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減とを対応付けて記憶する。
ここで、ブロックIDは、ターゲットコードを分割して得られるブロックBの識別子である。ホストコードは、ブロックBのホストコードhcである。実行開始時のターゲットCPUの内部状態は、動作シミュレーションにおけるブロックBの実行開始時のターゲットCPUの内部状態である。
実行終了時のターゲットCPUの内部状態は、動作シミュレーションにおけるブロックBの実行終了時のターゲットCPUの内部状態である。ターゲットCPUの資源使用量の増減は、ブロックBの実行前後におけるターゲットCPUの資源使用量の増減である。ターゲットCPUの資源使用量とは、動作シミュレーションにおけるブロックBの実行に使用されるターゲットCPUの資源の量である。
ターゲットCPUの資源は、ターゲットCPUがアウト・オブ・オーダー実行を実現するために有するモジュールであり、例えば、ターゲットCPUの命令キュー、実行ユニット、リオーダ・バッファなどである。ターゲットCPUの資源使用量は、例えば、ターゲットCPUの命令キューやリオーダ・バッファに格納されている命令数や実行ユニットに投入されている命令数によって表現される。
なお、図示は省略するが、ターゲットCPUの資源使用量の増減として、動作シミュレーションにおけるブロックBの実行に使用される各実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)の増減についてもホストコードリスト400に記憶される。
例えば、ホストコードリスト400には、ブロックB1のブロックID「B1」と対応付けて、ブロックB1のホストコードhc1と、ブロックB1の実行開始時のターゲットCPUの内部状態S0と、ブロックB1の実行終了時のターゲットCPUの内部状態S1とが記憶されている。また、ブロックB1のブロックID「B1」と対応付けて、ブロックB1の実行前後におけるターゲットCPUの資源使用量の増減「命令キュー:+2、リオーダ・バッファ:+2」が記憶されている。
(シミュレーション装置100の機能部)
次に、実施の形態2にかかるシミュレーション装置100の各機能部について説明する。ただし、実施の形態2にかかるシミュレーション装置100の機能的構成は、図3に示したシミュレーション装置100の機能的構成例と同様のため図示を省略する。また、実施の形態2にかかるシミュレーション装置100の機能部のうち、実施の形態1で説明した機能部と同様の箇所については、同一符号を付して説明を省略する。
予測シミュレーション実行部312は、処理対象ブロックが切り替わった場合、処理対象ブロックが以前に処理対象となったか否かを判断する。具体的には、例えば、予測シミュレーション実行部312は、図33に示したホストコードリスト400を参照して、処理対象ブロックのブロックIDが登録されているか否かを判断する。
そして、処理対象ブロックのブロックIDが登録されている場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断する。一方、処理対象ブロックのブロックIDが未登録の場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となっていないと判断する。
ここで、処理対象ブロックが以前に処理対象となっていないと判断した場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
また、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断した場合、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態と同一であるか否かを判断する。
具体的には、例えば、予測シミュレーション実行部312は、ホストコードリスト400(図33参照)を参照して、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態が、処理対象ブロックのブロックIDと対応付けて記憶された実行開始時のターゲットCPUの内部状態と同一であるか否かを判断する。
ここで、ターゲットCPUの内部状態が同一の場合、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。すなわち、実行開始時のターゲットCPUの内部状態が同一であれば、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できるため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
一方、ターゲットCPUの内部状態が同一でない場合、予測シミュレーション実行部312は、処理対象ブロックを実行した際に処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する。具体的には、例えば、予測シミュレーション実行部312は、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減に基づいて、ターゲットCPUの資源使用量が上限を超えるか否かを判断する。
ターゲットCPUの資源の上限は、例えば、ターゲットCPUの命令キュー、リオーダ・バッファに格納できる命令数や実行ユニットに投入できる命令数によって表現される。また、ターゲットCPUの資源の上限を特定する情報は、例えば、RAM203、ディスク205などの記憶装置に記憶されている。
より詳細に説明すると、予測シミュレーション実行部312は、例えば、後述の図34に示すような資源使用量情報3400を参照して、ターゲットCPUの資源使用量が上限を超えるか否かを判断する。ターゲットCPUの資源使用量が上限を超えるか否かの判断例については、図34を用いて後述する。
ここで、ターゲットCPUの資源使用量が上限を超えない場合、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
すなわち、ターゲットCPUの資源使用量が上限を超えなければ、処理対象ブロックの実行時間(サイクル数)が変わらないため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できる。このため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
また、コード実行部321は、ターゲットCPUの資源使用量が上限を超えない場合は、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを実行する。すなわち、コード実行部321は、ターゲットCPUの資源使用量が上限を超えなければ、生成済みの処理対象ブロックのホストコードhcを実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を算出する。
一方、ターゲットCPUの資源使用量が上限を超える場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
すなわち、ターゲットCPUの資源使用量が上限を超えると、動作シミュレーションにおける処理対象ブロックの実行時間(サイクル数)が変わるため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できない。このため、コード生成部313は、処理対象ブロックのホストコードhcを生成する。
また、コード生成部313は、処理対象ブロックの実行開始時のターゲットCPUの内部状態と、処理対象ブロックの実行終了時のターゲットCPUの内部状態とに基づいて、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報を生成する。
ここで、図32に示したターゲットCPUの内部状態を例に挙げると、コード生成部313は、処理対象ブロック(ブロックB2)の実行開始時の内部状態3201と、処理対象ブロック(ブロックB2)の実行終了時の内部状態3202とを比較する。
図32の例では、処理対象ブロック(ブロックB2)の実行前後において、命令キュー602の命令数が「1」増え、実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)の命令数が「1」増え、リオーダ・バッファ607の命令数が「4」増えている。
この場合、コード生成部313は、処理対象ブロック(ブロックB2)の実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報(命令キュー:+1、実行ユニット:+1、リオーダ・バッファ:+4)を生成する。そして、コード生成部313は、処理対象ブロック(ブロックB2)のブロックID「B2」と対応付けて、ターゲットCPUの資源使用量の増減をホストコードリスト400に記録する。
また、コード実行部321は、処理対象ブロックのホストコードhcを実行した場合、ターゲットCPUの資源使用量を計算する。具体的には、例えば、コード実行部321は、ホストコードリスト400(図33参照)を参照して、ホストコードhcを実行した処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を特定する。そして、コード実行部321は、特定したターゲットCPUの資源使用量の増減に基づいて、ターゲットCPUの資源使用量を示す資源使用量情報を生成する。
ここで、図34を用いて、ターゲットコード3100が実行された場合のターゲットCPU600の資源使用量を示す資源使用量情報の生成例について説明する。
図34は、資源使用量情報の生成例を示す説明図である。図34において、資源使用量情報3400は、ターゲットCPU600の資源使用量を示す情報である。ここでは、ターゲットCPU600の資源として、命令キュー602とリオーダ・バッファ607を例に挙げて説明する。
また、ターゲットCPU600の資源使用量を、命令キュー602に格納される命令数とリオーダ・バッファ607に格納される命令数によって表現する。また、初期状態では、命令キュー602とリオーダ・バッファ607は、空の状態である場合を想定する。すなわち、初期状態において、命令キュー602の命令数とリオーダ・バッファ607の命令数はともに「0」である。
まず、コード実行部321は、ブロックB1のホストコードhc1を実行した場合、ホストコードリスト400(図33参照)を参照して、ブロックB1の実行前後におけるターゲットCPU600の資源使用量の増減を特定する。そして、コード実行部321は、特定したターゲットCPU600の資源使用量の増減を資源使用量情報3400に記録する。
ここでは、ターゲットCPU600の資源使用量の増減「命令キュー:+2、リオーダ・バッファ:+2」が特定されて、資源使用量情報3400に記録される(図34中、(1))。
次に、コード実行部321は、ブロックB2のホストコードhc2を実行した場合、ホストコードリスト400(図33参照)を参照して、ブロックB2の実行前後におけるターゲットCPU600の資源使用量の増減を特定する。そして、コード実行部321は、特定したターゲットCPU600の資源使用量の増減に基づいて、資源使用量情報3400を更新する。
ここでは、ターゲットCPU600の資源使用量の増減「命令キュー:+1、リオーダ・バッファ:+4」が特定されて、資源使用量情報3400が更新される(図34中、(2))。
具体的には、コード実行部321は、資源使用量情報3400の命令キュー602の命令数「2」に、特定した命令キュー602の命令数「+1」を加えることにより、命令キュー602の命令数を「3」に更新する。また、コード実行部321は、資源使用量情報3400のリオーダ・バッファ607の命令数「2」に、特定したリオーダ・バッファ607の命令数「+4」を加えることにより、リオーダ・バッファ607の命令数を「6」に更新する。
このように、処理対象ブロックのホストコードhcを実行する度に、処理対象ブロックの増減情報に基づいてターゲットCPU600の資源使用量を更新することにより、ターゲットCPU600の資源使用量を示す資源使用量情報3400を生成することができる。
ここで、図34(2)に示した資源使用量情報3400を例に挙げて、ターゲットCPU600の資源使用量が上限を超えるか否かの判断例について説明する。ここでは、ターゲットCPU600の命令キュー602の上限を「3」とし、ターゲットCPU600の命令キュー602の資源使用量が上限を超えるか否かの判断例について説明する。
ここで、処理対象ブロック(ブロックB2)の実行前後におけるターゲットCPU600の命令キュー602の資源使用量の増減は「+1」である(図33参照)。このため、予測シミュレーション実行部312は、資源使用量情報3400を参照して、ターゲットCPU600の命令キュー602の資源使用量「3」に「+1」を加えて、命令キュー602の資源使用量「4」を算出する。
これにより、次に処理対象ブロック(ブロックB2)を実行する際のターゲットCPU600の命令キュー602の資源使用量「4」を求めることができる。そして、予測シミュレーション実行部312は、算出した命令キュー602の資源使用量「4」が、命令キュー602の上限「3」を超えるか否かを判断する。ここでは、予測シミュレーション実行部312は、命令キュー602の上限「3」を超えると判断する。
(シミュレーション装置100の各種処理手順)
次に、実施の形態2にかかるシミュレーション装置100の各種処理手順について説明する。まず、実施の形態2にかかるシミュレーション装置100のコード変換部310の処理手順について説明する。
図35は、実施の形態2にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。図35のフローチャートにおいて、まず、コード変換部310は、動作シミュレーションの処理対象ブロックが切り替わった場合、ホストコードリスト400を参照して、処理対象ブロックの実行開始時におけるターゲットCPUの内部状態を検出する(ステップS3501)。
次に、コード変換部310は、ホストコードリスト400を参照して、処理対象ブロックが未コンパイル部分か否かを判断する(ステップS3502)。ここで、処理対象ブロックが未コンパイル部分の場合(ステップS3502:Yes)、コード変換部310は、ターゲットプログラムTPのターゲットコードから処理対象ブロックのターゲットコードを分割する(ステップS3503)。また、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
そして、コード変換部310は、処理対象ブロックに含まれる外部依存命令を検出する(ステップS3504)。次に、コード変換部310は、検出した全ての命令について、予測情報350をもとに、確率が高い実行結果を予測ケースとして設定する(ステップS3505)。
そして、コード変換部310は、ターゲットCPUの内部状態とタイミング情報340を参照して、処理対象ブロックの各命令について予測結果として設定された実行結果(予測ケース)を前提とする動作シミュレーションを実行する(ステップS3506)。
次に、コード変換部310は、動作シミュレーションのシミュレーション結果をもとに、処理対象ブロックの実行時間を計算可能なホストコードhcを生成する(ステップS3507)。そして、コード変換部310は、処理対象ブロックの実行開始時のターゲットCPUの内部状態と、処理対象ブロックの実行終了時のターゲットCPUの内部状態とに基づいて、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報を生成する(ステップS3508)。
次に、コード変換部310は、生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、生成した処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報を出力する(ステップS3509)。
この結果、処理対象ブロックのブロックIDと対応付けて、ホストコードhcと処理対象ブロックの実行終了時のターゲットCPUの内部状態とターゲットCPUの資源使用量の増減を示す増減情報とがホストコードリスト400に記録される。
また、ステップS3502において、処理対象ブロックがコンパイル済みの場合(ステップS3502:No)、コード変換部310は、ホストコードリスト400を参照して、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出されたターゲットCPUの内部状態と同一であるか否かを判断する(ステップS3510)。
ここで、ターゲットCPUの内部状態が同一ではない場合(ステップS3510:No)、コード変換部310は、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する(ステップS3511)。ここで、ターゲットCPUの資源使用量が上限を超える場合(ステップS3511:Yes)、コード変換部310は、ステップS3506に移行する。そして、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
一方、ターゲットCPUの資源使用量が上限を超えない場合(ステップS3511:No)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減を示す増減情報とを出力する(ステップS3509)。
また、ステップS3510において、ターゲットCPUの内部状態が同一の場合(ステップS3510:Yes)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減を示す増減情報とを出力する(ステップS3509)。
これにより、ターゲットCPUの内部状態が一致する、あるいは、ターゲットCPUの資源使用量が上限を超えない場合は、処理対象ブロックが以前に処理対象となった際のホストコードhcを流用することができ、あるブロックBについて同一のホストコードhcが繰り返し生成されることを防ぐことができる。
図36は、実施の形態2にかかるシミュレーション装置100のシミュレーション実行部320の処理手順の一例を示すフローチャートである。図36において、まず、シミュレーション実行部320は、ホストコードリスト400を参照して、コード変換部310が生成したホストコードhcを実行し、性能シミュレーションを行う(ステップS3601)。次に、シミュレーション実行部320は、実行中に外部依存命令を検出すると(ステップS3602)、その命令の実行結果が予測結果として設定されたものと同じであるかを判定する(ステップS3603)。
ここで、外部依存命令の実行結果が設定された予測結果と同じではない場合(ステップS3603:No)、シミュレーション実行部320は、その外部依存命令の実行時間を補正する(ステップS3604)。一方、外部依存命令の実行結果が設定された予測結果と同じ場合には(ステップS3603:Yes)、シミュレーション実行部320は、ステップS3604の補正を行わずにステップS3606に移行する。
次に、シミュレーション実行部320は、ホストコードリスト400(図33参照)を参照して、ターゲットCPUの資源使用量を計算する(ステップS3605)。そして、シミュレーション情報収集部330は、処理対象ブロックのシミュレーション情報360を出力する(ステップS3606)。この際、ターゲットCPUの性能シミュレーションが完了していない場合は、シミュレーション情報収集部330は、次の処理対象ブロックの情報(例えば、ブロックID)を出力する。
一方、ターゲットCPUの性能シミュレーションが完了した場合は、シミュレーション情報収集部330は、ターゲットCPUがターゲットプログラムTPを実行した場合の全体の実行時間を含むシミュレーション情報360を出力することにしてもよい。これにより、ターゲットプログラムTPを実行するターゲットCPUのシミュレーション情報360(サイクルシミュレーション情報)を出力することができる。
以上説明した実施の形態2にかかるシミュレーション装置100によれば、ターゲットCPUの内部状態が同一でないと判断した場合に、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減に基づいて、処理対象ブロックを実行した際にターゲットCPUの資源使用量が上限を超えるか否かを判断することができる。これにより、ターゲットCPUの内部状態が一致していなくても、命令の実行時間(サイクル数)が変わらない状況を判別することができる。
また、シミュレーション装置100によれば、ターゲットCPUの資源使用量が上限を超える場合に処理対象ブロックのホストコードhcを生成し、ターゲットCPUの資源使用量が上限を超えない場合は処理対象ブロックのホストコードhcを生成しないようにすることができる。そして、シミュレーション装置100によれば、ターゲットCPUの資源使用量が上限を超えない場合は、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを実行することにより、処理対象ブロックの実行時間を算出することができる。
これにより、ターゲットCPUの内部状態が一致していなくても、ターゲットCPUの資源使用量が上限を超えなければ、処理対象ブロックが以前に処理対象となった際のホストコードhcを再利用することができる。この結果、性能シミュレーションの精度を確保しつつ、性能シミュレーションの高速化を図ることができる。
(実施の形態3)
次に、実施の形態3にかかるシミュレーション装置100について説明する。実施の形態3では、ターゲットCPUの資源使用量を計算するための計算コードをホストコードhcに組み込んで、ホストコードhcの実行時にターゲットCPUの資源使用量を計算する場合について説明する。なお、実施の形態1,2で説明した箇所と同一箇所については、同一符号を付して図示および説明を省略する。
(シミュレーション装置100の機能部)
次に、実施の形態3にかかるシミュレーション装置100の各機能部について説明する。ただし、実施の形態3にかかるシミュレーション装置100の機能的構成は、図3に示したシミュレーション装置100の機能的構成例と同様のため図示を省略する。また、実施の形態3にかかるシミュレーション装置100の機能部のうち、実施の形態1,2で説明した機能部と同様の箇所については、同一符号を付して説明を省略する。
予測シミュレーション実行部312は、処理対象ブロックが切り替わった場合、処理対象ブロックが以前に処理対象となったか否かを判断する。具体的には、例えば、予測シミュレーション実行部312は、図4に示したホストコードリスト400を参照して、処理対象ブロックのブロックIDが登録されているか否かを判断する。
そして、処理対象ブロックのブロックIDが登録されている場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断する。一方、処理対象ブロックのブロックIDが未登録の場合、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となっていないと判断する。
ここで、処理対象ブロックが以前に処理対象となっていないと判断した場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
この際、コード生成部313は、ターゲットCPUが処理対象ブロックを実行した場合の実行時間、および処理対象ブロックの実行に使用されるターゲットCPUの資源使用量を計算可能なホストコードhcを生成する。より具体的には、例えば、コード生成部313は、処理対象ブロックのコードをコンパイルした機能コードfcに、タイミングコードtc,資源量計算コードrcを組み込むことによりホストコードhcを生成する。
ここで、タイミングコードtcは、処理対象ブロックを実行した場合の実行時間を計算するコードである。また、資源量計算コードrcは、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量を計算するコードである。
コード生成部313は、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減に基づいて、資源量計算コードrcを生成することができる。資源量計算コードrcを含むホストコードhcの具体例については、図37を用いて後述する。
また、予測シミュレーション実行部312は、処理対象ブロックが以前に処理対象となったと判断した場合、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態と同一であるか否かを判断する。
ここで、ターゲットCPUの内部状態が同一の場合、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。すなわち、実行開始時のターゲットCPUの内部状態が同一であれば、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhc(資源量計算コードrcを含む)を流用できるため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
一方、ターゲットCPUの内部状態が同一でない場合、予測シミュレーション実行部312は、処理対象ブロックを実行した際に、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する。ここで、ターゲットCPUの資源使用量が上限を超えない場合、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
すなわち、ターゲットCPUの資源使用量が上限を超えなければ、処理対象ブロックの実行時間(サイクル数)が変わらないため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhc(資源量計算コードrcを含む)を流用できる。このため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
また、コード実行部321は、ターゲットCPUの資源使用量が上限を超えない場合は、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhc(資源量計算コードrcを含む)を実行する。すなわち、コード実行部321は、ターゲットCPUの資源使用量が上限を超えなければ、生成済みの処理対象ブロックのホストコードhc(資源量計算コードrcを含む)を実行することにより、ターゲットCPUが処理対象ブロックを実行した場合の実行時間を算出する。
なお、ホストコードhc(資源量計算コードrcを含む)を実行することにより計算されるターゲットCPUの資源使用量は、例えば、ターゲットCPU600の資源使用量を示す資源使用量情報として出力される。
一方、ターゲットCPUの資源使用量が上限を超える場合、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhc(資源量計算コードrcを含む)を生成する。
すなわち、ターゲットCPUの資源使用量が上限を超えると、動作シミュレーションにおける処理対象ブロックの実行時間(サイクル数)が変わるため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhc(資源量計算コードrcを含む)を流用できない。このため、コード生成部313は、処理対象ブロックのホストコードhc(資源量計算コードrcを含む)を生成する。
(資源量計算コードrcを含むホストコードhcの具体例)
次に、図16に示したホストコード1600に資源量計算コードrcを組み込んだ場合を例に挙げて、資源量計算コードrcを含むホストコードhcの具体例について説明する。ただし、ターゲットCPUの資源を「rsrc」の1種類とし、処理対象ブロックを実行すると「rsrc」が「1」増加する場合を想定する。
図37は、ホストコードhcの具体例を示す説明図(その3)である。図37において、ホストコード3700は、ターゲットCPUが処理対象ブロック701(図7参照)を実行した場合の実行時間をホストCPUが計算可能なコード(x86命令)である。
ホストコード3700において、10〜12行目が、ターゲットCPUの資源「rsrc」の資源使用量を計算する資源量計算命令(資源量計算コードrc)である。この資源量計算命令(資源量計算コードrc)は、ターゲットCPUの資源「rsrc」の資源使用量を「+1」する命令である。
なお、処理対象ブロックの実行に使用されるターゲットCPUの資源が2種類以上の場合は、各資源に対応する資源量計算命令(資源量計算コードrc)が生成されてホストコードhcに組み込まれることになる。例えば、資源が4種類の場合は、資源量計算命令(資源量計算コードrc)は「12命令=3命令×4」となる。
(シミュレーション装置100の各種処理手順)
次に、実施の形態3にかかるシミュレーション装置100のコード変換部310の処理手順について説明する。
図38は、実施の形態3にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。図38のフローチャートにおいて、まず、コード変換部310は、動作シミュレーションの処理対象ブロックが切り替わった場合、ホストコードリスト400(図4参照)を参照して、処理対象ブロックの実行開始時におけるターゲットCPUの内部状態を検出する(ステップS3801)。
次に、コード変換部310は、ホストコードリスト400を参照して、処理対象ブロックが未コンパイル部分か否かを判断する(ステップS3802)。ここで、処理対象ブロックが未コンパイル部分の場合(ステップS3802:Yes)、コード変換部310は、ターゲットプログラムTPのターゲットコードから処理対象ブロックのターゲットコードを分割する(ステップS3803)。また、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
そして、コード変換部310は、処理対象ブロックに含まれる外部依存命令を検出する(ステップS3804)。次に、コード変換部310は、検出した全ての命令について、予測情報350をもとに、確率が高い実行結果を予測ケースとして設定する(ステップS3805)。
そして、コード変換部310は、ターゲットCPUの内部状態とタイミング情報340を参照して、処理対象ブロックの各命令について予測結果として設定された実行結果(予測ケース)を前提とする動作シミュレーションを実行する(ステップS3806)。
次に、コード変換部310は、動作シミュレーションのシミュレーション結果をもとに、処理対象ブロックの実行時間、および処理対象ブロックの実行に使用されるターゲットCPUの資源使用量を計算可能なホストコードhc(資源量計算コードrcを含む)を生成する(ステップS3807)。
そして、コード変換部310は、生成したホストコードhc(資源量計算コードrcを含む)と、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態とを出力する(ステップS3808)。この結果、処理対象ブロックのブロックIDと対応付けて、ホストコードhc(資源量計算コードrcを含む)と処理対象ブロックの実行終了時のターゲットCPUの内部状態とがホストコードリスト400に記録される。
また、ステップS3802において、処理対象ブロックがコンパイル済みの場合(ステップS3802:No)、コード変換部310は、ホストコードリスト400を参照して、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出されたターゲットCPUの内部状態と同一であるか否かを判断する(ステップS3809)。
ここで、ターゲットCPUの内部状態が同一ではない場合(ステップS3809:No)、コード変換部310は、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する(ステップS3810)。ここで、ターゲットCPUの資源使用量が上限を超える場合(ステップS3810:Yes)、コード変換部310は、ステップS3806に移行する。そして、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
一方、ターゲットCPUの資源使用量が上限を超えない場合(ステップS3810:No)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhc(資源量計算コードrcを含む)と、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態とを出力する(ステップS3808)。
また、ステップS3809において、ターゲットCPUの内部状態が同一の場合(ステップS3809:Yes)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhc(資源量計算コードrcを含む)と、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態とを出力する(ステップS3808)。
なお、実施の形態3にかかるシミュレーション装置100のシミュレーション実行部320の処理手順については、図28に示したシミュレーション実行部320の処理手順と同様のため、ここでは図示および説明を省略する。
以上説明した実施の形態3にかかるシミュレーション装置100によれば、ターゲットCPUが処理対象ブロックを実行した場合の実行時間、および処理対象ブロックの実行に使用されるターゲットCPUの資源使用量を計算可能なホストコードhcを生成することができる。
これにより、ホストコードhcの生成過程で処理対象ブロックの実行に使用されるターゲットCPUの資源使用量を計算可能な資源量計算コードrcを含めることができ、ホストコードhcを実行することでターゲットCPUの資源使用量を求めることができるようになる。
(実施の形態4)
次に、実施の形態4にかかるシミュレーション装置100について説明する。なお、実施の形態1〜3で説明した箇所と同一箇所については、同一符号を付して図示および説明を省略する。
ここで、ターゲットCPUの資源使用量が上限を超える場合であっても、処理対象ブロックのホストコードhcを再利用して得られる処理対象ブロックの実行時間(サイクル数)を単純な計算で補正できる場合がある。処理対象ブロックの実行時間を補正できるかは、ターゲットCPUがアウト・オブ・オーダー実行を実現するために有するモジュールに依存する。
より具体的には、処理対象ブロックの実行時間を補正できるかは、ターゲットCPUの資源がいっぱいになってから空きができるまでの時間を簡単に求めることができるかどうかに依存する。図6に示したターゲットCPU600を例に挙げると、命令キュー602やリオーダ・バッファ607がいっぱいになってから空きができるまでの時間は比較的簡単に求めることができる。
例えば、命令キュー602の場合、実行ユニット(ALU603,604、ロード・ストアユニット605、分岐ユニット606)で実行中の命令の終了時刻を調べることで、命令キュー602にいつ空きができるかを求めることができる。一方、実行ユニットがいっぱいになってから空きができるまでの時間は、命令の依存関係を調べる必要があり簡単に求めることができない。
そこで、実施の形態4では、処理対象ブロックの実行時間を補正可能な資源についてのみ上限を超えている場合は、処理対象ブロックのホストコードhcを再利用し、資源の上限超えに起因する実行時間の誤差を補正するシミュレーション方法について説明する。
(シミュレーション装置100の機能部)
次に、実施の形態4にかかるシミュレーション装置100の各機能部について説明する。ただし、実施の形態4にかかるシミュレーション装置100の機能的構成は、図3に示したシミュレーション装置100の機能的構成例と同様のため図示を省略する。また、実施の形態4にかかるシミュレーション装置100の機能部のうち、実施の形態1〜3で説明した機能部と同様の箇所については、同一符号を付して説明を省略する。
予測シミュレーション実行部312は、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する。そして、ターゲットCPUの資源使用量が上限を超える場合、さらに、予測シミュレーション実行部312は、処理対象ブロックの実行に使用されるターゲットCPUの資源のうち所定の資源の資源使用量が上限を超えるか否かを判断する。
ここで、所定の資源は、所定の資源の資源使用量が上限を超える場合にホストコードhcを再利用して得られる処理対象ブロックの実行時間を、単純な計算で補正できない資源である。所定の資源は、例えば、ターゲットCPU600の実行ユニットである。
このため、所定の資源の資源使用量が上限を超える場合は、予測シミュレーション実行部312は、検出した処理対象ブロックの実行開始時のターゲットCPUの内部状態に基づいて、処理対象ブロックの動作シミュレーションを実行する。そして、コード生成部313は、予測シミュレーション実行部312のシミュレーション結果に基づいて、処理対象ブロックのホストコードhcを生成する。
すなわち、所定の資源の資源使用量が上限を超えると、ホストコードhcを再利用して得られる処理対象ブロックの実行時間を簡単に補正できないため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できない。このため、コード生成部313は、処理対象ブロックのホストコードhcを生成する。
一方、所定の資源の資源使用量が上限を超えない場合は、予測シミュレーション実行部312は、処理対象ブロックの動作シミュレーションを実行しない。また、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
すなわち、所定の資源の資源使用量が上限を超えていなければ、ホストコードhcを再利用して得られる処理対象ブロックの実行時間を比較的簡単に補正できるため、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを流用できる。このため、コード生成部313は、処理対象ブロックのホストコードhcを生成しない。
また、コード実行部321は、所定の資源の資源使用量が上限を超えない場合は、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを実行する。そして、コード実行部321は、ホストコードhcを実行して得られる処理対象ブロックの実行時間に、所定の資源以外の資源の資源使用量の上限超えに起因して発生する遅延値を加算する補正を行う。
所定の資源以外の資源とは、その資源の資源使用量が上限を超えていても、ホストコードhcを再利用して得られる処理対象ブロックの実行時間を、単純な計算で補正できる資源である。所定の資源以外の資源は、例えば、ターゲットCPU600の命令キュー602やリオーダ・バッファ607である。
資源使用量の上限超えに起因して発生する遅延値は、例えば、タイミング情報340(図3参照)に含まれるターゲットコードの各命令実行時の実行時間の基準値と、実行ユニットで実行中の命令の実行時間(未完了)とから求めることができる。
ここで、資源使用量の上限超えに起因して発生する遅延値の算出例について説明する。一例として、図31に示したターゲットコード3100を例に挙げると、図32に示したように、処理対象ブロック(ブロックB2)を1回実行すると、命令キュー602の命令数が「1」増える。
このため、2回目の処理対象ブロック(ブロックB2)の実行終了後に命令キュー602がいっぱいになり、3回目の処理対象ブロック(ブロックB2)の実行開始が遅れることになる。3回目の処理対象ブロック(ブロックB2)の実行の場合、実行ユニットでは命令4(mls r3,r1,r3,r0)だけが実行中である。
例えば、命令4を実行時の実行時間の基準値を「4サイクル」とし、実行ユニットで実行中の命令4の実行時間を「1サイクル」とすると、命令4の実行終了にあと3サイクルかかることになる。すなわち、3回目の処理対象ブロック(ブロックB2)の実行開始が3サイクル遅れることになる。
この場合、コード実行部321は、ターゲットCPU600の命令キュー602の資源使用量の上限超えに起因して発生する遅延値を「3サイクル」と算出する。そして、コード実行部321は、ホストコードhcを実行して得られる処理対象ブロック(ブロックB2)の実行時間に遅延値「3サイクル」を加算することにより、処理対象ブロック(ブロックB2)の実行時間を補正する。
(シミュレーション装置100の各種処理手順)
次に、実施の形態4にかかるシミュレーション装置100の各種処理手順について説明する。まず、実施の形態4にかかるシミュレーション装置100のコード変換部310の処理手順について説明する。
図39は、実施の形態4にかかるシミュレーション装置100のコード変換部310の処理手順の一例を示すフローチャートである。図39のフローチャートにおいて、まず、コード変換部310は、動作シミュレーションの処理対象ブロックが切り替わった場合、ホストコードリスト400(図33参照)を参照して、処理対象ブロックの実行開始時におけるターゲットCPUの内部状態を検出する(ステップS3901)。
次に、コード変換部310は、ホストコードリスト400を参照して、処理対象ブロックが未コンパイル部分か否かを判断する(ステップS3902)。ここで、処理対象ブロックが未コンパイル部分の場合(ステップS3902:Yes)、コード変換部310は、ターゲットプログラムTPのターゲットコードから処理対象ブロックのターゲットコードを分割する(ステップS3903)。また、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
そして、コード変換部310は、処理対象ブロックに含まれる外部依存命令を検出する(ステップS3904)。次に、コード変換部310は、検出した全ての命令について、予測情報350をもとに、確率が高い実行結果を予測ケースとして設定する(ステップS3905)。
そして、コード変換部310は、ターゲットCPUの内部状態とタイミング情報340を参照して、処理対象ブロックの各命令について予測結果として設定された実行結果(予測ケース)を前提とする動作シミュレーションを実行する(ステップS3906)。
次に、コード変換部310は、動作シミュレーションのシミュレーション結果をもとに、処理対象ブロックの実行時間を計算可能なホストコードhcを生成する(ステップS3907)。そして、コード変換部310は、処理対象ブロックの実行開始時のターゲットCPUの内部状態と、処理対象ブロックの実行終了時のターゲットCPUの内部状態とに基づいて、処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報を生成する(ステップS3908)。
次に、コード変換部310は、生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、生成した処理対象ブロックの実行前後におけるターゲットCPUの資源使用量の増減を示す増減情報を出力する(ステップS3909)。
この結果、処理対象ブロックのブロックIDと対応付けて、ホストコードhcと処理対象ブロックの実行終了時のターゲットCPUの内部状態とターゲットCPUの資源使用量の増減を示す増減情報とがホストコードリスト400に記録される。
また、ステップS3902において、処理対象ブロックがコンパイル済みの場合(ステップS3902:No)、コード変換部310は、ホストコードリスト400を参照して、検出したターゲットCPUの内部状態が、処理対象ブロックが以前に処理対象となった際に検出されたターゲットCPUの内部状態と同一であるか否かを判断する(ステップS3910)。
ここで、ターゲットCPUの内部状態が同一ではない場合(ステップS3910:No)、コード変換部310は、処理対象ブロックの実行に使用されるターゲットCPUの資源使用量が上限を超えるか否かを判断する(ステップS3911)。
ここで、ターゲットCPUの資源使用量が上限を超える場合(ステップS3911:Yes)、コード変換部310は、処理対象ブロックの実行に使用されるターゲットCPUの資源のうち所定の資源の資源使用量が上限を超えるか否かを判断する(ステップS3912)。
ここで、所定の資源の資源使用量が上限を超える場合(ステップS3912:Yes)、コード変換部310は、ステップS3906に移行する。そして、コード変換部310は、処理対象ブロックのブロックIDと対応付けて、処理対象ブロックの実行開始時のターゲットCPUの内部状態をホストコードリスト400に記録する。
一方、所定の資源の資源使用量が上限を超えない場合(ステップS3912:No)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減を示す増減情報とを出力する(ステップS3909)。
また、ステップS3911において、ターゲットCPUの資源使用量が上限を超えない場合(ステップS3911:No)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減を示す増減情報とを出力する(ステップS3909)。
また、ステップS3910において、ターゲットCPUの内部状態が同一の場合(ステップS3910:Yes)、コード変換部310は、処理対象ブロックが以前に処理対象となった際に生成したホストコードhcと、動作シミュレーションにおける処理対象ブロックの実行終了時のターゲットCPUの内部状態と、ターゲットCPUの資源使用量の増減を示す増減情報とを出力する(ステップS3909)。
これにより、ターゲットCPUの内部状態が一致する、あるいは、ターゲットCPUの所定の資源の資源使用量が上限を超えない場合に、処理対象ブロックが以前に処理対象となった際のホストコードhcを流用することができ、あるブロックBについて同一のホストコードhcが繰り返し生成されることを防ぐことができる。
図40は、実施の形態4にかかるシミュレーション装置100のシミュレーション実行部320の処理手順の一例を示すフローチャートである。図40において、まず、シミュレーション実行部320は、ホストコードリスト400(図33参照)を参照して、コード変換部310が生成したホストコードhcを実行し、性能シミュレーションを行う(ステップS4001)。次に、シミュレーション実行部320は、実行中に外部依存命令を検出すると(ステップS4002)、その命令の実行結果が予測結果として設定されたものと同じであるかを判定する(ステップS4003)。
ここで、外部依存命令の実行結果が設定された予測結果と同じではない場合(ステップS4003:No)、シミュレーション実行部320は、その外部依存命令の実行時間を補正する(ステップS4004)。一方、外部依存命令の実行結果が設定された予測結果と同じ場合には(ステップS4003:Yes)、シミュレーション実行部320は、ステップS4004の補正を行わずにステップS4007に移行する。
そして、シミュレーション実行部320は、ホストコードリスト400(図33参照)を参照して、ターゲットCPUの資源使用量を計算する(ステップS4005)。次に、シミュレーション実行部320は、所定の資源以外の資源の資源使用量の上限超えに起因する実行時間の補正を行う(ステップS4006)。
そして、シミュレーション情報収集部330は、処理対象ブロックのシミュレーション情報360を出力する(ステップS4007)。この際、ターゲットCPUの性能シミュレーションが完了していない場合は、シミュレーション情報収集部330は、次の処理対象ブロックの情報(例えば、ブロックID)を出力する。
一方、ターゲットCPUの性能シミュレーションが完了した場合は、シミュレーション情報収集部330は、ターゲットCPUがターゲットプログラムTPを実行した場合の全体の実行時間を含むシミュレーション情報360を出力することにしてもよい。これにより、ターゲットプログラムTPを実行するターゲットCPUのシミュレーション情報360(サイクルシミュレーション情報)を出力することができる。
なお、上述した説明では、ホストコードhcに資源量計算コードrcを組み込まない場合を例に挙げて説明したが、実施の形態3で説明したように、ホストコードhcに資源量計算コードrcを組み込むことにしてもよい。
以上説明した実施の形態4にかかるシミュレーション装置100によれば、処理対象ブロックの実行に使用されるターゲットCPUの資源のうち所定の資源の量が上限を超えるか否かを判断することができる。これにより、ターゲットCPUの資源使用量の上限超えに起因する処理対象ブロックの実行時間の誤差を補正可能であるか否かを判断することができる。
また、シミュレーション装置100によれば、所定の資源の資源使用量が上限を超える場合にホストコードhcを生成し、所定の資源の資源使用量が上限を超えない場合はホストコードhcを生成しないようにすることができる。これにより、ターゲットCPUの資源使用量が上限を超えていても、処理対象ブロックの実行時間を補正可能であれば、処理対象ブロックが以前に処理対象となった際のホストコードhcを再利用することができ、性能シミュレーションの高速化を図ることができる。
また、シミュレーション装置100によれば、所定の資源の資源使用量が上限を超えない場合、処理対象ブロックが以前に処理対象となった際に生成されたホストコードhcを実行することができる。また、シミュレーション装置100によれば、ホストコードhcを実行して得られる処理対象ブロックの実行時間に、所定の資源以外の資源の資源使用量の上限超えに起因して発生する遅延値を加算する補正を行うことができる。これにより、ターゲットCPUの資源使用量の上限超えに起因する処理対象ブロックの実行時間の誤差を補正して、性能シミュレーションの精度を確保することができる。
なお、本実施の形態で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また、本シミュレーションプログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成する生成部と、
前記生成部によって生成された前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する実行部と、
を有することを特徴とするシミュレーション装置。
(付記2)前記生成部は、前記処理対象ブロックが切り替わった場合、前記処理対象ブロックが以前に処理対象となったか否かを判断し、前記処理対象ブロックが以前に処理対象となったと判断した場合、検出した前記プロセッサの内部状態が、前記処理対象ブロックが以前に処理対象となった際に検出した前記プロセッサの内部状態と同一であるか否かを判断し、前記プロセッサの内部状態が同一でないと判断した場合に前記ホストコードを生成し、前記プロセッサの内部状態が同一であると判断した場合は前記ホストコードを生成しないことを特徴とする付記1に記載のシミュレーション装置。
(付記3)前記実行部は、前記生成部によって前記プロセッサの内部状態が同一であると判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする付記2に記載のシミュレーション装置。
(付記4)前記生成部は、前記プロセッサの内部状態として、前記プロセッサがアウト・オブ・オーダー実行のために有するモジュールの状態を検出することを特徴とする付記3に記載のシミュレーション装置。
(付記5)前記生成部は、前記処理対象ブロックに含まれる命令のうち、当該命令の実行時に前記プロセッサがアクセスするハードウェア資源の状態に依存して実行時間が変化する外部依存命令の処理の実行結果を予測結果として設定することにより、検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することを特徴とする付記4に記載のシミュレーション装置。
(付記6)前記実行部は、前記ホストコードを実行した実行結果において、前記外部依存命令の実行結果が前記予測結果と異なる場合に、前記外部依存命令の所定の遅延時間と前記外部依存命令の前後に実行される命令の実行時間とを用いて求めた補正値で、前記予測結果での外部依存命令の実行時間を補正して、前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする付記5に記載のシミュレーション装置。
(付記7)前記実行部は、前記外部依存命令の次に実行される次命令の実行時間が、前記外部依存命令に付加される遅延時間を超えない場合に、前記次命令の実行時間を前記補正値として前記外部依存命令の遅延時間から減算する処理を行うことを特徴とする付記6に記載のシミュレーション装置。
(付記8)前記生成部は、前記処理対象ブロックのコードをコンパイルした機能コードに、前記処理対象ブロックを実行した場合の実行時間を計算するタイミングコードを組み込むことにより前記ホストコードを生成することを特徴とする付記1〜7のいずれか一つに記載のシミュレーション装置。
(付記9)前記生成部は、
前記プロセッサの内部状態が同一でないと判断した場合に、前記処理対象ブロックを実行した際に前記処理対象ブロックの実行に使用される前記プロセッサの資源の量が上限を超えるか否かを判断し、前記資源の量が上限を超えると判断した場合に前記ホストコードを生成し、前記資源の量が上限を超えないと判断した場合は前記ホストコードを生成しないことを特徴とする付記2に記載のシミュレーション装置。
(付記10)前記実行部は、
前記生成部によって前記資源の量が上限を超えないと判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする付記9に記載のシミュレーション装置。
(付記11)前記生成部は、
前記処理対象ブロックの実行開始時の前記プロセッサの内部状態と、前記処理対象ブロックの実行終了時の前記プロセッサの内部状態とに基づいて、前記処理対象ブロックの実行前後における前記資源の量の増減を示す増減情報を生成し、
前記プロセッサの内部状態が同一でないと判断した場合に、生成した前記増減情報に基づく前記資源の量が上限を超えるか否かを判断することを特徴とする付記9または10に記載のシミュレーション装置。
(付記12)前記生成部は、
前記プロセッサが前記処理対象ブロックを実行した場合の実行時間、および前記処理対象ブロックの実行に使用される前記プロセッサの資源の量を計算可能なホストコードを生成することを特徴とする付記9または10に記載のシミュレーション装置。
(付記13)前記生成部は、前記処理対象ブロックのコードをコンパイルした機能コードに、前記処理対象ブロックを実行した場合の実行時間を計算するタイミングコード、および前記処理対象ブロックの実行に使用される前記プロセッサの資源の量を計算する資源量計算コードを組み込むことにより前記ホストコードを生成することを特徴とする付記12に記載のシミュレーション装置。
(付記14)前記生成部は、
前記資源の量が上限を超えると判断した場合に、前記処理対象ブロックの実行に使用される前記プロセッサの資源のうち所定の資源の量が上限を超えるか否かを判断し、前記所定の資源の量が上限を超えると判断した場合に前記ホストコードを生成し、前記所定の資源の量が上限を超えないと判断した場合は前記ホストコードを生成しないことを特徴とする付記9に記載のシミュレーション装置。
(付記15)前記実行部は、
前記生成部によって前記所定の資源の量が上限を超えないと判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出し、算出した前記実行時間に、前記所定の資源以外の資源の量の上限超えに起因して発生する遅延値を加算する補正を行うことを特徴とする付記14に記載のシミュレーション装置。
(付記16)コンピュータが、
アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、
検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成し、
生成した前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する、
処理を実行することを特徴とするシミュレーション方法。
(付記17)コンピュータに、
アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、
検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成し、
生成した前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する、
処理を実行させることを特徴とするシミュレーションプログラム。
100 シミュレーション装置
310 コード変換部
311 ブロック分割部
312 予測シミュレーション実行部
313 コード生成部
320 シミュレーション実行部
321 コード実行部
322 補正部
330 シミュレーション情報収集部

Claims (14)

  1. アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成する生成部と、
    前記生成部によって生成された前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する実行部と、
    を有することを特徴とするシミュレーション装置。
  2. 前記生成部は、前記処理対象ブロックが切り替わった場合、前記処理対象ブロックが以前に処理対象となったか否かを判断し、前記処理対象ブロックが以前に処理対象となったと判断した場合、検出した前記プロセッサの内部状態が、前記処理対象ブロックが以前に処理対象となった際に検出した前記プロセッサの内部状態と同一であるか否かを判断し、前記プロセッサの内部状態が同一でないと判断した場合に前記ホストコードを生成し、前記プロセッサの内部状態が同一であると判断した場合は前記ホストコードを生成しないことを特徴とする請求項1に記載のシミュレーション装置。
  3. 前記実行部は、前記生成部によって前記プロセッサの内部状態が同一であると判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする請求項2に記載のシミュレーション装置。
  4. 前記生成部は、前記プロセッサの内部状態として、前記プロセッサがアウト・オブ・オーダー実行のために有するモジュールの状態を検出することを特徴とする請求項3に記載のシミュレーション装置。
  5. 前記生成部は、前記処理対象ブロックに含まれる命令のうち、当該命令の実行時に前記プロセッサがアクセスするハードウェア資源の状態に依存して実行時間が変化する外部依存命令の処理の実行結果を予測結果として設定することにより、検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することを特徴とする請求項4に記載のシミュレーション装置。
  6. 前記実行部は、前記ホストコードを実行した実行結果において、前記外部依存命令の実行結果が前記予測結果と異なる場合に、前記外部依存命令の所定の遅延時間と前記外部依存命令の前後に実行される命令の実行時間とを用いて求めた補正値で、前記予測結果での外部依存命令の実行時間を補正して、前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする請求項5に記載のシミュレーション装置。
  7. 前記生成部は、
    前記プロセッサの内部状態が同一でないと判断した場合に、前記処理対象ブロックを実行した際に前記処理対象ブロックの実行に使用される前記プロセッサの資源の量が上限を超えるか否かを判断し、前記資源の量が上限を超えると判断した場合に前記ホストコードを生成し、前記資源の量が上限を超えないと判断した場合は前記ホストコードを生成しないことを特徴とする請求項2に記載のシミュレーション装置。
  8. 前記実行部は、
    前記生成部によって前記資源の量が上限を超えないと判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出することを特徴とする請求項7に記載のシミュレーション装置。
  9. 前記生成部は、
    前記処理対象ブロックの実行開始時の前記プロセッサの内部状態と、前記処理対象ブロックの実行終了時の前記プロセッサの内部状態とに基づいて、前記処理対象ブロックの実行前後における前記資源の量の増減を示す増減情報を生成し、
    前記プロセッサの内部状態が同一でないと判断した場合に、生成した前記増減情報に基づく前記資源の量が上限を超えるか否かを判断することを特徴とする請求項7または8に記載のシミュレーション装置。
  10. 前記生成部は、
    前記プロセッサが前記処理対象ブロックを実行した場合の実行時間、および前記処理対象ブロックの実行に使用される前記プロセッサの資源の量を計算可能なホストコードを生成することを特徴とする請求項7または8に記載のシミュレーション装置。
  11. 前記生成部は、
    前記資源の量が上限を超えると判断した場合に、前記処理対象ブロックの実行に使用される前記プロセッサの資源のうち所定の資源の量が上限を超えるか否かを判断し、前記所定の資源の量が上限を超えると判断した場合に前記ホストコードを生成し、前記所定の資源の量が上限を超えないと判断した場合は前記ホストコードを生成しないことを特徴とする請求項7に記載のシミュレーション装置。
  12. 前記実行部は、
    前記生成部によって前記所定の資源の量が上限を超えないと判断された場合、前記処理対象ブロックが以前に処理対象となった際に生成されたホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出し、算出した前記実行時間に、前記所定の資源以外の資源の量の上限超えに起因して発生する遅延値を加算する補正を行うことを特徴とする請求項11に記載のシミュレーション装置。
  13. コンピュータが、
    アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、
    検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成し、
    生成した前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する、
    処理を実行することを特徴とするシミュレーション方法。
  14. コンピュータに、
    アウト・オブ・オーダー実行のプロセッサが実行するプログラムのコードを分割して得られるブロックのうち、前記プロセッサが前記プログラムを実行した場合の動作を模擬するシミュレーションの処理対象ブロックが切り替わった場合、前記処理対象ブロックの実行開始時の前記プロセッサの内部状態を検出し、
    検出した前記プロセッサの内部状態に基づいて、前記処理対象ブロックの前記シミュレーションを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を計算可能なホストコードを生成し、
    生成した前記ホストコードを実行することにより、前記プロセッサが前記処理対象ブロックを実行した場合の実行時間を算出する、
    処理を実行させることを特徴とするシミュレーションプログラム。
JP2015538939A 2013-09-24 2014-05-09 シミュレーション装置、シミュレーション方法およびシミュレーションプログラム Expired - Fee Related JP6015865B2 (ja)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
JP2013197621 2013-09-24
JP2013197621 2013-09-24
PCT/JP2014/062444 WO2015045472A1 (ja) 2013-09-24 2014-05-09 シミュレーション装置、シミュレーション方法およびシミュレーションプログラム

Publications (2)

Publication Number Publication Date
JP6015865B2 true JP6015865B2 (ja) 2016-10-26
JPWO2015045472A1 JPWO2015045472A1 (ja) 2017-03-09

Family

ID=52742632

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015538939A Expired - Fee Related JP6015865B2 (ja) 2013-09-24 2014-05-09 シミュレーション装置、シミュレーション方法およびシミュレーションプログラム

Country Status (3)

Country Link
US (1) US20160196156A1 (ja)
JP (1) JP6015865B2 (ja)
WO (1) WO2015045472A1 (ja)

Families Citing this family (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109643272B (zh) * 2016-06-29 2023-03-28 新思科技有限公司 用于自动http测试的测试系统及方法
US10885985B2 (en) * 2016-12-30 2021-01-05 Western Digital Technologies, Inc. Processor in non-volatile storage memory
US11347628B2 (en) 2018-01-17 2022-05-31 Mitsubishi Electric Corporation Test case generation apparatus, test case generation method, and computer readable medium
US10929139B2 (en) 2018-09-27 2021-02-23 Qualcomm Incorporated Providing predictive instruction dispatch throttling to prevent resource overflows in out-of-order processor (OOP)-based devices

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006023852A (ja) * 2004-07-06 2006-01-26 Handotai Rikougaku Kenkyu Center:Kk ソフトウェア検証モデル生成方法
JP2013041513A (ja) * 2011-08-18 2013-02-28 Fujitsu Ltd 補正装置、補正方法、および補正プログラム
JP2013084178A (ja) * 2011-10-12 2013-05-09 Fujitsu Ltd シミュレーション装置,方法,およびプログラム

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2006023852A (ja) * 2004-07-06 2006-01-26 Handotai Rikougaku Kenkyu Center:Kk ソフトウェア検証モデル生成方法
JP2013041513A (ja) * 2011-08-18 2013-02-28 Fujitsu Ltd 補正装置、補正方法、および補正プログラム
JP2013084178A (ja) * 2011-10-12 2013-05-09 Fujitsu Ltd シミュレーション装置,方法,およびプログラム

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
JPN6014029013; 原嶋秀次 外2名: '「仮想化技術による実機レステスト環境の構築」' 東芝レビュー 第67巻,第8号, 20120801, pp.31-34, 株式会社東芝 *
JPN6014029016; Stefan STATTELMANN et al.: '"Combining Instruction Set Simulation and WCET Analysis for Embedded Software Performance Estimation' Proceedings of 7th IEEE International Symposium on Industrial Embedded Systems (SIES'12) , 201206, pp.295-298, IEEE *

Also Published As

Publication number Publication date
JPWO2015045472A1 (ja) 2017-03-09
US20160196156A1 (en) 2016-07-07
WO2015045472A1 (ja) 2015-04-02

Similar Documents

Publication Publication Date Title
US9207916B2 (en) Simulation apparatus, method and medium
US6324686B1 (en) Just in time compiler technique
Huynh et al. Scope-aware data cache analysis for WCET estimation
JP5961971B2 (ja) シミュレーション装置,方法,およびプログラム
US8554535B2 (en) Instruction-set architecture simulation techniques using just in time compilation
US20130152048A1 (en) Test method, processing device, test program generation method and test program generator
US20050044538A1 (en) Interprocedural computing code optimization method and system
JP6015865B2 (ja) シミュレーション装置、シミュレーション方法およびシミュレーションプログラム
US8499293B1 (en) Symbolic renaming optimization of a trace
US7849292B1 (en) Flag optimization of a trace
EP2666084A1 (en) Tool generator
Villarreal et al. Improving software performance with configurable logic
US10564992B2 (en) Simulation apparatus and storage medium
US9465595B2 (en) Computing apparatus, computing method, and computing program
Sánchez et al. Cache sensitive module scheduling
US7937564B1 (en) Emit vector optimization of a trace
US20160011889A1 (en) Simulation method and storage medium
US10671780B2 (en) Information processing device that executes simulation and a simulation method
US6430682B1 (en) Reliable branch predictions for real-time applications
JP6264844B2 (ja) シミュレーション方法、シミュレーションプログラム、およびシミュレーション装置
US10936043B2 (en) Thermal management of hardware accelerators
JPH09319617A (ja) ソフトウエア開発システム、プログラム実行方法、プログラム作成方法、トレース装置および方法、計算機装置、ならびにプログラムの評価方法
Haur et al. Formal Model of the Lipsi Processor: Definition and Use of its Timing Behavior
US9880841B2 (en) Computation method for computing performance value when processor executes code, computation apparatus for computing performance value when processor executes code, and computer readable storage medium storing computation program for computing performance value when processor executes code
JP2000242529A (ja) プログラム開発支援装置および開発支援システムおよび記録媒体

Legal Events

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

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160830

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160912

R150 Certificate of patent or registration of utility model

Ref document number: 6015865

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees