プログラム検証方法
【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、プログラムを検証する方法、およびその方法のためのプログラム検証ツールとコンパイラに関する。
【0002】特に、並列処理あるいはベクトル処理を目的とするプログラム実行時における配列データの不正参照の可能性を検出して対応するソースプログラムの適否を検証する方法およびその方法を実行するのに有用なプログラム検証ツールおよびコンパイラに関する。
【0003】
【従来の技術】並列計算機あるいはベクトル計算機でユーザプログラムを実行した場合しばしば発生する不良原因の一つは、配列データの不正参照(つまり定義と引用の順番が変わること)である。
【0004】逐次実行用ソースプログラムから並列計算機あるいはベクトル計算機で実行可能な部分を自動的に見付け出す機能を持ったコンパイラでは、配列データについて同一配列要素に対して定義と引用、定義と定義が同じループ繰返しで行なわれるかを解析し、ソースプログラムの並列化あるいはベクトル化が可能かどうかが判定される。しかし、配列添字内に実行時中に値が決まる変数が存在するような場合にはコンパイル時にどの配列要素かを決定することができない。この場合にはコンパイラは並列化やベクトル化を判定できないため、通常ユーザによる指示に従って並列化する方法がとられている。しかしながらこの方法では指示を誤るために実行結果の不良を引き起こすことが多い。
【0005】また、並列処理を記述することができる言語で書かれたプログラムでは、ユーザの記述誤りが発生しやすい。この誤りをコンパイラによる配列データの参照関係のチェックで発見することも可能であるが、上述したように、全てのケースがコンパイル時の解析によって明らかにならないため、やはり実行結果の不良を引き起こすことがある。
【0006】プログラムを実行したときの配列データへのアクセスパターンをチェックし、表示する従来の方法が、「Parallel Computing9 (1988/89) 25-35」において論じられている。この方法は、高性能計算機向けアルゴリズムを検証することを狙いとしたものであり、逐次実行用プログラムが実行された場合の定義と引用のアクセス順がそれぞれ別ウィンドウ画面に表示される。
【0007】
【発明が解決しようとする課題】上記従来技術では、並列計算機あるいはベクトル計算機で実行されるプログラムについては考慮されていない。即ち、そのデバッグという観点で、配列データの不正参照の可能性をチェックすることについての考慮がなされていない。従って、配列データの参照関係をチェックし、プログラムが並列処理あるいはベクトル処理に適するか否かを検証する方法が必要となる。また、検証結果を分かり易く表示する方法と、そのためのプログラム検証ツールとコンパイラが必要となる。
【0008】並列計算機あるいはベクトル計算機で実行することを目的とするプログラムのデバッグは、これらターゲット計算機を用いてデバッグするのが一般的である。しかし、デバックのためにこれらの高性能計算機を使用するのは計算機利用効率という面で問題がある。
【0009】本発明の第1の目的は、オブジェクトプログラム実行時における配列データの参照関係をチェックして、対応するソースプログラムの並列処理あるいはベクトル処理に対する適否を検証する方法を提供することにある。
【0010】また、本発明の第2の目的は、その検証結果を分かり易く表示する方法を提供することにある。
【0011】本発明の第3の目的は、並列計算機やベクトル計算機で実行することを目的とするソースプログラムをコンパイルするためのコンパイラを提供することにある。
【0012】
【課題を解決するための手段】本発明の特徴の第1の観点では、並列処理単位としての複数の並列プロセスに番号を割当て、配列要素が定義された並列プロセス番号と、その配列要素が作用された並列プロセス番号とを比較し、両者が一致するか否かによってその配列要素への不正参照の可能性を判定する。これによりプログラムの並列処理可能性が検証されることができる。
【0013】また、本発明の特徴の第2の観点では、ベクトル化文に順に番号を付け、検査されるべき配列要素が定義されたベクトル化文番号と、その配列要素が引用されたベクトル化文番号とを比較し、両者の大小によってその配列要素への不正参照の可能性を判定する。これによりプログラムのベクトル処理可能性が検証されることができる。
【0014】また、本発明の特徴の、第3の観点では、複数の配列要素に対応する表示領域を一次元または二次元のマトリクス状に配置し、それらの各表示領域で、対応する配列要素への不正参照の可能性を示すデータが表示される。
【0015】また、本発明の特徴の第4の観点では、配列要素の定義・引用の別を示すアクセス種別と、添字値と、アクセスされた並列プロセス番号またはベクトル化ソース文番号とを配列アクセス情報として入力し、その配列要素が定義された並列プロセス番号またはベクトル化ソース文番号と、その配列要素が引用された並列プロセス番号またはベクトル化ソース文番号とを比較して、プログラムの並列処理可能性またはベクトル処理可能性を検証することができるプログラム検証ツールとそのプログラム検証ツールが前記配列アクセス情報をソースプログラムから得られるようにするコンパイラが提供される。
【0016】
【作用】並列処理可能であるためには、並列プロセスを任意の順番で実行しても正しい結果が得られる必要がある。つまり、各配列要素の定義と引用は同じ並列プロセスで行われる必要がある。定義時の並列プロセス番号と引用時の並列プロセス番号とが異なることを検出することにより、配列データへの不正参照の可能性を検出することが出来る。すなわち、第1の観点により、プログラムの並列処理に対する適否を検証できる。
【0017】一方、ベクトル処理されるときの各配列要素の参照順序はベクトル化ソース文番号の順となるから、定義が引用より先にあるためには、ある配列要素の引用時のソース文番号がその配列要素の定義時のソース文番号より大きい必要がある。引用時のソース文番号と定義のソース文番号の大小を比較することにより、配列データへの不正参照の可能性を検出することが出来る。すなわち、上記第2の観点により、プログラムのベクトル処理に対する適否を検証できる。
【0018】第3の観点によるトレースデータの表示方法では、各配列要素への不正参照の可能性が、画面上でマトリクス状に配置されて表示される。従って、どの配列要素が並列処理あるいはベクトル処理の阻害原因かを一目で把握できるようになる。
【0019】第4の観点による本発明のプログラム検証ツールおよびコンパイラは、逐次計算機で動作することが出来るから、並列計算機やベクトル計算機で実行することを目的とするソースプログラムを逐次計算機を用いてデバッグすることが可能となる。
【0020】
【実施例】次に、本発明の実施例を図面を参照しつつ説明する。なお、これにより本発明が限定されるものではない。
【0021】図1は、ソースプログラムをロードモジュールに変換し、実行するための逐次計算機システムの構成を示す。逐次計算機システムはCPU10,メモリ12,外部格納装置14,表示装置16,キーボード18から構成される。装置14にはソースプログラム100と本発明によるコンパイラ200が格納されている。図3R>3は逐次計算機システムの機能ブロック図を示す。装置14に格納されているソースプログラム100とコンパイラ200はメモリ12にロードされる。コンパイラ200がCPU10により実行され、ソースプログラム100はユーザが入力する検査対象とする配列の名称に依存してロードモジュール300に変換され、メモリ12に格納される。その後ロードモジュール300は装置14に格納される。
【0022】コンパイラ200は、ループ分割部230と、アクセス情報付加部210と、コード生成部220とを有している。
【0023】230は、ソースプログラム100が並列処理を目的とする場合には、ソースプログラム100の並列処理の対象部分を複数の並列処理単位に分け、210は各並列処理単位内のユーザが指定した検査対象配列の要素にその並列処理単位を示すアクセス識別子を割当てる。例えば、230は、図13のループ40をループ41に変換する。並列処理のための分割数NDを4とすると、ループ41はループ40aから40dと等価である。210は並列プロセス番号#1のループ40a内の文41aで定義される配列Aの要素と、文42aで引用される配列Aの要素に対しては、アクセス識別子#1を割当てる。同様に、並列プロセス番号#2,#3,#4のループ40b,40c,40d内で定義・引用される配列Aの要素にはアクセス識別子#2,#3,#4をそれぞれ割当てる。
【0024】次に、コード生成部220は、検査対象配列の要素の定義または引用がある毎にそのアクセス情報レコードを配列アクセス情報ファイル400へ出力するためのオブジェクトコードを生成し、オブジェクトプログラムに付加しロードモジュール300に出力する。コンパイル中にオブジェクトプログラムに付加するものでもよい。アクセス情報レコードには、アクセス識別子の他、アクセスされる配列要素の値と添字、及びソースプログラムのステートメント番号が含まれる。
【0025】以上により、コンパイラ200から出力されたロードモジュール300の実行が完了すれば、その配列データに関するアクセス情報レコードが格納された配列アクセス情報ファイル400が作成され格納装置26に格納される。
【0026】ファイル400の各レコードは、図7に示す如きデータ形式を有している。フィールド410には、配列データの要素がアクセスされた順番が格納される。フィールド420には、定義か引用か示すアクセス種別が格納される。フィールド430には、次元別の配列添字値が格納される。フィールド440には、アクセス識別子が格納される。フィールド450にはソースプログラムの文番号が格納される。フィールド460にはアクセスされた配列要素の値が格納される。
【0027】ファイル400は、本発明の一実施例のプログラム検証ツールを含むトレースデータ表示ツール500と共に、シングル計算機システムの格納装置14からメモリ12に移され実行される。これにより並列計算機システムは他の処理に使用することができる。
【0028】図6ツール500を示す。ツール500は配列情報入力部510と配列アクセス情報処理部520を有している。部510はファイル400のレコードをフィールド410のアクセス番号順に入力し、部520に渡す。
【0029】部520は、図8に示すように、アクセス識別子比較部522と、アクセス識別情報更新部524と、表示色決定部526と、アクセス識別子格納用ストレージ528を有している。ストレージ528は、配列要素に対応したエントリを有しており、アクセスされた配列要素のアクセス識別子とアクセス識別とを、対応するエントリに格納する。この格納されたアクセス識別子はPREIDと表わされ初期値は0である。
【0030】部520は、並列計算機で実行することを目的とするプログラムに対しては、図9に示すフローチャートに従って作動する。
【0031】これらフローチャート中、ステップ522a〜522eは部522による処理を、ステップ524aは部524による処理を、ステップ526a〜526cは部526による処理を示す。
【0032】次に、図9に示す並列計算機で実行することを目的とするプログラムに対する作動を説明する。
【0033】最初に並列計算機で実行することを目的とするソースプログラムに対する本発明のプログラム検証方法の実施例を図11〜14を用いて説明する。
【0034】図11に示すループ30を並列に計算することは、ループ30をループ30a,30b,30c,30dに分割し、これら分割したループ30a,30b,30c,30dを並列に実行することである。このときに、もし、分割したループにまたがって同一配列要素の定義・引用が存在すると、もとの定義・引用の順が逆転する可能性がある。これは、並列実行といっても、プロセッサの空き状態により各分割ループが同時に実行されると限らないからである。
【0035】さらに、同一要素への定義が分割したループの異なるループに存在する場合も、その要素の最終値がプロセッサの状態によって変化する可能性がある。したがって、これら2つのケースは並列計算機で正しく実行できる。
【0036】図12(A)〜(E)は図11で入力変数K=0の場合のループ30、およびループ30a,30b,30cと30dにおける配列Aの要素の定義・引用の関係を示している。配列Aの要素A(I)d は定義を表わし、配列Aの要素A(I)u は引用を表わす。ループ30、およびループ30a,30b,30cおよび30dのいずれでも配列Aの各要素は同じループでのみ定義・引用が発生し、異なるループの間では定義・引用の関係を持たない。従ってループ30は、並列計算機で正しく実行できる。
【0037】次に、図13のループ40を実行することは、これを分割することにより得られるループ40a,40b,40c,40dを並列実行するのと等価である。
【0038】図14(A)〜(D)ループ40、およびループ40a,40b,40c,40dにおける配列Aの要素の定義・引用の関係を示している。この場合には、異なるループの間で同一要素が定義・引用される。従って、並列実行によって不正参照が発生する可能性がある。
【0039】一般に、配列添字が複雑で、しかも実行時に入力文などによって値が決まる変数が添字に含まれると、実行するまでこの参照関係が分からないため、並列計算機で正しく実行できるかどうかコンパイル時に判定が容易でない。そこで、元のプログラムを並列対象部分たとえばループを並列処理単位に分け任意の順番に並べたものと等価なプログラムに変換し、そのプログラムを逐次計算機で実行させ、各配列要素の定義・引用が同一並列処理単位で発生するか、異なる並列処理単位で発生するかあるいは定義が異なる並列処理単位で発生するかをチェックすることにすれば、上記参照関係を容易にチェックできる。
【0040】言い換えると、各配列要素の引用時の並列プロセス番号(並列処理単位につけた番号)と定義時の並列プロセス番号とが同じかあるいは各定義時の並列プロセス番号が同じか否かをチェックすることによりプログラムの並列処理可能性を検証することが出来る。
【0041】図9のステップ522bでは、入力された処理対象の配列要素に対応するので同じ添字値をもつアクセス識別子格納用ストレージ528のエントリから旧アクセス識別子PREIDと旧アクセス種別を読み込む。
【0042】ステップ522dでは、PREID=0か判定する。PREID=0、すなわち、現在処理中の配列要素の値が未だ定義も引用もされていない場合には、ステップ524aに進む。PREID≠0、すなわち、現在処理中の配列要素の値が既に定義あるいは引用されている場合には、ステップ522eに進む。ステップ522eでは、新,旧アクセス種別がともに引用か判定する。ともに引用の場合には、ステップ522aに進む。ともに引用でなければ、ステップ522cに進む。ステップ522cでは、現在処理中の配列要素の新アクセス識別子NOWIDと旧アクセス識別子PREIDとが等しいか判定する。異なる場合には、ステップ526aに進む。等しい場合にはステップ522aに進む。
【0043】ステップ524aでは、現在処理中の配列要素のアクセス識別子NOWIDとアクセス種別を、対応するストレージ528のエントリに格納する。そして、ステップ522aに進む。ステップ522aでは、現在処理中の配列要素のアクセス種別を判定する。種別が定義ならば、ステップ526cに進む。種別が引用ならば、ステップ526bに進む。
【0044】ステップ526aでは、現在処理中の配列要素を色Cで表示すること且つ短時間だけ高輝度で表示することを決定する。色Cは、定義あるいは引用時にアクセス識別子が一致しない要素であることを示す。つまり、不正参照の可能性のある要素であることを示す。短時間だけ高輝度で表示するのは、現在処理中の配列要素であることを示すためである。一方、ステップ526bでは、現在処理中の配列要素を色Bで表示すること且つ短時間だけ高輝度で表示することを決定する。色Bは、引用された要素であることを示す。ステップ526cでは、現在処理中の配列要素を色Aで表示すること且つ短時間だけ高輝度で表示することを決定する。色Aは、定義された要素であることを示す。
【0045】以上の動作を、図15に示すループ700でK:1の場合を用いて具体的に説明する。
【0046】ループ700をDO200で並列化する場合、分割数NDを用いてループ701に変換し、さらにアクセス情報を出力するために、コンパイラは図16のループ内の文701a,701bに対して、81c,82cに示すようなオブジェクトコードを付加する。このとき701a,702bのソース文番号は各々n,n+1であるとする。701aの検査対象配列要素A(I,J)に対しては、定義であることを示すアクセス種別“DEF”と添字の値I,Jとソース文番号nと、配列要素の値をトレースデータとして出力するコードを生成する。701bのA(I,J−K)に対しては、使用であることを示すアクセス種別“USE”と、添字の値I,J−Kと、ソース文番号n+1と、配列要素の値をトレースデータとして出力するコードを生成する。説明の都合上、ND=4とし、ループ701に対応するループ700a,700b,700c,700dで説明する。配列要素はA(I,J)とする。
【0047】図17(A)は、1番目のループ700aの実行が完了した時点におけるストレージ528の内容を示している。ストレージ528のエントリ内の全アクセス識別子は値0で初期化されるため、ループ700aの実行によりアクセスされない配列要素に対応するエントリには全て0が設定されている。他方、ループ700aの実行によりアクセスされた配列要素に対応するエントリには全て1が設定されている。u,dは各々定義,引用を示す。
【0048】この時の画面表示の例を図17(B)に示す。なお、図では、色A(定義された要素)を右上がり斜線、色B(引用された要素)を右下がり斜線、色C(不正参照可能性のある要素)を網目で示す。また、高輝度表示を太い枠つきで示す。図18(A),(B)は、I=1,J=3のときに文702bが実行された時点のストレージ528の内容と画面表示例である。文702bの実行によりアクセスされる配列要素はA(1,3)であるから、図9のステップ522bでストレージ528のエントリ(1,3)よりアクセス識別子PREIDが読み込まれ、初期値=0であるから、ステップ522dからステップ524aに進む。現在処理中の配列要素A(1,3)のアクセス種別は「定義」であり、アクセス識別子NOWIDはループ700bの並列プロセス番号#2であるから、ステップ524aでストレージ528のエントリ(1,3)にアクセス識別子2,アクセス種別「定義」が設定される。そして、ステップ526cにより、要素A(1,3)が色Aで短時間だけ高輝度表示になる。
【0049】図19(A),(B)は、I=1,J=3のときに文703bが実行された時点のストレージ528の内容と画面表示例である。文703bの実行によりアクセスされる配列要素はA(1,2)であるから、図9R>9のステップ522bでストレージ528のエントリ(1,2)より旧アクセス識別子PREID=1と旧アクセス種別「定義」が読み込まれ、旧アクセス識別子PREIDが0でないから、ステップ522dからステップ522eに進む。現在処理中の要素A(1,2)のアクセス識別子NOWIDは、ループ700bの並列プロセス番号#2であり、アクセス種別は引用である。従って、新,旧のアクセス種別が異なるのでステップ522cに進む。
【0050】ステップ522cでは、このアクセス識別子NOWID=2と旧アクセス識別子PREID=1が比較され、一致しないから、ステップ526aへ進む。そして、ステップ526aにより、要素A(1,3)が色Cで短時間だけ高輝度表示になる。色Cは、不正参照の可能性があることを示している。
【0051】図20(A),(B)は、I=2,J=3のときに文702bが実行された時点のストレージ528の内容と画面表示例である。
【0052】図21(A),(B)は、I=2,J=3のときに文703bが実行された時点のストレージ528の内容と画面表示例である。
【0053】以下、同様に処理された結果、ループ700bが終了した時点でのストレージ528の内容と画面表示は、図22(A),(B)のようになる。要素A(I,2)と要素A(I,6)が画面表示では色Cになることから、不正参照可能性があることが明確に分かる。すなわち、並列プロセス間で配列Aの「定義」「引用」が発生するため、ループ700は並列処理できないことが容易に判別できる。なお、以上の例では、配列が2次元配列であったため、配列全体を2次元画面で表示可能であった。もし、配列が3次元以上の多次元配列である場合には、ユーザが、2つの次元を残して他の次元を特定値に設定すればよい。例えば、3次元配列B(I,J,K)では、B(I,5,K)と設定することによって、J=5平面での配列Bのアクセス状況を2次元画面で表示することができる。
【0054】次に、本発明の他の実施例について説明する。
【0055】図4は並列計算機システムの機能ブロック図を示す。ソースプログラム100はコンパイラ200によってロードモジュール300に翻訳される。コンパイラ200はアクセス情報付加部210とコード生成部220からなり、210と220は図3と同じ働きをする。ロードモジュール300は実行時に並列実行部分の先頭で並列処理部分が複数の並列処理部分ロードモジュール360へと複写され、並列プロセッサに割り付けられ実行される。この場合にはアクセス情報のうちアクセス識別子には実行時に決定される並列プロセス番号が付けられる。
【0056】図2に示される並列計算機システムによりロードモジュールが実行される。各並列プロセスはプロセッサ21−i(i=1 to n)にロードされ、例えばプロセッサ20−1による処理が並列処理対象部分に達すると、各プロセッサにより並列プロセスの並列処理が実行される。この時、共有メモリ24内のデータ領域に格納されている配列データAが各プロセッサによりアクセスされると、オブジェクトコードに従って各プロセッサからアクセス情報レコードが出力され、配列アクセス情報ファイル400に格納される。
【0057】前記アクセス情報ファイル400は、図6に示したトレースデータ表示ツール500によって処理される。この動作は、先の実施例と同じである。
【0058】次に、図10に示すベクトル計算機で実行することを目的とするプログラムに対する作動を説明する。
【0059】ベクトル計算機で実行することを目的とするソースプログラムに対する本発明のプログラム検証方法の実施例を図5〜図23〜31を用いて説明する。
【0060】ソースプログラム100がベクトル計算機で実行することを目的とする場合には、処理対象ループがベクトル化され、図2cのアクセス情報付加部210により、各ベクトル処理単位内での検査対象配列の要素に対し、そのソース文番号がアクセス識別子として付加される。
【0061】例えば、ベクトル処理を目的とする図23のループ20は、ソース文番号#nのループ20内の文21で引用される配列Aの要素にはアクセス識別子#nを設定し、ソース文番号#n+1のループ20内の文22で定義される配列Aの要素にはアクセス識別子#n+1を設定する。
【0062】これを図24で説明する。アクセス情報を出力するために、コンパイラはループ20内の文21,22に対して、ループ25の26,27に示すような動作をするオブジェクトコードを付加する。このとき21,22のソース文番号は各々n,n+1であるとする。21の検査対象配列要素A(I−K)に対しては、使用であることを示すアクセス種別“USE”と、添字の値I−Kと、アクセス識別子“n”と、ソース文番号nと、配列要素の値をトレースデータとして出力するコードを生成する。22のA(I)に対しては、定義であることを示すアクセス種別“DEF”と、添字の値Iと、アクセス識別子“n+1”と、ソース文番号n+1と、配列要素の値をトレースデータとして出力するコードを生成する。図26に示すループ10をベクトル計算機で実行する場合の配列データの参照の順序は、ループ10をループ10aとループ10bのごとく分割し、この順で逐次実行する場合と等価である。従って、ループ10をベクトル計算機で正しく実行できるか否かは、ループ10での配列Aの要素の定義・引用の関係と、ループ10aとループ10bをこの順で逐次計算機で実行した時の配列Aの要素の定義・引用の関係とが一致しているか否かにより判定できる。
【0063】図27(A)〜(C)は、K=1の場合でのループ10,ループ10aおよび10bにおける配列Aの要素の定義・引用の関係を示している。
【0064】ループ10では、例えば配列Aの要素A(2)dとA(2)uのように、配列Aの各要素は、先に定義され、後で引用される。他方、ループ10aでは配列Aの各要素の定義のみが行われ、ループ10bでは配列Aの各要素の引用のみが行われるが、配列Aの各要素は、ループ10aで先に定義されてから、ループ10bで引用される関係になっている。つまり、ループ10と同じ関係が保たれている。従って、ループ10は、ベクトル計算機で正しく実行できる。
【0065】次に、図23のループ20をベクトル計算機で実行する場合の配列データの参照の参照の順序は、ループ20をループ20aと20bのごとく分割し、この順で逐次実行する場合と等価である。
【0066】図25(A)〜(C)は、K=1の場合のループ20,ループ20aおよび20bにおける配列Aの要素の定義・引用の関係を示している。
【0067】ループ20では、配列Aの各要素は、先に定義され、後で引用される。他方、ループ20aでは配列Aの各要素の引用のみが行われ、ループ20bでは配列Aの各要素の定義のみが行われ、配列Aの各要素は、ループ20aで先に引用されてから、ループ20bで定義される関係になっている。つまり、ループ20と異なる関係になっている。この場合には、ループ20をこのままベクトル計算機で実行すると正しい計算結果は得られない。
【0068】以上のことから理解されるように、ある配列要素の定義時のソース文番号とこの配列要素の引用時のソース文番号とを大小比較することにより、プログラムのベクトル処理可能性を検証できる。
【0069】図10を参照して、ステップ522aaでは、入力された現在処理中の配列要素のアクセス種別を判定する。種別が定義ならば、ステップ524aに進む。種別が引用ならば、ステップ522bに進む。
【0070】ステップ524では、現在処理中の配列要素のアクセス識別子即ち現アクセス識別子NOWIDを、ストレージ528の対応するエントリに格納する。そして、ステップ526cに進む。一方、ステップ522bでは、ストレージ528から現在処理中の配列要素に対応する以前のアクセス識別子PREIDを読み込む。
【0071】ステップ522cでは、アクセス識別子NOWEIDが前アクセス識別子PREIDより大きいか判定する。大きいなら、ステップ526bに進む。大きくないなら、ステップ526aに進む。
【0072】ステップ526aでは、現在処理中の配列要素の表示色を色Cとして表示すること且つ短時間だけ高輝度で表示することを決定する。一方、ステップ526bでは、現在処理中の配列要素の表示色を色Bとして表示すること且つ短時間だけ高輝度で表示することを決定する。さらに、ステップ526cでは、現在処理中の配列要素の表示色を色Aとして表示すること且つ短時間だけ高輝度では表示することを決定する。
【0073】以上の動作を、図23に示すループ20を用いて具体的に説明する。
【0074】図28(A),(B)は、I=2でループ20内の文21の実行が完了した時点におけるストレージ528の内容と画面表示例を示している。
【0075】図29(A)、(B)は、I=2でループ20内の文22が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0076】図30(A)、(B)は、I=3でループ20内の文21が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0077】図31(A)、(B)は、I=3でループ20内の文22が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0078】以下、同様に処理された結果、配列要素A(I)が画面表示では色Cになることから、不正参照の可能性があることが明確に分かる。すなわち、元のループ20の「定義」「引用」の順序が狂うため、ループ20はベクトル処理できないことが容易に判別できる。
【0079】図32は、本発明の他の実施例のコンパイラを示している。本実施例ではロードモジュールは図1に示されるような逐次計算機システムにより実行される。
【0080】ソースプログラム100は、コンパイラ200aに入力され、ロードモジュール300aに変換される。
【0081】コンパイラ200aは、アクセス情報付加部210と、トレースデータ表示ツール500a呼び出すためのコードを生成するコード生成部220aとを有している。
【0082】210は、先述した図3あるいは図5の210と同じ動作をする。
【0083】220aは、配列の要素の定義または引用がある毎にツール500aを呼び出すオブジェクトコード(図33のトレースデータ表示ツール呼び出し部310)を生成し、ロードモジュール300aに付加する。従って、コンパイラ200aから出力されるロードモジュール300aを実行すると、配列へのアクセスがある毎に、図33に示すように、呼び出し部310に制御が移り、これからツール500aが起動される。
【0084】ツール500aは、配列アクセス情報検出部510aと、配列アクセス情報処理520を有している。
【0085】510aは、現在処理中の配列要素の定義か引用かのアクセス種別、各次元ごとの添字値、現アクセス識別子NOWIDを検出し、現在処理中の配列に対するアクセス情報レコードとして520に渡す。
【0086】520は、先述した図8の配列アクセス情報処理部520と同じ動作をする。この図32,33に示す実施例によっても、図3あるいは図5に示す実施例と同じ結果が得られる。
【0087】
【発明の効果】以上の実施例によれば、並列計算機やベクトル計算機で実行することを目的とするソースプログラムにおいて特に不良原因となりやすい配列データへの不正参照の可能性を視覚化して表示できるため、プログラムのデバッグを容易に行えるようになる。
【0088】また、アクセス識別子格納用ストレージには定義あるいは引用が行われた要素に0以外の値が設定されるため、未定義配列要素を調べるのにも利用できる。
【0089】さらに、各表示領域で、配列要素を選択することによりこの要素をアクセスしたソースプログラム文番号と添字値、要素値を表示することができる。また、このときに対応するソースプログラムを表示して、アクセスしたソース文を高輝度表示することもできる。
【図面の簡単な説明】
【図1】本発明の一実施例の逐次計算機処理装置構成図
【図2】本発明の一実施例の逐次計算機処理装置構成図
【図3】本発明の逐次計算機での一実施例処理構成図
【図4】本発明の並列計算機での一実施例処理構成図
【図5】本発明のベクトル計算機での一実施例処理構成図
【図6】本発明の一実施例のトレースデータ表示ツールの概念図
【図7】配列アクセス情報ファイルのデータ形式図
【図8】配列アクセス情報処理部の概念図
【図9】並列処理プログラムでの配列アクセス情報処理部の動作のフローチャート
【図10】ベクトル処理プログラムでの配列アクセス情報処理部の動作のフローチャート
【図11】並列処理を目的とするプログラムの例示図
【図12】図11のループにおける配列Aの参照関係を示す概念図
【図13】並列処理を目的とするプログラムの他の例示図
【図14】図13のループにおける配列Aの参照関係を示す概念図
【図15】並列処理を目的とするプログラムのさらに他の例示図
【図16】図15のループでの配列Aの参照場所でのトレースデータを出力する概念図
【図17】ループ700aでのアクセス識別子格納用ストレージの内容と画面表示の例示図
【図18】文702bでのI=1の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図19】文703bでのI=1の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図20】文702bでのI=2の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図21】文703bでのI=2の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図22】ループ700bでのアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図23】ベクトル処理を目的とするプログラムの例示図
【図24】図23のループでの配列Aの参照場所でのトレースデータを出力する概念図
【図25】図23のループにおける配列Aの参照関係を示す概念図
【図26】ベクトル処理を目的とする他のプログラムの例示図
【図27】図26のループにおける配列Aの参照関係を示す概念図
【図28】文21のI=2でのアクセス識別子格納用ストレージの内容と画面表示の例示図
【図29】文22のI=2でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図30】文21のI=3でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図31】文22のI=3でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図32】本発明の他の実施例のコンパイラ構成図
【図33】本発明の他の実施例のトレースデータ表示ツールの概念図
【符号の説明】
410.アクセス番号、420.アクセスタイプ、430.1次元添字値、2次元添字値、440.アクセス識別子、450.ソース番号、460.配列要素の値、512.現在処理中の配列アクセス情報レコード、520.処理部、522.比較部、524.更新部、526.表示色決定部、528.アクセス識別子格納用ストレージ、530.表示データ
【0001】
【産業上の利用分野】本発明は、プログラムを検証する方法、およびその方法のためのプログラム検証ツールとコンパイラに関する。
【0002】特に、並列処理あるいはベクトル処理を目的とするプログラム実行時における配列データの不正参照の可能性を検出して対応するソースプログラムの適否を検証する方法およびその方法を実行するのに有用なプログラム検証ツールおよびコンパイラに関する。
【0003】
【従来の技術】並列計算機あるいはベクトル計算機でユーザプログラムを実行した場合しばしば発生する不良原因の一つは、配列データの不正参照(つまり定義と引用の順番が変わること)である。
【0004】逐次実行用ソースプログラムから並列計算機あるいはベクトル計算機で実行可能な部分を自動的に見付け出す機能を持ったコンパイラでは、配列データについて同一配列要素に対して定義と引用、定義と定義が同じループ繰返しで行なわれるかを解析し、ソースプログラムの並列化あるいはベクトル化が可能かどうかが判定される。しかし、配列添字内に実行時中に値が決まる変数が存在するような場合にはコンパイル時にどの配列要素かを決定することができない。この場合にはコンパイラは並列化やベクトル化を判定できないため、通常ユーザによる指示に従って並列化する方法がとられている。しかしながらこの方法では指示を誤るために実行結果の不良を引き起こすことが多い。
【0005】また、並列処理を記述することができる言語で書かれたプログラムでは、ユーザの記述誤りが発生しやすい。この誤りをコンパイラによる配列データの参照関係のチェックで発見することも可能であるが、上述したように、全てのケースがコンパイル時の解析によって明らかにならないため、やはり実行結果の不良を引き起こすことがある。
【0006】プログラムを実行したときの配列データへのアクセスパターンをチェックし、表示する従来の方法が、「Parallel Computing9 (1988/89) 25-35」において論じられている。この方法は、高性能計算機向けアルゴリズムを検証することを狙いとしたものであり、逐次実行用プログラムが実行された場合の定義と引用のアクセス順がそれぞれ別ウィンドウ画面に表示される。
【0007】
【発明が解決しようとする課題】上記従来技術では、並列計算機あるいはベクトル計算機で実行されるプログラムについては考慮されていない。即ち、そのデバッグという観点で、配列データの不正参照の可能性をチェックすることについての考慮がなされていない。従って、配列データの参照関係をチェックし、プログラムが並列処理あるいはベクトル処理に適するか否かを検証する方法が必要となる。また、検証結果を分かり易く表示する方法と、そのためのプログラム検証ツールとコンパイラが必要となる。
【0008】並列計算機あるいはベクトル計算機で実行することを目的とするプログラムのデバッグは、これらターゲット計算機を用いてデバッグするのが一般的である。しかし、デバックのためにこれらの高性能計算機を使用するのは計算機利用効率という面で問題がある。
【0009】本発明の第1の目的は、オブジェクトプログラム実行時における配列データの参照関係をチェックして、対応するソースプログラムの並列処理あるいはベクトル処理に対する適否を検証する方法を提供することにある。
【0010】また、本発明の第2の目的は、その検証結果を分かり易く表示する方法を提供することにある。
【0011】本発明の第3の目的は、並列計算機やベクトル計算機で実行することを目的とするソースプログラムをコンパイルするためのコンパイラを提供することにある。
【0012】
【課題を解決するための手段】本発明の特徴の第1の観点では、並列処理単位としての複数の並列プロセスに番号を割当て、配列要素が定義された並列プロセス番号と、その配列要素が作用された並列プロセス番号とを比較し、両者が一致するか否かによってその配列要素への不正参照の可能性を判定する。これによりプログラムの並列処理可能性が検証されることができる。
【0013】また、本発明の特徴の第2の観点では、ベクトル化文に順に番号を付け、検査されるべき配列要素が定義されたベクトル化文番号と、その配列要素が引用されたベクトル化文番号とを比較し、両者の大小によってその配列要素への不正参照の可能性を判定する。これによりプログラムのベクトル処理可能性が検証されることができる。
【0014】また、本発明の特徴の、第3の観点では、複数の配列要素に対応する表示領域を一次元または二次元のマトリクス状に配置し、それらの各表示領域で、対応する配列要素への不正参照の可能性を示すデータが表示される。
【0015】また、本発明の特徴の第4の観点では、配列要素の定義・引用の別を示すアクセス種別と、添字値と、アクセスされた並列プロセス番号またはベクトル化ソース文番号とを配列アクセス情報として入力し、その配列要素が定義された並列プロセス番号またはベクトル化ソース文番号と、その配列要素が引用された並列プロセス番号またはベクトル化ソース文番号とを比較して、プログラムの並列処理可能性またはベクトル処理可能性を検証することができるプログラム検証ツールとそのプログラム検証ツールが前記配列アクセス情報をソースプログラムから得られるようにするコンパイラが提供される。
【0016】
【作用】並列処理可能であるためには、並列プロセスを任意の順番で実行しても正しい結果が得られる必要がある。つまり、各配列要素の定義と引用は同じ並列プロセスで行われる必要がある。定義時の並列プロセス番号と引用時の並列プロセス番号とが異なることを検出することにより、配列データへの不正参照の可能性を検出することが出来る。すなわち、第1の観点により、プログラムの並列処理に対する適否を検証できる。
【0017】一方、ベクトル処理されるときの各配列要素の参照順序はベクトル化ソース文番号の順となるから、定義が引用より先にあるためには、ある配列要素の引用時のソース文番号がその配列要素の定義時のソース文番号より大きい必要がある。引用時のソース文番号と定義のソース文番号の大小を比較することにより、配列データへの不正参照の可能性を検出することが出来る。すなわち、上記第2の観点により、プログラムのベクトル処理に対する適否を検証できる。
【0018】第3の観点によるトレースデータの表示方法では、各配列要素への不正参照の可能性が、画面上でマトリクス状に配置されて表示される。従って、どの配列要素が並列処理あるいはベクトル処理の阻害原因かを一目で把握できるようになる。
【0019】第4の観点による本発明のプログラム検証ツールおよびコンパイラは、逐次計算機で動作することが出来るから、並列計算機やベクトル計算機で実行することを目的とするソースプログラムを逐次計算機を用いてデバッグすることが可能となる。
【0020】
【実施例】次に、本発明の実施例を図面を参照しつつ説明する。なお、これにより本発明が限定されるものではない。
【0021】図1は、ソースプログラムをロードモジュールに変換し、実行するための逐次計算機システムの構成を示す。逐次計算機システムはCPU10,メモリ12,外部格納装置14,表示装置16,キーボード18から構成される。装置14にはソースプログラム100と本発明によるコンパイラ200が格納されている。図3R>3は逐次計算機システムの機能ブロック図を示す。装置14に格納されているソースプログラム100とコンパイラ200はメモリ12にロードされる。コンパイラ200がCPU10により実行され、ソースプログラム100はユーザが入力する検査対象とする配列の名称に依存してロードモジュール300に変換され、メモリ12に格納される。その後ロードモジュール300は装置14に格納される。
【0022】コンパイラ200は、ループ分割部230と、アクセス情報付加部210と、コード生成部220とを有している。
【0023】230は、ソースプログラム100が並列処理を目的とする場合には、ソースプログラム100の並列処理の対象部分を複数の並列処理単位に分け、210は各並列処理単位内のユーザが指定した検査対象配列の要素にその並列処理単位を示すアクセス識別子を割当てる。例えば、230は、図13のループ40をループ41に変換する。並列処理のための分割数NDを4とすると、ループ41はループ40aから40dと等価である。210は並列プロセス番号#1のループ40a内の文41aで定義される配列Aの要素と、文42aで引用される配列Aの要素に対しては、アクセス識別子#1を割当てる。同様に、並列プロセス番号#2,#3,#4のループ40b,40c,40d内で定義・引用される配列Aの要素にはアクセス識別子#2,#3,#4をそれぞれ割当てる。
【0024】次に、コード生成部220は、検査対象配列の要素の定義または引用がある毎にそのアクセス情報レコードを配列アクセス情報ファイル400へ出力するためのオブジェクトコードを生成し、オブジェクトプログラムに付加しロードモジュール300に出力する。コンパイル中にオブジェクトプログラムに付加するものでもよい。アクセス情報レコードには、アクセス識別子の他、アクセスされる配列要素の値と添字、及びソースプログラムのステートメント番号が含まれる。
【0025】以上により、コンパイラ200から出力されたロードモジュール300の実行が完了すれば、その配列データに関するアクセス情報レコードが格納された配列アクセス情報ファイル400が作成され格納装置26に格納される。
【0026】ファイル400の各レコードは、図7に示す如きデータ形式を有している。フィールド410には、配列データの要素がアクセスされた順番が格納される。フィールド420には、定義か引用か示すアクセス種別が格納される。フィールド430には、次元別の配列添字値が格納される。フィールド440には、アクセス識別子が格納される。フィールド450にはソースプログラムの文番号が格納される。フィールド460にはアクセスされた配列要素の値が格納される。
【0027】ファイル400は、本発明の一実施例のプログラム検証ツールを含むトレースデータ表示ツール500と共に、シングル計算機システムの格納装置14からメモリ12に移され実行される。これにより並列計算機システムは他の処理に使用することができる。
【0028】図6ツール500を示す。ツール500は配列情報入力部510と配列アクセス情報処理部520を有している。部510はファイル400のレコードをフィールド410のアクセス番号順に入力し、部520に渡す。
【0029】部520は、図8に示すように、アクセス識別子比較部522と、アクセス識別情報更新部524と、表示色決定部526と、アクセス識別子格納用ストレージ528を有している。ストレージ528は、配列要素に対応したエントリを有しており、アクセスされた配列要素のアクセス識別子とアクセス識別とを、対応するエントリに格納する。この格納されたアクセス識別子はPREIDと表わされ初期値は0である。
【0030】部520は、並列計算機で実行することを目的とするプログラムに対しては、図9に示すフローチャートに従って作動する。
【0031】これらフローチャート中、ステップ522a〜522eは部522による処理を、ステップ524aは部524による処理を、ステップ526a〜526cは部526による処理を示す。
【0032】次に、図9に示す並列計算機で実行することを目的とするプログラムに対する作動を説明する。
【0033】最初に並列計算機で実行することを目的とするソースプログラムに対する本発明のプログラム検証方法の実施例を図11〜14を用いて説明する。
【0034】図11に示すループ30を並列に計算することは、ループ30をループ30a,30b,30c,30dに分割し、これら分割したループ30a,30b,30c,30dを並列に実行することである。このときに、もし、分割したループにまたがって同一配列要素の定義・引用が存在すると、もとの定義・引用の順が逆転する可能性がある。これは、並列実行といっても、プロセッサの空き状態により各分割ループが同時に実行されると限らないからである。
【0035】さらに、同一要素への定義が分割したループの異なるループに存在する場合も、その要素の最終値がプロセッサの状態によって変化する可能性がある。したがって、これら2つのケースは並列計算機で正しく実行できる。
【0036】図12(A)〜(E)は図11で入力変数K=0の場合のループ30、およびループ30a,30b,30cと30dにおける配列Aの要素の定義・引用の関係を示している。配列Aの要素A(I)d は定義を表わし、配列Aの要素A(I)u は引用を表わす。ループ30、およびループ30a,30b,30cおよび30dのいずれでも配列Aの各要素は同じループでのみ定義・引用が発生し、異なるループの間では定義・引用の関係を持たない。従ってループ30は、並列計算機で正しく実行できる。
【0037】次に、図13のループ40を実行することは、これを分割することにより得られるループ40a,40b,40c,40dを並列実行するのと等価である。
【0038】図14(A)〜(D)ループ40、およびループ40a,40b,40c,40dにおける配列Aの要素の定義・引用の関係を示している。この場合には、異なるループの間で同一要素が定義・引用される。従って、並列実行によって不正参照が発生する可能性がある。
【0039】一般に、配列添字が複雑で、しかも実行時に入力文などによって値が決まる変数が添字に含まれると、実行するまでこの参照関係が分からないため、並列計算機で正しく実行できるかどうかコンパイル時に判定が容易でない。そこで、元のプログラムを並列対象部分たとえばループを並列処理単位に分け任意の順番に並べたものと等価なプログラムに変換し、そのプログラムを逐次計算機で実行させ、各配列要素の定義・引用が同一並列処理単位で発生するか、異なる並列処理単位で発生するかあるいは定義が異なる並列処理単位で発生するかをチェックすることにすれば、上記参照関係を容易にチェックできる。
【0040】言い換えると、各配列要素の引用時の並列プロセス番号(並列処理単位につけた番号)と定義時の並列プロセス番号とが同じかあるいは各定義時の並列プロセス番号が同じか否かをチェックすることによりプログラムの並列処理可能性を検証することが出来る。
【0041】図9のステップ522bでは、入力された処理対象の配列要素に対応するので同じ添字値をもつアクセス識別子格納用ストレージ528のエントリから旧アクセス識別子PREIDと旧アクセス種別を読み込む。
【0042】ステップ522dでは、PREID=0か判定する。PREID=0、すなわち、現在処理中の配列要素の値が未だ定義も引用もされていない場合には、ステップ524aに進む。PREID≠0、すなわち、現在処理中の配列要素の値が既に定義あるいは引用されている場合には、ステップ522eに進む。ステップ522eでは、新,旧アクセス種別がともに引用か判定する。ともに引用の場合には、ステップ522aに進む。ともに引用でなければ、ステップ522cに進む。ステップ522cでは、現在処理中の配列要素の新アクセス識別子NOWIDと旧アクセス識別子PREIDとが等しいか判定する。異なる場合には、ステップ526aに進む。等しい場合にはステップ522aに進む。
【0043】ステップ524aでは、現在処理中の配列要素のアクセス識別子NOWIDとアクセス種別を、対応するストレージ528のエントリに格納する。そして、ステップ522aに進む。ステップ522aでは、現在処理中の配列要素のアクセス種別を判定する。種別が定義ならば、ステップ526cに進む。種別が引用ならば、ステップ526bに進む。
【0044】ステップ526aでは、現在処理中の配列要素を色Cで表示すること且つ短時間だけ高輝度で表示することを決定する。色Cは、定義あるいは引用時にアクセス識別子が一致しない要素であることを示す。つまり、不正参照の可能性のある要素であることを示す。短時間だけ高輝度で表示するのは、現在処理中の配列要素であることを示すためである。一方、ステップ526bでは、現在処理中の配列要素を色Bで表示すること且つ短時間だけ高輝度で表示することを決定する。色Bは、引用された要素であることを示す。ステップ526cでは、現在処理中の配列要素を色Aで表示すること且つ短時間だけ高輝度で表示することを決定する。色Aは、定義された要素であることを示す。
【0045】以上の動作を、図15に示すループ700でK:1の場合を用いて具体的に説明する。
【0046】ループ700をDO200で並列化する場合、分割数NDを用いてループ701に変換し、さらにアクセス情報を出力するために、コンパイラは図16のループ内の文701a,701bに対して、81c,82cに示すようなオブジェクトコードを付加する。このとき701a,702bのソース文番号は各々n,n+1であるとする。701aの検査対象配列要素A(I,J)に対しては、定義であることを示すアクセス種別“DEF”と添字の値I,Jとソース文番号nと、配列要素の値をトレースデータとして出力するコードを生成する。701bのA(I,J−K)に対しては、使用であることを示すアクセス種別“USE”と、添字の値I,J−Kと、ソース文番号n+1と、配列要素の値をトレースデータとして出力するコードを生成する。説明の都合上、ND=4とし、ループ701に対応するループ700a,700b,700c,700dで説明する。配列要素はA(I,J)とする。
【0047】図17(A)は、1番目のループ700aの実行が完了した時点におけるストレージ528の内容を示している。ストレージ528のエントリ内の全アクセス識別子は値0で初期化されるため、ループ700aの実行によりアクセスされない配列要素に対応するエントリには全て0が設定されている。他方、ループ700aの実行によりアクセスされた配列要素に対応するエントリには全て1が設定されている。u,dは各々定義,引用を示す。
【0048】この時の画面表示の例を図17(B)に示す。なお、図では、色A(定義された要素)を右上がり斜線、色B(引用された要素)を右下がり斜線、色C(不正参照可能性のある要素)を網目で示す。また、高輝度表示を太い枠つきで示す。図18(A),(B)は、I=1,J=3のときに文702bが実行された時点のストレージ528の内容と画面表示例である。文702bの実行によりアクセスされる配列要素はA(1,3)であるから、図9のステップ522bでストレージ528のエントリ(1,3)よりアクセス識別子PREIDが読み込まれ、初期値=0であるから、ステップ522dからステップ524aに進む。現在処理中の配列要素A(1,3)のアクセス種別は「定義」であり、アクセス識別子NOWIDはループ700bの並列プロセス番号#2であるから、ステップ524aでストレージ528のエントリ(1,3)にアクセス識別子2,アクセス種別「定義」が設定される。そして、ステップ526cにより、要素A(1,3)が色Aで短時間だけ高輝度表示になる。
【0049】図19(A),(B)は、I=1,J=3のときに文703bが実行された時点のストレージ528の内容と画面表示例である。文703bの実行によりアクセスされる配列要素はA(1,2)であるから、図9R>9のステップ522bでストレージ528のエントリ(1,2)より旧アクセス識別子PREID=1と旧アクセス種別「定義」が読み込まれ、旧アクセス識別子PREIDが0でないから、ステップ522dからステップ522eに進む。現在処理中の要素A(1,2)のアクセス識別子NOWIDは、ループ700bの並列プロセス番号#2であり、アクセス種別は引用である。従って、新,旧のアクセス種別が異なるのでステップ522cに進む。
【0050】ステップ522cでは、このアクセス識別子NOWID=2と旧アクセス識別子PREID=1が比較され、一致しないから、ステップ526aへ進む。そして、ステップ526aにより、要素A(1,3)が色Cで短時間だけ高輝度表示になる。色Cは、不正参照の可能性があることを示している。
【0051】図20(A),(B)は、I=2,J=3のときに文702bが実行された時点のストレージ528の内容と画面表示例である。
【0052】図21(A),(B)は、I=2,J=3のときに文703bが実行された時点のストレージ528の内容と画面表示例である。
【0053】以下、同様に処理された結果、ループ700bが終了した時点でのストレージ528の内容と画面表示は、図22(A),(B)のようになる。要素A(I,2)と要素A(I,6)が画面表示では色Cになることから、不正参照可能性があることが明確に分かる。すなわち、並列プロセス間で配列Aの「定義」「引用」が発生するため、ループ700は並列処理できないことが容易に判別できる。なお、以上の例では、配列が2次元配列であったため、配列全体を2次元画面で表示可能であった。もし、配列が3次元以上の多次元配列である場合には、ユーザが、2つの次元を残して他の次元を特定値に設定すればよい。例えば、3次元配列B(I,J,K)では、B(I,5,K)と設定することによって、J=5平面での配列Bのアクセス状況を2次元画面で表示することができる。
【0054】次に、本発明の他の実施例について説明する。
【0055】図4は並列計算機システムの機能ブロック図を示す。ソースプログラム100はコンパイラ200によってロードモジュール300に翻訳される。コンパイラ200はアクセス情報付加部210とコード生成部220からなり、210と220は図3と同じ働きをする。ロードモジュール300は実行時に並列実行部分の先頭で並列処理部分が複数の並列処理部分ロードモジュール360へと複写され、並列プロセッサに割り付けられ実行される。この場合にはアクセス情報のうちアクセス識別子には実行時に決定される並列プロセス番号が付けられる。
【0056】図2に示される並列計算機システムによりロードモジュールが実行される。各並列プロセスはプロセッサ21−i(i=1 to n)にロードされ、例えばプロセッサ20−1による処理が並列処理対象部分に達すると、各プロセッサにより並列プロセスの並列処理が実行される。この時、共有メモリ24内のデータ領域に格納されている配列データAが各プロセッサによりアクセスされると、オブジェクトコードに従って各プロセッサからアクセス情報レコードが出力され、配列アクセス情報ファイル400に格納される。
【0057】前記アクセス情報ファイル400は、図6に示したトレースデータ表示ツール500によって処理される。この動作は、先の実施例と同じである。
【0058】次に、図10に示すベクトル計算機で実行することを目的とするプログラムに対する作動を説明する。
【0059】ベクトル計算機で実行することを目的とするソースプログラムに対する本発明のプログラム検証方法の実施例を図5〜図23〜31を用いて説明する。
【0060】ソースプログラム100がベクトル計算機で実行することを目的とする場合には、処理対象ループがベクトル化され、図2cのアクセス情報付加部210により、各ベクトル処理単位内での検査対象配列の要素に対し、そのソース文番号がアクセス識別子として付加される。
【0061】例えば、ベクトル処理を目的とする図23のループ20は、ソース文番号#nのループ20内の文21で引用される配列Aの要素にはアクセス識別子#nを設定し、ソース文番号#n+1のループ20内の文22で定義される配列Aの要素にはアクセス識別子#n+1を設定する。
【0062】これを図24で説明する。アクセス情報を出力するために、コンパイラはループ20内の文21,22に対して、ループ25の26,27に示すような動作をするオブジェクトコードを付加する。このとき21,22のソース文番号は各々n,n+1であるとする。21の検査対象配列要素A(I−K)に対しては、使用であることを示すアクセス種別“USE”と、添字の値I−Kと、アクセス識別子“n”と、ソース文番号nと、配列要素の値をトレースデータとして出力するコードを生成する。22のA(I)に対しては、定義であることを示すアクセス種別“DEF”と、添字の値Iと、アクセス識別子“n+1”と、ソース文番号n+1と、配列要素の値をトレースデータとして出力するコードを生成する。図26に示すループ10をベクトル計算機で実行する場合の配列データの参照の順序は、ループ10をループ10aとループ10bのごとく分割し、この順で逐次実行する場合と等価である。従って、ループ10をベクトル計算機で正しく実行できるか否かは、ループ10での配列Aの要素の定義・引用の関係と、ループ10aとループ10bをこの順で逐次計算機で実行した時の配列Aの要素の定義・引用の関係とが一致しているか否かにより判定できる。
【0063】図27(A)〜(C)は、K=1の場合でのループ10,ループ10aおよび10bにおける配列Aの要素の定義・引用の関係を示している。
【0064】ループ10では、例えば配列Aの要素A(2)dとA(2)uのように、配列Aの各要素は、先に定義され、後で引用される。他方、ループ10aでは配列Aの各要素の定義のみが行われ、ループ10bでは配列Aの各要素の引用のみが行われるが、配列Aの各要素は、ループ10aで先に定義されてから、ループ10bで引用される関係になっている。つまり、ループ10と同じ関係が保たれている。従って、ループ10は、ベクトル計算機で正しく実行できる。
【0065】次に、図23のループ20をベクトル計算機で実行する場合の配列データの参照の参照の順序は、ループ20をループ20aと20bのごとく分割し、この順で逐次実行する場合と等価である。
【0066】図25(A)〜(C)は、K=1の場合のループ20,ループ20aおよび20bにおける配列Aの要素の定義・引用の関係を示している。
【0067】ループ20では、配列Aの各要素は、先に定義され、後で引用される。他方、ループ20aでは配列Aの各要素の引用のみが行われ、ループ20bでは配列Aの各要素の定義のみが行われ、配列Aの各要素は、ループ20aで先に引用されてから、ループ20bで定義される関係になっている。つまり、ループ20と異なる関係になっている。この場合には、ループ20をこのままベクトル計算機で実行すると正しい計算結果は得られない。
【0068】以上のことから理解されるように、ある配列要素の定義時のソース文番号とこの配列要素の引用時のソース文番号とを大小比較することにより、プログラムのベクトル処理可能性を検証できる。
【0069】図10を参照して、ステップ522aaでは、入力された現在処理中の配列要素のアクセス種別を判定する。種別が定義ならば、ステップ524aに進む。種別が引用ならば、ステップ522bに進む。
【0070】ステップ524では、現在処理中の配列要素のアクセス識別子即ち現アクセス識別子NOWIDを、ストレージ528の対応するエントリに格納する。そして、ステップ526cに進む。一方、ステップ522bでは、ストレージ528から現在処理中の配列要素に対応する以前のアクセス識別子PREIDを読み込む。
【0071】ステップ522cでは、アクセス識別子NOWEIDが前アクセス識別子PREIDより大きいか判定する。大きいなら、ステップ526bに進む。大きくないなら、ステップ526aに進む。
【0072】ステップ526aでは、現在処理中の配列要素の表示色を色Cとして表示すること且つ短時間だけ高輝度で表示することを決定する。一方、ステップ526bでは、現在処理中の配列要素の表示色を色Bとして表示すること且つ短時間だけ高輝度で表示することを決定する。さらに、ステップ526cでは、現在処理中の配列要素の表示色を色Aとして表示すること且つ短時間だけ高輝度では表示することを決定する。
【0073】以上の動作を、図23に示すループ20を用いて具体的に説明する。
【0074】図28(A),(B)は、I=2でループ20内の文21の実行が完了した時点におけるストレージ528の内容と画面表示例を示している。
【0075】図29(A)、(B)は、I=2でループ20内の文22が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0076】図30(A)、(B)は、I=3でループ20内の文21が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0077】図31(A)、(B)は、I=3でループ20内の文22が実行された時点におけるストレージ528の内容と画面表示例を示している。
【0078】以下、同様に処理された結果、配列要素A(I)が画面表示では色Cになることから、不正参照の可能性があることが明確に分かる。すなわち、元のループ20の「定義」「引用」の順序が狂うため、ループ20はベクトル処理できないことが容易に判別できる。
【0079】図32は、本発明の他の実施例のコンパイラを示している。本実施例ではロードモジュールは図1に示されるような逐次計算機システムにより実行される。
【0080】ソースプログラム100は、コンパイラ200aに入力され、ロードモジュール300aに変換される。
【0081】コンパイラ200aは、アクセス情報付加部210と、トレースデータ表示ツール500a呼び出すためのコードを生成するコード生成部220aとを有している。
【0082】210は、先述した図3あるいは図5の210と同じ動作をする。
【0083】220aは、配列の要素の定義または引用がある毎にツール500aを呼び出すオブジェクトコード(図33のトレースデータ表示ツール呼び出し部310)を生成し、ロードモジュール300aに付加する。従って、コンパイラ200aから出力されるロードモジュール300aを実行すると、配列へのアクセスがある毎に、図33に示すように、呼び出し部310に制御が移り、これからツール500aが起動される。
【0084】ツール500aは、配列アクセス情報検出部510aと、配列アクセス情報処理520を有している。
【0085】510aは、現在処理中の配列要素の定義か引用かのアクセス種別、各次元ごとの添字値、現アクセス識別子NOWIDを検出し、現在処理中の配列に対するアクセス情報レコードとして520に渡す。
【0086】520は、先述した図8の配列アクセス情報処理部520と同じ動作をする。この図32,33に示す実施例によっても、図3あるいは図5に示す実施例と同じ結果が得られる。
【0087】
【発明の効果】以上の実施例によれば、並列計算機やベクトル計算機で実行することを目的とするソースプログラムにおいて特に不良原因となりやすい配列データへの不正参照の可能性を視覚化して表示できるため、プログラムのデバッグを容易に行えるようになる。
【0088】また、アクセス識別子格納用ストレージには定義あるいは引用が行われた要素に0以外の値が設定されるため、未定義配列要素を調べるのにも利用できる。
【0089】さらに、各表示領域で、配列要素を選択することによりこの要素をアクセスしたソースプログラム文番号と添字値、要素値を表示することができる。また、このときに対応するソースプログラムを表示して、アクセスしたソース文を高輝度表示することもできる。
【図面の簡単な説明】
【図1】本発明の一実施例の逐次計算機処理装置構成図
【図2】本発明の一実施例の逐次計算機処理装置構成図
【図3】本発明の逐次計算機での一実施例処理構成図
【図4】本発明の並列計算機での一実施例処理構成図
【図5】本発明のベクトル計算機での一実施例処理構成図
【図6】本発明の一実施例のトレースデータ表示ツールの概念図
【図7】配列アクセス情報ファイルのデータ形式図
【図8】配列アクセス情報処理部の概念図
【図9】並列処理プログラムでの配列アクセス情報処理部の動作のフローチャート
【図10】ベクトル処理プログラムでの配列アクセス情報処理部の動作のフローチャート
【図11】並列処理を目的とするプログラムの例示図
【図12】図11のループにおける配列Aの参照関係を示す概念図
【図13】並列処理を目的とするプログラムの他の例示図
【図14】図13のループにおける配列Aの参照関係を示す概念図
【図15】並列処理を目的とするプログラムのさらに他の例示図
【図16】図15のループでの配列Aの参照場所でのトレースデータを出力する概念図
【図17】ループ700aでのアクセス識別子格納用ストレージの内容と画面表示の例示図
【図18】文702bでのI=1の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図19】文703bでのI=1の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図20】文702bでのI=2の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図21】文703bでのI=2の時のアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図22】ループ700bでのアクセス識別子格納用ストレージの内容と画面表示の例示例を示す図
【図23】ベクトル処理を目的とするプログラムの例示図
【図24】図23のループでの配列Aの参照場所でのトレースデータを出力する概念図
【図25】図23のループにおける配列Aの参照関係を示す概念図
【図26】ベクトル処理を目的とする他のプログラムの例示図
【図27】図26のループにおける配列Aの参照関係を示す概念図
【図28】文21のI=2でのアクセス識別子格納用ストレージの内容と画面表示の例示図
【図29】文22のI=2でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図30】文21のI=3でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図31】文22のI=3でのアクセス識別子格納用ストレージの内容と画面表示例を示す図
【図32】本発明の他の実施例のコンパイラ構成図
【図33】本発明の他の実施例のトレースデータ表示ツールの概念図
【符号の説明】
410.アクセス番号、420.アクセスタイプ、430.1次元添字値、2次元添字値、440.アクセス識別子、450.ソース番号、460.配列要素の値、512.現在処理中の配列アクセス情報レコード、520.処理部、522.比較部、524.更新部、526.表示色決定部、528.アクセス識別子格納用ストレージ、530.表示データ
【特許請求の範囲】
【請求項1】少なくとも一つの部分が複数のプロセッサで並列に実行可能なように複数の処理部分に分割されてコンパイルされるべきソースプログラムをテストするためにコンピュータにより実行されるプログラム検証方法において、前記ソースプログラムをコンパイルして得られるオブジェクトプログラムを実行し、前記複数の処理部分の各々の実行に際して、前記複数の処理部分のそれぞれで実施された配列データの各要素の処理に関するアクセス情報を生成して記憶手段に記憶し、前記記憶手段に記憶された前記アクセス情報を解析し、不正な参照が発生する可能性のある前記配列データ内の要素を判別し、前記判別された要素をユーザにより識別可能に表示することを特徴とするプログラム検証方法。
【請求項2】前記プログラム検証方法はさらに、前記実行に先行して、入力されたソースプログラムの少なくとも一部分を複数のプロセッサで実行可能な前記複数の処理部分に分割し、前記複数の処理部分に含まれる前記配列データに対する処理に対応して、該処理が実行されたときに前記アクセス情報を生成する処理を付加して前記オブジェクトプログラムを生成するコンパイル処理を実行することを特徴とする請求項1記載のプログラム検証方法。
【請求項3】前記アクセス情報は、処理された配列データの要素を特定するための該配列データの各次元を示す添字と、前記複数の処理部分のなかで、当該処理が実行された処理部分を識別するための処理番号と、当該処理が当該配列データの要素の定義であるか使用であるかを示す識別子とを含むことを特徴とする請求項2記載のプログラム検証方法。
【請求項4】前記判別は、複数の異なる処理番号の処理部分で定義されるか、あるいは、定義と使用とが異なる処理番号の処理部で実施される前記配列データの要素を前記不正な参照が発生する可能性のある前記配列データ内の要素として判別することを特徴とする請求項3記載のプログラム検証方法。
【請求項5】前記複数の処理部分の実行に際して、該複数の処理部分の処理を並列に実行することを特徴とする請求項1記載のプログラム検証方法。
【請求項6】少なくとも一つのループがベクトルプロセッサで処理されるようコンパイルされるべきソースプログラムをテストするためにコンピュータにより実行されるプログラム検証方法において、前記ソースプログラムをコンパイルして得られたオブジェクトプログラムを実行し、ベクトル処理化された前記少なくとも一つのループに関するベクトル処理単位のそれぞれの処理の実行に際して、前記ベクトル処理単位の各々で実施された配列データの要素に対する処理に関するアクセス情報を生成して記憶手段に記憶し、前記記憶手段に記憶された前記アクセス情報を解析し、不正な参照が発生する可能性のある前記配列データ内の要素を判別し、前記判別された要素をユーザにより識別可能に表示することを特徴とするプログラム検証方法。
【請求項7】前記プログラム検証方法はさらに、前記実行に先行して、入力されたソースプログラムの少なくとも一つのループをベクトル処理化し、各ベクトル処理単位に含まれる前記配列データに対する処理に対応して、該処理が実行されたときに前記アクセス情報を生成する処理を付加して前記オブジェクトプログラムを生成するコンパイル処理を実行することを特徴とする請求項6記載のプログラム検証方法。
【請求項8】前記アクセス情報は、処理された配列データの要素を特定するための該配列データの各次元を示す添字と、当該処理が実行されたベクトル処理単位を識別するための処理番号と、当該処理が当該配列データの要素の定義であるか使用であるかを示す識別子とを含むことを特徴とする請求項7記載のプログラム検証方法。
【請求項9】前記判別は、それを使用するベクトル処理単位の処理番号が、その定義を行ったベクトル処理単位の処理番号よりも小さい前記配列データの要素を前記不正な参照が発生する可能性のある前記配列データ内の要素として判別することを特徴とする請求項8記載のプログラム検証方法。
【請求項10】前記表示は、前記配列データの要素に対応する表示領域を1次元又は2次元のマトリクス状に配置し、前記不正な参照が発生する可能性のある要素に対応する表示領域の表示を他から識別可能な形態で表示することを特徴とする請求項1乃至9いずれかに記載のプログラム検証方法。
【請求項1】少なくとも一つの部分が複数のプロセッサで並列に実行可能なように複数の処理部分に分割されてコンパイルされるべきソースプログラムをテストするためにコンピュータにより実行されるプログラム検証方法において、前記ソースプログラムをコンパイルして得られるオブジェクトプログラムを実行し、前記複数の処理部分の各々の実行に際して、前記複数の処理部分のそれぞれで実施された配列データの各要素の処理に関するアクセス情報を生成して記憶手段に記憶し、前記記憶手段に記憶された前記アクセス情報を解析し、不正な参照が発生する可能性のある前記配列データ内の要素を判別し、前記判別された要素をユーザにより識別可能に表示することを特徴とするプログラム検証方法。
【請求項2】前記プログラム検証方法はさらに、前記実行に先行して、入力されたソースプログラムの少なくとも一部分を複数のプロセッサで実行可能な前記複数の処理部分に分割し、前記複数の処理部分に含まれる前記配列データに対する処理に対応して、該処理が実行されたときに前記アクセス情報を生成する処理を付加して前記オブジェクトプログラムを生成するコンパイル処理を実行することを特徴とする請求項1記載のプログラム検証方法。
【請求項3】前記アクセス情報は、処理された配列データの要素を特定するための該配列データの各次元を示す添字と、前記複数の処理部分のなかで、当該処理が実行された処理部分を識別するための処理番号と、当該処理が当該配列データの要素の定義であるか使用であるかを示す識別子とを含むことを特徴とする請求項2記載のプログラム検証方法。
【請求項4】前記判別は、複数の異なる処理番号の処理部分で定義されるか、あるいは、定義と使用とが異なる処理番号の処理部で実施される前記配列データの要素を前記不正な参照が発生する可能性のある前記配列データ内の要素として判別することを特徴とする請求項3記載のプログラム検証方法。
【請求項5】前記複数の処理部分の実行に際して、該複数の処理部分の処理を並列に実行することを特徴とする請求項1記載のプログラム検証方法。
【請求項6】少なくとも一つのループがベクトルプロセッサで処理されるようコンパイルされるべきソースプログラムをテストするためにコンピュータにより実行されるプログラム検証方法において、前記ソースプログラムをコンパイルして得られたオブジェクトプログラムを実行し、ベクトル処理化された前記少なくとも一つのループに関するベクトル処理単位のそれぞれの処理の実行に際して、前記ベクトル処理単位の各々で実施された配列データの要素に対する処理に関するアクセス情報を生成して記憶手段に記憶し、前記記憶手段に記憶された前記アクセス情報を解析し、不正な参照が発生する可能性のある前記配列データ内の要素を判別し、前記判別された要素をユーザにより識別可能に表示することを特徴とするプログラム検証方法。
【請求項7】前記プログラム検証方法はさらに、前記実行に先行して、入力されたソースプログラムの少なくとも一つのループをベクトル処理化し、各ベクトル処理単位に含まれる前記配列データに対する処理に対応して、該処理が実行されたときに前記アクセス情報を生成する処理を付加して前記オブジェクトプログラムを生成するコンパイル処理を実行することを特徴とする請求項6記載のプログラム検証方法。
【請求項8】前記アクセス情報は、処理された配列データの要素を特定するための該配列データの各次元を示す添字と、当該処理が実行されたベクトル処理単位を識別するための処理番号と、当該処理が当該配列データの要素の定義であるか使用であるかを示す識別子とを含むことを特徴とする請求項7記載のプログラム検証方法。
【請求項9】前記判別は、それを使用するベクトル処理単位の処理番号が、その定義を行ったベクトル処理単位の処理番号よりも小さい前記配列データの要素を前記不正な参照が発生する可能性のある前記配列データ内の要素として判別することを特徴とする請求項8記載のプログラム検証方法。
【請求項10】前記表示は、前記配列データの要素に対応する表示領域を1次元又は2次元のマトリクス状に配置し、前記不正な参照が発生する可能性のある要素に対応する表示領域の表示を他から識別可能な形態で表示することを特徴とする請求項1乃至9いずれかに記載のプログラム検証方法。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図12】
【図14】
【図24】
【図9】
【図10】
【図11】
【図13】
【図15】
【図16】
【図17】
【図18】
【図20】
【図31】
【図19】
【図21】
【図22】
【図23】
【図25】
【図29】
【図26】
【図27】
【図28】
【図30】
【図32】
【図33】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図12】
【図14】
【図24】
【図9】
【図10】
【図11】
【図13】
【図15】
【図16】
【図17】
【図18】
【図20】
【図31】
【図19】
【図21】
【図22】
【図23】
【図25】
【図29】
【図26】
【図27】
【図28】
【図30】
【図32】
【図33】
【特許番号】特許第3094475号(P3094475)
【登録日】平成12年8月4日(2000.8.4)
【発行日】平成12年10月3日(2000.10.3)
【国際特許分類】
【出願番号】特願平3−29848
【出願日】平成3年2月25日(1991.2.25)
【公開番号】特開平4−211831
【公開日】平成4年8月3日(1992.8.3)
【審査請求日】平成10年2月16日(1998.2.16)
【出願人】(000005108)株式会社日立製作所 (27,607)
【参考文献】
【文献】D.Callahan,et.al、”ParaScope:A parallel programming environment”「International Journal of Supercomputing Application」Vol.2,No.4,P.84−99(1988)
【登録日】平成12年8月4日(2000.8.4)
【発行日】平成12年10月3日(2000.10.3)
【国際特許分類】
【出願日】平成3年2月25日(1991.2.25)
【公開番号】特開平4−211831
【公開日】平成4年8月3日(1992.8.3)
【審査請求日】平成10年2月16日(1998.2.16)
【出願人】(000005108)株式会社日立製作所 (27,607)
【参考文献】
【文献】D.Callahan,et.al、”ParaScope:A parallel programming environment”「International Journal of Supercomputing Application」Vol.2,No.4,P.84−99(1988)
[ Back to top ]