(57)【特許請求の範囲】
【請求項１】
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータが実行するシミュレーション方法であって、前記プロセッサが、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶する生成工程と、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算する計算工程と、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する削除工程と
を実行するシミュレーション方法。
【請求項２】
請求項１において、
前記生成工程は、前記対象ブロックの前記実行コードが前記メモリに記憶されていない場合に、前記対象ブロックの実行コードを生成して前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている実行コードを読み出す工程と、を有する、シミュレーション方法。
【請求項３】
請求項１または２において、
前記生成工程は、前記内部状態が一致する前記対応情報が前記メモリに記憶されていない場合に、前記内部状態と前記性能値とを対応付ける対応情報を生成し前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている対応情報を読み出す工程と、を有するシミュレーション方法。
【請求項４】
請求項１乃至３のいずれかにおいて、
前記削除工程は、前記複数のブロックのうち、前記前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する、シミュレーション方法。
【請求項５】
請求項４において、
前記削除工程は、所定の期間、実行されていない前記ブロックを検出し、前記検出したブロックの次に実行されるブロックのうち、前記検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する、シミュレーション方法。
【請求項６】
請求項４において、
前記削除工程は、前記対象プロセッサが生成する、前記プログラムの分岐コードごとの飽和カウンターの値に基づいて、前記飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出し、前記検出した分岐コードの飽和カウンターの値が前記分岐する度合いを示す場合は、前記分岐コードが分岐しない場合に次に実行されるブロックを選択し、前記分岐しない度合いを示す場合は、前記分岐コードが分岐する場合に次に実行されるブロックを選択する、シミュレーション方法。
【請求項７】
請求項１乃至６のいずれかにおいて、
前記削除工程は、前記メモリの空き容量が基準値より小さい場合に、前記選択したブロックの前記実行コードと前記対応情報とを削除する、シミュレーション方法。
【請求項８】
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータに実行させるシミュレーションプログラムであって、前記プロセッサに、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶し、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算し、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する
処理を実行させるシミュレーションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シミュレーション方法、シミュレーションプログラムに関する。
【背景技術】
【０００２】
従来、プログラムの開発を支援するために、シミュレーションによって、プログラムをプロセッサ上で動作させた場合についてのプログラムの実行時間などの性能を見積もる技術がある。また、従来、プログラムのコードを複数のブロックに分割し、各ブロックでパイプラインインタロックを考慮した静的な実行サイクル数を算出する技術がある。
【０００３】
プログラムのシミュレーションについては、例えば、特許文献１、２に記載される。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１３−８４１７８号公報
【特許文献２】特開平９−６６４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、アウト・オブ・オーダー実行のプロセッサにおいては、プログラムが示す命令の実行順においてブロックを跨って命令の追い越しなどが発生し、プロセッサがブロックを実行した場合の性能が実行状況によって異なる。そのため、性能を精度よく見積もることができない場合がある。
【０００６】
また、シミュレーションの実行を継続するに連れて、メモリの空き容量が少なくなることがある。メモリの空き容量が少なくなることによって、シミュレーションの速度が低下することがある。
【０００７】
１つの側面では、本発明は、見積もり精度を向上しながら、シミュレーション速度を高速にするシミュレーション方法、シミュレーションプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
第１の側面は、処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータが実行するシミュレーション方法であって、前記プロセッサが、シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶する生成工程と、前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算する計算工程と、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する削除工程とを実行する。
【発明の効果】
【０００９】
第１の側面によれば、見積もり精度を向上しながら、シミュレーション速度を高速にすることができる。
【図面の簡単な説明】
【００１０】
【図１】実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。
【図２】ターゲットＣＰＵ例を示す説明図である。
【図３】本実施の形態例におけるシミュレーション装置（図１）による一動作例を示す説明図である。
【図４】ターゲットＣＰＵがアウト・オブ・オーダー実行の場合にシミュレーション装置が生成するブロック情報を説明する図である。
【図５】本実施の形態例におけるシミュレーション装置のソフトウェアモジュール構成を説明する図である。
【図６】ブロックが有する命令の一例を示す図である。
【図７】図６のブロックが含む各命令のタイミング情報の例を示す図である。
【図８】図６に示すブロックの各命令の実行タイミング例を示す図である。
【図９】ターゲットプログラムが有するブロックの例を示す説明図である。
【図１０】実行コードの例を示す図表である。
【図１１】性能値表例を示す説明図である。
【図１２】実施の形態例におけるシミュレーション装置によるシミュレーション処理手順例を示す第１のフローチャートである。
【図１３】実施の形態例におけるシミュレーション装置によるシミュレーション処理手順例を示す第２のフローチャートである。
【図１４】実施の形態例におけるシミュレーション装置によるシミュレーション処理手順例を示す第３のフローチャートである。
【図１５】飽和カウンターに基づいて生成する、カウンターテーブルの一例を説明する図である。
【図１６】ブロック間の分岐の例を説明する図である。
【図１７】飽和カウンターのアルゴリズムを説明する図である。
【図１８】カウンターテーブルを参照して、削除対象のブロックを検出する処理を説明するフローチャート図である。
【図１９】カウンターテーブルに基づいて分岐予測を行う処理を説明するフローチャート図である。
【図２０】コード実行部による実行コードの実行処理を説明するフローチャート図である。
【図２１】図２０で示した補正部の呼び出し処理の詳細な説明を示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下、図面にしたがって本発明の実施の形態を説明する。ただし、本発明の技術的範囲はこれらの実施の形態に限定されず、特許請求の範囲に記載された事項とその均等物まで及ぶものである。
【００１２】
［シミュレーション装置のハードウェア構成］
図１は、実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。シミュレーション装置１００は、ホストＣＰＵ（Central Processing Unit：ＣＰＵ）２０１と、ＲＯＭ（read only memory：ＲＯＭ）２０２と、ＲＡＭ（Random Access Memory：ＲＡＭ）２０３と、ディスクドライブ２０４と、ディスク２０５と、を有する。シミュレーション装置１００は、更に、Ｉ／Ｆ（Inter Face：Ｉ／Ｆ）部２０６と、入力装置２０７と、出力装置２０８と、を有する。また、各部はバス２００によってそれぞれ接続される。
【００１３】
ディスクドライブ２０４は、ホストＣＰＵ２０１の制御にしたがってディスク２０５に対するデータのリード／ライトを制御する。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する。ディスク２０５としては、磁気ディスク、光ディスクなどが挙げられる。Ｉ／Ｆ部２０６は、通信回線を通じてＬＡＮ（Local Area Network：ＬＡＮ）、ＷＡＮ（Wide Area Network：ＷＡＮ）、インターネットなどのネットワークＮＥＴに接続され、このネットワークＮＥＴを介して他の装置に接続される。そして、Ｉ／Ｆ部２０６は、ネットワークＮＥＴと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ部２０６には、例えばＮＩＣ（Network Interface Card：ＮＩＣ）やＬＡＮアダプタなどを採用することができる。
【００１４】
入力装置２０７は、キーボード、マウス、タッチパネルなど利用者の操作により、各種データの入力を行うインターフェースである。また、入力装置２０７は、カメラから画像や動画を取り込むこともできる。また、入力装置２０７は、マイクから音声を取り込むこともできる。出力装置２０８は、ホストＣＰＵ２０１の指示により、データを出力するインターフェースである。出力装置２０８には、ディスプレイやプリンタが挙げられる。
【００１５】
ホストＣＰＵ２０１は、シミュレーション装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶する。ＲＡＭ２０３は、ホストＣＰＵ２０１のワークエリアとして使用される記憶部である。ＲＡＭ２０３は、実施の形態にかかるシミュレーションプログラム格納領域２１０、タイミング情報格納領域２１１、分岐予測関数ライブラリ格納領域２１２、ブロック情報格納領域２１３を有する。
【００１６】
シミュレーションプログラム格納領域２１０に記憶されたシミュレーションプログラム（以下、シミュレーションプログラム２１０と称する）は、ホストＣＰＵ２０１の実行によって、本実施の形態例におけるシミュレーション処理を実現する。シミュレーション処理は、対象のプログラムを、図１のホストＣＰＵ２０１とは別の、アウト・オブ・オーダー実行のプロセッサが実行した場合の性能シミュレーション処理である。以下、対象のプログラムをターゲットプログラムと称する。タイミング情報格納領域２１１に記憶されるタイミング情報１４００については後述する。
【００１７】
分岐予測関数ライブラリ格納領域２１２に記憶された分岐予測関数ライブラリ（以下、分岐予測関数ライブラリ２１２と称する）は、ターゲットのプロセッサの分岐予測アルゴリズムのモデルである。また、ブロック情報格納領域２１３は、シミュレーションプログラム２１０が生成するブロック情報を記憶する領域である。ブロック情報は、ブロックの実行コードと対応情報とを示す。実行コード、対応情報の詳細については、後述する。本実施の形態例では、ブロック情報格納領域２１３は、サイズが指定された固定の領域を示す。ただし、この例に限定されるものではなく、ブロック情報格納領域２１３は、可変サイズの領域であってもよい。
【００１８】
本実施の形態では、アウト・オブ・オーダー実行のプロセッサをターゲットＣＰＵ（Central Processing Unit）と称する。シミュレーション装置１００が有するプロセッサ２０１をホストＣＰＵと称する。図１の例では、ターゲットＣＰＵがＡＲＭ（登録商標）社のＡＲＭアーキテクチャのＣＰＵであり、シミュレーション装置１００が有するホストＣＰＵ２０１は、例えば、インテル社（登録商標）のＸ８６アーキテクチャのＣＰＵである。
【００１９】
本実施の形態では、ターゲットＣＰＵがアウト・オブ・オーダー実行の場合のシミュレーション装置１００について説明する。まず、アウト・オブ・オーダー実行のターゲットＣＰＵについて、図２にしたがって簡単に説明する。
【００２０】
［ターゲットプロセッサの概要］
図２は、ターゲットＣＰＵの一例を示す説明図である。ここでは、アウト・オブ・オーダーのターゲットＣＰＵ１２００の一例について、簡単に説明する。ターゲットＣＰＵ１２００は、ＰＣ（Program Counter：ＰＣ）１２０１と、命令フェッチ部１２０２と、デコード部１２０４と、命令キュー１２０９を有するリザベーションステーション１２０５と、を有する。ターゲットＣＰＵ１２００は、複数の実行ユニット１２０６と、リオーダ・バッファ１２０７と、レジスタファイル１２０８と、を有する。
【００２１】
ここで、ターゲットＣＰＵ１２００の処理を順に説明する。
（１）ターゲットＣＰＵ１２００はメモリ１２０３から命令フェッチ、命令デコードを行う。
（２）ターゲットＣＰＵ１２００はデコードした命令を命令キュー１２０９に入れ、リオーダ・バッファ１２０７に記録する。
（３）ターゲットＣＰＵ１２００は命令キュー１２０９にある命令のうち、実行可能になった命令を実行ユニット１２０６に投入する。
（４）ターゲットＣＰＵ１２００は実行ユニット１２０６により命令の処理完了後、実行結果をリオーダ・バッファ１２０７に格納する。
（５）ターゲットＣＰＵ１２００はリオーダ・バッファ１２０７内の実行ユニット１２０６により処理が完了した命令の状態を完了に変更する。
（６）ターゲットＣＰＵ１２００は、リオーダ・バッファ１２０７内の命令のうち、最も古い命令の実行が完了すると、その命令の実行結果はレジスタファイル１２０８に書き戻す。
（７）ターゲットＣＰＵ１２００はリオーダ・バッファ１２０７から完了状態の命令を削除する。
【００２２】
そして、本実施の形態では、ターゲットＣＰＵ１２００の内部状態として、命令キュー１２０９、実行ユニット１２０６、リオーダ・バッファ１２０７の状態などと、対象ブロックの直前に実行した命令のアドレスと、を利用する。
【００２３】
アウト・オブ・オーダー実行のターゲットＣＰＵ１２００において、プログラムの実行順序が変化する例を説明する。例えば、プログラムが示す実行順序が以下とする。以下の命令例では（）内の番号が実行順番を示し、「；」以降は注釈である。
（１）命令１：ｌｄｒ  ｒ０，［ｒ１］；ｒ０＜−［ｒ１］
（２）命令２：ａｄｄ  ｒ０，ｒ０，１ｌｒ０＜−ｒ０＋１
（３）命令３：ｍｏｖ  ｒ２，０；ｒ２＜−０
命令１は実行に時間がかかり、命令２は命令１の実行結果に依存する。そのため、プログラムが示す実行順序と、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００が実行する実行順序と、が異なる。例えば、ターゲットＣＰＵ１２００が実行する命令の実行順序は、リザベーションステーション１２０５の投入制御により、以下の順となる。以下の命令例では（）内の番号が実行順番を示し、「；」以降は注釈である。
（１）命令１：ｌｄｒ  ｒ０，［ｒ１］；ｒ０＜−［ｒ１］
（２）命令３：ｍｏｖ  ｒ２，０；ｒ２＜−０
（３）命令２：ａｄｄ  ｒ０，ｒ０，１ｌｒ０＜−ｒ０＋１
また、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００では、命令の追い越しが発生するため、ある命令の実行が遅いことによって他のブロックにも影響を及ぼす可能性がある。ブロックとは、プログラムのコードを分割して得られるブロックを示す。プログラムに含まれるブロックの実行順序が以下であるとする。Ｂ１〜Ｂ３がブロックである。
【００２４】
Ｂ１：命令１（実行に時間がかかる命令）
Ｂ２：命令２（命令１に依存する命令）
Ｂ２：命令３（命令１に依存する命令）
Ｂ３：命令４（命令１に依存しない命令）
命令４は、命令１に依存せず、実行に時間がかからない命令である。したがって、ターゲットＣＰＵ１２００のリザベーションステーション１２０５の投入制御により、以下のように、命令４は命令２と命令３の実行を追い越して完了する。
【００２５】
Ｂ１：命令１（実行に時間がかかる命令）
Ｂ３：命令４（命令１に依存しない命令）
Ｂ２：命令２（命令１に依存する命令）
Ｂ２：命令３（命令１に依存する命令）
［シミュレーション装置１００によるシミュレーションの概要］
次に、シミュレーション装置１００（図１）が実行する、性能シミュレーションの概要を説明する。
【００２６】
本実施の形態では、評価対象となる第１プロセッサ（この例では、図２に示したターゲットＣＰＵ１２００）がターゲットプログラムを実行した場合の機能や性能のシミュレーションを、シミュレーション装置１００が有する第２プロセッサ（この例では、図１に示したホストＣＰＵ２０１）によって実行する。第２プロセッサ（ホストＣＰＵ２０１）によってシミュレーションを行う際に、第１プロセッサ（ターゲットＣＰＵ１２００）のターゲットプログラムから第２プロセッサが実行可能なコードへの変換が必要となる。第２プロセッサが実行可能なコードへの変換手法として、例えば、インタープリタ方式またはＪＩＴ（Just-In-Time：ＪＩＴ）コンパイラ方式がある。本実施の形態にかかるシミュレーション装置は、ＪＩＴコンパイラ方式による性能のシミュレーションを行う。
【００２７】
図３は、本実施の形態例におけるシミュレーション装置１００（図１）による一動作例を模式的に示す説明図である。図３は、ターゲットＣＰＵ１２００がターゲットプログラムｐｇｒを実行した場合における動作シミュレーションｓｉｍを、Ｘ８６アーキテクチャのホストＣＰＵ２０１が実行する処理を模式的に示す。
【００２８】
ここでの動作シミュレーションｓｉｍは、例えば、図２に示すターゲットＣＰＵ１２００のモデルと、ターゲットＣＰＵ１２００がアクセスするハードウェア資源のモデルに、ターゲットプログラムｐｇｒを与えることによるシミュレーションである。ここで使用されるシステムのモデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。
【００２９】
図３に示す動作シミュレーションｓｉｍは、コード変換処理１４０１ｘと、性能シミュレーション実行処理１４０２ｘを有する。まず、コード変換処理１４０１ｘでは、シミュレーション装置１００は、ターゲットプログラムｐｇｒのコードを分割して、ブロックｇ１〜ｇ４を生成する。分割されるブロック単位は、例えば、分岐からつぎの分岐前までのコードなどのベーシック（基本）ブロック単位でよく、または、予め定められた任意のコード単位でよい。ベーシックブロック単位とは、分岐命令から次の分岐命令前までのコード群である。
【００３０】
ブロックに分割するタイミングは、事前にすべて分割しておいてもよいし、対象ブロックとなった時に対象ブロックだけを分割してもよい。ここで、分割して生成された１つのブロックｇ１は、例えば、命令「ＡＲＭ＿ｉｎｓｎ＿Ａ」、「ＡＲＭ＿ｉｎｓｎ＿Ｂ」、「ＡＲＭ＿ｉｎｓｎ＿Ｃ」、「ＡＲＭ＿ｂｒ＿ｌｒ」を有する。
【００３１】
シミュレーション装置１００は、ブロックｇ１〜ｇ４のうち、動作シミュレーションｓｉｍの対象ブロックが変化した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態１６００を検出する（Ａ１）。ターゲットＣＰＵの内部状態１６００とは、たとえば、図２に示すターゲットＣＰＵ１２００が有するレジスタなどの設定値である。シミュレーション装置１００は、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００が有するレジスタなどの設定値によって、ターゲットプログラムｐｇｒの実行状況を判別可能である。
【００３２】
また、シミュレーション装置１００は、対象ブロックが変化した場合、検出した内部状態１６００と、対象ブロックｇ１に含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う（Ａ２）。これにより、シミュレーション装置１００は、対象ブロックｇ１に含まれる各命令の性能値を算出する。シミュレーション装置１００は、検出した内部状態１６００と、対象ブロックｇ１に含まれる各命令の性能値とを対応付ける対応情報２３００を生成する。性能値は、例えば、処理時間、クロック数、消費電力量などが挙げられる。対応情報２３００の具体例は、図１１に示す。
【００３３】
また、シミュレーション装置１００は、対象ブロックが変化した場合、対象ブロックのプログラムｐ１を入力として、Ｘ８６アーキテクチャのホストＣＰＵ２０１が実行する実行コードｅｃを生成する（Ａ３）。実行コードｅｃとは、内部状態１６００と性能値とを対応付けた対応情報２３００によって、対象ブロックがターゲットＣＰＵ１２００に実行された場合の性能値を、ホストＣＰＵ２０１が計算可能なコードである。
【００３４】
具体的に、実行コードｅｃは、例えば、機能コードｃ１と、タイミングコードｃ２と、を含む。機能コードｃ１は、対象ブロックｇ１をコンパイルすることによって得られるホストＣＰＵ２０１が実行可能なコードである。ここで、対象ブロックｇ１の機能コードｃ１は、命令「ｘ８６＿ｉｎｓｎ＿Ａ１」、「ｘ８６＿ｉｎｓｎ＿Ａ２」、「ｘ８６＿ｉｎｓｎ＿Ｂ１」、「ｘ８６＿ｉｎｓｎ＿Ｂ２１」、「ｘ８６＿ｉｎｓｎ＿Ｂ３」、「ｘ８６＿ｉｎｓｎ＿Ｃ１」、「ｘ８６＿ｉｎｓｎ＿Ｃ２」を有する。
【００３５】
また、タイミングコードｃ２は、機能コードｃ１の性能値を見積もるコードである。例えば、性能値がサイクル数である場合、タイミングコードｃ２は、例えば、以下のように内部状態１６００を引数として性能値を得て、サイクル数ｃｙｃｌｅを加算していくようなコードである。
ｃｙｃｌｅ＝ｃｙｃｌｅ＋性能値［内部状態］
実行コードｅｃの具体例は、図１０に示す。なお、実行コードｅｃと対応情報２３００をあわせて、ブロック情報３１００と称する。
【００３６】
つぎに、性能シミュレーション実行処理１４０２ｘを説明する。性能シミュレーション実行処理１４０２ｘでは、シミュレーション装置１００は、Ｘ８６アーキテクチャにしたがって変換された実行コードｅｃを実行する（Ａ４）。具体的に、シミュレーション装置１００は、実行コードｅｃを、対象ブロックｇ１について生成した対応情報２３００と検出した内部状態１６００とを用いて実行することにより、対象ブロックｇ１がターゲットＣＰＵに実行された場合の性能値を計算する。また、シミュレーション装置１００は、対象ブロックｇ１が有する外部依存命令の実行結果に応じて、性能値を補正する（Ａ５）。
【００３７】
また、図２で前述したとおり、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００によると、プログラムが示す実行順序と、ターゲットＣＰＵ１２００が実行する実行順序と、が異なる。また、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００では、命令の追い越しが発生する。
【００３８】
したがって、本実施の形態にかかるシミュレーション装置１００では、対象ブロックが変化した際にターゲットＣＰＵ１２００の内部状態１６００を検出し、検出した内部状態１６００における対象ブロックの各命令の性能値を静的に算出しておく。そして、シミュレーション装置１００は、対応情報２３００に基づいて実行コードｅｃを実行し、内部状態１６００に応じた性能値を算出する。これにより、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００が対象ブロックを実行した場合の性能値の見積もりの精度を向上させることができる。
【００３９】
図４は、ターゲットＣＰＵがアウト・オブ・オーダー実行の場合にシミュレーション装置１００が生成するブロック情報３１００を説明する図である。図３で説明したとおり、ターゲットＣＰＵがアウト・オブ・オーダー実行の場合、シミュレーション装置１００は、実行コードｅｃと対応情報２３００とを含むブロック情報３１００を生成する。また、ブロック情報３１００は、図１で前述したとおり、例えば、ＲＡＭ２０３のブロック情報格納領域２１３に記憶される。
【００４０】
図４の例では、ブロック情報３１００、実行コードｅｃ、機能コードｃ１、タイミングコードｃ２、対応情報２３００のそれぞれに付された「−番号」はいずれのブロックの対応情報であるかを示す。また、各対応情報２３００に付された「−アルファベット」は内部状態１６００を識別するための情報である。
【００４１】
また、図４は、シミュレーション装置１００が第１ブロック３１００−１のつぎに第２ブロック３１００−２の性能をシミュレートする場合を例示する。図３で説明したとおり、シミュレーション装置１００は、第１ブロック３１００−１及び第２ブロック３１００−２の、実行コードｅｃと対応情報２３００とを生成する。また、図３で説明したとおり、実行コードｅｃは、機能コードｃ１とタイミングコードｃ２とを有する。
【００４２】
本実施の形態で生成される実行コードｅｃは、具体的な性能値が記述されたコードでなく、性能値を取得可能なコードである。これにより、同一のブロックについて複数回実行コードｅｃを生成しなくてよい。したがって、シミュレーション装置１００は、以前に対象ブロックとなっていないと判断された場合、対象ブロックの実行コードｅｃを生成する。一方、シミュレーション装置１００は、以前に対象ブロックとなっていると判断した場合、対象ブロックの実行コードｅｃを生成しない。これにより、同一のブロックについて複数回実行コードｅｃが生成されないため、性能値の見積もりにおいて、省メモリ化を図ることができる。
【００４３】
また、第１ブロック３１００−１、第２ブロック３１００−２は、検出した内部状態１６００ごとに対応情報２３００−１−Ａ〜２３００−１−Ｃ、２３００−２−ｘ〜２３００−２−ｚを有する。シミュレーション装置１００は、検出された内部状態１６００が、以前に対象ブロックとなった時に検出された内部状態１６００と同一であれば、あらたに検出された内部状態１６００を対応付ける対応情報２３００を生成しない。これにより、対象ブロックについて同一の内部状態１６００を対応付ける対応情報２３００が、複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
【００４４】
また、シミュレーション装置１００は、第１ブロック３１００−１の内部状態１６００と性能値２２００とを対応付ける対応情報２３００に、つぎに実行する第２ブロック３１００−２について以前実行された時に生成した対応情報２３００を関連付ける。具体的には、各対応情報２３００は、内部状態１６００と性能値２２００とに加え、つぎのブロックのポインタ３３００と、つぎの対応情報のポインタ３４００とを有する。
【００４５】
つぎのブロックのポインタ３３００は、つぎのブロックの実行コードｅｃが記憶された記憶領域（ブロック情報格納領域２１３）を示すアドレスである。つぎの対応情報のポインタ３４００は、つぎのブロックの対応情報２３００が記憶された記憶領域（ブロック情報格納領域２１３）を示すアドレスである。
【００４６】
図４の例では、対応情報２３００−１−Ａ内のつぎのブロックのポインタ３３００として、第２ブロック３１００−２の実行コードｅｃ−２のポインタが設定される。さらに、対応情報２３００−１−Ａ内のつぎの対応情報のポインタ３４００として、第２ブロック３１００−２の対応情報２３００−２−ｘが設定される。
【００４７】
シミュレーション装置１００は、第１ブロック３１００−１の対応情報２３００が関連付ける第２ブロック３１００−２の対応情報２３００が示す内部状態１６００を取得する。そして、シミュレーション装置１００は、第１ブロック３１００−１の対応情報２３００に基づいて取得した内部状態１６００と、第２ブロック３１００−２が対象ブロックとなったときに検出した内部状態１６００と、一致するか否かを判断する。一致する場合、シミュレーション装置１００は、第１ブロック３１００−１の対応情報２３００が関連付ける第２ブロック３１００−２の対応情報２３００を用いて第２ブロックについての実行コードｅｃを実行する。
【００４８】
これにより、使用される可能性が高い対応情報２３００を関連付けておくことにより、検出された内部状態１６００を対応付ける既存の対応情報２３００の検索に要する処理を高速化することができる。
【００４９】
次に、図１のシミュレーション装置１００のソフトウェアモジュールを説明する。
【００５０】
［ソフトウェアモジュール構成図］
図５は、本実施の形態例におけるシミュレーション装置１００のソフトウェアモジュール構成を説明する図である。シミュレーション装置１００は、コード変換モジュール１４０１と、性能シミュレーション実行モジュール１４０２と、シミュレーション情報収集モジュール１４０３と、を有する。
【００５１】
シミュレーション装置１００は、ターゲットプログラムｐｇｒと、タイミング情報１４００と、予測情報４と、を得て、シミュレーション情報１４３０を出力する。ターゲットプログラムｐｇｒと、タイミング情報１４００と、予測情報４とは、たとえば、ＲＡＭ２０３や、ディスク２０５などの記憶装置に記憶される。または、これらの情報は、入力装置２０７を介して入力されてもよいし、ネットワークＮＥＴを介して他の装置から取得されてもよい。
【００５２】
以下、コード変換モジュール１４０１をコード変換部１４０１と称する。性能シミュレーション実行モジュール１４０２を、性能シミュレーション実行部１４０２と称する。シミュレーション情報収集モジュール１４０３を、シミュレーション情報収集部１４０３と称する。
【００５３】
コード変換部１４０１からシミュレーション情報収集部１４０３への処理は、例えば、図１で前述した、シミュレーションプログラム２１０にコーディングされる。そして、ホストＣＰＵ２０１が記憶装置に記憶されたシミュレーションプログラム２１０を読み出して、シミュレーションプログラム２１０にコーディングされている処理を実行する。これにより、コード変換部１４０１からシミュレーション情報収集部１４０３の処理が実現される。また、各部の処理結果は、例えば、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶される。
【００５４】
まず、コード変換部１４０１、性能シミュレーション実行部１４０２、及び、シミュレーション情報収集部１４０３の概要を説明する。
【００５５】
コード変換部１４０１は、図３のコード変換処理１４０１ｘを行う。コード変換部１４０１は、図３、図４で説明したとおり、内部状態１６００と性能値とが対応付けられた対応情報２３００と、対応情報２３００によって対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値２２００を算出可能な実行コードｅｃと、を生成する。
【００５６】
また、性能シミュレーション実行部１４０２は、図３の性能シミュレーション実行処理１４０２ｘを行う。性能シミュレーション実行部１４０２は、実行コードｅｃを実行することによって、対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出する。
【００５７】
シミュレーション情報収集部１４０３は、性能シミュレーション実行部１４０２による実行結果として、各命令の実行時間を含むログ情報であるシミュレーション情報１４３０を収集する。シミュレーション情報１４３０については、ディスク２０５などの記憶装置に記憶させてもよいし、ディスプレイなどの出力装置２０８（図１）によって出力してもよいし、ネットワークＮＥＴを介して他の装置に出力してもよい。
【００５８】
［入力データの説明］
ここで、シミュレーション装置１００の入力となる、ターゲットプログラムｐｇｒ、タイミング情報１４００、及び、予測情報４の一例を説明する。初めに、ターゲットプログラムｐｇｒのブロックが有する命令の一例を説明する。
【００５９】
図６は、ブロックが有する命令の一例を示す図である。図４に示すように、あるブロックは、ターゲットコードの３つの命令；（１）“ＬＤ  ｒ１、ｒ２”（ロード）；（２）“ＭＵＬＴ  ｒ３、ｒ４、  ｒ５（乗算）”；（３）“ＡＤＤ  ｒ２、ｒ５、  ｒ６（加算）”を有する。ブロックの命令は、（１）〜（３）の順でターゲットＣＰＵのパイプラインに投入されて実行されるとする。各命令のｒ１〜ｒ６は、レジスタ（アドレス）を表す。
【００６０】
タイミング情報１４００は、ターゲットコードの各命令について、命令実行時の各処理要素（段階）と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間（ペナルティサイクル数）とを示す情報である。外部依存命令は、ターゲットＣＰＵ１２００がアクセス可能な外部のハードウェア資源が関係する処理を行う命令である。具体的には、外部依存命令は、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットＣＰＵ１２００の外部のハードウェア資源に依存するような処理、例えば、命令キャッシュ、データキャッシュ、ＴＬＢ検索などである。また、外部依存命令は、分岐予測、コール／リターンのスタックなどの処理を行う命令である。
【００６１】
図７は、図６のブロックが含む各命令のタイミング情報１４００の例を示す図である。図７に示すタイミング情報１４００は、ＬＤ命令について、ソースレジスタｒｓ１（ｒ１）は１番目の処理要素（ｅ１）で、宛先レジスタｒｄ（ｒ２）は２番目の処理要素（ｅ２）で使用可能であることを表す。また、ＭＵＬＴ命令では、第１ソースレジスタｒｓ１（ｒ３）は１番目の処理要素（ｅ１）、第２ソースレジスタｒｓ２（ｒ４）は２番目の処理要素（ｅ２）、宛先レジスタｒｄ（ｒ５）は３番目の処理要素（ｅ３）で、それぞれ使用可能であることを示す。また、ＡＤＤ命令では、第１ソースレジスタｒｓ１（ｒ２）、第２ソースレジスタｒｓ２（ｒ５）は１番目の処理要素（ｅ１）、宛先レジスタｒｄ（ｒ６）は２番目の処理要素（ｅ２）で使用可能であることを示す。
【００６２】
図８は、図６に示すブロックの各命令の実行タイミング例を示す図である。図７に示すタイミング情報１４００から、パイプラインに各命令が投入されるタイミングは、ＬＤ命令の実行開始をタイミングｔとすると、ＭＵＬＴ命令はタイミングｔ＋１、ＡＤＤ命令はタイミングｔ＋２となる。ＡＤＤ命令の第１ソースレジスタ（ｒ２）と第２ソースレジスタ（ｒ５）は、ＬＤ命令とＭＵＬＴ命令で使用されているため、ＡＤＤ命令の開始は、ＬＤ命令とＭＵＬＴ命令の実行完了のタイミングｔ＋４以降となり、２サイクル分の待機時間（２サイクル分のストール）が生じる。
【００６３】
したがって、図８（Ａ）に示すように、図６に示すブロックをシミュレーションした場合に、ＬＤ命令の実行結果がキャッシュヒットであるケースでは、ブロックの実行時間が６サイクルであることがわかる。図８（Ｂ）は、図５に示すブロックのＬＤ命令の実行結果がキャッシュミスである場合のタイミング例を表す。ＬＤ命令の結果がキャッシュミスであると、タイミング情報１４００に、ペナルティとして、再実行に十分と考えられる任意の時間（ここでは６サイクル分）が設定されているため、このペナルティサイクルが遅延時間として追加される。したがって、２番目の処理要素（ｅ２）の実行は、タイミングｔ＋７に遅延する。ＬＤ命令のつぎに実行されるＭＵＬＴ命令は、遅延の影響を受けずにそのまま実行されるが、ＡＤＤ命令は、ＬＤ命令の実行完了のタイミングｔ＋８以降となり、４サイクル分の待機時間（４サイクル分のストール）が生じる。
【００６４】
したがって、図８（Ｂ）に示すように、図６に示すブロックの命令実行をシミュレーションした場合に、ＬＤ命令の実行結果がキャッシュミスであるケースでは、実行時間が１０サイクルとなることがわかる。予測情報４は、ターゲットコードの外部依存命令の処理において、生じる確率が高い実行結果（予測結果）を定めた情報である。予測情報４には、例えば、
「命令キャッシュ：予測＝ヒット、
データキャッシュ：予測＝ヒット、
ＴＬＢ検索：予測＝ヒット、
分岐予測：予測＝ヒット、
コール／リターン：予測＝ヒット、…」
が定められる。
【００６５】
［シミュレーション装置１００のコード変換処理］
図５に戻り、コード変換部１４０１が有する各モジュールの処理を、順次、説明する。コード変換部１４０１は、ブロック分割モジュール１４１１と、検出モジュール１４１２と、判断モジュール１４１３と、対応情報生成モジュール１４１４と、実行コード生成モジュール１４１５と、関連付けモジュール２４０１と、を有する。
【００６６】
以下、ブロック分割モジュール１４１１をブロック分割部１４１１と称する。以下、検出モジュール１４１２を検出部１４１２と称する。以下、判断モジュール１４１３を判断部１４１３と称する。以下、対応情報生成モジュール１４１４を対応情報生成部１４１４と称する。以下、実行コード生成モジュール１４１５を実行コード生成部１４１５と称する。以下、関連付けモジュール２４０１を関連付け部２４０１と称する。
【００６７】
図５のブロック分割部１４１１は、シミュレーション装置１００に入力された、図３に示したターゲットプログラムｐｇｒのコードを所定基準によってブロック（図３のｇ１〜ｇ４）に分割する。分割タイミングは、例えば、あらたに対象ブロックが変化した場合である。ブロックを分割する単位は、図３で前述したとおりである。
【００６８】
図９は、ターゲットプログラムが有するブロックの例を示す説明図である。図９に示す例は、１×２×３×４×５×６×７×８×９×１０の計算結果を求めるターゲットプログラムｐｇｒであり、１，２行目が初期化のブロックｂ１、３〜６行目がループ本体のブロックｂ２である。具体的に、１、２行目は、レジスタｒ０を値「１」、レジスタｒ１を値「２」で初期化する処理を示す。３行目は、レジスタｒ１、ｒ２の値の乗算値を、レジスタｒ０に代入する処理を示す。また、４行目は、レジスタｒ１をインクリメントする処理を示す。そして、５行目、６行目では、レジスタｒ１の値が「１０」以内の場合に、３行目に戻る処理を示す。
【００６９】
図５の検出部１４１２は、ターゲットプログラムｐｇｒのコードを分割して得られるブロックのうち動作シミュレーションｓｉｍの対象ブロックが変化した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態１６００（図３）を検出する。内部状態１６００は、図２に示した、ターゲットＣＰＵ１２００の命令キュー１２０９と、実行ユニット１２０６と、リオーダ・バッファ１２０７と、の内容が検出された検出結果である。
【００７０】
具体的には、例えば、検出部１４１２は、動作シミュレーションｓｉｍにおけるＰＣ１２０１の値がつぎのブロックに含まれる命令のアドレスを示した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態１６００を検出する。ここでは、例えば、ブロックからブロックへ変化したとする。
【００７１】
図５の判断部１４１３は、対象ブロックが変化した場合、対象ブロックが以前に対象ブロックとなったか否かを判断する。具体的には、例えば、判断部１４１３は、対象ブロックについての実行コードｅｃがディスク２０５などの記憶装置に記憶されているか否かを判断する。以前に対象ブロックとなっていれば、すでに対象ブロックについてコンパイル済みであるため、ディスク２０５などの記憶装置に対象ブロックについての実行コードｅｃが記憶されている。一方、以前に対象ブロックとなっていなければ、すでに対象ブロックについてコンパイルがされていないため、ディスク２０５などの記憶装置に対象ブロックについての実行コードｅｃが記憶されていない。
【００７２】
図５の実行コード生成部１４１５は、判断部１４１３によって以前に対象ブロックとなっていないと判断された場合、実行コードｅｃを生成する。生成された実行コードｅｃは、図１のブロック情報格納領域２１３に記憶される。一方、実行コード生成部１４１５は、判断部１４１３によって以前に対象ブロックとなっていると判断された場合、実行コードｅｃを生成しない。これにより、各ブロックについての実行コードｅｃが複数回生成されないため、対象ブロックについての実行コードｅｃが内部状態１６００ごとに生成される場合と比較して、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。
【００７３】
例えば、実行コードｅｃのタイミングコードには、内部状態１６００に対応付けられた対応情報２３００から性能値を取得するコードと、取得した性能値により対象ブロックがターゲットＣＰＵ１２００に実行された場合の性能値を計算するコードと、を含む。
【００７４】
図１０は、実行コードの例を示す図表である。実行コードｅｃは、ｘ８６命令の例を示す。実行コードｅｃは、ターゲットプログラムｐｇｒ（図９）がコンパイルされて得られる機能コードと、タイミングコードと、を有する。機能コードは、実行コードｅｃの１〜３、８行目である。タイミングコードは、実行コードｅｃの４〜７行目である。実行コードｅｃ中のｓｔａｔｅは、ターゲットＣＰＵ１２００の内部状態１６００のインデックス（内部状態Ａ＝０，Ｂ＝１，…）であり、ｐｅｒｆ１は、命令１に対する性能値が格納されたアドレスを示す。これにより、実行コードｅｃが実行されると、検出された内部状態１６００を引数として、対応情報２３００から各命令の性能値が実行順に取得される。
【００７５】
図５の対応情報生成部１４１４は、図３、図４で前述したとおり、検出部１４１２によって検出された内部状態１６００と、検出された内部状態１６００における対象ブロックに含まれる各命令の性能値２２００と、が対応付けられた対応情報２３００を生成する。また、対応情報生成部１４１４は、予測シミュレーション実行モジュール（予測シミュレーション実行部と称する）１４２０を有する。
【００７６】
具体的に、対応情報生成部１４１４は、対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を検出する。状況依存命令は、上述した外部依存命令と同一であり、状況依存命令は、以降外部依存命令と称する。
【００７７】
そして、予測シミュレーション実行部１４２０は、検出した外部依存命令を複数通りの処理のうちの第１処理となった場合について、検出された内部状態１６００と、対象ブロックの各命令の基準となる性能値２２００と、によって静的タイミング解析を行う。これにより、対応情報生成部１４１４は、外部依存命令を複数通りの処理のうちの第１処理となった場合の対象ブロックに含まれる各命令の性能値を算出する。外部依存命令の第１処理については、入力された予測情報４に定められた処理である。例えば、第１処理は、予め複数通りの処理のうちその処理となりうる確率が最も高いと推定される処理である。ここでは、第１処理を予測ケースと称する。予測ケースについては、予め予測情報４に登録されていることとする。
【００７８】
基準となる性能値は、入力されたタイミング情報１４００（図７）に含まれる。タイミング情報１４００には、ターゲットプログラムｐｇｒに含まれる各命令の基準となる性能値が含まれ、タイミング情報１４００と同様に補正部１４１７によって使用されるペナルティの性能値も含む。対応情報生成部１４１４は、内部状態１６００によれば、ブロック間の命令の依存関係、すなわち、命令の実行順などを判断可能である。
【００７９】
図１６に示す内部状態１６００の例では、対応情報生成部１４１４は、対象ブロックの前の命令が実行ユニット１２０６を利用している状態であることと判断できる。そのため、対応情報生成部１４１４は、対象ブロックに含まれる各命令の基準となる性能値２２００に対して内部状態１６００による命令の実行順によって性能値を加算または減算することにより、対象ブロックに含まれる各命令の性能値を算出する。
【００８０】
そして、対応情報生成部１４１４は、検出された内部状態１６００と、検出された内部状態１６００における算出した対象ブロックに含まれる各命令の性能値２２００と、を対応付けた対応情報２３００を生成する。ここで、生成された対応情報２３００は、対象ブロックについての性能値表に新たに追加され、図１のブロック情報格納領域２１３に記憶される。
【００８１】
図５の関連付け部２４０１は、対象ブロックが第１ブロックから第２ブロックに変化した場合、第１ブロックの対応情報２３００に、第２ブロックの対応情報２３００を関連付ける。具体的に、関連付け部２４０１は、第１ブロックの対応情報２３００に、第２ブロックのポインタ３３００と、対応情報生成部１４１４によって生成された第２ブロックの対応情報２３００のポインタ３４００と、を関連付ける。
【００８２】
図１１は、性能値表例を示す説明図である。性能値表２５００は、内部状態１６００、命令、性能値２２００、つぎのブロックのポインタ３３００、つぎの対応情報のポインタ３４００のフィールドを有する。各フィールドに情報が設定されることにより、対応情報２３００がレコードとして記憶される。性能値表２５００は、各フィールドに情報が設定されることにより、対応情報２３００（２３００−Ａ，２３００−Ｂなど）として生成される。
【００８３】
内部状態Ａについての対応情報２３００−Ａにおいて、内部状態Ａにおける命令１の性能値は２クロックである。また、内部状態Ｂについての対応情報２３００−Ｂにおいて、内部状態Ｂにおける命令１の性能値２２００は４クロックである。図１１では、省略して命令１だけの性能値２２００を示しているが、実際には対応情報２３００には機能コードに含まれる各命令についての性能値２２００が含まれる。
【００８４】
また、図１１の性能値表２５００における、つぎのブロックのポインタ３３００のフィールドには、以前に対象ブロックとなったときにつぎに対象ブロックとなったブロックのポインタが設定される。つぎの対応情報のポインタ３４００のフィールドには、つぎに対象ブロックとなったときに使用された対応情報２３００のポインタが設定される。
【００８５】
図１１の対応情報２３００−Ａでは、つぎのブロックのポインタ３３００のフィールドに「０ｘ８０００５０００」が設定され、つぎの対応情報のポインタ３４００のフィールドに「０ｘ８０００６０００」が設定される。対応情報２３００−Ｂでは、つぎのブロックのポインタ３３００のフィールドに「０ｘ８０００１０００」が設定され、つぎの対応情報のポインタ３４００のフィールドに「０ｘ８０００１５００」が設定される。
【００８６】
なお、例えば、つぎの対応情報のポインタ３４００のフィールドには、例えば、つぎの対応情報２３００へのオフセットが設定されてもよい。例えば、オフセットは、つぎのブロックのポインタとつぎの対応情報２３００のポインタとの差である。例えば、対応情報２３００−Ａであれば、つぎのブロックのポインタ３３００のフィールドに「０ｘ８０００５０００」が設定され、つぎの対応情報のポインタ３４００のフィールドに「０ｘ１０００」が設定される。これにより、つぎの対応情報２３００のポインタが「０ｘ８０００６０００」であると判断される。
【００８７】
例えば、対応情報２３００−Ｂであれば、つぎのブロックのポインタ３３００のフィールドに「０ｘ８０００１０００」が設定され、つぎの対応情報のポインタ３４００のフィールドに「０ｘ５００」が設定される。これにより、つぎの対応情報のポインタ３４００が「０ｘ８０００１５００」であると判断される。このように、つぎの対応情報２３００へのオフセットが設定されることにより、対応情報２３００の情報量を削減することができ、省メモリ化を図ることが可能になる。
【００８８】
判断部１４１３は、例えば、対象ブロックが第３ブロックから第４ブロックに変化した場合、第３ブロックの対応情報２３００のつぎのブロックのポインタ３３００が、第４ブロックのポインタと一致するか否かを判断する。一致する場合、判断部１４１３は、第３ブロックの対応情報２３００が有するつぎの対応情報のポインタ３４００が示す、対応情報２３００が対応付ける内部状態１６００を取得する。そして、判断部１４１３は、第３ブロックの対応情報２３００に基づいて取得した内部状態１６００と、検出部１４１２によって第４ブロックについて検出された内部状態１６００と、が一致するか否かを判断する。一致していると判断された場合、性能シミュレーション実行部１４０２は、第４ブロックの実行コードｅｃを、第３ブロックの対応情報２３００が関連付ける対応情報２３００を用いて実行する。
【００８９】
このように、使用される可能性が高い対応情報２３００を関連付けておくことにより、性能値表２５００から検出された内部状態１６００を対応付けた対応情報２３００の検索に要する処理を高速化することができる。
【００９０】
［性能シミュレーション実行処理の説明］
図５に戻り、性能シミュレーション実行部１４０２の処理を、順次、説明する。性能シミュレーション実行部１４０２は、コード実行モジュール１４１６と、補正モジュール１４１７と、カウンターテーブル管理モジュール１４１８を有する。以下、コード実行モジュール１４１６をコード実行部１４１６と称する。以下、補正モジュール１４１７を補正部１４１７と称する。以下、カウンターテーブル管理モジュール１４１８をカウンターテーブル管理部１４１８と称する。
【００９１】
コード実行部１４１６は、対応情報生成部１４１４によって生成された対応情報２３００を用いて実行コードｅｃを実行する。また、コード実行部１４１６は、以前に対象ブロックとなっており、かつ、以前に対象ブロックとなった時に検出された内部状態１６００が、検出した内部状態１６００と同一であると判断された場合は、同一の内部状態１６００を対応付ける対応情報２３００を取得する。そして、コード実行部１４１６は、取得した対応情報２３００を用いて実行コードｅｃを実行する。
【００９２】
補正部１４１７は、実行コードｅｃをコード実行部１４１６によって実行された実行結果において、外部依存命令が複数通りの処理のうち予測ケースと異なる第２処理の場合に、第２処理に対応する所定性能値によって外部依存命令の性能値を補正する。これにより、補正部１４１７は、対象ブロックがターゲットＣＰＵ１２００に実行された場合の性能値を計算する。補正部１４１７による詳細な補正方法については、例えば、特開２０１３−８４１７８号公報に開示される。
【００９３】
カウンターテーブル管理部１４１８は、シミュレーションの実行中に、分岐命令の分岐を予測するカウンターテーブルを生成するとともに、カウンターテーブルにしたがって、分岐命令の分岐予測を行う。
【００９４】
カウンターテーブル管理部１４１８は、ターゲットＣＰＵ１２００のモデルであって、分岐予測関数ライブラリ２１２（図１）が示す、分岐予測機能モデルに対応する。分岐予測機能モデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。カウンターテーブル管理部１４１８は、分岐命令がコード実行部１４１６にしたがって実行される度に、カウンターテーブルを更新する。カウンターテーブル、及び、カウンターテーブル管理部１４１８の処理の詳細については、後述する。
【００９５】
図１〜図１１で説明してきたように、本実施の形態例におけるシミュレーション装置１００は、動作シミュレーションの対象ブロックが変化した場合のターゲットＣＰＵの内部状態１６００を検出する。そして、シミュレーション装置１００は、対象ブロックの、実行コードｅｃ（図１０）と、検出した内部状態１６００ごとの対応情報２３００（図１１）とを、順次生成し、ブロック情報格納領域２１３（図１）に格納する。そして、シミュレーション装置１００は、検出した内部状態１６００に応じた対応情報２３００を用いて実行コードｅｃを実行し、対象ブロックの性能値を計算する。
【００９６】
図４に示すように、シミュレーション装置１００は、対象ブロックの実行コードｅｃに加えて、検出した内部状態１６００ごとに対応情報２３００を生成し、ブロック情報格納領域２１３に記憶する。また、シミュレーション装置１００は、対応情報２３００に、さらに、次のブロックを指すポインタ３３００と、次のブロックの第１候補の対応情報２３００を指すポインタ３４００とを記憶する。これにより、対応情報２３００の検索処理が速くなる。
【００９７】
一方、シミュレーション処理の精度を高めることにより、対応情報２３００のデータ量が増加する。即ち、ブロック情報３１００（実行コードｅｃや対応情報２３００）のデータ量が増加する。したがって、シミュレーション装置１００が、性能シミュレーション処理を、順次、実行するに連れて、ブロック情報格納領域２１３の空き容量が急速に減少する。これにより、シミュレーション装置１００が、新たな実行コードｅｃや対応情報２３００を、ブロック情報格納領域２１３に記憶できない場合が発生する。
【００９８】
そこで、ブロック情報格納領域２１３の空き領域を増加させるために、ブロック情報格納領域２１３に記憶された、実行コードｅｃや対応情報２３００を削除する方法がある。ただし、実行頻度の高いブロックの実行コードｅｃを削除した場合、再び、そのブロックが対象ブロックとなったときに、再コンパイルが必要となってしまう。再コンパイルが発生することにより、シミュレーションのスピードが低下してしまう。また、実行頻度の高いブロックの対応情報２３００を削除した場合、対象ブロックの対応情報２３００の再生成も必要となる。対応情報２３００の再生成が発生することにより、さらに、シミュレーションのスピードが低下してしまう。
【００９９】
ブロック情報格納領域２１３に記憶された、図３に示す多量のブロックのブロック情報３１００から、削除対象とするブロック情報３１００を検出することは容易ではない。また、多量のブロックのブロック情報３１００から、削除対象とするブロック情報３３０を検出する処理には、時間を要する。
【０１００】
したがって、本実施の形態例におけるシミュレーション装置１００は、さらに、ブロック情報格納領域２１３の空き容量に応じて、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックのブロック情報３１００を削除する。具体的に、シミュレーション装置１００は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する。
【０１０１】
次に、図１〜図１１で説明してきた、シミュレーション装置１００の処理を、図１２〜図１４のフローチャート図にしたがって説明する。その後に、図１５〜図１９にしたがって、ブロック情報３１００を削除するブロックの選択処理を説明する。
【０１０２】
［シミュレーション装置１００のフローチャート図］
図１２〜図１４は、本実施の形態例におけるシミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。図１２のフローチャート図おいて、まず、検出部１４１２は、ターゲットＣＰＵ１２００のＰＣ１２０１がつぎのブロック（対象ブロック）を示すアドレスをポイントしたか否かを判断する（ステップＳ２６０１）。検出部１４１２は、ステップＳ２６０１によって対象ブロックが変化したか否かを判断する。
【０１０３】
つぎのブロック（対象ブロック）を示すアドレスをポイントしていない場合（ステップＳ２６０１：Ｎｏ）、検出部１４１２は、ステップＳ２６０１へ戻る。一方、つぎのブロック（対象ブロック）を示すアドレスをポイントした場合（ステップＳ２６０１：Ｙｅｓ）、検出部１４１２は、ターゲットＣＰＵ１２００の内部状態１６００を検出する（ステップＳ２６０２）。つぎに、判断部１４１３は、対象ブロックがコンパイル済みか否かを判断する（ステップＳ２６０３）。
【０１０４】
コンパイル済みでないと判断された場合（ステップＳ２６０３：Ｎｏ）、図１４のフローチャート図に移り、判断部１４１３は、シミュレーション装置１００のメモリ（ＲＡＭ２０３のブロック情報格納領域２１３）の空き容量が基準値より小さいか否かを判定する（ステップＳ２９０１）。空き容量が基準値より小さい場合（ステップＳ２９０１：Ｙｅｓ）、ブロック情報格納領域２１３の容量が不足し、新たな実行コードｅｃや対応情報２３００を記憶できない可能性がある。
【０１０５】
したがって、判断部１４１３は、分岐予測機能にしたがって、分岐に応じて実行される可能性の一番低いブロックを検出し選択する（ステップＳ２９０２）。つまり、判断部１４１３は、以前に処理されたブロックであって、以降に実行される可能性の低いブロックを検出する。ステップＳ２９０２の処理の詳細は図１５〜図１８のフローチャート図にしたがって後述する。そして、判断部１４１３は、選択したブロックの実行コードｅｃと対応情報２３００とを、ブロック情報格納領域２１３から削除する（ステップＳ２９０３）。
【０１０６】
なお、基準値は、例えば、１つのブロックのブロック情報３１００のサイズに対応する。ただし、この例に限定されるものではなく、基準値は、いずれの値に設定されてもよい。また、この例では、新たに、対象ブロックの実行コードｅｃを生成する場合に、ブロック情報格納領域２１３の空き容量を判定しているが、この例に限定されるものではない。シミュレーション装置１００は、定期的に、ブロック情報格納領域２１３の空き容量を判定してもよい。
【０１０７】
一方、メモリの空き容量が基準値以上の場合（ステップＳ２９０１：Ｎｏ）、ブロック分割部１４１１は、ターゲットプログラムｐｇｒを分割して、対象ブロックを取得する（ステップＳ２８０１）。対応情報生成部１４１４は、対象ブロックが含む外部依存命令を検出し（ステップＳ２８０２）、予測情報４から検出した外部依存命令の予測ケースを取得する（ステップＳ２８０３）。
【０１０８】
そして、実行コード生成部１４１５は、対象ブロックをコンパイルした機能コードｃ１と、予測ケースでの対象ブロックの性能値を対応情報２３００により計算するタイミングコードｃ２と、を含む実行コードｅｃを生成し出力する（ステップＳ２８０４）。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
【０１０９】
予測シミュレーション実行部１４２０は、予測ケースについて、検出した内部状態１６００と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う（ステップＳ２８０５）。対応情報生成部１４１４は、検出した内部状態１６００と、タイミング解析結果である対象ブロックが含む各命令の性能値と、を対応付けた対応情報２３００を生成し性能値表２５００（図１１）に記録する（ステップＳ２８０６）。同一の内部状態１６００における対応情報１０１の生成は１回である。したがって、対象ブロックについて同一の内部状態１６００が複数回検出されたとしても、対象ブロックの性能値の見積もり時の省メモリ化を図ることが可能になる。
【０１１０】
そして、関連付け部２４０１は、対象ブロックの直前のブロックの対応情報２３００に、対象ブロックのポインタと、生成した対応情報２３００のポインタと、を関連付け（ステップＳ２８０７）、図１２のフローチャート図のステップＳ２７０７へ移行する。対象ブロックの直前のブロックの対応情報２３００は、対象ブロックの直前のブロックの性能値の算出に用いた対応情報２３００を示す。
【０１１１】
図１２のフローチャート図に戻り、一方、対象ブロックがコンパイル済みであると判断された場合（ステップＳ２６０３：Ｙｅｓ）、判断部１４１３は、対象ブロックを示すアドレスと、直前のブロックの対応情報２３００のつぎのブロックのポインタ３３００と、を比較する（ステップＳ２６０４）。対象ブロックを示すアドレスとは、対象ブロックの実行コードｅｃが記憶された記憶領域（ブロック情報格納領域２１３）のアドレスである。
【０１１２】
つまり、判断部１４１３は、対象ブロックが第３ブロックから第４ブロックに変化した場合、対応情報２３００を参照し、以前にも第３ブロックから第４ブロックに変化したか否かを判断する。具体的に、判断部１４１３は、第３ブロックの対応情報２３００に含まれるつぎのブロックのポインタ３３００が、第４ブロックのポインタと一致するか否かを判断する。
【０１１３】
一致すると判断された場合（ステップＳ２６０５：Ｙｅｓ）、判断部１４１３は、直前のブロックの対応情報２３００が関連付けるポインタ３４００が示す、対応情報２３００を取得する。そして、判断部１４１３は、直前のブロックに基づいて取得した対応情報２３００が対応付ける内部状態１６００と、検出した内部状態１６００と、を比較する（ステップＳ２６０６）。一致していると判断した場合、判断部１４１３は、以前にも第３ブロックから第４ブロックに変化したと判断する。
【０１１４】
つまり、判断部１４１３は、第４ブロックが以前に対象ブロックになった場合に、第３ブロックの対応情報２３００が関連付ける対応情報２３００を取得する。そして、判断部１４１３は、第３ブロックに基づいて取得した、対応情報２３００が対応付ける内部状態１６００が、第４ブロックについて検出した内部状態１６００と一致するか否かを判断する。即ち、判断部１４１３は、第３ブロックの対応情報２３００の対応情報のポインタ３４００が示す対応情報２３００が対応付ける内部状態１６００と、検出部１４１２が第４ブロックについて検出した内部状態１６００と、が一致するか否かを判断する。
【０１１５】
一致すると判断された場合（ステップＳ２６０７：Ｙｅｓ）、判断部１４１３は、直前のブロックに関連付けられたポインタ３３００が示す対応情報２３００を取得し（ステップＳ２６０８）、図１３のフローチャート図のステップＳ２７０７へ移行する。つまり、性能シミュレーション実行部１４０２は、第４ブロックについての実行コードｅｃを、第３ブロックの対応情報２３００が関連付ける、第４のブロックの対応情報２３００を用いて実行する。処理の詳細については、図２０のフローチャート図にしたがって後述する。
【０１１６】
このように、本実施の形態例におけるシミュレーション装置１００は、使用される可能性が高い対応情報２３００を、直前のブロックの対応情報２３００に関連付けておく。これにより、図１１の性能値表２５００から、検出した内部状態１６００を対応付ける対応情報２３００を検索する処理を高速化することが可能になる。
【０１１７】
一方、ステップＳ２６０５において一致しないと判断された場合（ステップＳ２６０５：Ｎｏ）、またはステップＳ２６０７において一致しないと判断された場合（ステップＳ２６０７：Ｎｏ）のつぎに、判断部１４１３は、図１３のフローチャート図のステップＳ２７０１へ移行する。図１３のフローチャート図のステップＳ２７０１では、判断部１４１３は、対象ブロックの性能値表２５００に登録される対応情報２３００が対応付ける内部状態１６００のうち、未選択の内部状態１６００があるか否かを判断する（ステップＳ２７０１）。
【０１１８】
未選択の内部状態１６００がない場合（ステップＳ２７０１：Ｎｏ）、ステップＳ２８０５へ移行する。そして、検出した内部状態１６００に対応する対応情報２３００が生成される。このように、対象ブロックについて、検出した内部状態１６００ごとに対応情報２３００が生成される。また、対象ブロックの実行コードｅｃは１回だけ生成される。
【０１１９】
未選択の内部状態１６００がある場合（ステップＳ２７０１：Ｙｅｓ）、判断部１４１３は、未選択の内部状態１６００のうち、登録順に内部状態１６００を選択する（ステップＳ２７０２）。判断部１４１３は、検出した内部状態１６００と、選択した内部状態１６００と、を比較する（ステップＳ２７０３）。そして、判断部１４１３は、一致しているか否かを判断する（ステップＳ２７０４）。一致する場合（ステップＳ２７０４：Ｙｅｓ）、判断部１４１３は、選択した内部状態１６００を対応付ける対応情報２３００を性能値表２５００（図１１）から取得する（ステップＳ２７０５）。
【０１２０】
つまり、判断部１４１３は、検出した内部状態１６００が、以前に対象ブロックとなった時に検出された内部状態１６００と同一であるか否かを判断する。具体的に、判断部１４１３は、検出された内部状態１６００を検索キーとして、性能値表２５００から検索キーと一致する内部状態１６００を有する対応情報１０１を検索する。一致する内部状態１６００を有する対応情報１０１が検索された場合、判断部１４１３は、以前に対象ブロックとなった時に検出された内部状態１６００と同一であると判断する。この場合、対応情報生成部１４１４は、あらたに対応情報１０１を生成しない。
【０１２１】
次に、関連付け部２４０１は、対象ブロックの直前のブロックについての対応情報２３００に、対象ブロックのポインタ３３００と、取得した対応情報のポインタ３４００と、を関連付ける（ステップＳ２７０６）。そして、コード実行部１４１６は、取得した対応情報２３００を用いて実行コードｅｃの実行処理を行い（ステップＳ２７０７）、図１２のフローチャート図のステップＳ２６０１へ戻る。
【０１２２】
一方、検出した内部状態１６００と、選択した内部状態１６００と、が一致していないと判断された場合（ステップＳ２７０４：Ｎｏ）、シミュレーション装置１００は、ステップＳ２７０１へ戻る。つまり、判断部１４１３は、一致する内部状態１６００を有する対応情報１０１が検索されなかった場合、以前に対象ブロックとなった時に検出された内部状態１６００と同一でないと判断する。この場合、対応情報生成部１４１４は、あらたに検出された内部状態１６００によってあらたに対応情報１０１を生成する。
【０１２３】
［削除対象のブロックの検出処理（図１４のステップＳ２９０２）］
図１２〜図１４のフローチャート図で説明したとおり、ブロック情報格納領域２１３の空き容量が基準値より小さくなった場合に、判断部１４１３は、分岐に応じて実行される可能性の一番低いブロックを検出し選択する（ステップＳ２９０２）。そして、判断部１４１３は、選択したブロックのブロック情報３１００を、ブロック情報格納領域２１３から削除することにより、新たなブロックのブロック情報３１００を記憶可能にする。
【０１２４】
削除するブロック情報の検出方法には、ＬＲＵ（Least Recently Used：ＬＲＵ）アルゴリズムにしたがって、削除対象のブロック情報を検出する方法がある。この方法によると、ブロック情報格納領域２１３に記憶されたブロック情報のうち、長期間、実行されていないブロックのブロック情報が削除の対象となる。しかしながら、たとえ、長時間、実行されていない場合であっても、再実行の対象となる可能性がある。再実行の可能性があるブロックが削除された場合、実行コードｅｃの再コンパイル処理や対応情報２３００の生成処理が発生してしまう。
【０１２５】
本実施の形態例において、判断部１４１３は、カウンターテーブル管理部１４１８（図５）が生成するカウンターテーブル（図１５にて後述）を参照し、前のブロックからの分岐に応じて実行される度合いに基づいて、分岐に応じて実行される可能性の低いブロックを検出する。これにより、判断部１４１３は、実行される可能性の高いブロックのブロック情報３１００がメモリから削除されることを回避できる。したがって、再コンパイル処理や対応情報２３００の生成処理の発生の頻度を抑制することが可能になる。
【０１２６】
これにより、本実施の形態例における、シミュレーション装置１００は、再コンパイル処理や対応情報２３００の生成処理を最小限に抑えながら、対応情報２３００にしたがって、精度の高い性能シミュレーションを行うことができる。つまり、シミュレーション装置１００は、性能シミュレーションの精度を向上しながら、性能シミュレーションの実行速度を維持することができる。
【０１２７】
［カウンターテーブル］
ここで、図１５により、カウンターテーブルの例を説明する。
【０１２８】
図１５は、飽和カウンター（n-bit saturating counter）に基づいて生成する、カウンターテーブル２８００の一例を説明する図である。カウンターテーブル管理部１４１８は、飽和カウンター等の予測アルゴリズムにしたがって、カウンターテーブル２８００を生成する。飽和カウンターのアルゴリズムについては、図１６、図１７にしたがって後述する。ただし、この例に限定されるものではなく、カウンターテーブル管理部１４１８は、別のアルゴリズムにしたがって、カウンターテーブル２８００を生成してもよい。
【０１２９】
図１５のカウンターテーブル２８００は、分岐命令のアドレスと、分岐命令が分岐する可能性を示すカウンターの値とを有する。具体的に、カウンターの値は、基準値「２ｎ−１」より大きい場合に、分岐命令が分岐する可能性が高いことを示す。また、カウンターの値は、基準値「２ｎ−１」より小さい場合に、分岐命令が分岐しない可能性が高いことを示す。つまり、カウンターの値が基準値「２ｎ−１」をより上回るほど、分岐命令が分岐する可能性が高いことを示す。一方、カウンターの値が基準値「２ｎ−１」をより下回るほど、分岐命令が分岐しない可能性が高いことを示す。
【０１３０】
カウンターテーブル管理部１４１８は、シミュレーションの実行中に、実行コードｅｃに分岐命令を検知すると、カウンターテーブル２８００にしたがって、分岐命令の分岐予測を行う。そして、カウンターテーブル管理部１４１８は、分岐命令の予測結果と、コード実行部１４１６の実行コードｅｃの実行による分岐命令の分岐結果とを比較する。そして、カウンターテーブル管理部１４１８は、比較結果に応じて、カウンターテーブル２８００のカウンター値を更新する。
【０１３１】
［飽和カウンターのアルゴリズム］
次に、飽和カウンター（n-bit saturating counter）のアルゴリズムの概要を説明する。まず、ブロック間の分岐を説明する。
【０１３２】
図１６は、ブロック間の分岐の例を説明する図である。図１６に示すターゲットプログラムｐｇｒは、分岐命令ｂｉを有する。前述したとおり、ブロック分割部１４１１（図５）は、分岐命令ｂｉにしたがってターゲットプログラムｐｇｒを分割し、ブロックＣＢ１〜ＣＢ４を生成する。具体的に、ブロックＣＢは、分岐命令までのコード群（Some head code）を有する。ブロックＣＢ２は、分岐しない場合のコード群（if-block code）を有する。また、ブロックＣＢ３は、分岐する場合のコード群（else-block code）を有する。ブロックＣＢ４は、分岐処理が終了した後のコード群（Some bottom code）を有する。
【０１３３】
図１６の右側に示す各ブロックＣＢ１〜ＣＢ４は、ターゲットプログラムｐｇｒの各ブロックＣＢ１〜ＣＢ４がコンパイルして生成された、実行コードｅｃに対応する。この例において、分岐命令ｂｉが分岐しない場合（Not taken）、ブロックＣＢ１の次には、ブロックＣＢ２が実行対象となる。また、分岐命令ｂｉが分岐する場合（Taken）、ブロックＣＢ１の次には、ブロックＣＢ３が実行対象となる。また、ブロックＣＢ２、ブロックＣＢ３の次には、ブロックＣＢ４が実行対象となる。
【０１３４】
次に、図１６で説明した、ブロック間の分岐に基づいて、飽和カウンター（n-bit saturating counter）のアルゴリズムを図１７で説明する。
【０１３５】
図１７は、飽和カウンターのアルゴリズムを説明する図である。図１７の状態遷移図２９００は、飽和カウンターの５つの状態を例示する。５つの状態とは、状態「２ｎ−１分岐する：Taken」、状態「２ｎ−２ 分岐する（可能性小）：Strongly taken」、状態「２ｎ−１ 分岐する（可能性大）：Very strongly taken」、状態「１ 分岐しない（可能性小）：Strongly not taken」、状態「０ 分岐しない（可能性大）：Very strongly not taken」である。状態「２ｎ−１分岐する：Taken」は、初期状態を示す。なお、この例では、５つの状態を示すが、この例に限定されるものではない。状態数は、変数ｎの値にしたがって増減する。
【０１３６】
図１６で示した、ブロックＣＢ１の分岐命令ｂｉを例示して、状態遷移を説明する。初め、分岐命令ｂｉの状態は、状態「２ｎ−１：Taken」に設定される。分岐命令ｂｉが分岐する場合、カウンターテーブル管理部１４１８は、分岐命令ｂｉの状態を、状態「２ｎ−２：Strongly taken」に遷移させる。一方、分岐命令ｂｉが分岐しない場合、カウンターテーブル管理部１４１８は、分岐命令ｂｉの状態を、状態「１：Strongly not taken」に遷移させる。
【０１３７】
そして、分岐命令ｂｉが状態「２ｎ−２：Strongly taken」を示す場合において、再び、ブロックＢ１が実行され分岐命令ｂｉが分岐する場合、カウンターテーブル管理部１４１８は、分岐命令ｂｉの状態を、さらに、状態「２ｎ−１：Very strongly taken」に遷移させる。または、分岐命令ｂｉが状態「２ｎ−２：Strongly taken」を示す場合において、再び、ブロックＢ１が実行され分岐命令ｂｉが分岐しない場合、カウンターテーブル管理部１４１８は、分岐命令ｂｉの状態を、状態「２ｎ−１：Taken」に戻す。
【０１３８】
つまり、図１７に示すブロックＣＢ１が繰り返し実行され、分岐命令ｂｉが毎回、分岐する場合、分岐命令ｂｉのカウンター値は、初期値「２ｎ−１」から増加していく。一方、ブロックＣＢ１が繰り返し実行され、分岐命令ｂｉが毎回、分岐しない場合、分岐命令ｂｉのカウンター値は、初期値「２ｎ−１」から減少していく。
【０１３９】
このように、カウンターテーブル管理部１４１８は、分岐命令ｂｉそれぞれについて、分岐結果にしたがって状態を遷移させる。これにより、カウンターテーブル管理部１４１８は、状態遷移図２９００の各状態の値をカウンター値として有する、図１５のカウンターテーブル２８００を生成する。そして、判定部１４１３は、カウンターテーブル２８００にしたがって、実行される可能性の低いブロックを検出する。
【０１４０】
具体的に、判断部１４１３は、カウンターテーブル管理部１４１８が、ＬＲＵ（Least Recently Used：ＬＲＵ）アルゴリズムにしたがって、削除した分岐命令とカウンター値とを検出する。カウンターテーブル管理部１４１８は、ＬＲＵアルゴリズムにしたがって、長期間実行されていない分岐命令を削除する。そして、判断部１４１３は、検出した分岐命令が示す２つのブロックのうち、カウンター値に基づいて、実行される可能性の低いブロックを、削除対象リストに追加する。
【０１４１】
具体的に、判断部１４１３は、カウンター値が分岐する可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐しない方のブロックを検出する。一方、カウンター値が分岐しない可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐する方のブロックを検出する。
【０１４２】
例えば、判断部１４１３が、図１７に示す分岐命令ｂｉのカウンター値を検出した場合を例示する。このとき、カウンター値が分岐することを示す場合、判断部１４１３は、２つのブロックＣＢ２、ＣＢ３のうち、分岐しない方のブロックＣＢ２を検出する。また、カウンター値が分岐しないことを示す場合、判断部１４１３は、分岐する方のブロックＣＢ３を検出する。
【０１４３】
そして、判断部１４１３は、生成した削除対象リストのエントリのうち、最も古いエントリのブロックを、削除対象のブロックとして、順次、検出する。このように、判断部１４１３は、カウンターテーブル２８００に基づいて検出した、長期間実行されていない分岐命令が示す２つのブロックのうち、実行される可能性が低い方のブロックを検出する。これにより、判断部１４１３は、長期間実行されず、さらに、実行される可能性の低いブロックを適切に検出することができる。
【０１４４】
さらに、判断部１４１３は、削除対象リストのエントリがない場合、カウンターテーブル２８００の各分岐命令のカウンター値にしたがって、実行される可能性の低いブロックを検出する。なお、この例に限定されるものではなく、判断部１４１３は、削除対象リストのエントリに寄らず、分岐命令のカウンター値のみにしたがって、実行される可能性の低いブロックを検出してもよい。
【０１４５】
具体的に、判断部１４１３は、カウンターテーブル２８００から、初期値「２ｎ−１」との差分の絶対値が最も大きいカウンター値を検出する。検出したカウンター値の分岐命令は、分岐する可能性が最も高い、または、分岐しない可能性が最も高いことを示す。前述したとおり、判断部１４１３は、検出したカウンター値が分岐する可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐しない方のブロックを検出する。一方、検出したカウンター値が分岐しない可能性を示す場合には、カウンター値に対応する分岐命令が示す分岐する方のブロックを検出する。
【０１４６】
このように、判断部１４１３は、図１５に示すような、カウンターテーブル２８００のカウンター値に基づいて、効率的に、実行される可能性の低いブロックを検出することができる。また、判断部１４１３は、前のブロックからの分岐に応じて実行される度合いに基づくことにより、長期間実行されていないものの、実行される可能性があるブロックのブロック情報３１００を削除対象とすることを抑制できる。
【０１４７】
したがって、カウンターテーブル２８００に基づくことにより、単に、長期間、実行されていないブロックを検出する場合に対して、より適切に、実行される可能性の低いブロックを検出可能になる。即ち、長時間、実行されていなくても、再実行の可能性があるブロックのブロック情報３１００を削除対象とすることを抑制することができる。これにより、再実行される可能性があるブロックのブロック情報３１００を、より確実に、ブロック情報格納領域２１３に記憶させておくことが可能になる。
【０１４８】
したがって、本実施の形態例におけるシミュレーション装置１００は、再コンパイル処理や対応情報２３００の生成処理の発生を抑制することができ、シミュレートの速度の低下を抑制することができる。
【０１４９】
［フローチャート］
次に、判断部１４１３が、カウンターテーブル２８００のカウンター値を参照して、削除対象のブロックを検出する処理を図１８にしたがって説明する。
【０１５０】
図１８は、カウンターテーブル２８００を参照して、削除対象のブロックを検出する処理を説明するフローチャート図である。
【０１５１】
ステップＳ３１０１：判断部１４１３は、カウンターテーブル２８００を参照し、ポインタ「min_ptr」に、カウンターテーブル２８００の最初のエントリをポイントさせる。
【０１５２】
ステップＳ３１０２：判断部１４１３は、カウンターテーブル２８００の最初のエントリのカウンター値を取得する。
【０１５３】
ステップＳ３１０３：判断部１４１３は、取得したカウンター値から、初期値「２ｎ−１」を減算した値の絶対値を、値「ref_val」に保存する。
【０１５４】
ステップＳ３１０４：次に、判断部１４１３は、カウンターテーブル２８００に、次のエントリがあるか否かを判定する。
【０１５５】
ステップＳ３１０５：次のエントリがある場合（ステップＳ３１０４：Ｙｅｓ）、判断部１４１３は、ポインタ「current_ptr」に、次のエントリをポイントさせる。
【０１５６】
ステップＳ３１０６：また、判断部１４１３は、ポインタ「current_ptr」がポイントするエントリのカウンター値を取得する。
【０１５７】
ステップＳ３１０６：判断部１４１３は、取得したカウンター値から初期値「２ｎ−１」を減算した値の絶対値を、値「current_val」に保存する。
【０１５８】
ステップＳ３１０８：そして、判断部１４１３は、次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」より大きいか否かを判定する。つまり、判断部１４１３は、第１のエントリの絶対値と、第２のエントリの絶対値とを比較する。
【０１５９】
ステップＳ３１０９：次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」より大きい場合（ステップＳ３１０８：Ｙｅｓ）、次のエントリが、初めのエントリよりも、初期値「２ｎ−１」との差分の絶対値が大きいことを示す。したがって、判断部１４１３は、初めのエントリを示すポインタ「min_ptr」に、次のエントリを示すポインタ「current_ptr」の値をセットする。
【０１６０】
一方、次のエントリの絶対値「current_val」が、初めのエントリの絶対値「ref_val」以上の場合（ステップＳ３１０８：Ｎｏ）、判断部１４１３は、初めのエントリを示すポインタ「min_ptr」を更新しない。
【０１６１】
カウンターテーブル２８００にエントリがある間（ステップＳ３１０４：Ｙｅｓ）、判断部１４１３は、ポインタ「current_ptr」を移動し、ステップＳ３１０５〜ステップＳ３１０９の処理を行う。この結果、ポインタ「min_ptr」は、カウンターテーブル２８００のすべてのエントリのうち、最も、絶対値が大きいエントリを示す。
【０１６２】
ステップＳ３１１０：エントリがなくなると（ステップＳ３１０４：Ｎｏ）、判断部１４１３は、ポインタ「min_ptr」が示すエントリの分岐命令アドレスを検出する。
【０１６３】
ステップＳ３１０１：検出した分岐命令アドレスのカウンター値が初期値「２ｎ−１」以上であることから、分岐命令が分岐する可能性が高いことを示す場合、判断部１４１３は、分岐命令が示す、分岐しない場合のブロックを削除対象とする。一方、検出した分岐命令アドレスのカウンター値が、初期値「２ｎ−１」より小さいことから、分岐命令が分岐しない可能性が高いことを示す場合、判断部１４１３は、分岐命令が示す、分岐する場合のブロックを削除対象とする。
【０１６４】
ここで、図１５のカウンターテーブル２８００にしたがって、実行される可能性の低いブロックを検出する具体例を説明する。具体例では、図１５のカウンターテーブル２８００における値ｎが値「５」である場合を例示する。
【０１６５】
図１５のカウンターテーブル２８００によると、アドレス「0ｘ80005000」の分岐命令のカウンター値は、値「２２（＝２ｎ−１０）」であって、初期値「１６（＝２ｎ-1）」を超える。つまり、アドレス「0ｘ80005000」の分岐命令は、分岐する可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「６（＝２２−１６）」である。同様にして、アドレス「0ｘ40010200」の分岐命令のカウンター値は、値「２０（＝２ｎ−１＋４）」であって、初期値「１６（＝２ｎ-1）」を超える。つまり、アドレス「0ｘ40010200」の分岐命令は、分岐する可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「４（＝２０−１６）」である。
【０１６６】
また、アドレス「0ｘ15604000」の分岐命令のカウンター値は、値「６」であって、初期値「１６（＝２ｎ-1）」を下回る。つまり、アドレス「0ｘ15604000」の分岐命令は、分岐しない可能性が高いことを示す。また、カウンター値と初期値との絶対値は、値「１０（＝１６−６）」である。
【０１６７】
したがって、判断部１４１３は、カウンター値と初期値との絶対値が最も大きいアドレス「0ｘ15604000」の分岐命令を検出する。前述したとおり、アドレス「0ｘ15604000」の分岐命令のカウンター値「６」は、分岐しない可能性が高いことを示す。したがって、判断部１４１３は、アドレス「0ｘ15604000」の分岐命令が示す、分岐する場合のブロックを検出する。
【０１６８】
［分岐予測処理の説明］
次に、カウンターテーブル管理部１４１８が、図１５に示すカウンターテーブル２８００にしたがって行う分岐予測処理を、図１９にしたがって説明する。
【０１６９】
図１９は、カウンターテーブル２８００に基づいて分岐予測を行う処理を説明するフローチャート図である。
【０１７０】
ステップＳ３２０１：カウンターテーブル管理部１４１８は、カウンターテーブル２８００から、対象の分岐命令のアドレスと一致するテーブルのエントリを検索する。
【０１７１】
ステップＳ３２０３：対象の分岐命令と一致するテーブルのエントリが検出されない場合（ステップＳ３２０２：Ｎｏ）、カウンターテーブル管理部１４１８は、テーブルに空きエントリがあるか否かを判定する。この場合、対象の分岐命令を含むブロックが初めて実行される場合を示す。
【０１７２】
ステップＳ３２０４：テーブルに空きエントリがない場合（ステップＳ３２０３：Ｎｏ）、カウンターテーブル管理部１４１８は、ＬＲＵアルゴリズムにしたがって、長期間更新されていないエントリを削除する。前述したとおり、例えば、判断部１４１３は、削除されたエントリの分岐命令が示す２つのブロックのうち、実行される可能性の低いブロックを、削除対象リストに追加する。
【０１７３】
ステップＳ３２０５：テーブルに空きエントリがある場合（ステップＳ３２０３：Ｙｅｓ）、または、エントリを削除した場合（ステップＳ３２０４）、カウンターテーブル管理部１４１８は、対象の分岐命令をカウンターテーブル２８００のエントリに追加する。また、カウンターテーブル管理部１４１８は、対象の分岐命令のカウンター値を初期値「２ｎ−１」に設定する。
【０１７４】
ステップＳ３２０６：対象の分岐命令と一致するテーブルのエントリが検出された場合（ステップＳ３２０１：Ｙｅｓ）、カウンターテーブル管理部１４１８は、エントリのカウンター値が、初期値「２ｎ−１」より大きいか否かを判定する。または、対象の分岐命令のエントリをカウンターテーブル２８００に追加した場合（ステップＳ３２０４）、カウンターテーブル管理部１４１８は、エントリのカウンター値が、初期値「２ｎ−１」より大きいか否かを判定する。
【０１７５】
ステップＳ３２０７：カウンター値が、初期値「２ｎ−１」以上の場合（ステップＳ３２０６：Ｙｅｓ）、カウンターテーブル管理部１４１８は、信号Ｔａｋｅｎ（分岐する）を送信する。即ち、カウンターテーブル管理部１４１８は、対象の分岐命令が分岐する旨、予測する。
【０１７６】
ステップＳ３２０８：一方、カウンター値が、初期値「２ｎ−１」より小さい場合（ステップＳ３２０６：Ｎｏ）、カウンターテーブル管理部１４１８は、信号Ｎｏｔ Ｔａｋｅｎ（分岐しない）を送信する。即ち、カウンターテーブル管理部１４１８は、対象の分岐命令が分岐しない旨、予測する。
【０１７７】
このように、シミュレーション装置１００は、プロセッサの既存機能である分岐予測機能によって生成されるカウンターテーブル２８００を利用することによって、実行される可能性の低いブロックを、効率的に検出することができる。また、分岐予測機能は、シミュレータに予め、搭載されるモデルである。したがって、カウンターテーブル２８００の生成による、シミュレーション処理に負荷は新たに発生しない。
【０１７８】
［コード実行処理］
次に、図１３のフローチャート図のステップＳ２７０７に示す、コード実行部１４１６による、取得した対応情報２３００を用いた実行コードｅｃの実行処理を説明する。
【０１７９】
図２０は、コード実行部１４１６による実行コードｅｃの実行処理を説明するフローチャート図である。コード実行部１４１６は、検出した内部状態１６００と対応情報２３００を用いて、実行コードｅｃの各命令を順に実行する（ステップＳ２１０１）。コード実行部１４１６は、対象ブロックに含まれる外部依存命令を実行したか否かを判断する（ステップＳ２１０２）。
【０１８０】
対象ブロックに含まれる外部依存命令を実行していないと判断された場合（ステップＳ２１０２：Ｎｏ）、コード実行部１４１６は、ステップＳ２１０４へ移行する。
【０１８１】
対象ブロックに含まれる外部依存命令を実行したと判断された場合（ステップＳ２１０２：Ｙｅｓ）、コード実行部１４１６は、外部依存命令に応じた補正部１４１７による補正処理を実行する（ステップＳ２１０３）。ステップＳ２１０３の処理の詳細は、図２２のフローチャートにしたがって説明する。そして、コード実行部１４１６は、実行結果を、シミュレーション情報１４３０として出力する（ステップＳ２１０４）。
【０１８２】
つぎに、コード実行部１４１６は、対象ブロックに含まれる命令の実行が終了したか否かを判断する（ステップＳ２１０５）。実行が終了したと判断された場合（ステップＳ２１０５：Ｙｅｓ）、コード実行部１４１６は、一連の処理を終了する。一方、実行が終了していないと判断された場合（ステップＳ２１０５：Ｎｏ）、ステップＳ２１０１へ戻る。
【０１８３】
［補正処理］
図２１は、図２０のステップＳ２１０３で示す補正部１４１７の呼び出し処理の詳細な説明を示すフローチャートである。
【０１８４】
まず、補正部１４１７は、キャッシュアクセスが要求されているか否かを判断する（ステップＳ２２０１）。キャッシュアクセスが要求されていない場合（ステップＳ２２０１：Ｎｏ）、ステップＳ２２０５へ移行する。キャッシュアクセスが要求されている場合（ステップＳ２２０１：Ｙｅｓ）、ステップＳ２２０３におけるシミュレーションは、動作シミュレーションｓｉｍである。補正部１４１７は、キャッシュアクセスの結果は予測ケースと同じか否かを判断する（ステップＳ２２０２）。
【０１８５】
同じではない場合（ステップＳ２２０２：Ｎｏ）、補正部１４１７は、性能値の補正を行う（ステップＳ２２０３）。そして、補正部１４１７は、補正された性能値を出力し（ステップＳ２２０４）、一連の処理を終了する。同じであると判断された場合（ステップＳ２２０２：Ｙｅｓ）、補正部１４１７０は、対応情報１０１に含まれる予測された性能値を出力し（ステップＳ２２０５）、一連の処理を終了する。
【０１８６】
以上のように、本実施の形態例におけるシミュレーション方法は、対象ブロックが変化した場合に検出した内部状態１６００と、対象ブロックの各命令の性能値２２００とを対応付ける対応情報２３００と、実行コードｅｃとを、順次生成し、メモリに記憶する生成工程を有する。内部状態１６００は、対象プロセッサ１２００の内部状態を示す。また、対象ブロックは、シミュレーションの対象となる、対象プロセッサのプログラムを分割したプログラムを示す。実行コードは、対象ブロックを変換したプロセッサの実行プログラムを示す。
【０１８７】
また、シミュレーション方法は、内部状態に対応する対応情報を用いて実行コードを実行し、対象ブロックの性能値を計算する計算工程を有する。また、シミュレーション方法は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードと対応情報とを削除する削除工程を有する。
【０１８８】
これにより、実行される可能性の低いブロックのブロック情報３１００をメモリから削除することが可能になる。つまり、実行される可能性があるブロックのブロック情報３１００がメモリ２１３から削除されることが抑制可能になる。したがって、シミュレーション装置１００は、実行対象のブロックの再コンパイル処理や対応情報２３００の生成処理の発生を抑えることができる。
【０１８９】
これにより、シミュレーション装置１００は、再コンパイル処理や対応情報２３００の生成処理を最小限に抑えながら、対応情報２３００にしたがって、精度の高い性能シミュレーションを行うことができる。つまり、シミュレーション装置１００は、性能シミュレーションの精度を向上させながら、性能シミュレーションの実行速度を維持することができる。
【０１９０】
また、本実施の形態例におけるシミュレーション方法の生成工程は、対象ブロックの実行コードｅｃがメモリに記憶されていない場合に、対象ブロックの実行コードｅｃを生成してメモリに記憶する工程を有する。また、生成工程は、記憶されている場合に、記憶されている実行コードを読み出す工程を有する。
【０１９１】
これにより、シミュレーション装置１００は、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードｅｃと対応情報２３００とを削除することで、新たな実行コードｅｃをメモリに記憶することができる。これにより、コンパイル処理の発生頻度を抑えることが可能になる。
【０１９２】
また、本実施の形態例におけるシミュレーション方法の生成工程は、内部状態１６００が一致する対応情報２３００がメモリに記憶されていない場合に、内部状態１６００と性能値２２００とを対応付ける対応情報２３００を生成しメモリに記憶する工程を有する。また、生成工程は、記憶されている場合に、記憶されている対応情報を読み出す工程を有する。
【０１９３】
したがって、シミュレーション装置１００は、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの実行コードｅｃと対応情報２３００とを削除することにより、新たな対応情報を２３００メモリに記憶することができる。これにより、対応情報２３００の生成処理の発生頻度を抑えることが可能になる。
【０１９４】
また、本実施の形態例におけるシミュレーション方法の削除工程は、複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する。これにより、シミュレーション装置１００は、実行される可能性が低いブロックを適切に選択し、選択したブロックのブロック情報３１００を削除することができる。また、シミュレーション装置１００は、一定期間実行されていないものの、実行される可能性があるブロックを、ブロック情報３１００の削除対象とすることを抑制できる。
【０１９５】
また、本実施の形態例におけるシミュレーション方法の削除工程は、所定の期間、実行されていないブロックを検出し、検出したブロックの次に実行されるブロックのうち、検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する。
【０１９６】
これにより、シミュレーション装置１００は、長期間実行されず、さらに、実行される可能性の低いブロックを適切に検出し、実行コードｅｃと対応情報２３００を削除することができる。したがって、シミュレーション装置１００は、再実行される可能性があるブロックのブロック情報３１００を、より確実に、ブロック情報格納領域２１３に記憶させておくことが可能になる。
【０１９７】
また、本実施の形態例におけるシミュレーション方法の削除工程は、プログラムの分岐コードごとの飽和カウンターの値に基づいて、飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出する。飽和カウンターの値は、対象プロセッサが生成する。また、削除工程は、検出した分岐コードの飽和カウンターの値が分岐する度合いを示す場合は、分岐コードが分岐しない場合に次に実行されるブロックを、分岐しない度合いを示す場合は、分岐コードが分岐する場合に次に実行されるブロックを選択する。
【０１９８】
これにより、シミュレーション装置１００は、飽和カウンターのアルゴリズムにしたがって生成されるカウンターテーブル２８００のカウンター値に基づいて、実行される可能性の低いブロックを、効率的に、検出することができる。また、シミュレーション装置１００は、長期間実行されていないものの、実行される可能性があるブロックを、ブロック情報３１００の削除対象とすることを回避できる。これにより、シミュレーション装置１００は、再実行される可能性があるブロックのブロック情報３１００を、より確実に、メモリ２１３に記憶させておくことが可能になる。
【０１９９】
また、シミュレーション装置１００は、プロセッサの既存機能である分岐予測機能によって生成されるカウンターテーブル２８００を利用する。これにより、シミュレーション装置１００は、より効率的に、実行される可能性の低いブロックを検出することができる。また、分岐予測機能が、シミュレータに予め搭載されるモデルであることから、カウンターテーブル２８００の生成による、シミュレーション処理に負荷は新たに発生しない。
【０２００】
また、本実施の形態例におけるシミュレーション方法の削除工程は、メモリの空き容量が基準値より小さい場合に、選択したブロックの実行コードｅｃと対応情報２３００とを削除する。したがって、シミュレーション装置１００は、メモリ２１３の空き容量が基準値より小さい場合に、選択したブロックの実行コードｅｃと当該ブロックに対応する対応情報２３００とを削除する。これにより、シミュレーション装置１００は、メモリの空き容量が不足する前に、実行コードｅｃと対応情報２３００を記憶するメモリの空き容量を確保することができる。
【０２０１】
以上の実施の形態をまとめると、次の付記のとおりである。
【０２０２】
（付記１）
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータが実行するシミュレーション方法であって、前記プロセッサが、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶する生成工程と、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算する計算工程と、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する削除工程と
を実行するシミュレーション方法。
【０２０３】
（付記２）
付記１において、
前記生成工程は、前記対象ブロックの前記実行コードが前記メモリに記憶されていない場合に、前記対象ブロックの実行コードを生成して前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている実行コードを読み出す工程と、を有する、シミュレーション方法。
【０２０４】
（付記３）
付記１または２において、
前記生成工程は、前記内部状態が一致する前記対応情報が前記メモリに記憶されていない場合に、前記内部状態と前記性能値とを対応付ける対応情報を生成し前記メモリに記憶する工程と、
前記記憶されている場合に、前記記憶されている対応情報を読み出す工程と、を有するシミュレーション方法。
【０２０５】
（付記４）
付記１乃至３のいずれかにおいて、
前記削除工程は、前記複数のブロックのうち、前記前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する、シミュレーション方法。
【０２０６】
（付記５）
付記４において、
前記削除工程は、所定の期間、実行されていない前記ブロックを検出し、前記検出したブロックの次に実行されるブロックのうち、前記検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する、シミュレーション方法。
【０２０７】
（付記６）
付記４において、
前記削除工程は、前記対象プロセッサが生成する、前記プログラムの分岐コードごとの飽和カウンターの値に基づいて、前記飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出し、前記検出した分岐コードの飽和カウンターの値が前記分岐する度合いを示す場合は、前記分岐コードが分岐しない場合に次に実行されるブロックを選択し、前記分岐しない度合いを示す場合は、前記分岐コードが分岐する場合に次に実行されるブロックを選択する、シミュレーション方法。
【０２０８】
（付記７）
付記１乃至６のいずれかにおいて、
前記削除工程は、前記メモリの空き容量が基準値より小さい場合に、前記選択したブロックの前記実行コードと前記対応情報とを削除する、シミュレーション方法。
【０２０９】
（付記８）
処理を実行するプロセッサと、前記プロセッサの実行結果を記憶するメモリとを有するコンピュータに実行させるシミュレーションプログラムであって、前記プロセッサに、
シミュレーションの対象となる、対象プロセッサのプログラムを分割した、対象ブロックが変化した場合に検出した前記対象プロセッサの内部状態と、前記対象ブロックの各命令の性能値とを対応付ける対応情報と、前記対象ブロックを変換した前記プロセッサの実行コードとを、順次生成し、前記メモリに記憶し、
前記内部状態に対応する前記対応情報を用いて実行コードを実行し、前記対象ブロックの性能値を計算し、
複数のブロックのうち、前のブロックからの分岐に応じて実行される度合いに基づいて選択したブロックの前記実行コードと前記対応情報とを削除する
処理を実行させるシミュレーションプログラム。
【０２１０】
（付記９）
付記８において、
前記対象ブロックの前記実行コードが前記メモリに記憶されていない場合に、前記対象ブロックの実行コードを生成して前記メモリに記憶し、
前記記憶されている場合に、前記記憶されている実行コードを読み出す、
処理をコンピュータに実行させるシミュレーションプログラム。
【０２１１】
（付記１０）
付記８または９において、
前記内部状態が一致する前記対応情報が前記メモリに記憶されていない場合に、前記内部状態と前記性能値とを対応付ける対応情報を生成し前記メモリに記憶し、
前記記憶されている場合に、前記記憶されている対応情報を読み出す、
処理をコンピュータに実行させるシミュレーションプログラム。
【０２１２】
（付記１１）
付記８乃至１０のいずれかにおいて、
前記複数のブロックのうち、前記前のブロックからの分岐に応じて実行される度合いが最も小さいブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
【０２１３】
（付記１２）
付記１１において、
所定の期間、実行されていない前記ブロックを検出し、前記検出したブロックの次に実行されるブロックのうち、前記検出したブロックからの分岐に応じて実行される度合いが小さいブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
【０２１４】
（付記１３）
付記１１において、
前記対象プロセッサが生成する、前記プログラムの分岐コードごとの飽和カウンターの値に基づいて、前記飽和カウンターの値が示す分岐する度合い、または、分岐しない度合いが最も大きい分岐コードを検出し、前記検出した分岐コードの飽和カウンターの値が前記分岐する度合いを示す場合は、前記分岐コードが分岐しない場合に次に実行されるブロックを選択し、前記分岐しない度合いを示す場合は、前記分岐コードが分岐する場合に次に実行されるブロックを選択する、
処理をコンピュータに実行させるシミュレーションプログラム。
【０２１５】
（付記１４）
付記８乃至１３のいずれかにおいて、
前記メモリの空き容量が基準値より小さい場合に、前記選択したブロックの前記実行コードと前記対応情報とを削除する、
処理をコンピュータに実行させるシミュレーションプログラム。
【符号の説明】
【０２１６】
１００：シミュレーション装置、２０１：ホストＣＰＵ、２０２：ＲＯＭ、２０３：ＲＡＭ、２０４：ディスクドライブ、２０５：ディスク、２０６：Ｉ／Ｆ部、２０７：入力装置、２０８：出力装置
【図１】
0006287650.tif 000002
【図２】
0006287650.tif 000003
【図３】
0006287650.tif 000004
【図４】
0006287650.tif 000005
【図５】
0006287650.tif 000006
【図６】
0006287650.tif 000007
【図７】
0006287650.tif 000008
【図８】
0006287650.tif 000009
【図９】
0006287650.tif 000010
【図１０】
0006287650.tif 000011
【図１１】
0006287650.tif 000012
【図１２】
0006287650.tif 000013
【図１３】
0006287650.tif 000014
【図１４】
0006287650.tif 000015
【図１５】
0006287650.tif 000016
【図１６】
0006287650.tif 000017
【図１７】
0006287650.tif 000018
【図１８】
0006287650.tif 000019
【図１９】
0006287650.tif 000020
【図２０】
0006287650.tif 000021
【図２１】
0006287650.tif 000022