(57)【要約】【課題】本来のプログラムの動作に影響を及ぼすことなく性能プロファイリングを実施できるようにする。【解決手段】測定対象のプログラムの命令とその命令が含まれるルーチンを示す識別情報であるプログラムＩＤとが組になって記憶されたメインメモリからＣＰＵが命令を読み出して処理を実行するとともに、ＣＰＵが命令を読み出すことによりメインメモリから命令とともに出力されるプログラムＩＤに基づき、複数のカウンタにおいて識別情報により指定されるカウンタに対してカウント値のカウントアップを指示するようにして、ＣＰＵによる命令の処理と並行してＣＰＵとは別の回路でプログラムの実行情報の収集を行う。【選択図】図１
2014182478.tif 000002
【特許請求の範囲】
【請求項１】
測定対象のプログラムに含まれるルーチンに対応して設けた複数のカウンタ部と、
前記プログラムの命令と、当該命令が含まれる前記プログラムのルーチンを示す識別情報とを組にして記憶する記憶部と、
前記記憶部から前記命令を読み出し、当該命令に応じた処理を実行する処理部と、
前記処理部が命令を読み出すことによって前記記憶部から前記命令とともに出力される当該命令の識別情報を受けて、当該識別情報により指定される前記カウンタ部に対してカウント値のカウントアップを指示するカウンタ制御部とを有することを特徴とする性能プロファイリング装置。
【請求項２】
前記カウンタ制御部は、
前記記憶部から出力される前記識別情報を所定のタイミングで取り込んで保持するレジスタと、
前記レジスタに保持された前記識別情報をデコードし、デコード結果に基づいて前記カウンタ部に対するカウントアップの指示を出力する出力部とを有することを特徴とする請求項１記載の性能プロファイリング装置。
【請求項３】
前記カウンタ制御部は、前記識別情報により指定される前記カウンタ部に対して、クロックの１周期毎にカウントアップするよう指示することを特徴とする請求項１又は２記載の性能プロファイリング装置。
【請求項４】
前記カウンタ制御部は、前記識別情報により指定される前記カウンタ部に対して、対象のイベントが発生したときにカウントアップするよう指示することを特徴とする請求項１又は２記載の性能プロファイリング装置。
【請求項５】
測定対象のプログラムに含まれるルーチンに対応して設けた複数のカウンタ部、及び前記プログラムの命令と、当該命令が含まれる前記プログラムのルーチンを示す識別情報とを組にして記憶する記憶部とを有する性能プロファイリング装置の性能プロファイリング方法であって、
前記性能プロファイリング装置が有する処理部が、前記記憶部から前記命令を読み出し、当該命令に応じた処理を実行し、
前記性能プロファイリング装置が有するカウンタ制御部が、前記処理部が命令を読み出すことによって前記記憶部から前記命令とともに出力される当該命令の識別情報を受けて、当該識別情報により指定される前記カウンタ部に対してカウント値のカウントアップを指示することを特徴とする性能プロファイリング方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、性能プロファイリング装置及び性能プロファイリング方法に関する。
【背景技術】
【０００２】
プログラムの性能解析ツールとしてプロファイラがある。プロファイラは、情報処理システムでのプログラムの実行時に情報を収集する（プロファイルする）。サンプリング型のプロファイラは、オペレーティングシステムの割り込みを使って、測定対象のプログラムのプログラムカウンタを一定の間隔で調べ、その値を記録しておく。そして、プログラムの実行が終了した後に、記録した内容からプログラム全体の実行時間やプログラム内で呼び出されている各サブルーチン（関数）の実行時間を知ることで、プログラムのどの部分が処理に時間を要しているか解析できる。サンプリング型のプロファイラは、オペレーティングシステムの割り込みを使っているために、プログラムの実行情報のサンプリング間隔が大きく、一般に精度が低い。しかし、測定対象のプログラムを通常とほぼ同じ速度で実行させることができる。
【０００３】
プロファイルする他の手法として、例えば下記の第１の方法が知られている。第１の方法は、プログラムにおいてサブルーチン（関数）をコールする前後に性能カウンタの値を取得して記録するルーチンを埋め込み、サブルーチン（関数）の実行を開始するとき及び終了するときのカウンタ値をログとして記録する方法である。プログラムの実行が終了した後にログを解析することで、サブルーチン（関数）の実行時間や特性をつかむことが可能である。しかし、この第１の方法では、本来のプログラムのソースコードにプロファイルのためのルーチンのコードを埋め込み、再コンパイルする必要がある。また、性能カウンタの値を取得するために埋め込まれたルーチンにより、性能測定用のプログラムが、本来のプログラムとは異なった動作をするという問題があった。
【０００４】
また、プログラムのソースコードを変更せずにプロファイルする手法として、例えば下記の第２の方法が提案されている（例えば、特許文献１及び特許文献２参照）。第２の方法では、ＣＰＵ（Central Processing Unit）内で発生するイベントをカウントし、その値が所定の値になったら割り込みを発生させ、割り込みハンドラーにより各サブルーチン（関数）において、そのイベントが発生した回数をログとして記録する。しかし、この第２の方法でも、本来のプログラムの動作に対して割り込みハンドラーによる処理ルーチンの動作が挿入されることになり、本来のプログラムとは異なった動作になってしまう。
【０００５】
実行クロック数をタスク毎にカウントし、タスクの切り替わるタイミングで、実行していたタスクのタスクＩＤ及び実行クロック数を取得し、タスクＩＤを基にタスク毎に実行クロック数を累積して保存し、プログラムの実行情報を収集する方法が提案されている（例えば、特許文献３参照）。また、プログラム・モジュール単位で実行時間及び実行回数を計測するカウンタを設け、測定対象のプログラム・モジュールの最初及び最後で、対応のカウンタに対するカウントの開始及び停止をＣＰＵが指示することで実行時間及び実行回数を測定する方法が提案されている（例えば、特許文献４参照）。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平８−３０４９４号公報
【特許文献２】特開２００５−２１５８１６号公報
【特許文献３】特開平１１−３９１９２号公報
【特許文献４】特開２００２−２４４８９０号公報
【特許文献５】特開２０１０−２４４５５２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
前述した第１の方法及び第２の方法は、サンプリング型のプロファイラより短いサンプリング間隔で、プログラムの実行情報を収集することが可能である。しかし、第１の方法及び第２の方法においては、本来のプログラムの動作とは異なった動作になってしまうという問題がある。
１つの側面では、本発明は、本来のプログラムの動作に影響を及ぼさずにプログラムの実行情報を収集することができる性能プロファイリング装置及び性能プロファイリング方法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
性能プロファイリング装置の一態様は、測定対象のプログラムに含まれるルーチンに対応した複数のカウンタ部と、プログラムの命令とその命令が含まれるルーチンを示す識別情報とが記憶された記憶部から命令を読み出して処理を実行する処理部と、記憶部から命令とともに出力される識別情報を受けて、識別情報により指定されるカウンタ部に対してカウント値のカウントアップを指示するカウンタ制御部とを有する。
【発明の効果】
【０００９】
開示の性能プロファイリング装置は、処理部による命令の処理と並行して、カウンタ制御部及びカウンタ部によりプログラムの実行情報の収集を行うことで、本来のプログラムの動作に影響を及ぼすことなく性能プロファイリングを実施することができる。
【図面の簡単な説明】
【００１０】
【図１】第１の実施形態における情報処理システムの構成例を示す図である。
【図２】第１の実施形態におけるメインメモリを説明するための図である。
【図３】第１の実施形態における情報処理システムの構成例を示す図である。
【図４】第２の実施形態における演算処理装置の構成例を示す図である。
【図５】第２の実施形態における演算処理装置の他の構成例を示す図である。
【図６】第３の実施形態における情報処理システムの構成例を示す図である。
【発明を実施するための形態】
【００１１】
以下、本発明の実施形態を図面に基づいて説明する。
【００１２】
（第１の実施形態）
本発明の第１の実施形態について説明する。
図１は、第１の実施形態による性能プロファイリング装置としての情報処理システムの構成例を示す図である。図１に示す情報処理システムは、ＣＰＵ（Central Processing Unit）１１、メインメモリ（主記憶装置）１２Ａ、レジスタ１３、デコーダー１４、イベントセレクタ１５、ＡＮＤゲート（論理積演算回路）１６−ｉ、及びカウンタ＜ｉ＞１７−ｉを有する。なお、ｉは添え字であり、ｉ＝１〜Ｎ（Ｎは任意の自然数）である（以下においても同様）。図１に示す情報処理システムにおいて、例えばＣＰＵ１１、レジスタ１３、デコーダー１４、イベントセレクタ１５、ＡＮＤゲート１６−ｉ、及びカウンタ＜ｉ＞１７−ｉは、演算処理装置として１つのチップ上に形成される。
【００１３】
ＣＰＵ１１は、供給されるクロックＣＬＫを動作クロックとして動作し、メインメモリ１２Ａに格納されているプログラムを読み出して実行する。すなわち、ＣＰＵ１１は、メインメモリ１２ＡにアドレスＡＤを出力することにより、メインメモリ１２Ａから命令を読み出す（フェッチする）。続いて、ＣＰＵ１１は、メインメモリ１２Ａから読み出されてデータＤＴとして供給される命令をデコードし、デコード結果に応じた処理を実行する。ＣＰＵ１１は、命令に従って処理を実行する際、メインメモリ１２Ａに対してデータＤＴの読み出しや書き込みを必要に応じて行う。また、ＣＰＵ１１は、メインメモリ１２Ａから命令を読み出す（フェッチする）ときに信号Ｓ１１をアサートする。
【００１４】
メインメモリ１２Ａには、プログラムの命令を含むデータが記憶される。また、プログラムの命令と同一のワードに、その命令がどのメインルーチンやサブルーチン（関数）のものかを示す識別情報として付加したプログラムＩＤが記憶される。つまり、本実施形態では、１ワード内に、命令を含むデータを記憶するデータ格納領域ＳＴＡと、識別情報として付加されるプログラムＩＤを記憶するプログラムＩＤ格納領域ＳＴＢとを含む。例えば、各ワードにおけるプログラムＩＤ格納領域ＳＴＢは、複数のビットを有する。なお、プログラムＩＤ格納領域ＳＴＢのビット数は、１つのプログラムで実施される可能性があるルーチン（関数）の数に応じて決定すれば良い。
【００１５】
識別情報として付加されるプログラムＩＤは、測定対象のプログラムのソースコードをオブジェクトコードに変換するコンパイル時に、プログラムに含まれるルーチン（関数）毎に付加される。そして、図２に一例を示すように、測定対象のプログラムが実行可能な形式でメインメモリ１２Ａに展開されるときに、プログラムの命令と付加されたプログラムＩＤとがメインメモリ１２Ａに記憶される。図２に示す例では、プログラムＩＤとしてプログラムのメインルーチンに“０１”が割り振られ、メインルーチンから呼び出される関数Ａに“０２”が割り振られ、メインルーチンから呼び出される関数Ｂに“０３”が割り振られている。
【００１６】
ＣＰＵ１１が命令を読み出す（フェッチする）とき、命令とともに同一のワードに記憶されているプログラムＩＤがメインメモリ１２Ａから出力されて、命令がＣＰＵ１１に供給され、プログラムＩＤがレジスタ１３に供給される。このとき、ＣＰＵ１１から出力される信号Ｓ１１がアサートされ、プログラムＩＤがレジスタ１３に保持される。このようにしてレジスタ１３は、ＣＰＵ１１による命令フェッチ時にメインメモリ１２Ａから供給されるプログラムＩＤ（ＩＤＡ）を取り込み、それ以外のときは保持する。したがって、ＣＰＵ１１がメインメモリ１２Ａに対して命令以外のデータを読み出すためのメモリアクセスを行っても、レジスタ１３にはＣＰＵ１１が実行する命令に対応したプログラムＩＤが保持される。また、レジスタ１３は、保持しているプログラムＩＤを出力ＩＤＢとして出力する。
【００１７】
デコーダー１４は、レジスタ１３の出力ＩＤＢ、すなわちレジスタ１３に保持されているプログラムＩＤを受けて、それをデコードする。また、デコーダー１４は、プログラムＩＤのデコード結果を基に、プログラムＩＤにより指定されるカウンタ＜ｉ＞に対してカウントアップを指示するカウント信号Ｃ１１−ｉをアサートする（出力を“１”にする）。例えば、デコーダー１４は、入力されたプログラムＩＤが“０１”であればカウント信号Ｃ１１−１をアサートし、入力されたプログラムＩＤが“０２”であればカウント信号Ｃ１１−２をアサートする。
【００１８】
イベントセレクタ１５は、情報処理システム内で各種イベントが発生したときにカウントアップするか否かを選択する。各ルーチン（関数）の実行時間（実行クロック数）を測定する場合には、イベントセレクタ１５は、出力するカウントイネーブル信号ＣＮＴを常にアサートする（出力を“１”にする）。また、各ルーチン（関数）の実行中におけるイベントの発生回数を測定する場合には、イベントセレクタ１５は、対象のイベントが発生したことを示すイベント検出信号ＥＶＳが入力されたときに、出力するカウントイネーブル信号ＣＮＴをアサートする。例えば、各ルーチン（関数）の実行中におけるキャッシュミスの発生回数を測定する場合には、イベント検出信号ＥＶＳによりキャッシュミスの発生が示されたときに、カウントイネーブル信号ＣＮＴをアサートする。
【００１９】
ＡＮＤゲート１６−ｉ及びカウンタ＜ｉ＞１７−ｉは、各プログラムＩＤに対応させて設ける。ＡＮＤゲート１６−ｉは、デコーダー１４から出力されるカウント信号Ｃ１１−ｉ及びイベントセレクタ１５から出力されるカウントイネーブル信号ＣＮＴが入力される。カウンタ＜ｉ＞１７−ｉは、ＣＰＵ１１の動作クロックと同じクロックＣＬＫで動作し、対応するＡＮＤゲート１６−ｉの出力に応じてカウント動作を行う。カウンタ＜ｉ＞１７−ｉは、対応するＡＮＤゲート１６−ｉの出力がアサートされている（出力が“１”である）とき、クロックＣＬＫの１周期毎にカウント値を１ずつ増加しカウントアップする。
【００２０】
前述の構成により、各ルーチン（関数）の実行時間を測定する場合には、実行しているルーチン（関数）のプログラムＩＤに対応するＡＮＤゲート１６−ｉの出力がアサートされ、それを受けるカウンタ＜ｉ＞１７−ｉのカウント値が、クロックＣＬＫの１周期毎にカウントアップする。すなわち、各カウンタ＜ｉ＞１７−ｉが、対応するルーチン（関数）の実行クロック数をカウントする。これにより、測定対象のプログラムの実行が終了した後に、各カウンタ＜ｉ＞１７−ｉのカウンタ値を読み出すことで、測定対象のプログラムに含まれる各ルーチン（関数）の実行時間が得られる。
【００２１】
また、各ルーチン（関数）の実行中におけるイベントの発生回数を測定する場合には、対象のイベントが発生したときに、実行しているルーチン（関数）のプログラムＩＤに対応するＡＮＤゲート１６−ｉの出力がアサートされ、それを受けるカウンタ＜ｉ＞１７−ｉのカウント値がカウントアップする。すなわち、各カウンタ＜ｉ＞１７−ｉが、対応するルーチン（関数）の実行時におけるイベントの発生回数をカウントする。これにより、測定対象のプログラムの実行が終了した後に、各カウンタ＜ｉ＞１７−ｉのカウンタ値を読み出すことで、測定対象のプログラムに含まれる各ルーチン（関数）でのイベントの発生回数が得られる。
【００２２】
次に、測定対象のプログラムが図２に示したものであって、各ルーチン（関数）の実行時間を測定する場合の動作を一例として説明する。なお、以下の説明では、カウンタ＜１＞１７−１がプログラムＩＤ“０１”に対応し、カウンタ＜２＞１７−２がプログラムＩＤ“０２”に対応し、カウンタ＜３＞１７−３がプログラムＩＤ“０３”に対応するものとする。
【００２３】
まず、ＣＰＵ１１がメインルーチンの先頭アドレスをメインメモリ１２Ａに出力することにより、メインメモリ１２Ａからメインルーチンの最初の命令が読み出され（フェッチされ）、ＣＰＵ１１はその命令に応じた処理を実行する。また、メインメモリ１２Ａからメインルーチンの最初の命令が読み出されるとき、同一のワードに記憶されているメインルーチンのプログラムＩＤもメインメモリ１２Ａから読み出されてレジスタ１３に保持される。
【００２４】
メインルーチンのプログラムＩＤが“０１”であるので、デコーダー１４は、レジスタ１３の出力をデコードすることによりカウンタ＜１＞１７−１を選択して、カウント信号Ｃ１１−１をアサートする。なお、イベントセレクタ１５から出力されるカウントイネーブル信号ＣＮＴは常にアサートされている。したがって、カウンタ＜１＞１７−１は、クロックＣＬＫの１周期毎にカウント値を１ずつ増加させカウントアップする。メインルーチンがＣＰＵ１１上で動作している時、プログラムＩＤは“０１”が出力されるので、カウンタ＜１＞１７−１は、クロックＣＬＫの１周期毎にカウントアップする。
【００２５】
その後、メインルーチンが関数Ａあるいは関数Ｂをコールし、関数Ａあるいは関数ＢがＣＰＵ上で動作し始めると、メインメモリ１２Ａから出力されるプログラムＩＤが変わる。例えば、メインルーチンが関数Ａを呼び出し、メインルーチンから関数Ａに動作が移ると、プログラムＩＤは“０２”が出力される。また、例えば、メインルーチンが関数Ｂを呼び出し、メインルーチンから関数Ｂに動作が移ると、プログラムＩＤは“０３”が出力される。
【００２６】
命令フェッチ時に、メインメモリ１２Ａから出力されるプログラムＩＤがレジスタ１３に取り込まれ、それを基にデコーダー１４がプログラムＩＤに対応するカウンタ＜ｉ＞１７−ｉを選択する。例えば、関数ＡがＣＰＵ１１上で動作している時にはカウンタ＜２＞１７−２が選択され、カウンタ＜２＞１７−２は、クロックＣＬＫの１周期毎にカウント値を１ずつ増加させカウントアップする。また、例えば、関数ＢがＣＰＵ１１上で動作している時にはカウンタ＜３＞１７−３が選択され、カウンタ＜３＞１７−３は、クロックＣＬＫの１周期毎にカウント値を１ずつ増加させカウントアップする。
【００２７】
関数Ａあるいは関数Ｂの処理が終了してメインルーチンに動作が戻ると、再びプログラムＩＤは“０１”が出力される。したがって、カウンタ＜１＞１７−１が選択され、カウンタ＜１＞１７−１は、クロックＣＬＫの１周期毎にカウントアップする。このようにして測定対象のプログラムを実行していき実行が終了した時点で、各カウンタ＜ｉ＞１７−ｉのカウンタ値を読み出せば、各ルーチン（関数）に対応するカウンタのカウンタ値が実行に要したクロック数、すなわち実行時間となる。
【００２８】
第１の実施形態によれば、ＣＰＵ１１で実行しているルーチンを示すプログラムＩＤをＣＰＵ１１とは別の回路に供給し、ＣＰＵ１１での命令の処理と並行してプログラムの実行情報の収集を行うので、本来のプログラムの動作に影響を及ぼすことなく性能プロファイリングを実施することができる。また、ＣＰＵ１１が動作するクロックＣＬＫの１周期毎にどのルーチン（関数）が実行されているかの情報を取得することが可能であり、短いサンプリング間隔でプログラムの実行情報を収集することができ、精度の高い性能プロファイリングが可能になる。
【００２９】
なお、ＤＬＬ（ダイナミック・リンケージ・ライブラリ）等のプログラムの実行時にメインメモリにロードされるものについては、呼び出したルーチンと同一のプログラムＩＤを割り振るか、別のプログラムＩＤを割り振るかを選択できるようにしても良い。このようにすれば、ＤＬＬ等のプログラムの実行時間を測定するか、ＤＬＬ等のプログラムを呼び出したルーチン全体での実行時間を測定するかを選択することが可能になる。
【００３０】
また、図１に示した構成では、識別情報として付加されるプログラムＩＤを記憶するために専用のプログラムＩＤ格納領域ＳＴＢをメインメモリ１２Ａに設けている。しかし、性能プロファイリングを実施するような情報処理システムにおいて、メインメモリは、通常動作でのシステムの信頼度を上げるために、一般にエラー訂正コード（ＥＣＣ）の格納領域を有している。
【００３１】
そこで、図３に示すように、メインメモリ１２Ｂにおいて通常動作時にはエラー訂正コードＥＣＣを記憶する領域を、性能プロファイリングを実施する場合にはプログラムＩＤを記憶するプログラムＩＤ格納領域ＳＴＢとして利用するような構成としても良い。ここで、図３において、図１に示した構成要素と同一の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。
【００３２】
図３に示すようにした場合には、通常動作を行うか、あるいは性能プロファイリングを行うかの情報処理システムの動作モードを、外部からの信号やレジスタ設定等により切り替え可能にする。そして、性能プロファイリングを実施する動作モードでは、ＣＰＵ１１は、エラー訂正コードＥＣＣを用いたエラー訂正を行わないようにする。このようにすることで、プログラムＩＤを記憶するための専用のプログラムＩＤ格納領域ＳＴＢをメインメモリに設ける必要がなく、メインメモリの容量を削減しコストを低減することができる。
【００３３】
（第２の実施形態）
次に、本発明の第２の実施形態について説明する。
図４は、第２の実施形態による性能プロファイリング装置としての演算処理装置の構成例を示す図である。図４（Ａ）に示すように本実施形態における演算処理装置は、ＣＰＵ２１、命令キャッシュメモリ２２Ａ、セレクタ２３、２４、レジスタ２５、デコーダー２６、イベントセレクタ２７、ＡＮＤゲート２８−ｉ、及びカウンタ＜ｉ＞２９−ｉを有する。例えば、図４（Ａ）に示す演算処理装置は、１つのチップ上に形成される。なお、図４（Ａ）には、演算処理装置が有するキャッシュメモリのうち命令キャッシュメモリ２２Ａだけを図示し、データキャッシュメモリについては図示を省略している。
【００３４】
ＣＰＵ２１は、図１に示したＣＰＵ１１に相当し、供給されるクロックＣＬＫを動作クロックとして動作し、命令キャッシュメモリ２２Ａを介して図示しないメインメモリに格納されているプログラムを読み出して実行する。また、ＣＰＵ２１は、命令をフェッチするときに信号Ｓ２１をアサートする。
【００３５】
命令キャッシュメモリ２２Ａは、図示しないメインメモリのデータの一部を記憶するキャッシュメモリであり、メインメモリに記憶されているプログラムの命令の一部を記憶する。図４（Ａ）には、管理される単位（同時にアクセスされる単位）となる１キャッシュラインが４ワードである命令キャッシュメモリ２２Ａを例として示している。本実施形態においては、第１のワード内に、第１のデータ格納領域ＳＴＡ１と第１のプログラムＩＤ格納領域ＳＴＢ１とを含み、第２のワード内に、第２のデータ格納領域ＳＴＡ２と第２のプログラムＩＤ格納領域ＳＴＢ２とを含む。また、第３のワード内に、第３のデータ格納領域ＳＴＡ３と第３のプログラムＩＤ格納領域ＳＴＢ３とを含み、第４のワード内に、第４のデータ格納領域ＳＴＡ４と第４のプログラムＩＤ格納領域ＳＴＢ４とを含む。
【００３６】
図４（Ｂ）に示すように、データ格納領域ＳＴＡ１〜ＳＴＡ４の各々には、命令＜ＤＡＴ１＞〜＜ＤＡＴ４＞が記憶される。また、プログラムＩＤ格納領域ＳＴＢ１〜ＳＴＢ４の各々には、同一のワードに記憶された命令がどのルーチン（関数）のものかを示す識別情報としてのプログラムＩＤ＜ＩＤ１＞〜＜ＩＤ４＞が記憶される。例えば、プログラムＩＤ格納領域ＳＴＢ１〜ＳＴＢ４は、１つのプログラムで実施される可能性があるルーチン（関数）の数に応じてビット数が決められる複数のビットを有する。なお、識別情報として付加されるプログラムＩＤは、前述した第１の実施形態と同様のものである。
【００３７】
セレクタ２３、２４は、命令キャッシュメモリ２２Ａから読み出される１キャッシュライン分のデータを保持する。セレクタ２３は、命令キャッシュメモリ２２Ａから読み出された第１〜第４のワードのデータ格納領域ＳＴＡ１〜ＳＴＡ４にそれぞれ記憶されている命令を、第１〜第４の命令保持部ＲＡ１〜ＲＡ４に保持する。同様に、セレクタ２４は、命令キャッシュメモリ２２Ａから読み出された第１〜第４のワードのプログラムＩＤ格納領域ＳＴＢ１〜ＳＴＢ４にそれぞれ記憶されているプログラムＩＤを、第１〜第４のＩＤ保持部ＲＢ１〜ＲＢ４に保持する。また、セレクタ２３、２４は、保持したデータを、例えばアドレスＡＤの下位部に応じてワード単位で選択して出力する。
【００３８】
ＣＰＵ２１から出力されるアドレスＡＤが命令キャッシュメモリ２２Ａでヒットすると、そのアドレスに対応する１キャッシュライン分のデータが命令キャッシュメモリ２２Ａから読み出される。なお、命令キャッシュメモリ２２ＡにアドレスＡＤに対応するデータがない（キャッシュミス）場合には、図示しないメインメモリへのアクセス等が行われ、アドレスＡＤに対応するデータが命令キャッシュメモリ２２Ａに記憶された後に読み出しが行われる。
【００３９】
命令キャッシュメモリ２２Ａから読み出されたデータのうち、各ワードに記憶されている命令が、セレクタ２３に供給されて第１〜第４の命令保持部ＲＡ１〜ＲＡ４に保持される。また、命令キャッシュメモリ２２Ａから読み出されたデータのうち、各ワードに記憶されているプログラムＩＤが、セレクタ２４に供給されて第１〜第４のプログラムＩＤ保持部ＲＢ１〜ＲＢ４に保持される。１クロックで１つの命令を実行するシングル−イシュのパイプラインをＣＰＵ２１が有する場合には、セレクタ２３の第１〜第４の命令保持部ＲＡ１〜ＲＡ４に保持された４つの命令は、ＣＰＵ２１からの命令フェッチ要求に応じて順次選択されＣＰＵ２１に供給される。
【００４０】
また、セレクタ２３からＣＰＵ２１へ命令が供給されるのに合わせて、その命令に対応する、セレクタ２４の第１〜第４のプログラムＩＤ保持部ＲＢ１〜ＲＢ４に保持されたプログラムＩＤが、セレクタ２４からレジスタ２５に供給される。このとき、ＣＰＵ２１から出力される信号Ｓ２１がアサートされ、プログラムＩＤがレジスタ２５に保持される。このようにしてレジスタ２５は、ＣＰＵ２１による命令フェッチ時に、供給されるプログラムＩＤ（ＩＤＡ）を取り込み、それ以外のときは保持する。
【００４１】
デコーダー２６は、図１に示したデコーダー１４に相当し、レジスタ２５の出力ＩＤＢ、すなわちレジスタ２５に保持されているプログラムＩＤをデコードする。また、デコーダー２６は、プログラムＩＤのデコード結果に応じて、カウンタ＜ｉ＞に対してカウントアップを指示するカウント信号Ｃ２１−ｉをアサートする（出力を“１”にする）。イベントセレクタ２７は、図１に示したイベントセレクタ１５に相当し、カウントイネーブル信号ＣＮＴを出力することで、システム内で各種イベントが発生したときにカウントアップするか否かを選択する。
【００４２】
ＡＮＤゲート２８−ｉ及びカウンタ＜ｉ＞２９−ｉは、各プログラムＩＤに対応させて設ける。ＡＮＤゲート２８−ｉ及びカウンタ＜ｉ＞２９−ｉは、図１に示したＡＮＤゲート１６−ｉ及びカウンタ＜ｉ＞１７−ｉに相当する。ＡＮＤゲート２８−ｉは、デコーダー２６から出力されるカウント信号Ｃ２１−ｉ及びイベントセレクタ２７から出力されるカウントイネーブル信号ＣＮＴが入力される。カウンタ＜ｉ＞２９−ｉは、ＣＰＵ２１の動作クロックと同じクロックＣＬＫで動作し、対応するＡＮＤゲート２８−ｉの出力がアサートされている（出力が“１”である）とき、クロックＣＬＫの１周期毎にカウントアップする。
【００４３】
前述した第１の実施形態と同様に、各ルーチン（関数）の実行時間を測定する場合には、実行しているルーチン（関数）のプログラムＩＤに対応するＡＮＤゲート２８−ｉの出力がアサートされ、カウンタ＜ｉ＞２９−ｉのカウント値が、クロックＣＬＫの１周期毎にカウントアップする。すなわち、各カウンタ＜ｉ＞２９−ｉが、対応するルーチン（関数）の実行クロック数をカウントする。これにより、測定対象のプログラムの実行が終了した後に、各カウンタ＜ｉ＞２９−ｉのカウンタ値を読み出すことで、測定対象のプログラムに含まれる各ルーチン（関数）の実行時間が得られる。
【００４４】
また、各ルーチン（関数）の実行中におけるイベントの発生回数を測定する場合には、対象のイベントが発生したときに、実行しているルーチン（関数）のプログラムＩＤに対応するＡＮＤゲート２８−ｉの出力がアサートされ、カウンタ＜ｉ＞２９−ｉのカウント値がカウントアップする。すなわち、各カウンタ＜ｉ＞２９−ｉが、対応するルーチン（関数）の実行時におけるイベントの発生回数をカウントする。これにより、測定対象のプログラムの実行が終了した後に、各カウンタ＜ｉ＞２９−ｉのカウンタ値を読み出すことで、測定対象のプログラムに含まれる各ルーチン（関数）でのイベントの発生回数が得られる。
【００４５】
第２の実施形態によれば、第１の実施形態と同様にして、本来のプログラムの動作に影響を及ぼすことなく性能プロファイリングを実施することができるとともに、短いサンプリング間隔でプログラムの実行情報を収集することが可能になる。
【００４６】
ここで、演算処理装置外部のメインメモリに測定対象のプログラムを実行可能な形式で展開する際、メインメモリの連続する領域にプログラムの命令を記憶させるのが一般的である。そのため、メインメモリにおいて命令キャッシュメモリ２２Ａに読み出される１キャッシュライン単位では、異なるルーチン（関数）の命令が記憶されることはほとんどなく、通常は同じルーチン（関数）の命令が記憶されている。したがって、命令キャッシュメモリにおいて、図４に示したようにキャッシュラインの各ワード毎にプログラムＩＤを記憶しなくとも、図５に示すようにキャッシュライン毎にプログラムＩＤを記憶するようにしても良い。こうすることで、命令キャッシュメモリの容量を削減しコストの低減を図ることができるとともに、良好な精度での性能プロファイリングが可能である。
【００４７】
図５（Ａ）は、第２の実施形態による性能プロファイリング装置としての演算処理装置の他の構成例を示す図である。図５（Ａ）において、図４（Ａ）に示した構成要素と同一の機能を有する構成要素には同一の符号を付し、重複する説明は省略する。図５（Ａ）に示す演算処理装置の命令キャッシュメモリ２２Ｂは、メインメモリに記憶されているプログラムの命令の一部を記憶する。図５（Ａ）においても、管理される単位となる１キャッシュラインが４ワードである命令キャッシュメモリ２２Ｂを例として示している。
【００４８】
命令キャッシュメモリ２２Ｂは、１キャッシュライン内に、第１〜第４のデータ格納領域ＳＴＡ１〜ＳＴＡ４と１つのプログラムＩＤ格納領域ＳＴＢとを含む。図５（Ｂ）に示すように、データ格納領域ＳＴＡ１〜ＳＴＡ４の各々には、命令＜ＤＡＴ１＞〜＜ＤＡＴ４＞が記憶され、プログラムＩＤ格納領域ＳＴＢには、命令＜ＤＡＴ１＞〜＜ＤＡＴ４＞がどのルーチン（関数）のものかを示すプログラムＩＤ＜ＩＤ＞が記憶される。
【００４９】
また、図５に示す演算処理装置では、ＣＰＵ２１は、アドレスＡＤに応じたデータを命令キャッシュメモリ２２Ｂから読み出すときに、レジスタ２５に出力する信号Ｓ３１をアサートする。これによりレジスタ２５は、アドレスＡＤに応じたデータが命令キャッシュメモリ２２Ｂから読み出されるときに、命令キャッシュメモリ２２Ｂから供給されるプログラムＩＤ（ＩＤＡ）を取り込んで保持する。
【００５０】
（第３の実施形態）
次に、本発明の第３の実施形態について説明する。
図６は、第３の実施形態による性能プロファイリング装置としての情報処理システムの構成例を示す図である。第３の実施形態における情報処理システムは、複数の演算処理装置を有する、いわゆるマルチＣＰＵのシステムである。図６には、メインメモリ６６が各演算処理装置に共有されたＳＭＰ（Symmetric Multiple Processor）方式の例を示している。なお、図６においては、演算処理装置の内部構成を簡略化して図示しているが、演算処理装置の各々は、例えば図４（Ａ）又は図５（Ａ）に示した演算処理装置である。
【００５１】
第１の演算処理装置は、ＣＰＵ−Ａ６１Ａ、命令キャッシュメモリＡ６２Ａ、レジスタＡ６３Ａ、デコーダーＡ６４Ａ、及びカウンタＡ＜ｉ＞６５Ａ−ｉを含む。ＣＰＵ−Ａ６１Ａ、命令キャッシュメモリＡ６２Ａ、レジスタＡ６３Ａ、デコーダーＡ６４Ａ、及びカウンタＡ＜ｉ＞６５Ａ−ｉは、図４（Ａ）（又は図５（Ａ））に示したＣＰＵ２１、命令キャッシュメモリ２２Ａ（又は２２Ｂ）、レジスタ２５、デコーダー２６、及びカウンタ＜ｉ＞２９−ｉにそれぞれ相当する。
【００５２】
また、第２の演算処理装置は、ＣＰＵ−Ｂ６１Ｂ、命令キャッシュメモリＢ６２Ｂ、レジスタＢ６３Ｂ、デコーダーＢ６４Ｂ、及びカウンタＢ＜ｉ＞６５Ｂ−ｉを含む。ＣＰＵ−Ｂ６１Ｂ、命令キャッシュメモリＢ６２Ｂ、レジスタＢ６３Ｂ、デコーダーＢ６４Ｂ、及びカウンタＢ＜ｉ＞６５Ｂ−ｉは、図４（Ａ）（又は図５（Ａ））に示したＣＰＵ２１、命令キャッシュメモリ２２Ａ（又は２２Ｂ）、レジスタ２５、デコーダー２６、及びカウンタ＜ｉ＞２９−ｉにそれぞれ相当する。
【００５３】
演算処理装置の各々は、アドレスバス及びデータバスを介して、演算処理装置外部のメインメモリ６６にアクセス可能となっている。なお、図６において、ＡＤはＣＰＵから出力されるアドレスであり、ＤＴはＣＰＵとキャッシュメモリとの間で入出力されるデータである。また、ＩＤＡは命令キャッシュメモリから読み出されたプログラムＩＤであり、ＣＬＫはクロックである。
【００５４】
第１の演算処理装置のＣＰＵ−Ａ６１Ａと第２の演算処理装置のＣＰＵ−Ｂ６１Ｂとでマルチスレッドプログラムを実行する場合を例に説明する。例えば、まずＣＰＵ−Ａ６１Ａが、メインメモリ６６に実行可能な形式で展開されている、固有のプログラムＩＤを持つ測定対象のプログラムの実行を開始すると、命令キャッシュメモリＡ６２Ａにメインメモリ６６からプログラムを転送して逐次実行する。このプログラムの実行途中でマルチスレッド化しているプログラムであれば、新たなプロセスあるいはスレッドが生成される。例えば、プロセスを生成する場合では、生成されたプロセスは元のプロセスのコピーとしてメモリに記憶される。このとき、元のプロセスに割り振られているプログラムＩＤと同一のプログラムＩＤを生成されたプロセスに対して割り振るようにする。
【００５５】
そして、それぞれの演算処理装置にてプログラム（プロセス、スレッド）を実行し、プログラムの実行情報を収集する。測定対象のプログラムの実行が終了した後、同じプログラムＩＤに対応するカウンタＡ＜ｉ＞６５Ａ−ｉ、カウンタＢ＜ｉ＞６５Ｂ−ｉのカウンタ値を読み出して加算する。これにより、測定対象のプログラムに含まれる各ルーチン（関数）の実行時間、又は測定対象のプログラムに含まれる各ルーチン（関数）でのイベントの発生回数を得ることができる。
【００５６】
なお、前記実施形態は、何れも本発明を実施するにあたっての具体化のほんの一例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、またはその主要な特徴から逸脱することなく、様々な形で実施することができる。
本発明の諸態様を付記として以下に示す。
【００５７】
（付記１）
測定対象のプログラムに含まれるルーチンに対応して設けた複数のカウンタ部と、
前記プログラムの命令と、当該命令が含まれる前記プログラムのルーチンを示す識別情報とを組にして記憶する記憶部と、
前記記憶部から前記命令を読み出し、当該命令に応じた処理を実行する処理部と、
前記処理部が命令を読み出すことによって前記記憶部から前記命令とともに出力される当該命令の識別情報を受けて、当該識別情報により指定される前記カウンタ部に対してカウント値のカウントアップを指示するカウンタ制御部とを有することを特徴とする性能プロファイリング装置。
（付記２）
前記カウンタ制御部は、
前記記憶部から出力される前記識別情報を所定のタイミングで取り込んで保持するレジスタと、
前記レジスタに保持された前記識別情報をデコードし、デコード結果に基づいて前記カウンタ部に対するカウントアップの指示を出力する出力部とを有することを特徴とする付記１記載の性能プロファイリング装置。
（付記３）
前記カウンタ制御部は、前記識別情報により指定される前記カウンタ部に対して、クロックの１周期毎にカウントアップするよう指示することを特徴とする付記１記載の性能プロファイリング装置。
（付記４）
前記カウンタ制御部は、前記識別情報により指定される前記カウンタ部に対して、対象のイベントが発生したときにカウントアップするよう指示することを特徴とする付記１記載の性能プロファイリング装置。
（付記５）
前記記憶部は、前記複数のカウンタ部と前記処理部と前記カウンタ制御部とを含む演算処理装置外部のメモリであることを特徴とする付記１記載の性能プロファイリング装置。
（付記６）
前記プログラムの命令と同一のワードに当該命令の識別情報を記憶することを特徴とする付記５記載の性能プロファイリング装置。
（付記７）
前記記憶部は、データを記憶する第１の領域と通常動作時に前記データのエラー訂正コードが記憶される第２の領域とを有し、
前記プログラムの性能測定時には、前記第２の領域に前記命令の識別情報を記憶することを特徴とする付記５記載の性能プロファイリング装置。
（付記８）
前記記憶部は、前記複数のカウンタ部と前記処理部と前記カウンタ制御部とを含む演算処理装置外部のメモリに記憶されているデータの一部を記憶する、前記演算処理装置内部のキャッシュメモリであることを特徴とする付記１記載の性能プロファイリング装置。
（付記９）
前記キャッシュメモリにおいて、同時にアクセスされる１キャッシュラインが複数のワードを有し、
前記プログラムの命令と同一のワードに当該命令の識別情報を記憶することを特徴とする付記８記載の性能プロファイリング装置。
（付記１０）
前記キャッシュメモリにおいて、同時にアクセスされる１キャッシュラインが複数のワードを有し、
前記１キャッシュライン毎に前記命令の識別情報の１つを記憶することを特徴とする付記８記載の性能プロファイリング装置。
（付記１１）
測定対象のプログラムに含まれるルーチンに対応して設けた複数のカウンタ部、及び前記プログラムの命令と、当該命令が含まれる前記プログラムのルーチンを示す識別情報とを組にして記憶する記憶部とを有する性能プロファイリング装置の性能プロファイリング方法であって、
前記性能プロファイリング装置が有する処理部が、前記記憶部から前記命令を読み出し、当該命令に応じた処理を実行し、
前記性能プロファイリング装置が有するカウンタ制御部が、前記処理部が命令を読み出すことによって前記記憶部から前記命令とともに出力される当該命令の識別情報を受けて、当該識別情報により指定される前記カウンタ部に対してカウント値のカウントアップを指示することを特徴とする性能プロファイリング方法。
【符号の説明】
【００５８】
１１、２１  ＣＰＵ
１２Ａ  メインメモリ
１３、２５  レジスタ
１４、２６  デコーダー
１５、２７  イベントセレクタ
１６、２８  ＡＮＤゲート
１７、２９  カウンタ
２２Ａ、２２Ｂ  命令キャッシュメモリ
２３、２４  セレクタ
ＳＴＡ  データ格納領域
ＳＴＢ  プログラムＩＤ格納領域
【図１】
2014182478.tif 000003
【図２】
2014182478.tif 000004
【図３】
2014182478.tif 000005
【図４】
2014182478.tif 000006
【図５】
2014182478.tif 000007
【図６】
2014182478.tif 000008