プログラム生成装置
【課題】マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を効率よく見積もるプログラムを生成する。
【解決手段】本発明の一つの実施形態によれば、クロスコンパイル部は、ソースコードからターゲットマシン用の命令列を基本ブロック毎に分類して生成する。処理時間算出部は、基本ブロック毎の命令列に基づいてターゲットプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出する。ソースコード変換部は、実行スレッドの累積処理時間に前記処理時間算出部が算出した処理時間を加算する第1コードを前記ソースコードに基本ブロック毎に挿入する。また、ソースコード変換部は、スケジューリングを実行してメモリアクセスにかかる処理時間を算出して実行スレッドの累積処理時間に加算する第2コードを前記ソースコードに挿入する。
【解決手段】本発明の一つの実施形態によれば、クロスコンパイル部は、ソースコードからターゲットマシン用の命令列を基本ブロック毎に分類して生成する。処理時間算出部は、基本ブロック毎の命令列に基づいてターゲットプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出する。ソースコード変換部は、実行スレッドの累積処理時間に前記処理時間算出部が算出した処理時間を加算する第1コードを前記ソースコードに基本ブロック毎に挿入する。また、ソースコード変換部は、スケジューリングを実行してメモリアクセスにかかる処理時間を算出して実行スレッドの累積処理時間に加算する第2コードを前記ソースコードに挿入する。
【発明の詳細な説明】
【技術分野】
【0001】
本発明の実施形態は、プログラム生成装置に関する。
【背景技術】
【0002】
近年、複数のメモリが階層的に接続されて構成されているメモリ群を有するマルチプロセッサが開発されている。当該マルチプロセッサをターゲットプロセッサとしたソフトウエアのクロス開発を行う場合には、作成したソフトウエアをターゲットプロセッサで実行したときに得られる性能を見積もる作業が必要となる。なお、性能とは、ここでは、実行したときに必要となる処理時間をいう。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特許3214459号公報
【特許文献2】特開2004−30514号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
本発明の一つの実施形態は、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を効率よく見積もるプログラムを生成するプログラム生成装置を提供することを目的とする。
【課題を解決するための手段】
【0005】
本発明の一つの実施形態によれば、クロスコンパイル部と、処理時間算出部と、ソースコード変換部と、セルフコンパイル部とを備えている。クロスコンパイル部は、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるコンピュータをターゲットマシンとするソフトウエアのソースコードをクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。処理時間算出部は、前記生成された基本ブロック毎の命令列に基づいてプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。ソースコード変換部は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算する第1コードを前記ソースコードの対応する箇所に挿入する。また、ソースコード変換部は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する第2コードを前記ソースコードの対応する箇所に挿入する。セルフコンパイル部は、前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成する。
【図面の簡単な説明】
【0006】
【図1】第1の実施形態のターゲットマシンの構成例を説明する図。
【図2】図1に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図3】図1のターゲットマシンに対応するメモリモデルの構成を示す図。
【図4】ホストマシンのハードウエア構成例を説明する図。
【図5】ジェネレータの機能構成を説明する図。
【図6】ユーザが入力ソースコードをジェネレータに入力してから見積もり値を得るまでの動作を説明するフローチャート。
【図7】入力ソースコードの具体例を示す図。
【図8】図7の入力ソースコードに対応する制御フローを示す図。
【図9】解析予備情報付きソースコードの具体例を示す図。
【図10】ターゲットプロセッサ命令予備情報の具体例を示す図。
【図11】ターゲットプロセッサが備えるメモリの特徴を示す図。
【図12】アクセス先のメモリが決定される様子を説明するフローチャート。
【図13】第1の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図14】解析API付きソースコードの具体例を示す図。
【図15】第1ターゲット命令実行解析処理の具体例を示す図。
【図16】第2ターゲット命令実行解析処理の具体例を示す図。
【図17】第2ターゲット命令実行解析処理の動作を説明するフローチャート。
【図18】影響調査リクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図19】リユースディスタンスモデルを説明する図。
【図20】スレッドスケジューリングを説明するフローチャート。
【図21】メモリアクセスリクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図22】メモリアクセスにかかる処理時間を算出する別の例を示す図。
【図23】第2の実施形態のターゲットマシンの構成例を説明する図。
【図24】図23のターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図25】第2の実施形態の入力ソースコードの具体例を示す図。
【図26】第2の実施形態の解析予備情報付きソースコードの具体例を示す図。
【図27】第2の実施形態のターゲットプロセッサ命令予備情報の具体例を示す図。
【図28】第2の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図29】第2の実施形態の解析API付きソースコードの具体例を示す図。
【図30】第3ターゲット命令実行解析処理の具体例を示す図。
【図31】第2の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【図32】第3の実施形態のターゲットマシンの構成例を説明する図。
【図33】第3の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【発明を実施するための形態】
【0007】
以下に添付図面を参照して、実施形態にかかるプログラム生成装置を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【0008】
(第1の実施形態)
本発明の第1の実施形態は、ソフトウエアをターゲットマシン上で実行した場合に必要となる処理時間の見積もりをターゲットマシンが存在しない環境で得ることができるプログラム生成装置である。
【0009】
ここにおけるターゲットマシンとは、複数のプロセッサがヒエラルキー構成のメモリ群と接続された、マルチプロセッサアーキテクチャを具備するものとする。メモリとは、プロセッサが処理するデジタルデータを保持する装置である。なお、ターゲットマシンが備えるプロセッサは固有の命令を実行する演算装置でありターゲットプロセッサと呼ぶ。また、ターゲットプロセッサと異なるプロセッサ、メモリ、入出力装置などを備え、上記ターゲットマシン用のプログラムの性能を見積もるためのプログラム(性能見積もりプログラム)を生成したり、当該生成した性能見積もりプログラムを実行して処理時間を得たりする装置をホストマシンと呼び、ホストマシンの備える演算装置をホストプロセッサと呼ぶ。
【0010】
図1は、ターゲットマシンの構成例を説明する図である。図1のターゲットマシンは、4つのターゲットプロセッサ1a〜1dおよび1つのメインメモリ5を有している。ターゲットプロセッサ1a〜1dは夫々キャッシュメモリ(L1キャッシュ2a〜2d)が接続されている。そして、L1キャッシュ2a、2bは、L2キャッシュ3aに共通接続されており、L1キャッシュ2c、2dは、L2キャッシュ3bに共通接続されている。さらに、L2キャッシュ3a、3bは、L3キャッシュ4に接続されており、L3キャッシュ4はメインメモリ5に接続されている。
【0011】
以降、ターゲットマシンが備えるL1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の夫々を個別メモリとよび、L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、およびメインメモリ5が接続されて形成されているメモリシステムをメモリ群と呼ぶこととする。
【0012】
なお、ソフトウエアのソースコードは変換装置であるコンパイラを用いることによって意味を損なうことなくマシン命令列に変換可能であるとする。変換されたマシン命令列をプログラムと呼ぶ。ホストマシン向けのプログラムにコンパイルすることをセルフコンパイルと呼び、ターゲットマシン向けのプログラムにコンパイルすることをクロスコンパイルと呼ぶ。セルフコンパイルによって生成されたプログラムをホストプログラムと呼び、クロスコンパイルによって生成されたプログラムをターゲットマシンプログラムと呼ぶ。また、コンパイルしたソフトウエアはターゲットプロセッサ上で実行可能な命令列を持ち、この命令列をスレッドと呼ぶ。プログラムはスレッドの集合とする。ここで、並列性を持つソフトウエアとは、コンパイルにより生成されたプログラムが別々のプロセッサで同時に実行できるスレッドを持ち、各々のスレッドが協調しながら動作するものを指す。
【0013】
図2は、図1に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。
図2に示すように、ジェネレータ(プログラム生成装置)10にターゲットマシン上で実行したいソフトウエアの入力ソースコード1000が入力される。ジェネレータ10は、入力ソースコード1000に対して、ターゲットプロセッサ上で実行される命令を解析し、メモリモデル30やスレッドスケジューラ20へアクセスする命令を付加して性能見積もりプログラム1001を生成する。この入力ソースコード1000に付加される命令はホストマシン向けの命令であり、性能見積もりプログラム1001はホストプログラムである。性能見積もりプログラム1001は、スケジューラ20とメモリモデル30とを備えるホストマシンで実行され、見積もり値1002を生成・出力する。
【0014】
なお、第1の実施形態においては、入力ソースコード1000は高級言語で記述されたデータとするが、入力ソースコード1000はコンパイラを用いることによって意味を損なうことなくマシン命令列に変換できるデータであればどのように記述されたデータでもよい。
【0015】
スレッドスケジューラ20は、各スレッドの持つ累積処理時間を管理する機能を持つ。スレッドの持つ累積処理時間とは、ターゲットマシン上での命令の実行に必要な処理時間の見積もり値の総和である。また、スレッドスケジューラ20は、現在実行しているスレッドが他のスレッドに影響を及ぼす処理を実行可能かという問い合わせを受け付け、実行可能であれば実行を許可し、実行不能であれば実行可能になるまで当該スレッドを一時停止させるという機能を持つ。これにより、当該スレッドがターゲットマシン上で実行される際に未来の処理が過去に影響を与えるといった矛盾の発生を防ぐことができる。
【0016】
メモリモデル30は、メモリモデル30にアクセスする命令が実行された場合、メモリアクセス情報を入力とし、当該アクセスが影響を与える他のスレッドを返す機能と、前記アクセスに必要な処理時間を返す機能を持つ。なお、メモリモデル30とは、ターゲットマシンが有するメモリ群をモデル化したものである。メモリ群に送られるデジタルデータは位置情報(アドレス)に従って、一意な場所に保持される。メモリアクセス情報とはアクセスシンボル、アクセスサイズ、アクセスタイプを含む情報である。アクセスタイプはReadまたはWriteのいずれかである。アクセスシンボルはソースコード上において、変数を示す記号を指す。
【0017】
図3は、図1に示したターゲットマシンが備えるメモリ群に対応するメモリモデル30の構成を示す図である。メモリモデル30は、個別メモリモデル30a〜30hにより構成されている。個別メモリモデル30a、30b、30c、30dは、L1キャッシュ2a、2b、2c、2dに夫々対応し、個別メモリモデル30e、30fは、L2キャッシュ3a、3bに夫々対応する。個別メモリモデル30gは、L3キャッシュ4に対応し、個別メモリモデル30hは、メインメモリ5に対応する。個別メモリモデル30a〜30gの夫々は、接続先(個別メモリモデルおよびターゲットプロセッサ)を特定する情報を保持している。
【0018】
図4は、ホストマシンのハードウエア構成例を説明する図である。ホストマシンは、ホストプロセッサ50、RAM(Random Access Memory)51、およびROM(Read Only Memory)52を備えている。ROM52には、ジェネレータプログラム53、スレッドスケジューラプログラム54、メモリモデルプログラム55が格納されている。
【0019】
ROM52に格納されているジェネレータプログラム53がRAM51のプログラム格納領域にロードされてホストプロセッサ50により実行されることによって、当該ホストマシンはジェネレータ10としての機能を実現する。入力ソースコード1000は、例えば図示しない外部記憶装置から入力される。ホストプロセッサ50は、入力ソースコード1000をRAM51にロードされたジェネレータプログラム53に従って処理して、性能見積もりプログラム1001を出力する。性能見積もりプログラム1001の出力先は、RAM51であってもよいし、外部記憶装置であってもよい。
【0020】
ROM52に格納されているスレッドスケジューラプログラム54およびメモリモデルプログラム55は、RAM51のプログラム格納領域にロードされる。ホストプロセッサ50により実行されることにより、ホストマシンは、スレッドスケジューラ20およびメモリモデル30としての機能を実現する。スレッドスケジューラプログラム54およびメモリモデルプログラム55がRAM51にロードされた状態で、性能見積もりプログラム1001は、RAM51のプログラム格納領域にロードされ、ホストプロセッサ50によって実行される。ホストプロセッサ50は、性能見積もりプログラム1001に含まれている、スレッドスケジューラ20の機能を呼び出す命令を実行すると、スレッドスケジューラプログラム54に制御を移す。また、ホストプロセッサ50は、メモリモデル30の機能を呼び出す命令を実行すると、メモリモデルプログラム55に制御を移す。
なお、ジェネレータ10を実現するホストマシンと性能見積もりプログラム1001を実行する環境を実現するホストマシンとは、異なっていてもよい。
【0021】
図5は、ジェネレータ10の機能構成を説明する図であり、図6は、入力ソースコード1000がジェネレータ10に入力されてから見積もり値1002を算出するまでの動作を説明するフローチャートである。
【0022】
ジェネレータ10は、解析予備情報付加部101、クロスコンパイル部102、ターゲットプロセッサ命令実行情報生成部(処理時間算出部)103、ソースコード変換部104、解析処理生成部105、およびセルフコンパイル部106を備えている。これらの構成要素の機能および動作を、図5および図6とを用いて具体的に説明する。
【0023】
まず、ジェネレータ10に入力ソースコード1000が入力される(S1)。
解析予備情報付加部101は、入力ソースコード1000に解析予備情報を挿入して、解析予備情報付きソースコード1003を生成する(S2)。解析予備情報とは、入力ソースコード1000を構成するコード行群を基本ブロック毎に分類するとともに、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理を実行するコード行を特定するための情報である。第1の実施形態においては、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理とは、メモリアクセスが該当する。なお、以下、解析予備情報のうちの、コード行群を基本ブロック毎に分類する解析予備情報を第1解析予備情報、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理を行うコード行を特定する解析予備情報を第2解析予備情報と区別して表現することもある。
【0024】
図7は、入力ソースコード1000の具体例を示す図であり、図8は、図7の入力ソースコード1000に対応する制御フローを示す図である。制御フローとは、ソースコードの示す処理の流れをいい、基本ブロックとは、制御フローが扱う最小の処理単位をいう。コンパイラは、入力ソースコード1000を意味を損なうことなくプログラムに変換するため、ターゲットマシン、ホストマシンのどちらで実行しても同じ制御フローで基本ブロックが実行される。図8に示す制御フローにおいて、処理201〜処理207が基本ブロックに該当する。分岐処理207は、分岐先の処理(処理203および処理204)のうちのどちらに進むかを示す情報を有している。
【0025】
図9は、解析予備情報付きソースコード1003の具体例を示す図である。ここでは、解析予備情報は、関数型API(Application Programming Interface)を呼び出す記述であるものとする。
【0026】
図9の解析予備情報付きソースコード1003において、__API1、__API2、__API4、および__API6が第1解析予備情報に該当する。当該解析予備情報付きソースコード1003をコンパイルしプログラムを実行した際、例えば制御フローが処理203を経由する流れで構成される場合、基本ブロックの先頭にある__API1、__API2、__API6が実行される。ホストマシン上で__API1、__API2、__API6が実行された場合、ユーザは、ターゲットマシン上でも処理203を経由する制御フローで基本ブロックが処理されることを知ることが可能となる。
【0027】
また、__API3および__API5が第2解析予備情報に該当する。ここで、“z=a[1]”とは、シンボルaが示すアドレスに1単位アドレスを加えたアドレスの情報をreadして、readした値をzに代入する、という意味である。1単位アドレスとは、シンボルに割り付けられたデータサイズである。
【0028】
次に、クロスコンパイル部102は、解析予備情報付きソースコード1003をクロスコンパイルして、ターゲットマシン用の命令列であるターゲットプロセッサ命令列1004を出力する(S3)。ここで、クロスコンパイル部102は、ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。具体的には、解析予備情報付きソースコード1003を逐次命令列に変換していく際に、第1解析予備情報を含むコード行から基本ブロックの先頭を示す記述を生成し、第2解析予備情報を含むコード行からメモリアクセスを実行する命令を特定する記述を生成する。
【0029】
図10は、ターゲットプロセッサ命令列1004の具体例を示す図である。図示するように、ターゲットプロセッサ命令列1004は、入力ソースコード1000をクロスコンパイルして得られる命令列に、“__API1:”、“__API2:”、“__API3:func,line=3,column=8”、“__API4:”、“__API5:func,line=5,column=8”、および“__API6:”の記述が挿入された構成を備えている。
【0030】
これらの記述のうち、“__API1:”、“__API2:”、“__API4:”、および“__API6:”の記述は、第1解析予備情報に対応して生成されるものであって、入力ソースコード1000をクロスコンパイルして得られる命令列を構成する夫々の基本ブロックの先頭に生成されている。第1解析予備情報に対応して生成されるこれらの記述の挿入位置によって、入力ソースコード1000をクロスコンパイルして得られる命令列は4つの基本ブロックに分類されている。即ち、__API1が示す基本ブロックではmov命令とbnez命令が実行されることを知ることができる。同様に__API2が示す基本ブロックではlw、mov、bra命令が、__API4が示す基本ブロックではlw、mov命令が、__API6が示す基本ブロックはmov命令が2回と、add3、ret命令が実行されることを知ることができる。
【0031】
ここで、mov命令は値を第2引数の値を第1引数に代入する命令で、add3は第2引数および第3引数の値の和を第1引数に代入する命令である。また、bnezは第1引数の値が0でなければ第2引数のラベルにジャンプし、bra命令は無条件で指定先のラベルにジャンプする命令である。また、lw命令はメモリアクセスを伴う命令で、該当のアドレスから4byteのデータをreadし、レジスタに代入するという命令である。引数で“$”から始まる記号列はレジスタを表しており、数字から始まるものは数値、英字から始まる記号列は変数を表す。以下、第1解析予備情報に対応して生成されたこれらの記述を、基本ブロック特定情報ということがある。
【0032】
また、__API3が示す基本ブロックおよび__API5は、メモリアクセスを伴うlw命令を含んでいる。“__API3:func,line=3,column=8”および“__API5:func,line=5,column=8”の記述は、第2解析予備情報に対応して生成されるものであって、メモリアクセスを行う命令を含むこれらの基本ブロックに生成されている。これらの記述は、当該メモリアクセスを伴う命令が実行される入力ソースコード1000における位置を特定する記述を夫々含んでいる。以下、第2解析予備情報に対応して生成されたこれらの記述を、メモリアクセス命令特定情報ということがある。
【0033】
次に、ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ命令列1004に基づいて、ターゲットプロセッサ命令実行情報1005を生成する(S4)。ターゲットプロセッサ命令実行情報1005は、ターゲットプロセッサ命令の実行に必要な処理時間と、メモリアクセス情報で構成される。
【0034】
ターゲットプロセッサ命令実行情報生成部103は、制御フローおよび基本ブロックを基にターゲットプロセッサ命令の実行に必要な処理時間を計算する。ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ命令列1004に挿入されている基本ブロック特定情報に基づいて、基本ブロックを処理する際にどの命令が実行されるかを認識することができる。メモリアクセスを伴わない命令の処理時間は決まっている。そのため、ターゲットプロセッサ命令実行情報生成部103は、実行される命令や回数がわかれば、ターゲットプロセッサで実行するために必要な処理時間を計算することができる。
【0035】
一方、メモリアクセスを伴う命令に必要な処理時間は、命令自体の処理時間にアクセス先の個別メモリモデルに依存した処理時間を加えたものとなる。ターゲットプロセッサ命令実行情報生成部103は、メモリアクセスを伴う命令に必要な処理時間を記述する箇所に、メモリアクセス情報を挿入しておく。ターゲットプロセッサ命令実行情報生成部103は、メモリアクセス特定情報を参照することによって、メモリアクセスを伴う命令が基本ブロックに含まれているか否かを認識することができる。なお、メモリアクセス情報は、メモリアクセスのアクセス先を識別する情報であり、アクセスシンボル、アクセスサイズ、アクセスタイプを含む。メモリアクセス情報には、アクセス先の個別メモリモデルに依存した処理時間は含まれていない。
【0036】
図11は、ターゲットプロセッサが備える個別メモリの特徴を示す図であり、図12は、アクセス先の個別メモリが決定される様子を説明するフローチャートである。図11に示すように、L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の順でメモリサイズが大きくなるが、アクセス速度が低下する。図12に示すように、ターゲットプロセッサ1a〜dによるアクセス先がターゲットプロセッサ1a〜1d側のキャッシュにヒットしなかった場合には、順次メインメモリ5側のキャッシュが検索され、何れのキャッシュにもヒットしなかった場合には、メインメモリ5にアクセスされる。キャッシュに対するアクセス速度は、ターゲットプロセッサ1a〜1d側であるほど速く、メインメモリ5側であるほど遅くなるが、アクセス先がどの階層の個別メモリであるかが分からないため、ターゲットプロセッサ命令実行情報生成部103は、メモリアクセスを伴う命令に必要な処理時間を見積もることができない。
【0037】
図13は、ターゲットプロセッサ命令実行情報1005の具体例を示す図である。ターゲットプロセッサ命令実行情報1005の先頭の行は、__API1が示す基本ブロックを処理する際に、ターゲットマシンでは2つの命令が実行され処理に3サイクルかかることを示している。これは、mov命令が1サイクル、bnez命令が2サイクルかかるためである。また、2行目に示すように、__API2のように命令の中にメモリアクセスを伴う場合、処理時間は命令を処理する時間に、メモリモデルへのアクセスに必要な時間が加えられる。ここで、ターゲットプロセッサ命令実行情報生成部103では、メモリアクセスに必要な処理時間はわからないため、メモリモデルへのアクセスに必要な時間の代わりにメモリアクセス情報を出力する。図13における記述1100は、メモリアクセス情報である。図13に示すメモリアクセス情報は、__API3が示すメモリアクセスが__API2が示す基本ブロックにおいて行われ、__API5が示すメモリアクセスが__API4が示す基本ブロックにおいて行わることを示している。また、当該メモリアクセス情報は、ターゲットプロセッサ命令実行情報1005の5行目および6行目に示すように、__API3および__API5にかかる夫々のメモリアクセスにかかるアクセスシンボル、アクセスサイズ、アクセスタイプが記述されている。例えば、5行目は、“read”がアクセスタイプ、次に記述されている“4”がアクセスサイズ、さらに次に記述されている“a”が入力ソースコード1000上のシンボル情報、さらに次に記述されている“4”がシンボルの示すアドレスからのオフセットを示している。即ち、5行目の__API3が示すメモリアクセスは、シンボルaが示すアドレスに4を加えたアドレスから、4byteのデータをreadするメモリアクセスである、ということを示している。
【0038】
このように、ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ1a〜1dの外に影響を与えない処理、言い換えるとターゲットプロセッサ1a〜1d内で実行される処理にかかる処理時間を、基本ブロック毎の命令列に基づいて基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。
【0039】
次に、ソースコード変換部104は、ターゲットプロセッサ命令実行情報1005に基づいて、解析予備情報付きソースコード1003に付加されている解析予備情報を解析APIへ変換し、解析API付きソースコード1006を出力する(S5)。ここで解析予備情報の解析APIへの変換は、解析API付きソースコード1006をセルフコンパイルし、ホストマシン上で実行した際に、ターゲットプロセッサ命令実行情報1005に記述されている基本ブロック毎の処理時間が累積されるように変換する。また、メモリアクセスを伴う命令はメモリモデル30へリクエストを発行するように変換する。
【0040】
図14は、解析API付きソースコード1006の具体例を示す図である。図示するように、第1解析予備情報が夫々__PROC(第1コード)という解析APIに変換され、当該解析APIの引数として対応する基本ブロックをターゲットマシン上で処理するのに必要な処理時間の見積もり値が渡されている。基本ブロック毎の処理時間の見積もり値は、ターゲットプロセッサ命令実行情報1005から読み出されて__PROCの引数として用いられる。第2解析予備情報を含む基本ブロックは、__MREAD(第2コード)という解析APIに解析APIの引数としてアドレスおよびサイズ、即ちメモリアクセス情報の内容を渡して実行し、メモリアクセスに必要な処理時間を求めるように変換されている。ここではシンボルからアドレスを求めるには例えばプログラミング言語のアドレス演算子を用いることで実現することができる。なお、図14において、第1解析予備情報の__API2は、__PROC(1)と__PROC(3)とに分割されている。3行目の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。そして、5行目の__PROC(3)は、__MREADでメモリアクセスに必要な処理を行った後に記述されており、処理時間3で、mov命令と、bra命令を実行するということを示している。
【0041】
次に、解析処理生成部105は、解析APIの呼び出しにより実行される第1ターゲット命令実行解析処理1007および第2ターゲット命令実行解析処理1008を生成する(S6)。第1ターゲット命令実行解析処理1007および第2ターゲット命令実行解析処理1008は、解析API用ライブラリ1009を構成する。
【0042】
第1ターゲット命令実行解析処理1007は、__PROCにより呼び出され、スレッドスケジューラ20が管理しているスレッド毎の累積処理時間を更新する処理である。第1ターゲット命令実行解析処理1007は、現在実行しているスレッドの累積処理時間をスレッドスケジューラ20に問い合わせ、得られた累積処理時間にターゲットマシンで必要になる処理時間を加算し、加算された累積処理時間をスレッドスケジューラ20に渡す。言い換えると、第1ターゲット命令実行解析処理1007は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間にターゲットプロセッサ命令実行情報生成部103が算出した当該実行された基本ブロックの処理時間を加算する。
【0043】
図15は、第1ターゲット命令実行解析処理1007の具体例を示す図である。ここでは、処理手順を擬似コードで示している。図15の第1ターゲット命令実行解析処理1007は、2行目で現在のスレッドの累積処理時間を取得し、3行目で前記取得した累積処理時間に引数で渡ってきた処理時間を加算し、4行目で新しい累積処理時間をスレッドに設定している。
【0044】
第2ターゲット命令実行解析処理1008は、__MREADにより呼び出され、メモリモデル30に対してアクセスに必要な処理時間を問い合わせるリクエストを発行する処理である。
図16は、第2ターゲット命令実行解析処理1008の具体例を示す図であり、図17は、第2ターゲット命令実行解析処理1008の動作を説明するフローチャートである。累積処理時間の大きいスレッドが、累積処理時間の小さいスレッドと共有している個別メモリモデルにリクエストを発行した場合、累積処理時間の大きい未来のスレッドからのリクエストが先に処理されてしまい、共有しているメモリモデルに発行されたリクエストの順番に矛盾が発生する。これを防ぐために、第2ターゲット命令実行解析処理1008はまず、メモリモデル30にアクセスに必要な処理時間を問い合わせるメモリモデルアクセスリクエストを発行する前に、図16の2行目に示すように、当該アクセスを行うスレッド(以下、対象スレッドということとする)が当該対象スレッドを実行するターゲットプロセッサの外、即ち他のスレッド、に影響を及ぼすか否かを判定する(S11)。具体的には、第2ターゲット命令実行解析処理1008は、対象スレッドが他のスレッドに影響を及ぼすか否かを判定する影響調査リクエストをメモリモデル30に発行する。
【0045】
図18は、影響調査リクエストを受信したときのメモリモデル30の動作を示すフローチャートである。当該影響調査リクエストを受信すると、個別メモリモデル30a〜30gのうちの、アクセス対象のデータを保持している個別メモリモデルを特定する(S21)。具体的には、個別メモリモデル30a〜30gの夫々は、自身が保持しているデータを認識しており、自身が保持しているデータからメモリアクセス情報に対応するデータを検索する。検索は、個別メモリモデル30a〜30dのうちの対象スレッドを実行しているターゲットプロセッサが接続されている個別メモリモデルから開始される。検索が行われた個別メモリモデルが該当するデータを保持していない場合には、メインメモリ5側に接続されている別の個別メモリモデルが次に検索される。
【0046】
キャッシュに対応する個別メモリモデル30a〜30gの夫々が保持しているデータの管理は、例えばリユースディスタンス(Reuse-distance)モデルを用いることで実行することができる。リユースディスタンスモデルによれば、夫々の個別メモリにメモリアクセスシーケンスを示すリユースディスタンススタックを定義して、ある個別メモリにメモリアクセスがあったとき、当該リユースディスタンススタックにアクセス先のデータを識別する情報(例えばアドレスとサイズとの組み合わせ)が当該個別メモリのリユースディスタンススタックにスタックされる。
【0047】
図19は、リユースディスタンススタックを説明する図である。リユースディスタンスとは、あるデータへの過去のメモリアクセスから次のメモリアクセスまでの期間を指す。図19は、アクセス先の個々のデータを識別する情報をa〜fで表し、メモリアクセスのシーケンスをa、c、c、d、e、f、b、f、aとした場合のリユースディスタンススタックを示している。なお、a〜fで表される識別情報は、アクセス先のキャッシュラインを示すものであってもよい。図19に示すリユースディスタンススタックにおいて、最初のaから次のaまでのメモリアクセスの数をカウントすると、カウント数は「7」となるが、cやfのように重複しているメモリアクセスは1回と数える。したがって、aのリユースディスタンスは「5」となる。ここで、ターゲットマシンのL1キャッシュ2a〜dの夫々のサイズはxbyte、L2キャッシュ3a、3bのサイズは夫々ybyteで、それぞれfully-setassociativeのキャッシュであるとする。この場合、L1キャッシュ2a〜dは、リユースディスタンスがx以上になると、L1キャッシュ2a〜dからアクセス対象のデータが存在しなくなる。即ち、L1キャッシュミスとなり、キャッシュミスしたL1キャッシュが接続されているL2キャッシュにアクセスする必要が生じる。同様に、L2キャッシュ3a、3bは、リユースディスタンスがy以上になるとL2キャッシュミスとなり、L3キャッシュ4にアクセスする必要が生じる。このように、リユースディスタンスモデルを用いることで、個々の個別メモリモデルが保持しているデータを管理することができる。
【0048】
メモリモデル30は、アクセス対象のデータを保持している個別メモリモデルを特定すると、特定された個別メモリモデルにアクセス可能なターゲットプロセッサが複数あるか否かを判定する(S22)。アクセス可能なターゲットプロセッサが複数ある場合には(S22、Yes)、アクセス可能なターゲットプロセッサのリストを出力する(S23)。アクセス可能なターゲットプロセッサが一つしかない場合には(S22、No)、メモリモデル30は対象スレッドは他のスレッドに影響を及ぼさない旨の通知を出力する(S24)。メモリモデル30は、S23またはS24ののち、影響調査リクエストを受信したときの動作を終了する。
【0049】
メモリモデル30からアクセス可能なターゲットプロセッサのリストが返ってきた場合には、対象スレッドは他のスレッドに影響を及ぼすので(S11、Yes)、第2ターゲット命令実行解析処理1008は、図16の3行目に示すように、スレッドスケジューラ20にリクエストを発行して、スレッドスケジューリングを実行する(S12)。
【0050】
図20は、スレッドスケジューリングを説明するフローチャートである。スレッドスケジューラ20は、S23により通知された全てのターゲットプロセッサで実行されている全てのスレッドの累積処理時間を確認する(S31)。ここで、S23により通知されたターゲットプロセッサで実行されているスレッドを、簡単のために、通知されたスレッドということとする。スレッドスケジューラ20は、対象スレッドの累積処理時間が通知されたスレッドのうちで最も小さいか否かを判定する(S32)。
【0051】
対象スレッドの累積処理時間が最小ではない場合(S32、No)、スレッドスケジューラ20は、対象スレッドの実行を停止し(S33)、累積処理時間が最も小さいスレッドの実行が停止しているか否かを判定する(S34)。累積処理時間が最も小さいスレッドの実行が停止している場合(S34、Yes)、スレッドスケジューラ20は、当該累積処理時間が最も小さいスレッドの実行を再開させる(S35)。そして、スレッドスケジューラ20は、対象スレッドの実行が再開されるのを待機する(S36)。
【0052】
ここで、通知されたスレッドが対象スレッドがアクセスしようとしている個別メモリモデルにアクセスしようとする際には、スレッドスケジューラ20は、当該通知されたスレッドの対してS31〜S35の処理を夫々個別に実行する。これにより、S33の処理により対象スレッドの実行の停止して、しばらく待機していると、通知された他の全てのスレッドと対象スレッドとのうち、通知されたスレッドの夫々についてS31〜S35の処理が実行されることにより、対象スレッドの累積処理時間が最も小さくなる。その状態で、通知されたスレッドのうちの1つが当該個別メモリモデルにアクセスしようとした際に当該アクセスしようとしている通知されたスレッドに対して実行されたS35の処理により、対象スレッドの実行が再開せしめられる。スレッドスケジューラ20は、対象スレッドの実行が再開せしめられた後、対象スレッドのメモリアクセスの実行を許可する(S37)。累積処理時間が最も小さいスレッドの実行が停止していない場合(S34、No)、スレッドスケジューラ20は、S35の処理をスキップする。
【0053】
対象スレッドの累積処理時間がS23により通知されたすべてのスレッドのうちで最小である場合(S32、Yes)、対象スレッドのメモリアクセスの実行を許可し(S37)、動作を終了する。
【0054】
このように、スレッドスケジューラ20は、影響を与える他のスレッドよりも対象スレッドのほうが累積処理時間が小さくなるように、対象スレッドおよび影響される他のスレッドのスケジューリングを行う。
【0055】
なお、ここでは、通知された他のスレッドにかかるS35の処理により対象スレッドの実行が再開される、として説明したが、S34〜S36の処理の代わりに、対象スレッドの累積処理時間が最小であるか否かを判定し、対象スレッドの累積処理時間が最小である場合には対象スレッドの実行を再開し、対象スレッドの累積処理時間が最小でない場合には対象スレッドの累積処理時間が最小であるか否かを再度判定するようにしてもよい。
【0056】
スケジューリングを実行した後、第2ターゲット命令実行解析処理1008は、メモリモデル30にメモリアクセスリクエストを発行して、アクセス先の個別メモリモデルへのアクセスにかかる処理時間を取得する(S13)。
【0057】
図21は、メモリアクセスリクエストを受信したときのメモリモデル30の動作を示すフローチャートである。メモリモデル30は、メモリアクセスリクエストを受信すると、S21により特定した個別メモリモデルに基づいて、メモリアクセスにかかる処理時間を算出し、算出した処理時間を出力する(S41)。そして、メモリモデル30は、S21の処理において検索を実行したすべての個別メモリモデルのリユースディスタンススタックを更新し(S42)、動作を終了する。
【0058】
このように、第2ターゲット命令実行解析処理1008は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングをメモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する。
【0059】
その後、第2ターゲット命令実行解析処理1008は、第1ターゲット命令実行解析処理1007を呼び出して、S41にて出力されたメモリアクセスにかかる処理時間を累積処理時間に加算して(S14)、動作を終了する。対象スレッドが他のスレッドに影響を及ぼさない場合には(S11、No)、第2ターゲット命令実行解析処理1008は、S12の処理をスキップする。
【0060】
なお、ここではメモリモデル30がキャッシュヒット/ミスを判定したり、メモリアクセスにかかる処理時間を算出するために、リユースディスタンスを用いるものとして説明した。メモリアクセスにかかる処理時間を算出する方法は、これに限定されない。例えば、いかなるアクセスでもターゲットプロセッサのサイクル数に換算してreadを1サイクル、writeを2サイクルで処理できる場合には、図22に示すような処理を実行することでメモリアクセスに必要な処理時間を知ることができる。
【0061】
S5の処理の後、セルフコンパイル部106は、解析API付きソースコード1006をセルフコンパイルし、セルフコンパイルの過程で解析API用ライブラリをリンクして、性能見積もりプログラム1001を出力する(S6)。
【0062】
ユーザは、スレッドスケジューラ20およびメモリモデル30がインストールされたホストマシンにおいて性能見積もりプログラム1001を実行することによって、入力ソースコード1000をクロスコンパイルして得られるターゲットプログラムをターゲットプロセッサで実行したときの処理時間の見積もり値1002を得ることができる(S7)。性能見積もりプログラム1001は、スレッドスケジューラ20およびメモリモデル30がインストールされたホストマシンにおいて実行されることで、最後に実行していたスレッドの累積処理時間を見積もり値1002として出力する。
【0063】
なお、以上の説明においては、解析予備情報は、関数型のAPIを呼び出す記述であるものとして説明したが、クロスコンパイル部102、ソースコード変換部104において解釈できる形であればどのような記述であってもよい。
また、解析API用ライブラリD10を予め用意しておくようにしてもよい。
【0064】
以上述べたように、本発明の第1の実施形態によれば、クロスコンパイル部102は、複数のターゲットプロセッサ1a〜1dおよび前記複数のターゲットプロセッサ1a〜1dがアクセスするメモリ群(L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5)を備えるコンピュータをターゲットマシンとするソフトウエアのソースコード(入力ソースコード1000)をクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定し、ターゲットプロセッサ命令実行情報生成部103は、前記生成された基本ブロック毎の命令列に基づいてターゲットプロセッサ1a〜1dの外に影響を与えない処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成し、ソースコード変換部104は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算するコードである__PROCを入力ソースコード1000の対応する箇所に挿入しメモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算するコードである__MREADを入力ソースコード1000の対応する箇所に挿入し、セルフコンパイル部106は、前記コード挿入後のソースコード(解析API付きソースコード1006)をセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラム1001を生成する、ように構成したので、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができる。ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、ターゲットマシンがまだ設計段階にある場合でもソフトウエアの性能評価を行うことができるので、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【0065】
なお、ホストマシンとターゲットマシンとの性能比率に基づいてソフトウエアの性能の評価を行うことが考えられる(比較例1)。しかしながら、比較例1は、ホストマシンとターゲットマシンとの間のアーキテクチャの違いに基づく実行時間の違いを考慮していないため、アーキテクチャの違いにより大きく実行時間が異なる場合、精度が大きく落ちる問題点がある。これに対して、第1の実施形態によれば、性能見積もりプログラム1001は、ターゲットマシンで実行したときの処理時間をメモリアーキテクチャやプロセッサアーキテクチャを考慮して算出することができるので、比較例1よりも正確にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【0066】
また、ソフトウエアにより実装された命令シミュレータを用いてターゲットマシン向けのソフトウエアの評価を行う方法(比較例2)も考えられるが、性能見積もりプログラム1001は、クロスコンパイルにより生成される命令に基づいてターゲットマシンにおける処理時間を算出するようにしているので、ターゲットプロセッサで実行される命令をシミュレーションしているわけではないので、比較例2に比べて高速にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【0067】
また、ホストマシンは、ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理するスレッドスケジューラ20をさらに備え、__PROCにより呼び出される第1ターゲット命令実行解析処理1007は、ターゲットプロセッサ命令実行情報生成部103が算出した処理時間を引数としてスレッドスケジューラ20を呼び出して、実行スレッドの累積処理時間に前記引数として渡した処理時間を加算する、ように構成したので、ユーザは、ターゲットプロセッサ1a〜1dのアーキテクチャに合わせてスレッドスケジューラ20を変更することができる。
【0068】
また、ターゲットマシンが備えるメモリ群は、階層構造を形成する複数の個別メモリ(L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の夫々)を備え、__MREADにより呼び出される第2ターゲット命令実行解析処理1008は、アクセス先の個別メモリが同一である複数のスレッドをアクセス先が同一であるスレッドであるとするようにしたが、個別メモリを複数の領域に分割して、前記分割されて生成された同一の領域がアクセス先であるスレッドをアクセス先が同一のスレッドであるとするようにしてもよい。
【0069】
また、スレッドスケジューラ20は、アクセス先の個別メモリが同一の複数のスレッドのうち累積処理時間が最小となるまでメモリアクセスを行う基本ブロックによるメモリアクセスを待機させるとともに、待機時間を返すようにし、__MREADに呼び出される第2ターゲット命令実行解析処理1008は、スレッドスケジューラ20を呼び出して、前記呼び出したスレッドスケジューラ20から返された待機時間を実行スレッドの累積処理時間に加算する、ように構成したので、未来の処理が過去の処理に影響を与えるといった矛盾を防止することができる。
【0070】
(第2の実施形態)
図23は、ターゲットマシンの別の構成例を説明する図である。第2の実施形態では、図23に示したマシンをターゲットとした入力ソースコードの性能を見積もる場合について説明する。なお、第1の実施形態において説明した要素と同一の要素には同じ符号を付して、重複する説明を省略する。
【0071】
図23のターゲットマシンは、図1に示したターゲットマシンに外部ハードウエア6を追加した構成を備えている。外部ハードウエア6は、ターゲットプロセッサ1aおよびターゲットプロセッサ1bに共通接続(共有)されている。外部ハードウエア6は、ターゲットプロセッサ1a〜1d、個別メモリ以外の装置であって、ターゲットプロセッサ1aまたはターゲットプロセッサ1bが外部ハードウエア6を駆動する命令を実行すると、所定の処理を行う。ここで、外部ハードウエア6を駆動する命令をターゲットプロセッサ1a〜1d上で実行することを、外部ハードウエア6をキックする、という。なお、外部ハードウエア6に接続されていないターゲットプロセッサ1cやターゲットプロセッサ1dが外部ハードウエアをキックすると、外部ハードウエア6は所定の処理を実行せずにエラーとなる。
【0072】
図24は、図23に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。ジェネレータ10は、入力ソースコード1000に基づいて性能見積もりプログラム1001を生成する。第2の実施形態では、性能見積もりプログラム1001は、スケジューラ20、メモリモデル30、および外部ハードウエアモデル40を備えるホストマシンで実行され、見積もり値1002を生成・出力する。
【0073】
外部ハードウエアモデル40は、外部ハードウエア6をモデル化したものであって、ターゲットプロセッサ上で外部ハードウエア6を駆動する命令が実行された場合、外部ハードウエア6が処理を実行するのに必要な処理時間をターゲットプロセッサ上のサイクル数に換算して返す機能を持つ。
【0074】
図25は、入力ソースコード1000の具体例を示す図であり、図26は、解析予備情報付きソースコード1003の具体例を示す図であり、図27は、ターゲットプロセッサ命令列1004の具体例を示す図である。図25に示すように、第2の実施形態における入力ソースコード1000は、第1の実施形態にて説明した図7の入力ソースコード1000の例の7行目に、外部ハードウエア6をキックするコード行“hwe_exec()”が追加されている。図26に示す解析予備情報付きソースコード1003によれば、第2解析予備情報として、__API7が“hwe_exec()”が記述されているコード行に挿入されている。即ち、第2の実施形態では、外部ハードウエア6をキックする処理も、ターゲットプロセッサ1a〜1dの外に影響を与える処理のうちに含まれる。また、図27に示すターゲットプロセッサ命令列1004によれば、__API4が示す基本ブロックではlw、mov命令に加えて、stcb命令が実行されることが示されている。stcb命令は、第1引数および第2引数に応じて外部ハードウエアをキックする命令である。即ち、第2の実施形態では、クロスコンパイル部102は、生成した命令列に含まれる外部ハードウエア6を駆動する命令を特定するようにする。
【0075】
図28は、ターゲットプロセッサ命令実行情報1005の具体例を示す図である。__API4のように、命令の中にメモリアクセスと外部ハードウエアモデル40をキックする命令を伴う場合、処理時間は命令を処理する時間に、メモリ群へのアクセスに必要な時間と外部ハードウエア6をキックした際に必要となる処理時間を加えたものである。ターゲットプロセッサ命令実行情報1005には、記述1100に示すメモリアクセス情報のほかに、記述1200に示す外部ハードウエアアクセス情報を含んでいる。7行目は、__API7に対応する外部ハードウエア6の名称は“HWE1”であることを示している。即ち、第2の実施形態では、ターゲットプロセッサ命令実行情報生成部103は、外部ハードウエア6を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア6を駆動する命令を識別する外部ハードウエアアクセス情報を生成する。
【0076】
図29は、解析API付きソースコード1006の具体例を示す図である。図29に示す解析API付きソースコード1006によれば、基本ブロックが外部ハードウエア6をキックする命令を含んでいた場合は、当該基本ブロックに、__HWE1_EXEC(第3コード)という解析APIが挿入されている。__API4が示す基本ブロックの__PROCは、__PROC(1)と__PROC(2)とに分割されている。最初の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。__MREADは、メモリアクセスに必要な処理を行う。__PROC(2)は、処理時間2で、mov命令と、stcb命令を実行するということを示している。
【0077】
解析処理生成部105は、第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008に加えて、HWE1_EXECによって呼び出される第3ターゲット命令実行解析処理を生成し、生成した第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008および第3ターゲット命令実行解析処理1010を結合して解析API用ライブラリ1009を生成する。
【0078】
図30は、第3ターゲット命令実行解析処理1010の具体例を示す図である。本図において、第3ターゲット命令実行解析処理1010を疑似コードで示している。第3ターゲット命令実行解析処理1010は、2行目で、外部ハードウエアモデル40をキックすることによって対象スレッドが他のスレッドに影響を与えるか否かを調べる。ここでは、外部ハードウエア6は、ターゲットプロセッサ1aおよびターゲットプロセッサ1bが共通接続されているので、例えば対象スレッドがターゲットプロセッサ1aで実行されている場合、ターゲットプロセッサ1bで実行されているスレッドが前記対象スレッドから影響されることになる。第3ターゲット命令実行解析処理1010は、対象スレッドが他のスレッドに影響を与える場合、3行目でスレッドスケジューラ20を呼び、対象スレッドおよび対象スレッドに影響を与えられるスレッドのスケジューリングを行う。第3ターゲット命令実行解析処理1010は、対象スレッドが他のスレッドに影響を与えない場合、またはスレッドスケジューラ20の呼び出しによりスレッドスケジューリングが終わった場合は、5行目に示すように、外部ハードウエアモデル40を実行し、外部ハードウエア6が処理に必要となった時間取得する。
【0079】
図31は、外部ハードウエアモデル40が実行されたときの処理(外部ハードウエアモデル実行処理)の具体例を示す図である。本図においても、外部ハードウエアモデル実行処理1011を疑似コードで示す。また、本図における外部ハードウエアモデル実行処理1011は、一例として、駆動された回数に応じた時間だけ待つ処理を行うものとする。外部ハードウエアモデル実行処理1011は、駆動された回数を数える処理を行い(2行目)、駆動された回数に応じた時間だけ待つ処理を行う(3行目)。そして、外部ハードウエアモデル実行処理1011は、ターゲットプロセッサのサイクル数に換算した処理時間を出力する(4行目)。
【0080】
第3ターゲット命令実行解析処理1010は、外部ハードウエアモデル実行処理1011が出力した時間を対象スレッドの累積処理時間に加算する処理を実行する(図30の6行目)。
【0081】
このように、第2の実施形態では、ソースコード変換部104は、外部ハードウエア6を駆動する基本ブロックが実行されたときに当該外部ハードウエア6の駆動にかかる処理時間を外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第3ターゲット命令実行解析処理1010を入力ソースコード1000の対応する箇所に挿入する。
【0082】
以上述べたように、本発明の第2の実施形態によれば、ターゲットマシンはターゲットプロセッサ1a、1bによって駆動される外部ハードウエア6を備え、クロスコンパイル部102は、生成した命令列に含まれる外部ハードウエア6を駆動する命令を特定し、ターゲットプロセッサ命令実行情報生成部103は、外部ハードウエア6を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア6を駆動する命令を識別する外部ハードウエアアクセス情報を生成し、ソースコード変換部104は、外部ハードウエア6を駆動する基本ブロックが実行されたときに当該外部ハードウエア6の駆動にかかる処理時間を外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第3ターゲット命令実行解析処理1010を入力ソースコード1000の対応する箇所に挿入する、ように構成したので、ターゲットマシンが外部ハードウエア6を備える場合においてもターゲットマシン向けのソフトウエアの性能を見積もることができる性能見積もりプログラム1001を生成することができる。
【0083】
(第3の実施形態)
第3の実施形態では、外部ハードウエア6がメモリに接続されている場合について説明する。なお、図32の例によれば、外部ハードウエア6は、L2キャッシュ3aに接続されている。
【0084】
外部ハードウエア6が個別メモリに接続されている場合には、外部ハードウエアモデル実行処理1011を図33に示すようにする。図33の外部ハードウエアモデル実行処理1011は、外部ハードウエアモデル40からのメモリアクセスが、当該外部ハードウエアモデル40をキックしたスレッドの他のスレッドに影響するか否かを調べる(2行目)。なお、外部ハードウエアモデル40をキックしたスレッドを対象スレッドということとする。対象スレッドが他のスレッドに影響する場合には、外部ハードウエアモデル実行処理1011は、スレッドスケジューラ20を呼び、スレッドのスケジューリングを行う(3行目)。対象スレッドが他のスレッドに影響しない場合、またはスレッドスケジューラの呼び出しによりスレッドスケジューリングが終わった場合、外部ハードウエアモデル実行処理1011は、メモリモデル30にリクエストを発行し(5行目)、メモリアクセスに必要となった時間とアドレスに格納されたデータ値とを取得する(6行目)。そして、取得したデータ値分の時間だけ待つ処理を行う(7行目)。そして、待った時間およびメモリアクセスに必要となった時間を出力する(8行目)。
【0085】
即ち、第3ターゲット命令実行解析処理1010は、外部ハードウエア6とアクセス先が同一のスレッドとの間のスケジューリングを実行して外部ハードウエア6によるメモリアクセスにかかる処理時間を算出し、前記算出した外部ハードウエア6によるメモリアクセスにかかる処理時間と外部ハードウエア6の駆動にかかる処理時間とを外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する。これにより、外部ハードウエア6がメモリアクセスを行う場合であってもターゲットマシン向けのソフトウエアの評価を行うことができるようになる。
【0086】
以上述べたように、第1〜第3の実施形態によれば、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、また、命令シミュレーションを行う場合よりも精度よくソフトウエアの処理時間を見積もることができる。したがって、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【0087】
なお、解析処理生成部105は、第1〜第3の実施形態のターゲットプロセッサ命令実行情報1005を入力とし、第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008、第3ターゲット命令実行解析処理1010のうちの必要な処理だけを生成するようにしてもよい。
【0088】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0089】
1a〜d ターゲットプロセッサ、2a〜d L1キャッシュ、3a、b L2キャッシュ、4 L3キャッシュ、5 メインメモリ、6 外部ハードウエア、10 ジェネレータ、20 スレッドスケジューラ、30 メモリモデル、30a〜h 個別メモリモデル、40 外部ハードウエアモデル、50 ホストプロセッサ、51 RAM、52 ROM、53 ジェネレータプログラム、54 スレッドスケジューラプログラム、55 メモリモデルプログラム、101 解析予備情報付加部、102 クロスコンパイル部、103 ターゲットプロセッサ命令実行情報生成部、104 ソースコード変換部、105 解析処理生成部、106 セルフコンパイル部、1000 入力ソースコード、1001 性能見積もりプログラム、1002 見積もり値、1003 解析予備情報付きソースコード、1004 ターゲットプロセッサ命令列、1005 ターゲットプロセッサ命令実行情報、1006 解析API付きソースコード、1007 第1ターゲット命令実行解析処理、1008 第2ターゲット命令実行解析処理、1009 解析API用ライブラリ、1010 第3ターゲット命令実行解析処理、1011 外部ハードウエアモデル実行処理。
【技術分野】
【0001】
本発明の実施形態は、プログラム生成装置に関する。
【背景技術】
【0002】
近年、複数のメモリが階層的に接続されて構成されているメモリ群を有するマルチプロセッサが開発されている。当該マルチプロセッサをターゲットプロセッサとしたソフトウエアのクロス開発を行う場合には、作成したソフトウエアをターゲットプロセッサで実行したときに得られる性能を見積もる作業が必要となる。なお、性能とは、ここでは、実行したときに必要となる処理時間をいう。
【先行技術文献】
【特許文献】
【0003】
【特許文献1】特許3214459号公報
【特許文献2】特開2004−30514号公報
【発明の概要】
【発明が解決しようとする課題】
【0004】
本発明の一つの実施形態は、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を効率よく見積もるプログラムを生成するプログラム生成装置を提供することを目的とする。
【課題を解決するための手段】
【0005】
本発明の一つの実施形態によれば、クロスコンパイル部と、処理時間算出部と、ソースコード変換部と、セルフコンパイル部とを備えている。クロスコンパイル部は、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるコンピュータをターゲットマシンとするソフトウエアのソースコードをクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。処理時間算出部は、前記生成された基本ブロック毎の命令列に基づいてプロセッサ内で実行される処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。ソースコード変換部は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算する第1コードを前記ソースコードの対応する箇所に挿入する。また、ソースコード変換部は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する第2コードを前記ソースコードの対応する箇所に挿入する。セルフコンパイル部は、前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成する。
【図面の簡単な説明】
【0006】
【図1】第1の実施形態のターゲットマシンの構成例を説明する図。
【図2】図1に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図3】図1のターゲットマシンに対応するメモリモデルの構成を示す図。
【図4】ホストマシンのハードウエア構成例を説明する図。
【図5】ジェネレータの機能構成を説明する図。
【図6】ユーザが入力ソースコードをジェネレータに入力してから見積もり値を得るまでの動作を説明するフローチャート。
【図7】入力ソースコードの具体例を示す図。
【図8】図7の入力ソースコードに対応する制御フローを示す図。
【図9】解析予備情報付きソースコードの具体例を示す図。
【図10】ターゲットプロセッサ命令予備情報の具体例を示す図。
【図11】ターゲットプロセッサが備えるメモリの特徴を示す図。
【図12】アクセス先のメモリが決定される様子を説明するフローチャート。
【図13】第1の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図14】解析API付きソースコードの具体例を示す図。
【図15】第1ターゲット命令実行解析処理の具体例を示す図。
【図16】第2ターゲット命令実行解析処理の具体例を示す図。
【図17】第2ターゲット命令実行解析処理の動作を説明するフローチャート。
【図18】影響調査リクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図19】リユースディスタンスモデルを説明する図。
【図20】スレッドスケジューリングを説明するフローチャート。
【図21】メモリアクセスリクエストを受信したときのメモリモデルの動作を示すフローチャート。
【図22】メモリアクセスにかかる処理時間を算出する別の例を示す図。
【図23】第2の実施形態のターゲットマシンの構成例を説明する図。
【図24】図23のターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図。
【図25】第2の実施形態の入力ソースコードの具体例を示す図。
【図26】第2の実施形態の解析予備情報付きソースコードの具体例を示す図。
【図27】第2の実施形態のターゲットプロセッサ命令予備情報の具体例を示す図。
【図28】第2の実施形態のターゲットプロセッサ命令実行情報の具体例を示す図。
【図29】第2の実施形態の解析API付きソースコードの具体例を示す図。
【図30】第3ターゲット命令実行解析処理の具体例を示す図。
【図31】第2の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【図32】第3の実施形態のターゲットマシンの構成例を説明する図。
【図33】第3の実施形態の外部ハードウエアモデル実行処理の具体例を示す図。
【発明を実施するための形態】
【0007】
以下に添付図面を参照して、実施形態にかかるプログラム生成装置を詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【0008】
(第1の実施形態)
本発明の第1の実施形態は、ソフトウエアをターゲットマシン上で実行した場合に必要となる処理時間の見積もりをターゲットマシンが存在しない環境で得ることができるプログラム生成装置である。
【0009】
ここにおけるターゲットマシンとは、複数のプロセッサがヒエラルキー構成のメモリ群と接続された、マルチプロセッサアーキテクチャを具備するものとする。メモリとは、プロセッサが処理するデジタルデータを保持する装置である。なお、ターゲットマシンが備えるプロセッサは固有の命令を実行する演算装置でありターゲットプロセッサと呼ぶ。また、ターゲットプロセッサと異なるプロセッサ、メモリ、入出力装置などを備え、上記ターゲットマシン用のプログラムの性能を見積もるためのプログラム(性能見積もりプログラム)を生成したり、当該生成した性能見積もりプログラムを実行して処理時間を得たりする装置をホストマシンと呼び、ホストマシンの備える演算装置をホストプロセッサと呼ぶ。
【0010】
図1は、ターゲットマシンの構成例を説明する図である。図1のターゲットマシンは、4つのターゲットプロセッサ1a〜1dおよび1つのメインメモリ5を有している。ターゲットプロセッサ1a〜1dは夫々キャッシュメモリ(L1キャッシュ2a〜2d)が接続されている。そして、L1キャッシュ2a、2bは、L2キャッシュ3aに共通接続されており、L1キャッシュ2c、2dは、L2キャッシュ3bに共通接続されている。さらに、L2キャッシュ3a、3bは、L3キャッシュ4に接続されており、L3キャッシュ4はメインメモリ5に接続されている。
【0011】
以降、ターゲットマシンが備えるL1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の夫々を個別メモリとよび、L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、およびメインメモリ5が接続されて形成されているメモリシステムをメモリ群と呼ぶこととする。
【0012】
なお、ソフトウエアのソースコードは変換装置であるコンパイラを用いることによって意味を損なうことなくマシン命令列に変換可能であるとする。変換されたマシン命令列をプログラムと呼ぶ。ホストマシン向けのプログラムにコンパイルすることをセルフコンパイルと呼び、ターゲットマシン向けのプログラムにコンパイルすることをクロスコンパイルと呼ぶ。セルフコンパイルによって生成されたプログラムをホストプログラムと呼び、クロスコンパイルによって生成されたプログラムをターゲットマシンプログラムと呼ぶ。また、コンパイルしたソフトウエアはターゲットプロセッサ上で実行可能な命令列を持ち、この命令列をスレッドと呼ぶ。プログラムはスレッドの集合とする。ここで、並列性を持つソフトウエアとは、コンパイルにより生成されたプログラムが別々のプロセッサで同時に実行できるスレッドを持ち、各々のスレッドが協調しながら動作するものを指す。
【0013】
図2は、図1に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。
図2に示すように、ジェネレータ(プログラム生成装置)10にターゲットマシン上で実行したいソフトウエアの入力ソースコード1000が入力される。ジェネレータ10は、入力ソースコード1000に対して、ターゲットプロセッサ上で実行される命令を解析し、メモリモデル30やスレッドスケジューラ20へアクセスする命令を付加して性能見積もりプログラム1001を生成する。この入力ソースコード1000に付加される命令はホストマシン向けの命令であり、性能見積もりプログラム1001はホストプログラムである。性能見積もりプログラム1001は、スケジューラ20とメモリモデル30とを備えるホストマシンで実行され、見積もり値1002を生成・出力する。
【0014】
なお、第1の実施形態においては、入力ソースコード1000は高級言語で記述されたデータとするが、入力ソースコード1000はコンパイラを用いることによって意味を損なうことなくマシン命令列に変換できるデータであればどのように記述されたデータでもよい。
【0015】
スレッドスケジューラ20は、各スレッドの持つ累積処理時間を管理する機能を持つ。スレッドの持つ累積処理時間とは、ターゲットマシン上での命令の実行に必要な処理時間の見積もり値の総和である。また、スレッドスケジューラ20は、現在実行しているスレッドが他のスレッドに影響を及ぼす処理を実行可能かという問い合わせを受け付け、実行可能であれば実行を許可し、実行不能であれば実行可能になるまで当該スレッドを一時停止させるという機能を持つ。これにより、当該スレッドがターゲットマシン上で実行される際に未来の処理が過去に影響を与えるといった矛盾の発生を防ぐことができる。
【0016】
メモリモデル30は、メモリモデル30にアクセスする命令が実行された場合、メモリアクセス情報を入力とし、当該アクセスが影響を与える他のスレッドを返す機能と、前記アクセスに必要な処理時間を返す機能を持つ。なお、メモリモデル30とは、ターゲットマシンが有するメモリ群をモデル化したものである。メモリ群に送られるデジタルデータは位置情報(アドレス)に従って、一意な場所に保持される。メモリアクセス情報とはアクセスシンボル、アクセスサイズ、アクセスタイプを含む情報である。アクセスタイプはReadまたはWriteのいずれかである。アクセスシンボルはソースコード上において、変数を示す記号を指す。
【0017】
図3は、図1に示したターゲットマシンが備えるメモリ群に対応するメモリモデル30の構成を示す図である。メモリモデル30は、個別メモリモデル30a〜30hにより構成されている。個別メモリモデル30a、30b、30c、30dは、L1キャッシュ2a、2b、2c、2dに夫々対応し、個別メモリモデル30e、30fは、L2キャッシュ3a、3bに夫々対応する。個別メモリモデル30gは、L3キャッシュ4に対応し、個別メモリモデル30hは、メインメモリ5に対応する。個別メモリモデル30a〜30gの夫々は、接続先(個別メモリモデルおよびターゲットプロセッサ)を特定する情報を保持している。
【0018】
図4は、ホストマシンのハードウエア構成例を説明する図である。ホストマシンは、ホストプロセッサ50、RAM(Random Access Memory)51、およびROM(Read Only Memory)52を備えている。ROM52には、ジェネレータプログラム53、スレッドスケジューラプログラム54、メモリモデルプログラム55が格納されている。
【0019】
ROM52に格納されているジェネレータプログラム53がRAM51のプログラム格納領域にロードされてホストプロセッサ50により実行されることによって、当該ホストマシンはジェネレータ10としての機能を実現する。入力ソースコード1000は、例えば図示しない外部記憶装置から入力される。ホストプロセッサ50は、入力ソースコード1000をRAM51にロードされたジェネレータプログラム53に従って処理して、性能見積もりプログラム1001を出力する。性能見積もりプログラム1001の出力先は、RAM51であってもよいし、外部記憶装置であってもよい。
【0020】
ROM52に格納されているスレッドスケジューラプログラム54およびメモリモデルプログラム55は、RAM51のプログラム格納領域にロードされる。ホストプロセッサ50により実行されることにより、ホストマシンは、スレッドスケジューラ20およびメモリモデル30としての機能を実現する。スレッドスケジューラプログラム54およびメモリモデルプログラム55がRAM51にロードされた状態で、性能見積もりプログラム1001は、RAM51のプログラム格納領域にロードされ、ホストプロセッサ50によって実行される。ホストプロセッサ50は、性能見積もりプログラム1001に含まれている、スレッドスケジューラ20の機能を呼び出す命令を実行すると、スレッドスケジューラプログラム54に制御を移す。また、ホストプロセッサ50は、メモリモデル30の機能を呼び出す命令を実行すると、メモリモデルプログラム55に制御を移す。
なお、ジェネレータ10を実現するホストマシンと性能見積もりプログラム1001を実行する環境を実現するホストマシンとは、異なっていてもよい。
【0021】
図5は、ジェネレータ10の機能構成を説明する図であり、図6は、入力ソースコード1000がジェネレータ10に入力されてから見積もり値1002を算出するまでの動作を説明するフローチャートである。
【0022】
ジェネレータ10は、解析予備情報付加部101、クロスコンパイル部102、ターゲットプロセッサ命令実行情報生成部(処理時間算出部)103、ソースコード変換部104、解析処理生成部105、およびセルフコンパイル部106を備えている。これらの構成要素の機能および動作を、図5および図6とを用いて具体的に説明する。
【0023】
まず、ジェネレータ10に入力ソースコード1000が入力される(S1)。
解析予備情報付加部101は、入力ソースコード1000に解析予備情報を挿入して、解析予備情報付きソースコード1003を生成する(S2)。解析予備情報とは、入力ソースコード1000を構成するコード行群を基本ブロック毎に分類するとともに、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理を実行するコード行を特定するための情報である。第1の実施形態においては、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理とは、メモリアクセスが該当する。なお、以下、解析予備情報のうちの、コード行群を基本ブロック毎に分類する解析予備情報を第1解析予備情報、ターゲットプロセッサ1a〜1dの外に影響を及ぼす処理を行うコード行を特定する解析予備情報を第2解析予備情報と区別して表現することもある。
【0024】
図7は、入力ソースコード1000の具体例を示す図であり、図8は、図7の入力ソースコード1000に対応する制御フローを示す図である。制御フローとは、ソースコードの示す処理の流れをいい、基本ブロックとは、制御フローが扱う最小の処理単位をいう。コンパイラは、入力ソースコード1000を意味を損なうことなくプログラムに変換するため、ターゲットマシン、ホストマシンのどちらで実行しても同じ制御フローで基本ブロックが実行される。図8に示す制御フローにおいて、処理201〜処理207が基本ブロックに該当する。分岐処理207は、分岐先の処理(処理203および処理204)のうちのどちらに進むかを示す情報を有している。
【0025】
図9は、解析予備情報付きソースコード1003の具体例を示す図である。ここでは、解析予備情報は、関数型API(Application Programming Interface)を呼び出す記述であるものとする。
【0026】
図9の解析予備情報付きソースコード1003において、__API1、__API2、__API4、および__API6が第1解析予備情報に該当する。当該解析予備情報付きソースコード1003をコンパイルしプログラムを実行した際、例えば制御フローが処理203を経由する流れで構成される場合、基本ブロックの先頭にある__API1、__API2、__API6が実行される。ホストマシン上で__API1、__API2、__API6が実行された場合、ユーザは、ターゲットマシン上でも処理203を経由する制御フローで基本ブロックが処理されることを知ることが可能となる。
【0027】
また、__API3および__API5が第2解析予備情報に該当する。ここで、“z=a[1]”とは、シンボルaが示すアドレスに1単位アドレスを加えたアドレスの情報をreadして、readした値をzに代入する、という意味である。1単位アドレスとは、シンボルに割り付けられたデータサイズである。
【0028】
次に、クロスコンパイル部102は、解析予備情報付きソースコード1003をクロスコンパイルして、ターゲットマシン用の命令列であるターゲットプロセッサ命令列1004を出力する(S3)。ここで、クロスコンパイル部102は、ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定する。具体的には、解析予備情報付きソースコード1003を逐次命令列に変換していく際に、第1解析予備情報を含むコード行から基本ブロックの先頭を示す記述を生成し、第2解析予備情報を含むコード行からメモリアクセスを実行する命令を特定する記述を生成する。
【0029】
図10は、ターゲットプロセッサ命令列1004の具体例を示す図である。図示するように、ターゲットプロセッサ命令列1004は、入力ソースコード1000をクロスコンパイルして得られる命令列に、“__API1:”、“__API2:”、“__API3:func,line=3,column=8”、“__API4:”、“__API5:func,line=5,column=8”、および“__API6:”の記述が挿入された構成を備えている。
【0030】
これらの記述のうち、“__API1:”、“__API2:”、“__API4:”、および“__API6:”の記述は、第1解析予備情報に対応して生成されるものであって、入力ソースコード1000をクロスコンパイルして得られる命令列を構成する夫々の基本ブロックの先頭に生成されている。第1解析予備情報に対応して生成されるこれらの記述の挿入位置によって、入力ソースコード1000をクロスコンパイルして得られる命令列は4つの基本ブロックに分類されている。即ち、__API1が示す基本ブロックではmov命令とbnez命令が実行されることを知ることができる。同様に__API2が示す基本ブロックではlw、mov、bra命令が、__API4が示す基本ブロックではlw、mov命令が、__API6が示す基本ブロックはmov命令が2回と、add3、ret命令が実行されることを知ることができる。
【0031】
ここで、mov命令は値を第2引数の値を第1引数に代入する命令で、add3は第2引数および第3引数の値の和を第1引数に代入する命令である。また、bnezは第1引数の値が0でなければ第2引数のラベルにジャンプし、bra命令は無条件で指定先のラベルにジャンプする命令である。また、lw命令はメモリアクセスを伴う命令で、該当のアドレスから4byteのデータをreadし、レジスタに代入するという命令である。引数で“$”から始まる記号列はレジスタを表しており、数字から始まるものは数値、英字から始まる記号列は変数を表す。以下、第1解析予備情報に対応して生成されたこれらの記述を、基本ブロック特定情報ということがある。
【0032】
また、__API3が示す基本ブロックおよび__API5は、メモリアクセスを伴うlw命令を含んでいる。“__API3:func,line=3,column=8”および“__API5:func,line=5,column=8”の記述は、第2解析予備情報に対応して生成されるものであって、メモリアクセスを行う命令を含むこれらの基本ブロックに生成されている。これらの記述は、当該メモリアクセスを伴う命令が実行される入力ソースコード1000における位置を特定する記述を夫々含んでいる。以下、第2解析予備情報に対応して生成されたこれらの記述を、メモリアクセス命令特定情報ということがある。
【0033】
次に、ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ命令列1004に基づいて、ターゲットプロセッサ命令実行情報1005を生成する(S4)。ターゲットプロセッサ命令実行情報1005は、ターゲットプロセッサ命令の実行に必要な処理時間と、メモリアクセス情報で構成される。
【0034】
ターゲットプロセッサ命令実行情報生成部103は、制御フローおよび基本ブロックを基にターゲットプロセッサ命令の実行に必要な処理時間を計算する。ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ命令列1004に挿入されている基本ブロック特定情報に基づいて、基本ブロックを処理する際にどの命令が実行されるかを認識することができる。メモリアクセスを伴わない命令の処理時間は決まっている。そのため、ターゲットプロセッサ命令実行情報生成部103は、実行される命令や回数がわかれば、ターゲットプロセッサで実行するために必要な処理時間を計算することができる。
【0035】
一方、メモリアクセスを伴う命令に必要な処理時間は、命令自体の処理時間にアクセス先の個別メモリモデルに依存した処理時間を加えたものとなる。ターゲットプロセッサ命令実行情報生成部103は、メモリアクセスを伴う命令に必要な処理時間を記述する箇所に、メモリアクセス情報を挿入しておく。ターゲットプロセッサ命令実行情報生成部103は、メモリアクセス特定情報を参照することによって、メモリアクセスを伴う命令が基本ブロックに含まれているか否かを認識することができる。なお、メモリアクセス情報は、メモリアクセスのアクセス先を識別する情報であり、アクセスシンボル、アクセスサイズ、アクセスタイプを含む。メモリアクセス情報には、アクセス先の個別メモリモデルに依存した処理時間は含まれていない。
【0036】
図11は、ターゲットプロセッサが備える個別メモリの特徴を示す図であり、図12は、アクセス先の個別メモリが決定される様子を説明するフローチャートである。図11に示すように、L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の順でメモリサイズが大きくなるが、アクセス速度が低下する。図12に示すように、ターゲットプロセッサ1a〜dによるアクセス先がターゲットプロセッサ1a〜1d側のキャッシュにヒットしなかった場合には、順次メインメモリ5側のキャッシュが検索され、何れのキャッシュにもヒットしなかった場合には、メインメモリ5にアクセスされる。キャッシュに対するアクセス速度は、ターゲットプロセッサ1a〜1d側であるほど速く、メインメモリ5側であるほど遅くなるが、アクセス先がどの階層の個別メモリであるかが分からないため、ターゲットプロセッサ命令実行情報生成部103は、メモリアクセスを伴う命令に必要な処理時間を見積もることができない。
【0037】
図13は、ターゲットプロセッサ命令実行情報1005の具体例を示す図である。ターゲットプロセッサ命令実行情報1005の先頭の行は、__API1が示す基本ブロックを処理する際に、ターゲットマシンでは2つの命令が実行され処理に3サイクルかかることを示している。これは、mov命令が1サイクル、bnez命令が2サイクルかかるためである。また、2行目に示すように、__API2のように命令の中にメモリアクセスを伴う場合、処理時間は命令を処理する時間に、メモリモデルへのアクセスに必要な時間が加えられる。ここで、ターゲットプロセッサ命令実行情報生成部103では、メモリアクセスに必要な処理時間はわからないため、メモリモデルへのアクセスに必要な時間の代わりにメモリアクセス情報を出力する。図13における記述1100は、メモリアクセス情報である。図13に示すメモリアクセス情報は、__API3が示すメモリアクセスが__API2が示す基本ブロックにおいて行われ、__API5が示すメモリアクセスが__API4が示す基本ブロックにおいて行わることを示している。また、当該メモリアクセス情報は、ターゲットプロセッサ命令実行情報1005の5行目および6行目に示すように、__API3および__API5にかかる夫々のメモリアクセスにかかるアクセスシンボル、アクセスサイズ、アクセスタイプが記述されている。例えば、5行目は、“read”がアクセスタイプ、次に記述されている“4”がアクセスサイズ、さらに次に記述されている“a”が入力ソースコード1000上のシンボル情報、さらに次に記述されている“4”がシンボルの示すアドレスからのオフセットを示している。即ち、5行目の__API3が示すメモリアクセスは、シンボルaが示すアドレスに4を加えたアドレスから、4byteのデータをreadするメモリアクセスである、ということを示している。
【0038】
このように、ターゲットプロセッサ命令実行情報生成部103は、ターゲットプロセッサ1a〜1dの外に影響を与えない処理、言い換えるとターゲットプロセッサ1a〜1d内で実行される処理にかかる処理時間を、基本ブロック毎の命令列に基づいて基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する。
【0039】
次に、ソースコード変換部104は、ターゲットプロセッサ命令実行情報1005に基づいて、解析予備情報付きソースコード1003に付加されている解析予備情報を解析APIへ変換し、解析API付きソースコード1006を出力する(S5)。ここで解析予備情報の解析APIへの変換は、解析API付きソースコード1006をセルフコンパイルし、ホストマシン上で実行した際に、ターゲットプロセッサ命令実行情報1005に記述されている基本ブロック毎の処理時間が累積されるように変換する。また、メモリアクセスを伴う命令はメモリモデル30へリクエストを発行するように変換する。
【0040】
図14は、解析API付きソースコード1006の具体例を示す図である。図示するように、第1解析予備情報が夫々__PROC(第1コード)という解析APIに変換され、当該解析APIの引数として対応する基本ブロックをターゲットマシン上で処理するのに必要な処理時間の見積もり値が渡されている。基本ブロック毎の処理時間の見積もり値は、ターゲットプロセッサ命令実行情報1005から読み出されて__PROCの引数として用いられる。第2解析予備情報を含む基本ブロックは、__MREAD(第2コード)という解析APIに解析APIの引数としてアドレスおよびサイズ、即ちメモリアクセス情報の内容を渡して実行し、メモリアクセスに必要な処理時間を求めるように変換されている。ここではシンボルからアドレスを求めるには例えばプログラミング言語のアドレス演算子を用いることで実現することができる。なお、図14において、第1解析予備情報の__API2は、__PROC(1)と__PROC(3)とに分割されている。3行目の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。そして、5行目の__PROC(3)は、__MREADでメモリアクセスに必要な処理を行った後に記述されており、処理時間3で、mov命令と、bra命令を実行するということを示している。
【0041】
次に、解析処理生成部105は、解析APIの呼び出しにより実行される第1ターゲット命令実行解析処理1007および第2ターゲット命令実行解析処理1008を生成する(S6)。第1ターゲット命令実行解析処理1007および第2ターゲット命令実行解析処理1008は、解析API用ライブラリ1009を構成する。
【0042】
第1ターゲット命令実行解析処理1007は、__PROCにより呼び出され、スレッドスケジューラ20が管理しているスレッド毎の累積処理時間を更新する処理である。第1ターゲット命令実行解析処理1007は、現在実行しているスレッドの累積処理時間をスレッドスケジューラ20に問い合わせ、得られた累積処理時間にターゲットマシンで必要になる処理時間を加算し、加算された累積処理時間をスレッドスケジューラ20に渡す。言い換えると、第1ターゲット命令実行解析処理1007は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間にターゲットプロセッサ命令実行情報生成部103が算出した当該実行された基本ブロックの処理時間を加算する。
【0043】
図15は、第1ターゲット命令実行解析処理1007の具体例を示す図である。ここでは、処理手順を擬似コードで示している。図15の第1ターゲット命令実行解析処理1007は、2行目で現在のスレッドの累積処理時間を取得し、3行目で前記取得した累積処理時間に引数で渡ってきた処理時間を加算し、4行目で新しい累積処理時間をスレッドに設定している。
【0044】
第2ターゲット命令実行解析処理1008は、__MREADにより呼び出され、メモリモデル30に対してアクセスに必要な処理時間を問い合わせるリクエストを発行する処理である。
図16は、第2ターゲット命令実行解析処理1008の具体例を示す図であり、図17は、第2ターゲット命令実行解析処理1008の動作を説明するフローチャートである。累積処理時間の大きいスレッドが、累積処理時間の小さいスレッドと共有している個別メモリモデルにリクエストを発行した場合、累積処理時間の大きい未来のスレッドからのリクエストが先に処理されてしまい、共有しているメモリモデルに発行されたリクエストの順番に矛盾が発生する。これを防ぐために、第2ターゲット命令実行解析処理1008はまず、メモリモデル30にアクセスに必要な処理時間を問い合わせるメモリモデルアクセスリクエストを発行する前に、図16の2行目に示すように、当該アクセスを行うスレッド(以下、対象スレッドということとする)が当該対象スレッドを実行するターゲットプロセッサの外、即ち他のスレッド、に影響を及ぼすか否かを判定する(S11)。具体的には、第2ターゲット命令実行解析処理1008は、対象スレッドが他のスレッドに影響を及ぼすか否かを判定する影響調査リクエストをメモリモデル30に発行する。
【0045】
図18は、影響調査リクエストを受信したときのメモリモデル30の動作を示すフローチャートである。当該影響調査リクエストを受信すると、個別メモリモデル30a〜30gのうちの、アクセス対象のデータを保持している個別メモリモデルを特定する(S21)。具体的には、個別メモリモデル30a〜30gの夫々は、自身が保持しているデータを認識しており、自身が保持しているデータからメモリアクセス情報に対応するデータを検索する。検索は、個別メモリモデル30a〜30dのうちの対象スレッドを実行しているターゲットプロセッサが接続されている個別メモリモデルから開始される。検索が行われた個別メモリモデルが該当するデータを保持していない場合には、メインメモリ5側に接続されている別の個別メモリモデルが次に検索される。
【0046】
キャッシュに対応する個別メモリモデル30a〜30gの夫々が保持しているデータの管理は、例えばリユースディスタンス(Reuse-distance)モデルを用いることで実行することができる。リユースディスタンスモデルによれば、夫々の個別メモリにメモリアクセスシーケンスを示すリユースディスタンススタックを定義して、ある個別メモリにメモリアクセスがあったとき、当該リユースディスタンススタックにアクセス先のデータを識別する情報(例えばアドレスとサイズとの組み合わせ)が当該個別メモリのリユースディスタンススタックにスタックされる。
【0047】
図19は、リユースディスタンススタックを説明する図である。リユースディスタンスとは、あるデータへの過去のメモリアクセスから次のメモリアクセスまでの期間を指す。図19は、アクセス先の個々のデータを識別する情報をa〜fで表し、メモリアクセスのシーケンスをa、c、c、d、e、f、b、f、aとした場合のリユースディスタンススタックを示している。なお、a〜fで表される識別情報は、アクセス先のキャッシュラインを示すものであってもよい。図19に示すリユースディスタンススタックにおいて、最初のaから次のaまでのメモリアクセスの数をカウントすると、カウント数は「7」となるが、cやfのように重複しているメモリアクセスは1回と数える。したがって、aのリユースディスタンスは「5」となる。ここで、ターゲットマシンのL1キャッシュ2a〜dの夫々のサイズはxbyte、L2キャッシュ3a、3bのサイズは夫々ybyteで、それぞれfully-setassociativeのキャッシュであるとする。この場合、L1キャッシュ2a〜dは、リユースディスタンスがx以上になると、L1キャッシュ2a〜dからアクセス対象のデータが存在しなくなる。即ち、L1キャッシュミスとなり、キャッシュミスしたL1キャッシュが接続されているL2キャッシュにアクセスする必要が生じる。同様に、L2キャッシュ3a、3bは、リユースディスタンスがy以上になるとL2キャッシュミスとなり、L3キャッシュ4にアクセスする必要が生じる。このように、リユースディスタンスモデルを用いることで、個々の個別メモリモデルが保持しているデータを管理することができる。
【0048】
メモリモデル30は、アクセス対象のデータを保持している個別メモリモデルを特定すると、特定された個別メモリモデルにアクセス可能なターゲットプロセッサが複数あるか否かを判定する(S22)。アクセス可能なターゲットプロセッサが複数ある場合には(S22、Yes)、アクセス可能なターゲットプロセッサのリストを出力する(S23)。アクセス可能なターゲットプロセッサが一つしかない場合には(S22、No)、メモリモデル30は対象スレッドは他のスレッドに影響を及ぼさない旨の通知を出力する(S24)。メモリモデル30は、S23またはS24ののち、影響調査リクエストを受信したときの動作を終了する。
【0049】
メモリモデル30からアクセス可能なターゲットプロセッサのリストが返ってきた場合には、対象スレッドは他のスレッドに影響を及ぼすので(S11、Yes)、第2ターゲット命令実行解析処理1008は、図16の3行目に示すように、スレッドスケジューラ20にリクエストを発行して、スレッドスケジューリングを実行する(S12)。
【0050】
図20は、スレッドスケジューリングを説明するフローチャートである。スレッドスケジューラ20は、S23により通知された全てのターゲットプロセッサで実行されている全てのスレッドの累積処理時間を確認する(S31)。ここで、S23により通知されたターゲットプロセッサで実行されているスレッドを、簡単のために、通知されたスレッドということとする。スレッドスケジューラ20は、対象スレッドの累積処理時間が通知されたスレッドのうちで最も小さいか否かを判定する(S32)。
【0051】
対象スレッドの累積処理時間が最小ではない場合(S32、No)、スレッドスケジューラ20は、対象スレッドの実行を停止し(S33)、累積処理時間が最も小さいスレッドの実行が停止しているか否かを判定する(S34)。累積処理時間が最も小さいスレッドの実行が停止している場合(S34、Yes)、スレッドスケジューラ20は、当該累積処理時間が最も小さいスレッドの実行を再開させる(S35)。そして、スレッドスケジューラ20は、対象スレッドの実行が再開されるのを待機する(S36)。
【0052】
ここで、通知されたスレッドが対象スレッドがアクセスしようとしている個別メモリモデルにアクセスしようとする際には、スレッドスケジューラ20は、当該通知されたスレッドの対してS31〜S35の処理を夫々個別に実行する。これにより、S33の処理により対象スレッドの実行の停止して、しばらく待機していると、通知された他の全てのスレッドと対象スレッドとのうち、通知されたスレッドの夫々についてS31〜S35の処理が実行されることにより、対象スレッドの累積処理時間が最も小さくなる。その状態で、通知されたスレッドのうちの1つが当該個別メモリモデルにアクセスしようとした際に当該アクセスしようとしている通知されたスレッドに対して実行されたS35の処理により、対象スレッドの実行が再開せしめられる。スレッドスケジューラ20は、対象スレッドの実行が再開せしめられた後、対象スレッドのメモリアクセスの実行を許可する(S37)。累積処理時間が最も小さいスレッドの実行が停止していない場合(S34、No)、スレッドスケジューラ20は、S35の処理をスキップする。
【0053】
対象スレッドの累積処理時間がS23により通知されたすべてのスレッドのうちで最小である場合(S32、Yes)、対象スレッドのメモリアクセスの実行を許可し(S37)、動作を終了する。
【0054】
このように、スレッドスケジューラ20は、影響を与える他のスレッドよりも対象スレッドのほうが累積処理時間が小さくなるように、対象スレッドおよび影響される他のスレッドのスケジューリングを行う。
【0055】
なお、ここでは、通知された他のスレッドにかかるS35の処理により対象スレッドの実行が再開される、として説明したが、S34〜S36の処理の代わりに、対象スレッドの累積処理時間が最小であるか否かを判定し、対象スレッドの累積処理時間が最小である場合には対象スレッドの実行を再開し、対象スレッドの累積処理時間が最小でない場合には対象スレッドの累積処理時間が最小であるか否かを再度判定するようにしてもよい。
【0056】
スケジューリングを実行した後、第2ターゲット命令実行解析処理1008は、メモリモデル30にメモリアクセスリクエストを発行して、アクセス先の個別メモリモデルへのアクセスにかかる処理時間を取得する(S13)。
【0057】
図21は、メモリアクセスリクエストを受信したときのメモリモデル30の動作を示すフローチャートである。メモリモデル30は、メモリアクセスリクエストを受信すると、S21により特定した個別メモリモデルに基づいて、メモリアクセスにかかる処理時間を算出し、算出した処理時間を出力する(S41)。そして、メモリモデル30は、S21の処理において検索を実行したすべての個別メモリモデルのリユースディスタンススタックを更新し(S42)、動作を終了する。
【0058】
このように、第2ターゲット命令実行解析処理1008は、メモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングをメモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算する。
【0059】
その後、第2ターゲット命令実行解析処理1008は、第1ターゲット命令実行解析処理1007を呼び出して、S41にて出力されたメモリアクセスにかかる処理時間を累積処理時間に加算して(S14)、動作を終了する。対象スレッドが他のスレッドに影響を及ぼさない場合には(S11、No)、第2ターゲット命令実行解析処理1008は、S12の処理をスキップする。
【0060】
なお、ここではメモリモデル30がキャッシュヒット/ミスを判定したり、メモリアクセスにかかる処理時間を算出するために、リユースディスタンスを用いるものとして説明した。メモリアクセスにかかる処理時間を算出する方法は、これに限定されない。例えば、いかなるアクセスでもターゲットプロセッサのサイクル数に換算してreadを1サイクル、writeを2サイクルで処理できる場合には、図22に示すような処理を実行することでメモリアクセスに必要な処理時間を知ることができる。
【0061】
S5の処理の後、セルフコンパイル部106は、解析API付きソースコード1006をセルフコンパイルし、セルフコンパイルの過程で解析API用ライブラリをリンクして、性能見積もりプログラム1001を出力する(S6)。
【0062】
ユーザは、スレッドスケジューラ20およびメモリモデル30がインストールされたホストマシンにおいて性能見積もりプログラム1001を実行することによって、入力ソースコード1000をクロスコンパイルして得られるターゲットプログラムをターゲットプロセッサで実行したときの処理時間の見積もり値1002を得ることができる(S7)。性能見積もりプログラム1001は、スレッドスケジューラ20およびメモリモデル30がインストールされたホストマシンにおいて実行されることで、最後に実行していたスレッドの累積処理時間を見積もり値1002として出力する。
【0063】
なお、以上の説明においては、解析予備情報は、関数型のAPIを呼び出す記述であるものとして説明したが、クロスコンパイル部102、ソースコード変換部104において解釈できる形であればどのような記述であってもよい。
また、解析API用ライブラリD10を予め用意しておくようにしてもよい。
【0064】
以上述べたように、本発明の第1の実施形態によれば、クロスコンパイル部102は、複数のターゲットプロセッサ1a〜1dおよび前記複数のターゲットプロセッサ1a〜1dがアクセスするメモリ群(L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5)を備えるコンピュータをターゲットマシンとするソフトウエアのソースコード(入力ソースコード1000)をクロスコンパイルして前記ターゲットマシン用の命令列を基本ブロック毎に分類して生成するとともに、前記生成した命令列に含まれるメモリアクセスを行う命令を特定し、ターゲットプロセッサ命令実行情報生成部103は、前記生成された基本ブロック毎の命令列に基づいてターゲットプロセッサ1a〜1dの外に影響を与えない処理にかかる処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成し、ソースコード変換部104は、基本ブロックが実行されたときに当該基本ブロックを実行したスレッドの累積処理時間に前記処理時間算出部が算出した当該実行された基本ブロックの処理時間を加算するコードである__PROCを入力ソースコード1000の対応する箇所に挿入しメモリアクセスを行う基本ブロックが実行されたときに当該メモリアクセスを行う基本ブロックを実行したスレッドとアクセス先が同一のスレッドとの間のスケジューリングを前記メモリアクセス情報に基づいて実行して前記メモリアクセスを行う基本ブロックのメモリアクセスにかかる処理時間を算出し、前記算出したメモリアクセスにかかる処理時間を前記メモリアクセスを行う基本ブロックを実行したスレッドの累積処理時間に加算するコードである__MREADを入力ソースコード1000の対応する箇所に挿入し、セルフコンパイル部106は、前記コード挿入後のソースコード(解析API付きソースコード1006)をセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラム1001を生成する、ように構成したので、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができる。ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、ターゲットマシンがまだ設計段階にある場合でもソフトウエアの性能評価を行うことができるので、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【0065】
なお、ホストマシンとターゲットマシンとの性能比率に基づいてソフトウエアの性能の評価を行うことが考えられる(比較例1)。しかしながら、比較例1は、ホストマシンとターゲットマシンとの間のアーキテクチャの違いに基づく実行時間の違いを考慮していないため、アーキテクチャの違いにより大きく実行時間が異なる場合、精度が大きく落ちる問題点がある。これに対して、第1の実施形態によれば、性能見積もりプログラム1001は、ターゲットマシンで実行したときの処理時間をメモリアーキテクチャやプロセッサアーキテクチャを考慮して算出することができるので、比較例1よりも正確にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【0066】
また、ソフトウエアにより実装された命令シミュレータを用いてターゲットマシン向けのソフトウエアの評価を行う方法(比較例2)も考えられるが、性能見積もりプログラム1001は、クロスコンパイルにより生成される命令に基づいてターゲットマシンにおける処理時間を算出するようにしているので、ターゲットプロセッサで実行される命令をシミュレーションしているわけではないので、比較例2に比べて高速にターゲットマシン向けのソフトウエアの処理時間の見積もりを行うことができる。
【0067】
また、ホストマシンは、ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理するスレッドスケジューラ20をさらに備え、__PROCにより呼び出される第1ターゲット命令実行解析処理1007は、ターゲットプロセッサ命令実行情報生成部103が算出した処理時間を引数としてスレッドスケジューラ20を呼び出して、実行スレッドの累積処理時間に前記引数として渡した処理時間を加算する、ように構成したので、ユーザは、ターゲットプロセッサ1a〜1dのアーキテクチャに合わせてスレッドスケジューラ20を変更することができる。
【0068】
また、ターゲットマシンが備えるメモリ群は、階層構造を形成する複数の個別メモリ(L1キャッシュ2a〜2d、L2キャッシュ3a、3b、L3キャッシュ4、メインメモリ5の夫々)を備え、__MREADにより呼び出される第2ターゲット命令実行解析処理1008は、アクセス先の個別メモリが同一である複数のスレッドをアクセス先が同一であるスレッドであるとするようにしたが、個別メモリを複数の領域に分割して、前記分割されて生成された同一の領域がアクセス先であるスレッドをアクセス先が同一のスレッドであるとするようにしてもよい。
【0069】
また、スレッドスケジューラ20は、アクセス先の個別メモリが同一の複数のスレッドのうち累積処理時間が最小となるまでメモリアクセスを行う基本ブロックによるメモリアクセスを待機させるとともに、待機時間を返すようにし、__MREADに呼び出される第2ターゲット命令実行解析処理1008は、スレッドスケジューラ20を呼び出して、前記呼び出したスレッドスケジューラ20から返された待機時間を実行スレッドの累積処理時間に加算する、ように構成したので、未来の処理が過去の処理に影響を与えるといった矛盾を防止することができる。
【0070】
(第2の実施形態)
図23は、ターゲットマシンの別の構成例を説明する図である。第2の実施形態では、図23に示したマシンをターゲットとした入力ソースコードの性能を見積もる場合について説明する。なお、第1の実施形態において説明した要素と同一の要素には同じ符号を付して、重複する説明を省略する。
【0071】
図23のターゲットマシンは、図1に示したターゲットマシンに外部ハードウエア6を追加した構成を備えている。外部ハードウエア6は、ターゲットプロセッサ1aおよびターゲットプロセッサ1bに共通接続(共有)されている。外部ハードウエア6は、ターゲットプロセッサ1a〜1d、個別メモリ以外の装置であって、ターゲットプロセッサ1aまたはターゲットプロセッサ1bが外部ハードウエア6を駆動する命令を実行すると、所定の処理を行う。ここで、外部ハードウエア6を駆動する命令をターゲットプロセッサ1a〜1d上で実行することを、外部ハードウエア6をキックする、という。なお、外部ハードウエア6に接続されていないターゲットプロセッサ1cやターゲットプロセッサ1dが外部ハードウエアをキックすると、外部ハードウエア6は所定の処理を実行せずにエラーとなる。
【0072】
図24は、図23に示したターゲットマシンの処理時間の見積もりを算出する様子を説明する概念図である。ジェネレータ10は、入力ソースコード1000に基づいて性能見積もりプログラム1001を生成する。第2の実施形態では、性能見積もりプログラム1001は、スケジューラ20、メモリモデル30、および外部ハードウエアモデル40を備えるホストマシンで実行され、見積もり値1002を生成・出力する。
【0073】
外部ハードウエアモデル40は、外部ハードウエア6をモデル化したものであって、ターゲットプロセッサ上で外部ハードウエア6を駆動する命令が実行された場合、外部ハードウエア6が処理を実行するのに必要な処理時間をターゲットプロセッサ上のサイクル数に換算して返す機能を持つ。
【0074】
図25は、入力ソースコード1000の具体例を示す図であり、図26は、解析予備情報付きソースコード1003の具体例を示す図であり、図27は、ターゲットプロセッサ命令列1004の具体例を示す図である。図25に示すように、第2の実施形態における入力ソースコード1000は、第1の実施形態にて説明した図7の入力ソースコード1000の例の7行目に、外部ハードウエア6をキックするコード行“hwe_exec()”が追加されている。図26に示す解析予備情報付きソースコード1003によれば、第2解析予備情報として、__API7が“hwe_exec()”が記述されているコード行に挿入されている。即ち、第2の実施形態では、外部ハードウエア6をキックする処理も、ターゲットプロセッサ1a〜1dの外に影響を与える処理のうちに含まれる。また、図27に示すターゲットプロセッサ命令列1004によれば、__API4が示す基本ブロックではlw、mov命令に加えて、stcb命令が実行されることが示されている。stcb命令は、第1引数および第2引数に応じて外部ハードウエアをキックする命令である。即ち、第2の実施形態では、クロスコンパイル部102は、生成した命令列に含まれる外部ハードウエア6を駆動する命令を特定するようにする。
【0075】
図28は、ターゲットプロセッサ命令実行情報1005の具体例を示す図である。__API4のように、命令の中にメモリアクセスと外部ハードウエアモデル40をキックする命令を伴う場合、処理時間は命令を処理する時間に、メモリ群へのアクセスに必要な時間と外部ハードウエア6をキックした際に必要となる処理時間を加えたものである。ターゲットプロセッサ命令実行情報1005には、記述1100に示すメモリアクセス情報のほかに、記述1200に示す外部ハードウエアアクセス情報を含んでいる。7行目は、__API7に対応する外部ハードウエア6の名称は“HWE1”であることを示している。即ち、第2の実施形態では、ターゲットプロセッサ命令実行情報生成部103は、外部ハードウエア6を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア6を駆動する命令を識別する外部ハードウエアアクセス情報を生成する。
【0076】
図29は、解析API付きソースコード1006の具体例を示す図である。図29に示す解析API付きソースコード1006によれば、基本ブロックが外部ハードウエア6をキックする命令を含んでいた場合は、当該基本ブロックに、__HWE1_EXEC(第3コード)という解析APIが挿入されている。__API4が示す基本ブロックの__PROCは、__PROC(1)と__PROC(2)とに分割されている。最初の__PROC(1)は、処理時間1でメモリアクセスを伴うlw命令を実行するということを示している。__MREADは、メモリアクセスに必要な処理を行う。__PROC(2)は、処理時間2で、mov命令と、stcb命令を実行するということを示している。
【0077】
解析処理生成部105は、第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008に加えて、HWE1_EXECによって呼び出される第3ターゲット命令実行解析処理を生成し、生成した第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008および第3ターゲット命令実行解析処理1010を結合して解析API用ライブラリ1009を生成する。
【0078】
図30は、第3ターゲット命令実行解析処理1010の具体例を示す図である。本図において、第3ターゲット命令実行解析処理1010を疑似コードで示している。第3ターゲット命令実行解析処理1010は、2行目で、外部ハードウエアモデル40をキックすることによって対象スレッドが他のスレッドに影響を与えるか否かを調べる。ここでは、外部ハードウエア6は、ターゲットプロセッサ1aおよびターゲットプロセッサ1bが共通接続されているので、例えば対象スレッドがターゲットプロセッサ1aで実行されている場合、ターゲットプロセッサ1bで実行されているスレッドが前記対象スレッドから影響されることになる。第3ターゲット命令実行解析処理1010は、対象スレッドが他のスレッドに影響を与える場合、3行目でスレッドスケジューラ20を呼び、対象スレッドおよび対象スレッドに影響を与えられるスレッドのスケジューリングを行う。第3ターゲット命令実行解析処理1010は、対象スレッドが他のスレッドに影響を与えない場合、またはスレッドスケジューラ20の呼び出しによりスレッドスケジューリングが終わった場合は、5行目に示すように、外部ハードウエアモデル40を実行し、外部ハードウエア6が処理に必要となった時間取得する。
【0079】
図31は、外部ハードウエアモデル40が実行されたときの処理(外部ハードウエアモデル実行処理)の具体例を示す図である。本図においても、外部ハードウエアモデル実行処理1011を疑似コードで示す。また、本図における外部ハードウエアモデル実行処理1011は、一例として、駆動された回数に応じた時間だけ待つ処理を行うものとする。外部ハードウエアモデル実行処理1011は、駆動された回数を数える処理を行い(2行目)、駆動された回数に応じた時間だけ待つ処理を行う(3行目)。そして、外部ハードウエアモデル実行処理1011は、ターゲットプロセッサのサイクル数に換算した処理時間を出力する(4行目)。
【0080】
第3ターゲット命令実行解析処理1010は、外部ハードウエアモデル実行処理1011が出力した時間を対象スレッドの累積処理時間に加算する処理を実行する(図30の6行目)。
【0081】
このように、第2の実施形態では、ソースコード変換部104は、外部ハードウエア6を駆動する基本ブロックが実行されたときに当該外部ハードウエア6の駆動にかかる処理時間を外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第3ターゲット命令実行解析処理1010を入力ソースコード1000の対応する箇所に挿入する。
【0082】
以上述べたように、本発明の第2の実施形態によれば、ターゲットマシンはターゲットプロセッサ1a、1bによって駆動される外部ハードウエア6を備え、クロスコンパイル部102は、生成した命令列に含まれる外部ハードウエア6を駆動する命令を特定し、ターゲットプロセッサ命令実行情報生成部103は、外部ハードウエア6を駆動する前記特定された命令に基づいて当該特定された外部ハードウエア6を駆動する命令を識別する外部ハードウエアアクセス情報を生成し、ソースコード変換部104は、外部ハードウエア6を駆動する基本ブロックが実行されたときに当該外部ハードウエア6の駆動にかかる処理時間を外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する第3ターゲット命令実行解析処理1010を入力ソースコード1000の対応する箇所に挿入する、ように構成したので、ターゲットマシンが外部ハードウエア6を備える場合においてもターゲットマシン向けのソフトウエアの性能を見積もることができる性能見積もりプログラム1001を生成することができる。
【0083】
(第3の実施形態)
第3の実施形態では、外部ハードウエア6がメモリに接続されている場合について説明する。なお、図32の例によれば、外部ハードウエア6は、L2キャッシュ3aに接続されている。
【0084】
外部ハードウエア6が個別メモリに接続されている場合には、外部ハードウエアモデル実行処理1011を図33に示すようにする。図33の外部ハードウエアモデル実行処理1011は、外部ハードウエアモデル40からのメモリアクセスが、当該外部ハードウエアモデル40をキックしたスレッドの他のスレッドに影響するか否かを調べる(2行目)。なお、外部ハードウエアモデル40をキックしたスレッドを対象スレッドということとする。対象スレッドが他のスレッドに影響する場合には、外部ハードウエアモデル実行処理1011は、スレッドスケジューラ20を呼び、スレッドのスケジューリングを行う(3行目)。対象スレッドが他のスレッドに影響しない場合、またはスレッドスケジューラの呼び出しによりスレッドスケジューリングが終わった場合、外部ハードウエアモデル実行処理1011は、メモリモデル30にリクエストを発行し(5行目)、メモリアクセスに必要となった時間とアドレスに格納されたデータ値とを取得する(6行目)。そして、取得したデータ値分の時間だけ待つ処理を行う(7行目)。そして、待った時間およびメモリアクセスに必要となった時間を出力する(8行目)。
【0085】
即ち、第3ターゲット命令実行解析処理1010は、外部ハードウエア6とアクセス先が同一のスレッドとの間のスケジューリングを実行して外部ハードウエア6によるメモリアクセスにかかる処理時間を算出し、前記算出した外部ハードウエア6によるメモリアクセスにかかる処理時間と外部ハードウエア6の駆動にかかる処理時間とを外部ハードウエア6を駆動する基本ブロックを実行したスレッドの累積処理時間に加算する。これにより、外部ハードウエア6がメモリアクセスを行う場合であってもターゲットマシン向けのソフトウエアの評価を行うことができるようになる。
【0086】
以上述べたように、第1〜第3の実施形態によれば、ターゲットマシンを用意することなくソフトウエアの処理時間を見積もることができ、また、命令シミュレーションを行う場合よりも精度よくソフトウエアの処理時間を見積もることができる。したがって、マルチプロセッサ向けに開発されたソフトウエアを実行したときの処理時間を見積もる作業を効率的に実行することができる。
【0087】
なお、解析処理生成部105は、第1〜第3の実施形態のターゲットプロセッサ命令実行情報1005を入力とし、第1ターゲット命令実行解析処理1007、第2ターゲット命令実行解析処理1008、第3ターゲット命令実行解析処理1010のうちの必要な処理だけを生成するようにしてもよい。
【0088】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【0089】
1a〜d ターゲットプロセッサ、2a〜d L1キャッシュ、3a、b L2キャッシュ、4 L3キャッシュ、5 メインメモリ、6 外部ハードウエア、10 ジェネレータ、20 スレッドスケジューラ、30 メモリモデル、30a〜h 個別メモリモデル、40 外部ハードウエアモデル、50 ホストプロセッサ、51 RAM、52 ROM、53 ジェネレータプログラム、54 スレッドスケジューラプログラム、55 メモリモデルプログラム、101 解析予備情報付加部、102 クロスコンパイル部、103 ターゲットプロセッサ命令実行情報生成部、104 ソースコード変換部、105 解析処理生成部、106 セルフコンパイル部、1000 入力ソースコード、1001 性能見積もりプログラム、1002 見積もり値、1003 解析予備情報付きソースコード、1004 ターゲットプロセッサ命令列、1005 ターゲットプロセッサ命令実行情報、1006 解析API付きソースコード、1007 第1ターゲット命令実行解析処理、1008 第2ターゲット命令実行解析処理、1009 解析API用ライブラリ、1010 第3ターゲット命令実行解析処理、1011 外部ハードウエアモデル実行処理。
【特許請求の範囲】
【請求項1】
ソフトウエアのソースコードをクロスコンパイルして命令列を基本ブロック毎に分類して生成するとともに、前記命令列に含まれるメモリアクセスを行う命令を特定するクロスコンパイル部と、
前記基本ブロック毎の命令列に基づいて命令の実行に必要な処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する処理時間算出部と、
基本ブロックを実行するスレッドの累積処理時間に前記実行される基本ブロックの処理時間を加算する第1コードを前記ソースコードの対応する箇所に挿入し、メモリアクセスを含む基本ブロックを実行するスレッドの累積処理時間に、前記メモリアクセス情報に基づいて算出したメモリアクセスにかかる処理時間を加算する第2コードを前記ソースコードの対応する箇所に挿入するソースコード変換部と、
前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成するセルフコンパイル部をさらに備える、
を備えることを特徴とするプログラム生成装置。
【請求項2】
前記ソフトウエアのソースコードは、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるターゲットマシン上で仮想的に実行される、ことを特徴とする請求項1に記載のプログラム生成装置。
【請求項3】
前記ターゲットマシンは前記プロセッサによって駆動される外部ハードウエアを備え、
前記クロスコンパイル部は、前記生成した命令列に含まれる外部ハードウエアを駆動する命令を特定し、
前記処理時間算出部は、前記特定された外部ハードウエアを駆動する命令を識別する外部ハードウエアアクセス情報を生成し、
前記ソースコード変換部は、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に前記外部ハードウエアの駆動にかかる処理時間を加算する第3コードを前記ソースコードの対応する箇所に挿入する、
ことを特徴とする請求項2に記載のプログラム生成装置。
【請求項4】
前記外部ハードウエアは、前記メモリにアクセスし、
前記第3コードは、さらに、前記外部ハードウエアによるメモリアクセスにかかる処理時間を、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に加算する、
ことを特徴とする請求項3に記載のプログラム生成装置。
【請求項5】
前記ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理する第1処理を実行するスレッドスケジューラをさらに備え、
前記第1コードは、前記スレッドスケジューラによる第1処理を起動して、前記基本ブロックを実行するスレッドの累積処理時間に前記基本ブロックの処理時間を引数として渡す、
ことを特徴とする請求項2に記載のプログラム生成装置。
【請求項6】
前記メモリアクセス情報に基づいてアクセス先の個別メモリを特定するとともに、前記特定した個別メモリにアクセス可能なプロセッサが複数あるか否かを判定する処理を実行するメモリモデルをさらに備え、
前記第2コードは、前記メモリアクセスを行う基本ブロックにかかるメモリアクセス情報を引数として前記メモリモデルを呼び出す、
ことを特徴とする請求項5に記載のプログラム生成装置。
【請求項1】
ソフトウエアのソースコードをクロスコンパイルして命令列を基本ブロック毎に分類して生成するとともに、前記命令列に含まれるメモリアクセスを行う命令を特定するクロスコンパイル部と、
前記基本ブロック毎の命令列に基づいて命令の実行に必要な処理時間を基本ブロック毎に算出するとともに、メモリアクセスのアクセス先を識別するメモリアクセス情報を前記特定された命令毎に生成する処理時間算出部と、
基本ブロックを実行するスレッドの累積処理時間に前記実行される基本ブロックの処理時間を加算する第1コードを前記ソースコードの対応する箇所に挿入し、メモリアクセスを含む基本ブロックを実行するスレッドの累積処理時間に、前記メモリアクセス情報に基づいて算出したメモリアクセスにかかる処理時間を加算する第2コードを前記ソースコードの対応する箇所に挿入するソースコード変換部と、
前記コード挿入後のソースコードをセルフコンパイルして、最後に実行終了したスレッドの累積処理時間を出力する性能見積もりプログラムを生成するセルフコンパイル部をさらに備える、
を備えることを特徴とするプログラム生成装置。
【請求項2】
前記ソフトウエアのソースコードは、複数のプロセッサおよび前記複数のプロセッサがアクセスするメモリを備えるターゲットマシン上で仮想的に実行される、ことを特徴とする請求項1に記載のプログラム生成装置。
【請求項3】
前記ターゲットマシンは前記プロセッサによって駆動される外部ハードウエアを備え、
前記クロスコンパイル部は、前記生成した命令列に含まれる外部ハードウエアを駆動する命令を特定し、
前記処理時間算出部は、前記特定された外部ハードウエアを駆動する命令を識別する外部ハードウエアアクセス情報を生成し、
前記ソースコード変換部は、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に前記外部ハードウエアの駆動にかかる処理時間を加算する第3コードを前記ソースコードの対応する箇所に挿入する、
ことを特徴とする請求項2に記載のプログラム生成装置。
【請求項4】
前記外部ハードウエアは、前記メモリにアクセスし、
前記第3コードは、さらに、前記外部ハードウエアによるメモリアクセスにかかる処理時間を、前記外部ハードウエアを駆動する基本ブロックを実行するスレッドの累積処理時間に加算する、
ことを特徴とする請求項3に記載のプログラム生成装置。
【請求項5】
前記ターゲットマシンが備えるプロセッサで実行されるスレッド毎の累積処理時間を管理する第1処理を実行するスレッドスケジューラをさらに備え、
前記第1コードは、前記スレッドスケジューラによる第1処理を起動して、前記基本ブロックを実行するスレッドの累積処理時間に前記基本ブロックの処理時間を引数として渡す、
ことを特徴とする請求項2に記載のプログラム生成装置。
【請求項6】
前記メモリアクセス情報に基づいてアクセス先の個別メモリを特定するとともに、前記特定した個別メモリにアクセス可能なプロセッサが複数あるか否かを判定する処理を実行するメモリモデルをさらに備え、
前記第2コードは、前記メモリアクセスを行う基本ブロックにかかるメモリアクセス情報を引数として前記メモリモデルを呼び出す、
ことを特徴とする請求項5に記載のプログラム生成装置。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図12】
【図13】
【図14】
【図15】
【図16】
【図17】
【図18】
【図19】
【図20】
【図21】
【図22】
【図23】
【図24】
【図25】
【図26】
【図27】
【図28】
【図29】
【図30】
【図31】
【図32】
【図33】
【公開番号】特開2013−25403(P2013−25403A)
【公開日】平成25年2月4日(2013.2.4)
【国際特許分類】
【出願番号】特願2011−157111(P2011−157111)
【出願日】平成23年7月15日(2011.7.15)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
【公開日】平成25年2月4日(2013.2.4)
【国際特許分類】
【出願日】平成23年7月15日(2011.7.15)
【出願人】(000003078)株式会社東芝 (54,554)
【Fターム(参考)】
[ Back to top ]