補正装置、補正方法、および補正プログラム
【課題】シミュレーションの精度の向上を図ること。
【解決手段】シミュレーション装置100は、先行するブロック102の末尾命令で指定される第1の資源群とブロック103の先頭命令で指定される第2の資源群とを検出し、第1および第2の資源群に共通して含まれる資源r1を特定する。次に、シミュレーション装置100は、ブロック103でr1を使用する時刻t+1と、先行するブロック102で資源の使用が終了し、後続のブロックで資源が使用可能となる時刻t+2とから求めた遅延時間1サイクルを算出する。続けて、シミュレーション装置100は、遅延時間を用いてADD命令の実行時刻を補正する。
【解決手段】シミュレーション装置100は、先行するブロック102の末尾命令で指定される第1の資源群とブロック103の先頭命令で指定される第2の資源群とを検出し、第1および第2の資源群に共通して含まれる資源r1を特定する。次に、シミュレーション装置100は、ブロック103でr1を使用する時刻t+1と、先行するブロック102で資源の使用が終了し、後続のブロックで資源が使用可能となる時刻t+2とから求めた遅延時間1サイクルを算出する。続けて、シミュレーション装置100は、遅延時間を用いてADD命令の実行時刻を補正する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、シミュレーション結果を補正する補正装置、補正方法、および補正プログラムに関する。
【背景技術】
【0002】
従来から、CPU(Central Processing Unit)の機能、性能をシミュレーションする技術が開示されている。たとえば、評価対象となるターゲットCPUに対して、シミュレーションを実行するホストCPUで動作できるようにプログラムコードを変換して、ターゲットCPUの機能、性能、電力をシミュレーションする技術が存在する。
【0003】
たとえば、シミュレーション前に、ターゲットCPUのコードを、サブルーチンの単位でホスト計算機で直接実行可能なホストコードに変換しておき、サブルーチンの単位で分割したブロックの入口と出口の間で使用されるレジスタを解析するものが存在する。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平9−6646号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、上述した従来技術において、ブロックごとにシミュレーションを実行するので、複数のブロックを連続してシミュレーションを実行すると、実際の実行結果から乖離した、精度の悪いシミュレーション結果となる。
【0006】
1つの側面では、本発明は、シミュレーションの精度を向上できる補正装置、補正方法、および補正プログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
本発明の一側面によれば、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、検出された第1および第2の資源群に共通して含まれる資源を特定し、特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出し、算出された遅延時間に基づいて、取得部によって取得されたいずれかのブロックの命令の実行時刻を補正し、補正されたいずれかのブロックの命令の実行時刻を出力する補正装置、補正方法、および補正プログラムが提案される。
【0008】
また、本発明の他の側面によれば、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および命令で消費する電力を取得し、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、検出された第1および第2の資源群に共通して含まれる資源を特定し、特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出し、算出された遅延時間に応じた消費電力にて、取得部によって取得されたいずれかのブロックの命令の実行で消費する電力を補正し、補正されたいずれかのブロックの命令で消費する電力を出力する補正装置、補正方法、および補正プログラムが提案される。
【発明の効果】
【0009】
本発明の一様態によれば、シミュレーションの精度向上を図ることができる。
【図面の簡単な説明】
【0010】
【図1】図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。
【図2】図2は、シミュレーション装置のハードウェアの一例を示すブロック図である。
【図3】図3は、シミュレーション装置の機能例を示すブロック図である。
【図4】図4は、ターゲットコードの一例を示す説明図である。
【図5】図5は、タイミング情報の記憶内容の一例を示す説明図である。
【図6】図6は、予測情報の記憶内容の一例を示す説明図である。
【図7】図7は、命令補正値情報の記憶内容の一例を示す説明図である。
【図8】図8は、演算ユニット情報の記憶内容の一例を示す説明図である。
【図9】図9は、ターゲットプログラムの実行タイミングの一例を示す説明図である。
【図10】図10は、ホストコードの生成例を示す説明図である。
【図11】図11は、第1の補正部の処理コード例を示す説明図である。
【図12】図12は、第1の補正部による実行結果の第1の補正例を示す説明図である。
【図13】図13は、第1の補正部による実行結果の第2の補正例を示す説明図である。
【図14】図14は、第1の補正部による実行結果の第3の補正例を示す説明図である。
【図15】図15は、第2の補正部による実行結果の第1の補正例を示す説明図である。
【図16】図16は、第2の補正部による実行結果の第2の補正例を示す説明図である。
【図17】図17は、第2の補正部による実行結果の第3の補正例を示す説明図である。
【図18】図18は、第2の補正部による実行結果の第4の補正例を示す説明図である。
【図19】図19は、コード変換部の処理例を示すフローチャートである。
【図20】図20は、シミュレーション実行部の処理例を示すフローチャートである。
【図21】図21は、シミュレーション結果の第1の補正処理例を示すフローチャートである。
【図22】図22は、シミュレーション結果の第2の補正処理例を示すフローチャートである。
【図23】図23は、実施の形態2にかかるシミュレーション装置の補正例を示す説明図である。
【発明を実施するための形態】
【0011】
以下に添付図面を参照して、開示の補正装置、補正方法、および補正プログラムの実施の形態を詳細に説明する。なお、本実施の形態にかかる補正装置の例として、ターゲットCPUのシミュレーションを行うシミュレーション装置が、本実施の形態にかかる補正処理を実行する、という状態を想定して説明を行う。
【0012】
図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。シミュレーション装置100は、ターゲットCPUにおける命令実行の性能シミュレーションを実行する装置である。具体的に、シミュレーション装置100は、ターゲットCPU用のプログラムであるターゲットプログラム101をホストCPUで動作させるため、インタープリタ方式を用いる。または、シミュレーション装置100は、JIT(Just−In−Time)コンパイラ方式といった方式によりホストコードを生成し、ホストコードを実行する。
【0013】
ここで、ターゲットCPUは、シミュレーションの対象となるCPUの制御モデルである。シミュレーション装置100は、ターゲットCPUの命令実行の性能シミュレーションとして各命令のサイクルシミュレーション情報を出力する。
【0014】
ここで、ターゲットCPUは、たとえば組み込みシステム等で採用されるRISC(Reduced Instruction Set Computer)アーキテクチャのCPUである。ホストCPUに相当するシミュレーション装置100は、たとえばCISC(Complex Instruction Set Computer)アーキテクチャのCPUを搭載するコンピュータである。
【0015】
この状態で、シミュレーション装置100は、ターゲットプログラム101が所定のブロックで分割されたブロック102、ブロック103を連続してシミュレーションする。ブロック102の末尾命令は、ロード命令(以下、「LD命令」と称す)であり、ニーモニックコードが“LD r1,[r2]”となる。また、ブロック103の先頭命令は、加算命令(以下、「ADD命令」と称す)であり、ニーモニックコードが、“ADD r1,r1,r3”となる。LD命令、ADD命令は、ターゲットCPUのパイプラインに投入されて実行される。
【0016】
次に、本実施の形態にかかる補正処理が行われる前のシミュレーション結果である図1(A)と、本実施の形態にかかる補正処理が行われた後のシミュレーション結果である図1(B)と、について説明する。なお、図1(A)と図1(B)に共通する説明として、LD命令、ADD命令は、フェッチステージ(図中「f」で表示し、以下、「fステージ」と称する)、デコードステージ(図中「d」で表示し、以下、「dステージ」と称する)、エグゼキュートステージ(図中「e」で表示し、以下、「eステージ」と称する)を順に実行する。fステージ、dステージは命令によらず1サイクルで処理を行い、eステージは、LD命令が2サイクル、ADD命令が1サイクルで処理を行う。また、LD命令のeステージの実行時刻をtとする。
【0017】
図1(A)で示すシミュレーション結果は、LD命令の開始から、ADD命令の終了までを4サイクルで行っている。しかしながら、t+1にて、レジスタr1が競合しており、ターゲットCPUが実際に処理を行う場合、ADD命令のeステージの実行時刻はt+2となり、図1(A)で示すシミュレーション結果は、実際の性能値と異なるため、精度が悪い。
【0018】
次に、図1(B)で示すシミュレーション結果は、r1がADD命令で補正前に使用される時刻t+1と、r1のLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出し、ADD命令のeステージの実行時刻を補正した後の状態である。図1(B)では、LD命令の開始から、ADD命令の終了までを5サイクルで行っており、シミュレーション結果が実際の実行時間と等しくなり、精度が向上する。
【0019】
このように、本実施の形態にかかる補正処理は、後続のブロックの先頭命令で資源を使用する時刻と、先行するブロックで資源の使用が終了し、後続のブロックで資源が使用可能となる時刻とから求めた遅延時間を用いて補正する。以降、図2〜図22にて、図1で示した動作を行うシミュレーション装置100について説明を行う。
【0020】
(シミュレーション装置100のハードウェア)
図2は、シミュレーション装置のハードウェアの一例を示すブロック図である。図2において、シミュレーション装置100は、CPU201と、ROM(Read‐Only Memory)202と、RAM(Random Access Memory)203と、を含む。また、シミュレーション装置100は、磁気ディスクドライブ204と、磁気ディスク205と、光ディスクドライブ206と、光ディスク207と、を含む。また、ユーザやその他の機器との入出力装置としてシミュレーション装置100は、ディスプレイ208と、I/F(Interface)209と、キーボード210と、マウス211と、を含む。また、各部はバス212によってそれぞれ接続されている。
【0021】
ここで、CPU201は、シミュレーション装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶している。RAM203は、CPU201のワークエリアとして使用される。磁気ディスクドライブ204は、CPU201の制御にしたがって磁気ディスク205に対するデータのリード/ライトを制御する。磁気ディスク205は、磁気ディスクドライブ204の制御で書き込まれたデータを記憶する。
【0022】
光ディスクドライブ206は、CPU201の制御にしたがって光ディスク207に対するデータのリード/ライトを制御する。光ディスク207は、光ディスクドライブ206の制御で書き込まれたデータを記憶したり、光ディスク207に記憶されたデータをコンピュータに読み取らせたりする。なお、ROM202、磁気ディスク205、光ディスク207のいずれかの記憶装置に、本実施の形態にかかるシミュレーションプログラムが格納されていてもよい。
【0023】
ディスプレイ208は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ208は、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【0024】
I/F209は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク213に接続され、このネットワーク213を介して他の装置に接続される。そして、I/F209は、ネットワーク213と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F209には、たとえばモデムやLANアダプタなどを採用することができる。
【0025】
キーボード210は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード210は、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス211は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。また、シミュレーション装置100は、マウス211の代わりとして、ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
【0026】
(シミュレーション装置100の機能)
次に、シミュレーション装置100の機能について説明する。図3は、シミュレーション装置の機能例を示すブロック図である。シミュレーション装置100は、コード変換部301と、シミュレーション実行部302と、シミュレーション情報収集部303と、を含む。この制御部となる機能(コード変換部301〜シミュレーション情報収集部303)は、記憶装置に記憶されたプログラムをCPU201が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などである。または、I/F209を経由して他のCPUが実行することにより、その機能を実現してもよい。
【0027】
また、コード変換部301は、分割部311、予測シミュレーション実行部312、生成部313、書込部314を有する。シミュレーション実行部302は、コード実行部321、第1の補正部となる補正部322、第2の補正部となる補正部323を有する。さらに、補正部323は、取得部331、判定部332、検出部333、特定部334、算出部335、補正部336、出力部337を有する。
【0028】
また、シミュレーション装置100は、ターゲットプログラム101、タイミング情報351、予測情報352、命令補正値情報353、演算ユニット情報354、ブロック資源情報355、シミュレーション情報356にアクセス可能である。ターゲットプログラム101、タイミング情報351〜シミュレーション情報356は、シミュレーション装置100がアクセス可能な記憶領域に格納される。
【0029】
ブロック資源情報355は、ブロックと先頭または末尾との組合せごとに、命令で指定される資源を記憶する情報である。ここで、資源とは、読込対象または書込対象となるレジスタやメモリ、または実行対象となる演算ユニットである。なお、以下の表記にて、末尾記号“_xxxt”が付与されたブロック資源情報355は、ブロックxxxの末尾命令で指定された資源群を記憶している。また、末尾記号“_xxxh”が付与されたブロック資源情報355は、ブロックxxxの先頭命令で指定された資源群を記憶している。
【0030】
コード変換部301は、ターゲットCPUのプログラムの実行時に、ターゲットCPUが実行するターゲットプログラム101から、シミュレーションを実行するホストCPUのホストコード305を生成する。
【0031】
分割部311は、ターゲットプログラム101を所定のブロックに分割する。分割されるブロック単位は、たとえば、一般的なベーシックブロック(分岐から次の分岐前までのコード)単位でよく、または、予め定められた任意のコード単位でよい。
【0032】
予測シミュレーション実行部312は、タイミング情報351と予測情報352とを得て、入力されたブロックをある実行結果を前提とした条件下で実行する性能シミュレーションを行う。具体的に、予測シミュレーション実行部312は、予測情報352をもとに、入力されたブロックに含まれる外部依存命令の予測結果を設定する。続けて、予測シミュレーション実行部312は、タイミング情報351を参照して、設定した予測結果を前提とする場合の命令を実行して、命令実行の進み具合をシミュレーションする。予測シミュレーション実行部312は、シミュレーション結果として、ブロックに含まれる各命令の実行時間(サイクル数)を求める。
【0033】
生成部313は、予測シミュレーション実行部312のシミュレーション結果をもとに、処理したブロックに対応するホストコードとして、設定された予測結果における命令実行時の性能シミュレーションを行うためのホストコードを生成する。
【0034】
生成部313は、ブロックのターゲットコードをもとに、外部依存命令が予測結果である場合の命令実行を行うホストコードを生成し、さらに、各命令の実行時間を加算して、ブロックの処理時間を計算する処理を行うシミュレーション用コードを組み込む。
【0035】
たとえば、生成部313は、データのLD命令の予測結果として“キャッシュヒット”が設定されている処理については、ブロック内のLD命令によるキャッシュアクセスが“ヒット”である場合の処理実行をシミュレーションして、予測結果での実行時間を求める。また、生成部313は、LD命令によるキャッシュアクセスが“ミス”である場合の実行時間、予測結果である“ヒット”時の実行時間の加算/減算を用いた補正計算により求める処理を行うホストコードを生成する。
【0036】
書込部314は、ブロックの先頭から所定数の命令で指定される資源群と、ブロックの末尾から所定数の命令で指定される資源群とをブロック資源情報355に書き込む。
【0037】
シミュレーション実行部302は、生成部313が生成したホストコード305を実行して、ターゲットプログラム101を実行するターゲットCPUの命令実行の機能および性能シミュレーションを行う。コード実行部321は、ホストコード305を用いて、ターゲットプログラム101を実行する。
【0038】
第1の補正部となる補正部322は、プログラムの実行中に、外部依存命令の実行結果が、設定されていた予測結果と異なる場合に、既に求めた予想ケースでの実行時間を補正する。
【0039】
補正部322は、外部依存命令に与えられるペナルティ時間、外部依存命令の前後で実行される命令の実行時間、1つ前の命令の遅延時間などを用いて補正を行う。なお、補正処理の詳細は後述する。シミュレーション情報収集部303は、性能シミュレーションの実行結果として、各命令の実行時刻と実行時間を含むシミュレーション情報356を収集する。
【0040】
第2の補正部となる補正部323は、ブロック間の影響による補正を行う。取得部331は、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得する機能を有する。なお、命令の実行時刻とは、命令が実行される開始時刻でもよいし、終了時刻でもよい。以下の説明では、実行時刻を、命令が実行される開始時刻であるとする。たとえば、取得部331は、ブロック103のADD命令のeステージの実行時刻がt+1であることを取得する。なお、ブロックの命令の実行時刻は、予測シミュレーション実行部312、コード実行部321によって生成され、シミュレーション情報356に格納されている。したがって、取得部331は、シミュレーション情報356からブロックの命令の実行時刻を取得する。
【0041】
また、取得部331は、末尾命令が分岐命令である場合、分岐命令の分岐予測結果を取得してもよい。分岐予測結果は、ホストコード305を実行したコード実行部321から取得する。なお、取得結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0042】
判定部332は、末尾命令が分岐命令である場合、末尾命令のシミュレーションの実行結果にて分岐予測結果が的中であったか否かを判定する機能を有する。なお、判定結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0043】
検出部333は、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する機能を有する。なお、末尾命令、先頭命令は、それぞれ1つの命令であってもよいし、先行ブロックの末尾から所定数の命令、いずれかのブロックの先頭から所定数の命令、であってよい。
【0044】
所定数をいくつに設定するかは、ターゲットCPUの特性に基づいて、予め決定しておく。たとえば、ターゲットCPUがスーパスカラプロセッサであれば、所定数を、同時に行える命令数とする。または、所定数を、ターゲットCPUが実行可能な命令のうち、eステージの実行時間が最長となるサイクルに対応する数としてもよい。たとえば、最長となる命令のサイクル数が4であるとき、該当の命令は、3命令先まで影響を及ぼすため、所定数を3と設定する。
【0045】
また、検出部333は、判定部332によって末尾命令の分岐予測が的中したと判定された場合、第1および第2の資源群を検出してもよい。また、検出部333は、先行ブロックの末尾命令で指定される書込対象の記憶領域群を第1の資源群として、いずれかのブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出してもよい。なお、命令で指定されるレジスタのうち、どれが書込対象なのか読込対象なのかという基準は、タイミング情報351にて記載されている。また、検出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0046】
特定部334は、検出部333によって検出された第1および第2の資源群に共通して含まれる資源を特定する機能を有する。たとえば、第1の資源群が、r1とロードユニットであり、第2の資源群が、r1、r3、整数演算ユニットである場合、特定部334は、r1を特定する。
【0047】
また、特定部334は、共通して含まれる資源のうち、該当の資源が先頭命令で使用される時刻と該当の資源の末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。たとえば、共通して含まれる資源として、r1とr3が存在した場合、r1の時刻の差が1サイクル、r3の時刻の差が3サイクルであれば、r3を特定する。
【0048】
また、特定部334は、共通して含まれる資源が演算ユニットであり、かつプログラムコードのシミュレーション対象となるCPUが有する演算ユニットの個数が末尾命令および先頭命令にて指定された個数より少ない場合、演算ユニットを特定してもよい。たとえば、ターゲットCPUが有する整数演算ユニットが1個であり、末尾命令および先頭命令にて指定された個数が2個である場合、整数演算ユニットを特定する。なお、特定された資源の情報は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0049】
算出部335は、特定部334によって特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出する機能を有する。たとえば、算出部335は、特定された資源が先頭命令で使用される時刻がt+1であり、末尾命令での使用が終了する時刻がt+3であれば、遅延時間をt+3−(t+1)=2サイクルとして算出する。なお、算出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0050】
補正部336は、算出部335によって算出された遅延時間にて、取得部331によって取得されたいずれかのブロックの命令の実行時刻を補正する機能を有する。たとえば、補正部336は、遅延時間が2サイクルであれば、いずれかのブロックの命令のeステージの実行時刻に2サイクルを加算する。
【0051】
出力部337は、補正部336によって補正されたいずれかのブロックの命令の実行時刻を出力する機能を有する。なお、出力先は、シミュレーション情報356であったり、または、RAM203であったりしてもよい。たとえば、出力部337は、遅延時間が加算された命令の実行時刻を出力する。
【0052】
また、出力部337は、特定部334によって共通して含まれる資源が特定されない場合、取得部331によって取得されたいずれかのブロックの命令の実行時刻を出力してもよい。
【0053】
図4は、ターゲットコードの一例を示す説明図である。図4では、ターゲットコードの3つの命令を示している。ブロック401には、ターゲットコードの3つの命令、命令402〜命令404が含まれている。命令402は、LD命令であり、ニーモニックコードが“LD r2,[r1]”となる。命令403は、乗算命令(以下、「MULT命令」と称す)であり、ニーモニックコードが“MULT r5,r3,r4”となる。命令403は、ADD命令であり、ニーモニックコードが、“ADD r6,r2,r5”となる。ブロック401は、命令402〜命令404の順でターゲットCPUのパイプラインに投入されて実行される。
【0054】
各命令は、命令のうちの動作を示すオペコードと、動作の対象となるオペランドを含む。命令402〜命令404のオペコードは、LD、MULT、ADDとなり、r1〜r6で示される汎用レジスタがオペランドとなる。
【0055】
図5は、タイミング情報の記憶内容の一例を示す説明図である。タイミング情報351は、命令実行時の各処理要素(ステージ)と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間(ペナルティサイクル数)とを示す情報である。
【0056】
外部依存命令とは、命令の実行結果がターゲットCPU外の外部環境に依存する処理のことである。命令の実行結果がターゲットCPU外の外部環境に依存するような処理として、たとえば、命令キャッシュ、データキャッシュ、TLB(Translation Lookaside Buffer)検索などを行ったり、または、分岐予測、コール/リターンのスタックなどの処理を行ったりする命令である。具体的な外部依存命令としては、ロード命令またはストア命令等である。図5で示すタイミング情報351は、レコード351−1〜レコード351−3を記憶している。
【0057】
タイミング情報351は、命令種別、ソースレジスタ、宛先レジスタ、ペナルティという4つのフィールドを含む。命令種別フィールドには、命令のオペコードが格納される。ソースレジスタフィールドには、オペランドのうち入力元となるレジスタが格納される。宛先レジスタフィールドには、オペランドのうち出力先となるレジスタが格納される。ペナルティフィールドには、実行結果に応じた遅延時間が格納される。
【0058】
レコード351−1は、LD命令について、ソースレジスタrs1(r1)が1番目の処理要素(e1)で、宛先レジスタrd(r2)が2番目の処理要素(e2)で使用可能となることを示している。また、レコード351−1は、キャッシュミスが発生した場合に、6サイクルの遅延時間が発生することを示している。なお、exは、パイプラインステージのうちエグゼキュートステージのx番目の処理要素であることを示している。xは1以上の整数である。
【0059】
また、レコード351−2は、MULT命令では、第1ソースレジスタrs1(r3)が処理要素e1、第2ソースレジスタrs2(r4)が処理要素e2、宛先レジスタrd(r5)は処理要素e3で使用可能であることを示している。また、レコード351−3は、ADD命令では、第1ソースレジスタrs1(r2)、第2ソースレジスタrs2(r5)が処理要素e1、宛先レジスタrd(r6)は1番目の処理要素(e1)で使用可能であることを示している。
【0060】
図6は、予測情報の記憶内容の一例を示す説明図である。予測情報352は、処理内容、予測結果という2つのフィールドを含む。処理内容フィールドには、ターゲットコードの外部依存命令の処理内容が格納される。予測結果フィールドには、外部依存命令の処理の予測結果が格納される。図6で示す予測情報352は、レコード352−1〜レコード352−5を記憶している。図6で示す予測情報352は、たとえば、命令キャッシュ、データキャッシュ、TLB検索、分岐予測、コール/リターンが全てヒットするという予測結果を示している。
【0061】
図7は、命令補正値情報の記憶内容の一例を示す説明図である。図7で示す命令補正値情報353は、レコード351−1〜レコード351−3を記憶している。命令補正値情報353は、命令種別、補正値という2つのフィールドを含む。命令種別フィールドには、命令のオペコードが格納される。補正値フィールドには、命令に用いられるレジスタがeステージで使用されるサイクル数が格納される。たとえば、レコード353−1は、LD命令が、レジスタを2サイクル使用することを示している。
【0062】
図8は、演算ユニット情報の記憶内容の一例を示す説明図である。図8で示す演算ユニット情報354は、レコード354−1〜レコード354−4を記憶している。演算ユニット情報354は、演算ユニット名、補正値、個数という3つのフィールドを含む。演算ユニット名フィールドには、演算ユニット名が格納される。補正値フィールドには、該当の演算ユニットがeステージ実行時に使用するサイクル数が格納される。個数フィールドには、ターゲットCPUが有する演算ユニットの個数が格納される。たとえば、レコード354−1は、整数演算ユニットがeステージ実行時に1サイクル使用し、ターゲットCPUに整数演算ユニットが2個あることを示している。
【0063】
図9は、ターゲットプログラムの実行タイミングの一例を示す説明図である。図9(A)で示す説明図は、LD命令の実行結果がキャッシュヒットした場合の実行タイミングを示しており、図9(B)で示す説明図は、LD命令の実行結果がキャッシュミスした場合の実行タイミングを示している。
【0064】
初めに、図9(A)、図9(B)で共通する説明として、各命令は、fステージ、dステージ、eステージを順に実行する。fステージ、dステージは命令によらず1サイクルで処理を行い、eステージは、各命令によって異なるサイクル数で処理を行う。具体的な各命令のeステージにかかるサイクル数については、命令補正値情報353の補正値フィールドに格納されている。
【0065】
タイミング情報351から、パイプラインに各命令が投入されるタイミングは、LD命令のeステージの実行時刻をタイミングtとすると、MULT命令のeステージの実行開始はタイミングt+1となる。同様に、ADD命令のeステージの実行開始はタイミングt+2となる。
【0066】
ADD命令の第1ソースレジスタ(r2)と第2ソースレジスタ(r5)は、LD命令とMULT命令で使用されている。したがって、ADD命令のeステージの実行開始は、LD命令とMULT命令の実行完了のタイミングt+4以降となり、2サイクル分の待機時間(2サイクル分のストール)が生じる。
【0067】
この状態で、図9(A)では、ブロック401の命令実行をシミュレーションした場合に、LD命令の実行結果がキャッシュヒットであるケースでは、ブロック401の実行時間がt−2からt+5までの7サイクルとなる。
【0068】
次に、図9(B)は、ブロック401のLD命令の実行結果がキャッシュミスである場合のタイミング例を示している。LD命令の結果がキャッシュミスである場合、タイミング情報351に、ペナルティとして、再実行が行える時間が設定されているため、ペナルティサイクルが遅延時間として追加される。本実施の形態における遅延時間は、タイミング情報351のペナルティフィールドに格納された6クロック分となる。
【0069】
したがって、2番目の処理要素(e2)の実行は、タイミングt+7に遅延する。LD命令の次に実行されるMULT命令は、遅延の影響を受けずにそのまま実行されるが、ADD命令は、LD命令の実行完了のタイミングt+8以降となり、4サイクル分の待機時間(4サイクル分のストール)が生じる。
【0070】
このように、図4(B)に示すように、ブロック401の命令実行をシミュレーションした場合に、LD命令の実行結果がキャッシュミスであるケースでは、ブロック401の実行時間がt−2からt+9までの11サイクルとなる。
【0071】
図10は、ホストコードの生成例を示す説明図である。図10で示す説明図では、ターゲットコードからホストコードの生成例について説明する。図10(A)は、ターゲットコードから機能シミュレーション用となる機能コードが生成される例を示す図であり、図10(B)は、機能コードにサイクルシミュレーション用コードが組み込まれる例を示す図である。ホストコードには、ターゲットコードに対応する機能コードと、ブロックの実行時間を求めるためのコードであるサイクルシミュレーション用コードが含まれる。
【0072】
図10(A)に示すように、シミュレーション装置100は、ターゲットコードから機能コードを生成する。具体的に、ターゲットコードInst_Aは、ホストコードHost_Inst_A0_func、Host_Inst_A1_funcに変換される。同様に、ターゲットコードInst_Bは、ホストコードHost_Inst_B0_func、Host_Inst_B1_func、Host_Inst_B2_func、…に変換される。
【0073】
次に、図10(B)に示すように、シミュレーション装置100は、機能コードに、サイクルシミュレーション用コードを組み込む。具体的に、ターゲットコードInst_Aのサイクルシミュレーション用コードHost_Inst_A2_cycle、Host_Inst_A3_cycleが、Host_Inst_A1_funcの次に組み込まれる。同様に、ターゲットコードInst_Bのサイクルシミュレーション用コードHost_Inst_B4_cycle、Host_Inst_B5_cycleが、Host_Inst_B3_funcの次に組み込まれる。ターゲットコードInst_Cについても、ターゲットコードInst_A、ターゲットコードInst_B同様に変換される。
【0074】
なお、サイクルシミュレーション用コードは、各命令のeステージの実行時間(所要サイクル数)を定数化し、各命令のeステージの実行時間を合計してブロックの処理時間を求めるコードである。これにより、ブロック実行中の進み具合を示す情報を得ることができる。
【0075】
ここで、ホストコードのうち、機能コード、外部依存命令以外の命令についてのサイクルシミュレーション用コードは既知のコードを使用して実施できるので、具体例の説明を省略する。外部依存命令についてのサイクルシミュレーション用コードは、補正処理を呼び出すヘルパー関数として用意される。ヘルパー関数については図11にて後述する。
【0076】
図11は、第1の補正部の処理コード例を示す説明図である。第1の補正部となる補正部322は、図11で示す処理コード1101のようなヘルパー関数モジュールとして実施される。本実施の形態では、たとえば、LD命令のキャッシュの実行結果ごとにシミュレーションを行う従来の関数「cache_ld(address)」の代わりに、ヘルパー関数「cache_ld(address,rep_delay,pre_delay)」がホストコードに組み込まれることにより、実現している。
【0077】
ヘルパー関数の第2引数“rep_delay”は、LD命令の返り値を使用する次の命令のeステージの実行までに、ペナルティ時間のうち遅延時間として処理されなかった時間(猶予時間)である。ヘルパー関数の第3引数“pre_delay”は、1つ前の命令から受ける遅延時間である。“pre_delay”が“−1”である場合は、前の命令に遅延がないことを示す。“rep_delay”と“pre_delay”は、性能シミュレーション結果とタイミング情報351との静的分析処理の結果から得られる時間情報である。
【0078】
また、図11で示す処理コード1101がLD命令についての例であるため、pre_delayは、1つ前のLD命令の遅延時間分を示す。
【0079】
さらに、処理コード1101では、current_timeが現在のタイミングを示し、preld_timeが現在のタイミングから1つ前のLD命令のeステージの実行時刻を示し、avail_delayが有効遅延時間を示す。cache_miss_latencyは、キャッシュミス時のペナルティ時間を示す。
【0080】
図11にて、補正部322は、current_timeとpreld_timeとの差がpre_delayより大きい場合、preld_timeとcurrent_timeまでの時間でpre_delayを調整してavail_delayを求める。次に、補正部322は、実行結果がキャッシュミスであれば、予測結果の誤りであり、avail_delayにcache_miss_latencyを加算して、猶予時間rep_delayをもとに、LD命令のeステージの実行時間を補正する。次に、図12〜図14にて、補正部322によるLD命令の実行結果に対する補正例を示す。
【0081】
図12は、第1の補正部による実行結果の第1の補正例を示す説明図である。図12では、1つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。
【0082】
図12の例では、ブロック401の3命令の性能シミュレーションが実行される。図12(A)は、予測結果が「キャッシュヒット」の場合の命令実行タイミングチャート例を示す図である。この予測ケースにおいて、3番目に実行されるADD命令に、2サイクルストールが生じている。
【0083】
図12(B)は、予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、LD命令の実行結果がキャッシュミスであると、ペナルティサイクル(6サイクル)分の遅延が生じる。そのため、MULT命令は、遅延の影響を受けずに実行されるが、ADD命令のeステージの実行は、LD命令の完了を待つため、4サイクル分遅延することになる。
【0084】
図12(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、LD命令の実行結果がキャッシュミスであるので(予測結果のミス)、残りのeステージの実行時間(2−1=1サイクル)に所定のキャッシュミス時のペナルティ時間(6サイクル)を加算して有効遅延時間(7サイクル)とする。有効遅延時間は、最大の遅延時間となる。
【0085】
さらに、補正部322は、次のMULT命令のeステージの実行時間(3サイクル)を得て、次命令のeステージの実行時間が遅延時間を超過しないと判定して、有効遅延時間から次命令のeステージの実行時間を差し引いた時間(7−3=4サイクル)を、LD命令の遅延が生じたeステージの実行時間(遅延時間)とする。また、補正部322は、有効遅延時間から上記の遅延時間を差し引いた時間(3サイクル)を猶予時間とする。猶予時間は、ペナルティとしての遅延が猶予された時間である。
【0086】
補正部322は、ヘルパー関数cache_ld(address,rep_delay,pre_delay)で、猶予時間rep_delay=3、前命令の遅延時間pre_delay=−1(遅延なし)を返す。
【0087】
この補正により、LD命令のeステージの実行時間は、実行された時間と遅延時間を加算した実行時間(1+4=5サイクル)となり、実行完了のタイミングt1から、後続のMULT命令、ADD命令のeステージの実行時間が計算される。
【0088】
このように、シミュレーション装置100は、補正したLD命令のeステージの実行時間に予測シミュレーション実行部312の処理結果で求められていたMULT命令とADD命令の各々のeステージの実行時間を加算することで、ブロックの実行時間を得られる。図12(C)の例では、シミュレーション装置100は、LD命令のeステージの実行時間5サイクルに、MULT命令とADD命令の各々のeステージの実行時間となる3サイクル、1サイクルを加算する。
【0089】
よって、シミュレーション装置100は、実行結果が予測と異なる命令のeステージの実行時間に加算または減算による補正処理を行い、その他の命令については、予測結果に基づくシミュレーション時に求められたeステージの実行時間を加算する。これにより、シミュレーション装置100は、高精度に、キャッシュミス時のシミュレーションの実行サイクル数を求めることができる。
【0090】
図12(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図12(D)の場合には、LD命令の遅延時間をそのまま加算しているため、実際には、LD命令の実行中に実行が完了するMULT命令の実行時刻のずれによる誤差が生じている。
【0091】
図13は、第1の補正部による実行結果の第2の補正例を示す説明図である。図13では、2つのキャッシュ処理が実行されるケースで2つのキャッシュミスが生じた場合の補正例を説明する。図13の例では、ブロック1301で示す、以下の5命令を含む性能シミュレーションが実行される。
【0092】
LD r2,[r1]; //r2←[r1];
LD r4,[r3]; //r4←[r3];
MULT r7,r5,r6; //r7←r5*r6;
ADD r2,r2,r4; //r2←r2+r4;
ADD r2,r2,r7; //r2←r2+r7;
【0093】
図13(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、2つのLD命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行される。
【0094】
図13(B)は、2つのキャッシュ処理の両方が予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す説明図である。図13(B)で示す予測ミスのケースでは、2つのLD命令のそれぞれでキャッシュミスがあり、ペナルティサイクル(6サイクル)分の遅延が生じる。しかし、2つのLD命令の遅延時間は重なる時間があり、MULT命令も、遅延の影響を受けずにeステージが実行され、2つのADD命令のeステージの実行が2つめのLD命令の完了まで遅延することになる。
【0095】
図13(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、図12を用いて説明したように、タイミングt0において、1つめのLD命令の遅延時間を補正し、ヘルパー関数cache_ld(address,3,−1)を返す。
【0096】
次に、現タイミングt1において、補正部322は、2つめのLD命令の実行結果がキャッシュミスであるので(予測結果のミス)、このLD命令の残りのeステージの実行時間にペナルティサイクル(6サイクル)を追加して有効遅延時間(1+6=7サイクル)とする。
【0097】
補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間(<現タイミングt1−前命令のeステージの実行時刻t0>−設定された間隔)を差し引いて、現タイミングt1から超過した有効遅延時間を求め(7−(6−2)=3サイクル)、超過した有効遅延時間を、2つめのLD命令のeステージの実行時間とする。さらに、補正部322は、超過した有効遅延時間から本来のeステージの実行時間を差し引いて(3−1=2サイクル)、前命令の遅延時間とする。
【0098】
また、補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(3+3)=1サイクル)、猶予時間とする。
【0099】
補正部322は、タイミングt1において、2つめのLD命令の遅延時間を補正した後、ヘルパー関数cache_ld(address、1、2)を返す。この補正により、現タイミングt1に補正値(3サイクル)を付加したタイミングがLD命令の実行完了のタイミングとなり、そのタイミングから、以降のMULT命令、ADD命令のeステージの実行時間が加算されていくことになる。
【0100】
図13(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図13(D)の場合には、2つのLD命令それぞれに与えられたペナルティに基づく遅延時間をそのまま加算しているため、大きな誤差(9サイクル)が生じている。図13(C)に示す補正部322の処理でも、図13(B)に示すように正しくシミュレーションされる場合に比べて誤差(1サイクル)があるが、従来手法に比べて、非常に高精度に求められることがわかる。
【0101】
図14は、第1の補正部による実行結果の第3の補正例を示す説明図である。図14では、2つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。図14の例では、図13で示す説明例と同様の5つの命令の性能シミュレーションが実行される。
【0102】
図14(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、図13(A)の場合と同様に、2つのLD命令のeステージが、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。
【0103】
図14(B)は、1つめのLD命令が予測結果と異なる「キャッシュミス」となり、2つめのLD命令の結果が予測結果(キャッシュヒット)である場合の命令実行タイミングのチャート例を示す図である。図14(B)で示す予測ミスのケースでは、1つ目のLD命令にペナルティサイクル(6サイクル)分の遅延が生じる。しかし、MULT命令は、遅延の影響を受けずにeステージが実行され、2つのADD命令のeステージの実行が1つ目のLD命令の完了まで遅延することになる。
【0104】
図14(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、図12を用いて説明したように、タイミングt0において、1つめのLD命令の遅延時間を補正し、ヘルパー関数cache_ld(address,3,−1)を返す。
【0105】
次に、現タイミングt1において、補正部322は、2つめのLD命令の実行結果がキャッシュヒットであるので(予測結果)、このLD命令のeステージの実行開始から現タイミングt1までの時間<t1−t0−(6−0−2=4サイクル)>が、このLD命令のeステージの実行時間(2サイクル)より大きいかを判断する。
【0106】
補正部322は、2つめのLD命令のeステージの実行開始から現タイミングt1までの時間が、このLD命令のeステージの実行時間(2サイクル)より大きいので、現タイミングt1を、次のMULT命令のeステージの実行時刻とする。
【0107】
そして、補正部322は、2つめのLD命令の実行完了から現タイミングt1までの時間を(2サイクル)、次の命令に対する遅延時間として扱い、前命令の遅延時間pre_delay=2とする。また、補正部322は、1つめのLD命令の有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(6+0)=1サイクル)、猶予時間rep_delay=1とし、ヘルパー関数cache_ld(address,1,2)を返す。
【0108】
図14(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図14(D)の場合には、1つめのLD命令のペナルティによる遅延時間をそのまま加算しているため誤差が生じている。次に、図15〜図18にて、第2の補正部となる補正部323による実行結果の補正例を示す。
【0109】
図15は、第2の補正部による実行結果の第1の補正例を示す説明例である。図15では、ブロック間にてレジスタの依存関係がある場合の補正例を示しており、具体的には、続けて実行されるブロック1501とブロック1502にて、同一のレジスタを使用する場合の補正例を示している。ブロック1501は、末尾の命令にて、“LD r1,[r2];”を実行し、ブロック1502は、先頭の命令にて、“ADD r1,r1,r3”を実行する。また、LD命令のeステージの実行時刻をtとする。
【0110】
シミュレーション装置100は、実行されるブロックの末尾の命令に含まれる資源と、実行されるブロックの前に実行された前ブロックの先頭の命令に含まれる資源を特定する。特定した結果が、ブロック資源情報355に格納される。シミュレーション装置100は、ブロック1501の末尾であるLD命令に含まれる資源群をブロック資源情報355_1501tに格納し、ブロック1502の先頭の命令であるADD命令に含まれる資源をブロック資源情報355_1502hに格納する。
【0111】
ブロック資源情報355は、ブロックの先頭または末尾から所定数の命令に含まれる資源群と、資源の位置を格納する情報である。ブロック資源情報355は、資源名、命令のブロック上位置という2つのフィールドを含む。資源名フィールドには、資源となるレジスタ番号または演算ユニット名が格納される。命令のブロック上位置フィールドには、該当の資源を用いる命令の、ブロックの先頭または末尾からの位置が格納される。
【0112】
たとえば、ブロック資源情報355_1501tは、資源として書込対象となるr1と実行対象となるロードユニットが、ブロック1501の末尾から1番目の位置で使用されることを示している。同様に、ブロック資源情報355_1502hは、資源として読込対象と書込対象となるr1、読込対象となるr3と実行対象となる整数演算ユニットが、ブロック1502の先頭から1番目の位置で使用されることを示している。
【0113】
このように、ブロック1501とブロック1502は、r1が共通して使用されているため、ターゲットCPUは、ブロック1501のLD命令が完了するまで、ブロック1502のADD命令のeステージの実行を停止させることになる。シミュレーション装置100は、r1がADD命令で使用される時刻t+1と、r1がLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出する。
【0114】
この状態で、図15(A)では、ブロック1501の実行の後にブロック1502の命令実行をシミュレーションした場合、ブロック1501の末尾のLD命令のfステージからADD命令のeステージ終了までの時間が、5サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージの実行時刻を、遅延時間の1サイクルを加えたt+2に補正する。なお、シミュレーション装置100は、後続の命令の実行時刻についても1サイクル加えた時刻に補正する。
【0115】
図15(B)は、シミュレーション装置100の処理と比較するために、従来技術によるブロック間にてレジスタの依存関係がある場合の誤差の大きさを示す図である。図15(B)の場合には、レジスタの依存関係によってADD命令のeステージの実行の停止を考慮しないためによる誤差が生じている。
【0116】
図16は、第2の補正部による実行結果の第2の補正例を示す説明図である。図16では、ターゲットCPUがスーパスカラプロセッサであり、レジスタの依存関係がある場合の補正例を示している。ターゲットCPUがスーパスカラプロセッサである場合、ターゲットCPUは、複数の命令を同時に実行することができる。したがって、シミュレーション装置100は、実行されるブロックの先頭から特定する命令の所定数を、ターゲットCPUが同時に実行できる命令の数に設定する。図16では、ターゲットCPUが同時に2命令を実行できる場合を想定している。また、図16では、ロードユニット、整数演算ユニットが2つ以上存在している状態を想定している。また、1つ目のLD命令のeステージの実行時刻をtとする。
【0117】
さらに、図16では、ブロック1601とブロック1602が続けて実行される場合を想定している。ブロック1601は、末尾から2番目の命令にて、“LD r1,[r2];”を実行し、末尾の命令にて、“LD r3,[r4];”を実行する。また、ブロック1602は、先頭の命令にて、“ADD r1,r1,r5”を実行し、先頭から2番目の命令にて、“ADD r3,r3,r5”を実行する。
【0118】
シミュレーション装置100は、ブロック1601の末尾の命令と末尾から2番目の命令と、で指定される資源群を検出し、ブロック資源情報355_1601tに格納する。また、シミュレーション装置100は、ブロック1602の先頭の命令と先頭から2番目の命令と、で指定される資源群を特定し、ブロック資源情報355_1602hに格納する。ブロック1601とブロック1602がr1、r3を共通して使用していることを示しているため、ターゲットCPUは、ブロック1601の2つのLD命令が完了するまで、ブロック1602の2つのADD命令のeステージの実行を停止させることになる。
【0119】
共通して使用される資源が複数あるため、シミュレーション装置100は、r1とr3のうち、先頭命令で使用される時刻と、末尾命令での使用が終了する時刻の差が最大となる資源を特定する。この場合、r1、r3は、ADD命令で使用される時刻t+1と、LD命令での使用が終了する時刻t+2から、差が共に1サイクルとなる。したがって、シミュレーション装置100は、遅延時間を1サイクルとして算出する。
【0120】
この状態で、図16(A)では、ブロック1601の後にブロック1602の命令実行をシミュレーションした場合、ブロック1601の末尾から2番目のLD命令におけるfステージから2番目のADD命令のeステージ終了までの時間が、5サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージ実行時刻を、t+1に1サイクルを加えたt+2に補正する。
【0121】
図17は、第2の補正部による実行結果の第3の補正例を示す説明図である。図17では、実行時間が長い命令にてレジスタの依存関係がある場合の補正例を示している。具体的には、続けて実行されるブロック1701とブロック1702にて、同一のレジスタを使用しており、さらにブロック1701にて、実行時間が長い命令を実行した場合の補正例について説明する。また、図17では、実行時間が長い命令として、MULT命令を実行した場合の例を示している。また、MULT命令のeステージの実行時刻をtとする。
【0122】
ブロック1701は、末尾の命令にて、“MULT r1,r2,r1;”を実行し、ブロック1702は、先頭の命令にて、“MOV r3,0;”を実行し、先頭から2番目の命令にて、“ADD r1,r3,r1;”を実行する。なお、MOV命令は、データの複写を行う命令である。
【0123】
シミュレーション装置100は、ブロック1701の末尾の命令で指定される資源群を検出し、ブロック資源情報355_1701tに格納する。また、シミュレーション装置100は、ブロック1702の先頭の命令と先頭から2番目の命令と、で指定される資源群を特定し、ブロック資源情報355_1702hに格納する。ブロック1701とブロック1702がr1を共通して使用していることを示しているため、ターゲットCPUは、ブロック1701のMULT命令が完了するまで、ブロック1702のADD命令のeステージの実行を停止させることになる。シミュレーション装置100は、r1がADD命令で使用される時刻t+2と、r1がLD命令での使用が終了する時刻t+3の差1サイクルを遅延時間として算出する。
【0124】
この状態で、図17(A)では、ブロック1701の後にブロック1702の命令実行をシミュレーションした場合、ブロック1701の末尾のMULT命令におけるfステージからADD命令のeステージ終了までの時間が、6サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージの実行時刻を、t+2に1サイクルを加えたt+3に補正する。
【0125】
図18は、第2の補正部による実行結果の第4の補正例を示す説明図である。図18では、続けて実行されるブロック間にて演算ユニットの依存関係がある場合の補正例を示している。具体的には、続けて実行されるブロック1801とブロック1802にて、ロードユニットを使用している。また、ブロック1801のLD命令のeステージの実行時刻をtとする。
【0126】
ブロック1801は、末尾の命令にて、“LD r1,[r2];”を実行し、ブロック1802は、先頭の命令にて、“LD r3,[r4];”を実行する。シミュレーション装置100は、ブロック1801の末尾の命令で指定される資源群を検出し、ブロック資源情報355_1801tに格納する。また、シミュレーション装置100は、ブロック1802の先頭の命令で指定される資源群を特定し、ブロック資源情報355_1802hに格納する。
【0127】
ターゲットCPUが有するロードユニットの個数は、レコード354−3が示すように、1つであるため、ターゲットCPUは、ブロック1801のLD命令が完了するまで、ブロック1802のLD命令のeステージの実行を停止させることになる。シミュレーション装置100は、ロードユニットがブロック1802のLD命令で使用される時刻t+1と、ロードユニットのLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出する。
【0128】
この状態で、図18(A)では、ブロック1801の後にブロック1802の命令実行をシミュレーションした場合、ブロック1801のLD命令におけるfステージからブロック1802のLD命令のeステージ終了までの時間が、6サイクルとなる。具体的には、シミュレーション装置100は、ブロック1802のLD命令のeステージの実行時刻を、t+1に1サイクルを加えたt+2に補正する。
【0129】
また、第2の補正部となる補正部323は、先行ブロックの末尾命令に分岐命令がある場合、分岐予測結果を取得し、予測が的中だった場合に、図15〜図18で示した補正例を行う。予測が的中しなかった場合、補正部323は、図15〜図18で示した補正を行わない。補正を行わない理由は、予測ミスの影響が大きいためである。
【0130】
図19は、コード変換部の処理例を示すフローチャートである。シミュレーション装置100は、ターゲットコードを所定のブロックに分割して入力する(ステップS1901)。次に、シミュレーション装置100は、入力されたブロックの命令を分析して、外部依存命令を検出し(ステップS1902)、検出した全ての命令について、予測情報352に基づいて、確率が高い予測結果を設定する(ステップS1903)。
【0131】
予測結果の設定後、シミュレーション装置100は、タイミング情報351を参照して、ブロックの各命令について予測結果を前提とする性能シミュレーションを実行する(ステップS1904)。また、シミュレーション装置100は、ブロックの先頭から所定数の命令で指定される資源群と、ブロックの末尾の所定数の命令で指定される資源群とをブロック資源情報355に書き込む(ステップS1905)。
【0132】
シミュレーション装置100は、シミュレーション結果に基づいて、性能シミュレーション用ホストコードを生成する(ステップS1906)。ステップS1901〜ステップS1904、ステップS1906の処理によって、シミュレーション装置100は、設定された予測結果の場合での機能コードに、ターゲットCPUの性能をシミュレーションするコードが組み込まれたホストコードを出力する。
【0133】
図20は、シミュレーション実行部の処理例を示すフローチャートである。シミュレーション装置100は、性能シミュレーション用ホストコードを取得し(ステップS2001)、ホストコードの実行により性能シミュレーションを実行する(ステップS2002)。次に、シミュレーション装置100は、性能シミュレーション実行中に外部依存命令を検出すると(ステップS2003)、外部依存命令の実行結果が予測結果と同一か否かを判断する(ステップS2004)。
【0134】
外部依存命令の実行結果が予測結果と同一でない場合(ステップS2004:No)、シミュレーション装置100は、補正部322により命令の実行時間を補正する(ステップS2005)。命令の実行時間の補正後、または、外部依存命令の実行結果が予測結果と同一である場合(ステップS2004:Yes)、シミュレーション装置100は、ブロック間補正処理を実行する(ステップS2006)。なお、ブロック間補正処理の詳細については、図22にて後述する。最後に、シミュレーション装置100は、ターゲットプログラムに相当するホストコード全てのシミュレーション処理についてのシミュレーション情報356を出力する(ステップS2007)。
【0135】
以上のステップS2001〜ステップS2007の処理により、シミュレーション装置100は、ターゲットプログラム101を実行するターゲットCPUのシミュレーション情報356を出力する。
【0136】
図21は、シミュレーション結果の第1の補正処理例を示すフローチャートである。図21では、外部依存命令の一例として、LD命令に対する補正処理例について説明する。シミュレーション装置100は、処理中のブロックの命令から、外部依存命令を検出すると、補正部322に相当するヘルパー関数を呼び出す(ステップS2101)。
【0137】
シミュレーション装置100は、LD命令で、キャッシュアクセスが要求されているか否かを判定する(ステップS2102)。キャッシュアクセスが要求されている場合(ステップS2102:Yes)、シミュレーション装置100は、キャッシュアクセスの実行をシミュレーションする(ステップS2103)。
【0138】
シミュレーション装置100は、キャッシュアクセスの結果を判断する(ステップS2104)。キャッシュアクセスの結果が“キャッシュミス”である場合(ステップS2104:“ミス”)、シミュレーション装置100は、LD命令のeステージの実行時間(サイクル数)を補正する(ステップS2105)。補正後、シミュレーション装置100は、補正された実行時間(サイクル数)を出力する(ステップS2106)。
【0139】
キャッシュアクセスが要求されていない場合(ステップS2102:No)、または、要求されたキャッシュアクセスが“キャッシュヒット”である場合(ステップS2104“ヒット”)、シミュレーション装置100は、未補正の予測された実行時間(サイクル数)を出力する(ステップS2107)。
【0140】
図22は、シミュレーション結果の第2の補正処理例を示すフローチャートである。シミュレーション装置100は、処理中のブロックの命令の実行時刻を取得する(ステップS2201)。次に、シミュレーション装置100は、先行ブロックの末尾命令に分岐命令が存在するか否かを判断する(ステップS2202)。分岐命令が存在する場合(ステップS2202:Yes)、シミュレーション装置100は、性能シミュレーションの分岐予測の分岐予測結果を取得する(ステップS2203)。
【0141】
続けて、シミュレーション装置100は、分岐予測結果が的中であったか否かを判断する(ステップS2204)。的中であった場合(ステップS2204:Yes)、または、分岐命令が存在しない場合(ステップS2202:No)、シミュレーション装置100は、先行ブロックの末尾命令で指定される第1の資源群と、処理中のブロックの先頭命令で指定される第2の資源群を検出する(ステップS2205)。なお、ステップS2205の処理は、先行ブロックの末尾命令で指定される書込対象のレジスタ群を第1の資源群として、処理中のブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出してもよい。
【0142】
続けて、シミュレーション装置100は、第1および第2の資源群に共通して含まれる資源を特定する(ステップS2206)。なお、ステップS2206の処理は、共通して含まれる資源のうち、先頭命令で使用される時刻と、末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。また、ステップS2206の処理は、共通して含まれる資源が演算ユニットであり、かつターゲットCPUが有する演算ユニットの個数が末尾命令および先頭命令にて指定された個数より多い場合、演算ユニットを特定してもよい。
【0143】
次に、シミュレーション装置100は、何らかの資源が特定されたか否かを判断する(ステップS2207)。資源が特定された場合(ステップS2207:Yes)、シミュレーション装置100は、特定された資源が先頭命令で使用される時刻と特定した資源の末尾命令での使用が終了する時刻とから、遅延時間を算出する(ステップS2208)。遅延時間の算出後、シミュレーション装置100は、遅延時間によって、実行中のブロックの命令の実行時刻を補正し(ステップS2209)、補正した実行中のブロックの命令の実行時刻を出力し(ステップS2210)、ブロック間補正処理を終了する。
【0144】
的中でない場合(ステップS2204:No)、または、資源が特定されなかった場合(ステップS2207:No)、シミュレーション装置100は、実行中のブロックの命令の実行時刻を出力し(ステップS2211)、ブロック間補正処理を終了する。
【0145】
以上説明したように、補正装置、補正方法、および補正プログラムによれば、プログラムコードを分割したブロック間でまたがって使用される資源を特定し、競合した資源を使用する時刻と使用可能となる時刻を用いてサイクル数を補正する。これにより、補正装置は、性能シミュレーションの精度を向上させることができる。
【0146】
また、ブロック間で競合した資源の補正方法が、各命令の実行時刻に遅延時間を単純に加算するだけであるため、シミュレーションにかかる時間をほとんど増加させずに、精度を向上させることができる。
【0147】
また、補正装置は、先行ブロックの末尾命令が分岐命令であり、分岐予測結果が的中していた場合に、ブロック間の補正を行ってもよい。シミュレーション結果に与える影響について、分岐予測が外れていた場合は、ブロック間の影響より予測ミスによる影響が大きいため、補正装置は、ブロック間の影響が大きいときに、ブロック間による補正を行うことができる。
【0148】
また、補正装置は、第1および第2の資源群に共通して含まれる資源のうち、該当の資源が先頭命令で使用される時刻と該当の資源の末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。これにより、補正装置は、ブロック間で、シミュレーション結果に最も影響のある資源を特定するため、より性能シミュレーションの精度を向上させることができる。
【0149】
また、補正装置は、末尾命令で指定される書込対象の記憶領域を第1の資源群として検出してもよい。これにより、補正装置は、単純に末尾命令で指定される記憶領域を第1の資源群とするより、読込対象の記憶領域の分だけ第1の資源群の数を減らすことができ、共通して含まれる資源の特定処理を高速化することができる。
【0150】
また、補正装置は、共通して含まれる資源が演算ユニットであり、ターゲットCPUが有する演算ユニットの個数が、末尾命令および先頭命令にて指定された個数より少ない場合、演算ユニットを特定してもよい。これにより、補正装置は、演算ユニットの個数が十分にあり、ブロック間の補正を行わなくてよい場合を除外することができる。
【0151】
(実施の形態2の概要)
実施の形態1にかかるシミュレーション装置100では、性能シミュレーションを行っていた。実施の形態2にかかるシミュレーション装置100は、電力シミュレーションを行う。実施の形態2にかかるシミュレーション装置のハードウェアについては、実施の形態1にかかるシミュレーション装置と同等であるため、説明を省略する。また、実施の形態2にかかるシミュレーション装置の機能については、取得部331、補正部336、出力部337以外については、同一の機能であるため、説明を省略する。また、実施の形態2にかかるシミュレーション装置は、命令が消費する電力情報にアクセス可能である。また、電力シミュレーションの補正例、電力情報の詳細については、図23で後述する。
【0152】
実施の形態2にかかる取得部331は、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および命令で消費する電力を取得する機能を有する。たとえば、実施の形態2にかかる取得部331は、ブロック103のADD命令の実行時刻t+1と、ADD命令が消費する電力0.3[uW]を取得する。なお、取得結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0153】
実施の形態2にかかる補正部336は、算出部335によって算出された遅延時間に応じた消費電力にて、実施の形態2にかかる取得部331によって取得されたいずれかのブロックの命令の実行で消費する電力を補正する機能を有する。たとえば、実施の形態2にかかる補正部336は、遅延時間が2サイクルであれば、ADD命令が消費する電力0.3[uW]に2×0.05[uW]を加算する。
【0154】
実施の形態2にかかる出力部337は、実施の形態2にかかる補正部336によって補正されたいずれかのブロックの命令で消費する電力を出力する機能を有する。たとえば、実施の形態2にかかる出力部337は、補正されたADD命令が消費する電力0.3+2×0.05=0.31[uW]を出力する。
【0155】
図23は、実施の形態2にかかるシミュレーション装置の補正例を示す説明図である。図23では、性能シミュレーション用のホストコードに組み込む関数(電力シミュレーション関数)として実施した場合の例を示す図である。
【0156】
命令が消費する電力を記憶する電力情報2301として、LD命令、MULT命令、ADD命令の1実行当たりの消費電力が、それぞれ0.3[uW]、0.5[uW]、0.3[uW]と設定されている。電力シミュレーション関数Host_Inst_A−C_powerは、シミュレーションで実行された各命令の実行回数に基づいて、電力を計算する。
【0157】
たとえば、先行ブロックによって生じる遅延時間が1サイクルであった場合、電力シミュレーション関数は、ADD命令で消費する電力0.3[uW]に、1サイクル分の消費電力0.05[uW]を加算することで、ADD命令で消費する電力を補正する。
【0158】
実施の形態2にかかる補正処理のフローチャートについては、図22とほぼ等しいため、図示を省略する。図22からの変更点としては、ステップS2201の処理が、「処理中のブロックの命令の実行時刻および命令で消費する電力を取得」となる。また、ステップS2209の処理が、「遅延時間応じた消費電力によって、実行中のブロックの命令で消費する電力を補正」となる。また、ステップS2210の処理が、「補正した実行中のブロックの命令で消費する電力を出力」となる。
【0159】
以上説明したように、補正装置、補正方法、および補正プログラムによれば、パイプラインがストールした時間で消費する電力を考慮した、より正確な消費電力をシミュレーションすることができる。
【0160】
なお、本実施の形態で説明した補正方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本補正プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本補正プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【0161】
323 補正部
331 取得部
332 判定部
333 検出部
334 特定部
335 算出部
336 補正部
337 出力部
355 ブロック資源情報
【技術分野】
【0001】
本発明は、シミュレーション結果を補正する補正装置、補正方法、および補正プログラムに関する。
【背景技術】
【0002】
従来から、CPU(Central Processing Unit)の機能、性能をシミュレーションする技術が開示されている。たとえば、評価対象となるターゲットCPUに対して、シミュレーションを実行するホストCPUで動作できるようにプログラムコードを変換して、ターゲットCPUの機能、性能、電力をシミュレーションする技術が存在する。
【0003】
たとえば、シミュレーション前に、ターゲットCPUのコードを、サブルーチンの単位でホスト計算機で直接実行可能なホストコードに変換しておき、サブルーチンの単位で分割したブロックの入口と出口の間で使用されるレジスタを解析するものが存在する。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開平9−6646号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
しかしながら、上述した従来技術において、ブロックごとにシミュレーションを実行するので、複数のブロックを連続してシミュレーションを実行すると、実際の実行結果から乖離した、精度の悪いシミュレーション結果となる。
【0006】
1つの側面では、本発明は、シミュレーションの精度を向上できる補正装置、補正方法、および補正プログラムを提供することを目的とする。
【課題を解決するための手段】
【0007】
本発明の一側面によれば、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、検出された第1および第2の資源群に共通して含まれる資源を特定し、特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出し、算出された遅延時間に基づいて、取得部によって取得されたいずれかのブロックの命令の実行時刻を補正し、補正されたいずれかのブロックの命令の実行時刻を出力する補正装置、補正方法、および補正プログラムが提案される。
【0008】
また、本発明の他の側面によれば、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および命令で消費する電力を取得し、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、検出された第1および第2の資源群に共通して含まれる資源を特定し、特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出し、算出された遅延時間に応じた消費電力にて、取得部によって取得されたいずれかのブロックの命令の実行で消費する電力を補正し、補正されたいずれかのブロックの命令で消費する電力を出力する補正装置、補正方法、および補正プログラムが提案される。
【発明の効果】
【0009】
本発明の一様態によれば、シミュレーションの精度向上を図ることができる。
【図面の簡単な説明】
【0010】
【図1】図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。
【図2】図2は、シミュレーション装置のハードウェアの一例を示すブロック図である。
【図3】図3は、シミュレーション装置の機能例を示すブロック図である。
【図4】図4は、ターゲットコードの一例を示す説明図である。
【図5】図5は、タイミング情報の記憶内容の一例を示す説明図である。
【図6】図6は、予測情報の記憶内容の一例を示す説明図である。
【図7】図7は、命令補正値情報の記憶内容の一例を示す説明図である。
【図8】図8は、演算ユニット情報の記憶内容の一例を示す説明図である。
【図9】図9は、ターゲットプログラムの実行タイミングの一例を示す説明図である。
【図10】図10は、ホストコードの生成例を示す説明図である。
【図11】図11は、第1の補正部の処理コード例を示す説明図である。
【図12】図12は、第1の補正部による実行結果の第1の補正例を示す説明図である。
【図13】図13は、第1の補正部による実行結果の第2の補正例を示す説明図である。
【図14】図14は、第1の補正部による実行結果の第3の補正例を示す説明図である。
【図15】図15は、第2の補正部による実行結果の第1の補正例を示す説明図である。
【図16】図16は、第2の補正部による実行結果の第2の補正例を示す説明図である。
【図17】図17は、第2の補正部による実行結果の第3の補正例を示す説明図である。
【図18】図18は、第2の補正部による実行結果の第4の補正例を示す説明図である。
【図19】図19は、コード変換部の処理例を示すフローチャートである。
【図20】図20は、シミュレーション実行部の処理例を示すフローチャートである。
【図21】図21は、シミュレーション結果の第1の補正処理例を示すフローチャートである。
【図22】図22は、シミュレーション結果の第2の補正処理例を示すフローチャートである。
【図23】図23は、実施の形態2にかかるシミュレーション装置の補正例を示す説明図である。
【発明を実施するための形態】
【0011】
以下に添付図面を参照して、開示の補正装置、補正方法、および補正プログラムの実施の形態を詳細に説明する。なお、本実施の形態にかかる補正装置の例として、ターゲットCPUのシミュレーションを行うシミュレーション装置が、本実施の形態にかかる補正処理を実行する、という状態を想定して説明を行う。
【0012】
図1は、実施の形態1にかかるシミュレーション装置の動作例を示す説明図である。シミュレーション装置100は、ターゲットCPUにおける命令実行の性能シミュレーションを実行する装置である。具体的に、シミュレーション装置100は、ターゲットCPU用のプログラムであるターゲットプログラム101をホストCPUで動作させるため、インタープリタ方式を用いる。または、シミュレーション装置100は、JIT(Just−In−Time)コンパイラ方式といった方式によりホストコードを生成し、ホストコードを実行する。
【0013】
ここで、ターゲットCPUは、シミュレーションの対象となるCPUの制御モデルである。シミュレーション装置100は、ターゲットCPUの命令実行の性能シミュレーションとして各命令のサイクルシミュレーション情報を出力する。
【0014】
ここで、ターゲットCPUは、たとえば組み込みシステム等で採用されるRISC(Reduced Instruction Set Computer)アーキテクチャのCPUである。ホストCPUに相当するシミュレーション装置100は、たとえばCISC(Complex Instruction Set Computer)アーキテクチャのCPUを搭載するコンピュータである。
【0015】
この状態で、シミュレーション装置100は、ターゲットプログラム101が所定のブロックで分割されたブロック102、ブロック103を連続してシミュレーションする。ブロック102の末尾命令は、ロード命令(以下、「LD命令」と称す)であり、ニーモニックコードが“LD r1,[r2]”となる。また、ブロック103の先頭命令は、加算命令(以下、「ADD命令」と称す)であり、ニーモニックコードが、“ADD r1,r1,r3”となる。LD命令、ADD命令は、ターゲットCPUのパイプラインに投入されて実行される。
【0016】
次に、本実施の形態にかかる補正処理が行われる前のシミュレーション結果である図1(A)と、本実施の形態にかかる補正処理が行われた後のシミュレーション結果である図1(B)と、について説明する。なお、図1(A)と図1(B)に共通する説明として、LD命令、ADD命令は、フェッチステージ(図中「f」で表示し、以下、「fステージ」と称する)、デコードステージ(図中「d」で表示し、以下、「dステージ」と称する)、エグゼキュートステージ(図中「e」で表示し、以下、「eステージ」と称する)を順に実行する。fステージ、dステージは命令によらず1サイクルで処理を行い、eステージは、LD命令が2サイクル、ADD命令が1サイクルで処理を行う。また、LD命令のeステージの実行時刻をtとする。
【0017】
図1(A)で示すシミュレーション結果は、LD命令の開始から、ADD命令の終了までを4サイクルで行っている。しかしながら、t+1にて、レジスタr1が競合しており、ターゲットCPUが実際に処理を行う場合、ADD命令のeステージの実行時刻はt+2となり、図1(A)で示すシミュレーション結果は、実際の性能値と異なるため、精度が悪い。
【0018】
次に、図1(B)で示すシミュレーション結果は、r1がADD命令で補正前に使用される時刻t+1と、r1のLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出し、ADD命令のeステージの実行時刻を補正した後の状態である。図1(B)では、LD命令の開始から、ADD命令の終了までを5サイクルで行っており、シミュレーション結果が実際の実行時間と等しくなり、精度が向上する。
【0019】
このように、本実施の形態にかかる補正処理は、後続のブロックの先頭命令で資源を使用する時刻と、先行するブロックで資源の使用が終了し、後続のブロックで資源が使用可能となる時刻とから求めた遅延時間を用いて補正する。以降、図2〜図22にて、図1で示した動作を行うシミュレーション装置100について説明を行う。
【0020】
(シミュレーション装置100のハードウェア)
図2は、シミュレーション装置のハードウェアの一例を示すブロック図である。図2において、シミュレーション装置100は、CPU201と、ROM(Read‐Only Memory)202と、RAM(Random Access Memory)203と、を含む。また、シミュレーション装置100は、磁気ディスクドライブ204と、磁気ディスク205と、光ディスクドライブ206と、光ディスク207と、を含む。また、ユーザやその他の機器との入出力装置としてシミュレーション装置100は、ディスプレイ208と、I/F(Interface)209と、キーボード210と、マウス211と、を含む。また、各部はバス212によってそれぞれ接続されている。
【0021】
ここで、CPU201は、シミュレーション装置100の全体の制御を司る。ROM202は、ブートプログラムなどのプログラムを記憶している。RAM203は、CPU201のワークエリアとして使用される。磁気ディスクドライブ204は、CPU201の制御にしたがって磁気ディスク205に対するデータのリード/ライトを制御する。磁気ディスク205は、磁気ディスクドライブ204の制御で書き込まれたデータを記憶する。
【0022】
光ディスクドライブ206は、CPU201の制御にしたがって光ディスク207に対するデータのリード/ライトを制御する。光ディスク207は、光ディスクドライブ206の制御で書き込まれたデータを記憶したり、光ディスク207に記憶されたデータをコンピュータに読み取らせたりする。なお、ROM202、磁気ディスク205、光ディスク207のいずれかの記憶装置に、本実施の形態にかかるシミュレーションプログラムが格納されていてもよい。
【0023】
ディスプレイ208は、カーソル、アイコンあるいはツールボックスをはじめ、文書、画像、機能情報などのデータを表示する。たとえば、ディスプレイ208は、CRT、TFT液晶ディスプレイ、プラズマディスプレイなどを採用することができる。
【0024】
I/F209は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク213に接続され、このネットワーク213を介して他の装置に接続される。そして、I/F209は、ネットワーク213と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F209には、たとえばモデムやLANアダプタなどを採用することができる。
【0025】
キーボード210は、文字、数字、各種指示などの入力のためのキーを有し、データの入力を行う。また、キーボード210は、タッチパネル式の入力パッドやテンキーなどであってもよい。マウス211は、カーソルの移動や範囲選択、あるいはウィンドウの移動やサイズの変更などを行う。また、シミュレーション装置100は、マウス211の代わりとして、ポインティングデバイスとして同様に機能を有するものであれば、トラックボールやジョイスティックなどであってもよい。
【0026】
(シミュレーション装置100の機能)
次に、シミュレーション装置100の機能について説明する。図3は、シミュレーション装置の機能例を示すブロック図である。シミュレーション装置100は、コード変換部301と、シミュレーション実行部302と、シミュレーション情報収集部303と、を含む。この制御部となる機能(コード変換部301〜シミュレーション情報収集部303)は、記憶装置に記憶されたプログラムをCPU201が実行することにより、その機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、磁気ディスク205、光ディスク207などである。または、I/F209を経由して他のCPUが実行することにより、その機能を実現してもよい。
【0027】
また、コード変換部301は、分割部311、予測シミュレーション実行部312、生成部313、書込部314を有する。シミュレーション実行部302は、コード実行部321、第1の補正部となる補正部322、第2の補正部となる補正部323を有する。さらに、補正部323は、取得部331、判定部332、検出部333、特定部334、算出部335、補正部336、出力部337を有する。
【0028】
また、シミュレーション装置100は、ターゲットプログラム101、タイミング情報351、予測情報352、命令補正値情報353、演算ユニット情報354、ブロック資源情報355、シミュレーション情報356にアクセス可能である。ターゲットプログラム101、タイミング情報351〜シミュレーション情報356は、シミュレーション装置100がアクセス可能な記憶領域に格納される。
【0029】
ブロック資源情報355は、ブロックと先頭または末尾との組合せごとに、命令で指定される資源を記憶する情報である。ここで、資源とは、読込対象または書込対象となるレジスタやメモリ、または実行対象となる演算ユニットである。なお、以下の表記にて、末尾記号“_xxxt”が付与されたブロック資源情報355は、ブロックxxxの末尾命令で指定された資源群を記憶している。また、末尾記号“_xxxh”が付与されたブロック資源情報355は、ブロックxxxの先頭命令で指定された資源群を記憶している。
【0030】
コード変換部301は、ターゲットCPUのプログラムの実行時に、ターゲットCPUが実行するターゲットプログラム101から、シミュレーションを実行するホストCPUのホストコード305を生成する。
【0031】
分割部311は、ターゲットプログラム101を所定のブロックに分割する。分割されるブロック単位は、たとえば、一般的なベーシックブロック(分岐から次の分岐前までのコード)単位でよく、または、予め定められた任意のコード単位でよい。
【0032】
予測シミュレーション実行部312は、タイミング情報351と予測情報352とを得て、入力されたブロックをある実行結果を前提とした条件下で実行する性能シミュレーションを行う。具体的に、予測シミュレーション実行部312は、予測情報352をもとに、入力されたブロックに含まれる外部依存命令の予測結果を設定する。続けて、予測シミュレーション実行部312は、タイミング情報351を参照して、設定した予測結果を前提とする場合の命令を実行して、命令実行の進み具合をシミュレーションする。予測シミュレーション実行部312は、シミュレーション結果として、ブロックに含まれる各命令の実行時間(サイクル数)を求める。
【0033】
生成部313は、予測シミュレーション実行部312のシミュレーション結果をもとに、処理したブロックに対応するホストコードとして、設定された予測結果における命令実行時の性能シミュレーションを行うためのホストコードを生成する。
【0034】
生成部313は、ブロックのターゲットコードをもとに、外部依存命令が予測結果である場合の命令実行を行うホストコードを生成し、さらに、各命令の実行時間を加算して、ブロックの処理時間を計算する処理を行うシミュレーション用コードを組み込む。
【0035】
たとえば、生成部313は、データのLD命令の予測結果として“キャッシュヒット”が設定されている処理については、ブロック内のLD命令によるキャッシュアクセスが“ヒット”である場合の処理実行をシミュレーションして、予測結果での実行時間を求める。また、生成部313は、LD命令によるキャッシュアクセスが“ミス”である場合の実行時間、予測結果である“ヒット”時の実行時間の加算/減算を用いた補正計算により求める処理を行うホストコードを生成する。
【0036】
書込部314は、ブロックの先頭から所定数の命令で指定される資源群と、ブロックの末尾から所定数の命令で指定される資源群とをブロック資源情報355に書き込む。
【0037】
シミュレーション実行部302は、生成部313が生成したホストコード305を実行して、ターゲットプログラム101を実行するターゲットCPUの命令実行の機能および性能シミュレーションを行う。コード実行部321は、ホストコード305を用いて、ターゲットプログラム101を実行する。
【0038】
第1の補正部となる補正部322は、プログラムの実行中に、外部依存命令の実行結果が、設定されていた予測結果と異なる場合に、既に求めた予想ケースでの実行時間を補正する。
【0039】
補正部322は、外部依存命令に与えられるペナルティ時間、外部依存命令の前後で実行される命令の実行時間、1つ前の命令の遅延時間などを用いて補正を行う。なお、補正処理の詳細は後述する。シミュレーション情報収集部303は、性能シミュレーションの実行結果として、各命令の実行時刻と実行時間を含むシミュレーション情報356を収集する。
【0040】
第2の補正部となる補正部323は、ブロック間の影響による補正を行う。取得部331は、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得する機能を有する。なお、命令の実行時刻とは、命令が実行される開始時刻でもよいし、終了時刻でもよい。以下の説明では、実行時刻を、命令が実行される開始時刻であるとする。たとえば、取得部331は、ブロック103のADD命令のeステージの実行時刻がt+1であることを取得する。なお、ブロックの命令の実行時刻は、予測シミュレーション実行部312、コード実行部321によって生成され、シミュレーション情報356に格納されている。したがって、取得部331は、シミュレーション情報356からブロックの命令の実行時刻を取得する。
【0041】
また、取得部331は、末尾命令が分岐命令である場合、分岐命令の分岐予測結果を取得してもよい。分岐予測結果は、ホストコード305を実行したコード実行部321から取得する。なお、取得結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0042】
判定部332は、末尾命令が分岐命令である場合、末尾命令のシミュレーションの実行結果にて分岐予測結果が的中であったか否かを判定する機能を有する。なお、判定結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0043】
検出部333は、いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する機能を有する。なお、末尾命令、先頭命令は、それぞれ1つの命令であってもよいし、先行ブロックの末尾から所定数の命令、いずれかのブロックの先頭から所定数の命令、であってよい。
【0044】
所定数をいくつに設定するかは、ターゲットCPUの特性に基づいて、予め決定しておく。たとえば、ターゲットCPUがスーパスカラプロセッサであれば、所定数を、同時に行える命令数とする。または、所定数を、ターゲットCPUが実行可能な命令のうち、eステージの実行時間が最長となるサイクルに対応する数としてもよい。たとえば、最長となる命令のサイクル数が4であるとき、該当の命令は、3命令先まで影響を及ぼすため、所定数を3と設定する。
【0045】
また、検出部333は、判定部332によって末尾命令の分岐予測が的中したと判定された場合、第1および第2の資源群を検出してもよい。また、検出部333は、先行ブロックの末尾命令で指定される書込対象の記憶領域群を第1の資源群として、いずれかのブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出してもよい。なお、命令で指定されるレジスタのうち、どれが書込対象なのか読込対象なのかという基準は、タイミング情報351にて記載されている。また、検出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0046】
特定部334は、検出部333によって検出された第1および第2の資源群に共通して含まれる資源を特定する機能を有する。たとえば、第1の資源群が、r1とロードユニットであり、第2の資源群が、r1、r3、整数演算ユニットである場合、特定部334は、r1を特定する。
【0047】
また、特定部334は、共通して含まれる資源のうち、該当の資源が先頭命令で使用される時刻と該当の資源の末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。たとえば、共通して含まれる資源として、r1とr3が存在した場合、r1の時刻の差が1サイクル、r3の時刻の差が3サイクルであれば、r3を特定する。
【0048】
また、特定部334は、共通して含まれる資源が演算ユニットであり、かつプログラムコードのシミュレーション対象となるCPUが有する演算ユニットの個数が末尾命令および先頭命令にて指定された個数より少ない場合、演算ユニットを特定してもよい。たとえば、ターゲットCPUが有する整数演算ユニットが1個であり、末尾命令および先頭命令にて指定された個数が2個である場合、整数演算ユニットを特定する。なお、特定された資源の情報は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0049】
算出部335は、特定部334によって特定された資源が先頭命令で使用される時刻と特定された資源の末尾命令での使用が終了する時刻とから、先行ブロックによって生じる遅延時間を算出する機能を有する。たとえば、算出部335は、特定された資源が先頭命令で使用される時刻がt+1であり、末尾命令での使用が終了する時刻がt+3であれば、遅延時間をt+3−(t+1)=2サイクルとして算出する。なお、算出結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0050】
補正部336は、算出部335によって算出された遅延時間にて、取得部331によって取得されたいずれかのブロックの命令の実行時刻を補正する機能を有する。たとえば、補正部336は、遅延時間が2サイクルであれば、いずれかのブロックの命令のeステージの実行時刻に2サイクルを加算する。
【0051】
出力部337は、補正部336によって補正されたいずれかのブロックの命令の実行時刻を出力する機能を有する。なお、出力先は、シミュレーション情報356であったり、または、RAM203であったりしてもよい。たとえば、出力部337は、遅延時間が加算された命令の実行時刻を出力する。
【0052】
また、出力部337は、特定部334によって共通して含まれる資源が特定されない場合、取得部331によって取得されたいずれかのブロックの命令の実行時刻を出力してもよい。
【0053】
図4は、ターゲットコードの一例を示す説明図である。図4では、ターゲットコードの3つの命令を示している。ブロック401には、ターゲットコードの3つの命令、命令402〜命令404が含まれている。命令402は、LD命令であり、ニーモニックコードが“LD r2,[r1]”となる。命令403は、乗算命令(以下、「MULT命令」と称す)であり、ニーモニックコードが“MULT r5,r3,r4”となる。命令403は、ADD命令であり、ニーモニックコードが、“ADD r6,r2,r5”となる。ブロック401は、命令402〜命令404の順でターゲットCPUのパイプラインに投入されて実行される。
【0054】
各命令は、命令のうちの動作を示すオペコードと、動作の対象となるオペランドを含む。命令402〜命令404のオペコードは、LD、MULT、ADDとなり、r1〜r6で示される汎用レジスタがオペランドとなる。
【0055】
図5は、タイミング情報の記憶内容の一例を示す説明図である。タイミング情報351は、命令実行時の各処理要素(ステージ)と使用可能なレジスタとの対応を示す情報と、命令のうち外部依存命令ごとに、実行結果に応じた遅延時間を定めるペナルティ時間(ペナルティサイクル数)とを示す情報である。
【0056】
外部依存命令とは、命令の実行結果がターゲットCPU外の外部環境に依存する処理のことである。命令の実行結果がターゲットCPU外の外部環境に依存するような処理として、たとえば、命令キャッシュ、データキャッシュ、TLB(Translation Lookaside Buffer)検索などを行ったり、または、分岐予測、コール/リターンのスタックなどの処理を行ったりする命令である。具体的な外部依存命令としては、ロード命令またはストア命令等である。図5で示すタイミング情報351は、レコード351−1〜レコード351−3を記憶している。
【0057】
タイミング情報351は、命令種別、ソースレジスタ、宛先レジスタ、ペナルティという4つのフィールドを含む。命令種別フィールドには、命令のオペコードが格納される。ソースレジスタフィールドには、オペランドのうち入力元となるレジスタが格納される。宛先レジスタフィールドには、オペランドのうち出力先となるレジスタが格納される。ペナルティフィールドには、実行結果に応じた遅延時間が格納される。
【0058】
レコード351−1は、LD命令について、ソースレジスタrs1(r1)が1番目の処理要素(e1)で、宛先レジスタrd(r2)が2番目の処理要素(e2)で使用可能となることを示している。また、レコード351−1は、キャッシュミスが発生した場合に、6サイクルの遅延時間が発生することを示している。なお、exは、パイプラインステージのうちエグゼキュートステージのx番目の処理要素であることを示している。xは1以上の整数である。
【0059】
また、レコード351−2は、MULT命令では、第1ソースレジスタrs1(r3)が処理要素e1、第2ソースレジスタrs2(r4)が処理要素e2、宛先レジスタrd(r5)は処理要素e3で使用可能であることを示している。また、レコード351−3は、ADD命令では、第1ソースレジスタrs1(r2)、第2ソースレジスタrs2(r5)が処理要素e1、宛先レジスタrd(r6)は1番目の処理要素(e1)で使用可能であることを示している。
【0060】
図6は、予測情報の記憶内容の一例を示す説明図である。予測情報352は、処理内容、予測結果という2つのフィールドを含む。処理内容フィールドには、ターゲットコードの外部依存命令の処理内容が格納される。予測結果フィールドには、外部依存命令の処理の予測結果が格納される。図6で示す予測情報352は、レコード352−1〜レコード352−5を記憶している。図6で示す予測情報352は、たとえば、命令キャッシュ、データキャッシュ、TLB検索、分岐予測、コール/リターンが全てヒットするという予測結果を示している。
【0061】
図7は、命令補正値情報の記憶内容の一例を示す説明図である。図7で示す命令補正値情報353は、レコード351−1〜レコード351−3を記憶している。命令補正値情報353は、命令種別、補正値という2つのフィールドを含む。命令種別フィールドには、命令のオペコードが格納される。補正値フィールドには、命令に用いられるレジスタがeステージで使用されるサイクル数が格納される。たとえば、レコード353−1は、LD命令が、レジスタを2サイクル使用することを示している。
【0062】
図8は、演算ユニット情報の記憶内容の一例を示す説明図である。図8で示す演算ユニット情報354は、レコード354−1〜レコード354−4を記憶している。演算ユニット情報354は、演算ユニット名、補正値、個数という3つのフィールドを含む。演算ユニット名フィールドには、演算ユニット名が格納される。補正値フィールドには、該当の演算ユニットがeステージ実行時に使用するサイクル数が格納される。個数フィールドには、ターゲットCPUが有する演算ユニットの個数が格納される。たとえば、レコード354−1は、整数演算ユニットがeステージ実行時に1サイクル使用し、ターゲットCPUに整数演算ユニットが2個あることを示している。
【0063】
図9は、ターゲットプログラムの実行タイミングの一例を示す説明図である。図9(A)で示す説明図は、LD命令の実行結果がキャッシュヒットした場合の実行タイミングを示しており、図9(B)で示す説明図は、LD命令の実行結果がキャッシュミスした場合の実行タイミングを示している。
【0064】
初めに、図9(A)、図9(B)で共通する説明として、各命令は、fステージ、dステージ、eステージを順に実行する。fステージ、dステージは命令によらず1サイクルで処理を行い、eステージは、各命令によって異なるサイクル数で処理を行う。具体的な各命令のeステージにかかるサイクル数については、命令補正値情報353の補正値フィールドに格納されている。
【0065】
タイミング情報351から、パイプラインに各命令が投入されるタイミングは、LD命令のeステージの実行時刻をタイミングtとすると、MULT命令のeステージの実行開始はタイミングt+1となる。同様に、ADD命令のeステージの実行開始はタイミングt+2となる。
【0066】
ADD命令の第1ソースレジスタ(r2)と第2ソースレジスタ(r5)は、LD命令とMULT命令で使用されている。したがって、ADD命令のeステージの実行開始は、LD命令とMULT命令の実行完了のタイミングt+4以降となり、2サイクル分の待機時間(2サイクル分のストール)が生じる。
【0067】
この状態で、図9(A)では、ブロック401の命令実行をシミュレーションした場合に、LD命令の実行結果がキャッシュヒットであるケースでは、ブロック401の実行時間がt−2からt+5までの7サイクルとなる。
【0068】
次に、図9(B)は、ブロック401のLD命令の実行結果がキャッシュミスである場合のタイミング例を示している。LD命令の結果がキャッシュミスである場合、タイミング情報351に、ペナルティとして、再実行が行える時間が設定されているため、ペナルティサイクルが遅延時間として追加される。本実施の形態における遅延時間は、タイミング情報351のペナルティフィールドに格納された6クロック分となる。
【0069】
したがって、2番目の処理要素(e2)の実行は、タイミングt+7に遅延する。LD命令の次に実行されるMULT命令は、遅延の影響を受けずにそのまま実行されるが、ADD命令は、LD命令の実行完了のタイミングt+8以降となり、4サイクル分の待機時間(4サイクル分のストール)が生じる。
【0070】
このように、図4(B)に示すように、ブロック401の命令実行をシミュレーションした場合に、LD命令の実行結果がキャッシュミスであるケースでは、ブロック401の実行時間がt−2からt+9までの11サイクルとなる。
【0071】
図10は、ホストコードの生成例を示す説明図である。図10で示す説明図では、ターゲットコードからホストコードの生成例について説明する。図10(A)は、ターゲットコードから機能シミュレーション用となる機能コードが生成される例を示す図であり、図10(B)は、機能コードにサイクルシミュレーション用コードが組み込まれる例を示す図である。ホストコードには、ターゲットコードに対応する機能コードと、ブロックの実行時間を求めるためのコードであるサイクルシミュレーション用コードが含まれる。
【0072】
図10(A)に示すように、シミュレーション装置100は、ターゲットコードから機能コードを生成する。具体的に、ターゲットコードInst_Aは、ホストコードHost_Inst_A0_func、Host_Inst_A1_funcに変換される。同様に、ターゲットコードInst_Bは、ホストコードHost_Inst_B0_func、Host_Inst_B1_func、Host_Inst_B2_func、…に変換される。
【0073】
次に、図10(B)に示すように、シミュレーション装置100は、機能コードに、サイクルシミュレーション用コードを組み込む。具体的に、ターゲットコードInst_Aのサイクルシミュレーション用コードHost_Inst_A2_cycle、Host_Inst_A3_cycleが、Host_Inst_A1_funcの次に組み込まれる。同様に、ターゲットコードInst_Bのサイクルシミュレーション用コードHost_Inst_B4_cycle、Host_Inst_B5_cycleが、Host_Inst_B3_funcの次に組み込まれる。ターゲットコードInst_Cについても、ターゲットコードInst_A、ターゲットコードInst_B同様に変換される。
【0074】
なお、サイクルシミュレーション用コードは、各命令のeステージの実行時間(所要サイクル数)を定数化し、各命令のeステージの実行時間を合計してブロックの処理時間を求めるコードである。これにより、ブロック実行中の進み具合を示す情報を得ることができる。
【0075】
ここで、ホストコードのうち、機能コード、外部依存命令以外の命令についてのサイクルシミュレーション用コードは既知のコードを使用して実施できるので、具体例の説明を省略する。外部依存命令についてのサイクルシミュレーション用コードは、補正処理を呼び出すヘルパー関数として用意される。ヘルパー関数については図11にて後述する。
【0076】
図11は、第1の補正部の処理コード例を示す説明図である。第1の補正部となる補正部322は、図11で示す処理コード1101のようなヘルパー関数モジュールとして実施される。本実施の形態では、たとえば、LD命令のキャッシュの実行結果ごとにシミュレーションを行う従来の関数「cache_ld(address)」の代わりに、ヘルパー関数「cache_ld(address,rep_delay,pre_delay)」がホストコードに組み込まれることにより、実現している。
【0077】
ヘルパー関数の第2引数“rep_delay”は、LD命令の返り値を使用する次の命令のeステージの実行までに、ペナルティ時間のうち遅延時間として処理されなかった時間(猶予時間)である。ヘルパー関数の第3引数“pre_delay”は、1つ前の命令から受ける遅延時間である。“pre_delay”が“−1”である場合は、前の命令に遅延がないことを示す。“rep_delay”と“pre_delay”は、性能シミュレーション結果とタイミング情報351との静的分析処理の結果から得られる時間情報である。
【0078】
また、図11で示す処理コード1101がLD命令についての例であるため、pre_delayは、1つ前のLD命令の遅延時間分を示す。
【0079】
さらに、処理コード1101では、current_timeが現在のタイミングを示し、preld_timeが現在のタイミングから1つ前のLD命令のeステージの実行時刻を示し、avail_delayが有効遅延時間を示す。cache_miss_latencyは、キャッシュミス時のペナルティ時間を示す。
【0080】
図11にて、補正部322は、current_timeとpreld_timeとの差がpre_delayより大きい場合、preld_timeとcurrent_timeまでの時間でpre_delayを調整してavail_delayを求める。次に、補正部322は、実行結果がキャッシュミスであれば、予測結果の誤りであり、avail_delayにcache_miss_latencyを加算して、猶予時間rep_delayをもとに、LD命令のeステージの実行時間を補正する。次に、図12〜図14にて、補正部322によるLD命令の実行結果に対する補正例を示す。
【0081】
図12は、第1の補正部による実行結果の第1の補正例を示す説明図である。図12では、1つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。
【0082】
図12の例では、ブロック401の3命令の性能シミュレーションが実行される。図12(A)は、予測結果が「キャッシュヒット」の場合の命令実行タイミングチャート例を示す図である。この予測ケースにおいて、3番目に実行されるADD命令に、2サイクルストールが生じている。
【0083】
図12(B)は、予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す図である。この予測ミスのケースでは、LD命令の実行結果がキャッシュミスであると、ペナルティサイクル(6サイクル)分の遅延が生じる。そのため、MULT命令は、遅延の影響を受けずに実行されるが、ADD命令のeステージの実行は、LD命令の完了を待つため、4サイクル分遅延することになる。
【0084】
図12(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、LD命令の実行結果がキャッシュミスであるので(予測結果のミス)、残りのeステージの実行時間(2−1=1サイクル)に所定のキャッシュミス時のペナルティ時間(6サイクル)を加算して有効遅延時間(7サイクル)とする。有効遅延時間は、最大の遅延時間となる。
【0085】
さらに、補正部322は、次のMULT命令のeステージの実行時間(3サイクル)を得て、次命令のeステージの実行時間が遅延時間を超過しないと判定して、有効遅延時間から次命令のeステージの実行時間を差し引いた時間(7−3=4サイクル)を、LD命令の遅延が生じたeステージの実行時間(遅延時間)とする。また、補正部322は、有効遅延時間から上記の遅延時間を差し引いた時間(3サイクル)を猶予時間とする。猶予時間は、ペナルティとしての遅延が猶予された時間である。
【0086】
補正部322は、ヘルパー関数cache_ld(address,rep_delay,pre_delay)で、猶予時間rep_delay=3、前命令の遅延時間pre_delay=−1(遅延なし)を返す。
【0087】
この補正により、LD命令のeステージの実行時間は、実行された時間と遅延時間を加算した実行時間(1+4=5サイクル)となり、実行完了のタイミングt1から、後続のMULT命令、ADD命令のeステージの実行時間が計算される。
【0088】
このように、シミュレーション装置100は、補正したLD命令のeステージの実行時間に予測シミュレーション実行部312の処理結果で求められていたMULT命令とADD命令の各々のeステージの実行時間を加算することで、ブロックの実行時間を得られる。図12(C)の例では、シミュレーション装置100は、LD命令のeステージの実行時間5サイクルに、MULT命令とADD命令の各々のeステージの実行時間となる3サイクル、1サイクルを加算する。
【0089】
よって、シミュレーション装置100は、実行結果が予測と異なる命令のeステージの実行時間に加算または減算による補正処理を行い、その他の命令については、予測結果に基づくシミュレーション時に求められたeステージの実行時間を加算する。これにより、シミュレーション装置100は、高精度に、キャッシュミス時のシミュレーションの実行サイクル数を求めることができる。
【0090】
図12(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図12(D)の場合には、LD命令の遅延時間をそのまま加算しているため、実際には、LD命令の実行中に実行が完了するMULT命令の実行時刻のずれによる誤差が生じている。
【0091】
図13は、第1の補正部による実行結果の第2の補正例を示す説明図である。図13では、2つのキャッシュ処理が実行されるケースで2つのキャッシュミスが生じた場合の補正例を説明する。図13の例では、ブロック1301で示す、以下の5命令を含む性能シミュレーションが実行される。
【0092】
LD r2,[r1]; //r2←[r1];
LD r4,[r3]; //r4←[r3];
MULT r7,r5,r6; //r7←r5*r6;
ADD r2,r2,r4; //r2←r2+r4;
ADD r2,r2,r7; //r2←r2+r7;
【0093】
図13(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、2つのLD命令が、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行される。
【0094】
図13(B)は、2つのキャッシュ処理の両方が予測結果と異なる「キャッシュミス」の場合の命令実行タイミングのチャート例を示す説明図である。図13(B)で示す予測ミスのケースでは、2つのLD命令のそれぞれでキャッシュミスがあり、ペナルティサイクル(6サイクル)分の遅延が生じる。しかし、2つのLD命令の遅延時間は重なる時間があり、MULT命令も、遅延の影響を受けずにeステージが実行され、2つのADD命令のeステージの実行が2つめのLD命令の完了まで遅延することになる。
【0095】
図13(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、図12を用いて説明したように、タイミングt0において、1つめのLD命令の遅延時間を補正し、ヘルパー関数cache_ld(address,3,−1)を返す。
【0096】
次に、現タイミングt1において、補正部322は、2つめのLD命令の実行結果がキャッシュミスであるので(予測結果のミス)、このLD命令の残りのeステージの実行時間にペナルティサイクル(6サイクル)を追加して有効遅延時間(1+6=7サイクル)とする。
【0097】
補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間(<現タイミングt1−前命令のeステージの実行時刻t0>−設定された間隔)を差し引いて、現タイミングt1から超過した有効遅延時間を求め(7−(6−2)=3サイクル)、超過した有効遅延時間を、2つめのLD命令のeステージの実行時間とする。さらに、補正部322は、超過した有効遅延時間から本来のeステージの実行時間を差し引いて(3−1=2サイクル)、前命令の遅延時間とする。
【0098】
また、補正部322は、有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(3+3)=1サイクル)、猶予時間とする。
【0099】
補正部322は、タイミングt1において、2つめのLD命令の遅延時間を補正した後、ヘルパー関数cache_ld(address、1、2)を返す。この補正により、現タイミングt1に補正値(3サイクル)を付加したタイミングがLD命令の実行完了のタイミングとなり、そのタイミングから、以降のMULT命令、ADD命令のeステージの実行時間が加算されていくことになる。
【0100】
図13(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図13(D)の場合には、2つのLD命令それぞれに与えられたペナルティに基づく遅延時間をそのまま加算しているため、大きな誤差(9サイクル)が生じている。図13(C)に示す補正部322の処理でも、図13(B)に示すように正しくシミュレーションされる場合に比べて誤差(1サイクル)があるが、従来手法に比べて、非常に高精度に求められることがわかる。
【0101】
図14は、第1の補正部による実行結果の第3の補正例を示す説明図である。図14では、2つのキャッシュ処理が実行されるケースで1つのキャッシュミスが生じた場合の補正例を説明する。図14の例では、図13で示す説明例と同様の5つの命令の性能シミュレーションが実行される。
【0102】
図14(A)は、2つのキャッシュ処理での予測結果が「キャッシュヒット」の場合の命令実行タイミングのチャート例を示す図である。この予測ケースでは、図13(A)の場合と同様に、2つのLD命令のeステージが、2サイクル分(通常の1サイクル+付加した1サイクル)をあけて実行されるものとする。
【0103】
図14(B)は、1つめのLD命令が予測結果と異なる「キャッシュミス」となり、2つめのLD命令の結果が予測結果(キャッシュヒット)である場合の命令実行タイミングのチャート例を示す図である。図14(B)で示す予測ミスのケースでは、1つ目のLD命令にペナルティサイクル(6サイクル)分の遅延が生じる。しかし、MULT命令は、遅延の影響を受けずにeステージが実行され、2つのADD命令のeステージの実行が1つ目のLD命令の完了まで遅延することになる。
【0104】
図14(C)は、補正部322による補正後の命令実行タイミングチャートの例を示す図である。補正部322は、図12を用いて説明したように、タイミングt0において、1つめのLD命令の遅延時間を補正し、ヘルパー関数cache_ld(address,3,−1)を返す。
【0105】
次に、現タイミングt1において、補正部322は、2つめのLD命令の実行結果がキャッシュヒットであるので(予測結果)、このLD命令のeステージの実行開始から現タイミングt1までの時間<t1−t0−(6−0−2=4サイクル)>が、このLD命令のeステージの実行時間(2サイクル)より大きいかを判断する。
【0106】
補正部322は、2つめのLD命令のeステージの実行開始から現タイミングt1までの時間が、このLD命令のeステージの実行時間(2サイクル)より大きいので、現タイミングt1を、次のMULT命令のeステージの実行時刻とする。
【0107】
そして、補正部322は、2つめのLD命令の実行完了から現タイミングt1までの時間を(2サイクル)、次の命令に対する遅延時間として扱い、前命令の遅延時間pre_delay=2とする。また、補正部322は、1つめのLD命令の有効遅延時間から、現タイミングt1までに消費した遅延時間と現タイミングt1で超過した有効遅延時間との合計を差し引いて(7−(6+0)=1サイクル)、猶予時間rep_delay=1とし、ヘルパー関数cache_ld(address,1,2)を返す。
【0108】
図14(D)は、シミュレーション装置100の処理と比較するために、従来技術によるキャッシュミス時のサイクル数を単純な加算により求めた場合の誤差の大きさを示す図である。図14(D)の場合には、1つめのLD命令のペナルティによる遅延時間をそのまま加算しているため誤差が生じている。次に、図15〜図18にて、第2の補正部となる補正部323による実行結果の補正例を示す。
【0109】
図15は、第2の補正部による実行結果の第1の補正例を示す説明例である。図15では、ブロック間にてレジスタの依存関係がある場合の補正例を示しており、具体的には、続けて実行されるブロック1501とブロック1502にて、同一のレジスタを使用する場合の補正例を示している。ブロック1501は、末尾の命令にて、“LD r1,[r2];”を実行し、ブロック1502は、先頭の命令にて、“ADD r1,r1,r3”を実行する。また、LD命令のeステージの実行時刻をtとする。
【0110】
シミュレーション装置100は、実行されるブロックの末尾の命令に含まれる資源と、実行されるブロックの前に実行された前ブロックの先頭の命令に含まれる資源を特定する。特定した結果が、ブロック資源情報355に格納される。シミュレーション装置100は、ブロック1501の末尾であるLD命令に含まれる資源群をブロック資源情報355_1501tに格納し、ブロック1502の先頭の命令であるADD命令に含まれる資源をブロック資源情報355_1502hに格納する。
【0111】
ブロック資源情報355は、ブロックの先頭または末尾から所定数の命令に含まれる資源群と、資源の位置を格納する情報である。ブロック資源情報355は、資源名、命令のブロック上位置という2つのフィールドを含む。資源名フィールドには、資源となるレジスタ番号または演算ユニット名が格納される。命令のブロック上位置フィールドには、該当の資源を用いる命令の、ブロックの先頭または末尾からの位置が格納される。
【0112】
たとえば、ブロック資源情報355_1501tは、資源として書込対象となるr1と実行対象となるロードユニットが、ブロック1501の末尾から1番目の位置で使用されることを示している。同様に、ブロック資源情報355_1502hは、資源として読込対象と書込対象となるr1、読込対象となるr3と実行対象となる整数演算ユニットが、ブロック1502の先頭から1番目の位置で使用されることを示している。
【0113】
このように、ブロック1501とブロック1502は、r1が共通して使用されているため、ターゲットCPUは、ブロック1501のLD命令が完了するまで、ブロック1502のADD命令のeステージの実行を停止させることになる。シミュレーション装置100は、r1がADD命令で使用される時刻t+1と、r1がLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出する。
【0114】
この状態で、図15(A)では、ブロック1501の実行の後にブロック1502の命令実行をシミュレーションした場合、ブロック1501の末尾のLD命令のfステージからADD命令のeステージ終了までの時間が、5サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージの実行時刻を、遅延時間の1サイクルを加えたt+2に補正する。なお、シミュレーション装置100は、後続の命令の実行時刻についても1サイクル加えた時刻に補正する。
【0115】
図15(B)は、シミュレーション装置100の処理と比較するために、従来技術によるブロック間にてレジスタの依存関係がある場合の誤差の大きさを示す図である。図15(B)の場合には、レジスタの依存関係によってADD命令のeステージの実行の停止を考慮しないためによる誤差が生じている。
【0116】
図16は、第2の補正部による実行結果の第2の補正例を示す説明図である。図16では、ターゲットCPUがスーパスカラプロセッサであり、レジスタの依存関係がある場合の補正例を示している。ターゲットCPUがスーパスカラプロセッサである場合、ターゲットCPUは、複数の命令を同時に実行することができる。したがって、シミュレーション装置100は、実行されるブロックの先頭から特定する命令の所定数を、ターゲットCPUが同時に実行できる命令の数に設定する。図16では、ターゲットCPUが同時に2命令を実行できる場合を想定している。また、図16では、ロードユニット、整数演算ユニットが2つ以上存在している状態を想定している。また、1つ目のLD命令のeステージの実行時刻をtとする。
【0117】
さらに、図16では、ブロック1601とブロック1602が続けて実行される場合を想定している。ブロック1601は、末尾から2番目の命令にて、“LD r1,[r2];”を実行し、末尾の命令にて、“LD r3,[r4];”を実行する。また、ブロック1602は、先頭の命令にて、“ADD r1,r1,r5”を実行し、先頭から2番目の命令にて、“ADD r3,r3,r5”を実行する。
【0118】
シミュレーション装置100は、ブロック1601の末尾の命令と末尾から2番目の命令と、で指定される資源群を検出し、ブロック資源情報355_1601tに格納する。また、シミュレーション装置100は、ブロック1602の先頭の命令と先頭から2番目の命令と、で指定される資源群を特定し、ブロック資源情報355_1602hに格納する。ブロック1601とブロック1602がr1、r3を共通して使用していることを示しているため、ターゲットCPUは、ブロック1601の2つのLD命令が完了するまで、ブロック1602の2つのADD命令のeステージの実行を停止させることになる。
【0119】
共通して使用される資源が複数あるため、シミュレーション装置100は、r1とr3のうち、先頭命令で使用される時刻と、末尾命令での使用が終了する時刻の差が最大となる資源を特定する。この場合、r1、r3は、ADD命令で使用される時刻t+1と、LD命令での使用が終了する時刻t+2から、差が共に1サイクルとなる。したがって、シミュレーション装置100は、遅延時間を1サイクルとして算出する。
【0120】
この状態で、図16(A)では、ブロック1601の後にブロック1602の命令実行をシミュレーションした場合、ブロック1601の末尾から2番目のLD命令におけるfステージから2番目のADD命令のeステージ終了までの時間が、5サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージ実行時刻を、t+1に1サイクルを加えたt+2に補正する。
【0121】
図17は、第2の補正部による実行結果の第3の補正例を示す説明図である。図17では、実行時間が長い命令にてレジスタの依存関係がある場合の補正例を示している。具体的には、続けて実行されるブロック1701とブロック1702にて、同一のレジスタを使用しており、さらにブロック1701にて、実行時間が長い命令を実行した場合の補正例について説明する。また、図17では、実行時間が長い命令として、MULT命令を実行した場合の例を示している。また、MULT命令のeステージの実行時刻をtとする。
【0122】
ブロック1701は、末尾の命令にて、“MULT r1,r2,r1;”を実行し、ブロック1702は、先頭の命令にて、“MOV r3,0;”を実行し、先頭から2番目の命令にて、“ADD r1,r3,r1;”を実行する。なお、MOV命令は、データの複写を行う命令である。
【0123】
シミュレーション装置100は、ブロック1701の末尾の命令で指定される資源群を検出し、ブロック資源情報355_1701tに格納する。また、シミュレーション装置100は、ブロック1702の先頭の命令と先頭から2番目の命令と、で指定される資源群を特定し、ブロック資源情報355_1702hに格納する。ブロック1701とブロック1702がr1を共通して使用していることを示しているため、ターゲットCPUは、ブロック1701のMULT命令が完了するまで、ブロック1702のADD命令のeステージの実行を停止させることになる。シミュレーション装置100は、r1がADD命令で使用される時刻t+2と、r1がLD命令での使用が終了する時刻t+3の差1サイクルを遅延時間として算出する。
【0124】
この状態で、図17(A)では、ブロック1701の後にブロック1702の命令実行をシミュレーションした場合、ブロック1701の末尾のMULT命令におけるfステージからADD命令のeステージ終了までの時間が、6サイクルとなる。具体的には、シミュレーション装置100は、ADD命令のeステージの実行時刻を、t+2に1サイクルを加えたt+3に補正する。
【0125】
図18は、第2の補正部による実行結果の第4の補正例を示す説明図である。図18では、続けて実行されるブロック間にて演算ユニットの依存関係がある場合の補正例を示している。具体的には、続けて実行されるブロック1801とブロック1802にて、ロードユニットを使用している。また、ブロック1801のLD命令のeステージの実行時刻をtとする。
【0126】
ブロック1801は、末尾の命令にて、“LD r1,[r2];”を実行し、ブロック1802は、先頭の命令にて、“LD r3,[r4];”を実行する。シミュレーション装置100は、ブロック1801の末尾の命令で指定される資源群を検出し、ブロック資源情報355_1801tに格納する。また、シミュレーション装置100は、ブロック1802の先頭の命令で指定される資源群を特定し、ブロック資源情報355_1802hに格納する。
【0127】
ターゲットCPUが有するロードユニットの個数は、レコード354−3が示すように、1つであるため、ターゲットCPUは、ブロック1801のLD命令が完了するまで、ブロック1802のLD命令のeステージの実行を停止させることになる。シミュレーション装置100は、ロードユニットがブロック1802のLD命令で使用される時刻t+1と、ロードユニットのLD命令での使用が終了する時刻t+2の差1サイクルを遅延時間として算出する。
【0128】
この状態で、図18(A)では、ブロック1801の後にブロック1802の命令実行をシミュレーションした場合、ブロック1801のLD命令におけるfステージからブロック1802のLD命令のeステージ終了までの時間が、6サイクルとなる。具体的には、シミュレーション装置100は、ブロック1802のLD命令のeステージの実行時刻を、t+1に1サイクルを加えたt+2に補正する。
【0129】
また、第2の補正部となる補正部323は、先行ブロックの末尾命令に分岐命令がある場合、分岐予測結果を取得し、予測が的中だった場合に、図15〜図18で示した補正例を行う。予測が的中しなかった場合、補正部323は、図15〜図18で示した補正を行わない。補正を行わない理由は、予測ミスの影響が大きいためである。
【0130】
図19は、コード変換部の処理例を示すフローチャートである。シミュレーション装置100は、ターゲットコードを所定のブロックに分割して入力する(ステップS1901)。次に、シミュレーション装置100は、入力されたブロックの命令を分析して、外部依存命令を検出し(ステップS1902)、検出した全ての命令について、予測情報352に基づいて、確率が高い予測結果を設定する(ステップS1903)。
【0131】
予測結果の設定後、シミュレーション装置100は、タイミング情報351を参照して、ブロックの各命令について予測結果を前提とする性能シミュレーションを実行する(ステップS1904)。また、シミュレーション装置100は、ブロックの先頭から所定数の命令で指定される資源群と、ブロックの末尾の所定数の命令で指定される資源群とをブロック資源情報355に書き込む(ステップS1905)。
【0132】
シミュレーション装置100は、シミュレーション結果に基づいて、性能シミュレーション用ホストコードを生成する(ステップS1906)。ステップS1901〜ステップS1904、ステップS1906の処理によって、シミュレーション装置100は、設定された予測結果の場合での機能コードに、ターゲットCPUの性能をシミュレーションするコードが組み込まれたホストコードを出力する。
【0133】
図20は、シミュレーション実行部の処理例を示すフローチャートである。シミュレーション装置100は、性能シミュレーション用ホストコードを取得し(ステップS2001)、ホストコードの実行により性能シミュレーションを実行する(ステップS2002)。次に、シミュレーション装置100は、性能シミュレーション実行中に外部依存命令を検出すると(ステップS2003)、外部依存命令の実行結果が予測結果と同一か否かを判断する(ステップS2004)。
【0134】
外部依存命令の実行結果が予測結果と同一でない場合(ステップS2004:No)、シミュレーション装置100は、補正部322により命令の実行時間を補正する(ステップS2005)。命令の実行時間の補正後、または、外部依存命令の実行結果が予測結果と同一である場合(ステップS2004:Yes)、シミュレーション装置100は、ブロック間補正処理を実行する(ステップS2006)。なお、ブロック間補正処理の詳細については、図22にて後述する。最後に、シミュレーション装置100は、ターゲットプログラムに相当するホストコード全てのシミュレーション処理についてのシミュレーション情報356を出力する(ステップS2007)。
【0135】
以上のステップS2001〜ステップS2007の処理により、シミュレーション装置100は、ターゲットプログラム101を実行するターゲットCPUのシミュレーション情報356を出力する。
【0136】
図21は、シミュレーション結果の第1の補正処理例を示すフローチャートである。図21では、外部依存命令の一例として、LD命令に対する補正処理例について説明する。シミュレーション装置100は、処理中のブロックの命令から、外部依存命令を検出すると、補正部322に相当するヘルパー関数を呼び出す(ステップS2101)。
【0137】
シミュレーション装置100は、LD命令で、キャッシュアクセスが要求されているか否かを判定する(ステップS2102)。キャッシュアクセスが要求されている場合(ステップS2102:Yes)、シミュレーション装置100は、キャッシュアクセスの実行をシミュレーションする(ステップS2103)。
【0138】
シミュレーション装置100は、キャッシュアクセスの結果を判断する(ステップS2104)。キャッシュアクセスの結果が“キャッシュミス”である場合(ステップS2104:“ミス”)、シミュレーション装置100は、LD命令のeステージの実行時間(サイクル数)を補正する(ステップS2105)。補正後、シミュレーション装置100は、補正された実行時間(サイクル数)を出力する(ステップS2106)。
【0139】
キャッシュアクセスが要求されていない場合(ステップS2102:No)、または、要求されたキャッシュアクセスが“キャッシュヒット”である場合(ステップS2104“ヒット”)、シミュレーション装置100は、未補正の予測された実行時間(サイクル数)を出力する(ステップS2107)。
【0140】
図22は、シミュレーション結果の第2の補正処理例を示すフローチャートである。シミュレーション装置100は、処理中のブロックの命令の実行時刻を取得する(ステップS2201)。次に、シミュレーション装置100は、先行ブロックの末尾命令に分岐命令が存在するか否かを判断する(ステップS2202)。分岐命令が存在する場合(ステップS2202:Yes)、シミュレーション装置100は、性能シミュレーションの分岐予測の分岐予測結果を取得する(ステップS2203)。
【0141】
続けて、シミュレーション装置100は、分岐予測結果が的中であったか否かを判断する(ステップS2204)。的中であった場合(ステップS2204:Yes)、または、分岐命令が存在しない場合(ステップS2202:No)、シミュレーション装置100は、先行ブロックの末尾命令で指定される第1の資源群と、処理中のブロックの先頭命令で指定される第2の資源群を検出する(ステップS2205)。なお、ステップS2205の処理は、先行ブロックの末尾命令で指定される書込対象のレジスタ群を第1の資源群として、処理中のブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出してもよい。
【0142】
続けて、シミュレーション装置100は、第1および第2の資源群に共通して含まれる資源を特定する(ステップS2206)。なお、ステップS2206の処理は、共通して含まれる資源のうち、先頭命令で使用される時刻と、末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。また、ステップS2206の処理は、共通して含まれる資源が演算ユニットであり、かつターゲットCPUが有する演算ユニットの個数が末尾命令および先頭命令にて指定された個数より多い場合、演算ユニットを特定してもよい。
【0143】
次に、シミュレーション装置100は、何らかの資源が特定されたか否かを判断する(ステップS2207)。資源が特定された場合(ステップS2207:Yes)、シミュレーション装置100は、特定された資源が先頭命令で使用される時刻と特定した資源の末尾命令での使用が終了する時刻とから、遅延時間を算出する(ステップS2208)。遅延時間の算出後、シミュレーション装置100は、遅延時間によって、実行中のブロックの命令の実行時刻を補正し(ステップS2209)、補正した実行中のブロックの命令の実行時刻を出力し(ステップS2210)、ブロック間補正処理を終了する。
【0144】
的中でない場合(ステップS2204:No)、または、資源が特定されなかった場合(ステップS2207:No)、シミュレーション装置100は、実行中のブロックの命令の実行時刻を出力し(ステップS2211)、ブロック間補正処理を終了する。
【0145】
以上説明したように、補正装置、補正方法、および補正プログラムによれば、プログラムコードを分割したブロック間でまたがって使用される資源を特定し、競合した資源を使用する時刻と使用可能となる時刻を用いてサイクル数を補正する。これにより、補正装置は、性能シミュレーションの精度を向上させることができる。
【0146】
また、ブロック間で競合した資源の補正方法が、各命令の実行時刻に遅延時間を単純に加算するだけであるため、シミュレーションにかかる時間をほとんど増加させずに、精度を向上させることができる。
【0147】
また、補正装置は、先行ブロックの末尾命令が分岐命令であり、分岐予測結果が的中していた場合に、ブロック間の補正を行ってもよい。シミュレーション結果に与える影響について、分岐予測が外れていた場合は、ブロック間の影響より予測ミスによる影響が大きいため、補正装置は、ブロック間の影響が大きいときに、ブロック間による補正を行うことができる。
【0148】
また、補正装置は、第1および第2の資源群に共通して含まれる資源のうち、該当の資源が先頭命令で使用される時刻と該当の資源の末尾命令での使用が終了する時刻の差が最大となる資源を特定してもよい。これにより、補正装置は、ブロック間で、シミュレーション結果に最も影響のある資源を特定するため、より性能シミュレーションの精度を向上させることができる。
【0149】
また、補正装置は、末尾命令で指定される書込対象の記憶領域を第1の資源群として検出してもよい。これにより、補正装置は、単純に末尾命令で指定される記憶領域を第1の資源群とするより、読込対象の記憶領域の分だけ第1の資源群の数を減らすことができ、共通して含まれる資源の特定処理を高速化することができる。
【0150】
また、補正装置は、共通して含まれる資源が演算ユニットであり、ターゲットCPUが有する演算ユニットの個数が、末尾命令および先頭命令にて指定された個数より少ない場合、演算ユニットを特定してもよい。これにより、補正装置は、演算ユニットの個数が十分にあり、ブロック間の補正を行わなくてよい場合を除外することができる。
【0151】
(実施の形態2の概要)
実施の形態1にかかるシミュレーション装置100では、性能シミュレーションを行っていた。実施の形態2にかかるシミュレーション装置100は、電力シミュレーションを行う。実施の形態2にかかるシミュレーション装置のハードウェアについては、実施の形態1にかかるシミュレーション装置と同等であるため、説明を省略する。また、実施の形態2にかかるシミュレーション装置の機能については、取得部331、補正部336、出力部337以外については、同一の機能であるため、説明を省略する。また、実施の形態2にかかるシミュレーション装置は、命令が消費する電力情報にアクセス可能である。また、電力シミュレーションの補正例、電力情報の詳細については、図23で後述する。
【0152】
実施の形態2にかかる取得部331は、プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および命令で消費する電力を取得する機能を有する。たとえば、実施の形態2にかかる取得部331は、ブロック103のADD命令の実行時刻t+1と、ADD命令が消費する電力0.3[uW]を取得する。なお、取得結果は、RAM203、磁気ディスク205、光ディスク207などの記憶領域に記憶される。
【0153】
実施の形態2にかかる補正部336は、算出部335によって算出された遅延時間に応じた消費電力にて、実施の形態2にかかる取得部331によって取得されたいずれかのブロックの命令の実行で消費する電力を補正する機能を有する。たとえば、実施の形態2にかかる補正部336は、遅延時間が2サイクルであれば、ADD命令が消費する電力0.3[uW]に2×0.05[uW]を加算する。
【0154】
実施の形態2にかかる出力部337は、実施の形態2にかかる補正部336によって補正されたいずれかのブロックの命令で消費する電力を出力する機能を有する。たとえば、実施の形態2にかかる出力部337は、補正されたADD命令が消費する電力0.3+2×0.05=0.31[uW]を出力する。
【0155】
図23は、実施の形態2にかかるシミュレーション装置の補正例を示す説明図である。図23では、性能シミュレーション用のホストコードに組み込む関数(電力シミュレーション関数)として実施した場合の例を示す図である。
【0156】
命令が消費する電力を記憶する電力情報2301として、LD命令、MULT命令、ADD命令の1実行当たりの消費電力が、それぞれ0.3[uW]、0.5[uW]、0.3[uW]と設定されている。電力シミュレーション関数Host_Inst_A−C_powerは、シミュレーションで実行された各命令の実行回数に基づいて、電力を計算する。
【0157】
たとえば、先行ブロックによって生じる遅延時間が1サイクルであった場合、電力シミュレーション関数は、ADD命令で消費する電力0.3[uW]に、1サイクル分の消費電力0.05[uW]を加算することで、ADD命令で消費する電力を補正する。
【0158】
実施の形態2にかかる補正処理のフローチャートについては、図22とほぼ等しいため、図示を省略する。図22からの変更点としては、ステップS2201の処理が、「処理中のブロックの命令の実行時刻および命令で消費する電力を取得」となる。また、ステップS2209の処理が、「遅延時間応じた消費電力によって、実行中のブロックの命令で消費する電力を補正」となる。また、ステップS2210の処理が、「補正した実行中のブロックの命令で消費する電力を出力」となる。
【0159】
以上説明したように、補正装置、補正方法、および補正プログラムによれば、パイプラインがストールした時間で消費する電力を考慮した、より正確な消費電力をシミュレーションすることができる。
【0160】
なお、本実施の形態で説明した補正方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本補正プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本補正プログラムは、インターネット等のネットワークを介して配布してもよい。
【符号の説明】
【0161】
323 補正部
331 取得部
332 判定部
333 検出部
334 特定部
335 算出部
336 補正部
337 出力部
355 ブロック資源情報
【特許請求の範囲】
【請求項1】
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得する取得部と、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する検出部と、
前記検出部によって検出された前記第1および第2の資源群に共通して含まれる資源を特定する特定部と、
前記特定部によって特定された資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出する算出部と、
前記算出部によって算出された遅延時間にて、前記取得部によって取得された前記いずれかのブロックの命令の実行時刻を補正する補正部と、
前記補正部によって補正された前記いずれかのブロックの命令の実行時刻を出力する出力部と、
を備えることを特徴とする補正装置。
【請求項2】
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得する取得部と、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する検出部と、
前記検出部によって検出された前記第1および第2の資源群に共通して含まれる資源を特定する特定部と、
前記特定部によって特定された資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出する算出部と、
前記算出部によって算出された遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正する補正部と、
前記補正部によって補正された前記いずれかのブロックの命令で消費する電力を出力する出力部と、
を備えることを特徴とする補正装置。
【請求項3】
前記末尾命令が分岐命令である場合、前記末尾命令のシミュレーションの実行結果にて分岐予測結果が的中であったか否かを判定する判定部をさらに備え、
前記取得部は、
前記末尾命令の分岐予測結果を取得し、
前記検出部は、
前記判定部によって前記末尾命令の分岐予測が的中したと判定された場合、前記第1および第2の資源群を検出する、
ことを特徴とする請求項1または2に記載の補正装置。
【請求項4】
前記特定部は、
前記共通して含まれる資源のうち、当該資源が前記先頭命令で使用される時刻と当該資源の前記末尾命令での使用が終了する時刻の差が最大となる資源を特定する、
ことを特徴とする請求項1〜3のいずれか一つに記載の補正装置。
【請求項5】
前記出力部は、
前記特定部によって前記共通して含まれる資源が特定されない場合、前記取得部によって取得された前記いずれかのブロックの命令の実行時刻を出力する、
ことを特徴とする請求項1、3、4のいずれか1つに記載の補正装置。
【請求項6】
前記検出部は、
前記先行ブロックの末尾命令で指定される書込対象の記憶領域群を前記第1の資源群として、前記いずれかのブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出する、
ことを特徴とする請求項1〜5のいずれか1つに記載の補正装置。
【請求項7】
前記特定部は、
前記共通して含まれる資源が演算ユニットであり、かつ前記プログラムコードのシミュレーション対象となるCPUが有する前記演算ユニットの個数が前記末尾命令および前記先頭命令にて指定された個数より少ない場合、前記演算ユニットを特定する、
ことを特徴とする請求項1〜6のいずれか1つに記載の補正装置。
【請求項8】
コンピュータが、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定した資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間にて、取得した前記いずれかのブロックの命令の実行時刻を補正し、
補正した前記いずれかのブロックの命令の実行時刻を出力する、
処理を実行することを特徴とする補正方法。
【請求項9】
コンピュータが、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正し、
補正した前記いずれかのブロックの命令で消費する電力を出力する、
処理を実行することを特徴とする補正方法。
【請求項10】
コンピュータに、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定した資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間にて、取得した前記いずれかのブロックの命令の実行時刻を補正し、
補正した前記いずれかのブロックの命令の実行時刻を出力する、
処理を実行させることを特徴とする補正プログラム。
【請求項11】
コンピュータに、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正し、
補正した前記いずれかのブロックの命令で消費する電力を出力する、
処理を実行させることを特徴とする補正プログラム。
【請求項1】
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得する取得部と、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する検出部と、
前記検出部によって検出された前記第1および第2の資源群に共通して含まれる資源を特定する特定部と、
前記特定部によって特定された資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出する算出部と、
前記算出部によって算出された遅延時間にて、前記取得部によって取得された前記いずれかのブロックの命令の実行時刻を補正する補正部と、
前記補正部によって補正された前記いずれかのブロックの命令の実行時刻を出力する出力部と、
を備えることを特徴とする補正装置。
【請求項2】
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得する取得部と、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出する検出部と、
前記検出部によって検出された前記第1および第2の資源群に共通して含まれる資源を特定する特定部と、
前記特定部によって特定された資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出する算出部と、
前記算出部によって算出された遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正する補正部と、
前記補正部によって補正された前記いずれかのブロックの命令で消費する電力を出力する出力部と、
を備えることを特徴とする補正装置。
【請求項3】
前記末尾命令が分岐命令である場合、前記末尾命令のシミュレーションの実行結果にて分岐予測結果が的中であったか否かを判定する判定部をさらに備え、
前記取得部は、
前記末尾命令の分岐予測結果を取得し、
前記検出部は、
前記判定部によって前記末尾命令の分岐予測が的中したと判定された場合、前記第1および第2の資源群を検出する、
ことを特徴とする請求項1または2に記載の補正装置。
【請求項4】
前記特定部は、
前記共通して含まれる資源のうち、当該資源が前記先頭命令で使用される時刻と当該資源の前記末尾命令での使用が終了する時刻の差が最大となる資源を特定する、
ことを特徴とする請求項1〜3のいずれか一つに記載の補正装置。
【請求項5】
前記出力部は、
前記特定部によって前記共通して含まれる資源が特定されない場合、前記取得部によって取得された前記いずれかのブロックの命令の実行時刻を出力する、
ことを特徴とする請求項1、3、4のいずれか1つに記載の補正装置。
【請求項6】
前記検出部は、
前記先行ブロックの末尾命令で指定される書込対象の記憶領域群を前記第1の資源群として、前記いずれかのブロックの先頭命令で指定される読込対象または書込対象の記憶領域群を第2の資源群として検出する、
ことを特徴とする請求項1〜5のいずれか1つに記載の補正装置。
【請求項7】
前記特定部は、
前記共通して含まれる資源が演算ユニットであり、かつ前記プログラムコードのシミュレーション対象となるCPUが有する前記演算ユニットの個数が前記末尾命令および前記先頭命令にて指定された個数より少ない場合、前記演算ユニットを特定する、
ことを特徴とする請求項1〜6のいずれか1つに記載の補正装置。
【請求項8】
コンピュータが、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定した資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間にて、取得した前記いずれかのブロックの命令の実行時刻を補正し、
補正した前記いずれかのブロックの命令の実行時刻を出力する、
処理を実行することを特徴とする補正方法。
【請求項9】
コンピュータが、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正し、
補正した前記いずれかのブロックの命令で消費する電力を出力する、
処理を実行することを特徴とする補正方法。
【請求項10】
コンピュータに、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定した資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間にて、取得した前記いずれかのブロックの命令の実行時刻を補正し、
補正した前記いずれかのブロックの命令の実行時刻を出力する、
処理を実行させることを特徴とする補正プログラム。
【請求項11】
コンピュータに、
プログラムコードを分割して得られる複数ブロックを含むブロック群に含まれるいずれかのブロックの命令の実行時刻および前記命令で消費する電力を取得し、
前記いずれかのブロックの前に実行された先行ブロックの末尾命令で指定される第1の資源群と、前記いずれかのブロックの先頭命令で指定される第2の資源群と、を検出し、
検出した前記第1および第2の資源群に共通して含まれる資源を特定し、
特定した資源が前記先頭命令で使用される時刻と前記特定された資源の前記末尾命令での使用が終了する時刻とから、前記先行ブロックによって生じる遅延時間を算出し、
算出した遅延時間に応じた消費電力にて、前記取得部によって取得された前記いずれかのブロックの命令の実行で消費する電力を補正し、
補正した前記いずれかのブロックの命令で消費する電力を出力する、
処理を実行させることを特徴とする補正プログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【公開番号】特開2013−41513(P2013−41513A)
【公開日】平成25年2月28日(2013.2.28)
【国際特許分類】
【出願番号】特願2011−179250(P2011−179250)
【出願日】平成23年8月18日(2011.8.18)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
【公開日】平成25年2月28日(2013.2.28)
【国際特許分類】
【出願日】平成23年8月18日(2011.8.18)
【出願人】(000005223)富士通株式会社 (25,993)
【Fターム(参考)】
[ Back to top ]