(57)【特許請求の範囲】
【請求項１】
ポインタ機能を有するプログラミング言語で記述された原始プログラムを、解析部が解析し、
データ依存関係設定部が、該解析結果に従い、ループをなすプログラム部分のデータ引用から取り出す２個のデータ引用の組合せのうち少なくとも一方のデータ引用が値を定義するデータ引用であるすべての各組合せについてデータ依存関係を解析し、データ依存関係が有る各組合せ、及びデータ依存関係の解析不能の各組合せについて、各組合せの表示と所定のデータ依存関係値とをデータ依存関係表に設定するデータ依存関係設定処理を行い、
最適化実施部が、該データ依存関係表を参照して、該解析結果のベクトル化の可否を識別し、ベクトル化可能な場合にベクトル化し、
コード生成部が該ベクトル化結果に従い、ベクトル化可能部分をベクトル化した目的プログラムを生成するコンパイラ装置であって、
データ引用分類部を設け、該データ引用分類部は、該解析部が解析した原始プログラムの解析結果について、各データ引用を判別し、各該データ引用がポインタ間接引用、外部変数についての引用、及びアドレスを取られている変数の引用の何れかであることを条件として、当該データ引用をＡ分類とし、Ａ分類に属さない場合をＢ分類とし、
該データ依存関係設定部は、更に該データ引用分類部の分類したＢ分類の全データ引用のみについて、該データ依存関係設定処理を行い、Ａ分類の全データ引用から取り出した２個のデータ引用の組合せのうち少なくとも一方のデータ引用が値を定義するデータ引用であるすべての各組合せについて、無条件に解析不能を示す該データ依存関係値をデータ依存関係表に設定するように構成されていることを特徴とするコンパイラ装置。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は計算機の原始プログラムを翻訳してベクトル化部分を有する目的プログラムを生成するコンパイラの処理を行うコンパイラ装置に関する。
【０００２】
【従来の技術と発明が解決しようとする課題】
広く知られているように、Ｃ言語と呼ばれるプログラミング言語等には、ポインタ機能があり、ポインタとして宣言された変数を使って、その変数の値をアドレスとするデータを引用する、いわゆるポインタ間接引用を原始プログラムに記述することができる。
【０００３】
図２はポインタ間接引用を含むＣ言語のプログラムの例であり、図２(a）において▲１▼行は、次の▲２▼行以下で関数定義を行い、その関数はfunc1() であることを示す。
【０００４】
▲３▼はdouble型データの宣言、▲４▼行はint 型データの宣言で、double型データには配列データａとポインタ（＊で示す) ｐがある。
▲５▼行は、端末から値を十進数（"%d"で示す) として読み込んで変数ｊ（&jで変数ｊのアドレスを示す) に代入すること、▲６▼行は、a[j]のアドレスを求めてポインタｐに代入することを示す。
【０００５】
▲７▼行はプログラムのループを記述する for文であって、変数ｉを値０から９まで、１づつ増加しながら、続く▲８▼行の代入文を繰り返すことを示す。
▲８▼行で代入先を示すp[i]がポインタ間接引用であって、ポインタｐが指示するデータを先頭の要素とする配列のｉ番目の要素を示す。
【０００６】
よく知られているように、一般に for文等で構成されるループによる配列の計算部分は、ベクトル処理装置で処理するようにベクトル化した目的プログラムを生成するための主要な対象である。
【０００７】
従って、ベクトル化機能を持つコンパイラは最適化処理として、先ずループ内のデータ引用のうち、少なくとも一方が値を定義するデータ引用であり、同じ配列データに関する２個のデータ引用のすべての組合せについて、データ依存関係を調べて、それらの各データ引用対ごとについてのデータ依存関係を表す値を設定したデータ依存関係表を作成する。
【０００８】
次に、そのデータ依存関係表を参照して、データ依存関係が無いか、又はその影響を避けるようプログラムを変更できる場合には変更して、ベクトル化目的プログラムを生成する。
【０００９】
しかし、従来ポインタ間接引用が含まれる場合には、次のような状況が発生する可能性を持つことから、無条件に最適化をしないようにしている。即ち、そのループのデータ引用対について、前記のデータ依存関係表に設定する値をすべて無条件に「？」としてデータ依存関係の解析不能を示すようにし、従ってそのデータ依存関係表を参照する最適化処理では、ベクトル化不能と判断せざるを得ないようにする。
【００１０】
このように処置する理由は次のとおりである。例えば図２(a)の例で、for文の実行直前の変数ｊとａの値が次の通りであったとする。
ｊ＝2
ａ＝( 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,.....)
ベクトル化しないで、順次実行すれば、 for文実行後のａは、
ａ＝( 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2,13,14,.....)
となることは、プログラムを追えば明らかである。
【００１１】
しかしベクトル化すると、実行前のａの値の列を一斉にベクトル処理装置のベクトルレジスタに読み込んでおき、それをパイプライン式の演算器に送り込んで演算し、パイプラインから順次出てくる結果を、例えばベクトルレジスタの別の領域に順次格納しておいて、一斉にａの領域へ書き込むようにするので、実行後のａの値は、
ａ＝( 1, 2, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,13,14,.....)
となり、前記のａの結果と異なる。
【００１２】
以上のとおり、ベクトル化すると、プログラムの記述上意図したのと異なる動きをし、その結果演算結果が異なってしまうので、このような結果になる場合にはベクトル化してはならない。
【００１３】
次に、図２(b)はポインタ間接引用を使用した別の例で、(a)と類似した文で
あるので個々の説明を省略するが、この例の場合には▲７▼行でポインタ間接引用が参照に使用され、間接引用先の変数ｂも▲８▼行で参照のみに使用されているために、ベクトル化してもポインタ間接引用に起因する前記(b)の例のような結果は発生しない。
【００１４】
即ち、図２(b)の例のような場合には、ポインタ間接引用があっても、ベクトル化して効率のよい目的プログラムを生成できることが望まれる。
本発明は、ポインタ間接引用があってもベクトル化してよいことを比較的容易に判定できる場合を効率よく選別して、ベクトル化範囲を拡大したコンパイラ装置を目的とする。
【００１５】
【課題を解決するための手段】
図１は、本発明の構成を示すブロック図である。
図はコンパイラ装置の構成であって、ポインタ機能を有するプログラミング言語で記述された原始プログラムを、解析部１が解析し、データ依存関係設定部３が、該解析結果に従い、ループをなすプログラム部分のデータ引用から取り出す２個のデータ引用の組合せのうち少なくとも一方のデータ引用が値を定義するデータ引用であるすべての各組合せについてデータ依存関係を解析し、データ依存関係が有る各組合せ、及びデータ依存関係の解析不能の各組合せについて、各組合せの表示と所定のデータ依存関係値とをデータ依存関係表に設定するデータ依存関係設定処理を行い、最適化実施部４が、該データ依存関係表を参照して、ベクトル化の可否を識別し、ベクトル化可能な場合に必要な最適化を行い、コード生成部５が該最適化結果に従い、ベクトル化可能部分をベクトル化した目的プログラムを生成するコンパイラ装置であって、データ引用分類部２を設ける。
【００１６】
データ引用分類部２は、該原始プログラムの解析結果について、各データ引用を判別し、各該データ引用がポインタ間接引用、外部変数についての引用、及びアドレスを取られている変数の引用の何れかであることを条件として、当該データ引用をＡ分類とし、Ａ分類に属さない場合に当該データ引用をＢ分類とする。
【００１７】
データ依存関係設定部３は、データ引用分類部２の分類したＢ分類の全データ引用のみについて、該データ依存関係設定処理を行い、Ａ分類の全データ引用から取り出す、２個のデータ引用の組合せのうち少なくとも一方のデータ引用が値を定義するデータ引用であるすべての各組合せについて、無条件に解析不能を示す該データ依存関係値をデータ依存関係表に設定する。
【００１８】
【作用】
本発明のコンパイラ装置により、ポインタ間接引用についても、データ依存関係の無いことが明確な場合には、ベクトル化の可否が解析されて、可能な場合はベクトル化が実施される。
【００１９】
【実施例】
図３は、図１のデータ引用分類部２の処理の流れの一例を示す図であり、解析部１の解析結果による forループ等のベクトル化候補部分について、データ引用を順次調べるものとし、処理ステップ10で一つのデータ引用を取り出す。
【００２０】
処理ステップ11で、そのデータ引用がポインタ間接引用（即ち、ポインタをｐとして、前記説明のようにｐ[i]の形で行われている引用)か識別し、ポインタ
間接引用であれば処理ステップ14で分類Ａのデータ引用とする。
【００２１】
ポインタ間接引用でなければ、処理ステップ12で、そのデータ引用が外部変数 (即ち、関数定義等の外で定義されている変数) か識別し、外部変数であれば処理ステップ14で分類Ａのデータ引用とする。これは、以上のような外部変数であれば、外部でアドレスを取られている (後述) ことがあり得るからである。
【００２２】
以上の何れでもなければ、処理ステップ13で、そのデータ引用がアドレスを取られているか識別する。
ここで、アドレスを取られているとは、データ引用の配列変数が、そのアドレスを求められて、そのアドレス値をポインタに代入することが記述されれていることを言うものとし、従って前記説明のプログラムの例において＆演算子の対象になっている変数が典型的な例であるが、その他にもプログラミング言語の仕様上暗にアドレスを取られることになる場合についても考慮するものとする。
【００２３】
以上の識別の結果、アドレスを取られていれば処理ステップ14で分類Ａのデータ引用とし、以上３条件の何れでもない場合は処理ステップ15で、そのデータ引用を分類Ｂとし、以上の分類処理を、すべてのデータ引用について行ったか処理ステップ16で識別して繰り返す。
【００２４】
前記図２(b) のプログラム例のデータ引用について、以上の処理による分類結果を説明すると、この例では forループ内のデータ引用としてp[i]、a[i]、b[i]及びa[i+100]があるので、それらを順次取り出して調べる。
【００２５】
その結果、p[i]はポインタ間接引用の条件に該当し、a[i]は３条件の何れにも該当せず、b[i]はポインタ間接引用でも、外部変数でもないが、アドレスを取られている (図２(b) の▲５▼行) 条件に該当し、a[i+100]は何れの条件にも該当しないので、p[i]とb[i]が分類Ａ、a[i]とa[i+100]が分類Ｂとなる。
【００２６】
図４は、図１のデータ依存関係設定部３の処理の流れの一例を示す図であり、データ引用分類部２の分類結果により、各分類ごとに２個のデータ引用の対ごとに、データ依存関係を順次調べるものとし、先ず分類Ａについて処理ステップ20で一対のデータ引用を取り出す。
【００２７】
処理ステップ21で取り出した対の両データ引用が共に参照であれば（何れも、値を定義するデータ引用でなければ）、このデータ引用対についてデータ依存関係は無いので処理の必要が無いものとする。
【００２８】
対の少なくとも一方が値を定義するデータ引用であれば、処理ステップ22で、その対のデータ引用と、データ依存関係の値として「？」（解析不能）とをデータ依存関係表に設定する。
【００２９】
以上の処理を、分類Ａに分類されたデータ引用のすべての２個の組合せについて行うように、処理ステップ23で識別しながら、以上の処理を繰り返し、分類Ａの処理を終わると次に分類Ｂを処理する。
【００３０】
なお、前記例のプログラムの場合に、分類Ａのデータ引用はp[i]とb[i]であったので、この対を処理すると、両者ともにデータ参照であるので、データ依存関係は無いと判断される。
【００３１】
分類Ｂについては、２個のデータ引用の対ごとのデータ依存関係を、従来のデータ依存関係の解析処理と同様にして処理し、必要な各対についてデータ依存関係をデータ依存関係表に設定する。
【００３２】
即ち、処理ステップ24で分類Ｂのデータ引用の１対を取り出し、処理ステップ25、26で取り出した対の少なくとも一方が値を定義し、且つ同じ配列データのデータ引用であればデータ依存関係の解析を要するものとし、それ以外の対についてはデータ依存関係は無いので処理の必要が無いものとする。
【００３３】
データ依存関係の解析は処理ステップ27で、両データ引用の添字間の必要な計算等を行って識別し、データ依存関係有りと判断した場合には、処理ステップ28でデータ依存関係表にその対のデータ引用と、データ依存関係の計算結果の値とを設定する。
【００３４】
例えば、前記例で分類Ｂになったa[i]とa[i+100]の対については、両データ引用の添字iとi+100とについて、両者の差をとって-100を得、それを forループの増分１及びループ変数の係数１で割った結果の-100を計算値として求め、これをデータ依存関係の設定値とする。
【００３５】
この値は、これは後に図１の最適化実施部４が、通常の従来通りの処理により、ベクトル化の可否判断をし、又必要な場合に適当な最適化を行ってベクトル化可能にするための判断データとして使用する。
【００３６】
処理ステップ24から処理ステップ28までの以上の処理を、分類Ｂに分類されたデータ引用のすべての２個の組合せについて行うように、処理ステップ29で識別しながら処理を繰り返し、分類Ｂの処理を終わる。
【００３７】
最適化実施部４は、以上で作成されたデータ依存関係表を参照して最適化処理を行う。
その処理は従来と同様であるので詳細を省略するが、データ依存関係表に従来のように無条件にデータ依存関係「？」が設定されるのではなく、本発明により前記プログラム例の forループであれば、a[i]とa[i+100]の対のみについて、計算されたデータ依存関係値「-100」が設定されているので、それに基づいて実効的な最適化処理が実施される。
【００３８】
【発明の効果】
以上の説明から明らかなように本発明によれば、計算機プログラムのコンパイルにおけるベクトル化による最適化処理に際し、ポインタ間接引用についても、データ依存関係の無いことが明確な場合には、ベクトル化の可否が解析されて、可能な場合はベクトル化が実施されるようになるので、ベクトル化率を向上して効率の良い目的プログラムを生成できるという著しい工業的効果がある。
【図面の簡単な説明】
【図１】  本発明の構成を示すブロック図
【図２】  プログラム例を説明する図
【図３】  本発明の処理の流れ図（その１）
【図４】  本発明の処理の流れ図（その２）
【符号の説明】
１  解析部
２  データ引用分類部
３  データ依存関係設定部
４  最適化実施部
５  コード生成部
10〜16、20〜29  処理ステップ
【図１】
0003658771.tif 000002
【図２】
0003658771.tif 000003
【図３】
0003658771.tif 000004
【図４】
0003658771.tif 000005