(57)【要約】【課題】マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を効率よく見積もるプログラムを生成する。【解決手段】本発明の一つの実施形態によれば、クロスコンパイル部は、ソースコードからターゲットマシン用の命令列を基本ブロック毎に分類して生成する。処理時間算出部は、基本ブロック毎の命令列に基づいてターゲットプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出する。ソースコード変換部は、実行スレッドの累積処理時間に前記処理時間算出部が算出した処理時間を加算する第１コードを前記ソースコードに基本ブロック毎に挿入する。また、ソースコード変換部は、スケジューリングを実行してメモリアクセスにかかる処理時間を算出して実行スレッドの累積処理時間に加算する第２コードを前記ソースコードに挿入する。【選択図】図５
2013025403.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウエアのソースコードをクロスコンパイルして命令列を基本ブロック毎に分類して生成するとともに、前記命令列に含まれるメモリアクセスを行う命令を特定するクロスコンパイル部と、
前記基本ブロック毎の命令列に基づいて命令の実行に必要な処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する処理時間算出部と、
基本ブロックを実行するスレッドの累積処理時間に前記実行される基本ブロックの処理時間を加算する第１コードを前記ソースコードの対応する箇所に挿入し、メモリアクセスを含む基本ブロックを実行するスレッドの累積処理時間に、前記メモリアクセス情報に基づいて算出したメモリアクセスにかかる処理時間を加算する第２コードを前記ソースコードの対応する箇所に挿入するソースコード変換部と、
前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成するセルフコンパイル部をさらに備える、
を備えることを特徴とするプログラム生成装置。
【請求項２】
前記ソフトウエアのソースコードは、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるターゲットマシン上で仮想的に実行される、ことを特徴とする請求項１に記載のプログラム生成装置。
【請求項３】
前記ターゲットマシンは前記プロセッサによって駆動される外部ハードウエアを備え、
前記クロスコンパイル部は、前記生成した命令列に含まれる外部ハードウエアを駆動する命令を特定し、
前記処理時間算出部は、前記特定された外部ハードウエアを駆動する命令を識別する外部ハードウエアアクセス情報を生成し、
前記ソースコード変換部は、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に前記外部ハードウエアの駆動にかかる処理時間を加算する第３コードを前記ソースコードの対応する箇所に挿入する、
ことを特徴とする請求項２に記載のプログラム生成装置。
【請求項４】
前記外部ハードウエアは、前記メモリにアクセスし、
前記第３コードは、さらに、前記外部ハードウエアによるメモリアクセスにかかる処理時間を、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に加算する、
ことを特徴とする請求項３に記載のプログラム生成装置。
【請求項５】
前記ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理する第１処理を実行するスレッドスケジューラをさらに備え、
前記第１コードは、前記スレッドスケジューラによる第１処理を起動して、前記基本ブロックを実行するスレッドの累積処理時間に前記基本ブロックの処理時間を引数として渡す、
ことを特徴とする請求項２に記載のプログラム生成装置。
【請求項６】
前記メモリアクセス情報に基づいてアクセス先の個別メモリを特定するとともに、前記特定した個別メモリにアクセス可能なプロセッサが複数あるか否かを判定する処理を実行するメモリモデルをさらに備え、
前記第２コードは、前記メモリアクセスを行う基本ブロックにかかるメモリアクセス情報を引数として前記メモリモデルを呼び出す、
ことを特徴とする請求項５に記載のプログラム生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム生成装置に関する。
【背景技術】
【０００２】
近年、複数のメモリが階層的に接続されて構成されているメモリ群を有するマルチプロセッサが開発されている。当該マルチプロセッサをターゲットプロセッサとしたソフトウエアのクロス開発を行う場合には、作成したソフトウエアをターゲットプロセッサで実行したときに得られる性能を見積もる作業が必要となる。なお、性能とは、ここでは、実行したときに必要となる処理時間をいう。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特許３２１４４５９号公報
【特許文献２】特開２００４−３０５１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
本発明の一つの実施形態は、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を効率よく見積もるプログラムを生成するプログラム生成装置を提供することを目的とする。
【課題を解決するための手段】
【０００５】
本発明の一つの実施形態によれば、クロスコンパイル部と、処理時間算出部と、ソースコード変換部と、セルフコンパイル部とを備えている。クロスコンパイル部は、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるコンピュータをターゲットマシンとするソフトウエアのソースコードをクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。処理時間算出部は、前記生成された基本ブロック毎の命令列に基づいてプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。ソースコード変換部は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算する第１コードを前記ソースコードの対応する箇所に挿入する。また、ソースコード変換部は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する第２コードを前記ソースコードの対応する箇所に挿入する。セルフコンパイル部は、前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成する。
【図面の簡単な説明】
【０００６】
【図１】第１の実施形態のターゲットマシンの構成例を説明する図。
【図２】図１に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図３】図１のターゲットマシンに対応するメモリモデルの構成を示す図。
【図４】ホストマシンのハードウエア構成例を説明する図。
【図５】ジェネレータの機能構成を説明する図。
【図６】ユーザが入力ソースコードをジェネレータに入力してから見積もり値を得るまでの動作を説明するフローチャート。
【図７】入力ソースコードの具体例を示す図。
【図８】図７の入力ソースコードに対応する制御フローを示す図。
【図９】解析予備情報付きソースコードの具体例を示す図。
【図１０】ターゲットプロセッサ命令予備情報の具体例を示す図。
【図１１】ターゲットプロセッサが備えるメモリの特徴を示す図。
【図１２】アクセス先のメモリが決定される様子を説明するフローチャート。
【図１３】第１の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図１４】解析ＡＰＩ付きソースコードの具体例を示す図。
【図１５】第１ターゲット命令実行解析処理の具体例を示す図。
【図１６】第２ターゲット命令実行解析処理の具体例を示す図。
【図１７】第２ターゲット命令実行解析処理の動作を説明するフローチャート。
【図１８】影響調査リクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図１９】リユースディスタンスモデルを説明する図。
【図２０】スレッドスケジューリングを説明するフローチャート。
【図２１】メモリアクセスリクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図２２】メモリアクセスにかかる処理時間を算出する別の例を示す図。
【図２３】第２の実施形態のターゲットマシンの構成例を説明する図。
【図２４】図２３のターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図２５】第２の実施形態の入力ソースコードの具体例を示す図。
【図２６】第２の実施形態の解析予備情報付きソースコードの具体例を示す図。
【図２７】第２の実施形態のターゲットプロセッサ命令予備情報の具体例を示す図。
【図２８】第２の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図２９】第２の実施形態の解析ＡＰＩ付きソースコードの具体例を示す図。
【図３０】第３ターゲット命令実行解析処理の具体例を示す図。
【図３１】第２の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【図３２】第３の実施形態のターゲットマシンの構成例を説明する図。
【図３３】第３の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【発明を実施するための形態】
【０００７】
以下に添付図面を参照して、実施形態にかかるプログラム生成装置を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【０００８】
（第１の実施形態）
本発明の第１の実施形態は、ソフトウエアをターゲットマシン上で実行した場合に必要となる処理時間の見積もりをターゲットマシンが存在しない環境で得ることができるプログラム生成装置である。
【０００９】
ここにおけるターゲットマシンとは、複数のプロセッサがヒエラルキー構成のメモリ群と接続された、マルチプロセッサアーキテクチャを具備するものとする。メモリとは、プロセッサが処理するデジタルデータを保持する装置である。なお、ターゲットマシンが備えるプロセッサは固有の命令を実行する演算装置でありターゲットプロセッサと呼ぶ。また、ターゲットプロセッサと異なるプロセッサ、メモリ、入出力装置などを備え、上記ターゲットマシン用のプログラムの性能を見積もるためのプログラム（性能見積もりプログラム）を生成したり、当該生成した性能見積もりプログラムを実行して処理時間を得たりする装置をホストマシンと呼び、ホストマシンの備える演算装置をホストプロセッサと呼ぶ。
【００１０】
図１は、ターゲットマシンの構成例を説明する図である。図１のターゲットマシンは、４つのターゲットプロセッサ１ａ〜１ｄおよび１つのメインメモリ５を有している。ターゲットプロセッサ１ａ〜１ｄは夫々キャッシュメモリ（Ｌ１キャッシュ２ａ〜２ｄ）が接続されている。そして、Ｌ１キャッシュ２ａ、２ｂは、Ｌ２キャッシュ３ａに共通接続されており、Ｌ１キャッシュ２ｃ、２ｄは、Ｌ２キャッシュ３ｂに共通接続されている。さらに、Ｌ２キャッシュ３ａ、３ｂは、Ｌ３キャッシュ４に接続されており、Ｌ３キャッシュ４はメインメモリ５に接続されている。
【００１１】
以降、ターゲットマシンが備えるＬ１キャッシュ２ａ〜２ｄ、Ｌ２キャッシュ３ａ、３ｂ、Ｌ３キャッシュ４、メインメモリ５の夫々を個別メモリとよび、Ｌ１キャッシュ２ａ〜２ｄ、Ｌ２キャッシュ３ａ、３ｂ、Ｌ３キャッシュ４、およびメインメモリ５が接続されて形成されているメモリシステムをメモリ群と呼ぶこととする。
【００１２】
なお、ソフトウエアのソースコードは変換装置であるコンパイラを用いることによって意味を損なうことなくマシン命令列に変換可能であるとする。変換されたマシン命令列をプログラムと呼ぶ。ホストマシン向けのプログラムにコンパイルすることをセルフコンパイルと呼び、ターゲットマシン向けのプログラムにコンパイルすることをクロスコンパイルと呼ぶ。セルフコンパイルによって生成されたプログラムをホストプログラムと呼び、クロスコンパイルによって生成されたプログラムをターゲットマシンプログラムと呼ぶ。また、コンパイルしたソフトウエアはターゲットプロセッサ上で実行可能な命令列を持ち、この命令列をスレッドと呼ぶ。プログラムはスレッドの集合とする。ここで、並列性を持つソフトウエアとは、コンパイルにより生成されたプログラムが別々のプロセッサで同時に実行できるスレッドを持ち、各々のスレッドが協調しながら動作するものを指す。
【００１３】
図２は、図１に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。
図２に示すように、ジェネレータ（プログラム生成装置）１０にターゲットマシン上で実行したいソフトウエアの入力ソースコード１０００が入力される。ジェネレータ１０は、入力ソースコード１０００に対して、ターゲットプロセッサ上で実行される命令を解析し、メモリモデル３０やスレッドスケジューラ２０へアクセスする命令を付加して性能見積もりプログラム１００１を生成する。この入力ソースコード１０００に付加される命令はホストマシン向けの命令であり、性能見積もりプログラム１００１はホストプログラムである。性能見積もりプログラム１００１は、スケジューラ２０とメモリモデル３０とを備えるホストマシンで実行され、見積もり値１００２を生成・出力する。
【００１４】
なお、第１の実施形態においては、入力ソースコード１０００は高級言語で記述されたデータとするが、入力ソースコード１０００はコンパイラを用いることによって意味を損なうことなくマシン命令列に変換できるデータであればどのように記述されたデータでもよい。
【００１５】
スレッドスケジューラ２０は、各スレッドの持つ累積処理時間を管理する機能を持つ。スレッドの持つ累積処理時間とは、ターゲットマシン上での命令の実行に必要な処理時間の見積もり値の総和である。また、スレッドスケジューラ２０は、現在実行しているスレッドが他のスレッドに影響を及ぼす処理を実行可能かという問い合わせを受け付け、実行可能であれば実行を許可し、実行不能であれば実行可能になるまで当該スレッドを一時停止させるという機能を持つ。これにより、当該スレッドがターゲットマシン上で実行される際に未来の処理が過去に影響を与えるといった矛盾の発生を防ぐことができる。
【００１６】
メモリモデル３０は、メモリモデル３０にアクセスする命令が実行された場合、メモリアクセス情報を入力とし、当該アクセスが影響を与える他のスレッドを返す機能と、前記アクセスに必要な処理時間を返す機能を持つ。なお、メモリモデル３０とは、ターゲットマシンが有するメモリ群をモデル化したものである。メモリ群に送られるデジタルデータは位置情報（アドレス）に従って、一意な場所に保持される。メモリアクセス情報とはアクセスシンボル、アクセスサイズ、アクセスタイプを含む情報である。アクセスタイプはReadまたはWriteのいずれかである。アクセスシンボルはソースコード上において、変数を示す記号を指す。
【００１７】
図３は、図１に示したターゲットマシンが備えるメモリ群に対応するメモリモデル３０の構成を示す図である。メモリモデル３０は、個別メモリモデル３０ａ〜３０ｈにより構成されている。個別メモリモデル３０ａ、３０ｂ、３０ｃ、３０ｄは、Ｌ１キャッシュ２ａ、２ｂ、２ｃ、２ｄに夫々対応し、個別メモリモデル３０ｅ、３０ｆは、Ｌ２キャッシュ３ａ、３ｂに夫々対応する。個別メモリモデル３０ｇは、Ｌ３キャッシュ４に対応し、個別メモリモデル３０ｈは、メインメモリ５に対応する。個別メモリモデル３０ａ〜３０ｇの夫々は、接続先（個別メモリモデルおよびターゲットプロセッサ）を特定する情報を保持している。
【００１８】
図４は、ホストマシンのハードウエア構成例を説明する図である。ホストマシンは、ホストプロセッサ５０、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）５１、およびＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）５２を備えている。ＲＯＭ５２には、ジェネレータプログラム５３、スレッドスケジューラプログラム５４、メモリモデルプログラム５５が格納されている。
【００１９】
ＲＯＭ５２に格納されているジェネレータプログラム５３がＲＡＭ５１のプログラム格納領域にロードされてホストプロセッサ５０により実行されることによって、当該ホストマシンはジェネレータ１０としての機能を実現する。入力ソースコード１０００は、例えば図示しない外部記憶装置から入力される。ホストプロセッサ５０は、入力ソースコード１０００をＲＡＭ５１にロードされたジェネレータプログラム５３に従って処理して、性能見積もりプログラム１００１を出力する。性能見積もりプログラム１００１の出力先は、ＲＡＭ５１であってもよいし、外部記憶装置であってもよい。
【００２０】
ＲＯＭ５２に格納されているスレッドスケジューラプログラム５４およびメモリモデルプログラム５５は、ＲＡＭ５１のプログラム格納領域にロードされる。ホストプロセッサ５０により実行されることにより、ホストマシンは、スレッドスケジューラ２０およびメモリモデル３０としての機能を実現する。スレッドスケジューラプログラム５４およびメモリモデルプログラム５５がＲＡＭ５１にロードされた状態で、性能見積もりプログラム１００１は、ＲＡＭ５１のプログラム格納領域にロードされ、ホストプロセッサ５０によって実行される。ホストプロセッサ５０は、性能見積もりプログラム１００１に含まれている、スレッドスケジューラ２０の機能を呼び出す命令を実行すると、スレッドスケジューラプログラム５４に制御を移す。また、ホストプロセッサ５０は、メモリモデル３０の機能を呼び出す命令を実行すると、メモリモデルプログラム５５に制御を移す。
なお、ジェネレータ１０を実現するホストマシンと性能見積もりプログラム１００１を実行する環境を実現するホストマシンとは、異なっていてもよい。
【００２１】
図５は、ジェネレータ１０の機能構成を説明する図であり、図６は、入力ソースコード１０００がジェネレータ１０に入力されてから見積もり値１００２を算出するまでの動作を説明するフローチャートである。
【００２２】
ジェネレータ１０は、解析予備情報付加部１０１、クロスコンパイル部１０２、ターゲットプロセッサ命令実行情報生成部（処理時間算出部）１０３、ソースコード変換部１０４、解析処理生成部１０５、およびセルフコンパイル部１０６を備えている。これらの構成要素の機能および動作を、図５および図６とを用いて具体的に説明する。
【００２３】
まず、ジェネレータ１０に入力ソースコード１０００が入力される（Ｓ１）。
解析予備情報付加部１０１は、入力ソースコード１０００に解析予備情報を挿入して、解析予備情報付きソースコード１００３を生成する（Ｓ２）。解析予備情報とは、入力ソースコード１０００を構成するコード行群を基本ブロック毎に分類するとともに、ターゲットプロセッサ１ａ〜１ｄの外に影響を及ぼす処理を実行するコード行を特定するための情報である。第１の実施形態においては、ターゲットプロセッサ１ａ〜１ｄの外に影響を及ぼす処理とは、メモリアクセスが該当する。なお、以下、解析予備情報のうちの、コード行群を基本ブロック毎に分類する解析予備情報を第１解析予備情報、ターゲットプロセッサ１ａ〜１ｄの外に影響を及ぼす処理を行うコード行を特定する解析予備情報を第２解析予備情報と区別して表現することもある。
【００２４】
図７は、入力ソースコード１０００の具体例を示す図であり、図８は、図７の入力ソースコード１０００に対応する制御フローを示す図である。制御フローとは、ソースコードの示す処理の流れをいい、基本ブロックとは、制御フローが扱う最小の処理単位をいう。コンパイラは、入力ソースコード１０００を意味を損なうことなくプログラムに変換するため、ターゲットマシン、ホストマシンのどちらで実行しても同じ制御フローで基本ブロックが実行される。図８に示す制御フローにおいて、処理２０１〜処理２０７が基本ブロックに該当する。分岐処理２０７は、分岐先の処理（処理２０３および処理２０４）のうちのどちらに進むかを示す情報を有している。
【００２５】
図９は、解析予備情報付きソースコード１００３の具体例を示す図である。ここでは、解析予備情報は、関数型ＡＰＩ（Application  Programming  Interface）を呼び出す記述であるものとする。
【００２６】
図９の解析予備情報付きソースコード１００３において、__API1、__API2、__API4、および__API6が第１解析予備情報に該当する。当該解析予備情報付きソースコード１００３をコンパイルしプログラムを実行した際、例えば制御フローが処理２０３を経由する流れで構成される場合、基本ブロックの先頭にある__API1、__API2、__API6が実行される。ホストマシン上で__API1、__API2、__API6が実行された場合、ユーザは、ターゲットマシン上でも処理２０３を経由する制御フローで基本ブロックが処理されることを知ることが可能となる。
【００２７】
また、__API3および__API5が第２解析予備情報に該当する。ここで、“z=a[1]”とは、シンボルaが示すアドレスに１単位アドレスを加えたアドレスの情報をreadして、readした値をzに代入する、という意味である。１単位アドレスとは、シンボルに割り付けられたデータサイズである。
【００２８】
次に、クロスコンパイル部１０２は、解析予備情報付きソースコード１００３をクロスコンパイルして、ターゲットマシン用の命令列であるターゲットプロセッサ命令列１００４を出力する（Ｓ３）。ここで、クロスコンパイル部１０２は、ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。具体的には、解析予備情報付きソースコード１００３を逐次命令列に変換していく際に、第１解析予備情報を含むコード行から基本ブロックの先頭を示す記述を生成し、第２解析予備情報を含むコード行からメモリアクセスを実行する命令を特定する記述を生成する。
【００２９】
図１０は、ターゲットプロセッサ命令列１００４の具体例を示す図である。図示するように、ターゲットプロセッサ命令列１００４は、入力ソースコード１０００をクロスコンパイルして得られる命令列に、“__API1:”、“__API2:”、“__API3:func,line=3,column=8”、“__API4:”、“__API5:func,line=5,column=8”、および“__API6:”の記述が挿入された構成を備えている。
【００３０】
これらの記述のうち、“__API1:”、“__API2:”、“__API4:”、および“__API6:”の記述は、第１解析予備情報に対応して生成されるものであって、入力ソースコード１０００をクロスコンパイルして得られる命令列を構成する夫々の基本ブロックの先頭に生成されている。第１解析予備情報に対応して生成されるこれらの記述の挿入位置によって、入力ソースコード１０００をクロスコンパイルして得られる命令列は４つの基本ブロックに分類されている。即ち、__API1が示す基本ブロックではmov命令とbnez命令が実行されることを知ることができる。同様に__API2が示す基本ブロックではlw、mov、bra命令が、__API4が示す基本ブロックではlw、mov命令が、__API6が示す基本ブロックはmov命令が２回と、add3、ret命令が実行されることを知ることができる。
【００３１】
ここで、mov命令は値を第２引数の値を第１引数に代入する命令で、add3は第２引数および第３引数の値の和を第１引数に代入する命令である。また、bnezは第１引数の値が0でなければ第２引数のラベルにジャンプし、bra命令は無条件で指定先のラベルにジャンプする命令である。また、lw命令はメモリアクセスを伴う命令で、該当のアドレスから4byteのデータをreadし、レジスタに代入するという命令である。引数で“$”から始まる記号列はレジスタを表しており、数字から始まるものは数値、英字から始まる記号列は変数を表す。以下、第１解析予備情報に対応して生成されたこれらの記述を、基本ブロック特定情報ということがある。
【００３２】
また、__API3が示す基本ブロックおよび__API5は、メモリアクセスを伴うlw命令を含んでいる。“__API3:func,line=3,column=8”および“__API5:func,line=5,column=8”の記述は、第２解析予備情報に対応して生成されるものであって、メモリアクセスを行う命令を含むこれらの基本ブロックに生成されている。これらの記述は、当該メモリアクセスを伴う命令が実行される入力ソースコード１０００における位置を特定する記述を夫々含んでいる。以下、第２解析予備情報に対応して生成されたこれらの記述を、メモリアクセス命令特定情報ということがある。
【００３３】
次に、ターゲットプロセッサ命令実行情報生成部１０３は、ターゲットプロセッサ命令列１００４に基づいて、ターゲットプロセッサ命令実行情報１００５を生成する（Ｓ４）。ターゲットプロセッサ命令実行情報１００５は、ターゲットプロセッサ命令の実行に必要な処理時間と、メモリアクセス情報で構成される。
【００３４】
ターゲットプロセッサ命令実行情報生成部１０３は、制御フローおよび基本ブロックを基にターゲットプロセッサ命令の実行に必要な処理時間を計算する。ターゲットプロセッサ命令実行情報生成部１０３は、ターゲットプロセッサ命令列１００４に挿入されている基本ブロック特定情報に基づいて、基本ブロックを処理する際にどの命令が実行されるかを認識することができる。メモリアクセスを伴わない命令の処理時間は決まっている。そのため、ターゲットプロセッサ命令実行情報生成部１０３は、実行される命令や回数がわかれば、ターゲットプロセッサで実行するために必要な処理時間を計算することができる。
【００３５】
一方、メモリアクセスを伴う命令に必要な処理時間は、命令自体の処理時間にアクセス先の個別メモリモデルに依存した処理時間を加えたものとなる。ターゲットプロセッサ命令実行情報生成部１０３は、メモリアクセスを伴う命令に必要な処理時間を記述する箇所に、メモリアクセス情報を挿入しておく。ターゲットプロセッサ命令実行情報生成部１０３は、メモリアクセス特定情報を参照することによって、メモリアクセスを伴う命令が基本ブロックに含まれているか否かを認識することができる。なお、メモリアクセス情報は、メモリアクセスのアクセス先を識別する情報であり、アクセスシンボル、アクセスサイズ、アクセスタイプを含む。メモリアクセス情報には、アクセス先の個別メモリモデルに依存した処理時間は含まれていない。
【００３６】
図１１は、ターゲットプロセッサが備える個別メモリの特徴を示す図であり、図１２は、アクセス先の個別メモリが決定される様子を説明するフローチャートである。図１１に示すように、Ｌ１キャッシュ２ａ〜２ｄ、Ｌ２キャッシュ３ａ、３ｂ、Ｌ３キャッシュ４、メインメモリ５の順でメモリサイズが大きくなるが、アクセス速度が低下する。図１２に示すように、ターゲットプロセッサ１ａ〜ｄによるアクセス先がターゲットプロセッサ１ａ〜１ｄ側のキャッシュにヒットしなかった場合には、順次メインメモリ５側のキャッシュが検索され、何れのキャッシュにもヒットしなかった場合には、メインメモリ５にアクセスされる。キャッシュに対するアクセス速度は、ターゲットプロセッサ１ａ〜１ｄ側であるほど速く、メインメモリ５側であるほど遅くなるが、アクセス先がどの階層の個別メモリであるかが分からないため、ターゲットプロセッサ命令実行情報生成部１０３は、メモリアクセスを伴う命令に必要な処理時間を見積もることができない。
【００３７】
図１３は、ターゲットプロセッサ命令実行情報１００５の具体例を示す図である。ターゲットプロセッサ命令実行情報１００５の先頭の行は、__API1が示す基本ブロックを処理する際に、ターゲットマシンでは2つの命令が実行され処理に3サイクルかかることを示している。これは、mov命令が1サイクル、bnez命令が2サイクルかかるためである。また、２行目に示すように、__API2のように命令の中にメモリアクセスを伴う場合、処理時間は命令を処理する時間に、メモリモデルへのアクセスに必要な時間が加えられる。ここで、ターゲットプロセッサ命令実行情報生成部１０３では、メモリアクセスに必要な処理時間はわからないため、メモリモデルへのアクセスに必要な時間の代わりにメモリアクセス情報を出力する。図１３における記述１１００は、メモリアクセス情報である。図１３に示すメモリアクセス情報は、__API3が示すメモリアクセスが__API2が示す基本ブロックにおいて行われ、__API5が示すメモリアクセスが__API4が示す基本ブロックにおいて行わることを示している。また、当該メモリアクセス情報は、ターゲットプロセッサ命令実行情報１００５の５行目および６行目に示すように、__API3および__API5にかかる夫々のメモリアクセスにかかるアクセスシンボル、アクセスサイズ、アクセスタイプが記述されている。例えば、５行目は、“read”がアクセスタイプ、次に記述されている“4”がアクセスサイズ、さらに次に記述されている“a”が入力ソースコード１０００上のシンボル情報、さらに次に記述されている“4”がシンボルの示すアドレスからのオフセットを示している。即ち、５行目の__API3が示すメモリアクセスは、シンボルaが示すアドレスに4を加えたアドレスから、4byteのデータをreadするメモリアクセスである、ということを示している。
【００３８】
このように、ターゲットプロセッサ命令実行情報生成部１０３は、ターゲットプロセッサ１ａ〜１ｄの外に影響を与えない処理、言い換えるとターゲットプロセッサ１ａ〜１ｄ内で実行される処理にかかる処理時間を、基本ブロック毎の命令列に基づいて基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。
【００３９】
次に、ソースコード変換部１０４は、ターゲットプロセッサ命令実行情報１００５に基づいて、解析予備情報付きソースコード１００３に付加されている解析予備情報を解析ＡＰＩへ変換し、解析ＡＰＩ付きソースコード１００６を出力する（Ｓ５）。ここで解析予備情報の解析ＡＰＩへの変換は、解析ＡＰＩ付きソースコード１００６をセルフコンパイルし、ホストマシン上で実行した際に、ターゲットプロセッサ命令実行情報１００５に記述されている基本ブロック毎の処理時間が累積されるように変換する。また、メモリアクセスを伴う命令はメモリモデル３０へリクエストを発行するように変換する。
【００４０】
図１４は、解析ＡＰＩ付きソースコード１００６の具体例を示す図である。図示するように、第１解析予備情報が夫々__PROC（第１コード）という解析ＡＰＩに変換され、当該解析ＡＰＩの引数として対応する基本ブロックをターゲットマシン上で処理するのに必要な処理時間の見積もり値が渡されている。基本ブロック毎の処理時間の見積もり値は、ターゲットプロセッサ命令実行情報１００５から読み出されて__PROCの引数として用いられる。第２解析予備情報を含む基本ブロックは、__MREAD（第２コード）という解析ＡＰＩに解析ＡＰＩの引数としてアドレスおよびサイズ、即ちメモリアクセス情報の内容を渡して実行し、メモリアクセスに必要な処理時間を求めるように変換されている。ここではシンボルからアドレスを求めるには例えばプログラミング言語のアドレス演算子を用いることで実現することができる。なお、図１４において、第１解析予備情報の__API2は、__PROC(1)と__PROC(3)とに分割されている。３行目の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。そして、５行目の__PROC(3)は、__MREADでメモリアクセスに必要な処理を行った後に記述されており、処理時間3で、mov命令と、bra命令を実行するということを示している。
【００４１】
次に、解析処理生成部１０５は、解析ＡＰＩの呼び出しにより実行される第１ターゲット命令実行解析処理１００７および第２ターゲット命令実行解析処理１００８を生成する（Ｓ６）。第１ターゲット命令実行解析処理１００７および第２ターゲット命令実行解析処理１００８は、解析ＡＰＩ用ライブラリ１００９を構成する。
【００４２】
第１ターゲット命令実行解析処理１００７は、__PROCにより呼び出され、スレッドスケジューラ２０が管理しているスレッド毎の累積処理時間を更新する処理である。第１ターゲット命令実行解析処理１００７は、現在実行しているスレッドの累積処理時間をスレッドスケジューラ２０に問い合わせ、得られた累積処理時間にターゲットマシンで必要になる処理時間を加算し、加算された累積処理時間をスレッドスケジューラ２０に渡す。言い換えると、第１ターゲット命令実行解析処理１００７は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間にターゲットプロセッサ命令実行情報生成部１０３が算出した当該実行された基本ブロックの処理時間を加算する。
【００４３】
図１５は、第１ターゲット命令実行解析処理１００７の具体例を示す図である。ここでは、処理手順を擬似コードで示している。図１５の第１ターゲット命令実行解析処理１００７は、２行目で現在のスレッドの累積処理時間を取得し、３行目で前記取得した累積処理時間に引数で渡ってきた処理時間を加算し、４行目で新しい累積処理時間をスレッドに設定している。
【００４４】
第２ターゲット命令実行解析処理１００８は、__MREADにより呼び出され、メモリモデル３０に対してアクセスに必要な処理時間を問い合わせるリクエストを発行する処理である。
図１６は、第２ターゲット命令実行解析処理１００８の具体例を示す図であり、図１７は、第２ターゲット命令実行解析処理１００８の動作を説明するフローチャートである。累積処理時間の大きいスレッドが、累積処理時間の小さいスレッドと共有している個別メモリモデルにリクエストを発行した場合、累積処理時間の大きい未来のスレッドからのリクエストが先に処理されてしまい、共有しているメモリモデルに発行されたリクエストの順番に矛盾が発生する。これを防ぐために、第２ターゲット命令実行解析処理１００８はまず、メモリモデル３０にアクセスに必要な処理時間を問い合わせるメモリモデルアクセスリクエストを発行する前に、図１６の２行目に示すように、当該アクセスを行うスレッド（以下、対象スレッドということとする）が当該対象スレッドを実行するターゲットプロセッサの外、即ち他のスレッド、に影響を及ぼすか否かを判定する（Ｓ１１）。具体的には、第２ターゲット命令実行解析処理１００８は、対象スレッドが他のスレッドに影響を及ぼすか否かを判定する影響調査リクエストをメモリモデル３０に発行する。
【００４５】
図１８は、影響調査リクエストを受信したときのメモリモデル３０の動作を示すフローチャートである。当該影響調査リクエストを受信すると、個別メモリモデル３０ａ〜３０ｇのうちの、アクセス対象のデータを保持している個別メモリモデルを特定する（Ｓ２１）。具体的には、個別メモリモデル３０ａ〜３０ｇの夫々は、自身が保持しているデータを認識しており、自身が保持しているデータからメモリアクセス情報に対応するデータを検索する。検索は、個別メモリモデル３０ａ〜３０ｄのうちの対象スレッドを実行しているターゲットプロセッサが接続されている個別メモリモデルから開始される。検索が行われた個別メモリモデルが該当するデータを保持していない場合には、メインメモリ５側に接続されている別の個別メモリモデルが次に検索される。
【００４６】
キャッシュに対応する個別メモリモデル３０ａ〜３０ｇの夫々が保持しているデータの管理は、例えばリユースディスタンス（Reuse-distance）モデルを用いることで実行することができる。リユースディスタンスモデルによれば、夫々の個別メモリにメモリアクセスシーケンスを示すリユースディスタンススタックを定義して、ある個別メモリにメモリアクセスがあったとき、当該リユースディスタンススタックにアクセス先のデータを識別する情報（例えばアドレスとサイズとの組み合わせ）が当該個別メモリのリユースディスタンススタックにスタックされる。
【００４７】
図１９は、リユースディスタンススタックを説明する図である。リユースディスタンスとは、あるデータへの過去のメモリアクセスから次のメモリアクセスまでの期間を指す。図１９は、アクセス先の個々のデータを識別する情報をa〜fで表し、メモリアクセスのシーケンスをa、c、c、d、e、f、b、f、aとした場合のリユースディスタンススタックを示している。なお、a〜fで表される識別情報は、アクセス先のキャッシュラインを示すものであってもよい。図１９に示すリユースディスタンススタックにおいて、最初のaから次のaまでのメモリアクセスの数をカウントすると、カウント数は「7」となるが、cやfのように重複しているメモリアクセスは1回と数える。したがって、aのリユースディスタンスは「5」となる。ここで、ターゲットマシンのＬ１キャッシュ２ａ〜ｄの夫々のサイズはxbyte、Ｌ２キャッシュ３ａ、３ｂのサイズは夫々ybyteで、それぞれfully-setassociativeのキャッシュであるとする。この場合、Ｌ１キャッシュ２ａ〜ｄは、リユースディスタンスがx以上になると、Ｌ１キャッシュ２ａ〜ｄからアクセス対象のデータが存在しなくなる。即ち、Ｌ１キャッシュミスとなり、キャッシュミスしたＬ１キャッシュが接続されているＬ２キャッシュにアクセスする必要が生じる。同様に、Ｌ２キャッシュ３ａ、３ｂは、リユースディスタンスがy以上になるとＬ２キャッシュミスとなり、Ｌ３キャッシュ４にアクセスする必要が生じる。このように、リユースディスタンスモデルを用いることで、個々の個別メモリモデルが保持しているデータを管理することができる。
【００４８】
メモリモデル３０は、アクセス対象のデータを保持している個別メモリモデルを特定すると、特定された個別メモリモデルにアクセス可能なターゲットプロセッサが複数あるか否かを判定する（Ｓ２２）。アクセス可能なターゲットプロセッサが複数ある場合には（Ｓ２２、Ｙｅｓ）、アクセス可能なターゲットプロセッサのリストを出力する（Ｓ２３）。アクセス可能なターゲットプロセッサが一つしかない場合には（Ｓ２２、Ｎｏ）、メモリモデル３０は対象スレッドは他のスレッドに影響を及ぼさない旨の通知を出力する（Ｓ２４）。メモリモデル３０は、Ｓ２３またはＳ２４ののち、影響調査リクエストを受信したときの動作を終了する。
【００４９】
メモリモデル３０からアクセス可能なターゲットプロセッサのリストが返ってきた場合には、対象スレッドは他のスレッドに影響を及ぼすので（Ｓ１１、Ｙｅｓ）、第２ターゲット命令実行解析処理１００８は、図１６の３行目に示すように、スレッドスケジューラ２０にリクエストを発行して、スレッドスケジューリングを実行する（Ｓ１２）。
【００５０】
図２０は、スレッドスケジューリングを説明するフローチャートである。スレッドスケジューラ２０は、Ｓ２３により通知された全てのターゲットプロセッサで実行されている全てのスレッドの累積処理時間を確認する（Ｓ３１）。ここで、Ｓ２３により通知されたターゲットプロセッサで実行されているスレッドを、簡単のために、通知されたスレッドということとする。スレッドスケジューラ２０は、対象スレッドの累積処理時間が通知されたスレッドのうちで最も小さいか否かを判定する（Ｓ３２）。
【００５１】
対象スレッドの累積処理時間が最小ではない場合（Ｓ３２、Ｎｏ）、スレッドスケジューラ２０は、対象スレッドの実行を停止し（Ｓ３３）、累積処理時間が最も小さいスレッドの実行が停止しているか否かを判定する（Ｓ３４）。累積処理時間が最も小さいスレッドの実行が停止している場合（Ｓ３４、Ｙｅｓ）、スレッドスケジューラ２０は、当該累積処理時間が最も小さいスレッドの実行を再開させる（Ｓ３５）。そして、スレッドスケジューラ２０は、対象スレッドの実行が再開されるのを待機する（Ｓ３６）。
【００５２】
ここで、通知されたスレッドが対象スレッドがアクセスしようとしている個別メモリモデルにアクセスしようとする際には、スレッドスケジューラ２０は、当該通知されたスレッドの対してＳ３１〜Ｓ３５の処理を夫々個別に実行する。これにより、Ｓ３３の処理により対象スレッドの実行の停止して、しばらく待機していると、通知された他の全てのスレッドと対象スレッドとのうち、通知されたスレッドの夫々についてＳ３１〜Ｓ３５の処理が実行されることにより、対象スレッドの累積処理時間が最も小さくなる。その状態で、通知されたスレッドのうちの１つが当該個別メモリモデルにアクセスしようとした際に当該アクセスしようとしている通知されたスレッドに対して実行されたＳ３５の処理により、対象スレッドの実行が再開せしめられる。スレッドスケジューラ２０は、対象スレッドの実行が再開せしめられた後、対象スレッドのメモリアクセスの実行を許可する（Ｓ３７）。累積処理時間が最も小さいスレッドの実行が停止していない場合（Ｓ３４、Ｎｏ）、スレッドスケジューラ２０は、Ｓ３５の処理をスキップする。
【００５３】
対象スレッドの累積処理時間がＳ２３により通知されたすべてのスレッドのうちで最小である場合（Ｓ３２、Ｙｅｓ）、対象スレッドのメモリアクセスの実行を許可し（Ｓ３７）、動作を終了する。
【００５４】
このように、スレッドスケジューラ２０は、影響を与える他のスレッドよりも対象スレッドのほうが累積処理時間が小さくなるように、対象スレッドおよび影響される他のスレッドのスケジューリングを行う。
【００５５】
なお、ここでは、通知された他のスレッドにかかるＳ３５の処理により対象スレッドの実行が再開される、として説明したが、Ｓ３４〜Ｓ３６の処理の代わりに、対象スレッドの累積処理時間が最小であるか否かを判定し、対象スレッドの累積処理時間が最小である場合には対象スレッドの実行を再開し、対象スレッドの累積処理時間が最小でない場合には対象スレッドの累積処理時間が最小であるか否かを再度判定するようにしてもよい。
【００５６】
スケジューリングを実行した後、第２ターゲット命令実行解析処理１００８は、メモリモデル３０にメモリアクセスリクエストを発行して、アクセス先の個別メモリモデルへのアクセスにかかる処理時間を取得する（Ｓ１３）。
【００５７】
図２１は、メモリアクセスリクエストを受信したときのメモリモデル３０の動作を示すフローチャートである。メモリモデル３０は、メモリアクセスリクエストを受信すると、Ｓ２１により特定した個別メモリモデルに基づいて、メモリアクセスにかかる処理時間を算出し、算出した処理時間を出力する（Ｓ４１）。そして、メモリモデル３０は、Ｓ２１の処理において検索を実行したすべての個別メモリモデルのリユースディスタンススタックを更新し（Ｓ４２）、動作を終了する。
【００５８】
このように、第２ターゲット命令実行解析処理１００８は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングをメモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する。
【００５９】
その後、第２ターゲット命令実行解析処理１００８は、第１ターゲット命令実行解析処理１００７を呼び出して、Ｓ４１にて出力されたメモリアクセスにかかる処理時間を累積処理時間に加算して（Ｓ１４）、動作を終了する。対象スレッドが他のスレッドに影響を及ぼさない場合には（Ｓ１１、Ｎｏ）、第２ターゲット命令実行解析処理１００８は、Ｓ１２の処理をスキップする。
【００６０】
なお、ここではメモリモデル３０がキャッシュヒット／ミスを判定したり、メモリアクセスにかかる処理時間を算出するために、リユースディスタンスを用いるものとして説明した。メモリアクセスにかかる処理時間を算出する方法は、これに限定されない。例えば、いかなるアクセスでもターゲットプロセッサのサイクル数に換算してreadを1サイクル、writeを2サイクルで処理できる場合には、図２２に示すような処理を実行することでメモリアクセスに必要な処理時間を知ることができる。
【００６１】
Ｓ５の処理の後、セルフコンパイル部１０６は、解析ＡＰＩ付きソースコード１００６をセルフコンパイルし、セルフコンパイルの過程で解析ＡＰＩ用ライブラリをリンクして、性能見積もりプログラム１００１を出力する（Ｓ６）。
【００６２】
ユーザは、スレッドスケジューラ２０およびメモリモデル３０がインストールされたホストマシンにおいて性能見積もりプログラム１００１を実行することによって、入力ソースコード１０００をクロスコンパイルして得られるターゲットプログラムをターゲットプロセッサで実行したときの処理時間の見積もり値１００２を得ることができる（Ｓ７）。性能見積もりプログラム１００１は、スレッドスケジューラ２０およびメモリモデル３０がインストールされたホストマシンにおいて実行されることで、最後に実行していたスレッドの累積処理時間を見積もり値１００２として出力する。
【００６３】
なお、以上の説明においては、解析予備情報は、関数型のＡＰＩを呼び出す記述であるものとして説明したが、クロスコンパイル部１０２、ソースコード変換部１０４において解釈できる形であればどのような記述であってもよい。
また、解析ＡＰＩ用ライブラリＤ１０を予め用意しておくようにしてもよい。
【００６４】
以上述べたように、本発明の第１の実施形態によれば、クロスコンパイル部１０２は、複数のターゲットプロセッサ１ａ〜１ｄおよび前記複数のターゲットプロセッサ１ａ〜１ｄがアクセスするメモリ群（Ｌ１キャッシュ２ａ〜２ｄ、Ｌ２キャッシュ３ａ、３ｂ、Ｌ３キャッシュ４、メインメモリ５）を備えるコンピュータをターゲットマシンとするソフトウエアのソースコード（入力ソースコード１０００）をクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定し、ターゲットプロセッサ命令実行情報生成部１０３は、前記生成された基本ブロック毎の命令列に基づいてターゲットプロセッサ１ａ〜１ｄの外に影響を与えない処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成し、ソースコード変換部１０４は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算するコードである__PROCを入力ソースコード１０００の対応する箇所に挿入しメモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算するコードである__MREADを入力ソースコード１０００の対応する箇所に挿入し、セルフコンパイル部１０６は、前記コード挿入後のソースコード（解析ＡＰＩ付きソースコード１００６）をセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラム１００１を生成する、ように構成したので、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができる。ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、ターゲットマシンがまだ設計段階にある場合でもソフトウエアの性能評価を行うことができるので、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【００６５】
なお、ホストマシンとターゲットマシンとの性能比率に基づいてソフトウエアの性能の評価を行うことが考えられる（比較例１）。しかしながら、比較例１は、ホストマシンとターゲットマシンとの間のアーキテクチャの違いに基づく実行時間の違いを考慮していないため、アーキテクチャの違いにより大きく実行時間が異なる場合、精度が大きく落ちる問題点がある。これに対して、第１の実施形態によれば、性能見積もりプログラム１００１は、ターゲットマシンで実行したときの処理時間をメモリアーキテクチャやプロセッサアーキテクチャを考慮して算出することができるので、比較例１よりも正確にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【００６６】
また、ソフトウエアにより実装された命令シミュレータを用いてターゲットマシン向けのソフトウエアの評価を行う方法（比較例２）も考えられるが、性能見積もりプログラム１００１は、クロスコンパイルにより生成される命令に基づいてターゲットマシンにおける処理時間を算出するようにしているので、ターゲットプロセッサで実行される命令をシミュレーションしているわけではないので、比較例２に比べて高速にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【００６７】
また、ホストマシンは、ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理するスレッドスケジューラ２０をさらに備え、__PROCにより呼び出される第１ターゲット命令実行解析処理１００７は、ターゲットプロセッサ命令実行情報生成部１０３が算出した処理時間を引数としてスレッドスケジューラ２０を呼び出して、実行スレッドの累積処理時間に前記引数として渡した処理時間を加算する、ように構成したので、ユーザは、ターゲットプロセッサ１ａ〜１ｄのアーキテクチャに合わせてスレッドスケジューラ２０を変更することができる。
【００６８】
また、ターゲットマシンが備えるメモリ群は、階層構造を形成する複数の個別メモリ（Ｌ１キャッシュ２ａ〜２ｄ、Ｌ２キャッシュ３ａ、３ｂ、Ｌ３キャッシュ４、メインメモリ５の夫々）を備え、__MREADにより呼び出される第２ターゲット命令実行解析処理１００８は、アクセス先の個別メモリが同一である複数のスレッドをアクセス先が同一であるスレッドであるとするようにしたが、個別メモリを複数の領域に分割して、前記分割されて生成された同一の領域がアクセス先であるスレッドをアクセス先が同一のスレッドであるとするようにしてもよい。
【００６９】
また、スレッドスケジューラ２０は、アクセス先の個別メモリが同一の複数のスレッドのうち累積処理時間が最小となるまでメモリアクセスを行う基本ブロックによるメモリアクセスを待機させるとともに、待機時間を返すようにし、__MREADに呼び出される第２ターゲット命令実行解析処理１００８は、スレッドスケジューラ２０を呼び出して、前記呼び出したスレッドスケジューラ２０から返された待機時間を実行スレッドの累積処理時間に加算する、ように構成したので、未来の処理が過去の処理に影響を与えるといった矛盾を防止することができる。
【００７０】
（第２の実施形態）
図２３は、ターゲットマシンの別の構成例を説明する図である。第２の実施形態では、図２３に示したマシンをターゲットとした入力ソースコードの性能を見積もる場合について説明する。なお、第１の実施形態において説明した要素と同一の要素には同じ符号を付して、重複する説明を省略する。
【００７１】
図２３のターゲットマシンは、図１に示したターゲットマシンに外部ハードウエア６を追加した構成を備えている。外部ハードウエア６は、ターゲットプロセッサ１ａおよびターゲットプロセッサ１ｂに共通接続（共有）されている。外部ハードウエア６は、ターゲットプロセッサ１ａ〜１ｄ、個別メモリ以外の装置であって、ターゲットプロセッサ１ａまたはターゲットプロセッサ１ｂが外部ハードウエア６を駆動する命令を実行すると、所定の処理を行う。ここで、外部ハードウエア６を駆動する命令をターゲットプロセッサ１ａ〜１ｄ上で実行することを、外部ハードウエア６をキックする、という。なお、外部ハードウエア６に接続されていないターゲットプロセッサ１ｃやターゲットプロセッサ１ｄが外部ハードウエアをキックすると、外部ハードウエア６は所定の処理を実行せずにエラーとなる。
【００７２】
図２４は、図２３に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。ジェネレータ１０は、入力ソースコード１０００に基づいて性能見積もりプログラム１００１を生成する。第２の実施形態では、性能見積もりプログラム１００１は、スケジューラ２０、メモリモデル３０、および外部ハードウエアモデル４０を備えるホストマシンで実行され、見積もり値１００２を生成・出力する。
【００７３】
外部ハードウエアモデル４０は、外部ハードウエア６をモデル化したものであって、ターゲットプロセッサ上で外部ハードウエア６を駆動する命令が実行された場合、外部ハードウエア６が処理を実行するのに必要な処理時間をターゲットプロセッサ上のサイクル数に換算して返す機能を持つ。
【００７４】
図２５は、入力ソースコード１０００の具体例を示す図であり、図２６は、解析予備情報付きソースコード１００３の具体例を示す図であり、図２７は、ターゲットプロセッサ命令列１００４の具体例を示す図である。図２５に示すように、第２の実施形態における入力ソースコード１０００は、第１の実施形態にて説明した図７の入力ソースコード１０００の例の７行目に、外部ハードウエア６をキックするコード行“hwe_exec()”が追加されている。図２６に示す解析予備情報付きソースコード１００３によれば、第２解析予備情報として、__API7が“hwe_exec()”が記述されているコード行に挿入されている。即ち、第２の実施形態では、外部ハードウエア６をキックする処理も、ターゲットプロセッサ１ａ〜１ｄの外に影響を与える処理のうちに含まれる。また、図２７に示すターゲットプロセッサ命令列１００４によれば、__API4が示す基本ブロックではlw、mov命令に加えて、stcb命令が実行されることが示されている。stcb命令は、第１引数および第２引数に応じて外部ハードウエアをキックする命令である。即ち、第２の実施形態では、クロスコンパイル部１０２は、生成した命令列に含まれる外部ハードウエア６を駆動する命令を特定するようにする。
【００７５】
図２８は、ターゲットプロセッサ命令実行情報１００５の具体例を示す図である。__API4のように、命令の中にメモリアクセスと外部ハードウエアモデル４０をキックする命令を伴う場合、処理時間は命令を処理する時間に、メモリ群へのアクセスに必要な時間と外部ハードウエア６をキックした際に必要となる処理時間を加えたものである。ターゲットプロセッサ命令実行情報１００５には、記述１１００に示すメモリアクセス情報のほかに、記述１２００に示す外部ハードウエアアクセス情報を含んでいる。７行目は、__API7に対応する外部ハードウエア６の名称は“HWE1”であることを示している。即ち、第２の実施形態では、ターゲットプロセッサ命令実行情報生成部１０３は、外部ハードウエア６を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア６を駆動する命令を識別する外部ハードウエアアクセス情報を生成する。
【００７６】
図２９は、解析ＡＰＩ付きソースコード１００６の具体例を示す図である。図２９に示す解析ＡＰＩ付きソースコード１００６によれば、基本ブロックが外部ハードウエア６をキックする命令を含んでいた場合は、当該基本ブロックに、__HWE1_EXEC（第３コード）という解析ＡＰＩが挿入されている。__API4が示す基本ブロックの__PROCは、__PROC(1)と__PROC(2)とに分割されている。最初の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。__MREADは、メモリアクセスに必要な処理を行う。__PROC(2)は、処理時間2で、mov命令と、stcb命令を実行するということを示している。
【００７７】
解析処理生成部１０５は、第１ターゲット命令実行解析処理１００７、第２ターゲット命令実行解析処理１００８に加えて、HWE1_EXECによって呼び出される第３ターゲット命令実行解析処理を生成し、生成した第１ターゲット命令実行解析処理１００７、第２ターゲット命令実行解析処理１００８および第３ターゲット命令実行解析処理１０１０を結合して解析ＡＰＩ用ライブラリ１００９を生成する。
【００７８】
図３０は、第３ターゲット命令実行解析処理１０１０の具体例を示す図である。本図において、第３ターゲット命令実行解析処理１０１０を疑似コードで示している。第３ターゲット命令実行解析処理１０１０は、２行目で、外部ハードウエアモデル４０をキックすることによって対象スレッドが他のスレッドに影響を与えるか否かを調べる。ここでは、外部ハードウエア６は、ターゲットプロセッサ１ａおよびターゲットプロセッサ１ｂが共通接続されているので、例えば対象スレッドがターゲットプロセッサ１ａで実行されている場合、ターゲットプロセッサ１ｂで実行されているスレッドが前記対象スレッドから影響されることになる。第３ターゲット命令実行解析処理１０１０は、対象スレッドが他のスレッドに影響を与える場合、３行目でスレッドスケジューラ２０を呼び、対象スレッドおよび対象スレッドに影響を与えられるスレッドのスケジューリングを行う。第３ターゲット命令実行解析処理１０１０は、対象スレッドが他のスレッドに影響を与えない場合、またはスレッドスケジューラ２０の呼び出しによりスレッドスケジューリングが終わった場合は、５行目に示すように、外部ハードウエアモデル４０を実行し、外部ハードウエア６が処理に必要となった時間取得する。
【００７９】
図３１は、外部ハードウエアモデル４０が実行されたときの処理（外部ハードウエアモデル実行処理）の具体例を示す図である。本図においても、外部ハードウエアモデル実行処理１０１１を疑似コードで示す。また、本図における外部ハードウエアモデル実行処理１０１１は、一例として、駆動された回数に応じた時間だけ待つ処理を行うものとする。外部ハードウエアモデル実行処理１０１１は、駆動された回数を数える処理を行い（２行目）、駆動された回数に応じた時間だけ待つ処理を行う（３行目）。そして、外部ハードウエアモデル実行処理１０１１は、ターゲットプロセッサのサイクル数に換算した処理時間を出力する（４行目）。
【００８０】
第３ターゲット命令実行解析処理１０１０は、外部ハードウエアモデル実行処理１０１１が出力した時間を対象スレッドの累積処理時間に加算する処理を実行する（図３０の６行目）。
【００８１】
このように、第２の実施形態では、ソースコード変換部１０４は、外部ハードウエア６を駆動する基本ブロックが実行されたときに当該外部ハードウエア６の駆動にかかる処理時間を外部ハードウエア６を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第３ターゲット命令実行解析処理１０１０を入力ソースコード１０００の対応する箇所に挿入する。
【００８２】
以上述べたように、本発明の第２の実施形態によれば、ターゲットマシンはターゲットプロセッサ１ａ、１ｂによって駆動される外部ハードウエア６を備え、クロスコンパイル部１０２は、生成した命令列に含まれる外部ハードウエア６を駆動する命令を特定し、ターゲットプロセッサ命令実行情報生成部１０３は、外部ハードウエア６を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア６を駆動する命令を識別する外部ハードウエアアクセス情報を生成し、ソースコード変換部１０４は、外部ハードウエア６を駆動する基本ブロックが実行されたときに当該外部ハードウエア６の駆動にかかる処理時間を外部ハードウエア６を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第３ターゲット命令実行解析処理１０１０を入力ソースコード１０００の対応する箇所に挿入する、ように構成したので、ターゲットマシンが外部ハードウエア６を備える場合においてもターゲットマシン向けのソフトウエアの性能を見積もることができる性能見積もりプログラム１００１を生成することができる。
【００８３】
（第３の実施形態）
第３の実施形態では、外部ハードウエア６がメモリに接続されている場合について説明する。なお、図３２の例によれば、外部ハードウエア６は、Ｌ２キャッシュ３ａに接続されている。
【００８４】
外部ハードウエア６が個別メモリに接続されている場合には、外部ハードウエアモデル実行処理１０１１を図３３に示すようにする。図３３の外部ハードウエアモデル実行処理１０１１は、外部ハードウエアモデル４０からのメモリアクセスが、当該外部ハードウエアモデル４０をキックしたスレッドの他のスレッドに影響するか否かを調べる（２行目）。なお、外部ハードウエアモデル４０をキックしたスレッドを対象スレッドということとする。対象スレッドが他のスレッドに影響する場合には、外部ハードウエアモデル実行処理１０１１は、スレッドスケジューラ２０を呼び、スレッドのスケジューリングを行う（３行目）。対象スレッドが他のスレッドに影響しない場合、またはスレッドスケジューラの呼び出しによりスレッドスケジューリングが終わった場合、外部ハードウエアモデル実行処理１０１１は、メモリモデル３０にリクエストを発行し（５行目）、メモリアクセスに必要となった時間とアドレスに格納されたデータ値とを取得する（６行目）。そして、取得したデータ値分の時間だけ待つ処理を行う（７行目）。そして、待った時間およびメモリアクセスに必要となった時間を出力する（８行目）。
【００８５】
即ち、第３ターゲット命令実行解析処理１０１０は、外部ハードウエア６とアクセス先が同一のスレッドとの間のスケジューリングを実行して外部ハードウエア６によるメモリアクセスにかかる処理時間を算出し、前記算出した外部ハードウエア６によるメモリアクセスにかかる処理時間と外部ハードウエア６の駆動にかかる処理時間とを外部ハードウエア６を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する。これにより、外部ハードウエア６がメモリアクセスを行う場合であってもターゲットマシン向けのソフトウエアの評価を行うことができるようになる。
【００８６】
以上述べたように、第１〜第３の実施形態によれば、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、また、命令シミュレーションを行う場合よりも精度よくソフトウエアの処理時間を見積もることができる。したがって、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【００８７】
なお、解析処理生成部１０５は、第１〜第３の実施形態のターゲットプロセッサ命令実行情報１００５を入力とし、第１ターゲット命令実行解析処理１００７、第２ターゲット命令実行解析処理１００８、第３ターゲット命令実行解析処理１０１０のうちの必要な処理だけを生成するようにしてもよい。
【００８８】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００８９】
１ａ〜ｄ  ターゲットプロセッサ、２ａ〜ｄ  Ｌ１キャッシュ、３ａ、ｂ  Ｌ２キャッシュ、４  Ｌ３キャッシュ、５  メインメモリ、６  外部ハードウエア、１０  ジェネレータ、２０  スレッドスケジューラ、３０  メモリモデル、３０ａ〜ｈ  個別メモリモデル、４０  外部ハードウエアモデル、５０  ホストプロセッサ、５１  ＲＡＭ、５２  ＲＯＭ、５３  ジェネレータプログラム、５４  スレッドスケジューラプログラム、５５  メモリモデルプログラム、１０１  解析予備情報付加部、１０２  クロスコンパイル部、１０３  ターゲットプロセッサ命令実行情報生成部、１０４  ソースコード変換部、１０５  解析処理生成部、１０６  セルフコンパイル部、１０００  入力ソースコード、１００１  性能見積もりプログラム、１００２  見積もり値、１００３  解析予備情報付きソースコード、１００４  ターゲットプロセッサ命令列、１００５  ターゲットプロセッサ命令実行情報、１００６  解析ＡＰＩ付きソースコード、１００７  第１ターゲット命令実行解析処理、１００８  第２ターゲット命令実行解析処理、１００９  解析ＡＰＩ用ライブラリ、１０１０  第３ターゲット命令実行解析処理、１０１１  外部ハードウエアモデル実行処理。
【図１】
2013025403.tif 000003
【図２】
2013025403.tif 000004
【図３】
2013025403.tif 000005
【図４】
2013025403.tif 000006
【図５】
2013025403.tif 000007
【図６】
2013025403.tif 000008
【図７】
2013025403.tif 000009
【図８】
2013025403.tif 000010
【図９】
2013025403.tif 000011
【図１０】
2013025403.tif 000012
【図１１】
2013025403.tif 000013
【図１２】
2013025403.tif 000014
【図１３】
2013025403.tif 000015
【図１４】
2013025403.tif 000016
【図１５】
2013025403.tif 000017
【図１６】
2013025403.tif 000018
【図１７】
2013025403.tif 000019
【図１８】
2013025403.tif 000020
【図１９】
2013025403.tif 000021
【図２０】
2013025403.tif 000022
【図２１】
2013025403.tif 000023
【図２２】
2013025403.tif 000024
【図２３】
2013025403.tif 000025
【図２４】
2013025403.tif 000026
【図２５】
2013025403.tif 000027
【図２６】
2013025403.tif 000028
【図２７】
2013025403.tif 000029
【図２８】
2013025403.tif 000030
【図２９】
2013025403.tif 000031
【図３０】
2013025403.tif 000032
【図３１】
2013025403.tif 000033
【図３２】
2013025403.tif 000034
【図３３】
2013025403.tif 000035