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