(57)【要約】【課題】作業配列を使ってループ制御文をベクトル化する方法では高速化に限度があること。【解決手段】ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータは、ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識するループ解析部と、ループ制御文をベクトル化するベクトル化実行部とを含む。ベクトル化実行部は、オブジェクトプログラム中に第１のプログラム部分と第２のプログラム部分とを挿入する。第１のプログラム部分は、リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、リスト構造データのノード数をスカラレジスタに書き込む。第２のプログラム部分は、ベクトルレジスタに書き込まれたリスト構造データの各ノードの先頭アドレスとスカラレジスタに書き込まれたリスト構造データのノード数とを使って、ループ制御文をベクトル化する。【選択図】図１５
2019012324.tif 000002
【特許請求の範囲】
【請求項１】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータに、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識する処理と、
前記ループ制御文をベクトル化する処理を行わせ、
前記ベクトル化する処理では、
前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入する、
コンパイラ。
【請求項２】
前記第１のプログラム部分は、第１のベクトル命令を含み、
前記第１のベクトル命令は、オペランドの所定のフィールドで、リスト構造データの各ノードの先頭アドレスを書込むベクトルレジスタ％ｖ０、リスト構造データのノードの個数を書込むスカラレジスタ％ｓ０，リスト構造データの区間の先頭のアドレスを指すスカラレジスタ％ｓ１，リスト構造データの区間の末尾のアドレスを指すスカラレジスタ％ｓ２，リスト構造内の次のデータのポインタの位置を指すスカラレジスタ％ｓ３を指定する構成とされている、
請求項１に記載のコンパイラ。
【請求項３】
前記第１のプログラム部分は、第２のベクトル命令を含み、
前記第２のベクトル命令は、オペランドの所定のフィールドで、リスト構造データの各ノードの先頭アドレスを書込むベクトルレジスタ％ｖ０，リスト構造データのノードの個数を書込むスカラレジスタ％ｓ０，リスク構造データの区間の先頭のアドレスを指すスカラレジスタ％ｓ１，リスト構造内の次のデータのポインタの位置を指すスカラレジスタ％ｓ２を指定する構成とされている、
請求項１に記載のコンパイラ。
【請求項４】
前記第１のプログラム部分は、第３のベクトル命令とマスク生成命令とマスク先行ゼロカウント命令を含み、
前記第３のベクトル命令は、オペランドの所定のフィールドで、リスト構造データの各ノードの先頭アドレスおよび終端を示す終端文字を書込むベクトルレジスタ％ｖ０，リスト構造データの区間の先頭のアドレスを指すスカラレジスタ％ｓ０，リスト構造データの区間の末尾のアドレスを指すスカラレジスタ％ｓ１，リスト構造内の次のデータのポインタの位置を指すスカラレジスタ％ｓ２を指定する構成とされ、
前記マスク生成命令は、オペランドの所定のフィールドで、前記ベクトルレジスタ％ｖ０，マスクを生成するレジスタｍｒｅｇ１を指定する構成とされ、
前記マスク先行ゼロカウント命令は、オペランドの所定のフィールドで、前記レジスタｍｒｅｇ１，前記マスクの先頭から０が連続する数をノードの個数として格納するスカラレジスタを指定する構成とされている、
請求項１に記載のコンパイラ。
【請求項５】
前記第１のプログラム部分は、第４のベクトル命令とマスク生成命令とマスク先行ゼロカウント命令を含み、
前記第４のベクトル命令は、オペランドの所定のフィールドで、リスト構造データの各先頭アドレスおよび終端を示す終端文字を書込むベクトルレジスタ％ｖ０，リスト構造データの区間の先頭のアドレスを指すスカラレジスタ％ｓ０，リスト構造内の次のデータのポインタの位置（図１のｎｅｘｔ）を指すスカラレジスタ％ｓ１を指定する構成とされ、
前記マスク生成命令は、オペランドの所定のフィールドで、前記ベクトルレジスタ％ｖ０，マスクを生成するレジスタｍｒｅｇ１を指定する構成とされ、
前記マスク先行ゼロカウント命令は、オペランドの所定のフィールドで、前記レジスタｍｒｅｇ１，前記マスクの先頭から０が連続する数をノードの個数として格納するスカラレジスタを指定する構成とされている、
請求項１に記載のコンパイラ。
【請求項６】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータであって、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識するループ解析部と、
前記ループ制御文をベクトル化するベクトル化実行部と、
を含み、
前記ベクトル化実行部は、前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入するように構成されている、
コンピュータ。
【請求項７】
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータが実行するコード生成方法であって、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識し、
前記ループ制御文をベクトル化し、
前記ベクトル化では、
前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入する、
コンピュータのコード生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラ、コンピュータ、およびコンピュータのコード生成方法に関する。
【背景技術】
【０００２】
リスト構造データは、自分自身と同じ型の構造体へのポインタをメンバに持つデータであり、自己参照構造体とも呼ばれる。リスト構造データは、追加や削除が頻繁に行われる大量のデータを処理するのに適している。
【０００３】
図１は、リスト構造データｓｔｒｕｃｔ  Ａにより形成されるリストのメモリ上の構成を示す図である。図１中、１つの矩形が１つの構造体１−１を表す。構造体はノードとも呼ばれる。この例の構造体は、ｄｏｕｂｌｅ型データｘ，ｙ，ｚとポインタｎｅｘｔをメンバにもつ。ｆｉｒｓｔは、リスト構造データｓｔｒｕｃｔ  Ａの並びの区間の先頭のアドレスを表す。ａｄｄｒ１，…，ａｄｄｒＮは、各構造体の先頭アドレスを表す。ｌａｓｔは、リスト構造データｓｔｒｕｃｔ  Ａの並びの区間の終了アドレスを表す。
【０００４】
図２は、リスト構造データｓｔｒｕｃｔ  Ａを処理するループ制御文を持つＣ言語のソースプログラムの一例を示す図である。文２−１は、リスト構造データｓｔｒｕｃｔ  Ａのデータ宣言文である。リスト構造データｓｔｒｕｃｔ  Ａが自分自身を再帰的に指している。文４−２は、リストをたどりリスト構造データｓｔｒｕｃｔ  Ａを繰り返し処理するループ制御文である。
【０００５】
そして、図２に示すようなリスト構造データｓｔｒｕｃｔ  Ａを処理するループ制御文を含むプログラムの高速化を可能にするコンパイラが、例えば特許文献１に記載されている。図１３は、特許文献１に記載のコンパイラによるループ制御文の変形結果を示す図である。図１３を参照すると、特許文献１に記載のコンパイラは、ループ制御文１３−１を文１３−２〜１３−５のように変形することによって、リスト構造データを含むループをベクトル化している。ここで、文１３−２は、リスト構造データｓｔｒｕｃｔ  Ａのノード数をカウントする制御文である。また、文１３−３は、メモリ上に作業配列を確保する宣言文である。また、文１３−４は、確保した作業配列にリスト構造データｓｔｒｕｃｔ  Ａの各ノードの先頭アドレスを登録する制御文である。そして、文１３−５が、作業配列の配列要素を参照するための添字を使って元のループ制御文１３−１と等価な処理を行うループ制御文である。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００３−３３７７０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載のコンパイラは、リスト構造データの先頭アドレスをメモリ上の作業配列に割り当てるようにして、リスト構造データを繰り返し処理するループ制御文のベクトル化を行っている。しかしながら、プログラム実行時にメモリ上の作業配列へのアクセスが行われるため、実行速度の高速化には限度がある。
【０００８】
本発明の目的は、上述した課題、即ち、作業配列を使ってループ制御文をベクトル化する方法では高速化に限度がある、という課題を解決するコンパイラを提供することにある。
【課題を解決するための手段】
【０００９】
本発明の一形態に係るコンパイラは、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータに、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識する処理と、
前記ループ制御文をベクトル化する処理を行わせ、
前記ベクトル化する処理では、
前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入する。
【００１０】
また、本発明の他の形態に係るコンピュータは、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータであって、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識するループ解析部と、
前記ループ制御文をベクトル化するベクトル化実行部と、
を含み、
前記ベクトル化実行部は、前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入するように構成されている。
【００１１】
また、本発明の他の形態に係るコンピュータのコード生成方法は、
ソースプログラムからベクトル計算機に対するオブジェクトプログラムを生成するコンピュータが実行するコード生成方法であって、
前記ソースプログラムを解析してリスト構造データを繰り返し処理するループ制御文を認識し、
前記ループ制御文をベクトル化し、
前記ベクトル化では、
前記オブジェクトプログラム中に、
前記リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、前記リスト構造データのノード数をスカラレジスタに書き込む第１のプログラム部分と、
前記ベクトルレジスタに書き込まれた前記リスト構造データの各ノードの先頭アドレスと前記スカラレジスタに書き込まれた前記リスト構造データのノード数とを使って、前記ループ制御文をベクトル化した第２のプログラム部分とを、
挿入する。
【発明の効果】
【００１２】
本発明は上述した構成を有することにより、作業配列を使ってループ制御文をベクトル化するのに比べて、ループ制御文の実行速度の高速化が可能になる。
【図面の簡単な説明】
【００１３】
【図１】リスト構造データｓｔｒｕｃｔ  Ａにより形成されるリストのメモリ上の構成を示す図である。
【図２】リスト構造データｓｔｒｕｃｔ  Ａを処理するループ制御文を持つＣ言語のソースプログラムの一例を示す図である。
【図３】ベクトル化するリスト構造データの各先頭アドレスを格納するベクトルレジスタとベクトル収集命令の処理の説明図である。
【図４】ベクトル化するリスト構造データの各先頭アドレスを格納するベクトルレジスタとベクトル拡散命令の処理の説明図である。
【図５】本発明の第１の実施形態に係るコンパイラの構成例を示す図である。
【図６】本発明の第１の実施形態におけるＶＬＩＳＴ２命令の対象となる、区間の最後がＮＵＬＬ（終端文字）と決めているリスト構造データにより形成されるリストのメモリ上の構成とベクトルレジスタの内容を示す図である。
【図７】本発明の第１の実施形態におけるＶＬＩＳＴ２命令の対象となる、リスト構造データにより形成されるリストのメモリ上の構成とベクトルレジスタの内容を示す図である。
【図８】本発明の第１の実施形態におけるソースプログラムから生成される命令列の例を示す図である。
【図９】本発明の第１の実施形態におけるソースプログラムから生成される他の命令列の例を示す図である。
【図１０】本発明の第１の実施形態におけるソースプログラムから生成される別の命令列の例を示す図である。
【図１１】本発明の第１の実施形態で使用するマスク生成命令とマスク先行ゼロカウント命令の処理の説明図である。
【図１２】本発明の第１の実施形態におけるソースプログラムから生成される更に別の命令列の例を示す図である。
【図１３】本発明に関連するコンパイラによってソースプログラムから生成される命令列の例を示す図である。
【図１４】本発明の第１の実施形態に係るコンパイラを実現するコンピュータのハードウェア構成の一例を示す図である。
【図１５】本発明の第２の実施形態に係るコンパイラのブロック図である。
【発明を実施するための形態】
【００１４】
次に本発明の実施の形態について図面を参照して詳細に説明する。
[第１の実施形態]
図５を参照すると、本発明の第１の実施形態に係るコンパイラ５は、ソースプログラム５−３を翻訳してオブジェクトコード５−４を生成する。生成されたオブジェクトコードは、ベクトル計算機で実行される。このようにコンパイラ５は、ベクトル計算機に対するオブジェクトプログラムを生成する。
【００１５】
コンパイラ５は、ループ解析部５−１とベクトル化実行部５−２とを含んで構成されている。
【００１６】
ループ解析部５−１は、ソースプログラム５−３を解析してリスト構造データを含むループのベクトル化ができるか否かを判定する。ループ解析部５−１は、リスト構造データを含むループの認識手段（以下、認識手段と呼ぶ）５−１−１、リスト構造データの構造解析手段（以下、構造解析手段と呼ぶ）５−１−２、および、ベクトル化判定手段５−１−３を含んで構成されている。
【００１７】
認識手段５−１−１は、ソースプログラム５−３中のリスト構造データを含むループを検出する。構造解析手段５−１−２は、認識手段５−１−１で検出したループに含まれるリスト構造を解析する。ベクトル化判定手段５−１−３は、認識手段５−１−１で検出したループがベクトル化できるか否かを判定する。
【００１８】
ベクトル化実行部５−２は、ループ解析部５−１の解析結果に基づきループをベクトル化する。ベクトル化実行部５−２は、リスト構造先頭アドレス・リスト構造ノード数取得命令生成手段（以下、ＶＬＩＳＴ命令生成手段と呼ぶ）５−２−１、ベクトル長ロード命令生成手段５−２−２、ベクトル収集命令生成手段５−２−３、ベクトル演算命令生成手段５−２−４、および、ベクトル拡散命令生成手段５−２−５を含んで構成されている。
【００１９】
ＶＬＩＳＴ命令生成手段５−２−１は、リスト構造の先頭アドレスのリストおよびリスト構造データのノード数を取得するベクトル命令であるリスト構造先頭アドレス・リスト構造ノード数取得命令（以下、ＶＬＩＳＴ命令と呼ぶ）を生成する。ベクトル長ロード命令生成手段５−２−２は、ＶＬＩＳＴ命令によって取得されたノード数をベクトル長に設定するベクトル長ロード命令を生成する。ベクトル収集命令生成手段５−２−３は、メモリ上のリスト構造データをベクトルレジスタにロードするベクトル収集命令を生成する。ベクトル演算命令生成手段５−２−４は、ベクトルレジスタにロードされたデータの演算を行い、演算結果をベクトルレジスタに格納するベクトル演算命令を生成する。ベクトル拡散命令生成手段５−２−５は、ベクトルレジスタに格納された演算結果を、メモリ上のリスト構造データにストアするベクトル拡散命令を生成する。
【００２０】
コンパイラ５は、例えば図１４に示すようなパーソナルコンピュータ等の情報処理装置１４−１とプログラム１４−２とで実現することができる。情報処理装置１４−１は、キーボードやマウスなどの操作入力部１４−１−１と、液晶ディスプレイ等の画面表示部１４−１−２と、通信インタフェース部１４−１−３と、メモリやハードディスク等の記憶部１４−１−４と、１以上のマイクロプロセッサ等の演算処理部１４−１−５とを有する。プログラム１４−２は、情報処理装置１４−１の立ち上げ時等に外部のコンピュータ読み取り可能な記憶媒体から記憶部１４−１−４に読み込まれ、演算処理部１４−１−５の動作を制御することにより、演算処理部１４−１−５上に、コンパイラ５を実現する。
【００２１】
＜本実施形態の説明＞
次に、図１〜図１２を用いてコンパイラ５の動作について説明する。
【００２２】
図２は、前述したように、リスト構造データを含むループを有するＣ言語のソースプログラムである。コンパイラ５のループ解析部５−１は、このようなループを有するソースプログラム５−３を解析する。
【００２３】
まず、認識手段５−１−１は、ソースプログラム５−３中から図２のループ制御文２−２のような、ループ内にリスト構造データを持つループを検出する。
【００２４】
次に、構造解析手段５−１−２は、検出されたループに含まれるリスト構造データを解析する。リスト構造データの解析では、リスト構造データ内の次のノードを指すポインタがリスト構造データ内のどの位置にあるかを解析する。図２に示したリスト構造データにおいて、ｄｏｕｂｌｅ型データを８バイトとすると、ｘ，ｙ，ｚの後に位置するｎｅｘｔは、ノードの先頭アドレスから２４バイト目に位置することとなる。つまり、図２に示すリスト構造データでは、次のノードを指すポインタの位置はノードの先頭から２４バイト目となる。
【００２５】
次に、コンパイラ５のベクトル化判定手段５−１−３は、検出されたループがベクトル化できるか否かを判定する。ベクトル化できる条件としては、ループ内のリスト構造データ、配列、変数の定義・参照関係にベクトル化を阻害する依存関係がないことが挙げられる。
【００２６】
ループ解析部５−１の処理が終わると、ベクトル化実行部５−２による処理が行われる。ベクトル化実行部５−２は、ループ解析部５−１におってベクトル化できると判定されたリスト構造データを含むループを、以下のようにベクトル化する。
【００２７】
まず、ＶＬＩＳＴ命令生成手段５−２−１は、ベクトル化するリスト構造データの各先頭アドレスのリストとリスト構造データのノードの個数をレジスタにロードするためのＶＬＩＳＴ命令を生成する。このＶＬＩＳＴ命令が実行されることによって、ベクトル化するリスト構造データの各先頭アドレスがベクトルレジスタに格納される。例えば、図３に示すｆｉｒｓｔからｌａｓｔまでの区間のリスト構造データに対してＶＬＩＳＴ命令が実行されると、図３に示すように、リスト構造データの各先頭アドレスのリストがベクトルレジスタ３−１に格納される。また、ＶＬＩＳＴ命令によって、リスト構造データのノードの個数が図示しないスカラレジスタに格納される。ＶＬＩＳＴ命令の詳細については後述する。
【００２８】
次に、ベクトル長ロード命令生成手段５−２−２は、ＶＬＩＳＴ命令により得られたノードの個数をベクトル長として設定する。
【００２９】
次に、ベクトル収集命令生成手段５−２−３は、ベクトル収集命令を生成する。ベクトル収集命令は、ベクトルレジスタの各要素に格納されているアドレスのメモリデータを、別のベクトルレジスタの対応する要素に格納するように、メモリからデータをロードするものである。ベクトル収集命令生成手段５−２−３は、ＶＬＩＳＴ命令により得られたリスト構造データの先頭アドレスのリストを格納するベクトルレジスタ３−１を指定したベクトル収集命令を生成する。これによって、図３に示すように、ベクトルレジスタ３−１の各要素に格納されているアドレスのメモリデータを、メモリ３−２からベクトルレジスタ３−３へロードするベクトル収集命令が生成される。
【００３０】
次に、ベクトル演算命令生成手段５−２−４は、ベクトル収集命令によりベクトルレジスタ３−３へロードされたデータを指定してベクトル演算を実行し、結果を別のベクトルレジスタへ格納するベクトル演算命令を生成する。
【００３１】
次に、ベクトル拡散命令生成手段５−２−５は、ベクトル拡散命令を生成する。ベクトル拡散命令は、ベクトルレジスタの各要素に格納されているアドレスのメモリ領域へ、別のベクトルレジスタの対応する要素のデータを格納するように、メモリにデータをストアするものである。ベクトル拡散命令生成手段５−２−５は、ベクトル演算命令により得られた演算結果を格納するベクトルレジスタおよびリスト構造データの先頭アドレスのリストを格納するベクトルレジスタを指定したベクトル拡散命令を生成する。これによって、図４に示すように、ベクトルレジスタ４−３に格納されているベクトル演算により得られた演算結果を、ベクトルレジスタ４−１に格納されているリスト構造データの先頭アドレスのメモリ４−２の領域へストアするベクトル拡散命令が生成される。
【００３２】
次に、ＶＬＩＳＴ命令の例について詳述する。
【００３３】
＜ＶＬＩＳＴ命令の例１＞
一つ目の例のＶＬＩＳＴ命令（以下、ＶＬＩＳＴ１命令と呼ぶ）は、以下のように、オペランドの所定のフィールドで、％ｖ０，％ｓ０，％ｓ１，％ｓ２，％ｓ３の合計５個のレジスタを指定する構成とされている。
ＶＬＩＳＴ１命令  ％ｖ０，％ｓ０，％ｓ１，％ｓ２，％ｓ３
【００３４】
％ｖ０は、リスト構造データの各ノードの先頭アドレスを書込むベクトルレジスタである。％ｓ０は、リスト構造データのノードの個数を書込むスカラレジスタである。％ｓ１は、命令の対象となるリスト構造データの区間の先頭のアドレス（図１のｆｉｒｓｔ）を指すスカラレジスタである。％ｓ２は、命令の対象となるリスト構造データの区間の末尾のアドレス（図１のｌａｓｔ）を指すスカラレジスタである。％ｓ３は、命令の対象となるリスト構造データの構造解析手段５−１−２により取得したリスト構造内の次のデータのポインタの位置（図１のｎｅｘｔ）を指すスカラレジスタである。
【００３５】
ＶＬＩＳＴ１命令を命令セットに含むベクトル計算機では、ＶＬＩＳＴ１命令が発行されると、スカラレジスタ％ｓ１、％ｓ２、および％ｓ３で指定されるｆｉｒｓｔ、ｌａｓｔ、ｎｅｘｔによって特定されるリスト構造データの各ノードの先頭アドレスを取得してベクトルレジスタ％ｖ０に格納する処理と、ノードの個数を計数してスカラレジスタ％ｓ０に格納する処理とが、１命令に係る処理として行われる。
【００３６】
＜ＶＬＩＳＴ命令の例２＞
二つ目の例のＶＬＩＳＴ命令（以下、ＶＬＩＳＴ２命令と呼ぶ）は、以下のように、オペランドの所定のフィールドで、％ｖ０，％ｓ０，％ｓ１，％ｓ２の合計４個のレジスタを指定する構成とされている。
ＶＬＩＳＴ２命令  ％ｖ０，％ｓ０，％ｓ１，％ｓ２
【００３７】
％ｖ０は、リスト構造データの各ノードの先頭アドレスを書込むベクトルレジスタである。％ｓ０は、リスト構造データのノードの個数を書込むスカラレジスタである。％ｓ１は、命令の対象となるリスク構造データの区間の先頭のアドレス（図１のｆｉｒｓｔ）を指すスカラレジスタである。％ｓ２は、命令の対象となるリスト構造データの構造解析手段５−１−２により取得したリスト構造内の次のデータのポインタの位置（図１のｎｅｘｔ）を指すスカラレジスタである。一つ目の例のＶＬＩＳＴ１命令とは異なり、ＶＬＩＳＴ２命令は、命令の対象となるリスト構造データの区間の末尾のアドレス（図１のｌａｓｔ）を指すオペランドはない。その理由は、ＶＬＩＳＴ２命令は、図６の６−１のＮＵＬＬに示すように、区間の最後はＮＵＬＬ（終端文字）と決めているためである。このように、ＶＬＩＳＴ２命令は、区間の末尾のアドレスを指すスカラレジスタを減らして、オペランド数を削減している。
【００３８】
ＶＬＩＳＴ２命令を命令セットに含むベクトル計算機では、ＶＬＩＳＴ２命令が発行されると、スカラレジスタ％ｓ１および％ｓ２で指定されるｆｉｒｓｔ、ｎｅｘｔによって特定されるリスト構造データの各ノードの先頭アドレスを取得してベクトルレジスタ％ｖ０に格納する処理と、ノードの個数を計数してスカラレジスタ％ｓ０に格納する処理とが、１命令に係る処理として行われる。
【００３９】
＜ＶＬＩＳＴ命令の例３＞
三つ目の例のＶＬＩＳＴ命令（以下、ＶＬＩＳＴ３命令と呼ぶ）は、以下のように、オペランドの所定のフィールドで、％ｖ０，％ｓ０，％ｓ１，％ｓ２の合計４個のレジスタを指定する構成とされている。
ＶＬＩＳＴ３命令  ％ｖ０，％ｓ０，％ｓ１，％ｓ２
【００４０】
％ｖ０は、リスト構造データの各ノードの先頭アドレスを書込むベクトルレジスタである。％ｓ０は、リスト構造データの区間の先頭のアドレス（図１のｆｉｒｓｔ）を指すスカラレジスタである。％ｓ１は、リスト構造データの区間の末尾のアドレス（図１のｌａｓｔ）を指すスカラレジスタである。％ｓ２は、リスト構造データの構造解析手段５−１−２により取得したリスト構造内の次のデータのポインタの位置（図１のｎｅｘｔ）を指すスカラレジスタである。ＶＬＩＳＴ１，ＶＬＩＳＴ２とは異なり、ＶＬＩＳＴ３には、リスト構造データのノードの個数を書込むスカラレジスタを指定するオペランドは無い。
【００４１】
ＶＬＩＳＴ３命令を命令セットに含むベクトル計算機では、ＶＬＩＳＴ３命令が発行されると、スカラレジスタ％ｓ０、％ｓ１、および％ｓ２で指定されるｆｉｒｓｔ、ｌａｓｔ、ｎｅｘｔによって特定されるリスト構造データの各ノードの先頭アドレスを取得して、図７に示すようにベクトルレジスタ％ｖ０（７−１）に格納する処理と、末尾のアドレスの次の要素をＮＵＬＬ（終端文字）にする処理とが、１命令に係る処理として行われる。ここで、ベクトルレジスタ７−１の末尾のアドレスの次の要素をＮＵＬＬ（終端文字）にする理由は、ベクトルレジスタ７−１の何番目の要素までアドレスを格納したかを把握することができるようにするためである。ノードの個数の算出は、ＶＬＩＳＴ３命令に引き続く別の命令によって行われる（詳細は図１０を参照して後述する）。
【００４２】
＜ＶＬＩＳＴ命令の例４＞
四つ目の例のＶＬＩＳＴ命令（以下、ＶＬＩＳＴ４と呼ぶ）は、以下のように、オペランドの所定のフィールドで、％ｖ０，％ｓ０，％ｓ１の合計３個のレジスタを指定する構成とされている。
ＶＬＩＳＴ４命令  ％ｖ０，％ｓ０，％ｓ１
【００４３】
％ｖ０は、リスト構造データの各先頭アドレスを書込むベクトルレジスタである。％ｓ０は、リスト構造データの区間の先頭のアドレス（図１のｆｉｒｓｔ）を指すスカラレジスタである。％ｓ１は、リスト構造データの構造解析手段５−１−２により取得したリスト構造内の次のデータのポインタの位置（図１のｎｅｘｔ）を指すスカラレジスタである。ＶＬＩＳＴ４命令は、三つ目の例のＶＬＩＳＴ３命令から区間の末尾のアドレス（図１のｌａｓｔ）を指すスカラレジスタのオペランドを無くした例である。ＶＬＩＳＴ４命令は、二つ目の例のＶＬＩＳＴ２命令と同様に、区間の最後はＮＵＬＬ（終端文字）と決めてオペランド数を減らしている。
【００４４】
ＶＬＩＳＴ４命令を命令セットに含むベクトル計算機では、ＶＬＩＳＴ４命令が発行されると、スカラレジスタ％ｓ０および％ｓ１で指定されるｆｉｒｓｔ、ｎｅｘｔによって特定されるリスト構造データの各ノードの先頭アドレスを取得して、ベクトルレジスタ％ｖ０に格納する処理と、末尾のアドレスの次の要素をＮＵＬＬ（終端文字）にする処理とが、１命令に係る処理として行われる。また、ノードの個数の算出は、ＶＬＩＳＴ３命令と同様に、ＶＬＩＳＴ４命令に引き続く別の命令によって行われる。
【００４５】
次に、図２に示したソースプログラムをコンパイルしたときに生成される命令列の例を図８〜図１０、図１２を参照して説明する。
【００４６】
＜命令列の例１＞
図８は、ＶＬＩＳＴ１命令を用いた場合に生成される命令列である。最初のＶＬＩＳＴ１命令は、リスト構造データの各ノードの先頭アドレスのリストをベクトルレジスタｖｒｅｇ１にロードし、そのノードの個数をスカラレジスタｓｒｅｇ１にロードする。次のＬＶＬ命令（ベクトル長ロード命令）は、スカラレジスタｓｒｅｇ１によりノードの個数を指定してベクトル長をロードする。次のＶＧＴ命令（ベクトル収集命令）は、ベクトルレジスタｖｒｅｇ１を指定してｘのデータをメモリからベクトルレジスタｖｒｅｇ２にロードしている。次のＶＡＤＤ命令（ベクトル加算命令）は、ｙのアドレスのリストをベクトルレジスタｖｒｅｇ３に格納する。即ち、ｙのデータはｘの次に位置するためｄｏｕｂｌｅ型を８バイトとすると、ｙはｓｔｒｕｃｔ  Ａの先頭から８バイト目に位置することになる。そのため、先頭アドレスのリスト（ｖｒｅｇ１）にＶＡＤＤ命令で８を加算した演算結果をベクトルレジスタｖｒｅｇ３に格納している。次のＶＧＴ命令は、ベクトルレジスタｖｒｅｇ３を指定してｙのデータをメモリからベクトルレジスタｖｒｅｇ４にロードする。次のＶＭＵＬ命令（ベクトル乗算命令）は、ベクトルレジスタｖｒｅｇ２，ｖｒｅｇ４にロードしたｘ，ｙを乗算し、演算結果をベクトルレジスタｖｒｅｇ５に格納する。つぎのＶＡＤＤ命令は、ｚのアドレスのリストをベクトルレジスタｖｒｅｇ６に格納する。即ち、ｚのデータはｓｒｕｃｔ  Ａの先頭から１６バイト目に位置するので、先頭アドレスのリストに１６を加算した演算結果をベクトルレジスタｖｒｅｇ６に格納している。次のＶＳＣ命令（ベクトル拡散命令）は、ベクトルレジスタｖｒｅｇ６を指定して、ベクトルレジスタｖｒｅｇ５の乗算結果を各ノードのｚの位置へストアする。
【００４７】
＜命令列の例２＞
図９は、ＶＬＩＳＴ２命令を用いた場合に生成される命令列である。リスト構造データの末尾をＮＵＬＬ（終端文字）と決めているため、ＶＬＩＳＴ２命令が使用される。それ以外は図８とは変わらない。
【００４８】
＜命令列の例３＞
図１０は、ＶＬＩＳＴ３命令を用いた場合に生成される命令列である。前述したように、ＶＬＩＳＴ３命令では、リスト構造データの先頭アドレスのリストをベクトルレジスタにロードするとき、末尾のアドレスの次の要素をＮＵＬＬ（終端文字）にする。即ち、ＶＬＩＳＴ３命令でリスト構造データの先頭アドレスをロードしたときのベクトルレジスタは、図１１のベクトルレジスタ１１−１のようになり、最後の要素がＮＵＬＬとなる。そこで、図１０の命令列では、ＶＦＭＫ．ＥＱ命令（マスク生成命令）により、図１１に示すように、ベクトルレジスタ１１−２にマスクを生成する。ＶＦＭＫ．ＥＱ命令ではオペランドの所定のフィールドで指定されたベクトルレジスタｖｒｅｇ１（１１−１）の要素がＮＵＬＬと等しい場合は１、それ以外は０の要素となるマスクをオペランドの所定のフィールドで指定されたマスクレジスタに生成する。そして、生成されたマスクを指定したＬＺＶＭ命令（マスク先行ゼロカウント命令）を続ける。ＬＺＶＭ命令は、オペランドの所定のフィールドで指定されたベクトルレジスタ１１−２のマスクの先頭から０がいくつ連続して続くかをカウントし、そのカウント結果であるノードの個数をオペランドの所定のフィールドで指定された図１１のスカラレジスタ１１−３（ｓｒｅｇ１）に格納する。その後は図８、図９と同様である。
【００４９】
＜命令列の例４＞
図１２は、ＶＬＩＳＴ４命令を用いた場合に生成される命令列である。リスト構造データの末尾をＮＵＬＬ（終端文字）と決めているためＶＬＩＳＴ４命令が使用される。それ以外は図１０とは変わらない。
【００５０】
＜本実施形態の効果＞
このように本実施形態によれば、リスト構造データを含むループ制御文のベクトル化が可能となる。そして、ループのベクトル化によりプログラムの実行性能を向上させることができる。
【００５１】
また、特許文献１では、図１３の文１３−３、１３−４のように作業配列のメモリを確保してリスト構造データの各ノードの先頭アドレスをストアする。これに対して本実施形態では、リスト構造データの各ノードの先頭アドレスをベクトルレジスタに直接ロードする。そのためメモリの確保は不要である。また、作業配列であるメモリがベクトルレジスタに置き換わるためデータ転送も高速になる。
【００５２】
また、特許文献１においては、リスト構造データのノード数のカウントと先頭アドレスのストアのために図１３の文１３−２、１３−４のように２回ループでリスト構造をたどっている。これに対して本実施形態では、ＶＬＩＳＴ命令により１回リスト構造をたどるだけでよく処理を減らせる。
【００５３】
本実施形態は、以上の構成および動作を基本としつつ、各種の付加変更が可能である。例えば、ベクトル長が最大ベクトル長（ベクトルレジスタの要素数）を超える場合は、コンパイラ５は、最大ベクトル長のノード数を処理した後、リスト構造データの先頭アドレスがロードされたベクトルレジスタの最後尾のノードの次のノードから処理を再開することで、最大ベクトル長を超えるループを処理する。
【００５４】
[第２の実施形態]
図１５を参照すると、本発明の第２の実施形態に係るコンピュータ１５は、ソースプログラム１５−３からベクトル計算機に対するオブジェクトプログラム１５−４を生成するために、ループ解析部１５−１とベクトル化実行部１５−２とを含んで構成される。
【００５５】
ループ解析部１５−１は、ソースプログラム１５−３を解析してリスト構造データを繰り返し処理するループ制御文を認識する。ループ解析部１５−１は、例えば図５のループ解析部５−１と同様に構成することができるが、それに限定されない。ベクトル化実行部１５−２は、ループ解析部１５−１で認識されたループ制御文をベクトル化する。ベクトル化実行部１５−２は、例えば図５のベクトル化実行部５−２と同様に構成することができるが、それに限定されない。
【００５６】
ベクトル化実行部１５−２は、オブジェクトプログラム１５−４中に、第１のプログラム部分１５−５と第２のプログラム部分１５−６とを挿入するように構成されている。第１のプログラム部分１５−５は、リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込み、リスト構造データのノード数をスカラレジスタに書き込む命令を含んでいる。第２のプログラム部分１５−６は、ベクトルレジスタに書き込まれたリスト構造データの各ノードの先頭アドレスとスカラレジスタに書き込まれたリスト構造データのノード数とを使って、ループ制御文をベクトル化している。
【００５７】
次に、本実施形態に係るコンピュータ１５によるコード生成方法について説明する。
【００５８】
まず、ループ解析部１５−１は、ソースプログラム１５−３を解析してリスト構造データを繰り返し処理するループ制御文を認識する。次に、ベクトル化実行部１５−２は、ループ制御文をベクトル化したオブジェクトプログラム１５−４を生成する。上記ベクトル化では、オブジェクトプログラム１５−４中に、第１のプログラム部分１５−５と第２のプログラム部分１５−６をと挿入する。
【００５９】
このように本実施形態によれば、作業配列を使ってループ制御文をベクトル化するのに比べて、リスト構造データを繰り返し処理するループ制御文の実行速度の高速化が可能になる。
【００６０】
その理由は、オブジェクトプログラム１５−４は、リスト構造データの各ノードの先頭アドレスをベクトルレジスタに書き込む第１のプログラム部分１５−５と、ベクトルレジスタに書き込まれたリスト構造データの各ノードの先頭アドレスを使ってループ制御文をベクトル化する第２のプログラム部分１５−６とを含んで構成されているためである。
【産業上の利用可能性】
【００６１】
本発明は、ＨＰＣ（Ｈｉｇｈ−Ｐｅｒｆｏｒｍａｎｃｅ−Ｃｏｍｐｕｔｉｎｇ）分野、ベクトルプロセッサを有する計算機に利用でき、特にリスト構造データを繰り返し処理するループ制御文を含むソースプログラムをコンパイルしてオブジェクトプログラムを生成する分野に利用できる。
【符号の説明】
【００６２】
１−１…構造体（ノード）
２−１…リンク構造体のデータ宣言文
２−２…ループ制御文
３−１…ベクトルレジスタ
３−２…メモリ
３−３…ベクトルレジスタ
４−１…ベクトルレジスタ
４−２…メモリ
４−３…ベクトルレジスタ
５…コンパイラ
５−１…ループ解析部
５−１−１…リスト構造データを含むループの認識手段
５−１−２…リスト構造データの構造解析手段
５−１−３…ベクトル化判定手段
５−２…ベクトル化実行部
５−２−１…リスト構造先頭アドレス・リスト構造ノード数取得命令生成手段
５−２−２…ベクトル長ロード命令生成手段
５−２−３…ベクトル収集命令生成手段
５−２−４…ベクトル演算命令生成手段
５−２−５…ベクトル拡散命令生成手段
５−３…ソースプログラム
５−４…オブジェクトコード
６−１…ＮＵＬＬ（終端文字）
７−１…ベクトルレジスタ
１１−１…ベクトルレジスタ
１１−２…マスクレジスタ
１１−３…スカラレジスタ
１３−１…ループ制御文
１３−２〜１３−５…文
１４−１…情報処理装置
１４−２…プログラム
１４−１−１…操作入力部
１４−１−２…画面表示部
１４−１−３…通信インタフェース部
１４−１−４…記憶部
１４−１−５…演算処理部
１５…コンピュータ
１５−１…ループ解析部
１５−２…ベクトル化実行部
１５−３…ソースプログラム
１５−４…オブジェクトプログラム
１５−５…第１のプログラム部分
１５−６…第２のプログラム部分
【図１】
2019012324.tif 000003
【図２】
2019012324.tif 000004
【図３】
2019012324.tif 000005
【図４】
2019012324.tif 000006
【図５】
2019012324.tif 000007
【図６】
2019012324.tif 000008
【図７】
2019012324.tif 000009
【図８】
2019012324.tif 000010
【図９】
2019012324.tif 000011
【図１０】
2019012324.tif 000012
【図１１】
2019012324.tif 000013
【図１２】
2019012324.tif 000014
【図１３】
2019012324.tif 000015
【図１４】
2019012324.tif 000016
【図１５】
2019012324.tif 000017