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