(57)【要約】【課題】プログラムの実行時間を短縮する。【解決手段】複数あるベクトルレジスタ１２への割当が指示された配列を、ベクトルレジスタ１２のそれぞれの記憶領域に応じて分割し、分割した配列の記憶領域をそれぞれ異なるベクトルレジスタ１２に割り当てるステップと、配列が割り当てられたベクトルレジスタ１２のレジスタ番号をインデックスレジスタ１５にセットするコードを生成するステップと、ベクトルレジスタ１２に割り当てられた配列に対してインデックスレジスタ１５を用いてアクセスするコードを生成するステップと、を含む。【選択図】図１
2011154523.tif 000002
【特許請求の範囲】
【請求項１】
複数あるベクトルレジスタへの割当が指示された配列を、前記ベクトルレジスタのそれぞれの記憶領域に応じて分割し、分割した前記配列の記憶領域をそれぞれ異なる前記ベクトルレジスタに割り当てるステップと、
前記配列が割り当てられた前記ベクトルレジスタを特定する値をインデックスレジスタにセットするコードを生成するステップと、
前記ベクトルレジスタに割り当てられた前記配列に対して前記インデックスレジスタを用いてアクセスするコードを生成するステップと、
を含むコンパイル方法。
【請求項２】
請求項１に記載の各ステップをコンピュータに実行させるためのコンパイラ。
【請求項３】
請求項１に記載のコンパイル方法を用いて生成されたオブジェクトコードを実行するベクトル計算機。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル方法、コンパイラおよびベクトル計算機に関する。
【背景技術】
【０００２】
ベクトル演算を行うベクトル計算機は、複数のベクトルレジスタを備えている。ベクトル計算機は、例えば、ループ処理等で配列を繰り返し処理する場合に、一つの配列の全ての要素を一つのベクトルレジスタに割り当て、一つのベクトル演算命令で、配列の全ての要素を一度にまとめて演算する（下記特許文献１参照）。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００４−３０２７７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来のベクトル計算機では、一つのベクトルレジスタに一つの配列を割り当ててベクトル演算を行っている。したがって、一つのベクトルレジスタに収まらない配列を演算する場合には、ベクトルレジスタに未割り当ての要素を演算する機会が発生し、ベクトルレジスタよりも低速なメインメモリにアクセスしながら演算する回数が増える。これにより、プログラムの実行時間が長くなる。
【０００５】
本発明は、上述した課題を解決するためになされたものであり、プログラムの実行時間を短縮することができるコンパイル方法、コンパイラおよびベクトル計算機を提供することを目的とする。
【課題を解決するための手段】
【０００６】
本発明のコンパイル方法は、複数あるベクトルレジスタへの割当が指示された配列を、前記ベクトルレジスタのそれぞれの記憶領域に応じて分割し、分割した前記配列の記憶領域をそれぞれ異なる前記ベクトルレジスタに割り当てるステップと、前記配列が割り当てられた前記ベクトルレジスタを特定する値をインデックスレジスタにセットするコードを生成するステップと、前記ベクトルレジスタに割り当てられた前記配列に対して前記インデックスレジスタを用いてアクセスするコードを生成するステップと、を含む。
【０００７】
本発明のコンパイラは、上記コンパイル方法に含まれる各ステップをコンピュータに実行させる。
【０００８】
本発明のベクトル計算機は、上記コンパイル方法を用いて生成されたオブジェクトコードを実行する。
【発明の効果】
【０００９】
本発明によれば、プログラムの実行時間を短縮することができる。
【図面の簡単な説明】
【００１０】
【図１】実施形態におけるベクトル計算機の構成を例示するブロック図である。
【図２】実施形態におけるコンパイラを例示する図である。
【図３】ソースコードの一例を示す図である。
【図４】図３のソースコードに対応する中間コードの一例を示す図である。
【図５】ベクトルレジスタに分割した配列を割り当てた状態を示す図である。
【発明を実施するための形態】
【００１１】
以下、添付図面を参照して、本発明に係るコンパイル方法、コンパイラおよびベクトル計算機の好適な実施形態について説明する。
【００１２】
まず、図１を参照して、実施形態におけるベクトル計算機の構成について説明する。ベクトル計算機１は、例えば、ＣＰＵ（Central Processing Unit）１０と、メインメモリ２０とを有する。
【００１３】
ＣＰＵ１０は、ベクトル演算回路１１と、複数のベクトルレジスタ１２と、スカラ演算回路１３と、スカラレジスタ１４と、インデックスレジスタ１５とを有する。ベクトル演算回路１１およびスカラ演算回路１３は、後述するコンパイラによって生成されたオブジェクトコードを実行することで、各種の演算処理を実行する。
【００１４】
ベクトル演算回路１１は、例えばＤＯループ等のループ処理で配列を繰り返し処理する演算を、一つのベクトル演算命令で一度にまとめて実行する。ベクトルレジスタ１２は、ベクトル演算回路１１によって使用されるレジスタである。
【００１５】
スカラ演算回路１３は、上記配列を繰り返し処理する演算を、逐次的に演算する。スカラレジスタ１４は、スカラ演算回路１３によって使用されるレジスタである。本実施形態におけるインデックスレジスタ１５は、スカラレジスタ１４の一部を利用する。インデックスレジスタ１５は、メインメモリ２０上の実行アドレスを確定する際に、オブジェクトコードの命令のアドレスに対して加算する値を格納する。また、インデックスレジスタ１５は、配列が割り当てられたベクトルレジスタ１２を特定する際に用いる、ベクトルレジスタ１２のレジスタ番号を格納する。
【００１６】
図２を参照して、実施形態におけるコンパイラについて説明する。コンパイラ３０は、特定のプログラミング言語で記述されたソースコードを読み込み、ベクトル計算機１が実行できるオブジェクトコードに変換する機能を有しており、この機能はコンパイラプログラムを実行することで実現される。特定のプログラミング言語としては、例えば、Ｆｏｒｔｒａｎ、Ｃ言語が該当する。コンパイラプログラムは、ベクトル計算機１の記憶装置に格納してもよいし、ベクトル計算機１に接続可能なシステムの記憶装置に格納してもよい。
【００１７】
図２に示すように、コンパイラ３０は、中間コード生成部３１と、最適化部３２と、オブジェクトコード生成部３３と、を含む。
【００１８】
中間コード生成部３１は、原則として従来のものと同様に、ソースコード３４を読み込み、ソースコード３４を中間コード３５に変換して出力する。ソースコードを中間コードに変換する処理としては、例えば、ソースコードをトークン（ソースコードを構成する単語や記号等の最小構成要素）に分解する字句解析処理や、トークン列を解析して構文木を構築する構文解析処理等が該当する。
【００１９】
最適化部３２は、原則として従来のものと同様に、中間コード３５を読み込み、中間コード３５を最適化して、最適化後の中間コード３６を出力する。最適化部３２は、例えば、プログラムの実行時間を短縮することや、プログラム実行時のメモリ使用量を小さくすること等を含む最適化処理を実行することで、中間コード３５を最適化する。
【００２０】
オブジェクトコード生成部３３は、原則として従来のものと同様に、中間コード３６を読み込み、中間コード３６を機械語に翻訳することでオブジェクトコードを生成し、出力する。
【００２１】
本実施形態における最適化部３２は、最適化処理として、以下の処理を実行することに特徴がある。図３は、ソースコード３４の一例を示し、図４は、図３のソースコード３４に対応する中間コード３６の一例を示す図である。
【００２２】
最適化部３２は、ベクトルレジスタ１２に割り当てるように割当指示された配列を、ベクトルレジスタ１２に割り当てる。割当指示の方法としては、例えば、ソースコード中にコメント指示行を記述して割当指示する方法がある。具体的には、図３の（４−２）に示す、“！ｃｄｉｒ”で始まる行がコメント指示行となる。このコメント指示行には、“ｖｒｅｇ（ａ，１０２４）”と記述されており、このコメント指示は、ベクトルレジスタ１２の記憶領域のうち、１０２４ワード分の記憶領域を配列ａの記憶領域に割り当てることを示している。
【００２３】
最適化部３２は、割当指示された配列が一つのベクトルレジスタ１２に収まらない場合には、一つのベクトルレジスタ１２の記憶領域に応じて配列を分割し、分割した配列の記憶領域をそれぞれ異なるベクトルレジスタ１２に割り当てる。図５を参照して、具体的に説明する。
【００２４】
図５に示すように、例えば、一つのベクトルレジスタ１２の大きさが２５６ワードであり、配列ａの大きさが１０２４ワードである場合、最適化部３２は、配列ａ（１：１０２４）を２５６ワードごとの四つの配列、ａ（１：２５６）、ａ（２５７：５１２）、ａ（５１３：７６８）、ａ（７６９：１０２４）に分割する。最適化部３２は、四つに分割した配列を、レジスタ番号が６０〜６３となる四つの連続するベクトルレジスタ＄ｖｄｒ６０〜＄ｖｄｒ６３にそれぞれ割り当てる。なお、分割した配列と、それらの配列を割り当てたベクトルレジスタとの対応関係は、例えば、その対応関係を示すコードを生成してもよいし、その対応関係を記憶させたテーブルをコードとは別に生成して保持することとしてもよい。
【００２５】
最適化部３２は、分割した配列を割り当てたベクトルレジスタ１２を特定する値をインデックスレジスタ１５にセットするコードを生成する。ベクトルレジスタ１２を特定する値としては、例えば、ベクトルレジスタ１２のレジスタ番号が該当する。具体的には、図４の（５−１）、（５−４）に示すように、分割した配列ａを割り当てたベクトルレジスタ＄ｖｄｒ６０〜＄ｖｄｒ６３のうち、最小のレジスタ番号を有するベクトルレジスタ＄ｖｄｒ６０のレジスタ番号“６０”を、インデックスレジスタｖｉｘにセットするコードを生成する。
【００２６】
最適化部３２は、割当指示された配列を表すコードを、ベクトルレジスタ１２およびインデックスレジスタ１５を用いて表すコードに変換し、その変換したコードの次行に、インデックスレジスタ１５の値をインクリメントするコードを生成する。具体的には、図３の（４−３）、（４−４）に示す“ａ（ｉ）”を、図３の（５−２）、（５−５）、（５−６）に示す“＄ｖｄｒ[ｖｉｘ]”に変換し、図３の（５−３）、（５−７）に示す“ｖｉｘ ＝ ｖｉｘ ＋ １”を追記する。これにより、四つに分割した配列ａを、インデックスレジスタ１５をインクリメントしながらベクトルレジスタ１２からロードすることが可能となる。
【００２７】
上述したように、実施形態におけるコンパイラ３０およびベクトル計算機１によれば、コンパイラ３０の最適化部３２が、図４の（５−１）〜（５−７）に示すコードを生成することで、ベクトル計算機１のベクトル演算回路１１が“＄ｖｄｒ[ｖｉｘ]”の演算を実行するときには、インデックスレジスタｖｉｘに基づいてベクトルレジスタ＄ｖｄｒ６０に割り当てられた配列ａ（１：２５６）にアクセスしながら演算することができ、ベクトル演算回路１１が“＄ｖｄｒ[ｖｉｘ＋１]”の演算を実行するときには、インデックスレジスタｖｉｘ＋１に基づいてベクトルレジスタ＄ｖｄｒ６１に割り当てられた配列ａ（２５７：５１２）にアクセスしながら演算することができる。
【００２８】
また、ベクトル演算回路１１が“＄ｖｄｒ[ｖｉｘ＋２]”の演算を実行するときには、インデックスレジスタｖｉｘ＋２に基づいてベクトルレジスタ＄ｖｄｒ６２に割り当てられた配列ａ（５１３：７６８）にアクセスしながら演算することができ、ベクトル演算回路１１が“＄ｖｄｒ[ｖｉｘ＋３]”の演算を実行するときには、インデックスレジスタｖｉｘ＋３に基づいてベクトルレジスタ＄ｖｄｒ６３に割り当てられた配列ａ（７６９：１０２４）にアクセスしながら演算することができる。
【００２９】
つまり、本実施形態におけるコンパイラ３０およびベクトル計算機１によれば、配列を繰り返し処理する演算によって頻繁にアクセスされる配列を、メインメモリ２０よりも高速なベクトルレジスタ１２に割り当てて、ベクトルレジスタ１２から配列をロード等することができる。それゆえに、配列のロード等を高速化することができ、プログラムの実行時間を短縮することができる。
【００３０】
また、配列の全要素を複数のベクトルレジスタ１２に分割して割り当て、このベクトルレジスタ１２のレジスタ番号をインデックスレジスタ１５にセットしてベクトルレジスタ１２にアクセスさせることができるため、一つのベクトルレジスタに割り当てられない大きさの配列であっても、配列の全ての要素をベクトルレジスタ１２に割り当てることができる。これにより、プログラムの実行時間をさらに短縮することができる。
【００３１】
なお、上述した実施形態は、単なる例示に過ぎず、実施形態に明示していない種々の変形や技術の適用を排除するものではない。すなわち、本発明は、その趣旨を逸脱しない範囲で様々な形態に変形して実施することができる。
【符号の説明】
【００３２】
１…ベクトル計算機、１１…ベクトル演算回路、１２…ベクトルレジスタ、１３…スカラ演算回路、１４…スカラレジスタ、１５…インデックスレジスタ、２０…メインメモリ、３０…コンパイラ、３１…中間コード生成部、３２…最適化部、３３…オブジェクトコード生成部、３４…ソースコード、３５、３６…中間コード。
【図１】
2011154523.tif 000003
【図２】
2011154523.tif 000004
【図３】
2011154523.tif 000005
【図４】
2011154523.tif 000006
【図５】
2011154523.tif 000007