(57)【要約】【課題】  コンパイラのオプション指定のみで利用できるｐｒｏｆと同様の利用インタフェースでありながら並列処理に対応したテキストレベルで利用可能な機能を提供する。【解決手段】  プログラム実行時に並列実行する複数のスレッドの識別情報を取得し、当該識別情報に対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理し、前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得し、この取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する。【選択図】  図１
2005242879.tif 000002
【特許請求の範囲】
【請求項１】
ＯＳまたはハードウェアが提供する機能を用いて実行するプログラムの性能情報を取得する手段を備えた性能情報取得装置において、
プログラム実行時に並列実行する複数のスレッドの識別情報を取得し、当該識別情報に対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理する管理情報記録手段を備え、
前記性能情報を取得する手段は、
前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得する手段と、
このそれぞれ取得する手段の取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する手段と
を備えたことを特徴とする性能情報取得装置。
【請求項２】
性能情報取得対象となるプログラムをコンパイルする際に、
並列実行指定のオプションの有無を検索するステップと、
並列実行指定のオプションがあるときには、並列用のライブラリをリンクするオプションを追加するステップと、
これらのステップにより得られたオプションを最終的なオプションとして生成してコンパイルおよびリンク処理を行うステップと
を実行することを特徴とするプログラムの性能情報取得方法。
【請求項３】
情報処理装置にインストールすることにより、その情報処理装置に、
ＯＳまたはハードウェアが提供する機能を用いて実行するプログラムの性能情報を取得する機能を備えた性能情報取得装置に相応する機能を実現させる制御プログラムにおいて、
プログラム実行時に並列実行する複数のスレッドの識別情報を取得し、当該識別情報に対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理する管理情報記録機能を実現させ、
前記性能情報を取得する機能として、
前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得する機能と、
このそれぞれ取得する機能の取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する機能と
を実現させることを特徴とする制御プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの性能情報を取得する技術に関する。特に、複数のスレッドが並行実行されているプログラムに利用する。
【背景技術】
【０００２】
従来の性能情報取得方法の一例として、Ｌｉｎｕｘ上で一般に利用されているｐｒｏｆがある。これは、プログラムの実行で各関数の処理に要した時間を測定して、その結果をテキストベースで表示する機能を備えており、逐次プログラムのチューニングなどで有効である。利用方法は、プログラムをコンパイルする際にオプションを指定するのみであり、その結果がテキストファイルとして出力されるために利用し易い。しかし、並列処理に対応していないため、スレッド単位の実行状況を表示することができない。
【０００３】
テキストベースで動作する機能を提供する他の例では、ライブラリとして提供され、その機能を利用する場合にはプログラム中にライブラリ呼び出しを挿入してコンパイルするものがあるが、これも並列処理に対応していない。ライブラリとして提供しているものは、コンパイラとは別に開発することができ、コンパイラの変更は必要としないが、プログラムの修正が必要であるという点で利用者に負担が必要となっている。
【特許文献１】特開平８−１４７１９９号公報
【特許文献２】特開平９−２３７２０３号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
このように、従来のライブラリは、性能情報を取得する処理においてスレッドに対する考慮がされていないため、並列実行した各スレッドの性能情報を取得することができなかった。並列処理に対応した性能情報を表示するものとして、コンパイラと分離されたツールはあるが、逐次処理で利用できるテキストベースの機能とは異なるものであった。
【０００５】
特許文献１によれば、情報取得の命令をプログラムに追加せずに、動的ライブラリの実行回数と時間とを取得する装置が開示されている。この実現のために、その構成においてカーネルにフラグを用意し、それを利用して実行時にリンクをライブラリに変更したり、一定の時間毎に情報取得するモジュールを起動している。発明の効果としては、プログラムの再コンパイル（翻訳）と再リンク（結合）を行わず、通常のロードモジュールのまま実行情報の取得を可能にすることが挙げられている。
【０００６】
しかし、特許文献１によれば、カーネルに用意するフラグや測定監視処理手段が必要になり、さらに、実行時にカーネルのフラグの値による実行情報取得を制御する仕組みや動的リンカのテーブル書き換え操作に関する手段が必要になり複雑である。
【０００７】
また、特許文献２によれば、スレッドの性能を測定するシステムが開示されている。その構成では、各スレッドのデータについて、親と子のスレッドに関連したエリアを用意して、それらにデータを記録していくことを特徴としている。このときに、スレッドの親子関係を記憶する並列サポートレイヤの延長部分を利用している。効果としては、親スレッドを識別する仕組みである並列サポートレイヤを用いて、データを保持する複数のメモリセルを決定して並列プロファイラの機能を提供していることが挙げられている。
【０００８】
しかし、特許文献２によれば、スレッドの親子関係を記憶し、それを用いてデータを保持するメモリセルを用意し、データを複数のメモリセルに保存する必要があり、特殊なハードウェア構成を必要とする。
【０００９】
本発明は、このような背景に行われたものであって、コンパイラのオプション指定のみで利用できるｐｒｏｆと同様の利用インタフェースでありながら並列処理に対応したテキストレベルで利用可能な機能を提供することを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、ＯｐｅｎＭＰなどスレッドを利用した並列実行において、各スレッドの性能情報を実行時情報として取得し、それらを用いてプログラム全体の性能情報を生成し、スレッドの性能情報と共に利用者に提供することを可能にすることを特徴とする。
【００１１】
同じライブラリ呼び出しインタフェースを持ち、かつスレッドによる並列実行に対応した並列実行用性能情報取得ライブラリを用意する。ライブラリ呼び出しインタフェースが同じため、性能情報を取得する際に行うコンパイラのコード挿入処理は、従来の逐次処理の処理と互換性を保っている。
【００１２】
次に、コンパイル時に指定されたオプションを解析して、並列実行オプションが指定された場合に並列実行用のライブラリをリンクし、それ以外の場合は従来のライブラリをリンクするようにリンクオプションを生成する。
【００１３】
並列実行に対応したライブラリのインタフェースは、引数を含めて従来のライブラリと同じであるが、実行時に各スレッドに対応して性能情報を扱う必要がある。このため、実行時にスレッド識別情報（以下、ＩＤと記す）を取得し、これと引数として渡されてくる通常は関数名である識別子から、管理情報に問い合わせて、対応したスレッドの性能情報を更新する。
【００１４】
そして、プログラム実行終了時には、各スレッドの性能情報から、プログラム全体の性能情報を計算し、スレッドの性能情報と合わせて出力する。
【００１５】
また、本発明は、特許文献１に開示された技術のように、カーネルに用意するフラグや測定監視設定手段および実行時にカーネルのフラグの値による実行情報取得を制御する仕組み、動的リンカのテーブルー部クレームの書き換え操作に関する手段は必要ない利点がある。
【００１６】
本発明では、スレッドを用いたＯｐｅｎＭＰなどのプログラムで、スレッド毎の性能情報を利用者に提供できること、および逐次実行とスレッドを用いた並列実行とで同じ関数インタフェースを採用することにより、ユーザがプログラム中に挿入したライブラリを並列実行でそのまま利用可能とすることができる。
【００１７】
また、本発明は、特許文献２に開示された技術のように、スレッドの親子関係を記憶し、それを用いてデータを保持するメモリセルを決定することがなく、よって、データを複数のメモリセルに保存する必要もない利点がある。
【００１８】
本発明では、逐次実行とスレッドによる並列実行とで同じライブラリインタフェースを用いることができる。
【００１９】
すなわち、本発明の第一の観点は、ＯＳまたはハードウェアが提供する機能を用いて実行するプログラムの性能情報を取得する手段を備えた性能情報取得装置であって、本発明の特徴とするところは、プログラム実行時に並列実行する複数のスレッドのＩＤを取得し、当該ＩＤに対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理する管理情報記録手段を備え、前記性能情報を取得する手段は、前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得する手段と、このそれぞれ取得する手段の取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する手段とを備えたところにある。
【００２０】
本発明の第二の観点は、性能情報取得方法であって、本発明の特徴とするところは、性能情報取得対象となるプログラムをコンパイルする際に、並列実行指定のオプションの有無を検索するステップと、並列実行指定のオプションがあるときには、並列用のライブラリをリンクするオプションを追加するステップと、これらのステップにより得られたオプションを最終的なオプションとして生成してコンパイルおよびリンク処理を行うステップとを実行するところにある。
【００２１】
本発明の第三の観点は、情報処理装置にインストールすることにより、その情報処理装置に、ＯＳまたはハードウェアが提供する機能を用いて実行するプログラムの性能情報を取得する機能を備えた性能情報取得装置に相応する機能を実現させる制御プログラムであって、本発明の特徴とするところは、プログラム実行時に並列実行する複数のスレッドのＩＤを取得し、当該ＩＤに対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理する管理情報記録機能を実現させ、前記性能情報を取得する機能として、前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得する機能と、このそれぞれ取得する機能の取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する機能とを実現させるところにある。
【００２２】
本発明の制御プログラムは本発明の記録媒体に記録されることにより、前記情報処理装置は、この記録媒体を用いて本発明の制御プログラムをインストールすることができる。あるいは、本発明の制御プログラムを保持するサーバからネットワークを介して直接前記情報処理装置に本発明の制御プログラムをインストールすることもできる。
【００２３】
これにより、汎用の情報処理装置を用いて、スレッドを用いたＯｐｅｎＭＰなどの並列実行におけるプログラムの性能情報をスレッド単位に得ることができ、また、スレッド並列実行でも同じインタフェースで性能情報を得ることができる性能情報取得装置を実現することができる。
【発明の効果】
【００２４】
第一の効果は、スレッドを用いたＯｐｅｎＭＰなどの並列実行におけるプログラムの性能情報をスレッド単位に得ることができることにある。その理由は、ライブラリがスレッドを考慮した処理を行うためである。
【００２５】
第二の効果は、スレッド並列実行でも同じインタフェースで性能情報を得ることが可能であることにある。その理由は、並列実行を指定されたときにコンパイラがリンクするライブラリを切り替えることで、同じインタフェースで並列実行に対応したライブラリをリンクしているためである。
【発明を実施するための最良の形態】
【００２６】
本発明実施例の性能情報取得装置の構成を図１を参照して説明する。図１は本実施例の性能情報取得装置のブロック構成図である。
【００２７】
本実施例は、図１に示すように、ＯＳまたはハードウェアが提供する機能を用いて実行するプログラムの性能情報を取得する性能情報取得部１を備えた性能情報取得装置であって、本実施例の特徴とするところは、プログラム実行時に並列実行する複数のスレッドのＩＤを取得し、当該ＩＤに対応する当該スレッドの実行時間情報を含む固有データへアクセスするためのポインタを管理する記憶部３を備え、性能情報取得部１は、前記ポインタに基づき複数の前記スレッドにアクセスして前記実行時間情報を前記スレッド毎の性能情報としてそれぞれ取得する手段と、このそれぞれ取得する手段の取得結果を集計し、プログラム全体の性能情報と共に前記スレッド毎の性能情報をそれぞれ出力する手段とを備えたところにある。
【００２８】
本発明実施例の性能情報取得方法を図３を参照して説明する。図３は本実施例のオプション生成の手順を示すフローチャートである。
【００２９】
本実施例は、図３に示すように、性能情報取得対象となるプログラムをコンパイルする際に、並列実行指定のオプションの有無を検索するステップ（Ａ１）と、並列実行指定のオプションがあるときには、並列用のライブラリをリンクするオプションを追加するステップ（Ａ４）と、これらのステップにより得られたオプションを最終的なオプションとして生成してコンパイルおよびリンク処理を行うステップ（Ａ６）とを実行することを特徴とする。
【００３０】
本発明は、汎用の情報処理装置にインストールすることにより、その情報処理装置に本発明の性能情報取得装置に相応する機能を実現させる制御プログラムとして実現することができる。この制御プログラムは、記録媒体に記録されて情報処理装置にインストールされ、あるいは通信回線を介して情報処理装置にインストールされることにより当該情報処理装置に、性能情報取得部１、処理部２、記憶部３にそれぞれ相応する機能を実現させることができる。
【００３１】
以下では、本実施例をさらに詳細に説明する。
【００３２】
（実施例の構成）
図１を参照すると、本実施例の性能情報取得装置は、性能情報取得部１、処理部２、記憶部３を含む。性能情報取得部１は、ＯＳやハードウェアが提供する機能を用いて実行しているプログラムの性能情報を取得する。処理部２は、実行時にスレッドＩＤを取得し、それとライブラリ呼び出しの引数および記憶部３に含まれる管理情報３１を用いて、性能情報３２および管理情報３１の更新を行う。記憶部３は、管理情報３１と性能情報３２とを含む。
【００３３】
管理情報３１は、各スレッドで実行している関数やスレッドの性能情報へアクセスするためのポインタなどの対応を管理する情報を保持する。管理情報３１と性能情報３２は、図２に示すようにスレッドに共通のデータ１１と各スレッドの性能情報３２とを含む。
【００３４】
（実施例の動作）
次に、図１〜図５を参照して本発明の実施例の動作について詳細に説明する。
【００３５】
性能情報を取得したいプログラムがある場合に、最初にそのプログラムを、通常の処理と同様にコンパイルする（図５のステップＦ１）。このときにオプションとして、性能情報を参照するためのコンパイルオプションを指定することで、従来と同様にコンパイラによるライブラリ呼び出しの挿入処理やライブラリのリンクが行われる。これで生成された実行オブジェクトを計算機上で実行（ステップＦ２）することで、求める性能情報を得ることができる（ステップＦ３）。
【００３６】
ここで、最初にコンパイルをする際に、本手法は図３に示す手順により並列実行オプションの指定の有無でリンクするライブラリを切り替えている。その手順は、まず指定されたオプションを検索する（図３のステップＡ１）。そして、そこに性能情報を取得する機能を有効にするオプションの有無をチェックする（ステップＡ２）。この指定がなければ、指定されたままのオプションを出力とする（ステップＡ６）。性能情報取得の指定がある場合には、さらに並列実行のオプションの有無を調べる（ステップＡ３）。並列実行の指定がある場合には、並列用のライブラリをリンクするオプションを追加して（ステップＡ４）、指定がなければ従来の逐次用ライブラリをリンクするオプションを追加する（ステップＡ５）。以上の処理で得られたオプションを最終的なオプションとして生成し（ステップＡ６）、コンパイルおよびリンク処理を行う。
【００３７】
性能情報を取得するオプションが指定された場合には、コンパイラでは本来の手続きの処理（図４のＢ２）の前後に性能情報を取得するためのライブラリ呼び出し（Ｂ１とＢ３）を挿入して、新たな手続き（Ｂ４）として実行オブジェクトを生成する。
【００３８】
生成された実行オブジェクトの実行では、コンパイラにより挿入されたライブラリ呼び出し、またはユーザが指定したライブラリ呼び出しにより性能情報が取得される。コンパイラにより挿入されたライブラリ呼び出しは、その呼び出しを含む関数名が引数となっており、これを識別子として性能情報が記録される。性能情報を記録する機能は、図１に示す性能情報取得部１、処理部２、および記憶部３で構成される。さらに記憶部３には、管理情報３１と性能情報３２とが含まれる。
【００３９】
この機能は、関数のはじめに呼ばれた場合は以下のように動作する。ライブラリが呼び出されると、処理部２はまず最初に性能情報取得部１から性能情報を取得して記録しておき、ライブラリを呼び出したスレッドＩＤを調べる。ここで、メイン関数などライブラリがそのスレッドで最初に呼び出された場合には、関連データの初期化処理を行う。それ以外の場合には、スレッドＩＤと管理情報３１から、引数で渡された関数を呼び出す前に実行していた関数を調べる。この情報は、スレッド固有データ１２に記録されている。そして、最初に記録した性能情報とこの関数を呼び出した関数およびスレッドＩＤから、そのスレッドにおける関数の性能情報を計算して更新する。その後、管理情報３１にあるスレッドが現在処理している関数に関する情報を、ライブラリの引数で渡された関数名で更新する。この更新はスタックのプッシュ操作で行う。最後に、ライブラリにおける処理時間をプログラムの実行時間に含めないため、再び性能情報を取得し、現在の関数の実行開始情報として記録する。
【００４０】
関数の終りで呼ばれた場合には、以下のような動作となる。ライブラリが呼び出されると、開始時点での処理と同様に性能情報やスレッドＩＤを取得する。そして、管理情報３１に記録されている性能情報とライブラリ呼び出しの最初に記録した性能情報とから、新たな性能情報を計算して更新する。その後、現在の処理している関数を呼び出した関数に戻すため、スタックのポップ操作を行う。その結果、現在の関数を呼び出した関数が現在処理している関数となるので、それに対して再び取得した性能情報を実行開始情報として記録する。
【００４１】
以上の手順で記録された各スレッドの性能情報は、プログラム実行終了時に呼び出すように登録されたライブラリ呼び出しで、プログラム全体の性能情報を計算する際に利用される。各スレッドの性能情報は、スレッドの共通データ領域１１から全て参照することができるため、プログラム実行終了時に全てをアクセスすることが可能である。そして、この計算終了後、プログラム全体の性能情報と各スレッドの性能情報とを出力する。
【００４２】
次に、本発明の実施例の効果について説明する。
【００４３】
本発明の実施例で説明したとおり、性能情報を取得し、記録管理する部分がスレッドを考慮しているため、各スレッドの性能情報を記録し、それをプログラム実行後に表示することが可能になっている。また、コンパイラがオプションによってリンクするライブラリを切り替えるため、ライブラリのインタフェースは、並列実行に対応したものも従来と同じである。これによって、ユーザは明示的にプログラム中にライブラリ呼び出しを挿入して性能情報を得る場合でも、逐次実行と並列実行とで修正する必要がなくなる。さらに、コンパイラのオプションも新たなものは追加されておらず、この点でも修正は必要ない。
【産業上の利用可能性】
【００４４】
本発明は、コンパイラのオプション指定のみで利用できるｐｒｏｆと同様の利用インタフェースでありながら並列処理に対応したテキストレベルで利用可能であることから、プログラムの研究開発に広く利用することができる。
【図面の簡単な説明】
【００４５】
【図１】本実施例の性能情報取得装置のブロック構成図。
【図２】本実施例の共通データ領域とスレッド固有データとの関係を示す図。
【図３】本実施例のオプション生成の手順を示すフローチャート。
【図４】本実施例の手続きの性能情報記録開始処理および記録終了処理の手順を示すフローチャート。
【図５】本実施例のコンパイルの手順を示すフローチャート。
【符号の説明】
【００４６】
１  性能情報取得部
２  処理部
３  記憶部
１１  共通データ領域
１２  スレッド固有データ
３１  管理情報
３２  性能情報
Ａ１〜Ａ６、Ｂ１〜Ｂ４、Ｆ１〜Ｆ３  ステップ
【図１】
2005242879.tif 000003
【図２】
2005242879.tif 000004
【図３】
2005242879.tif 000005
【図４】
2005242879.tif 000006
【図５】
2005242879.tif 000007