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