(57)【要約】【課題】プロセッサの性能の見積もり精度を向上させること。【解決手段】シミュレーション装置１００は、アウト・オブ・オーダー実行のターゲットＣＰＵがターゲットプログラムｐｇｒを実行した場合の動作シミュレーションｓｉｍの対象ブロックが変化した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵの内部状態を検出する。シミュレーション装置１００は、検出した内部状態と、検出した内部状態における対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報１０１を静的タイミング解析によって生成する。シミュレーション装置１００は、対象ブロックがターゲットＣＰＵに実行された場合の性能値を対応情報によって計算可能な実行コードｅｃを、検出した内部状態と生成した対象ブロックについての対応情報とを用いて実行して対象ブロックがターゲットＣＰＵに実行された場合の性能値を計算する。【選択図】図１
2014211768.tif 000002
【特許請求の範囲】
【請求項１】
アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション装置であって、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出する検出部と、
前記検出部によって検出された前記内部状態と、検出された前記内部状態における前記対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報を生成する対応情報生成部と、
前記対象ブロックが前記プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、前記検出部によって検出された前記内部状態と前記対応情報生成部によって前記対象ブロックについて生成された前記対応情報とを用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の性能値を計算する実行部と、
を有することを特徴とするシミュレーション装置。
【請求項２】
前記対象ブロックが変化した場合、前記対象ブロックが以前に対象ブロックとなったか否かを判断する判断部と、
前記判断部によって以前に前記対象ブロックとなっていないと判断された場合、前記実行コードを生成し、前記判断部によって以前に前記対象ブロックとなっていると判断された場合、前記実行コードを生成しない実行コード生成部と、
を有し、
前記実行部は、前記実行コード生成部によって生成された前記実行コードを実行することを特徴とする請求項１に記載のシミュレーション装置。
【請求項３】
前記判断部は、以前に前記対象ブロックとなっていると判断した場合、検出された前記内部状態が、以前に前記対象ブロックとなった時に検出された前記内部状態と同一であるか否かを判断し、
前記対応情報生成部は、前記判断部によって以前に前記対象ブロックとなっていると判断され、かつ以前に前記対象ブロックとなった時に検出された前記内部状態と同一であると判断された場合、前記対応情報を生成しないことを特徴とする請求項２に記載のシミュレーション装置。
【請求項４】
前記対象ブロックが第１ブロックから第２ブロックに変化した場合、前記対応情報生成部によって生成された前記第１ブロックについての前記対応情報に、前記対応情報生成部によって生成された前記第２ブロックについての前記対応情報を関連付ける関連付け部を有し、
前記対象ブロックが第３ブロックから第４ブロックに変化した場合、前記判断部は、以前にも前記第３ブロックから前記第４ブロックに変化したか否かを判断し、以前にも前記第３ブロックから前記第４ブロックに変化したと判断した場合、前記第４ブロックが以前に前記対象ブロックになった時に前記関連付け部によって前記第３ブロックについての前記対応情報に関連付けられた前記対応情報が対応付ける前記内部状態が、前記第４ブロックについて検出された前記内部状態と一致しているか否かを判断し、
前記実行部は、前記判断部によって一致していると判断された場合、前記第４ブロックについての前記実行コードを、前記第３ブロックについて生成された前記対応情報に関連付けられた前記対応情報を用いて実行することを特徴とする請求項３に記載のシミュレーション装置。
【請求項５】
アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション方法であって、
第２プロセッサが、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の性能値を計算する、
処理を実行することを特徴とするシミュレーション方法。
【請求項６】
アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムであって、
第２プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の性能値を計算する、
処理を実行させることを特徴とするシミュレーションプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シミュレーション装置、シミュレーション方法、およびシミュレーションプログラムに関する。
【背景技術】
【０００２】
従来、プログラムの開発を支援するために、プログラムをプロセッサ上で動作させた場合についてのプログラムの実行時間などの性能を見積もる技術がある（例えば、下記特許文献１参照。）。また、従来、プログラムのコードを複数のブロックに分割し、各ブロックでパイプラインインタロックを考慮した静的な実行サイクル数を算出する技術がある（例えば、下記特許文献２参照。）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０００−２４２５２９号公報
【特許文献２】特開平７−２１０６１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、アウト・オブ・オーダー実行のプロセッサにおいては、プログラムが示す命令の実行順においてブロックを跨って命令の追い越しなどが発生し、プロセッサがブロックを実行した場合の性能が実行状況によって異なる。そのため、プログラムが示す実行順序と、アウト・オブ・オーダー実行のプロセッサが実行する実行順序と、が異なると、性能を精度よく見積もることができない場合がある。
【０００５】
１つの側面では、本発明は、プロセッサの性能の見積もり精度を向上させることができるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明の一側面によれば、アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行し、前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出し、検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、前記対象ブロックが前記プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の性能値を計算するシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムが提案される。
【発明の効果】
【０００７】
本発明の一態様によれば、プロセッサの性能の見積もり精度を向上させることができる。
【図面の簡単な説明】
【０００８】
【図１】図１は、本発明にかかるシミュレーション装置による一動作例を示す説明図である。
【図２】図２は、実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。
【図３】図３は、実施の形態のシミュレーション装置の構成例を示す図である。
【図４】図４は、ブロックに含まれる命令の例を示す図である。
【図５】図５は、タイミング情報の例を示す図である。
【図６】図６は、図４に示すブロックの各命令の実行タイミング例を示す図である。
【図７】図７は、サイクルシミュレーション用コードが組み込まれる例を示す図である。
【図８】図８は、シミュレーション装置の補正部の処理動作を示す図である。
【図９】図９は、シミュレーション装置の補正部のｌｄ命令の実行結果に対する補正例を示す図である。
【図１０】図１０は、シミュレーション装置の補正部のｌｄ命令の実行結果に対する補正例を示す図である。
【図１１】図１１は、補正部のｌｄ命令の実行結果に対する補正例を示す図である。
【図１２】図１２は、ターゲットＣＰＵ例を示す説明図である。
【図１３】図１３は、実施例１にかかるシミュレーション装置による動作例を示す説明図である。
【図１４】図１４は、実施例１にかかるシミュレーション装置の機能的構成例を示すブロック図である。
【図１５】図１５は、ターゲットプログラム例を示す説明図である。
【図１６】図１６は、ターゲットＣＰＵの内部状態の例を示す図表である。
【図１７】図１７は、実行コードの例を示す図表である。
【図１８】図１８は、実施例１にかかる性能値表の例を示す図表である。
【図１９】図１９は、シミュレーション装置によるシミュレーション処理手順例を示すフローチャート（その１）である。
【図２０】図２０は、シミュレーション装置によるシミュレーション処理手順例を示すフローチャート（その２）である。
【図２１】図２１は、図１９で示した実行処理の詳細な説明を示すフローチャートである。
【図２２】図２２は、図２１で示した補正部による補正処理の詳細な説明を示すフローチャートである。
【図２３】図２３は、実施例２にかかるシミュレーション装置による動作例を示す説明図である。
【図２４】図２４は、実施例２にかかるシミュレーション装置の機能的構成例を示すブロック図である。
【図２５】図２５は、実施例２にかかる性能値表例を示す説明図である。
【図２６】図２６は、実施例２にかかるシミュレーション装置によるシミュレーション処理手順例を示すフローチャート（その１）である。
【図２７】図２７は、実施例２にかかるシミュレーション装置によるシミュレーション処理手順例を示すフローチャート（その２）である。
【図２８】図２８は、実施例２にかかるシミュレーション装置によるシミュレーション処理手順例を示すフローチャート（その３）である。
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、本発明にかかるシミュレーション装置、シミュレーション方法、およびシミュレーションプログラムの実施の形態を詳細に説明する。本実施の形態では、評価対象となる第１プロセッサがターゲットプログラムを実行した場合の機能や性能のシミュレーションを、シミュレーション装置が有する第２プロセッサによって実行する。第２プロセッサによってシミュレーションを行う際に第１プロセッサのターゲットプログラムから第２プロセッサが実行可能なコードへの変換手法として、例えば、インタープリタ方式またはＪＩＴ（Ｊｕｓｔ−ｉｎ−Ｔｉｍｅ）コンパイラ方式がある。本実施の形態にかかるシミュレーション装置は、ＪＩＴコンパイラ方式による性能のシミュレーションを行う。
【００１０】
図１は、本発明にかかるシミュレーション装置による一動作例を示す説明図である。シミュレーション装置１００は、アウト・オブ・オーダー実行のプロセッサがターゲットプログラムｐｇｒを実行した場合の動作シミュレーションｓｉｍを実行するコンピュータである。アウト・オブ・オーダー実行のプロセッサをターゲットＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）と称する。シミュレーション装置１００が有するプロセッサをホストＣＰＵと称する。図１の例では、ターゲットＣＰＵがＡＲＭ（登録商標）アーキテクチャのＣＰＵであり、シミュレーション装置１００が有するホストＣＰＵは、例えば、ｘ８６アーキテクチャのＣＰＵである。ここでの動作シミュレーションｓｉｍは、例えば、ターゲットＣＰＵと、ターゲットＣＰＵがアクセス可能なハードウェア資源と、を有するシステムのモデルにターゲットプログラムｐｇｒを与えることによるシミュレーションである。ここで使用されるシステムのモデルは、例えば、ハードウェア記述言語などによってシステムの機能のみを再現したビヘイビアモデルである。
【００１１】
シミュレーション装置１００は、ターゲットプログラムｐｇｒのコードを分割して得られるブロックのうち動作シミュレーションｓｉｍの対象ブロックが変化した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵの内部状態を検出する。ターゲットＣＰＵの内部状態とは、たとえば、ターゲットＣＰＵが有するレジスタなどの設定値である。シミュレーション装置１００は、動作シミュレーションｓｉｍにおけるターゲットＣＰＵが有するレジスタなどの設定値によって、ターゲットプログラムｐｇｒの実行状況を判別可能である。分割されるブロック単位は、例えば、ベーシック（基本）ブロック単位でよく、または、予め定められた任意のコード単位でよい。ここで、ベーシックブロックとは、一つの入口と一つの出口を持ち、内部に分岐コードを含まないコードをいう。ブロックに分割するタイミングは、事前にすべて分割しておいてもよいし、対象ブロックとなった時に対象ブロックだけを分割してもよい。
【００１２】
シミュレーション装置１００は、対象ブロックが変化した場合、対象ブロックについての実行コードｅｃを生成する。ここでの実行コードｅｃとは、対象ブロックがターゲットＣＰＵに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報１０１によってホストＣＰＵが計算可能なコードである。対応情報１０１の具体例は図１８に示す。性能値は、例えば、処理時間、サイクル数などが挙げられる。
【００１３】
例えば、実行コードｅｃは、機能コードｃ１と、タイミングコードｃ２と、を含む。機能コードｃ１は、対象ブロックをコンパイルすることによって得られるホストＣＰＵが実行可能なコードである。タイミングコードｃ２は、機能コードｃ１の性能値を見積もるコードである。例えば、性能値がサイクル数であると、タイミングコードｃ２は、例えば、以下のように内部状態を引数として性能値を得て、サイクル数ｃｙｃｌｅを加算していくようなコードである。
【００１４】
ｃｙｃｌｅ＝ｃｙｃｌｅ＋性能値［内部状態］
【００１５】
このように、本実施の形態で生成される実行コードｅｃは、具体的な性能値が記述されたコードでなく、性能値を取得可能なコードである。これにより、同一のブロックについて複数回実行コードｅｃを生成しなくてよい。そこで、シミュレーション装置１００は、対象ブロックが以前に対象ブロックとなったか否かを判断する。例えば、対象ブロックが以前に対象ブロックとなっていなければ、対象ブロックについての実行コードｅｃは生成済みでないため、あらたに対象ブロックについての実行コードｅｃを生成しなければならない。一方、例えば、対象ブロックが以前に対象ブロックとなっていれば、すでに対象ブロックについての実行コードｅｃは生成済みであるため、あらたに対象ブロックについての実行コードｅｃを生成しなくてもよい。そのため、シミュレーション装置１００は、以前に対象ブロックとなっていないと判断された場合、対象ブロックについての実行コードｅｃを生成する。一方、シミュレーション装置１００は、以前に対象ブロックとなっていると判断された場合、実行コードｅｃを生成しない。これにより、同一のブロックについて複数回実行コードｅｃが生成されないため、性能値の見積もりにおいて、省メモリ化を図ることができる。
【００１６】
そして、シミュレーション装置１００は、検出した内部状態と、検出した内部状態における対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報１０１を生成する。検出された内部状態が異なる度に対象ブロックについての対応情報１０１は生成される。例えば、シミュレーション装置１００は、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって対象ブロックに含まれる各命令の性能値を算出する。対象ブロックに含まれる各命令の基準となる性能値は、シミュレーション装置１００がアクセス可能な記憶装置に予め記憶させたり、シミュレーション装置１００の利用者によって入力させたり、シミュレーション装置１００が他の装置から取得してもよい。具体的に、例えば、性能値がサイクル数や実行時間である場合、シミュレーション装置１００は、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う。
【００１７】
より具体的には、シミュレーション装置１００は、例えば、検出した内部状態によって、動作シミュレーションｓｉｍにおける直前の対象ブロックの命令の実行順や命令の完了状況などの実行状況を判断する。そして、シミュレーション装置１００は、例えば、対象ブロックに含まれる各命令の基準となる性能値を実行状況に応じて加算または減算することによって、検出した内部状態における対象ブロックに含まれる各命令の性能値を得る。
【００１８】
性能値がサイクル数の場合について、検出された内部状態における対象ブロックに含まれる各命令の性能値を静的に見積もる方法について簡単に説明する。例えば、対象ブロックの直前のブロックに含まれる第１命令の実行結果を対象ブロックに含まれる第２命令が使用する場合において、第１命令が終了していない場合、シミュレーション装置１００は、第２命令の基準となる性能値に第１命令の遅延分の性能値を加算する。また、例えば、シミュレーション装置１００は、対象ブロックが変化したにもかかわらず、直前のブロックに含まれる命令の中に実行が完了していない第１命令が使用中の実行ユニットを使用予定の第２命令が対象ブロックに含まれていれば、第２命令の基準となる性能値に第１命令の遅延分の性能値を加算する。このように、シミュレーション装置１００は、検出した内部状態に基づいて対象ブロックの各命令の性能値を静的に見積もる。
【００１９】
つぎに、シミュレーション装置１００は、実行コードｅｃを、対象ブロックについて生成した対応情報１０１と検出した内部状態とを用いて実行することにより、対象ブロックがターゲットＣＰＵに実行された場合の性能値を計算する。
【００２０】
図１によれば、命令の実行順に追い越しが発生しても、内部状態に応じて性能値を算出しているため、アウト・オブ・オーダー実行のターゲットＣＰＵが実行した場合のブロックの性能値を精度よく見積もることができる。
【００２１】
また、図１では、実行コードｅｃの実行時に性能値の補正を行う処理についての詳細な説明を省略する。
【００２２】
（シミュレーション装置１００のハードウェア構成例）
図２は、実施の形態にかかるシミュレーション装置のハードウェア構成例を示すブロック図である。シミュレーション装置１００は、ホストＣＰＵ２０１と、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）２０２と、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０３と、ディスクドライブ２０４と、ディスク２０５と、を有する。シミュレーション装置１００は、Ｉ／Ｆ（Ｉｎｔｅｒ  Ｆａｃｅ）２０６と、入力装置２０７と、出力装置２０８と、を有する。また、各部はバス２００によってそれぞれ接続される。
【００２３】
ここで、ホストＣＰＵ２０１は、シミュレーション装置１００の全体の制御を司る。ＲＯＭ２０２は、ブートプログラムなどのプログラムを記憶する。ＲＡＭ２０３は、ホストＣＰＵ２０１のワークエリアとして使用される記憶部である。ディスクドライブ２０４は、ホストＣＰＵ２０１の制御にしたがってディスク２０５に対するデータのリード／ライトを制御する。ディスク２０５は、ディスクドライブ２０４の制御で書き込まれたデータを記憶する。ディスク２０５としては、磁気ディスク、光ディスクなどが挙げられる。
【００２４】
Ｉ／Ｆ２０６は、通信回線を通じてＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、ＷＡＮ（Ｗｉｄｅ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）、インターネットなどのネットワークＮＥＴに接続され、このネットワークＮＥＴを介して他の装置に接続される。そして、Ｉ／Ｆ２０６は、ネットワークＮＥＴと内部のインターフェースを司り、外部装置からのデータの入出力を制御する。Ｉ／Ｆ２０６には、例えばモデムやＬＡＮアダプタなどを採用することができる。
【００２５】
入力装置２０７は、キーボード、マウス、タッチパネルなど利用者の操作により、各種データの入力を行うインターフェースである。また、入力装置２０７は、カメラから画像や動画を取り込むこともできる。また、入力装置２０７は、マイクから音声を取り込むこともできる。出力装置２０８は、ホストＣＰＵ２０１の指示により、データを出力するインターフェースである。出力装置２０８には、ディスプレイやプリンタが挙げられる。
【００２６】
ここでターゲットＣＰＵがアウト・オブ・オーダーの場合のシミュレーション装置１００の詳細な説明の前に、ターゲットＣＰＵがイン・オーダーの場合のシミュレーション装置について説明する。
【００２７】
（ターゲットＣＰＵがイン・オーダー実行の場合のシミュレーション装置）
はじめに、図３〜図１１を用いてターゲットＣＰＵがイン・オーダー実行の場合のシミュレーション装置の構成およびシミュレーション動作の概要について説明する。図３は、実施の形態のシミュレーション装置の構成例を示す図である。シミュレーション装置１は、パイプライン処理を制御するターゲットＣＰＵにおける命令実行の性能シミュレーションを実行する装置である。ここでは、シミュレーション装置１のハードウェア構成も図２に示したシミュレーション装置のハードウェア構成と同様とする。
【００２８】
ターゲットＣＰＵは、シミュレーションの対象となるＣＰＵの制御モデルである。シミュレーション装置１は、ターゲットＣＰＵの命令実行の性能シミュレーションとして各命令のサイクルシミュレーション情報を出力する。ここで、ターゲットＣＰＵは、例えばＡＲＭアーキテクチャのＣＰＵである。ホストＣＰＵに相当するシミュレーション装置１は、例えばＸ８６アーキテクチャのＣＰＵを搭載するコンピュータである。
【００２９】
シミュレーション装置１は、コード変換部１１とシミュレーション実行部１２とシミュレーション情報収集部１３とを有する。コード変換部１１は、ターゲットＣＰＵのプログラムの実行時に、ターゲットＣＰＵが実行するプログラムのコード（ターゲットコード）から、シミュレーションを実行するホストＣＰＵのコード（ホストコード）を生成する処理部である。シミュレーション装置１には、ターゲットプログラム２と、ターゲットプログラム２に関するタイミング情報３と、予測情報４とが入力される。
【００３０】
コード変換部１１は、ブロック分割部１１１と、予測シミュレーション実行部１１３と、コード生成部１１５とを含む。ブロック分割部１１１は、シミュレーション装置１に入力されたプログラムのターゲットコードを、所定のブロックに分割する。分割されるブロック単位は、例えば、一般的なベーシックブロック単位でよく、または、予め定められた任意のコード単位でよい。予測シミュレーション実行部１１３は、タイミング情報３と予測情報４とを得て、入力されたブロックをある実行結果を前提とした条件下で実行する性能シミュレーションを行う処理部である。コード生成部１１５は、予測シミュレーション実行部１１３のシミュレーション結果をもとに、処理したブロックに対応するホストコードとして、設定された予測ケースにおける命令実行時の性能シミュレーションを行うためのホストコードを生成する処理部である。
【００３１】
シミュレーション実行部１２は、コード生成部１１５が生成したホストコードを実行して、プログラム（ターゲットコード）を実行するターゲットＣＰＵの命令実行の機能および性能シミュレーションを行う処理部である。シミュレーション実行部１２は、コード実行部１２１、補正部１２３を有する。コード実行部１２１は、ホストコードを用いて、プログラム（ターゲットコード）を実行する処理部である。補正部１２３は、プログラムの実行中に、外部依存命令の実行結果が、設定されていた予測結果と異なる場合（予測外ケース）に、その命令の実行時間を、既に求めた予想ケースでの実行時間を補正して求める処理部である。補正部１２３は、外部依存命令に与えられるペナルティ時間、外部依存命令の前後で実行される命令の実行時間、１つ前の命令の遅延時間などを用いて補正を行う。なお、補正処理の詳細は後述する。
【００３２】
シミュレーション情報収集部１３は、性能シミュレーションの実行結果として、各命令の実行時間を含むログ情報（シミュレーション情報）５を収集する処理部である。
【００３３】
図４は、ブロックに含まれる命令の例を示す図である。図４に示すように、あるブロックには、ターゲットコードの３つの命令；（１）“ｌｄ  ｒ１，ｒ２”（ロード）；（２）“ｍｕｌｔ  ｒ３，ｒ４，  ｒ５（乗算）”；（３）“ａｄｄ  ｒ２，ｒ５，  ｒ６（加算）”の命令が含まれ、（１）〜（３）の順でターゲットＣＰＵのパイプラインに投入されて実行されるとする。各命令のｒ１〜ｒ６は、レジスタ（アドレス）を表す。
【００３４】
タイミング情報３は、ターゲットコードの各命令について、命令実行時の各処理要素（段階）と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間（ペナルティサイクル数）とを示す情報である。外部依存命令は、外部環境が関係する処理を行う命令、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットＣＰＵ外の外部環境に依存するような処理、例えば、命令キャッシュ、データキャッシュ、ＴＬＢ検索などであり、さらには、分岐予測、コール／リターンのスタックなどの処理を行う命令である。
【００３５】
図５は、タイミング情報の例を示す図である。図５に示すタイミング情報３では、ｌｄ命令について、ソースレジスタｒｓ１（ｒ１）は１番目の処理要素（ｅ１）で、宛先レジスタｒｄ（ｒ２）は２番目の処理要素（ｅ２）で使用可能であることを表す。また、ｍｕｌｔ命令では、第１ソースレジスタｒｓ１（ｒ３）は１番目の処理要素（ｅ１）、第２ソースレジスタｒｓ２（ｒ４）は２番目の処理要素（ｅ２）、宛先レジスタｒｄ（ｒ５）は３番目の処理要素（ｅ３）で、それぞれ使用可能であることを示す。また、ａｄｄ命令では、第１ソースレジスタｒｓ１（ｒ２）、第２ソースレジスタｒｓ２（ｒ５）は１番目の処理要素（ｅ１）、宛先レジスタｒｄ（ｒ６）は２番目の処理要素（ｅ２）で使用可能であることを示す。
【００３６】
図６は、図４に示すブロックの各命令の実行タイミング例を示す図である。図５に示すタイミング情報３から、パイプラインに各命令が投入されるタイミングは、ｌｄ命令の実行開始をタイミングｔとすると、ｍｕｌｔ命令はタイミングｔ＋１、ａｄｄ命令はタイミングｔ＋２となる。ａｄｄ命令の第１ソースレジスタ（ｒ２）と第２ソースレジスタ（ｒ５）は、ｌｄ命令とｍｕｌｔ命令で使用されているため、ａｄｄ命令の開始は、ｌｄ命令とｍｕｌｔ命令の実行完了のタイミングｔ＋４以降となり、２サイクル分の待機時間（２サイクル分のストール）が生じる。
【００３７】
したがって、図６（Ａ）に示すように、図４に示すブロックをシミュレーションした場合に、ｌｄ命令の実行結果がキャッシュヒットであるケースでは、ブロックの実行時間が６サイクルであることがわかる。図６（Ｂ）は、図４に示すブロックのｌｄ命令の実行結果がキャッシュミスである場合のタイミング例を表す。ｌｄ命令の結果がキャッシュミスであると、タイミング情報３に、ペナルティとして、再実行に十分と考えられる任意の時間（ここでは６サイクル分）が設定されているため、このペナルティサイクルが遅延時間として追加される。したがって、２番目の処理要素（ｅ２）の実行は、タイミングｔ＋７に遅延する。ｌｄ命令のつぎに実行されるｍｕｌｔ命令は、遅延の影響を受けずにそのまま実行されるが、ａｄｄ命令は、ｌｄ命令の実行完了のタイミングｔ＋８以降となり、４サイクル分の待機時間（４サイクル分のストール）が生じる。
【００３８】
したがって、図６（Ｂ）に示すように、図４に示すブロックの命令実行をシミュレーションした場合に、ｌｄ命令の実行結果がキャッシュミスであるケースでは、実行時間が１０サイクルとなることがわかる。予測情報４は、ターゲットコードの外部依存命令の処理において、生じる確率が高い実行結果（予測結果）を定めた情報である。予測情報４には、例えば、
「命令キャッシュ：予測＝ヒット、
データキャッシュ：予測＝ヒット、
ＴＬＢ検索：予測＝ヒット、
分岐予測：予測＝ヒット、
コール／リターン：予測＝ヒット、…」
が定められる。
【００３９】
予測シミュレーション実行部１１３は、上記の予測情報４をもとに、入力されたブロックに含まれる外部依存命令の予測結果を設定し、タイミング情報３を参照して、設定した予測結果を前提とする場合（予測ケース）の命令を実行して、命令実行の進み具合をシミュレーションする。予測シミュレーション実行部１１３は、シミュレーション結果として、ブロックに含まれる各命令の実行時間（所要サイクル数）を求める。
【００４０】
コード生成部１１５は、ブロックのターゲットコードをもとに、外部依存命令が予測結果である予測ケースの場合の命令実行を行うホストコードを生成し、さらに、各命令の実行時間を加算して、ブロックの処理時間を計算する処理を行うシミュレーション用コードを組み込む。例えば、コード生成部１１５は、データのｌｄ命令の予測結果として“キャッシュヒット”が設定されている処理については、そのブロック内のｌｄ命令によるキャッシュアクセスが“ヒット”である場合の処理実行をシミュレーションして、この予測ケースでの実行時間を求め、ｌｄ命令によるキャッシュアクセスが“ミス”である場合の実行時間は、予測ケースである“ヒット”時の実行時間の加算／減算を用いた補正計算により求める処理を行うホストコードを生成する。
【００４１】
以下に、実施の形態におけるシミュレーション装置１の処理の流れを説明する。
〔コード変換処理〕
（１）シミュレーション装置１のコード変換部１１のブロック分割部１１１は、ターゲットプログラム２のターゲットコードを得て図示しない記憶部に保持し、保持したターゲットコードを任意のブロックに分割する（図４参照）。
（２）予測シミュレーション実行部１１３は、入力されるターゲットプログラム２に関するタイミング情報３、予測情報４を得て記憶部に保存する。そして、予測シミュレーション実行部１１３は、予測情報４をもとに、分割されたブロックの外部依存命令のそれぞれについて予測結果を設定する。例えば、予測シミュレーション実行部１１３は、図４に示すブロックの命令のうち、ｌｄ命令のデータキャッシュの予測結果として「ヒット」を設定する。
（３）予測シミュレーション実行部１１３は、ブロックのコードを解釈して、設定された予測結果を前提とする場合の命令実行をシミュレーションする。すなわち、予測シミュレーション実行部１１３は、図６（Ａ）に示すタイミング例の命令実行をシミュレーションすることになる。
（４）つぎに、コード生成部１１５は、予測ケースのシミュレーション結果をもとに、ターゲットコードからホストコードを生成する。さらに、コード生成部１１５は、ターゲットコードから変換したホストコード（機能コードのみ）に、性能シミュレーション（サイクルシミュレーション）を実行するためのサイクルシミュレーション用コードを組み込む。
【００４２】
図７は、サイクルシミュレーション用コードが組み込まれる例を示す図である。図７（Ａ）には、ターゲットコードから機能コードのみのホストコードが生成される例を示し、図７（Ｂ）には、機能コードのみのホストコードに、サイクルシミュレーション用コードが組み込まれる例を示す。図７（Ａ）に示すように、ターゲットコードＩｎｓｔ＿Ａは、ホストコードＨｏｓｔ＿Ｉｎｓｔ＿Ａ０＿ｆｕｎｃ、Ｈｏｓｔ＿Ｉｎｓｔ＿Ａ１＿ｆｕｎｃに変換され、ターゲットコードＩｎｓｔ＿Ｂは、ホストコードＨｏｓｔ＿Ｉｎｓｔ＿Ｂ０＿ｆｕｎｃ、Ｈｏｓｔ＿Ｉｎｓｔ＿Ｂ１＿ｆｕｎｃ、Ｈｏｓｔ＿Ｉｎｓｔ＿Ｂ２＿ｆｕｎｃ、…に変換されて、機能コードのみのホストコードが生成される。
【００４３】
さらに、機能コードのみのホストコードに、ターゲットコードＩｎｓｔ＿Ａのサイクルシミュレーション用コードＨｏｓｔ＿Ｉｎｓｔ＿Ａ２＿ｃｙｃｌｅ、Ｈｏｓｔ＿Ｉｎｓｔ＿Ａ３＿ｃｙｃｌｅが、ターゲットコードＩｎｓｔ＿Ｂのサイクルシミュレーション用コードＨｏｓｔ＿Ｉｎｓｔ＿Ｂ４＿ｃｙｃｌｅ、Ｈｏｓｔ＿Ｉｎｓｔ＿Ｂ５＿ｃｙｃｌｅが、それぞれ組み込まれる。
【００４４】
サイクルシミュレーション用コードは、各命令の実行時間（所要サイクル数）を定数化し、各命令の実行時間を合計してブロックの処理時間を求めるコードである。これにより、ブロック実行中の進み具合を示す情報を得ることができる。ここで、ホストコードのうち、機能コード、外部依存命令以外の命令についてのサイクルシミュレーション用コードは既知のコードを使用して実施できるので、具体例の説明を省略する。外部依存命令についてのサイクルシミュレーション用コードは、ヘルパー関数呼び出し命令として用意される。ヘルパー関数は、予測ケースと、図１で説明したような動作シミュレーションｓｉｍにおける実行結果と、が一致しているか否かに基づいて実行時間を補正する補正処理を行う関数である。ヘルパー関数の詳細例については後述する。
【００４５】
〔シミュレーション処理〕
（１）シミュレーション実行部１２のコード実行部１２１は、コード変換部１１が生成したホストコードを用いて、ターゲットプログラム２の性能シミュレーションを行う。コード実行部１２１は、ターゲットプログラム２の命令実行をシミュレーションし、各命令の実行時間を得ていく。
（２）コード実行部１２１は、シミュレーションの実行中に、外部依存命令（例えばｌｄ命令）を検出した場合に、その実行結果が、設定された予測結果と異なっているかを判定し、実行結果が予測結果と異なっている場合に、補正部１２３の起動を要求する。例えば、命令「ｌｄ  ｒ１，ｒ２」を検出し、データキャッシュの予測結果（キャッシュヒット）と、実際の実行結果（キャッシュミス）とが異なっていた場合に、補正部１２３が呼び出される。
（３）補正部１２３は、呼び出しを受けて起動し、検出された命令「ｌｄ  ｒ１，ｒ２」の実行時間（サイクル数）を補正する。さらに、補正部１２３は、この補正により、次命令の実行タイミングｔ＋ｎも変更する。補正部１２３は、外部依存命令の実行結果が予測結果と異なる度に、命令の実行時間を補正する。ここで、予測ケースでの外部依存命令の実行時間は既に定数化されているため、補正部１２３は、予測外ケースでの外部依存命令の実行時間を、その命令に対するペナルティ時間、前後に実行される命令の実行時間、前に処理された命令の遅延時間等の値を単に加算または減算して計算することができる。
【００４６】
図８は、シミュレーション装置の補正部の処理動作を示す図である。補正部１２３は、ヘルパー関数モジュールとして実施される。本実施の形態では、例えば、ｌｄ命令のキャッシュの実行結果ごとにシミュレーションを行う従来の関数「ｃａｃｈｅ＿ｌｄ（ａｄｄｒｅｓｓ）」の代わりに、ヘルパー関数「ｃａｃｈｅ＿ｌｄ（ａｄｄｒｅｓｓ，ｒｅｐ＿ｄｅｌａｙ，ｐｒｅ＿ｄｅｌａｙ）」がホストコードに組み込まれることにより、実現している。
【００４７】
ヘルパー関数の“ｒｅｐ＿ｄｅｌａｙ”は、このロード（ｌｄ）命令の返り値を使用するつぎの命令の実行までに、ペナルティ時間のうち遅延時間として処理されなかった時間（猶予時間）である。“ｐｒｅ＿ｄｅｌａｙ”は、１つ前の命令から受ける遅延時間である。“−１”は、前の命令に遅延がないことを示す。“ｒｅｐ＿ｄｅｌａｙ”と“ｐｒｅ＿ｄｅｌａｙ”は、性能シミュレーション結果とタイミング情報３との静的分析処理の結果から得られる時間情報である。
【００４８】
図８に示す動作例では、補正部１２３は、現タイミングｃｕｒｒｅｎｔ＿ｔｉｍｅと１つ前のｌｄ命令の実行タイミングｐｒｅｌｄ＿ｔｉｍｅとの差が、１つ前のｌｄ命令の遅延時間分ｐｒｅ＿ｄｅｌａｙを超えているときは、１つ前のｌｄ命令の実行タイミングｐｒｅｌｄ＿ｔｉｍｅと現タイミングｃｕｒｒｅｎｔ＿ｔｉｍｅまでの時間で遅延時間ｐｒｅ＿ｄｅｌａｙを調整して有効遅延時間ａｖａｉｌ＿ｄｅｌａｙを求める。
【００４９】
つぎに、補正部１２３は、実行結果がキャッシュミスであれば、予測結果の誤りであり、有効遅延時間ａｖａｉｌ＿ｄｅｌａｙにキャッシュミス時のペナルティ時間ｃａｃｈｅ＿ｍｉｓｓ＿ｌａｔｅｎｃｙを加算して、猶予時間ｒｅｐ＿ｄｅｌａｙをもとに、ｌｄ命令の実行時間を補正する。
【００５０】
図９〜図１１では、補正部のｌｄ命令の実行結果に対する補正例を示す。図９は、シミュレーション装置の補正部のｌｄ命令の実行結果に対する補正例を示す図である。図９では、１つのキャッシュ処理が実行されるケースで１つのキャッシュミスが生じた場合の補正例を説明する。
【００５１】
図９の例では、以下の３命令のシミュレーションが実行される。
「ｌｄ  ［ｒ１］，ｒ２  ：［ｒ１］→ｒ２；
ｍｕｌｔ  ｒ３，ｒ４，ｒ５  ：ｒ３＊ｒ４→ｒ５；
ａｄｄ  ｒ２，ｒ５，ｒ６  ：ｒ２＋ｒ５→ｒ６」
【００５２】
図９（Ａ）は、予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースにおいて、３番目に実行されるａｄｄ命令に、２サイクルストールが生じている。図９（Ｂ）は、予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、ｌｄ命令の実行結果がキャッシュミスであると、ペナルティサイクル（６サイクル）分の遅延が生じる。そのため、ｍｕｌｔ命令は、遅延の影響を受けずに実行されるが、ａｄｄ命令の実行は、ｌｄ命令の完了を待つため、４サイクル分遅延することになる。図９（Ｃ）は、補正部１２３による補正後の命令実行タイミングチャートの例を示す図である。
【００５３】
補正部１２３は、ｌｄ命令の実行結果がキャッシュミスであるので（予測結果のミス）、残りの実行時間（２−１＝１サイクル）に所定のキャッシュミス時のペナルティ時間（６サイクル）を加算して有効遅延時間（７サイクル）とする。有効遅延時間は、最大の遅延時間となる。さらに、補正部１２３は、つぎのｍｕｌｔ命令の実行時間（３サイクル）を得て、次命令の実行時間が遅延時間を超過しないと判定して、有効遅延時間から次命令の実行時間を差し引いた時間（７−３＝４サイクル）を、ｌｄ命令の遅延が生じた実行時間（遅延時間）とする。また、補正部１２３は、有効遅延時間から上記の遅延時間を差し引いた時間（３サイクル）を猶予時間とする。猶予時間は、ペナルティとしての遅延が猶予された時間である。補正部１２３は、ヘルパー関数ｃａｃｈｅ＿ｌｄ（ａｄｄｒ，ｒｅｐ＿ｄｅｌａｙ，ｐｒｅ＿ｄｅｌａｙ）で、猶予時間ｒｅｐ＿ｄｅｌａｙ＝３、前命令の遅延時間ｐｒｅ＿ｄｅｌａｙ＝−１（遅延なし）を返す。
【００５４】
この補正により、ｌｄ命令の実行時間は、実行された時間と遅延時間を加算した実行時間（１＋４＝５サイクル）となり、実行完了のタイミングｔ1から、後続のｍｕｌｔ命令、ａｄｄ命令の実行時間が計算される。すなわち、補正したｌｄ命令の実行時間（５サイクル）に、予測シミュレーション実行部１１３の処理結果（予測結果による予測シミュレーションの結果）で求められていたｍｕｌｔ命令とａｄｄ命令の各々の実行時間（３サイクル、３サイクル）を単純に加算するだけで、このブロックの実行時間（サイクル数）を得ることができる。
【００５５】
よって、実行結果が予測と異なる命令の実行時間のみを加算または減算による補正処理を行って、その他の命令については、予測結果にもとづくシミュレーション時に求められた実行時間を加算するだけで、高精度に、キャッシュミス時のシミュレーションの実行サイクル数をも求めることができる。
【００５６】
図９（Ｄ）は、シミュレーション装置１の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図９（Ｄ）の場合には、ｌｄ命令の遅延時間をそのまま加算しているため、実際には、ｌｄ命令の実行中に実行が完了するｍｕｌｔ命令の実行タイミングのずれによる誤差が生じていることがわかる。
【００５７】
図１０は、シミュレーション装置の補正部のｌｄ命令の実行結果に対する補正例を示す図である。図１０では、２つのキャッシュ処理が実行されるケースで２つのキャッシュミスが生じた場合の補正例を説明する。図１０の例では、以下の５命令のシミュレーションが実行される。
「ｌｄ  ［ｒ１］，ｒ２  ：［ｒ１］→ｒ２；
ｌｄ  ［ｒ３］，ｒ４  ：［ｒ３］→ｒ４；
ｍｕｌｔ  ｒ５，ｒ６，ｒ７  ：ｒ５＊ｒ６→ｒ７；
ａｄｄ  ｒ２，ｒ４，ｒ２  ：ｒ２＋ｒ４→ｒ２；
ａｄｄ  ｒ２，ｒ７，ｒ２  ：ｒ２＋ｒ７→ｒ２」
【００５８】
図１０（Ａ）は、２つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、２つのｌｄ命令が、２サイクル分（通常の１サイクル＋付加した１サイクル）をあけて実行されるものとする。図１０（Ｂ）は、２つのキャッシュ処理の両方が予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、２つのｌｄ命令のそれぞれでキャッシュミスがあり、ペナルティサイクル（６サイクル）分の遅延が生じる。しかし、２つのｌｄ命令の遅延時間は重なる時間があり、ｍｕｌｔ命令も、遅延の影響を受けずに実行され、２つのａｄｄ命令の実行が２つ目のｌｄ命令の完了まで遅延することになる。図１０（Ｃ）は、補正部１２３による補正後の命令実行タイミングチャートの例を示す図である。
【００５９】
補正部１２３は、図９を用いて説明したように、タイミングｔ0において、１つ目のｌｄ命令の遅延時間を補正し、ヘルパー関数ｃａｃｈｅ＿ｌｄ（ａｄｄｒ，３，−１）を返す。つぎに、現タイミングｔ1において、補正部１２３は、２つ目のｌｄ命令の実行結果がキャッシュミスであるので（予測結果のミス）、このｌｄ命令の残りの実行時間にペナルティサイクル（６）を追加して有効遅延時間（１＋６＝７サイクル）とする。
【００６０】
補正部１２３は、有効遅延時間から、現タイミングｔ1までに消費した遅延時間（＜現タイミングｔ1−前命令の実行タイミングｔ0＞−設定された間隔）を差し引いて、現タイミングｔ1から超過した有効遅延時間を求め（７−（６−２）＝３サイクル）、この超過した有効遅延時間を、２つ目のｌｄ命令の実行時間とする。さらに、補正部１２３は、超過した有効遅延時間から本来の実行時間を差し引いて（３−１＝２サイクル）、前命令の遅延時間とする。また、補正部１２３は、有効遅延時間から、現タイミングｔ1までに消費した遅延時間と現タイミングｔ1で超過した有効遅延時間との合計を差し引いて（７−（３＋３）＝１サイクル）、猶予時間とする。
【００６１】
補正部１２３は、タイミングｔ1において、２つ目のｌｄ命令の遅延時間を補正した後、ヘルパー関数ｃａｃｈｅ＿ｌｄ（ａｄｄｒ，２，１）を返す。この補正により、現タイミングｔ1に補正値（３サイクル）を付加したタイミングがｌｄ命令の実行完了のタイミングとなり、そのタイミングから、以降のｍｕｌｔ命令、ａｄｄ命令の実行時間が加算されていくことになる。
【００６２】
図１０（Ｄ）は、シミュレーション装置１の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図１０（Ｄ）の場合には、２つのｌｄ命令それぞれに与えられたペナルティにもとづく遅延時間をそのまま加算しているため、大きな誤差（８サイクル）が生じていることがわかる。図１０（Ｃ）に示す補正部１２３の処理でも、図１０（Ｂ）に示すように正しくシミュレーションされる場合に比べて誤差（１サイクル）があるが、従来手法に比べて、非常に高精度に求められることがわかる。
【００６３】
図１１は、補正部のｌｄ命令の実行結果に対する補正例を示す図である。２つのキャッシュ処理が実行されるケースで１つのキャッシュミスが生じた場合の補正例を説明する。図１１の例では、図１０で示す説明例と同様の５つの命令のシミュレーションが実行される。
【００６４】
図１１（Ａ）は、２つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、図１０（Ａ）の場合と同様に、２つのｌｄ命令が、２サイクル分（通常の１サイクル＋付加した１サイクル）をあけて実行されるものとする。図１１（Ｂ）は、１つ目のｌｄ命令が予測結果と異なる「キャッシュミス」となり、２つ目のｌｄ命令の結果が予測結果（キャッシュヒット）である場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、１つ目のｌｄ命令にペナルティサイクル（６サイクル）分の遅延が生じる。２つ目のｌｄ命令とｍｕｌｔ命令は、遅延の影響を受けずに実行さる。２つのａｄｄ命令の実行は、１つ目のｌｄ命令の完了まで遅延することになる。図１１（Ｃ）は、補正部１２３による補正後の命令実行タイミングチャートの例を示す図である。
【００６５】
補正部１２３は、図９を用いて説明したように、タイミングｔ0において、１つ目のｌｄ命令の遅延時間を補正し、ヘルパー関数ｃａｃｈｅ＿ｌｄ（ａｄｄｒ，３，−１）を返す。つぎに、現タイミングｔ1において、補正部１２３は、２つ目のｌｄ命令の実行結果がキャッシュヒットであるので（予測結果）、このｌｄ命令の実行開始から現タイミングｔ1までの時間＜ｔ1−ｔ0−設定された間隔（６−０−２＝４サイクル）＞が、このｌｄ命令の実行時間（２サイクル）より大きいかを判断する。補正部１２３は、２つ目のｌｄ命令の実行開始から現タイミングｔ1までの時間が、このｌｄ命令の実行時間（２サイクル）より大きいので、現タイミングｔ1を、次のｍｕｌｔ命令の実行タイミングとする。
【００６６】
そして、補正部１２３は、２つ目のｌｄ命令の実行完了から現タイミングｔ１までの時間を（２サイクル）、次の命令に対する遅延時間として扱い、前命令の遅延時間ｐｒｅ＿ｄｅｌａｙ＝２とする。また、補正部１２３は、１つ目のｌｄ命令の有効遅延時間から、現タイミングｔ1までに消費した遅延時間と現タイミングｔ1で超過した有効遅延時間との合計を差し引いて（７−（６＋０）＝１サイクル）、猶予時間ｒｅｐ＿ｄｅｌａｙ＝１とし、ヘルパー関数ｃａｃｈｅ＿ｌｄ（ａｄｄｒ，１，２）を返す。
【００６７】
図１１（Ｄ）は、シミュレーション装置１の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図１１（Ｄ）の場合には、１つ目のｌｄ命令のペナルティによる遅延時間をそのまま加算しているため誤差が生じていることがわかる。
【００６８】
上述したシミュレーション装置１は、図３に示す構成例に、さらに、電力シミュレーション情報生成部を備えてもよい。電力シミュレーション情報生成部は、電力情報を得てシミュレーション情報収集部１３が出力したシミュレーション情報をもとに、ブロックの実行時の消費電力を計算し、電力シミュレーション情報を出力する処理部である。電力シミュレーション情報生成部を、性能シミュレーション用のホストコードに組み込む関数（電力シミュレーション関数）として実施する例を説明すると、電力情報として、ｌｄ命令、ｍｕｌｔ命令、ａｄｄ命令の１実行当たりの消費電力を、例えば、４ｕ［Ｗ］、０．５ｕ［Ｗ］、０．３ｕ［Ｗ］と設定する。そして、電力シミュレーション関数Ｈｏｓｔ＿Ｉｎｓｔ＿Ａ−Ｃ＿ｐｏｗｅｒは、シミュレーションで実行された各命令の実行回数にもとづいて、電力を計算する。
【００６９】
（本実施の形態にかかるターゲットＣＰＵがアウト・オブ・オーダー実行の場合のシミュレーション装置１００）
本実施の形態では、ターゲットＣＰＵがアウト・オブ・オーダー実行の場合のシミュレーション装置１００について説明する。まず、アウト・オブ・オーダー実行のターゲットＣＰＵについて簡単に説明する。
【００７０】
図１２は、ターゲットＣＰＵ例を示す説明図である。ここでは、アウト・オブ・オーダーのターゲットＣＰＵ１２００の一例について、簡単に説明する。ターゲットＣＰＵ１２００は、ＰＣ（Ｐｒｏｇｒａｍ  Ｃｏｕｎｔｅｒ）１２０１と、命令フェッチ部１２０２と、デコード部１２０４と、命令キュー１２０９を有するリザベーションステーション１２０５と、を有する。ターゲットＣＰＵ１２００は、複数の実行ユニット１２０６と、リオーダ・バッファ１２０７と、レジスタファイル１２０８と、を有する。ＰＣ１２０１は、レジスタの一種であり、次に実行すべき命令が格納されているメモリ１２０３のアドレスを保存する。命令キュー１２０９は、命令フェッチ部１２０２によって解読された命令を一時的に保存する。リザベーションステーション１２０５では、命令キュー１２０９に保存された命令のうち、実行可能になった命令を実行ユニット１２０６に入れるなどの制御を行う。実行ユニット１２０６は、例えば、各命令に応じた演算を実行可能なユニットである。リオーダ・バッファ１２０７は、命令フェッチ部１２０２によって解読された命令を一時的に保存する。リオーダ・バッファ１２０７は、保存した各命令について、実行待ちまたは完了のいずれかの状態を示す情報を有する。レジスタファイル１２０８は、複数のレジスタを有し、複数のレジスタから１つを選択して実行結果を書き込むなどの管理を行う。
【００７１】
ここで、ターゲットＣＰＵ１２００の処理を順に説明する。
（１）ターゲットＣＰＵ１２００はメモリ１２０３から命令フェッチ部１２０２によって命令フェッチ、命令デコード部１２０４によって命令デコードを行う。
（２）ターゲットＣＰＵ１２００はデコードした命令を命令キュー１２０９に入れ、リオーダ・バッファ１２０７に記録する。
（３）ターゲットＣＰＵ１２００はリザベーションステーション１２０５内の命令キュー１２０９にある命令のうち、実行可能になった命令をリザベーションステーション１２０５の制御により実行ユニット１２０６に入れる。
（４）ターゲットＣＰＵ１２００は実行ユニット１２０６により命令の処理完了後、実行結果をリオーダ・バッファ１２０７に格納する。
（５）ターゲットＣＰＵ１２００はリオーダ・バッファ１２０７内の命令のうち実行ユニット１２０６により処理が完了した命令の状態を完了に変更する。
（６）ターゲットＣＰＵ１２００は、リオーダ・バッファ１２０７内の命令のうち、最も古い命令の実行が完了すると、その命令の実行結果はレジスタファイル１２０８に書き戻す。
（７）ターゲットＣＰＵ１２００はリオーダ・バッファ１２０７から完了状態の命令を削除する。
【００７２】
そして、本実施の形態では、ターゲットＣＰＵ１２００の内部状態として、命令キュー１２０９、実行ユニット１２０６の利用状態やリオーダ・バッファ１２０７の記憶内容などと、対象ブロックの直前に実行された命令のアドレスと、を利用する。
【００７３】
アウト・オブ・オーダー実行のターゲットＣＰＵ１２００において、プログラムの実行順序が変化する例を説明する。例えば、プログラムが示す実行順序が以下とする。以下の命令例では（）内の番号が実行順番を示し、「；」以降は注釈である。
【００７４】
（１）命令１：ｌｄｒ  ｒ０，［ｒ１］；ｒ０＜−［ｒ１］
（２）命令２：ａｄｄ  ｒ０，ｒ０，１；ｒ０＜−ｒ０＋１
（３）命令３：ｍｏｖ  ｒ２，０；ｒ２＜−０
【００７５】
命令１は実行に時間がかかり、命令２は命令１の実行結果に依存する。そのため、プログラムが示す実行順序と、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００が実行する実行順序と、が異なる。以下の命令例では（）内の番号が実行順番を示し、「；」以降は注釈である。
【００７６】
（１）命令１：ｌｄｒ  ｒ０，［ｒ１］；ｒ０＜−［ｒ１］
（２）命令３：ｍｏｖ  ｒ２，０；ｒ２＜−０
（３）命令２：ａｄｄ  ｒ０，ｒ０，１；ｒ０＜−ｒ０＋１
【００７７】
また、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００では、命令の追い越しが発生するため、ある命令の実行が遅いことによって他のブロックにも影響を及ぼす可能性がある。プログラムに含まれるブロックの実行順序が以下であるとする。Ｂ１〜Ｂ３がブロックである。
【００７８】
Ｂ１：命令１（実行に時間がかかる命令）
Ｂ２：命令２（命令１に依存する命令）
Ｂ２：命令３（命令１に依存する命令）
Ｂ３：命令４（命令１に依存しない命令）
【００７９】
命令４は、命令１に依存せず、実行に時間がかからない命令であるため、以下のように、命令４は命令２と命令３の実行を追い越して完了する。
【００８０】
Ｂ１：命令１（実行に時間がかかる命令）
Ｂ３：命令４（命令１に依存しない命令）
Ｂ２：命令２（命令１に依存する命令）
Ｂ２：命令３（命令１に依存する命令）
【００８１】
そのため、本実施の形態にかかるシミュレーション装置１００では、対象ブロックが変化した際にターゲットＣＰＵ１２００の内部状態を検出し、検出した内部状態における対象ブロックに含まれる各命令の性能値を静的に算出しておく。これにより、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００が対象ブロックを実行した場合の性能値の見積もりの精度を向上させることができる。
【００８２】
（実施例１）
実施例１では、検出したターゲットＣＰＵ１２００の内部状態ごとに該内部状態と該内部状態における対象ブロックに含まれる各命令の性能値との対応情報１０１を生成し、ブロックの性能値を該対応情報１０１により計算可能な実行コードｅｃを１つ生成する。これにより、実行コードｅｃが何度も生成されないため、ブロックの性能値の見積もりについて省メモリ化を図ることができる。
【００８３】
図１３は、実施例１にかかるシミュレーション装置による動作例を示す説明図である。シミュレーション装置１００は、アウト・オブ・オーダー実行のターゲットＣＰＵ１２００がターゲットプログラムｐｇｒを実行した場合の動作シミュレーションｓｉｍを実行するコンピュータである。シミュレーション装置１００は、対象ブロックが以前に対象ブロックとなっていない場合、対象ブロックの性能値を対応情報１０１により計算可能な実行コードｅｃを１つ生成する。性能値は、例えば、処理時間、クロック数などが挙げられる。さらに、シミュレーション装置１００は、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態と、該内部状態と該内部状態での各命令の性能値との対応情報１０１を生成する。図１３において、各対応情報１０１に付された「−アルファベット」は内部状態を識別するための情報である。
【００８４】
そして、シミュレーション装置１００は、対象ブロックが以前に対象ブロックとなっている場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態ごとに対応情報１０１を生成する。対応情報１０１は、該内部状態と該内部状態における対象ブロックの各命令の性能値とを対応付ける。これにより、対象ブロックについての実行コードｅｃが複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
【００８５】
また、シミュレーション装置１００は、検出された内部状態が、以前に対象ブロックとなった時に検出された内部状態と同一であれば、あらたに検出された内部状態を対応付けた対応情報１０１を生成しない。これにより、対象ブロックについて同一の内部状態を対応付けた対応情報１０１が複数回生成されないため、対象ブロックの性能値の見積もり時に省メモリ化を図ることができる。
【００８６】
（実施例１にかかるシミュレーション装置１００の機能的構成例）
図１４は、実施例１にかかるシミュレーション装置の機能的構成例を示すブロック図である。シミュレーション装置１００は、コード変換部１４０１と、性能シミュレーション実行部１４０２と、シミュレーション情報収集部１４０３と、を有する。シミュレーション装置１００は、ターゲットプログラムｐｇｒと、タイミング情報１４００と、予測情報４と、を得て、シミュレーション情報１４３０を出力する。シミュレーション装置１００は、ターゲットプログラムｐｇｒと、タイミング情報１４００と、シミュレーション情報１４３０とは、たとえば、ディスク２０５などの記憶装置に記憶される。
【００８７】
コード変換部１４０１からシミュレーション情報収集部１４０３の処理は、例えば、ホストＣＰＵ２０１がアクセス可能なディスク２０５などの記憶装置に記憶されたシミュレーションプログラムにコーディングされる。そして、ホストＣＰＵ２０１が記憶装置に記憶されたシミュレーションプログラムを読み出して、シミュレーションプログラムにコーディングされている処理を実行する。これにより、コード変換部１４０１からシミュレーション情報収集部１４０３の処理が実現される。また、各部の処理結果は、例えば、ＲＡＭ２０３、ディスク２０５などの記憶装置に記憶される。
【００８８】
コード変換部１４０１は、内部状態と対象ブロックの各命令の性能値とが対応付けられた対応情報１０１と、対応情報１０１によって対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出可能な実行コードｅｃと、を生成する。具体的には、コード変換部１４０１は、ブロック分割部１４１１と、検出部１４１２と、判断部１４１３と、対応情報生成部１４１４と、実行コード生成部１４１５と、を有する。
【００８９】
性能シミュレーション実行部１４０２は、実行コードｅｃを実行することによって、対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部１４０２は、コード実行部１４１６と、補正部１４１７と、を有する。
【００９０】
ブロック分割部１４１１は、シミュレーション装置１００に入力されたターゲットプログラムｐｇｒのコードを所定基準によってブロックに分割する。分割タイミングは、例えば、あらたに対象ブロックが変化した場合である。分割されるブロック単位は、例えば、ベーシックブロック単位でよく、または、予め定められた任意のコード単位でよい。
【００９１】
図１５は、ターゲットプログラム例を示す説明図である。図１５に示す例は、１×２×３×４×５×６×７×８×９×１０を求めるターゲットプログラムｐｇｒであり、１，２行目が初期化のブロックｂ１、３〜６行目がループ本体のブロックｂ２である。
【００９２】
まず、検出部１４１２は、ターゲットプログラムｐｇｒのコードを分割して得られるブロックのうち動作シミュレーションｓｉｍの対象ブロックが変化した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態を検出する。具体的には、例えば、検出部１４１２は、動作シミュレーションｓｉｍにおけるＰＣ１２０１の値がつぎのブロックに含まれる命令のアドレスを示した場合、動作シミュレーションｓｉｍにおけるターゲットＣＰＵ１２００の内部状態を検出する。ここでは、例えば、ブロックからブロックへ変化したとする。
【００９３】
図１６は、ターゲットＣＰＵの内部状態の例を示す図表である。たとえば、内部状態１６００は、命令キュー１２０９と、実行ユニット１２０６と、リオーダ・バッファ１２０７と、の内容が検出された検出結果である。内部状態１６００は、対象ブロックの前の命令が実行ユニット１２０６を利用している状態であることを示す。
【００９４】
つぎに、判断部１４１３は、対象ブロックが変化した場合、対象ブロックが以前に対象ブロックとなったか否かを判断する。具体的には、例えば、判断部１４１３は、対象ブロックについての実行コードｅｃがディスク２０５などの記憶装置に記憶されているか否かを判断する。以前に対象ブロックとなっていれば、すでに対象ブロックについてコンパイル済みであるため、ディスク２０５などの記憶装置に対象ブロックについての実行コードｅｃが記憶されてある。一方、以前に対象ブロックとなっていなければ、すでに対象ブロックについてコンパイルがされていないため、ディスク２０５などの記憶装置に対象ブロックについての実行コードｅｃが記憶されていない。
【００９５】
実行コード生成部１４１５は、判断部１４１３によって以前に対象ブロックとなっていないと判断された場合、実行コードｅｃを生成する。一方、実行コード生成部１４１５は、判断部１４１３によって以前に対象ブロックとなっていると判断された場合、実行コードｅｃを生成しない。これにより、各ブロックについての実行コードｅｃが複数回生成されないため、対象ブロックについての実行コードｅｃが内部状態ごとに生成される場合と比較して、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。例えば、実行コードｅｃのタイミングコードには、内部状態に対応付けられた対応情報１０１から性能値を取得するコードと、取得した性能値により対象ブロックがターゲットＣＰＵ１２００に実行された場合の性能値を計算するコードと、を含む。
【００９６】
図１７は、実行コードの例を示す図表である。実行コードｅｃがｘ８６命令の例を示す。実行コードｅｃは、ターゲットプログラムｐｇｒがコンパイルされて得られる機能コードｃ１と、タイミングコードｃ２と、を有する。機能コードｃ１は、実行コードｅｃの１〜３、８行目である。タイミングコードｃ２は、実行コードｅｃの４〜７行目である。実行コードｅｃ中のｓｔａｔｅは、ターゲットＣＰＵ１２００の内部状態のインデックス（内部状態Ａ＝０，Ｂ＝１，…）であり、ｐｅｒｆ１は、命令１に対する性能値が格納されたアドレスを示す。これにより、実行コードｅｃが実行されると、検出された内部状態を引数として、対応情報１０１から各命令の性能値が実行順に取得される。
【００９７】
対応情報生成部１４１４は、検出部１４１２によって検出された内部状態と、検出された内部状態における対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報１０１を生成する。また、対応情報生成部１４１４は、予測シミュレーション実行部１４２０を有する。具体的に、対応情報生成部１４１４は、対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を検出する。状況依存命令は、ターゲットＣＰＵ１２００がアクセス可能な外部のハードウェア資源が関係する処理を行う命令である。具体的には、状況依存命令は、例えば、ロード命令またはストア命令などのように、命令の実行結果がターゲットＣＰＵ１２００の外部のハードウェア資源に依存するような処理、例えば、命令キャッシュ、データキャッシュ、ＴＬＢ検索などである。また、状況依存命令は、分岐予測、コール／リターンのスタックなどの処理を行う命令である。状況依存命令は、上述した外部依存命令と同一であり、状況依存命令は、以降外部依存命令と称する。
【００９８】
そして、予測シミュレーション実行部１４２０は、検出した外部依存命令を複数通りの処理のうちの第１処理となった場合について、検出された内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う。これにより、対応情報生成部１４１４は、外部依存命令を複数通りの処理のうちの第１処理となった場合の対象ブロックに含まれる各命令の性能値を算出する。外部依存命令の第１処理については、入力された予測情報に定められた処理である。例えば、第１処理は、予め複数通りの処理のうちその処理となりうる確率が最も高いと推定される処理である。ここでは、第１処理を予測ケースと称する。予測ケースについては、予め予測情報４に登録されていることとする。予測情報４の詳細例については、ターゲットＣＰＵ１２００がイン・オーダーの場合のシミュレーション装置１００に記載された内容と同様であるため、詳細な説明を省略する。予測情報４については、予めディスク２０５などの記憶装置に記憶されていてもよいし、入力装置２０７を介して入力されてもよいし、ネットワークＮＥＴを介して他の装置から取得されてもよい。
【００９９】
基準となる性能値は、入力されたタイミング情報１４００に含まれる。タイミング情報１４００には、ターゲットプログラムｐｇｒに含まれる各命令の基準となる性能値が含まれ、タイミング情報３と同様に補正部１４１７によって使用されるペナルティの性能値も含む。対応情報生成部１４１４は、内部状態によって、ブロック間の命令の依存関係、すなわち、命令の実行順などを判断可能である。図１６に示す内部状態１６００の例では、対応情報生成部１４１４は、ターゲットＣＰＵ１２００の状態が対象ブロックの前の命令が実行ユニット１２０６を利用している状態であると判断でき、命令の実行順を判断できる。そして、例えば、対応情報生成部１４１４は、対象ブロックに含まれる各命令の基準となる性能値に対して内部状態による命令の実行順によって性能値を加算または減算することにより、対象ブロックに含まれる各命令の性能値を算出する。
【０１００】
そして、対応情報生成部１４１４は、例えば、検出された内部状態と、検出された内部状態における算出した対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報１０１を生成する。ここで、生成された対応情報１０１は、ディスク２０５などの記憶装置に記憶された対象ブロックについての性能値表に新たに追加される。
【０１０１】
図１８は、実施例１にかかる性能値表の例を示す図表である。実施例１にかかる性能値表１８００は、内部状態、ブロックに含まれる各命令、および内部状態における各命令の性能値のフィールドを有する。各フィールドに情報が設定されることにより、レコードとして対応情報１０１（１０１−Ａ，１０１−Ｂなど）が記憶される。性能値表１８００は、ディスク２０５などの記憶装置によって実現される。
【０１０２】
内部状態Ａについての対応情報１０１−Ａにおいて、内部状態Ａにおける命令１の性能値は２クロックである。また、内部状態Ｂについての対応情報１０１−Ｂにおいて、内部状態Ｂにおける命令１の性能値は４クロックである。図１８では、省略して命令１だけの性能値を示しているが、実際には対応情報１０１には機能コードに含まれる各命令についての性能値が含まれる。
【０１０３】
また、判断部１４１３は、以前に対象ブロックとなっていると判断した場合、検出された内部状態が以前に対象ブロックとなった時に検出された内部状態と同一であるか否かを判断する。具体的には、判断部１４１３は、検出された内部状態を検索キーとして、性能値表１８００から検索キーと一致する内部状態を有する対応情報１０１を検索する。例えば、判断部１４１３は、一致する内部状態を有する対応情報１０１が検索された場合、以前に対象ブロックとなった時に検出された内部状態と同一であると判断する。例えば、判断部１４１３は、一致する内部状態を有する対応情報１０１が検索されなかった場合、以前に対象ブロックとなった時に検出された内部状態と同一でないと判断する。
【０１０４】
また、対応情報生成部１４１４は、以前に対象ブロックとなった時に検出された内部状態と同一であると判断部１４１３によって判断された場合、あらたに対応情報１０１を生成しない。一方、対応情報生成部１４１４は、以前に対象ブロックとなった時に検出された内部状態と同一でないと判断部１４１３によって判断された場合、あらたに検出された内部状態によってあらたに対応情報１０１を生成する。ここでの対応情報１０１は、あらたに検出された内部状態と検出された内部状態における対象ブロック内の各命令の性能値と、を対応付ける。これにより、対象ブロックについて同一の内部状態が複数回検出されたとしても、同一の内部状態における対応情報１０１の生成は１回であるため、対象ブロックの性能値の見積もり時の省メモリ化を図ることができる。
【０１０５】
コード実行部１４１６は、実行コード生成部１４１５によって生成された実行コードｅｃを実行する。性能シミュレーション実行部１４０２は、実行コードｅｃを実行することによって、対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部１４０２は、コード実行部１４１６と、補正部１４１７と、を有する。
【０１０６】
コード実行部１４１６は、対応情報生成部１４１４によって生成された対応情報１０１を用いて実行コードｅｃを実行する。また、コード実行部１４１６は、以前に対象ブロックとなっていると判断され、かつ以前に対象ブロックとなった時に検出された内部状態と同一であると判断された場合、以前に対象ブロックとなった時に検出された内部状態を対応付けた対応情報１０１を取得する。そして、コード実行部１４１６は、検出された内部状態と取得した対応情報１０１とを用いて実行コードｅｃを実行する。
【０１０７】
補正部１４１７は、実行コードｅｃをコード実行部１４１６による実行中に外部依存命令を検出すると、動作シミュレーションｓｉｍにおける実行結果において、外部依存命令が複数通りの処理のうち予測ケースである第１処理と異なる第２処理であるか否かを判断する。補正部１４１７は、動作シミュレーションｓｉｍにおける実行結果において外部依存命令が第２処理である場合に、第２処理に対応する所定性能値によって外部依存命令の性能値を補正する。所定性能値は、タイミング情報１４００に含まれるペナルティの性能値であり、外部依存命令の種類と第２処理とに応じて予め定められた値である。これにより、補正部１４１７は、対象ブロックがターゲットＣＰＵ１２００に実行された場合の性能値を補正する。補正部１４１７による詳細な補正方法については、ターゲットＣＰＵ１２００がイン・オーダーの場合のシミュレーション装置１に記載された内容と同様であるため、詳細な説明を省略する。
【０１０８】
また、シミュレーション情報収集部１４０３は、性能シミュレーション実行部１４０２による実行結果として、各命令の実行時間を含むログ情報であるシミュレーション情報１４３０を収集する。シミュレーション情報１４３０については、ディスク２０５などの記憶装置に記憶させてもよいし、ディスプレイなどの出力装置２０８によって出力してもよいし、ネットワークＮＥＴを介して他の装置に出力してもよい。
【０１０９】
（実施例１にかかるシミュレーション装置１００によるシミュレーション処理手順例）
図１９および２０は、シミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。まず、シミュレーション装置１００は、ターゲットＣＰＵ１２００のＰＣ１２０１がつぎのブロック（対象ブロック）を示すアドレスをポイントしたか否かを判断する（ステップＳ１９０１）。シミュレーション装置１００は、ステップＳ１９０１によって対象ブロックが変化したか否かを判断する。
【０１１０】
つぎのブロック（対象ブロック）を示すアドレスをポイントしていない場合（ステップＳ１９０１：Ｎｏ）、シミュレーション装置１００は、ステップＳ１９０１へ戻る。一方、つぎのブロック（対象ブロック）を示すアドレスをポイントした場合（ステップＳ１９０１：Ｙｅｓ）、シミュレーション装置１００は、ターゲットＣＰＵ１２００の内部状態を検出する（ステップＳ１９０２）。つぎに、シミュレーション装置１００は、対象ブロックがコンパイル済みか否かを判断する（ステップＳ１９０３）。
【０１１１】
コンパイル済みでないと判断された場合（ステップＳ１９０３：Ｎｏ）、シミュレーション装置１００は、ターゲットプログラムｐｇｒから対象ブロックを分割して取得する（ステップＳ２００１）。シミュレーション装置１００は、対象ブロックに含まれる外部依存命令を検出し（ステップＳ２００２）、予測情報４から検出した外部依存命令についての予測ケースを取得する（ステップＳ２００３）。シミュレーション装置１００は、対象ブロックをコンパイルすることによって得られるコードと、予測ケースでの対象ブロックの性能値を対応情報１０１により計算可能なコードと、を含む実行コードｅｃを生成して出力する（ステップＳ２００４）。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
【０１１２】
シミュレーション装置１００は、予測ケースについて、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う（ステップＳ２００５）。シミュレーション装置１００は、検出した内部状態と、タイミング解析結果である対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報１０１を生成して性能値表１８００に記録し（ステップＳ２００６）、ステップＳ１９０９へ移行する。
【０１１３】
コンパイル済みであると判断された場合（ステップＳ１９０３：Ｙｅｓ）、シミュレーション装置１００は、対象ブロックについての性能値表１８００に登録された対応情報１０１が対応付けた内部状態のうち、未選択の内部状態があるか否かを判断する（ステップＳ１９０４）。未選択の内部状態がある場合（ステップＳ１９０４：Ｙｅｓ）、シミュレーション装置１００は、未選択の内部状態のうち、登録順に内部状態を１つ選択する（ステップＳ１９０５）。
【０１１４】
シミュレーション装置１００は、検出した内部状態と、選択した内部状態と、を比較する（ステップＳ１９０６）。そして、シミュレーション装置１００は、一致しているか否かを判断する（ステップＳ１９０７）。一致していると判断された場合（ステップＳ１９０７：Ｙｅｓ）、シミュレーション装置１００は、選択した内部状態を対応付けた対応情報１０１を性能値表１８００から取得する（ステップＳ１９０８）。そして、シミュレーション装置１００は、検出した内部状態と取得した対応情報１０１を用いて実行コードｅｃの実行処理を行い（ステップＳ１９０９）、Ｓ１９０１へ戻る。一方、一致していないと判断された場合（ステップＳ１９０７：Ｎｏ）、シミュレーション装置１００は、ステップＳ１９０４へ戻る。一方、未選択の内部状態がない場合（ステップＳ１９０４：Ｎｏ）、シミュレーション装置１００は、ステップＳ２００５へ移行する。
【０１１５】
図２１は、図１９で示した実行処理の詳細な説明を示すフローチャートである。シミュレーション装置１００は、検出した内部状態と対応情報１０１を用いて、実行コードｅｃの各命令を順に実行する（ステップＳ２１０１）。シミュレーション装置１００は、対象ブロックに含まれる外部依存命令を実行したか否かを判断する（ステップＳ２１０２）。
【０１１６】
対象ブロックに含まれる外部依存命令を実行していないと判断された場合（ステップＳ２１０２：Ｎｏ）、シミュレーション装置１００は、ステップＳ２１０４へ移行する。
【０１１７】
対象ブロックに含まれる外部依存命令を実行したと判断された場合（ステップＳ２１０２：Ｙｅｓ）、シミュレーション装置１００は、外部依存命令に応じた補正部による補正処理を実行する（ステップＳ２１０３）。そして、シミュレーション装置１００は、実行結果を出力する（ステップＳ２１０４）。つぎに、シミュレーション装置１００は、対象ブロックに含まれる命令の実行が終了したか否かを判断する（ステップＳ２１０５）。実行が終了したと判断された場合（ステップＳ２１０５：Ｙｅｓ）、シミュレーション装置１００は、一連の処理を終了する。一方、実行が終了していないと判断された場合（ステップＳ２１０５：Ｎｏ）、ステップＳ２１０１へ戻る。
【０１１８】
図２２は、図２１で示した補正部による補正処理の詳細な説明を示すフローチャートである。補正部１４１７とは、ヘルパー関数である。ここでは、ｌｄ命令についてのキャッシュアクセスがヒットしたか否かについてのヘルパー関数を例に挙げて説明する。
【０１１９】
まず、シミュレーション装置１００は、キャッシュアクセスが要求されているか否かを判断する（ステップＳ２２０１）。キャッシュアクセスが要求されていない場合（ステップＳ２２０１：Ｎｏ）、ステップＳ２２０５へ移行する。キャッシュアクセスが要求されている場合（ステップＳ２２０１：Ｙｅｓ）、ステップＳ２２０３におけるシミュレーションは、動作シミュレーションｓｉｍである。シミュレーション装置１００は、キャッシュアクセスの結果は予測ケースと同じか否かを判断する（ステップＳ２２０２）。
【０１２０】
同じでないと判断された場合（ステップＳ２２０２：Ｎｏ）、シミュレーション装置１００は、性能値の補正を行う（ステップＳ２２０３）。そして、シミュレーション装置１００は、補正された性能値を出力し（ステップＳ２２０４）、一連の処理を終了する。同じであると判断された場合（ステップＳ２２０２：Ｙｅｓ）、シミュレーション装置１００は、対応情報１０１に含まれる予測された性能値を出力し（ステップＳ２２０５）、一連の処理を終了する。
【０１２１】
以上説明したように、実施例１にかかるシミュレーション装置１００は、検出したＣＰＵの内部状態と該内部状態での各命令の性能値との対応情報１０１を生成し、ブロックの性能値を該対応情報１０１により計算可能な実行コードｅｃを実行する。内部状態を考慮した性能値の見積もりを行うことができるため、アウト・オブ・オーダー実行の性能値の見積もりの精度を向上させることができる。
【０１２２】
また、実施例１にかかるシミュレーション装置１００は、検出したＣＰＵの内部状態ごとに該内部状態と該内部状態での各命令の性能値との対応情報１０１を生成し、ブロックの性能値を該対応情報１０１により計算可能な実行コードｅｃを１つ生成する。これにより、実行コードｅｃが何度も生成されないため、ブロックの性能値の見積もり時に省メモリ化を図ることができる。
【０１２３】
また、実施例１にかかるシミュレーション装置１００は、検出したＣＰＵの内部状態を対応付けた対応情報１０１がすでにある場合、あらたに対応情報１０１を生成しない。これにより、対象ブロックについての同一の内部状態を対応付けた対応情報１０１が何度も生成されないため、ブロックの性能値の見積もり時に省メモリ化を図ることができる。
【０１２４】
（実施例２）
実施例２では、第１ブロックについての内部状態と性能値とを対応付けた対応情報に、第１ブロックのつぎに実行する第２ブロックについて以前実行された時に生成された対応情報を関連付けておく。これにより、性能値表から検出された内部状態を対応付けた対応情報の検索に要する処理を高速化することができる。実施例２にかかる性能値表は図２５に示す。また、実施例２では、実施例１で説明した構成や機能については同一符号を付し、詳細な説明を省略する。
【０１２５】
図２３は、実施例２にかかるシミュレーション装置による動作例を示す説明図である。シミュレーション装置１００は、第１ブロックについての内部状態と性能値とを対応付けた対応情報２３００に、第１ブロックのつぎに実行する第２ブロックについて以前実行された時に生成された対応情報２３００を関連付けておく。具体的には、各対応情報２３００が内部状態と性能値とつぎのブロックのポインタとつぎの対応情報２３００のポインタとを有する。つぎのブロックのポインタは、つぎのブロックについての実行コードｅｃが記憶された記憶領域を示すアドレスである。つぎの対応情報２３００のポインタは、生成されたつぎのブロックについての対応情報２３００が記憶された記憶領域を示すアドレスである。図２３の例では、各実行コードｅｃ、機能コードｃ１、タイミングコードｃ２、対応情報２３００に付された「−番号」はいずれのブロックの対応情報であるかを示す。
【０１２６】
図２３の例では、各対応情報２３００に付された「−アルファベット」は内部状態を識別するための情報である。図２３の例では、対応情報２３００−１−Ａ内のつぎのブロックのポインタとして、第２ブロックについての実行コードｅｃ−２のポインタが設定される。さらに、対応情報２３００−１−Ａ内のつぎの対応情報のポインタとして、第２ブロックについての対応情報２３００−２−ｘが設定される。
【０１２７】
シミュレーション装置１００は、第２ブロックがあらたに対象ブロックとなったときに検出した内部状態が、第１ブロックについての対応情報２３００に関連付けられた第２ブロックについての対応情報２３００が対応付けた内部状態と一致するか否かを判断する。
そして、一致する場合、シミュレーション装置１００は、関連付けられた対応情報２３００を用いて第２ブロックについての実行コードｅｃを実行する。これにより、使用される可能性が高い対応情報２３００を関連付けておくことにより、性能値表から検出された内部状態を対応付けた対応情報２３００の検索に要する処理を高速化することができる。
【０１２８】
（実施例２にかかるシミュレーション装置１００の機能的構成例）
図２４は、実施例２にかかるシミュレーション装置の機能的構成例を示すブロック図である。シミュレーション装置１００は、コード変換部１４０１と、性能シミュレーション実行部１４０２と、シミュレーション情報収集部１４０３と、を有する。シミュレーション装置１００は、ターゲットプログラムｐｇｒと、タイミング情報１４００と、予測情報４と、を得て、シミュレーション情報１４３０を出力する。
【０１２９】
コード変換部１４０１からシミュレーション情報収集部１４０３の処理は、例えば、ＣＰＵがアクセス可能なディスク２０５などの記憶装置に記憶されたシミュレーションプログラムにコーディングされる。そして、ＣＰＵが記憶装置に記憶されたシミュレーションプログラムを読み出して、シミュレーションプログラムにコーディングされている処理を実行する。これにより、コード変換部１４０１からシミュレーション情報収集部１４０３の処理が実現される。
【０１３０】
コード変換部１４０１は、内部状態と性能値とが対応付けられた対応情報２３００と、対応情報２３００によって対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出可能な実行コードｅｃと、を生成する。具体的には、コード変換部１４０１は、ブロック分割部１４１１と、検出部１４１２と、判断部１４１３と、対応情報生成部１４１４と、実行コード生成部１４１５と、関連付け部２４０１と、を有する。
【０１３１】
性能シミュレーション実行部１４０２は、実行コードｅｃを実行することによって、対象ブロックがターゲットＣＰＵ１２００によって実行された場合の性能値を算出する。具体的には、性能シミュレーション実行部１４０２は、コード実行部１４１６と、補正部１４１７と、を有する。
【０１３２】
関連付け部２４０１は、対象ブロックが第１ブロックから第２ブロックに変化した場合、生成された第１ブロックについての対応情報２３００に、生成された第２ブロックについての対応情報２３００を関連付ける。具体的には、関連付け部２４０１は、第１ブロックについての対応情報２３００に、第２ブロックのポインタと、対応情報生成部１４１４によって生成された第２ブロックについての対応情報２３００のポインタと、を関連付ける。
【０１３３】
図２５は、実施例２にかかる性能値表例を示す説明図である。実施例２における性能値表２５００は、内部状態、命令、性能値、つぎのブロックのポインタ、つぎの対応情報のポインタのフィールドを有する。各フィールドに情報が設定されることにより、対応情報２３００がレコードとして記憶される。
【０１３４】
内部状態、命令、性能値のフィールドは、実施例１と同一であるため、詳細な説明を省略する。つぎのブロックのポインタのフィールドには、以前に対象ブロックとなったときにつぎに対象ブロックとなったブロックのポインタが設定される。つぎの対応情報のポインタのフィールドには、つぎに対象ブロックとなったときに使用された対応情報２３００のポインタが設定される。例えば、対応情報生成部１４１４は、生成する対応情報２３００のつぎに対象ブロックのポインタおよびつぎの対応情報２３００のポインタとのフィールドには「ｎｕｌｌ」を設定する。
【０１３５】
対応情報２３００−Ａでは、つぎのブロックのポインタのフィールドに「０ｘ８０００５０００」が設定され、つぎの対応情報のポインタのフィールドに「０ｘ８０００６０００」が設定される。対応情報２３００−Ｂでは、つぎのブロックのポインタのフィールドに「０ｘ８０００１０００」が設定され、つぎの対応情報のポインタのフィールドに「０ｘ８０００１５００」が設定される。
【０１３６】
また、例えば、つぎの対応情報のポインタのフィールドには、例えば、つぎの対応情報２３００へのオフセットが設定されてもよい。例えば、オフセットは、つぎのブロックのポインタとつぎの対応情報２３００のポインタとの差である。例えば、対応情報２３００−Ａであれば、つぎのブロックのポインタのフィールドに「０ｘ８０００５０００」が設定され、つぎの対応情報のポインタのフィールドに「０ｘ１０００」が設定される。これにより、つぎの対応情報２３００のポインタが「０ｘ８０００６０００」であると判断される。例えば、対応情報２３００−Ｂであれば、つぎのブロックのポインタのフィールドに「０ｘ８０００１０００」が設定され、つぎの対応情報のポインタのフィールドに「０ｘ５００」が設定される。これにより、つぎの対応情報のポインタが「０ｘ８０００１５００」であると判断される。このように、つぎの対応情報２３００へのオフセットが設定されることにより、対応情報２３００の情報量を削減することができ、省メモリ化を図ることができる。
【０１３７】
また、対象ブロックが第３ブロックから第４ブロックに変化した場合、判断部１４１３は、以前にも第３ブロックから第４ブロックに変化したか否かを判断する。具体的には、判断部１４１３は、第３ブロックについての対応情報２３００に含まれるつぎのブロックのポインタが第４ブロックのポインタと一致しているか否かを判断する。判断部１４１３は、一致していないと判断した場合、以前に第３ブロックから第４ブロックに変化していないと判断し、実施例１と同様に以前に第４ブロックが対象ブロックになったか否かを判断する。以前に第４ブロックが対象ブロックになったか否かの判断後の処理については実施例１と同様である。
【０１３８】
一方、判断部１４１３は、一致していると判断した場合、以前にも第３ブロックから第４ブロックに変化したと判断する。判断部１４１３は、第４ブロックが以前に対象ブロックになった時に第３ブロックについての対応情報２３００に関連付けられた対応情報２３００が対応付ける内部状態が、第４ブロックについて検出された内部状態と一致しているか否かを判断する。判断部１４１３は、第３ブロックについての対応情報２３００に含まれるつぎの対応情報のポインタが示す対応情報２３００が対応付けた内部状態と、検出部１４１２によって第４ブロックについて検出された内部状態と、が一致しているか否かを判断する。
【０１３９】
判断部１４１３は、一致していないと判断された場合、実施例１と同様に以前に第４ブロックが対象ブロックになったか否かを判断する。以前に第４ブロックが対象ブロックになったか否かの判断後の処理については実施例１と同様であるため、詳細な説明を省略する。
【０１４０】
一方、判断部１４１３によって一致していると判断された場合、性能シミュレーション実行部１４０２は、第４ブロックについての実行コードｅｃを、第３ブロックについて生成された対応情報２３００に関連付けられた対応情報２３００を用いて実行する。
【０１４１】
これにより、使用される可能性が高い対応情報２３００を関連付けておくことにより、性能値表２５００から検出された内部状態を対応付けた対応情報２３００の検索に要する処理を高速化することができる。
【０１４２】
（実施例２にかかるシミュレーション装置１００によるシミュレーション処理手順例）
図２６〜図２８は、実施例２にかかるシミュレーション装置によるシミュレーション処理手順例を示すフローチャートである。まず、シミュレーション装置１００は、ターゲットＣＰＵ１２００のＰＣ１２０１がつぎのブロック（対象ブロック）を示すアドレスをポイントしたか否かを判断する（ステップＳ２６０１）。シミュレーション装置１００は、ステップＳ２６０１によって対象ブロックが変化したか否かを判断する。
【０１４３】
つぎのブロック（対象ブロック）を示すアドレスをポイントしていない場合（ステップＳ２６０１：Ｎｏ）、シミュレーション装置１００は、ステップＳ２６０１へ戻る。一方、つぎのブロック（対象ブロック）を示すアドレスをポイントした場合（ステップＳ２６０１：Ｙｅｓ）、シミュレーション装置１００は、ターゲットＣＰＵ１２００の内部状態を検出する（ステップＳ２６０２）。つぎに、シミュレーション装置１００は、対象ブロックがコンパイル済みか否かを判断する（ステップＳ２６０３）。
【０１４４】
コンパイル済みでないと判断された場合（ステップＳ２６０３：Ｎｏ）、シミュレーション装置１００は、ターゲットプログラムｐｇｒから対象ブロックを分割して取得する（ステップＳ２８０１）。シミュレーション装置１００は、対象ブロックに含まれる外部依存命令を検出し（ステップＳ２８０２）、予測情報４から検出した外部依存命令についての予測ケースを取得する（ステップＳ２８０３）。シミュレーション装置１００は、対象ブロックをコンパイルすることによって得られるコードと、予測ケースでの対象ブロックの性能値を対応情報２３００により計算可能なコードと、を含む実行コードｅｃを生成して出力する（ステップＳ２８０４）。予測ケースでの対象ブロックの性能値とは、検出した外部依存命令が取得した予測ケースになった場合における対象ブロックの性能値である。
【０１４５】
シミュレーション装置１００は、予測ケースについて、検出した内部状態と、対象ブロックに含まれる各命令の基準となる性能値と、によって静的タイミング解析を行う（ステップＳ２８０５）。シミュレーション装置１００は、検出した内部状態と、タイミング解析結果である対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報２３００を生成して性能値表２５００に記録する（ステップＳ２８０６）。そして、シミュレーション装置１００は、対象ブロックの直前のブロックについての対応情報２３００に、対象ブロックのポインタと、生成した対応情報２３００のポインタと、を関連付け（ステップＳ２８０７）、ステップＳ２７０７へ移行する。対象ブロックの直前のブロックについての対応情報２３００は、対象ブロックの直前のブロックの性能値の算出に用いた対応情報２３００である。
【０１４６】
コンパイル済みであると判断された場合（ステップＳ２６０３：Ｙｅｓ）、シミュレーション装置１００は、対象ブロックを示すアドレスと、直前のブロックについての対応情報２３００のつぎのブロックのポインタと、を比較する（ステップＳ２６０４）。対象ブロックを示すアドレスとは、対象ブロックについての実行コードｅｃが記憶された記憶領域のアドレスである。シミュレーション装置１００は、対象ブロックが示すアドレスと、直前のブロックについての対応情報２３００のつぎのブロックのポインタと、が一致するか否かを判断する（ステップＳ２６０５）。一致すると判断された場合（ステップＳ２６０５：Ｙｅｓ）、シミュレーション装置１００は、直前のブロックに関連付けられたポインタが示す対応情報２３００が対応付けた内部状態と、検出した内部状態と、を比較する（ステップＳ２６０６）。
【０１４７】
そして、シミュレーション装置１００は、直前のブロックに関連付けられたポインタが示す対応情報２３００が対応付けた内部状態と、検出した内部状態と、が一致するか否かを判断する（ステップＳ２６０７）。一致すると判断された場合（ステップＳ２６０７：Ｙｅｓ）、シミュレーション装置１００は、直前のブロックに関連付けられたポインタが示す対応情報２３００を取得し（ステップＳ２６０８）、ステップＳ２７０７へ移行する。
【０１４８】
一方、ステップＳ２６０５において一致しないと判断された場合（ステップＳ２６０５：Ｎｏ）、またはステップＳ２６０７において一致しないと判断された場合（ステップＳ２６０７：Ｎｏ）のつぎに、シミュレーション装置１００は、ステップＳ２７０１へ移行する。シミュレーション装置１００は、対象ブロックについての性能値表２５００に登録された対応情報２３００が対応付けた内部状態のうち、未選択の内部状態があるか否かを判断する（ステップＳ２７０１）。
【０１４９】
未選択の内部状態がない場合（ステップＳ２７０１：Ｎｏ）、ステップＳ２８０５へ移行する。これにより、対象ブロックについて検出した内部状態ごとに対応情報２３００が生成され、対象ブロックについて実行コードｅｃは１回だけ生成される。
【０１５０】
未選択の内部状態がある場合（ステップＳ２７０１：Ｙｅｓ）、シミュレーション装置１００は、未選択の内部状態のうち、登録順に内部状態を選択する（ステップＳ２７０２）。シミュレーション装置１００は、検出した内部状態と、選択した内部状態と、を比較する（ステップＳ２７０３）。そして、シミュレーション装置１００は、一致しているか否かを判断する（ステップＳ２７０４）。一致していると判断された場合（ステップＳ２７０４：Ｙｅｓ）、シミュレーション装置１００は、選択した内部状態を対応付けた対応情報２３００を性能値表２５００から取得する（ステップＳ２７０５）。
【０１５１】
シミュレーション装置１００は、対象ブロックの直前のブロックについての対応情報２３００に、対象ブロックのポインタと、取得した対応情報のポインタと、を関連付ける（ステップＳ２７０６）。そして、シミュレーション装置１００は、取得した対応情報２３００を用いて実行コードｅｃの実行処理を行い（ステップＳ２７０７）、Ｓ２６０１へ戻る。一方、一致していないと判断された場合（ステップＳ２７０４：Ｎｏ）、シミュレーション装置１００は、ステップＳ２７０１へ戻る。
【０１５２】
以上説明したように、実施例２にかかるシミュレーション装置１００は、第１ブロックについての内部状態と性能値とを対応付けた対応情報２３００に、第１ブロックのつぎに実行する第２ブロックについての対応情報２３００を関連付けておく。これにより、性能値表から検出された内部状態を対応付けた対応情報２３００の検索に要する処理を高速化することができる。したがって、性能の見積もりを高速化することができる。
【０１５３】
また、実施例１と実施例２について、実行時間やサイクル数などの性能値に代わって消費電力量の見積もりを行ってもよい。たとえば、消費電力量の見積もりが行われる場合、各命令についての基準となる消費電力量、ターゲットＣＰＵ内の各部の消費電力量などが予め用意されていることとする。
【０１５４】
なお、実施例１および実施例２で説明したシミュレーション方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本シミュレーションプログラムは、ディスク２０５やフラッシュメモリなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本シミュレーションプログラムは、インターネット等のネットワークＮＥＴを介して配布してもよい。
【０１５５】
上述した実施の形態に関し、さらに以下の付記を開示する。
【０１５６】
（付記１）アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション装置であって、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出する検出部と、
前記検出部によって検出された前記内部状態と、検出された前記内部状態における前記対象ブロックに含まれる各命令の性能値と、を対応付けた対応情報を生成する対応情報生成部と、
前記対象ブロックが前記プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、前記検出部によって検出された前記内部状態と前記対応情報生成部によって前記対象ブロックについて生成された前記対応情報とを用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の性能値を計算する実行部と、
を有することを特徴とするシミュレーション装置。
【０１５７】
（付記２）前記対象ブロックが変化した場合、前記対象ブロックが以前に対象ブロックとなったか否かを判断する判断部と、
前記判断部によって以前に前記対象ブロックとなっていないと判断された場合、前記実行コードを生成し、前記判断部によって以前に前記対象ブロックとなっていると判断された場合、前記実行コードを生成しない実行コード生成部と、
を有し、
前記実行部は、前記実行コード生成部によって生成された前記実行コードを実行することを特徴とする付記１に記載のシミュレーション装置。
【０１５８】
（付記３）前記判断部は、以前に前記対象ブロックとなっていると判断した場合、検出された前記内部状態が、以前に前記対象ブロックとなった時に検出された前記内部状態と同一であるか否かを判断し、
前記対応情報生成部は、前記判断部によって以前に前記対象ブロックとなっていると判断され、かつ以前に前記対象ブロックとなった時に検出された前記内部状態と同一であると判断された場合、前記対応情報を生成しないことを特徴とする付記２に記載のシミュレーション装置。
【０１５９】
（付記４）前記対象ブロックが第１ブロックから第２ブロックに変化した場合、前記対応情報生成部によって生成された前記第１ブロックについての前記対応情報に、前記対応情報生成部によって生成された前記第２ブロックについての前記対応情報を関連付ける関連付け部を有し、
前記対象ブロックが第３ブロックから第４ブロックに変化した場合、前記判断部は、以前にも前記第３ブロックから前記第４ブロックに変化したか否かを判断し、以前にも前記第３ブロックから前記第４ブロックに変化したと判断した場合、前記第４ブロックが以前に前記対象ブロックになった時に前記関連付け部によって前記第３ブロックについての前記対応情報に関連付けられた前記対応情報が対応付ける前記内部状態が、前記第４ブロックについて検出された前記内部状態と一致しているか否かを判断し、
前記実行部は、前記判断部によって一致していると判断された場合、前記第４ブロックについての前記実行コードを、前記第３ブロックについて生成された前記対応情報に関連付けられた前記対応情報を用いて実行することを特徴とする付記３に記載のシミュレーション装置。
【０１６０】
（付記５）前記実行コードは、前記内部状態に対応付けられた前記対応情報から性能値を取得するコードと、取得した前記性能値により前記対象ブロックが前記プロセッサに実行された場合の性能値を計算するコードと、を含むことを特徴とする付記１〜４のいずれか一つに記載のシミュレーション装置。
【０１６１】
（付記６）前記対応情報では、検出された前記内部状態と、前記対象ブロックに含まれる命令群のうち実行時の状況に応じて複数通りの処理に分岐しうる状況依存命令を前記複数通りの処理のうちの第１処理となった場合の前記対象ブロックに含まれる各命令の性能値と、が対応付けられ、
前記実行部は、前記動作シミュレーションにおいて前記状況依存命令が前記複数通りの処理のうち前記第１処理と異なる第２処理の場合に、前記第２処理に対応する所定性能値によって前記状況依存命令の性能値を補正して前記対象ブロックが前記プロセッサに実行された場合の性能値を計算することを特徴とする付記１〜５のいずれか一つに記載のシミュレーション装置。
【０１６２】
（付記７）アウト・オブ・オーダー実行のプロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション装置であって、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記プロセッサの内部状態を検出する検出部と、
前記検出部によって検出された前記内部状態と、検出された前記内部状態における前記対象ブロックに含まれる各命令の前記プロセッサでの実行に要する消費電力量と、を対応付けた対応情報を生成する対応情報生成部と、
前記対象ブロックが前記プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、前記検出部によって検出された前記内部状態と前記対応情報生成部によって前記対象ブロックについて生成された前記対応情報とを用いて実行することにより、前記対象ブロックが前記プロセッサに実行された場合の消費電力量を計算する実行部と、
を有することを特徴とするシミュレーション装置。
【０１６３】
（付記８）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション方法であって、
第２プロセッサが、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の性能値を計算する、
処理を実行することを特徴とするシミュレーション方法。
【０１６４】
（付記９）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーション方法であって、
第２プロセッサが、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第１プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を計算する、
処理を実行することを特徴とするシミュレーション方法。
【０１６５】
（付記１０）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムであって、
第２プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の性能値を計算する、
処理を実行させることを特徴とするシミュレーションプログラム。
【０１６６】
（付記１１）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムであって、
第２プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第１プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を計算する、
処理を実行させることを特徴とするシミュレーションプログラム。
【０１６７】
（付記１２）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムを記録した記録媒体であって、
第２プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の性能値と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の性能値を内部状態と性能値とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の性能値を計算する、
処理を実行させるシミュレーションプログラムを記録したことを特徴とする記録媒体。
【０１６８】
（付記１３）アウト・オブ・オーダー実行の第１プロセッサがプログラムを実行した場合の動作シミュレーションを実行するシミュレーションプログラムを記録した記録媒体であって、
第２プロセッサに、
前記プログラムのコードを分割して得られるブロックのうち前記動作シミュレーションの対象ブロックが変化した場合、前記動作シミュレーションにおける前記第１プロセッサの内部状態を検出し、
検出した前記内部状態と、検出した前記内部状態における前記対象ブロックに含まれる各命令の前記第１プロセッサでの実行に要する消費電力量と、が対応付けられた対応情報を生成し、
前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を内部状態と消費電力量とが対応付けられた対応情報によって計算可能な実行コードを、検出した前記内部状態と前記対象ブロックについて生成した前記対応情報を用いて実行することにより、前記対象ブロックが前記第１プロセッサに実行された場合の消費電力量を計算する、
処理を実行させるシミュレーションプログラムを記録したことを特徴とする記録媒体。
【符号の説明】
【０１６９】
１００  シミュレーション装置
１０１，２３００  対応情報
１４０１  コード変換部
１４０２  性能シミュレーション実行部
１４０３  シミュレーション情報収集部
１４１１  ブロック分割部
１４１２  検出部
１４１３  判断部
１４１４  対応情報生成部
１４１５  実行コード生成部
１４１６  コード実行部
１４１７  補正部
１８００，２５００  性能値表
２４０１  関連付け部
ｅｃ  実行コード
ｃ１  機能コード
ｃ２  タイミングコード
ｓｉｍ  動作シミュレーション
ｐｇｒ  ターゲットプログラム
【図１】
2014211768.tif 000003
【図２】
2014211768.tif 000004
【図３】
2014211768.tif 000005
【図４】
2014211768.tif 000006
【図５】
2014211768.tif 000007
【図６】
2014211768.tif 000008
【図７】
2014211768.tif 000009
【図８】
2014211768.tif 000010
【図９】
2014211768.tif 000011
【図１０】
2014211768.tif 000012
【図１１】
2014211768.tif 000013
【図１２】
2014211768.tif 000014
【図１３】
2014211768.tif 000015
【図１４】
2014211768.tif 000016
【図１５】
2014211768.tif 000017
【図１６】
2014211768.tif 000018
【図１７】
2014211768.tif 000019
【図１８】
2014211768.tif 000020
【図１９】
2014211768.tif 000021
【図２０】
2014211768.tif 000022
【図２１】
2014211768.tif 000023
【図２２】
2014211768.tif 000024
【図２３】
2014211768.tif 000025
【図２４】
2014211768.tif 000026
【図２５】
2014211768.tif 000027
【図２６】
2014211768.tif 000028
【図２７】
2014211768.tif 000029
【図２８】
2014211768.tif 000030