以下、図面にしたがって本発明の実施の形態を説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
[シミュレーション装置のハードウェア構成]
図1は、実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。シミュレーション装置100は、ホストCPU(Central Processing Unit:CPU)201と、ROM(read only memory:ROM)202と、RAM(Random Access Memory:RAM)203と、ディスクドライブ204と、ディスク205と、を有する。シミュレーション装置100は、更に、I/F(Inter Face:I/F)部206と、入力装置207と、出力装置208と、を有する。また、各部はバス200によってそれぞれ接続される。
ディスクドライブ204は、ホストCPU201の制御にしたがってディスク205に対するデータのリード/ライトを制御する。ディスク205は、ディスクドライブ204の制御で書き込まれたデータを記憶する。ディスク205としては、磁気ディスク、光ディスクなどが挙げられる。I/F部206は、通信回線を通じてLAN(Local Area Network:LAN)、WAN(Wide Area Network:WAN)、インターネットなどのネットワークNETに接続され、このネットワークNETを介して他の装置に接続される。そして、I/F部206は、ネットワークNETと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F部206には、例えばNIC(Network Interface Card:NIC)やLANアダプタなどを採用することができる。
入力装置207は、キーボード、マウス、タッチパネルなど利用者の操作により、各種データの入力を行うインターフェースである。また、入力装置207は、カメラから画像や動画を取り込むこともできる。また、入力装置207は、マイクから音声を取り込むこともできる。出力装置208は、ホストCPU201の指示により、データを出力するインターフェースである。出力装置208には、ディスプレイやプリンタが挙げられる。
ホストCPU201は、シミュレーション装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶する。RAM203は、ホストCPU201のワークエリアとして使用される記憶部である。RAM203は、実施の形態にかかるシミュレーションプログラム格納領域210、タイミング情報格納領域211、分岐予測関数ライブラリ格納領域212、ブロック情報格納領域213を有する。
シミュレーションプログラム格納領域210に記憶されたシミュレーションプログラム(以下、シミュレーションプログラム210と称する)は、ホストCPU201の実行によって、本実施の形態例におけるシミュレーション処理を実現する。シミュレーション処理は、対象のプログラムを、図1のホストCPU201とは別の、アウト・オブ・オーダー実行のプロセッサが実行した場合の性能シミュレーション処理である。以下、対象のプログラムをターゲットプログラムと称する。タイミング情報格納領域211に記憶されるタイミング情報1400については後述する。
分岐予測関数ライブラリ格納領域212に記憶された分岐予測関数ライブラリ(以下、分岐予測関数ライブラリ212と称する)は、ターゲットのプロセッサの分岐予測アルゴリズムのモデルである。また、ブロック情報格納領域213は、シミュレーションプログラム210が生成するブロック情報を記憶する領域である。ブロック情報は、ブロックの実行コードと対応情報とを示す。実行コード、対応情報の詳細については、後述する。本実施の形態例では、ブロック情報格納領域213は、サイズが指定された固定の領域を示す。ただし、この例に限定されるものではなく、ブロック情報格納領域213は、可変サイズの領域であってもよい。
本実施の形態では、アウト・オブ・オーダー実行のプロセッサをターゲットCPU(Central Processing Unit)と称する。シミュレーション装置100が有するプロセッサ201をホストCPUと称する。図1の例では、ターゲットCPUがARM(登録商標)社のARMアーキテクチャのCPUであり、シミュレーション装置100が有するホストCPU201は、例えば、インテル社(登録商標)のX86アーキテクチャのCPUである。
本実施の形態では、ターゲットCPUがアウト・オブ・オーダー実行の場合のシミュレーション装置100について説明する。まず、アウト・オブ・オーダー実行のターゲットCPUについて、図2にしたがって簡単に説明する。
[ターゲットプロセッサの概要]
図2は、ターゲットCPUの一例を示す説明図である。ここでは、アウト・オブ・オーダーのターゲットCPU1200の一例について、簡単に説明する。ターゲットCPU1200は、PC(Program Counter:PC)1201と、命令フェッチ部1202と、デコード部1204と、命令キュー1209を有するリザベーションステーション1205と、を有する。ターゲットCPU1200は、複数の実行ユニット1206と、リオーダ・バッファ1207と、レジスタファイル1208と、を有する。
ここで、ターゲットCPU1200の処理を順に説明する。
(1)ターゲットCPU1200はメモリ1203から命令フェッチ、命令デコードを行う。
(2)ターゲットCPU1200はデコードした命令を命令キュー1209に入れ、リオーダ・バッファ1207に記録する。
(3)ターゲットCPU1200は命令キュー1209にある命令のうち、実行可能になった命令を実行ユニット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,1lr0<−r0+1
(3)命令3:mov r2,0;r2<−0
命令1は実行に時間がかかり、命令2は命令1の実行結果に依存する。そのため、プログラムが示す実行順序と、アウト・オブ・オーダー実行のターゲットCPU1200が実行する実行順序と、が異なる。例えば、ターゲットCPU1200が実行する命令の実行順序は、リザベーションステーション1205の投入制御により、以下の順となる。以下の命令例では()内の番号が実行順番を示し、「;」以降は注釈である。
(1)命令1:ldr r0,[r1];r0<−[r1]
(2)命令3:mov r2,0;r2<−0
(3)命令2:add r0,r0,1lr0<−r0+1
また、アウト・オブ・オーダー実行のターゲットCPU1200では、命令の追い越しが発生するため、ある命令の実行が遅いことによって他のブロックにも影響を及ぼす可能性がある。ブロックとは、プログラムのコードを分割して得られるブロックを示す。プログラムに含まれるブロックの実行順序が以下であるとする。B1〜B3がブロックである。
B1:命令1(実行に時間がかかる命令)
B2:命令2(命令1に依存する命令)
B2:命令3(命令1に依存する命令)
B3:命令4(命令1に依存しない命令)
命令4は、命令1に依存せず、実行に時間がかからない命令である。したがって、ターゲットCPU1200のリザベーションステーション1205の投入制御により、以下のように、命令4は命令2と命令3の実行を追い越して完了する。
B1:命令1(実行に時間がかかる命令)
B3:命令4(命令1に依存しない命令)
B2:命令2(命令1に依存する命令)
B2:命令3(命令1に依存する命令)
[シミュレーション装置100によるシミュレーションの概要]
次に、シミュレーション装置100(図1)が実行する、性能シミュレーションの概要を説明する。
本実施の形態では、評価対象となる第1プロセッサ(この例では、図2に示したターゲットCPU1200)がターゲットプログラムを実行した場合の機能や性能のシミュレーションを、シミュレーション装置100が有する第2プロセッサ(この例では、図1に示したホストCPU201)によって実行する。第2プロセッサ(ホストCPU201)によってシミュレーションを行う際に、第1プロセッサ(ターゲットCPU1200)のターゲットプログラムから第2プロセッサが実行可能なコードへの変換が必要となる。第2プロセッサが実行可能なコードへの変換手法として、例えば、インタープリタ方式またはJIT(Just-In-Time:JIT)コンパイラ方式がある。本実施の形態にかかるシミュレーション装置は、JITコンパイラ方式による性能のシミュレーションを行う。
図3は、本実施の形態例におけるシミュレーション装置100(図1)による一動作例を模式的に示す説明図である。図3は、ターゲットCPU1200がターゲットプログラムpgrを実行した場合における動作シミュレーションsimを、X86アーキテクチャのホストCPU201が実行する処理を模式的に示す。
ここでの動作シミュレーションsimは、例えば、図2に示すターゲットCPU1200のモデルと、ターゲットCPU1200がアクセスするハードウェア資源のモデルに、ターゲットプログラムpgrを与えることによるシミュレーションである。ここで使用されるシステムのモデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。
図3に示す動作シミュレーションsimは、コード変換処理1401xと、性能シミュレーション実行処理1402xを有する。まず、コード変換処理1401xでは、シミュレーション装置100は、ターゲットプログラムpgrのコードを分割して、ブロックg1〜g4を生成する。分割されるブロック単位は、例えば、分岐からつぎの分岐前までのコードなどのベーシック(基本)ブロック単位でよく、または、予め定められた任意のコード単位でよい。ベーシックブロック単位とは、分岐命令から次の分岐命令前までのコード群である。
ブロックに分割するタイミングは、事前にすべて分割しておいてもよいし、対象ブロックとなった時に対象ブロックだけを分割してもよい。ここで、分割して生成された1つのブロックg1は、例えば、命令「ARM_insn_A」、「ARM_insn_B」、「ARM_insn_C」、「ARM_br_lr」を有する。
シミュレーション装置100は、ブロックg1〜g4のうち、動作シミュレーションsimの対象ブロックが変化した場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態1600を検出する(A1)。ターゲットCPUの内部状態1600とは、たとえば、図2に示すターゲットCPU1200が有するレジスタなどの設定値である。シミュレーション装置100は、動作シミュレーションsimにおけるターゲットCPU1200が有するレジスタなどの設定値によって、ターゲットプログラムpgrの実行状況を判別可能である。
また、シミュレーション装置100は、対象ブロックが変化した場合、検出した内部状態1600と、対象ブロックg1に含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う(A2)。これにより、シミュレーション装置100は、対象ブロックg1に含まれる各命令の性能値を算出する。シミュレーション装置100は、検出した内部状態1600と、対象ブロックg1に含まれる各命令の性能値とを対応付ける対応情報2300を生成する。性能値は、例えば、処理時間、クロック数、消費電力量などが挙げられる。対応情報2300の具体例は、図11に示す。
また、シミュレーション装置100は、対象ブロックが変化した場合、対象ブロックのプログラムp1を入力として、X86アーキテクチャのホストCPU201が実行する実行コードecを生成する(A3)。実行コードecとは、内部状態1600と性能値とを対応付けた対応情報2300によって、対象ブロックがターゲットCPU1200に実行された場合の性能値を、ホストCPU201が計算可能なコードである。
具体的に、実行コードecは、例えば、機能コードc1と、タイミングコードc2と、を含む。機能コードc1は、対象ブロックg1をコンパイルすることによって得られるホストCPU201が実行可能なコードである。ここで、対象ブロックg1の機能コードc1は、命令「x86_insn_A1」、「x86_insn_A2」、「x86_insn_B1」、「x86_insn_B21」、「x86_insn_B3」、「x86_insn_C1」、「x86_insn_C2」を有する。
また、タイミングコードc2は、機能コードc1の性能値を見積もるコードである。例えば、性能値がサイクル数である場合、タイミングコードc2は、例えば、以下のように内部状態1600を引数として性能値を得て、サイクル数cycleを加算していくようなコードである。
cycle=cycle+性能値[内部状態]
実行コードecの具体例は、図10に示す。なお、実行コードecと対応情報2300をあわせて、ブロック情報3100と称する。
つぎに、性能シミュレーション実行処理1402xを説明する。性能シミュレーション実行処理1402xでは、シミュレーション装置100は、X86アーキテクチャにしたがって変換された実行コードecを実行する(A4)。具体的に、シミュレーション装置100は、実行コードecを、対象ブロックg1について生成した対応情報2300と検出した内部状態1600とを用いて実行することにより、対象ブロックg1がターゲットCPUに実行された場合の性能値を計算する。また、シミュレーション装置100は、対象ブロックg1が有する外部依存命令の実行結果に応じて、性能値を補正する(A5)。
また、図2で前述したとおり、アウト・オブ・オーダー実行のターゲットCPU1200によると、プログラムが示す実行順序と、ターゲットCPU1200が実行する実行順序と、が異なる。また、アウト・オブ・オーダー実行のターゲットCPU1200では、命令の追い越しが発生する。
したがって、本実施の形態にかかるシミュレーション装置100では、対象ブロックが変化した際にターゲットCPU1200の内部状態1600を検出し、検出した内部状態1600における対象ブロックの各命令の性能値を静的に算出しておく。そして、シミュレーション装置100は、対応情報2300に基づいて実行コードecを実行し、内部状態1600に応じた性能値を算出する。これにより、アウト・オブ・オーダー実行のターゲットCPU1200が対象ブロックを実行した場合の性能値の見積もりの精度を向上させることができる。
図4は、ターゲットCPUがアウト・オブ・オーダー実行の場合にシミュレーション装置100が生成するブロック情報3100を説明する図である。図3で説明したとおり、ターゲットCPUがアウト・オブ・オーダー実行の場合、シミュレーション装置100は、実行コードecと対応情報2300とを含むブロック情報3100を生成する。また、ブロック情報3100は、図1で前述したとおり、例えば、RAM203のブロック情報格納領域213に記憶される。
図4の例では、ブロック情報3100、実行コードec、機能コードc1、タイミングコードc2、対応情報2300のそれぞれに付された「−番号」はいずれのブロックの対応情報であるかを示す。また、各対応情報2300に付された「−アルファベット」は内部状態1600を識別するための情報である。
また、図4は、シミュレーション装置100が第1ブロック3100−1のつぎに第2ブロック3100−2の性能をシミュレートする場合を例示する。図3で説明したとおり、シミュレーション装置100は、第1ブロック3100−1及び第2ブロック3100−2の、実行コードecと対応情報2300とを生成する。また、図3で説明したとおり、実行コードecは、機能コードc1とタイミングコードc2とを有する。
本実施の形態で生成される実行コードecは、具体的な性能値が記述されたコードでなく、性能値を取得可能なコードである。これにより、同一のブロックについて複数回実行コードecを生成しなくてよい。したがって、シミュレーション装置100は、以前に対象ブロックとなっていないと判断された場合、対象ブロックの実行コードecを生成する。一方、シミュレーション装置100は、以前に対象ブロックとなっていると判断した場合、対象ブロックの実行コードecを生成しない。これにより、同一のブロックについて複数回実行コードecが生成されないため、性能値の見積もりにおいて、省メモリ化を図ることができる。
また、第1ブロック3100−1、第2ブロック3100−2は、検出した内部状態1600ごとに対応情報2300−1−A〜2300−1−C、2300−2−x〜2300−2−zを有する。シミュレーション装置100は、検出された内部状態1600が、以前に対象ブロックとなった時に検出された内部状態1600と同一であれば、あらたに検出された内部状態1600を対応付ける対応情報2300を生成しない。これにより、対象ブロックについて同一の内部状態1600を対応付ける対応情報2300が、複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
また、シミュレーション装置100は、第1ブロック3100−1の内部状態1600と性能値2200とを対応付ける対応情報2300に、つぎに実行する第2ブロック3100−2について以前実行された時に生成した対応情報2300を関連付ける。具体的には、各対応情報2300は、内部状態1600と性能値2200とに加え、つぎのブロックのポインタ3300と、つぎの対応情報のポインタ3400とを有する。
つぎのブロックのポインタ3300は、つぎのブロックの実行コードecが記憶された記憶領域(ブロック情報格納領域213)を示すアドレスである。つぎの対応情報のポインタ3400は、つぎのブロックの対応情報2300が記憶された記憶領域(ブロック情報格納領域213)を示すアドレスである。
図4の例では、対応情報2300−1−A内のつぎのブロックのポインタ3300として、第2ブロック3100−2の実行コードec−2のポインタが設定される。さらに、対応情報2300−1−A内のつぎの対応情報のポインタ3400として、第2ブロック3100−2の対応情報2300−2−xが設定される。
シミュレーション装置100は、第1ブロック3100−1の対応情報2300が関連付ける第2ブロック3100−2の対応情報2300が示す内部状態1600を取得する。そして、シミュレーション装置100は、第1ブロック3100−1の対応情報2300に基づいて取得した内部状態1600と、第2ブロック3100−2が対象ブロックとなったときに検出した内部状態1600と、一致するか否かを判断する。一致する場合、シミュレーション装置100は、第1ブロック3100−1の対応情報2300が関連付ける第2ブロック3100−2の対応情報2300を用いて第2ブロックについての実行コードecを実行する。
これにより、使用される可能性が高い対応情報2300を関連付けておくことにより、検出された内部状態1600を対応付ける既存の対応情報2300の検索に要する処理を高速化することができる。
次に、図1のシミュレーション装置100のソフトウェアモジュールを説明する。
[ソフトウェアモジュール構成図]
図5は、本実施の形態例におけるシミュレーション装置100のソフトウェアモジュール構成を説明する図である。シミュレーション装置100は、コード変換モジュール1401と、性能シミュレーション実行モジュール1402と、シミュレーション情報収集モジュール1403と、を有する。
シミュレーション装置100は、ターゲットプログラムpgrと、タイミング情報1400と、予測情報4と、を得て、シミュレーション情報1430を出力する。ターゲットプログラムpgrと、タイミング情報1400と、予測情報4とは、たとえば、RAM203や、ディスク205などの記憶装置に記憶される。または、これらの情報は、入力装置207を介して入力されてもよいし、ネットワークNETを介して他の装置から取得されてもよい。
以下、コード変換モジュール1401をコード変換部1401と称する。性能シミュレーション実行モジュール1402を、性能シミュレーション実行部1402と称する。シミュレーション情報収集モジュール1403を、シミュレーション情報収集部1403と称する。
コード変換部1401からシミュレーション情報収集部1403への処理は、例えば、図1で前述した、シミュレーションプログラム210にコーディングされる。そして、ホストCPU201が記憶装置に記憶されたシミュレーションプログラム210を読み出して、シミュレーションプログラム210にコーディングされている処理を実行する。これにより、コード変換部1401からシミュレーション情報収集部1403の処理が実現される。また、各部の処理結果は、例えば、RAM203、ディスク205などの記憶装置に記憶される。
まず、コード変換部1401、性能シミュレーション実行部1402、及び、シミュレーション情報収集部1403の概要を説明する。
コード変換部1401は、図3のコード変換処理1401xを行う。コード変換部1401は、図3、図4で説明したとおり、内部状態1600と性能値とが対応付けられた対応情報2300と、対応情報2300によって対象ブロックがターゲットCPU1200によって実行された場合の性能値2200を算出可能な実行コードecと、を生成する。
また、性能シミュレーション実行部1402は、図3の性能シミュレーション実行処理1402xを行う。性能シミュレーション実行部1402は、実行コードecを実行することによって、対象ブロックがターゲットCPU1200によって実行された場合の性能値を算出する。
シミュレーション情報収集部1403は、性能シミュレーション実行部1402による実行結果として、各命令の実行時間を含むログ情報であるシミュレーション情報1430を収集する。シミュレーション情報1430については、ディスク205などの記憶装置に記憶させてもよいし、ディスプレイなどの出力装置208(図1)によって出力してもよいし、ネットワークNETを介して他の装置に出力してもよい。
[入力データの説明]
ここで、シミュレーション装置100の入力となる、ターゲットプログラムpgr、タイミング情報1400、及び、予測情報4の一例を説明する。初めに、ターゲットプログラムpgrのブロックが有する命令の一例を説明する。
図6は、ブロックが有する命令の一例を示す図である。図4に示すように、あるブロックは、ターゲットコードの3つの命令;(1)“LD r1、r2”(ロード);(2)“MULT r3、r4、 r5(乗算)”;(3)“ADD r2、r5、 r6(加算)”を有する。ブロックの命令は、(1)〜(3)の順でターゲットCPUのパイプラインに投入されて実行されるとする。各命令のr1〜r6は、レジスタ(アドレス)を表す。
タイミング情報1400は、ターゲットコードの各命令について、命令実行時の各処理要素(段階)と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間(ペナルティサイクル数)とを示す情報である。外部依存命令は、ターゲットCPU1200がアクセス可能な外部のハードウェア資源が関係する処理を行う命令である。具体的には、外部依存命令は、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットCPU1200の外部のハードウェア資源に依存するような処理、例えば、命令キャッシュ、データキャッシュ、TLB検索などである。また、外部依存命令は、分岐予測、コール/リターンのスタックなどの処理を行う命令である。
図7は、図6のブロックが含む各命令のタイミング情報1400の例を示す図である。図7に示すタイミング情報1400は、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)で使用可能であることを示す。
図8は、図6に示すブロックの各命令の実行タイミング例を示す図である。図7に示すタイミング情報1400から、パイプラインに各命令が投入されるタイミングは、LD命令の実行開始をタイミングtとすると、MULT命令はタイミングt+1、ADD命令はタイミングt+2となる。ADD命令の第1ソースレジスタ(r2)と第2ソースレジスタ(r5)は、LD命令とMULT命令で使用されているため、ADD命令の開始は、LD命令とMULT命令の実行完了のタイミングt+4以降となり、2サイクル分の待機時間(2サイクル分のストール)が生じる。
したがって、図8(A)に示すように、図6に示すブロックをシミュレーションした場合に、LD命令の実行結果がキャッシュヒットであるケースでは、ブロックの実行時間が6サイクルであることがわかる。図8(B)は、図5に示すブロックのLD命令の実行結果がキャッシュミスである場合のタイミング例を表す。LD命令の結果がキャッシュミスであると、タイミング情報1400に、ペナルティとして、再実行に十分と考えられる任意の時間(ここでは6サイクル分)が設定されているため、このペナルティサイクルが遅延時間として追加される。したがって、2番目の処理要素(e2)の実行は、タイミングt+7に遅延する。LD命令のつぎに実行されるMULT命令は、遅延の影響を受けずにそのまま実行されるが、ADD命令は、LD命令の実行完了のタイミングt+8以降となり、4サイクル分の待機時間(4サイクル分のストール)が生じる。
したがって、図8(B)に示すように、図6に示すブロックの命令実行をシミュレーションした場合に、LD命令の実行結果がキャッシュミスであるケースでは、実行時間が10サイクルとなることがわかる。予測情報4は、ターゲットコードの外部依存命令の処理において、生じる確率が高い実行結果(予測結果)を定めた情報である。予測情報4には、例えば、
「命令キャッシュ:予測=ヒット、
データキャッシュ:予測=ヒット、
TLB検索:予測=ヒット、
分岐予測:予測=ヒット、
コール/リターン:予測=ヒット、…」
が定められる。
[シミュレーション装置100のコード変換処理]
図5に戻り、コード変換部1401が有する各モジュールの処理を、順次、説明する。コード変換部1401は、ブロック分割モジュール1411と、検出モジュール1412と、判断モジュール1413と、対応情報生成モジュール1414と、実行コード生成モジュール1415と、関連付けモジュール2401と、を有する。
以下、ブロック分割モジュール1411をブロック分割部1411と称する。以下、検出モジュール1412を検出部1412と称する。以下、判断モジュール1413を判断部1413と称する。以下、対応情報生成モジュール1414を対応情報生成部1414と称する。以下、実行コード生成モジュール1415を実行コード生成部1415と称する。以下、関連付けモジュール2401を関連付け部2401と称する。
図5のブロック分割部1411は、シミュレーション装置100に入力された、図3に示したターゲットプログラムpgrのコードを所定基準によってブロック(図3のg1〜g4)に分割する。分割タイミングは、例えば、あらたに対象ブロックが変化した場合である。ブロックを分割する単位は、図3で前述したとおりである。
図9は、ターゲットプログラムが有するブロックの例を示す説明図である。図9に示す例は、1×2×3×4×5×6×7×8×9×10の計算結果を求めるターゲットプログラムpgrであり、1,2行目が初期化のブロックb1、3〜6行目がループ本体のブロックb2である。具体的に、1、2行目は、レジスタr0を値「1」、レジスタr1を値「2」で初期化する処理を示す。3行目は、レジスタr1、r2の値の乗算値を、レジスタr0に代入する処理を示す。また、4行目は、レジスタr1をインクリメントする処理を示す。そして、5行目、6行目では、レジスタr1の値が「10」以内の場合に、3行目に戻る処理を示す。
図5の検出部1412は、ターゲットプログラムpgrのコードを分割して得られるブロックのうち動作シミュレーションsimの対象ブロックが変化した場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態1600(図3)を検出する。内部状態1600は、図2に示した、ターゲットCPU1200の命令キュー1209と、実行ユニット1206と、リオーダ・バッファ1207と、の内容が検出された検出結果である。
具体的には、例えば、検出部1412は、動作シミュレーションsimにおけるPC1201の値がつぎのブロックに含まれる命令のアドレスを示した場合、動作シミュレーションsimにおけるターゲットCPU1200の内部状態1600を検出する。ここでは、例えば、ブロックからブロックへ変化したとする。
図5の判断部1413は、対象ブロックが変化した場合、対象ブロックが以前に対象ブロックとなったか否かを判断する。具体的には、例えば、判断部1413は、対象ブロックについての実行コードecがディスク205などの記憶装置に記憶されているか否かを判断する。以前に対象ブロックとなっていれば、すでに対象ブロックについてコンパイル済みであるため、ディスク205などの記憶装置に対象ブロックについての実行コードecが記憶されている。一方、以前に対象ブロックとなっていなければ、すでに対象ブロックについてコンパイルがされていないため、ディスク205などの記憶装置に対象ブロックについての実行コードecが記憶されていない。
図5の実行コード生成部1415は、判断部1413によって以前に対象ブロックとなっていないと判断された場合、実行コードecを生成する。生成された実行コードecは、図1のブロック情報格納領域213に記憶される。一方、実行コード生成部1415は、判断部1413によって以前に対象ブロックとなっていると判断された場合、実行コードecを生成しない。これにより、各ブロックについての実行コードecが複数回生成されないため、対象ブロックについての実行コードecが内部状態1600ごとに生成される場合と比較して、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。
例えば、実行コードecのタイミングコードには、内部状態1600に対応付けられた対応情報2300から性能値を取得するコードと、取得した性能値により対象ブロックがターゲットCPU1200に実行された場合の性能値を計算するコードと、を含む。
図10は、実行コードの例を示す図表である。実行コードecは、x86命令の例を示す。実行コードecは、ターゲットプログラムpgr(図9)がコンパイルされて得られる機能コードと、タイミングコードと、を有する。機能コードは、実行コードecの1〜3、8行目である。タイミングコードは、実行コードecの4〜7行目である。実行コードec中のstateは、ターゲットCPU1200の内部状態1600のインデックス(内部状態A=0,B=1,…)であり、perf1は、命令1に対する性能値が格納されたアドレスを示す。これにより、実行コードecが実行されると、検出された内部状態1600を引数として、対応情報2300から各命令の性能値が実行順に取得される。
図5の対応情報生成部1414は、図3、図4で前述したとおり、検出部1412によって検出された内部状態1600と、検出された内部状態1600における対象ブロックに含まれる各命令の性能値2200と、が対応付けられた対応情報2300を生成する。また、対応情報生成部1414は、予測シミュレーション実行モジュール(予測シミュレーション実行部と称する)1420を有する。
具体的に、対応情報生成部1414は、対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を検出する。状況依存命令は、上述した外部依存命令と同一であり、状況依存命令は、以降外部依存命令と称する。
そして、予測シミュレーション実行部1420は、検出した外部依存命令を複数通りの処理のうちの第1処理となった場合について、検出された内部状態1600と、対象ブロックの各命令の基準となる性能値2200と、によって静的タイミング解析を行う。これにより、対応情報生成部1414は、外部依存命令を複数通りの処理のうちの第1処理となった場合の対象ブロックに含まれる各命令の性能値を算出する。外部依存命令の第1処理については、入力された予測情報4に定められた処理である。例えば、第1処理は、予め複数通りの処理のうちその処理となりうる確率が最も高いと推定される処理である。ここでは、第1処理を予測ケースと称する。予測ケースについては、予め予測情報4に登録されていることとする。
基準となる性能値は、入力されたタイミング情報1400(図7)に含まれる。タイミング情報1400には、ターゲットプログラムpgrに含まれる各命令の基準となる性能値が含まれ、タイミング情報1400と同様に補正部1417によって使用されるペナルティの性能値も含む。対応情報生成部1414は、内部状態1600によれば、ブロック間の命令の依存関係、すなわち、命令の実行順などを判断可能である。
図16に示す内部状態1600の例では、対応情報生成部1414は、対象ブロックの前の命令が実行ユニット1206を利用している状態であることと判断できる。そのため、対応情報生成部1414は、対象ブロックに含まれる各命令の基準となる性能値2200に対して内部状態1600による命令の実行順によって性能値を加算または減算することにより、対象ブロックに含まれる各命令の性能値を算出する。
そして、対応情報生成部1414は、検出された内部状態1600と、検出された内部状態1600における算出した対象ブロックに含まれる各命令の性能値2200と、を対応付けた対応情報2300を生成する。ここで、生成された対応情報2300は、対象ブロックについての性能値表に新たに追加され、図1のブロック情報格納領域213に記憶される。
図5の関連付け部2401は、対象ブロックが第1ブロックから第2ブロックに変化した場合、第1ブロックの対応情報2300に、第2ブロックの対応情報2300を関連付ける。具体的に、関連付け部2401は、第1ブロックの対応情報2300に、第2ブロックのポインタ3300と、対応情報生成部1414によって生成された第2ブロックの対応情報2300のポインタ3400と、を関連付ける。
図11は、性能値表例を示す説明図である。性能値表2500は、内部状態1600、命令、性能値2200、つぎのブロックのポインタ3300、つぎの対応情報のポインタ3400のフィールドを有する。各フィールドに情報が設定されることにより、対応情報2300がレコードとして記憶される。性能値表2500は、各フィールドに情報が設定されることにより、対応情報2300(2300−A,2300−Bなど)として生成される。
内部状態Aについての対応情報2300−Aにおいて、内部状態Aにおける命令1の性能値は2クロックである。また、内部状態Bについての対応情報2300−Bにおいて、内部状態Bにおける命令1の性能値2200は4クロックである。図11では、省略して命令1だけの性能値2200を示しているが、実際には対応情報2300には機能コードに含まれる各命令についての性能値2200が含まれる。
また、図11の性能値表2500における、つぎのブロックのポインタ3300のフィールドには、以前に対象ブロックとなったときにつぎに対象ブロックとなったブロックのポインタが設定される。つぎの対応情報のポインタ3400のフィールドには、つぎに対象ブロックとなったときに使用された対応情報2300のポインタが設定される。
図11の対応情報2300−Aでは、つぎのブロックのポインタ3300のフィールドに「0x80005000」が設定され、つぎの対応情報のポインタ3400のフィールドに「0x80006000」が設定される。対応情報2300−Bでは、つぎのブロックのポインタ3300のフィールドに「0x80001000」が設定され、つぎの対応情報のポインタ3400のフィールドに「0x80001500」が設定される。
なお、例えば、つぎの対応情報のポインタ3400のフィールドには、例えば、つぎの対応情報2300へのオフセットが設定されてもよい。例えば、オフセットは、つぎのブロックのポインタとつぎの対応情報2300のポインタとの差である。例えば、対応情報2300−Aであれば、つぎのブロックのポインタ3300のフィールドに「0x80005000」が設定され、つぎの対応情報のポインタ3400のフィールドに「0x1000」が設定される。これにより、つぎの対応情報2300のポインタが「0x80006000」であると判断される。
例えば、対応情報2300−Bであれば、つぎのブロックのポインタ3300のフィールドに「0x80001000」が設定され、つぎの対応情報のポインタ3400のフィールドに「0x500」が設定される。これにより、つぎの対応情報のポインタ3400が「0x80001500」であると判断される。このように、つぎの対応情報2300へのオフセットが設定されることにより、対応情報2300の情報量を削減することができ、省メモリ化を図ることが可能になる。
判断部1413は、例えば、対象ブロックが第3ブロックから第4ブロックに変化した場合、第3ブロックの対応情報2300のつぎのブロックのポインタ3300が、第4ブロックのポインタと一致するか否かを判断する。一致する場合、判断部1413は、第3ブロックの対応情報2300が有するつぎの対応情報のポインタ3400が示す、対応情報2300が対応付ける内部状態1600を取得する。そして、判断部1413は、第3ブロックの対応情報2300に基づいて取得した内部状態1600と、検出部1412によって第4ブロックについて検出された内部状態1600と、が一致するか否かを判断する。一致していると判断された場合、性能シミュレーション実行部1402は、第4ブロックの実行コードecを、第3ブロックの対応情報2300が関連付ける対応情報2300を用いて実行する。
このように、使用される可能性が高い対応情報2300を関連付けておくことにより、性能値表2500から検出された内部状態1600を対応付けた対応情報2300の検索に要する処理を高速化することができる。
[性能シミュレーション実行処理の説明]
図5に戻り、性能シミュレーション実行部1402の処理を、順次、説明する。性能シミュレーション実行部1402は、コード実行モジュール1416と、補正モジュール1417と、カウンターテーブル管理モジュール1418を有する。以下、コード実行モジュール1416をコード実行部1416と称する。以下、補正モジュール1417を補正部1417と称する。以下、カウンターテーブル管理モジュール1418をカウンターテーブル管理部1418と称する。
コード実行部1416は、対応情報生成部1414によって生成された対応情報2300を用いて実行コードecを実行する。また、コード実行部1416は、以前に対象ブロックとなっており、かつ、以前に対象ブロックとなった時に検出された内部状態1600が、検出した内部状態1600と同一であると判断された場合は、同一の内部状態1600を対応付ける対応情報2300を取得する。そして、コード実行部1416は、取得した対応情報2300を用いて実行コードecを実行する。
補正部1417は、実行コードecをコード実行部1416によって実行された実行結果において、外部依存命令が複数通りの処理のうち予測ケースと異なる第2処理の場合に、第2処理に対応する所定性能値によって外部依存命令の性能値を補正する。これにより、補正部1417は、対象ブロックがターゲットCPU1200に実行された場合の性能値を計算する。補正部1417による詳細な補正方法については、例えば、特開2013−84178号公報に開示される。
カウンターテーブル管理部1418は、シミュレーションの実行中に、分岐命令の分岐を予測するカウンターテーブルを生成するとともに、カウンターテーブルにしたがって、分岐命令の分岐予測を行う。
カウンターテーブル管理部1418は、ターゲットCPU1200のモデルであって、分岐予測関数ライブラリ212(図1)が示す、分岐予測機能モデルに対応する。分岐予測機能モデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。カウンターテーブル管理部1418は、分岐命令がコード実行部1416にしたがって実行される度に、カウンターテーブルを更新する。カウンターテーブル、及び、カウンターテーブル管理部1418の処理の詳細については、後述する。
図1〜図11で説明してきたように、本実施の形態例におけるシミュレーション装置100は、動作シミュレーションの対象ブロックが変化した場合のターゲットCPUの内部状態1600を検出する。そして、シミュレーション装置100は、対象ブロックの、実行コードec(図10)と、検出した内部状態1600ごとの対応情報2300(図11)とを、順次生成し、ブロック情報格納領域213(図1)に格納する。そして、シミュレーション装置100は、検出した内部状態1600に応じた対応情報2300を用いて実行コードecを実行し、対象ブロックの性能値を計算する。
図4に示すように、シミュレーション装置100は、対象ブロックの実行コードecに加えて、検出した内部状態1600ごとに対応情報2300を生成し、ブロック情報格納領域213に記憶する。また、シミュレーション装置100は、対応情報2300に、さらに、次のブロックを指すポインタ3300と、次のブロックの第1候補の対応情報2300を指すポインタ3400とを記憶する。これにより、対応情報2300の検索処理が速くなる。
一方、シミュレーション処理の精度を高めることにより、対応情報2300のデータ量が増加する。即ち、ブロック情報3100(実行コードecや対応情報2300)のデータ量が増加する。したがって、シミュレーション装置100が、性能シミュレーション処理を、順次、実行するに連れて、ブロック情報格納領域213の空き容量が急速に減少する。これにより、シミュレーション装置100が、新たな実行コードecや対応情報2300を、ブロック情報格納領域213に記憶できない場合が発生する。
そこで、ブロック情報格納領域213の空き領域を増加させるために、ブロック情報格納領域213に記憶された、実行コードecや対応情報2300を削除する方法がある。ただし、実行頻度の高いブロックの実行コードecを削除した場合、再び、そのブロックが対象ブロックとなったときに、再コンパイルが必要となってしまう。再コンパイルが発生することにより、シミュレーションのスピードが低下してしまう。また、実行頻度の高いブロックの対応情報2300を削除した場合、対象ブロックの対応情報2300の再生成も必要となる。対応情報2300の再生成が発生することにより、さらに、シミュレーションのスピードが低下してしまう。
ブロック情報格納領域213に記憶された、図3に示す多量のブロックのブロック情報3100から、削除対象とするブロック情報3100を検出することは容易ではない。また、多量のブロックのブロック情報3100から、削除対象とするブロック情報330を検出する処理には、時間を要する。
したがって、本実施の形態例におけるシミュレーション装置100は、さらに、ブロック情報格納領域213の空き容量に応じて、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックのブロック情報3100を削除する。具体的に、シミュレーション装置100は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する。
次に、図1〜図11で説明してきた、シミュレーション装置100の処理を、図12〜図14のフローチャート図にしたがって説明する。その後に、図15〜図19にしたがって、ブロック情報3100を削除するブロックの選択処理を説明する。
[シミュレーション装置100のフローチャート図]
図12〜図14は、本実施の形態例におけるシミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。図12のフローチャート図おいて、まず、検出部1412は、ターゲットCPU1200のPC1201がつぎのブロック(対象ブロック)を示すアドレスをポイントしたか否かを判断する(ステップS2601)。検出部1412は、ステップS2601によって対象ブロックが変化したか否かを判断する。
つぎのブロック(対象ブロック)を示すアドレスをポイントしていない場合(ステップS2601:No)、検出部1412は、ステップS2601へ戻る。一方、つぎのブロック(対象ブロック)を示すアドレスをポイントした場合(ステップS2601:Yes)、検出部1412は、ターゲットCPU1200の内部状態1600を検出する(ステップS2602)。つぎに、判断部1413は、対象ブロックがコンパイル済みか否かを判断する(ステップS2603)。
コンパイル済みでないと判断された場合(ステップS2603:No)、図14のフローチャート図に移り、判断部1413は、シミュレーション装置100のメモリ(RAM203のブロック情報格納領域213)の空き容量が基準値より小さいか否かを判定する(ステップS2901)。空き容量が基準値より小さい場合(ステップS2901:Yes)、ブロック情報格納領域213の容量が不足し、新たな実行コードecや対応情報2300を記憶できない可能性がある。
したがって、判断部1413は、分岐予測機能にしたがって、分岐に応じて実行される可能性の一番低いブロックを検出し選択する(ステップS2902)。つまり、判断部1413は、以前に処理されたブロックであって、以降に実行される可能性の低いブロックを検出する。ステップS2902の処理の詳細は図15〜図18のフローチャート図にしたがって後述する。そして、判断部1413は、選択したブロックの実行コードecと対応情報2300とを、ブロック情報格納領域213から削除する(ステップS2903)。
なお、基準値は、例えば、1つのブロックのブロック情報3100のサイズに対応する。ただし、この例に限定されるものではなく、基準値は、いずれの値に設定されてもよい。また、この例では、新たに、対象ブロックの実行コードecを生成する場合に、ブロック情報格納領域213の空き容量を判定しているが、この例に限定されるものではない。シミュレーション装置100は、定期的に、ブロック情報格納領域213の空き容量を判定してもよい。
一方、メモリの空き容量が基準値以上の場合(ステップS2901:No)、ブロック分割部1411は、ターゲットプログラムpgrを分割して、対象ブロックを取得する(ステップS2801)。対応情報生成部1414は、対象ブロックが含む外部依存命令を検出し(ステップS2802)、予測情報4から検出した外部依存命令の予測ケースを取得する(ステップS2803)。
そして、実行コード生成部1415は、対象ブロックをコンパイルした機能コードc1と、予測ケースでの対象ブロックの性能値を対応情報2300により計算するタイミングコードc2と、を含む実行コードecを生成し出力する(ステップS2804)。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
予測シミュレーション実行部1420は、予測ケースについて、検出した内部状態1600と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う(ステップS2805)。対応情報生成部1414は、検出した内部状態1600と、タイミング解析結果である対象ブロックが含む各命令の性能値と、を対応付けた対応情報2300を生成し性能値表2500(図11)に記録する(ステップS2806)。同一の内部状態1600における対応情報101の生成は1回である。したがって、対象ブロックについて同一の内部状態1600が複数回検出されたとしても、対象ブロックの性能値の見積もり時の省メモリ化を図ることが可能になる。
そして、関連付け部2401は、対象ブロックの直前のブロックの対応情報2300に、対象ブロックのポインタと、生成した対応情報2300のポインタと、を関連付け(ステップS2807)、図12のフローチャート図のステップS2707へ移行する。対象ブロックの直前のブロックの対応情報2300は、対象ブロックの直前のブロックの性能値の算出に用いた対応情報2300を示す。
図12のフローチャート図に戻り、一方、対象ブロックがコンパイル済みであると判断された場合(ステップS2603:Yes)、判断部1413は、対象ブロックを示すアドレスと、直前のブロックの対応情報2300のつぎのブロックのポインタ3300と、を比較する(ステップS2604)。対象ブロックを示すアドレスとは、対象ブロックの実行コードecが記憶された記憶領域(ブロック情報格納領域213)のアドレスである。
つまり、判断部1413は、対象ブロックが第3ブロックから第4ブロックに変化した場合、対応情報2300を参照し、以前にも第3ブロックから第4ブロックに変化したか否かを判断する。具体的に、判断部1413は、第3ブロックの対応情報2300に含まれるつぎのブロックのポインタ3300が、第4ブロックのポインタと一致するか否かを判断する。
一致すると判断された場合(ステップS2605:Yes)、判断部1413は、直前のブロックの対応情報2300が関連付けるポインタ3400が示す、対応情報2300を取得する。そして、判断部1413は、直前のブロックに基づいて取得した対応情報2300が対応付ける内部状態1600と、検出した内部状態1600と、を比較する(ステップS2606)。一致していると判断した場合、判断部1413は、以前にも第3ブロックから第4ブロックに変化したと判断する。
つまり、判断部1413は、第4ブロックが以前に対象ブロックになった場合に、第3ブロックの対応情報2300が関連付ける対応情報2300を取得する。そして、判断部1413は、第3ブロックに基づいて取得した、対応情報2300が対応付ける内部状態1600が、第4ブロックについて検出した内部状態1600と一致するか否かを判断する。即ち、判断部1413は、第3ブロックの対応情報2300の対応情報のポインタ3400が示す対応情報2300が対応付ける内部状態1600と、検出部1412が第4ブロックについて検出した内部状態1600と、が一致するか否かを判断する。
一致すると判断された場合(ステップS2607:Yes)、判断部1413は、直前のブロックに関連付けられたポインタ3300が示す対応情報2300を取得し(ステップS2608)、図13のフローチャート図のステップS2707へ移行する。つまり、性能シミュレーション実行部1402は、第4ブロックについての実行コードecを、第3ブロックの対応情報2300が関連付ける、第4のブロックの対応情報2300を用いて実行する。処理の詳細については、図20のフローチャート図にしたがって後述する。
このように、本実施の形態例におけるシミュレーション装置100は、使用される可能性が高い対応情報2300を、直前のブロックの対応情報2300に関連付けておく。これにより、図11の性能値表2500から、検出した内部状態1600を対応付ける対応情報2300を検索する処理を高速化することが可能になる。
一方、ステップS2605において一致しないと判断された場合(ステップS2605:No)、またはステップS2607において一致しないと判断された場合(ステップS2607:No)のつぎに、判断部1413は、図13のフローチャート図のステップS2701へ移行する。図13のフローチャート図のステップS2701では、判断部1413は、対象ブロックの性能値表2500に登録される対応情報2300が対応付ける内部状態1600のうち、未選択の内部状態1600があるか否かを判断する(ステップS2701)。
未選択の内部状態1600がない場合(ステップS2701:No)、ステップS2805へ移行する。そして、検出した内部状態1600に対応する対応情報2300が生成される。このように、対象ブロックについて、検出した内部状態1600ごとに対応情報2300が生成される。また、対象ブロックの実行コードecは1回だけ生成される。
未選択の内部状態1600がある場合(ステップS2701:Yes)、判断部1413は、未選択の内部状態1600のうち、登録順に内部状態1600を選択する(ステップS2702)。判断部1413は、検出した内部状態1600と、選択した内部状態1600と、を比較する(ステップS2703)。そして、判断部1413は、一致しているか否かを判断する(ステップS2704)。一致する場合(ステップS2704:Yes)、判断部1413は、選択した内部状態1600を対応付ける対応情報2300を性能値表2500(図11)から取得する(ステップS2705)。
つまり、判断部1413は、検出した内部状態1600が、以前に対象ブロックとなった時に検出された内部状態1600と同一であるか否かを判断する。具体的に、判断部1413は、検出された内部状態1600を検索キーとして、性能値表2500から検索キーと一致する内部状態1600を有する対応情報101を検索する。一致する内部状態1600を有する対応情報101が検索された場合、判断部1413は、以前に対象ブロックとなった時に検出された内部状態1600と同一であると判断する。この場合、対応情報生成部1414は、あらたに対応情報101を生成しない。
次に、関連付け部2401は、対象ブロックの直前のブロックについての対応情報2300に、対象ブロックのポインタ3300と、取得した対応情報のポインタ3400と、を関連付ける(ステップS2706)。そして、コード実行部1416は、取得した対応情報2300を用いて実行コードecの実行処理を行い(ステップS2707)、図12のフローチャート図のステップS2601へ戻る。
一方、検出した内部状態1600と、選択した内部状態1600と、が一致していないと判断された場合(ステップS2704:No)、シミュレーション装置100は、ステップS2701へ戻る。つまり、判断部1413は、一致する内部状態1600を有する対応情報101が検索されなかった場合、以前に対象ブロックとなった時に検出された内部状態1600と同一でないと判断する。この場合、対応情報生成部1414は、あらたに検出された内部状態1600によってあらたに対応情報101を生成する。
[削除対象のブロックの検出処理(図14のステップS2902)]
図12〜図14のフローチャート図で説明したとおり、ブロック情報格納領域213の空き容量が基準値より小さくなった場合に、判断部1413は、分岐に応じて実行される可能性の一番低いブロックを検出し選択する(ステップS2902)。そして、判断部1413は、選択したブロックのブロック情報3100を、ブロック情報格納領域213から削除することにより、新たなブロックのブロック情報3100を記憶可能にする。
削除するブロック情報の検出方法には、LRU(Least Recently Used:LRU)アルゴリズムにしたがって、削除対象のブロック情報を検出する方法がある。この方法によると、ブロック情報格納領域213に記憶されたブロック情報のうち、長期間、実行されていないブロックのブロック情報が削除の対象となる。しかしながら、たとえ、長時間、実行されていない場合であっても、再実行の対象となる可能性がある。再実行の可能性があるブロックが削除された場合、実行コードecの再コンパイル処理や対応情報2300の生成処理が発生してしまう。
本実施の形態例において、判断部1413は、カウンターテーブル管理部1418(図5)が生成するカウンターテーブル(図15にて後述)を参照し、前のブロックからの分岐に応じて実行される度合いに基づいて、分岐に応じて実行される可能性の低いブロックを検出する。これにより、判断部1413は、実行される可能性の高いブロックのブロック情報3100がメモリから削除されることを回避できる。したがって、再コンパイル処理や対応情報2300の生成処理の発生の頻度を抑制することが可能になる。
これにより、本実施の形態例における、シミュレーション装置100は、再コンパイル処理や対応情報2300の生成処理を最小限に抑えながら、対応情報2300にしたがって、精度の高い性能シミュレーションを行うことができる。つまり、シミュレーション装置100は、性能シミュレーションの精度を向上しながら、性能シミュレーションの実行速度を維持することができる。
[カウンターテーブル]
ここで、図15により、カウンターテーブルの例を説明する。
図15は、飽和カウンター(n-bit saturating counter)に基づいて生成する、カウンターテーブル2800の一例を説明する図である。カウンターテーブル管理部1418は、飽和カウンター等の予測アルゴリズムにしたがって、カウンターテーブル2800を生成する。飽和カウンターのアルゴリズムについては、図16、図17にしたがって後述する。ただし、この例に限定されるものではなく、カウンターテーブル管理部1418は、別のアルゴリズムにしたがって、カウンターテーブル2800を生成してもよい。
図15のカウンターテーブル2800は、分岐命令のアドレスと、分岐命令が分岐する可能性を示すカウンターの値とを有する。具体的に、カウンターの値は、基準値「2n−1」より大きい場合に、分岐命令が分岐する可能性が高いことを示す。また、カウンターの値は、基準値「2n−1」より小さい場合に、分岐命令が分岐しない可能性が高いことを示す。つまり、カウンターの値が基準値「2n−1」をより上回るほど、分岐命令が分岐する可能性が高いことを示す。一方、カウンターの値が基準値「2n−1」をより下回るほど、分岐命令が分岐しない可能性が高いことを示す。
カウンターテーブル管理部1418は、シミュレーションの実行中に、実行コードecに分岐命令を検知すると、カウンターテーブル2800にしたがって、分岐命令の分岐予測を行う。そして、カウンターテーブル管理部1418は、分岐命令の予測結果と、コード実行部1416の実行コードecの実行による分岐命令の分岐結果とを比較する。そして、カウンターテーブル管理部1418は、比較結果に応じて、カウンターテーブル2800のカウンター値を更新する。
[飽和カウンターのアルゴリズム]
次に、飽和カウンター(n-bit saturating counter)のアルゴリズムの概要を説明する。まず、ブロック間の分岐を説明する。
図16は、ブロック間の分岐の例を説明する図である。図16に示すターゲットプログラムpgrは、分岐命令biを有する。前述したとおり、ブロック分割部1411(図5)は、分岐命令biにしたがってターゲットプログラムpgrを分割し、ブロックCB1〜CB4を生成する。具体的に、ブロックCBは、分岐命令までのコード群(Some head code)を有する。ブロックCB2は、分岐しない場合のコード群(if-block code)を有する。また、ブロックCB3は、分岐する場合のコード群(else-block code)を有する。ブロックCB4は、分岐処理が終了した後のコード群(Some bottom code)を有する。
図16の右側に示す各ブロックCB1〜CB4は、ターゲットプログラムpgrの各ブロックCB1〜CB4がコンパイルして生成された、実行コードecに対応する。この例において、分岐命令biが分岐しない場合(Not taken)、ブロックCB1の次には、ブロックCB2が実行対象となる。また、分岐命令biが分岐する場合(Taken)、ブロックCB1の次には、ブロックCB3が実行対象となる。また、ブロックCB2、ブロックCB3の次には、ブロックCB4が実行対象となる。
次に、図16で説明した、ブロック間の分岐に基づいて、飽和カウンター(n-bit saturating counter)のアルゴリズムを図17で説明する。
図17は、飽和カウンターのアルゴリズムを説明する図である。図17の状態遷移図2900は、飽和カウンターの5つの状態を例示する。5つの状態とは、状態「2n−1分岐する:Taken」、状態「2n−2 分岐する(可能性小):Strongly taken」、状態「2n−1 分岐する(可能性大):Very strongly taken」、状態「1 分岐しない(可能性小):Strongly not taken」、状態「0 分岐しない(可能性大):Very strongly not taken」である。状態「2n−1分岐する:Taken」は、初期状態を示す。なお、この例では、5つの状態を示すが、この例に限定されるものではない。状態数は、変数nの値にしたがって増減する。
図16で示した、ブロックCB1の分岐命令biを例示して、状態遷移を説明する。初め、分岐命令biの状態は、状態「2n−1:Taken」に設定される。分岐命令biが分岐する場合、カウンターテーブル管理部1418は、分岐命令biの状態を、状態「2n−2:Strongly taken」に遷移させる。一方、分岐命令biが分岐しない場合、カウンターテーブル管理部1418は、分岐命令biの状態を、状態「1:Strongly not taken」に遷移させる。
そして、分岐命令biが状態「2n−2:Strongly taken」を示す場合において、再び、ブロックB1が実行され分岐命令biが分岐する場合、カウンターテーブル管理部1418は、分岐命令biの状態を、さらに、状態「2n−1:Very strongly taken」に遷移させる。または、分岐命令biが状態「2n−2:Strongly taken」を示す場合において、再び、ブロックB1が実行され分岐命令biが分岐しない場合、カウンターテーブル管理部1418は、分岐命令biの状態を、状態「2n−1:Taken」に戻す。
つまり、図17に示すブロックCB1が繰り返し実行され、分岐命令biが毎回、分岐する場合、分岐命令biのカウンター値は、初期値「2n−1」から増加していく。一方、ブロックCB1が繰り返し実行され、分岐命令biが毎回、分岐しない場合、分岐命令biのカウンター値は、初期値「2n−1」から減少していく。
このように、カウンターテーブル管理部1418は、分岐命令biそれぞれについて、分岐結果にしたがって状態を遷移させる。これにより、カウンターテーブル管理部1418は、状態遷移図2900の各状態の値をカウンター値として有する、図15のカウンターテーブル2800を生成する。そして、判定部1413は、カウンターテーブル2800にしたがって、実行される可能性の低いブロックを検出する。
具体的に、判断部1413は、カウンターテーブル管理部1418が、LRU(Least Recently Used:LRU)アルゴリズムにしたがって、削除した分岐命令とカウンター値とを検出する。カウンターテーブル管理部1418は、LRUアルゴリズムにしたがって、長期間実行されていない分岐命令を削除する。そして、判断部1413は、検出した分岐命令が示す2つのブロックのうち、カウンター値に基づいて、実行される可能性の低いブロックを、削除対象リストに追加する。
具体的に、判断部1413は、カウンター値が分岐する可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐しない方のブロックを検出する。一方、カウンター値が分岐しない可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐する方のブロックを検出する。
例えば、判断部1413が、図17に示す分岐命令biのカウンター値を検出した場合を例示する。このとき、カウンター値が分岐することを示す場合、判断部1413は、2つのブロックCB2、CB3のうち、分岐しない方のブロックCB2を検出する。また、カウンター値が分岐しないことを示す場合、判断部1413は、分岐する方のブロックCB3を検出する。
そして、判断部1413は、生成した削除対象リストのエントリのうち、最も古いエントリのブロックを、削除対象のブロックとして、順次、検出する。このように、判断部1413は、カウンターテーブル2800に基づいて検出した、長期間実行されていない分岐命令が示す2つのブロックのうち、実行される可能性が低い方のブロックを検出する。これにより、判断部1413は、長期間実行されず、さらに、実行される可能性の低いブロックを適切に検出することができる。
さらに、判断部1413は、削除対象リストのエントリがない場合、カウンターテーブル2800の各分岐命令のカウンター値にしたがって、実行される可能性の低いブロックを検出する。なお、この例に限定されるものではなく、判断部1413は、削除対象リストのエントリに寄らず、分岐命令のカウンター値のみにしたがって、実行される可能性の低いブロックを検出してもよい。
具体的に、判断部1413は、カウンターテーブル2800から、初期値「2n−1」との差分の絶対値が最も大きいカウンター値を検出する。検出したカウンター値の分岐命令は、分岐する可能性が最も高い、または、分岐しない可能性が最も高いことを示す。前述したとおり、判断部1413は、検出したカウンター値が分岐する可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐しない方のブロックを検出する。一方、検出したカウンター値が分岐しない可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐する方のブロックを検出する。
このように、判断部1413は、図15に示すような、カウンターテーブル2800のカウンター値に基づいて、効率的に、実行される可能性の低いブロックを検出することができる。また、判断部1413は、前のブロックからの分岐に応じて実行される度合いに基づくことにより、長期間実行されていないものの、実行される可能性があるブロックのブロック情報3100を削除対象とすることを抑制できる。
したがって、カウンターテーブル2800に基づくことにより、単に、長期間、実行されていないブロックを検出する場合に対して、より適切に、実行される可能性の低いブロックを検出可能になる。即ち、長時間、実行されていなくても、再実行の可能性があるブロックのブロック情報3100を削除対象とすることを抑制することができる。これにより、再実行される可能性があるブロックのブロック情報3100を、より確実に、ブロック情報格納領域213に記憶させておくことが可能になる。
したがって、本実施の形態例におけるシミュレーション装置100は、再コンパイル処理や対応情報2300の生成処理の発生を抑制することができ、シミュレートの速度の低下を抑制することができる。
[フローチャート]
次に、判断部1413が、カウンターテーブル2800のカウンター値を参照して、削除対象のブロックを検出する処理を図18にしたがって説明する。
図18は、カウンターテーブル2800を参照して、削除対象のブロックを検出する処理を説明するフローチャート図である。
ステップS3101:判断部1413は、カウンターテーブル2800を参照し、ポインタ「min_ptr」に、カウンターテーブル2800の最初のエントリをポイントさせる。
ステップS3102:判断部1413は、カウンターテーブル2800の最初のエントリのカウンター値を取得する。
ステップS3103:判断部1413は、取得したカウンター値から、初期値「2n−1」を減算した値の絶対値を、値「ref_val」に保存する。
ステップS3104:次に、判断部1413は、カウンターテーブル2800に、次のエントリがあるか否かを判定する。
ステップS3105:次のエントリがある場合(ステップS3104:Yes)、判断部1413は、ポインタ「current_ptr」に、次のエントリをポイントさせる。
ステップS3106:また、判断部1413は、ポインタ「current_ptr」がポイントするエントリのカウンター値を取得する。
ステップS3106:判断部1413は、取得したカウンター値から初期値「2n−1」を減算した値の絶対値を、値「current_val」に保存する。
ステップS3108:そして、判断部1413は、次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」より大きいか否かを判定する。つまり、判断部1413は、第1のエントリの絶対値と、第2のエントリの絶対値とを比較する。
ステップS3109:次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」より大きい場合(ステップS3108:Yes)、次のエントリが、初めのエントリよりも、初期値「2n−1」との差分の絶対値が大きいことを示す。したがって、判断部1413は、初めのエントリを示すポインタ「min_ptr」に、次のエントリを示すポインタ「current_ptr」の値をセットする。
一方、次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」以上の場合(ステップS3108:No)、判断部1413は、初めのエントリを示すポインタ「min_ptr」を更新しない。
カウンターテーブル2800にエントリがある間(ステップS3104:Yes)、判断部1413は、ポインタ「current_ptr」を移動し、ステップS3105〜ステップS3109の処理を行う。この結果、ポインタ「min_ptr」は、カウンターテーブル2800のすべてのエントリのうち、最も、絶対値が大きいエントリを示す。
ステップS3110:エントリがなくなると(ステップS3104:No)、判断部1413は、ポインタ「min_ptr」が示すエントリの分岐命令アドレスを検出する。
ステップS3101:検出した分岐命令アドレスのカウンター値が初期値「2n−1」以上であることから、分岐命令が分岐する可能性が高いことを示す場合、判断部1413は、分岐命令が示す、分岐しない場合のブロックを削除対象とする。一方、検出した分岐命令アドレスのカウンター値が、初期値「2n−1」より小さいことから、分岐命令が分岐しない可能性が高いことを示す場合、判断部1413は、分岐命令が示す、分岐する場合のブロックを削除対象とする。
ここで、図15のカウンターテーブル2800にしたがって、実行される可能性の低いブロックを検出する具体例を説明する。具体例では、図15のカウンターテーブル2800における値nが値「5」である場合を例示する。
図15のカウンターテーブル2800によると、アドレス「0x80005000」の分岐命令のカウンター値は、値「22(=2n−10)」であって、初期値「16(=2n-1)」を超える。つまり、アドレス「0x80005000」の分岐命令は、分岐する可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「6(=22−16)」である。同様にして、アドレス「0x40010200」の分岐命令のカウンター値は、値「20(=2n−1+4)」であって、初期値「16(=2n-1)」を超える。つまり、アドレス「0x40010200」の分岐命令は、分岐する可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「4(=20−16)」である。
また、アドレス「0x15604000」の分岐命令のカウンター値は、値「6」であって、初期値「16(=2n-1)」を下回る。つまり、アドレス「0x15604000」の分岐命令は、分岐しない可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「10(=16−6)」である。
したがって、判断部1413は、カウンター値と初期値との絶対値が最も大きいアドレス「0x15604000」の分岐命令を検出する。前述したとおり、アドレス「0x15604000」の分岐命令のカウンター値「6」は、分岐しない可能性が高いことを示す。したがって、判断部1413は、アドレス「0x15604000」の分岐命令が示す、分岐する場合のブロックを検出する。
[分岐予測処理の説明]
次に、カウンターテーブル管理部1418が、図15に示すカウンターテーブル2800にしたがって行う分岐予測処理を、図19にしたがって説明する。
図19は、カウンターテーブル2800に基づいて分岐予測を行う処理を説明するフローチャート図である。
ステップS3201:カウンターテーブル管理部1418は、カウンターテーブル2800から、対象の分岐命令のアドレスと一致するテーブルのエントリを検索する。
ステップS3203:対象の分岐命令と一致するテーブルのエントリが検出されない場合(ステップS3202:No)、カウンターテーブル管理部1418は、テーブルに空きエントリがあるか否かを判定する。この場合、対象の分岐命令を含むブロックが初めて実行される場合を示す。
ステップS3204:テーブルに空きエントリがない場合(ステップS3203:No)、カウンターテーブル管理部1418は、LRUアルゴリズムにしたがって、長期間更新されていないエントリを削除する。前述したとおり、例えば、判断部1413は、削除されたエントリの分岐命令が示す2つのブロックのうち、実行される可能性の低いブロックを、削除対象リストに追加する。
ステップS3205:テーブルに空きエントリがある場合(ステップS3203:Yes)、または、エントリを削除した場合(ステップS3204)、カウンターテーブル管理部1418は、対象の分岐命令をカウンターテーブル2800のエントリに追加する。また、カウンターテーブル管理部1418は、対象の分岐命令のカウンター値を初期値「2n−1」に設定する。
ステップS3206:対象の分岐命令と一致するテーブルのエントリが検出された場合(ステップS3201:Yes)、カウンターテーブル管理部1418は、エントリのカウンター値が、初期値「2n−1」より大きいか否かを判定する。または、対象の分岐命令のエントリをカウンターテーブル2800に追加した場合(ステップS3204)、カウンターテーブル管理部1418は、エントリのカウンター値が、初期値「2n−1」より大きいか否かを判定する。
ステップS3207:カウンター値が、初期値「2n−1」以上の場合(ステップS3206:Yes)、カウンターテーブル管理部1418は、信号Taken(分岐する)を送信する。即ち、カウンターテーブル管理部1418は、対象の分岐命令が分岐する旨、予測する。
ステップS3208:一方、カウンター値が、初期値「2n−1」より小さい場合(ステップS3206:No)、カウンターテーブル管理部1418は、信号Not Taken(分岐しない)を送信する。即ち、カウンターテーブル管理部1418は、対象の分岐命令が分岐しない旨、予測する。
このように、シミュレーション装置100は、プロセッサの既存機能である分岐予測機能によって生成されるカウンターテーブル2800を利用することによって、実行される可能性の低いブロックを、効率的に検出することができる。また、分岐予測機能は、シミュレータに予め、搭載されるモデルである。したがって、カウンターテーブル2800の生成による、シミュレーション処理に負荷は新たに発生しない。
[コード実行処理]
次に、図13のフローチャート図のステップS2707に示す、コード実行部1416による、取得した対応情報2300を用いた実行コードecの実行処理を説明する。
図20は、コード実行部1416による実行コードecの実行処理を説明するフローチャート図である。コード実行部1416は、検出した内部状態1600と対応情報2300を用いて、実行コードecの各命令を順に実行する(ステップS2101)。コード実行部1416は、対象ブロックに含まれる外部依存命令を実行したか否かを判断する(ステップS2102)。
対象ブロックに含まれる外部依存命令を実行していないと判断された場合(ステップS2102:No)、コード実行部1416は、ステップS2104へ移行する。
対象ブロックに含まれる外部依存命令を実行したと判断された場合(ステップS2102:Yes)、コード実行部1416は、外部依存命令に応じた補正部1417による補正処理を実行する(ステップS2103)。ステップS2103の処理の詳細は、図22のフローチャートにしたがって説明する。そして、コード実行部1416は、実行結果を、シミュレーション情報1430として出力する(ステップS2104)。
つぎに、コード実行部1416は、対象ブロックに含まれる命令の実行が終了したか否かを判断する(ステップS2105)。実行が終了したと判断された場合(ステップS2105:Yes)、コード実行部1416は、一連の処理を終了する。一方、実行が終了していないと判断された場合(ステップS2105:No)、ステップS2101へ戻る。
[補正処理]
図21は、図20のステップS2103で示す補正部1417の呼び出し処理の詳細な説明を示すフローチャートである。
まず、補正部1417は、キャッシュアクセスが要求されているか否かを判断する(ステップS2201)。キャッシュアクセスが要求されていない場合(ステップS2201:No)、ステップS2205へ移行する。キャッシュアクセスが要求されている場合(ステップS2201:Yes)、ステップS2203におけるシミュレーションは、動作シミュレーションsimである。補正部1417は、キャッシュアクセスの結果は予測ケースと同じか否かを判断する(ステップS2202)。
同じではない場合(ステップS2202:No)、補正部1417は、性能値の補正を行う(ステップS2203)。そして、補正部1417は、補正された性能値を出力し(ステップS2204)、一連の処理を終了する。同じであると判断された場合(ステップS2202:Yes)、補正部14170は、対応情報101に含まれる予測された性能値を出力し(ステップS2205)、一連の処理を終了する。
以上のように、本実施の形態例におけるシミュレーション方法は、対象ブロックが変化した場合に検出した内部状態1600と、対象ブロックの各命令の性能値2200とを対応付ける対応情報2300と、実行コードecとを、順次生成し、メモリに記憶する生成工程を有する。内部状態1600は、対象プロセッサ1200の内部状態を示す。また、対象ブロックは、シミュレーションの対象となる、対象プロセッサのプログラムを分割したプログラムを示す。実行コードは、対象ブロックを変換したプロセッサの実行プログラムを示す。
また、シミュレーション方法は、内部状態に対応する対応情報を用いて実行コードを実行し、対象ブロックの性能値を計算する計算工程を有する。また、シミュレーション方法は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードと対応情報とを削除する削除工程を有する。
これにより、実行される可能性の低いブロックのブロック情報3100をメモリから削除することが可能になる。つまり、実行される可能性があるブロックのブロック情報3100がメモリ213から削除されることが抑制可能になる。したがって、シミュレーション装置100は、実行対象のブロックの再コンパイル処理や対応情報2300の生成処理の発生を抑えることができる。
これにより、シミュレーション装置100は、再コンパイル処理や対応情報2300の生成処理を最小限に抑えながら、対応情報2300にしたがって、精度の高い性能シミュレーションを行うことができる。つまり、シミュレーション装置100は、性能シミュレーションの精度を向上させながら、性能シミュレーションの実行速度を維持することができる。
また、本実施の形態例におけるシミュレーション方法の生成工程は、対象ブロックの実行コードecがメモリに記憶されていない場合に、対象ブロックの実行コードecを生成してメモリに記憶する工程を有する。また、生成工程は、記憶されている場合に、記憶されている実行コードを読み出す工程を有する。
これにより、シミュレーション装置100は、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードecと対応情報2300とを削除することで、新たな実行コードecをメモリに記憶することができる。これにより、コンパイル処理の発生頻度を抑えることが可能になる。
また、本実施の形態例におけるシミュレーション方法の生成工程は、内部状態1600が一致する対応情報2300がメモリに記憶されていない場合に、内部状態1600と性能値2200とを対応付ける対応情報2300を生成しメモリに記憶する工程を有する。また、生成工程は、記憶されている場合に、記憶されている対応情報を読み出す工程を有する。
したがって、シミュレーション装置100は、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードecと対応情報2300とを削除することにより、新たな対応情報を2300メモリに記憶することができる。これにより、対応情報2300の生成処理の発生頻度を抑えることが可能になる。
また、本実施の形態例におけるシミュレーション方法の削除工程は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する。これにより、シミュレーション装置100は、実行される可能性が低いブロックを適切に選択し、選択したブロックのブロック情報3100を削除することができる。また、シミュレーション装置100は、一定期間実行されていないものの、実行される可能性があるブロックを、ブロック情報3100の削除対象とすることを抑制できる。
また、本実施の形態例におけるシミュレーション方法の削除工程は、所定の期間、実行されていないブロックを検出し、検出したブロックの次に実行されるブロックのうち、検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する。
これにより、シミュレーション装置100は、長期間実行されず、さらに、実行される可能性の低いブロックを適切に検出し、実行コードecと対応情報2300を削除することができる。したがって、シミュレーション装置100は、再実行される可能性があるブロックのブロック情報3100を、より確実に、ブロック情報格納領域213に記憶させておくことが可能になる。
また、本実施の形態例におけるシミュレーション方法の削除工程は、プログラムの分岐コードごとの飽和カウンターの値に基づいて、飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出する。飽和カウンターの値は、対象プロセッサが生成する。また、削除工程は、検出した分岐コードの飽和カウンターの値が分岐する度合いを示す場合は、分岐コードが分岐しない場合に次に実行されるブロックを、分岐しない度合いを示す場合は、分岐コードが分岐する場合に次に実行されるブロックを選択する。
これにより、シミュレーション装置100は、飽和カウンターのアルゴリズムにしたがって生成されるカウンターテーブル2800のカウンター値に基づいて、実行される可能性の低いブロックを、効率的に、検出することができる。また、シミュレーション装置100は、長期間実行されていないものの、実行される可能性があるブロックを、ブロック情報3100の削除対象とすることを回避できる。これにより、シミュレーション装置100は、再実行される可能性があるブロックのブロック情報3100を、より確実に、メモリ213に記憶させておくことが可能になる。
また、シミュレーション装置100は、プロセッサの既存機能である分岐予測機能によって生成されるカウンターテーブル2800を利用する。これにより、シミュレーション装置100は、より効率的に、実行される可能性の低いブロックを検出することができる。また、分岐予測機能が、シミュレータに予め搭載されるモデルであることから、カウンターテーブル2800の生成による、シミュレーション処理に負荷は新たに発生しない。
また、本実施の形態例におけるシミュレーション方法の削除工程は、メモリの空き容量が基準値より小さい場合に、選択したブロックの実行コードecと対応情報2300とを削除する。したがって、シミュレーション装置100は、メモリ213の空き容量が基準値より小さい場合に、選択したブロックの実行コードecと当該ブロックに対応する対応情報2300とを削除する。これにより、シミュレーション装置100は、メモリの空き容量が不足する前に、実行コードecと対応情報2300を記憶するメモリの空き容量を確保することができる。
以上の実施の形態をまとめると、次の付記のとおりである。
(付記1)
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータが実行するシミュレーション方法であって、前記プロセッサが、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶する生成工程と、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算する計算工程と、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する削除工程と
を実行するシミュレーション方法。
(付記2)
付記1において、
前記生成工程は、前記対象ブロックの前記実行コードが前記メモリに記憶されていない場合に、前記対象ブロックの実行コードを生成して前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている実行コードを読み出す工程と、を有する、シミュレーション方法。
(付記3)
付記1または2において、
前記生成工程は、前記内部状態が一致する前記対応情報が前記メモリに記憶されていない場合に、前記内部状態と前記性能値とを対応付ける対応情報を生成し前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている対応情報を読み出す工程と、を有するシミュレーション方法。
(付記4)
付記1乃至3のいずれかにおいて、
前記削除工程は、前記複数のブロックのうち、前記前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する、シミュレーション方法。
(付記5)
付記4において、
前記削除工程は、所定の期間、実行されていない前記ブロックを検出し、前記検出したブロックの次に実行されるブロックのうち、前記検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する、シミュレーション方法。
(付記6)
付記4において、
前記削除工程は、前記対象プロセッサが生成する、前記プログラムの分岐コードごとの飽和カウンターの値に基づいて、前記飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出し、前記検出した分岐コードの飽和カウンターの値が前記分岐する度合いを示す場合は、前記分岐コードが分岐しない場合に次に実行されるブロックを選択し、前記分岐しない度合いを示す場合は、前記分岐コードが分岐する場合に次に実行されるブロックを選択する、シミュレーション方法。
(付記7)
付記1乃至6のいずれかにおいて、
前記削除工程は、前記メモリの空き容量が基準値より小さい場合に、前記選択したブロックの前記実行コードと前記対応情報とを削除する、シミュレーション方法。
(付記8)
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータに実行させるシミュレーションプログラムであって、前記プロセッサに、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶し、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算し、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する
処理を実行させるシミュレーションプログラム。
(付記9)
付記8において、
前記対象ブロックの前記実行コードが前記メモリに記憶されていない場合に、前記対象ブロックの実行コードを生成して前記メモリに記憶し、
前記記憶されている場合に、前記記憶されている実行コードを読み出す、
処理をコンピュータに実行させるシミュレーションプログラム。
(付記10)
付記8または9において、
前記内部状態が一致する前記対応情報が前記メモリに記憶されていない場合に、前記内部状態と前記性能値とを対応付ける対応情報を生成し前記メモリに記憶し、
前記記憶されている場合に、前記記憶されている対応情報を読み出す、
処理をコンピュータに実行させるシミュレーションプログラム。
(付記11)
付記8乃至10のいずれかにおいて、
前記複数のブロックのうち、前記前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
(付記12)
付記11において、
所定の期間、実行されていない前記ブロックを検出し、前記検出したブロックの次に実行されるブロックのうち、前記検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
(付記13)
付記11において、
前記対象プロセッサが生成する、前記プログラムの分岐コードごとの飽和カウンターの値に基づいて、前記飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出し、前記検出した分岐コードの飽和カウンターの値が前記分岐する度合いを示す場合は、前記分岐コードが分岐しない場合に次に実行されるブロックを選択し、前記分岐しない度合いを示す場合は、前記分岐コードが分岐する場合に次に実行されるブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
(付記14)
付記8乃至13のいずれかにおいて、
前記メモリの空き容量が基準値より小さい場合に、前記選択したブロックの前記実行コードと前記対応情報とを削除する、
処理をコンピュータに実行させるシミュレーションプログラム。