(57)【特許請求の範囲】
【請求項１】
計算機が，計算機プログラムの実行コストを解析する解析方法において，
ソースプログラムを翻訳して得られる実行形式プログラムにソースプログラムの文番号とプログラムの先頭アドレスからの相対アドレスを保持する文番号テーブルと，ループ処理および配列演算処理のプログラム文の文番号を保持するループ情報テーブルとを作成し，
実行中の実行形式プログラムに一定時間間隔毎に割り込みを行ない実行中のプログラム文の該割り込みをしたときのアドレスを求め，該アドレスとプログラムを保持する領域の先頭アドレスとの相対アドレスを求め，該相対アドレスに基づいて文番号テーブルを参照して実行中のプログラム文の文番号を求め，該文番号に基づいてループ情報テーブルを参照してプログラム文の種類を求め，
前記割り込みの全体の回数に対する，割り込み毎の処理がループ処理であった回数および配列演算であった回数の割合を求めることにより実行コストを算出し，出力することを特徴とする計算機プログラムの実行コストの解析方法。
【請求項２】
メインプログラムおよびサブルーチンの双方において該文番号テーブルおよびループ情報テーブルを備え，サブルーチンの実行中に該割り込みを行った場合には，実行中のサブルーチンの先頭アドレスを退避する退避レジスタにより該サブルーチンの先頭アドレスを求めることを特徴とする請求項１に記載の計算機プログラムの実行コストの解析方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は計算機プログラムの実行コストの解析方法に関するものである。特に，計算プログラムにおけるループ処理，配列演算のコストを算出する方法に関するものである。
【０００２】
科学技術計算の分野のプログラムでは，多数の配列（ベクトル，行列）が使用され，その配列データに対する値の設定もしくは参照が多く行われる。通常，この設定，参照はループ（繰り返し処理）や配列演算で行われ，プログラム実行時間の多くがこの処理に費やされる。そのため，プログラムをチューニング（最適化）する際には，このループや配列演算に着目してチューニングすることが多い。この計算機プログラムの解析は性能解析プログラムにより行われる。
【０００３】
【従来の技術】
従来の性能解析プログラムは被測定プログラム（ソースプログラム）の実行中にそのプログラムのサブルーチン等のルーチン単位で実行回数を測定し，実行コストを求めて出力していた。
【０００４】
図９ (a)， (b)は従来の計算機プログラムの実行コストの測定方法を示す図である。
図９ (a)， (b)において，
１１０はソースプログラムであって，メインプログラム（プログラム名がメイン）とサブルーチン（サブルーチンＡ（１１１）等）を持つものである。
【０００５】
１１１は，サブルーチンＡである。
１１２はアドレスレジスタであって，サブルーチンＡ（１１１）の先頭アドレスを保持するものである。
【０００６】
１１４はサブルーチンＡの退避領域であって，サブルーチンＡ（１１１）が実行される時にそのオリジナルなプログラムを一時退避（複写）する領域である。
１１５は退避レジスタであって，サブルーチンＡ（１１１）が実行される時にその先頭アドレスを一時退避して保持するレジスタである。
【０００７】
１２０は性能解析プログラムであって，ソースプログラム１１０の実行コストを測定するものである。
１２１は測定データ抽出部であって，実行中のソースプログラム１１０に対して一定時間間隔の割り込みの処理をするものである。
【０００８】
１２２はルーチン判定部であって，割り込みをした時に処理をしているルーチンの名称を判定するものである。
１２３とコスト算出部であって，プログラムの実行コストを算出するものである。
【０００９】
１２４は出力データ作成部であって，測定データに対して表示出力，印刷出力する形式のデータを作成するものである。
１２５は出力部であって，測定値を表示出力，印刷出力するものである。
【００１０】
１３０は出力の例であって，ルーチン名と測定回数を出力したものである。
図９の構成の動作を説明する。
サブルーチンＡ（１１１）の先頭アドレスはアドレスレジスタ１１２に保持されている。ソースプログラム１１０のメインプログラム（メイン）の処理でサプルーチンＡ（１１１）が呼び出された時，サブルーチンＡ（１１１）の内容および先頭アドレスはそれぞれ退避領域１１４および退避レジスタ１１５に退避（複写）される。その後に，サブルーチンＡ（１１１）でプログラムの処理がなされ，その実行が終了して，メインプログラムに処理が戻ると，退避領域１１４および退避レジスタ１１５の内容がサブルーチンＡ（１１１）の元の領域およびアドレスレジスタ１１２に戻される。
【００１１】
性能解析プログラム１２０の測定データ抽出部１２１はソースプログラム１１０に対して割り込みをする（(1) ，(2) ）。そして，ルーチン判定部１２２はその時に実行されているプログラムの先頭アドレスを求め，処理されているプログラムがメインプログラム（割り込みのタイミングが(1) の時）であるのか，あるいはサブルーチンＡであるのか（割り込みのタイミングが(2) の時）を判定する。(2) のタイミングのようにサブルーチンＡ（１１１）が実行されている場合には退避レジスタ１１５のアドレスからサブルーチンＡ（１１１）が実行中であることを判定する。測定データ抽出部１２１は，一定の時間間隔（例えば，１秒おき等）でソースプログラム１１０に割り込みによりその内容（アドレス等）を参照する。
【００１２】
コスト算出部１２３はこのようにして割り込みした時の実行中のプログラムのルーチン名を求め，その名称毎に測定回数を求める。そして，出力部１２５は測定されたメインプログラムの実行回数，サブルーチンの実行回数を表示出力する形式のデータを作成し，表示装置，印刷装置等に出力する。
【００１３】
図９ (b)はコストの測定結果の表示の例である。
メインプログラムの実行回数，サブルーチン毎の実行回数を出力する。
【００１４】
【発明が解決しようとする課題】
従来の性能解析プログラムによるコストの測定は，サブルーチン単位で，測定結果を表示していたので，処理の内容（ループ処理，配列演算処理等）を把握することができなかった。プログラムの実行において，ループ処理，配列演算が最もコストが高く，ループ処理，配列演算を最適化することがプログラムのチューニングの効率を高くすることになるが，従来の性能解析プログラムでは，ループ処理，配列演算のコストを把握することができなかった。
【００１５】
本発明は，ループ処理，配列演算のコストを求める計算機プログラムの実行コストの解析方法を提供することを目的とする。
【００１６】
【課題を解決するための手段】
本発明は、計算機が，計算機プログラムの実行コストを解析する解析方法において，
ソースプログラムを翻訳して得られる実行形式プログラムにソースプログラムの文番号とプログラムの先頭アドレスからの相対アドレスを保持する文番号テーブルと，ループ処理および配列演算処理のプログラム文の文番号を保持するループ情報テーブルとを作成し，実行中の実行形式プログラムに一定時間間隔毎に割り込みを行ない実行中のプログラム文の該割り込みをしたときのアドレスを求め，該アドレスとプログラムを保持する領域の先頭アドレスとの相対アドレスを求め，該相対アドレスに基づいて文番号テーブルを参照して実行中のプログラム文の文番号を求め，該文番号に基づいてループ情報テーブルを参照してプログラム文の種類を求め，前記割り込みの全体の回数に対する，割り込み毎の処理がループ処理であった回数および配列演算であった回数の割合を求めることにより実行コストを算出し，出力する構成をもつ。
【００１７】
図１は，本発明の基本構成である。
図１において，
１はソースプログラムである。
【００１８】
２はＤＯループ文であって，ループ処理のプログラム文（手続き）である。
３は配列演算文であって，配列演算のプログラム文である。
５はコパイラである。
【００１９】
６はループ情報テーブル生成手段であって，実行形式プログラムの生成過程において生成される中間語を基にループ情報テーブル１４を生成するものである。
１０はオブジェクトプログラム（実行形式プログラム）である。
【００２０】
１１はオブジェクトプログラム１０のＤＯループ文である。
１２はオブジェクトプログラム１０の配列演算文である。
１３は文番号テーブル（後述するＳＳＮテーブルに同じ）であって，プログラム（メインプログラムおよびサブルーチンのプログラム）の文番号をそれぞれのプログラムの先頭アドレスからの相対アドレス（オフセットアドレス）を対応付けたものである。
【００２１】
１４はループ情報テーブルであって，ＤＯループ処理のループ処理，配列演算等の文の先頭文番号と末尾の処理の文番号を対応付けたものである。
２０は性能解析プログラムであって，実行中のオブジェクトプログラム１０におけるＤＯループ処理，配列演算等のコストを算出するものである。
【００２２】
２１はオフセットアドレス算出部であって，性能解析プログラム２０が実行中のオブジェクトプログラム１０に割り込んだ時にオブジェクトプログラム１０で実行されているプログラム文（手続き）のアドレスとプログラム（メインプログラムもしくはサブルーチンのプログラム）の先頭アドレスとの差をとり，そのオフセットアドレスを求めるものである。
【００２３】
２２は文番号テーブル参照部であって，オフセットアドレスにより文番号テーブルを１３を参照し，対応する文番号を求めるものである。
２３はループ・配列演算判定部であって，文番号によりループ情報テーブル１４を参照して，対応する文番号がループ演算であるか，配列演算であるか，あるいはそれ以外の手続きであるかを求めるものである。
【００２４】
２４はコスト算出部であって，ループ処理，配列演算，それ以外の手続きについて，測定により得られたそれぞれの回数およびその全体に対する割合を求めるものである。
【００２５】
２５は出力データ作成部であって，求められたループ処理の回数，配列演算の回数，それ以外の手続きのコストについて，表示出力もしくは印刷出力する形式の出力データを作成するものである。
【００２６】
３０は出力装置である。
図２は本発明の基本構成の動作説明図である。
図２において，
１はソースプログラムであって，メインプログラムである。図２のソースプログラム１は文番号１０，１１，１２にループ処理を持つものを例示している。
【００２７】
１３は文番号テーブルである。図２の文番号テーブル１３は，ループ処理のループの文１のオフセットアドレスＹ，ループの文２のオフセットアドレス（Ｙ＋４），ループの文３のオフセットアドレス（Ｙ＋８）を持つことを例として表している。
【００２８】
１４はループ情報テーブルである。図２のループ情報テーブル１４はループ処理の先頭の文であるループの文１の文番号１０と末尾の文であるループの文３の文番号１２を保持することを例とて表している。
【００２９】
２１はオフセットアドレス算出部である。
ソースプログラム１を格納するメモリの先頭アドレスはＸ（実アドレス）であり，ループ処理の先頭のループの文１のソースプログラム１の先頭アドレスＸからのオフセットアドレスはＹである。Ｚは，性能解析プログラムによる割り込みのあったアドレスであって，例としてループの文３のアドレス（実アドレス）に割り込みがあったことを表している。
【００３０】
性能解析プログラムの割り込んだ時点でループの文３（実アドレスＺ）が実行されていたとする。その時，性能解析プログラムは，割り込みをしたアドレスＺを得る。そして，オフセットアドレス算出部２１はソースプログラム１の先頭アドレスＸとによりＺ−Ｘを演算し，ループの文３のオフセットアドレスＹ＋８を求める。次に文番号テーブル参照部２２（図１参照）はオフセットアドレス（Ｙ＋８）により文番号テーブル１３を参照し，対応する文番号１２を求める。次に，ループ・配列演算判定部２３は，文番号１２によりループ情報テーブル１４を参照し，文番号１２の処理がループ処理であることを判定する。
【００３１】
コスト算出部２４はそれまでに求めた文番号１０から文番号１２のループ処理３１の回数に１を加算し，測定値を更新する。
上記において，性能解析プログラムが割り込んだ時にサブルーチンのプログラムが実行中の場合の動作も同様である。
【００３２】
即ち，サブルーチンのプログラムはその文番号テーブル１３，ループ情報テーブル１４を備える。そして，割り込んだ時の実行中のサブルーチンの先頭アドレスを，例えばその退避レジスタを参照して求める。その先頭アドレスと割り込んだ時に実行中のプログラム文のアドレス（実アドレス）によりそのオフセットアドレスを求め，文番号テーブル１３を参照してその文番号を求める。さらに，ループ情報テーブル１４を参照してその文番号の手続きの種類を判定する。
【００３３】
上記の処理を実行形式プログラムの開始から終了まで随時（例えば一定時間間隔）で行い，各ループ処理の回数，各配列演算の回数，その他の手続きの回数を求め，各ループ処理の実行コスト，各配列演算の信号コスト，その他の手続きの実行コストを算出し，出力する。
【００３４】
本発明によれば，ソースプログラムの性能解析においてプログラムの実行コストの高いループ処理，配列演算のコストを測定できるので，プログラムのチューニングにおいて効率的なチューニングを行うことが可能になる。
【００３５】
【発明の実施の形態】
図３は本発明のループ情報テーブルとＳＳＮテーブル（文番号テーブル）の例である。
【００３６】
図３において，
１４はループ情報テーブルである。ループ情報テーブル１４は，ループ処理，配列演算毎にそれぞれの先頭文番号，末尾文番号，ネストレベルがＤＯループ処理であるか配列演算であるかを識別するフラグを保持する。
【００３７】
１３はＳＳＮテーブルであって，プログラム（メインプログラムおよびサブルーチンのプログラム）の先頭アドレスからの相対アドレス（オフセットアドレス）を対応付けたものであり，前述の文番号テーブルに同じである。
【００３８】
図４は本発明の実施例構成を示す。
図４において，
１はソースプログラムであって，メインプログラムである。
【００３９】
２’はサブルーチンのプログラムである。
５はコンパイラである。
６はループ情報テーブル生成手段であって，構文解析の結果に基づいて文番号テーブル１３を生成するものである。
【００４０】
７は構文解析部であって，ソースプログラムの構文解析を行うものである。
８は実行形式プログラム生成部であって，構文解析の結果得られる中間語（図示せず）をもとに実行形式プログラム（オブジェクトプログラム）１０を生成するものである。
【００４１】
１０はオブジェクトプログラム（実行形式プログラム）である。
１１’，１１”はメインプログラムである。メインプログラム１１’，１１”はＳＳＮテーブル１３のアドレス，ループ情報テーブル１４のアドレスをもつものである。
【００４２】
１２’はサブルーチンである。サブルーチン１２’はＳＳＮテーブル１３のアドレス，ループ情報テーブル１４のアドレスをもつ。
１３はＳＳＮテーブルである。
【００４３】
１４はループ情報テーブルである。
２０は性能解析プログラムである。
３０は出力装置である。
【００４４】
３５はＯＳ部であって，制御プログラムである。
性能解析プログラム２０において，
４１は測定データ抽出部である。
【００４５】
４２は抽出データ保存部である。
４３はプログラム（メインプログラム，サブルーチン）の先頭アドレス保存部である。
【００４６】
４４はオフセットアドレス算出部である。
４５はＳＳＮテーブル参照部である。
４６はループ情報テーブル参照部である。
【００４７】
４７はループ・配列演算判定部である。
４８はコスト算出部である。
４９は出力データ作成部である。
【００４８】
図４の構成の動作は後述する。
図５はソースプログラムの例である。
図５において，
文番号０００５〜文番号０００７はＤＯループの処理であって，Ｉ＝１〜１０００について，ｉ×５を演算し，配列要素ａ（ｉ）にｉ×５の演算結果を格納する処理である。文番号０００５〜０００７のＤＯループ文の先頭の文番号は０００５であり，末尾の文番号は０００７である。また，ネストレベルは１である。
【００４９】
文番号０００８〜文番号００１０はＤＯループの処理であって，ｉ＝２〜１０１のｉに対して配列ａ（ｉ−１）に格納されている値に３を加え，演算結果を配列要素ａ（ｉ）に格納する処理である。
【００５０】
文番号０００８〜００１０のＤＯループ文の先頭の文番号は０００８であり，末尾の文番号は００１０である。また，ネストレベルは１である。
文番号００１１は１０００個ある配列要素ｂに対して値５０を格納することを行う配列演算である。
【００５１】
図６は本発明の実施例のフローチャートである（後述する）。
図７は本発明の実施例の動作説明図である。
図７において，
１０はオブジェクトプログラムであって，プログラム名が「メイン」というものである。
【００５２】
１２’はサブルーチンであって，名称が「サブルーチンＡ」というものである。
１２’はサブルーチンであって，名称が「サブルーチンＢ」というものである。
【００５３】
６１はメインプログラム（メイン）の退避領域である。
６２は退避レジスタＭであって，メインプログラムを格納する領域の先頭アドレスの退避領域である。
【００５４】
６３はサブルーチンＡの退避領域である。
６４は退避レジスタＡであって，サブルーチンＡを格納する領域の先頭アドレスの退避領域である。
【００５５】
６５はサブルーチンＡのアドレスであって，アドレスレジスタに格納されているものである。
６６はサブルーチンＢのアドレスであって，アドレスレジスタに格納されているものである。
図６に従って，図４，図７を説明する。
【００５６】
コンパイラ５はソースプログラム１を翻訳してオブジェクトプログラム（実行形式プログラム）１０を作成する。このとき，オブジェクト１０にＳＳＮテーブル１３およびループ情報テーブル１４を作成する。
【００５７】
(1)   オブジェクトプログラムおよび性能解析プログラムを実行する。
(2)   性能解析プログラムの測定データ抽出部４１は，一定時間間隔（例えば１秒）で実行中のオブジェクトプログラム１０に対して，割り込みにより実行中のプログラム文のアドレスを参照し，アドレスを求める。また，この時，ＯＳ部３５は実行中のプログラム（メインプログラムもしくはサブルーチン）の領域の先頭アドレスを通知して，先頭アドレス保存部４３に保持する。サブルーチンの場合には，ＯＳ部３５はそのアドレスを一時退避した退避レジスタ６２により求めることができる。
【００５８】
(3)   オフセットアドレス算出部４４は割り込みをしたアドレスとそのプログラムの先頭アドレスとの差をとり，オフセットアドレスを求める。そして，ＳＳＮテーブル４５を参照し，オフセットアドレスから実行中のプログラム文の文番号を求める。
【００５９】
(4)   求めた文番号についてループ情報テーブル１４を先頭から終わりまで参照し，文番号の処理の種類，ネストレベルを求める。求めた各文番号について同様の処理を反復する。
【００６０】
(5)   反復(4) において，求めた文番号がループ処理もしくは配列演算であればループ情報（ループ処理であることおよびネストレベル，もしくは配列演算であることを表す情報）を作成する。
【００６１】
(6)   反復(4) において，(7) で文番号がループ範囲にあるか判定し，ループ範囲内にあれば(8) でループ情報を作成する。ループ範囲内になければ(9) の処理をする。
【００６２】
(9)   ループ処理もしくは配列演算でなければ，ループ以外の情報であることを設定する。
(10)  プログラムの実行が終了したら処理を終了する。
【００６３】
以上の処理を，一定時間間隔の割り込みにより行い（図７の割り込み１，割り込み２等），ループ処理，配列演算の回数およびそれ以外の手続きの回数をカウントする。そして，コスト算出部４８はループ処理，配列演算の全体の回数に対する割合を求める。
【００６４】
出力データ作成部４９は求めたコストを表示もしくは印刷する出力データを作成し，出力する。
図８は解析結果の出力の例である。
【００６５】
手続き全体の回数に対するループ処理，配列演算の全体の回数に対する割合を出力する。ループ処理の場合には参考情報としてネストレベルも出力する。
図８は図５のソースプログラム（プログラム名「メイン」の手続きの全体の回数が２００回であることを示している。また，文番号０００５−文番号０００７のループ処理の実行回数が１５０回であり，全体の回数に対する割合が７５％，文番号０００８−文番号００１０のループ処理の実行回数が３０回であり，全体の回数に対する割合が１５％，文番号００１１の配列演算が５回であり，全体に対する割合が２．５％であることを表している。
【００６６】
【発明の効果】
本発明によれば，プログラム解析において，プログラムに占める割合の高いループ処理で，配列演算のコストを測定して表示するので，効率的なプログラムのチューニングを行うことができるようになる。
【図面の簡単な説明】
【図１】本発明の基本構成を示す図である。
【図２】本発明の基本構成の動作説明図である。
【図３】ループ情報テーブルとＳＳＮテーブル（文番号テーブル）の例を示す図である。
【図４】本発明の実施例構成を示す図である。
【図５】ソースプログラムの例を示す図である。
【図６】本発明の実施例のフローチャートを示す図である。
【図７】本発明の実施例の動作説明図である。
【図８】解析結果の出力の例を示す図である。
【図９】従来の計算機プログラムの実行コストの測定方法を示す図である。
【符号の説明】
１：ソースプログラム
２：ＤＯループ文
３：配列演算文
５：コンパイラ
６：ループ情報テーブル生成手段
１０：オブジェクトプログラム（実行形式プログラム）
１１：ＤＯループ文
１２：配列演算文
１３：文番号テーブル（ＳＳＮテーブル）
１４：ループ情報テーブル
２０：性能解析プログラム
２１：オフセットアドレス算出部
２２：文番号テーブル参照部
２３：ループ・配列演算判定部
２４：コスト算出部
２５：出力データ作成部
３０：出力装置
【図１】
0003838279.tif 000002
【図２】
0003838279.tif 000003
【図３】
0003838279.tif 000004
【図４】
0003838279.tif 000005
【図５】
0003838279.tif 000006
【図６】
0003838279.tif 000007
【図７】
0003838279.tif 000008
【図８】
0003838279.tif 000009
【図９】
0003838279.tif 000010