(57)【特許請求の範囲】
【請求項１】
演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムをコンパイル装置がソースプログラムに基づいて生成するコンパイル方法であって、
前記ソースプログラムにおける配列を抽出するステップと、
前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を算出するステップと、
前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を算出するステップと、
前記第１のアクセス回数及び前記第２のアクセス回数を比較するステップと、
前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するステップと、
を備えるコンパイル方法。
【請求項２】
前記第２のアクセス回数が前記第１のアクセス回数よりも多いか、又は同じ場合に、前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するステップと、
をさらに備える、請求項１に記載のコンパイル方法。
【請求項３】
前記配列を抽出するステップにおいて、前記ソースプログラム内の配列に対して当該配列のサイズが前記一時記憶装置に割り当て可能か否かを判定し、割り当て可能と判定された配列のみを抽出する、
請求項１又は２に記載のコンパイル方法。
【請求項４】
前記配列を抽出するステップにおいて、前記ソースプログラム内の引数に基づいてサイズが決定された配列がある場合に、当該配列は前記一時記憶装置に割り当て可能とは判定せず、抽出を実行しない、
請求項３に記載のコンパイル方法。
【請求項５】
前記第１のアクセス回数及び前記第２のアクセス回数は、前記ソースプログラム内の演算式において前記抽出された配列が定義される回数及び前記抽出された配列が参照される回数に基づいて算出される、
請求項１ないし４のいずれか一項に記載のコンパイル方法。
【請求項６】
前記計算機はベクトル計算機であり、
前記第１のアクセス回数は、前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記演算装置の前記メインメモリに対するベクトル命令の実行回数であり、前記第２のアクセス回数は、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記演算装置の前記メインメモリに対するベクトル命令の実行回数である、
請求項１ないし５のいずれか一項に記載のコンパイル方法。
【請求項７】
演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムを、コンパイル装置がソースプログラムに基づいて生成する処理を実行させるためのコンパイルプログラムであって、
前記ソースプログラムにおける配列を前記コンパイル装置が抽出するステップと、
前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を前記コンパイル装置が算出するステップと、
前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を前記コンパイル装置が算出するステップと、
前記第１のアクセス回数及び前記第２のアクセス回数を前記コンパイル装置が比較するステップと、
前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記コンパイル装置が前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するステップと、
を前記コンパイル装置に実行させるためのコンパイルプログラム。
【請求項８】
演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムをソースプログラムに基づいて生成するコンパイル装置であって、
前記ソースプログラムにおける配列を抽出する抽出手段と、
前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を算出するとともに、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を算出する算出手段と、
前記第１のアクセス回数及び前記第２のアクセス回数を比較する比較手段と、
前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成する生成手段と、
を備えるコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はコンパイル方法、コンパイルプログラム及びコンパイル装置に関する。
【背景技術】
【０００２】
計算機のＣＰＵ（Central Processing Unit）から主記憶装置（以下メインメモリと記載）へのアクセス時間は、ＣＰＵの演算時間と比べると大きく、メインメモリとＣＰＵ間のデータ転送性能は不足している。これは、ＣＰＵの演算性能の向上に対して、メインメモリの性能向上は緩やかであるため、ＣＰＵ−メインメモリ間の性能差が年々大きくなっていることが理由である。
【０００３】
この広がる性能差を埋めるために、一般にスカラー計算機では、ＣＰＵとメインメモリ間に高速なキャッシュメモリを設けることにより、メインメモリへのアクセス時間（以下メモリアクセス時間と記載）を短縮している。キャッシュメモリを１段だけでなく２段、または３段にする（２次キャッシュメモリや３次キャッシュメモリを設ける）ことや、キャッシュの容量を増やすといったこともなされている。
【０００４】
ベクトル計算機では、ベクトル命令により一度に多くのデータをまとめて転送することにより、メモリアクセス時間を短縮している。データ１個あたりのメモリアクセス時間は、同時に転送されたデータの個数分の１とみなすことができる。この個数の最大値はベクトル計算機のベクトル長で決まり、ベクトル長の値が２５６の場合は、メモリアクセス時間は２５６分の１と、小さい値になる。
【０００５】
例として、ＣＰＵが式Ｓ＝ｓｕｍ（Ａ（１：３））の計算をする場合におけるメモリアクセスのイメージを以下に説明する。図９は、３パターンのメモリアクセスのイメージを示す図である。
【０００６】
図９（ａ）は、スカラー計算機において、配列Ａ（１：３）のデータを順次メインメモリから参照した場合のメモリアクセスを示している。ここでＣＰＵは、メインメモリに対してデータを要求し、メインメモリはそれに応じて最初にＡ（１）のデータを転送する。ＣＰＵから次のデータ要求が出力されると、メインメモリはそれに応じてＡ（２）のデータを転送する。ＣＰＵからその次のデータ要求が出力されると、メインメモリはそれに応じてＡ（３）のデータを転送する。Ａ（３）のデータを受信したＣＰＵは、計算した式の結果（データＳ）をメインメモリに転送する。このように、ＣＰＵとメインメモリとの間で逐一データ転送とデータ要求にかかる通信がされているため、メモリアクセス時間が長くなる。つまり、式の計算を実行するのに時間がかかってしまう。
【０００７】
図９（ｂ）は、スカラー計算機において、配列Ａ（１：３）のデータが全てキャッシュメモリ上に格納されている場合のメモリアクセスを示している。ＣＰＵは、メモリではなくキャッシュメモリに対してデータを要求し、キャッシュメモリはそれに応じて最初にＡ（１）のデータを転送する。以降は図９（ａ）と同様にして、ＣＰＵとキャッシュメモリはデータ転送とデータ要求にかかる通信を実行する。以上の処理において、ＣＰＵはデータを取得するのにメインメモリよりも高速なキャッシュメモリへアクセスしているため、図９（ａ）に示した処理に比較してメモリアクセス時間が短縮される。
【０００８】
図９（ｃ）は、ベクトル計算機において、ベクトル命令により配列Ａ（１：３）をメインメモリから参照した場合のメモリアクセスを示している。ＣＰＵが１つのベクトル命令をメインメモリに出力することに応じて、メインメモリは３個の配列要素のデータ（Ａ（１）、Ａ（２）、Ａ（３））を同時にＣＰＵに転送する。この結果、図９（ａ）及び（ｂ）に比較してメモリアクセス時間が短縮されるため、最も少ない時間で式の計算をすることができる。
【０００９】
このように、ベクトル計算機は、メモリアクセス時間を削減することが可能であるが、演算性能の向上の結果、ベクトル計算機においてもプログラムの実行時間内におけるメモリアクセス時間の割合が大きくなっている。ベクトル計算機では、キャッシュメモリを新規に設けることによりメモリアクセスの性能改善が試みられているものの、コンパイラにおいても、メモリアクセスを削減する最適化機能の重要性が増している。
【００１０】
例えば、特許文献１では、複数あるベクトルレジスタへの割り当てが指示された配列を、分割して各ベクトルレジスタに割り当てるベクトル計算機の技術が開示されている。これにより、１つのベクトルレジスタに収まらない配列であっても、複数のベクトルレジスタに割り当てることが可能になるため、プログラムの実行時間を短縮させることができる。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１１−１５４５２３号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
特許文献１においては、配列をベクトルレジスタに割り当てるか否かはプログラマが判定している。この判定を行うことによりメモリアクセス時間を削減する（プログラムの実行時間を短縮する）ことが可能となるのだが、この判定に際して、プログラマにはコンピュータのハードウェアに関する深い知識や、最適化の技術が求められる。そのため、プログラムの実行時間を短縮するためのプログラマの負担が増大してしまう。
【００１３】
本発明は、このような問題点を解決するためになされたものであり、プログラマの負担を増大させずに、プログラムの実行時間を短縮させることが可能なコンパイル方法、コンパイルプログラム及びコンパイル装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明にかかるコンパイル方法は、演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムをコンパイル装置がソースプログラムに基づいて生成するコンパイル方法である。当該コンパイル方法は、前記ソースプログラムにおける配列を抽出するステップと、前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を算出するステップと、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を算出するステップと、前記第１のアクセス回数及び前記第２のアクセス回数を比較するステップと、前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するステップと、を備える。
【００１５】
本発明にかかるコンパイルプログラムは、演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムを、コンパイル装置がソースプログラムに基づいて生成する処理を実行させるためのコンパイルプログラムである。当該コンパイルプログラムは、前記ソースプログラムにおける配列を前記コンパイル装置が抽出するステップと、前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を前記コンパイル装置が算出するステップと、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を前記コンパイル装置が算出するステップと、前記第１のアクセス回数及び前記第２のアクセス回数を前記コンパイル装置が比較するステップと、前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記コンパイル装置が前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するステップと、を前記コンパイル装置に実行させる。
【００１６】
本発明にかかるコンパイル装置は、演算装置と、メインメモリと、前記演算装置が前記メインメモリよりも高速にアクセス可能な一時記憶装置と、を有する計算機が実行するオブジェクトプログラムをソースプログラムに基づいて生成する。当該コンパイル装置は、前記ソースプログラムにおける配列を前記コンパイル装置が抽出する抽出手段と、前記抽出された配列を前記メインメモリに割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第１のアクセス回数を算出するとともに、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するときの前記メインメモリに前記演算装置がアクセスする第２のアクセス回数を算出する算出手段と、前記第１のアクセス回数及び前記第２のアクセス回数を比較する比較手段と、前記第２のアクセス回数が前記第１のアクセス回数よりも少ない場合に、前記抽出された配列を前記一時記憶装置に割り当てて前記計算機が前記オブジェクトプログラムを実行するように、前記ソースプログラムをコンパイルして前記オブジェクトプログラムを生成する生成手段と、を備える。
【発明の効果】
【００１７】
本発明により、プログラマの負担を増大させずに、プログラムの実行時間を短縮させることが可能なコンパイル方法、コンパイルプログラム及びコンパイル装置を提供することができる。
【図面の簡単な説明】
【００１８】
【図１】実施の形態１にかかる計算機の構成例を示すブロック図である。
【図２】実施の形態１にかかるコンパイラの構成例を示すブロック図である。
【図３】実施の形態１にかかるコンパイラが実行する処理の一例を示すフローチャートである。
【図４】実施の形態２にかかるベクトル計算機の構成例を示すブロック図である。
【図５】実施の形態２にかかるコンパイラの構成例を示すブロック図である。
【図６】実施の形態２にかかるコンパイラが実行する処理の一例を示すフローチャートである。
【図７】実施の形態２にかかるＦｏｒｔｒａｎの原始プログラム例を示す図である。
【図８】実施の形態２にかかるメモリアクセスの回数の解析結果について示した表である。
【図９】関連技術にかかるメモリアクセスのイメージを示す図である。
【発明を実施するための形態】
【００１９】
実施の形態１
以下、図面を参照して本発明の実施の形態について説明する。図１は、実施の形態１において、目的プログラム（オブジェクトプログラム）を実際に実行する計算機の構成を例示するブロック図である。計算機１０は、演算装置１１、メインメモリ１２、一時記憶装置１３を備える。計算機１０はコンピュータであり、例えばスーパーコンピュータ等の高性能計算機でもよい。なお、計算機１０は、例えばベクトル演算が可能なベクトル計算機である。
【００２０】
演算装置１１は、プログラムに基づいて計算機１０が演算を実行するための装置である。演算装置１１は、具体的には計算機１０のＣＰＵ、ＧＰＵ（Graphics Processing Unit）といったプロセッサ内の演算装置であり、例えばＣＰＵにおけるＡＬＵ(Arithmetic Logic Unit)により構成される。演算装置１１は、メインメモリ１２又は一時記憶装置１３からデータを取得し、それに応じて演算を実行する。
【００２１】
メインメモリ１２は、計算機１０において演算装置１１がアクセス可能な主記憶装置である。メインメモリ１２は、演算装置１１が演算を実行するために必要なデータ及び演算を実行した結果のデータを保持することができる。
【００２２】
一時記憶装置１３は、演算装置１１がメインメモリ１２よりも高速にアクセス可能な記憶装置であり、例えばレジスタが該当する。例えば、演算装置１１及び一時記憶装置１３がＣＰＵを構成する場合には、演算装置１１はＣＰＵ内のＡＬＵ、一時記憶装置１３はＣＰＵ内のレジスタである。その他の例として、一時記憶装置１３はＣＰＵ内のローカルメモリやバッファでもよい。
【００２３】
計算機１０は、その他、マウス、キーボード等の入力装置や、ディスプレイ等の表示装置といった図示しない装置を適宜有する。
【００２４】
図２は、計算機１０が実行する目的プログラムを、原始プログラム（ソースプログラム）に基づいて生成するコンパイラ（コンパイル装置）２０の構成例を示すブロック図である。コンパイラ２０は、原始プログラム（ソースプログラム）１００をコンパイルすることにより、目的プログラム（オブジェクトプログラム）１０１を生成する。コンパイラ２０は、プログラマがプログラムの入力を可能とするパーソナルコンピュータ等のコンピュータである。コンパイラ２０は、計算機１０とは別の装置でもよいし、同一の装置でもよい。
【００２５】
コンパイラ２０は、抽出部２１、算出部２２、比較部２３及び生成部２４を備える。実際には、コンパイラ２０は、ＣＰＵ等のプロセッサ、メインメモリ、ハードディスク等の記憶装置、マウス、キーボード等の入力装置及びディスプレイ、プリンタ等の出力装置を備えており、記憶装置にはコンパイルプログラムが保持されている。抽出部２１、算出部２２、比較部２３及び生成部２４は、プロセッサや記憶装置といったコンパイラ２０のハードウェア及びコンパイルプログラムといったソフトウェアにより構成されている。抽出部２１、算出部２２、比較部２３及び生成部２４の以下に示す処理については、コンパイラ２０のプロセッサがコンパイルプログラムを実行することにより実現される。
【００２６】
抽出部２１は、原始プログラム１００における配列を抽出する部分である。ここで抽出部２１は、原始プログラム１００の全ての配列を抽出してもよいし、所定の条件を有する配列のみを抽出するようにしてもよい。例えば、抽出部２１は、一時記憶装置１３の一部又は全部の記憶領域に割り当て可能なサイズの配列のみを抽出してもよい。あるいは、抽出部２１は、原始プログラム１００の演算式において、所定の数以上定義又は参照される配列を抽出してもよい。ここで、「演算式において定義される配列」とは、演算式の左辺に示された配列であり、演算式の右辺に記載された配列（他の配列だけでなく自分自身も含む）によって定義される。「演算式において参照される配列」とは、演算式の右辺に示された配列であり、演算式の左辺に記載された配列の定義に用いられる。実際には、コンパイル２０のプロセッサがコンパイルプログラムを実行することにより、原始プログラム１００に記載された配列を抽出する処理が実行される。
【００２７】
算出部２２は、抽出部２１が抽出した配列をメインメモリ１２に割り当てて計算機１０が目的プログラム１０１を実行するときの演算装置１１がメインメモリ１２へアクセスする回数（以下、第１のアクセス回数と定義）を算出する。さらに算出部２２は、抽出部２１が抽出した配列を一時記憶装置１３に割り当てて計算機１０が目的プログラム１０１を実行するときの演算装置１１がメインメモリ１２へアクセスする回数（以下、第２のアクセス回数と定義）を算出する。実際には、コンパイル２０のプロセッサがコンパイルプログラムを実行することにより、第１のアクセス回数及び第２のアクセス回数を算出する処理が実行される。
【００２８】
比較部２３は、算出部２２が算出した第１のアクセス回数及び第２のアクセス回数を比較する。実際には、コンパイル２０のプロセッサがコンパイルプログラムを実行することにより、第１のアクセス回数及び第２のアクセス回数を比較する処理が実行される。
【００２９】
生成部２４は、比較部２３が第２のアクセス回数が第１のアクセス回数よりも少ないと判定した場合に、抽出部２１が抽出した配列を一時記憶装置１３に割り当てて計算機１０が目的プログラム１０１を実行するように、原始プログラム１００をコンパイルして目的プログラム１０１を生成する。実際には、コンパイル２０のプロセッサがコンパイルプログラムを実行することにより、抽出部２１が抽出した配列を一時記憶装置１３に割り当てて計算機１０が目的プログラム１０１を実行するように、原始プログラム１００をコンパイルする処理が実行される。
【００３０】
原始プログラム１００は、コンパイル後の目的プログラム１０１が計算機１０が実行可能なプログラムであれば、いかなるプログラミング言語で記載されたプログラムでもよい。
【００３１】
図３は、コンパイラ２０が実行する処理の一例を示すフローチャートである。コンパイラ２０は、以下のようにして、原始プログラム１００のコンパイルを実行することができる。
【００３２】
プログラマは、コンパイラ２０の入力装置を操作することにより、コンパイラ２０に対して原始プログラム１００のコンパイルをするための指示を出力する。コンパイラ２０は、それに応じてコンパイル処理を開始する。まず、抽出部２１は、原始プログラム１００の配列を抽出する（ステップＳ１）。
【００３３】
次に、算出部２２は、抽出部２１が抽出した配列に関して、第１のアクセス回数を算出する（ステップＳ２）。同様に、算出部２２は、抽出部２１が抽出した配列に関して、第２のアクセス回数を算出する（ステップＳ３）。なお、算出部２２は、ステップＳ３の処理をステップＳ２の処理よりも先に実行してもよい。
【００３４】
比較部２３は、算出部２２が算出した第１のアクセス回数及び第２のアクセス回数を比較する（ステップＳ４）。これにより、第１のアクセス回数と第２のアクセス回数のどちらが多い（又は少ない）かが判定される（ステップＳ５）。
【００３５】
第１のアクセス回数よりも第２のアクセス回数が少ないと判定された場合には（ステップＳ５のＹｅｓ）、生成部２４は、原始プログラム１００を計算機１０で実行する際に抽出部２１が抽出した配列が一時記憶装置１３に割り当てられるようにする（ステップＳ６）。このようにして、生成部２４は、原始プログラム１００をコンパイルして目的プログラム１０１を生成する（ステップＳ７）。
【００３６】
第１のアクセス回数よりも第２のアクセス回数が多い、又は同じ数と判定された場合には（ステップＳ５のＮｏ）、生成部２４は、特別な処理を実行しない。つまり、原始プログラム１００を計算機１０で実行する際に当該配列がメインメモリ１２に割り当てられるように、生成部２４は、原始プログラム１００をコンパイルして目的プログラム１０１を生成する（ステップＳ７）。
【００３７】
以上のコンパイル処理により、コンパイラ２０は、プログラムの実行時間を短縮させることができる。これは、比較部２３が、第２のアクセス回数が第１のアクセス回数よりも少ないと判定した際に、生成部２４が、判定にかかる配列を一時記憶装置１３に割り当てて計算機１０が目的プログラム１０１を実行するようにコンパイル処理を実行したためである。これにより、計算機１０が目的プログラム１０１を実行する際に、アクセスに時間のかかるメインメモリ１２に演算装置１１がアクセスする回数を削減することができる。そのため、メモリアクセス時間が短縮され、プログラムの実行時間が短縮される。
【００３８】
さらに、第１のアクセス回数及び第２のアクセス回数の算出処理及びその判定処理はコンパイラ２０の算出部２２及び比較部２３が自動的に実行するため、プログラマはそれらの処理をする必要はない。そのため、プログラマは特別な知識を必要とせず、プログラム実行時間を削減することができる。つまり、プログラム実行時間を削減するためのプログラマの負担を軽減することができる。
【００３９】
なお、第２のアクセス回数が第１のアクセス回数よりも多い又は同じと判定された場合には、原始プログラム１００を計算機１０で実行する際にその判定にかかる配列はメインメモリ１２に割り当てられる。そのため、コンパイラ２０は、プログラムの実行時間をより短縮することができる。
【００４０】
実施の形態２
以下、図面を参照して本発明の実施の形態２について説明する。図４は、実施の形態２にかかるベクトル計算機の構成を例示するブロック図である。ベクトル計算機３０は、ベクトル演算処理部３１と、メインメモリ３２を備える。
【００４１】
ベクトル演算処理部３１は、ベクトル計算機３０が備えるＣＰＵ等のプロセッサである。ベクトル演算処理部３１は、ベクトルレジスタ３３と、ベクトル演算器３４と、ベクトルデータレジスタ（ＶＤＲ）３５を有する。
【００４２】
ベクトルレジスタ３３は、ベクトルレジスタＶ０〜Ｖ７の８セットがあり、各々のベクトルレジスタは２５６ワードのデータを格納できる。ベクトルレジスタ３３には、ベクトル演算器３４、ベクトルデータレジスタ３５又はメインメモリ３２からデータが出力される。
【００４３】
ベクトルレジスタＶ０は、ベクトル演算器３４の加算器ｆ０にデータを出力する。さらに、ベクトルレジスタＶ０にベクトル演算器３４のベクトル演算の結果が出力された場合には、ベクトルデータレジスタ３５又はメインメモリ３２にその結果のデータを出力することもできる。
【００４４】
ベクトルレジスタＶ１は、加算器ｆ０にデータを出力する。ベクトルレジスタＶ２及びＶ３は、乗算器ｆ１にデータを出力する。ベクトルレジスタＶ４及びＶ５は、論理演算器ｆ２にデータを出力する。ベクトルレジスタＶ６及びＶ７は、徐算器ｆ３にデータを出力する。このように、ベクトルレジスタ３３は、ベクトル演算器３４の計算用のデータを一時的に格納する働きをする。
【００４５】
ベクトルレジスタ３３及びベクトル演算器３４は、図１における演算装置１１に対応する。
【００４６】
ベクトル演算器３４は、加算器ｆ０、乗算器ｆ１、論理演算器ｆ２、除算器ｆ３の４種類があり、各々のベクトル演算器は一度に２５６ワードのベクトル演算ができる。
【００４７】
加算器ｆ０は、ベクトルレジスタＶ０及びＶ１から出力されたデータに基づいて、ベクトル演算の加算処理を実行し、実行結果をベクトルレジスタＶ０〜Ｖ７のいずれかに出力する。乗算器ｆ１は、ベクトルレジスタＶ２及びＶ３から出力されたデータに基づいて、ベクトル演算の乗算処理を実行し、実行結果をベクトルレジスタＶ０〜Ｖ７のいずれかに出力する。論理演算器ｆ２は、ベクトルレジスタＶ４及びＶ５から出力されたデータに基づいて、ベクトル演算の論理演算処理を実行し、実行結果をベクトルレジスタＶ０〜Ｖ７のいずれかに出力する。除算器ｆ３は、ベクトルレジスタＶ６及びＶ７から出力されたデータに基づいて、ベクトル演算の除算処理を実行し、実行結果をベクトルレジスタＶ０〜Ｖ７のいずれかに出力する。
【００４８】
ベクトルデータレジスタ３５は、ベクトルレジスタＶ０から出力されたデータ又はベクトル演算器３４の演算結果を格納することができるベクトルレジスタである。さらに、ベクトルデータレジスタ３５は、メインメモリ３２から出力されたデータを格納することができる。ベクトルデータレジスタ３５は、２５６ワードのデータを格納できるレジスタを３２セット備えており、最大で８１９２（＝２５６×３２）サイズの配列が割り当て可能である。ベクトルデータレジスタ３５は、ベクトル演算処理部３１内の演算装置がメインメモリ３２よりも高速にアクセス可能な記憶装置であり、図１における一時記憶装置１３に対応する。
【００４９】
メインメモリ３２は、ベクトル計算機３０が備えるメモリであり、ベクトル演算処理部３１との間でデータを通信する。具体的には、メインメモリ３２は、ベクトル演算処理部３１のデータ出力要求に応じて、ベクトルレジスタ３３又はベクトルデータレジスタ３５に自身が保持するデータを出力することができる。あるいは、メインメモリ３２は、ベクトルレジスタＶ０から出力されたデータを内部に保持することもできる。メインメモリ３２は、図１におけるメインメモリ１２に対応する。
【００５０】
次に、図５を参照して、実施の形態２にかかるコンパイラについて説明する。図５は、コンパイラ４０の構成例を示すブロック図である。コンパイラ４０は、原始プログラム２００をコンパイルすることにより、ベクトル計算機３０が実行する目的プログラム２０１を生成する。原始プログラム２００は、プログラマがプログラミング言語で記述したプログラムであり、目的プログラム２０１は、ベクトル計算機３０が直接実行できる形式のプログラムである。この目的プログラム２０１における配列の割り当て方によって、ベクトル計算機３０のプログラムの実行時間が変化する。コンパイラ４０は、プログラマがプログラムの入力を可能とするパーソナルコンピュータ等のコンピュータである。コンパイラ４０は、ベクトル計算機３０とは別の装置でもよいし、同一の装置でもよい。
【００５１】
なお、実施の形態２では、コンパイラ４０は、Ｆｏｒｔｒａｎのコンパイラであるものとして説明する。但し、実際には、この例に限定されず、他のプログラミング言語のコンパイラでも同様に適用することができる。
【００５２】
コンパイラ４０は、中間言語作成処理部４１と、ベクトル化・最適化処理部４２と、メモリアクセス最適化処理部４３と、目的プログラム生成処理部４８を備える。実際には、コンパイラ４０は、コンパイラ２０と同様、プロセッサ、記憶装置、入力装置及び出力装置を備えており、記憶装置にはコンパイルプログラムが保持されている。中間言語作成処理部４１と、ベクトル化・最適化処理部４２と、メモリアクセス最適化処理部４３と、目的プログラム生成処理部４８は、プロセッサや記憶装置といったコンパイラ４０のハードウェア及びコンパイルプログラムといったソフトウェアにより構成されている。各部の以下に示す処理については、コンパイラ４０のプロセッサがコンパイルプログラムを実行することにより実現される。
【００５３】
中間言語作成処理部４１は、原始プログラム２００を読み込み、原始プログラム２００の字句解析や、構文解析処理を実行し、その字句解析や構文解析の結果に基づいて、中間言語２０２を作成する。中間言語２０２は、中間言語作成処理部４１より作成される中間ファイルである。
【００５４】
ベクトル化・最適化処理部４２は、中間言語２０２を読み込み、ループのベクトル化や、共通式の削除、ループのアンロール、レジスタ割り当て等の種々の最適化処理を行い、そのベクトル化や最適化の結果に基づいて、中間言語２０３を作成する。中間言語２０３はベクトル化・最適化処理部４２により作成される中間フィルである。
【００５５】
メモリアクセス最適化処理部４３は、配列候補検出部４４と、メモリアクセス解析処理部４５と、配列の割り当て変更処理部４６と、レジスタ割り当て処理部４７を有する。メモリアクセス最適化処理部４３は、中間言語２０３を読み込んだ結果に基づいて、中間言語２０４を作成する。
【００５６】
配列候補検出部４４は、中間言語２０３を読み込み、割り当て先をメインメモリ３２からベクトルデータレジスタ３５に変更可能な配列の候補の有無を検出する。そのような配列があった場合には、配列候補検出部４４は、その配列を抽出してメモリアクセス解析処理部４５に出力する。そのような配列がない場合には、メモリアクセス最適化処理部４３は、中間言語２０３を変えずに、中間言語２０４を作成する。配列候補検出部４４は、図２における抽出部２１に対応する。
【００５７】
メモリアクセス解析処理部４５は、配列候補検出部４４が抽出した配列のメモリアクセスについて解析する。具体的には、メモリアクセス解析処理部４５は、その配列をメインメモリ３２に割り当ててベクトル計算機３０が目的プログラムを実行するときのメインメモリ３２にベクトル演算処理部３１がアクセスする回数（第１のアクセス回数）を算出する。さらにメモリアクセス解析処理部４５は、その配列をベクトルデータレジスタ３５に割り当ててベクトル計算機３０が目的プログラムを実行するときのメインメモリ３２にベクトル演算処理部３１がアクセスする回数（第２のアクセス回数）を算出する。メモリアクセス解析処理部４５は、その算出結果に基づき、割り当て先をメインメモリ３２からベクトルデータレジスタ３５へ変更することにより、配列のメモリアクセス数の削減が可能か否かを判定する。このメモリアクセス解析処理部４５は、図２における算出部２２及び比較部２３に対応する。
【００５８】
配列のメモリアクセス数の削減が可能な場合には、メモリアクセス解析処理部４５は、この判定結果を配列の割り当て変更処理部４６に出力する。配列のメモリアクセス数の削減が不可能な場合には、メモリアクセス最適化処理部４３は、中間言語２０３を変えずに、中間言語２０４を作成する。
【００５９】
配列の割り当て変更処理部４６は、メモリアクセス解析処理部４５からの判定結果に基づいて、メモリアクセス数の削減が可能な配列の割り当て先を、メインメモリ３２から、ベクトルデータレジスタ３５内の１又は複数のレジスタへ変更する。
【００６０】
レジスタ割り当て処理部４７は、配列の割り当て変更処理部４６が配列の割り当てを変更した場合に、再度レジスタ割り当ての最適化処理のやり直しを実行することにより、中間言語２０４を生成する。このようにして、中間言語２０４がメモリアクセス最適化処理部４３より中間ファイルとして作成される。
【００６１】
目的プログラム生成処理部４８は、中間言語２０４を読み込み、中間言語２０４を機械語に翻訳して、ベクトル計算機３０が直接実行可能な目的プログラム２０１を生成する。コンパイラ４０は、目的プログラム２０１をコンパイラ４０の外部に出力する。例えば、コンパイラ４０は、目的プログラム２０１をＣＤ−ＲＯＭ（Read Only Memory）、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ等の記憶媒体に出力してもよい。なお、配列の割り当て変更処理部４６、レジスタ割り当て処理部４７及び目的プログラム生成処理部４８は、図２における生成部２４に対応する。
【００６２】
次に図６を用いて、実施の形態２にかかるコンパイラ４０の処理について詳細に説明する。図６は、コンパイラ４０が実行する処理の一例を示すフローチャートである。
【００６３】
まず、コンパイラ４０の中間言語作成処理部４１は、原始プログラム２００を読み込み、原始プログラム２００の字句解析や構文解析を実行して、中間言語２０２を作成する（ステップＳ１１）。
【００６４】
次にベクトル化・最適化処理部４２は、中間言語２０２内にあるループをベクトル化するとともに、中間言語２０２を最適化することにより、中間言語２０３を作成する（ステップＳ１２）。
【００６５】
次に配列候補検出部４４は、中間言語２０３を読み込み、ベクトルデータレジスタ３５に割り当て可能な配列の有無を判定する（ステップＳ１３）。
【００６６】
配列候補検出部４４がベクトルデータレジスタ３５に割り当て可能な配列がないと判定した場合は（ステップＳ１３のＮｏ）、メモリアクセス最適化処理部４３は中間言語２０３を変化せず、そのまま中間言語２０４を作成する。
【００６７】
配列候補検出部４４がベクトルデータレジスタ３５に割り当て可能な配列があると判定した場合は（ステップＳ１３のＹｅｓ）、配列候補検出部４４は、割り当て可能と判定した配列を抽出する（ステップＳ１４）。このステップＳ１４の処理は、図３のステップＳ１の処理に対応する。
【００６８】
メモリアクセス解析処理部４５は、配列候補検出部４４が抽出した配列についてのメモリアクセスを解析する（ステップＳ１５）。具体的には、メモリアクセス解析処理部４５は、配列の割り当て先がメインメモリ３２のままの場合のその配列についてのメモリアクセス数（第１のアクセス回数）と、配列の割り当て先をメインメモリ３２からベクトルデータレジスタ３５へ変更した場合のその配列についてのメモリアクセス数（第２のアクセス回数）とを見積もる。そして、第１のアクセス回数と第２のアクセス回数とを比較する。このステップＳ１５の処理は、図３のステップＳ２〜Ｓ４の処理に対応する。
【００６９】
この解析結果により、メモリアクセス解析処理部４５は、配列の割り当て先をベクトルデータレジスタ３５に割り当てた場合に、メモリアクセスが削減可能かどうかを判定する（ステップＳ１６）。この判定処理は図３のステップＳ５に対応し、第１のアクセス回数よりも第２のアクセス回数が少ない場合に、メモリアクセスが削減可能と判定される。第１のアクセス回数よりも第２のアクセス回数が多い又は同じである場合には、メモリアクセスが削減されないと判定される。
【００７０】
メモリアクセスが削減されないと判定された場合は（ステップＳ１６のＮｏ）、メモリアクセス最適化処理部４３は中間言語２０３を変化せず、そのまま中間言語２０４を作成する。つまり、抽出された配列をメインメモリ３２に割り当ててベクトル計算機３０が目的プログラム２０１を実行するように、メモリアクセス最適化処理部４３は原始プログラム２００をコンパイルして中間言語２０４を作成する。
【００７１】
メモリアクセスが削減されると判定された場合は（ステップＳ１６のＹｅｓ）、配列の割り当て変更処理部４６は、メモリアクセスが削減されると判定された配列の割り当て先を、メインメモリ３２からベクトルデータレジスタ３５へ変更する（ステップＳ１７）。
【００７２】
次にレジスタ割り当て処理部４７は、レジスタ割り当ての最適化をやり直す（ステップＳ１８）。これは、ステップＳ１７において、所定の配列の割り当て先がベクトルデータレジスタ３５に変更されているため、プログラムの実行時間を減少させるために再度レジスタ割り当ての最適化を実行する必要があるためである。このステップＳ１７、Ｓ１８の処理は、図３のステップＳ６の処理に対応する。レジスタ割り当て処理部４７は、ステップＳ１８の処理を実行することにより、中間言語２０４を作成する。
【００７３】
最後に目的プログラム生成処理部４８は、中間言語２０４を読み込んで、目的プログラム２０１を生成する（ステップＳ１９）。目的プログラム生成処理部４８は、目的プログラム２０１をコンパイラ４０の外部へ出力する。
【００７４】
以下、図７を参照して、コンパイラ４０が図６に示す処理フローを実行する具体例について説明する。図７は、Ｆｏｒｔｒａｎで記載された原始プログラム２００の例を示す。図７では、「ＭＵＬＴＩＡＢＣ」というサブルーチンが記載されている。
【００７５】
図７において、サブルーチン内の配列はＡ、Ｂ、Ｃ、ＷＫ、Ｒの５種類がある。図７の（０）の部分から、配列Ａの配列サイズは１０２８５７６（＝１０２４×１０２４）、配列Ｂの配列サイズはＮ、配列Ｃの配列サイズはＮ×１０２４、配列Ｒ及びＷＫの配列サイズは１０２４であることが分かる。
【００７６】
図７においては、（１）、（２）、（３）の３つのＤＯループ部分が存在する。（１）は配列ＷＫに関する一重ループ、（２）は配列ＷＫ、Ｂ、Ｃに関する二重ループ、（３）は配列Ｒ、Ａ、ＷＫに関する二重ループ部分である。これらのループの詳細については後述する。
【００７７】
まず、中間言語作成処理部４１は、原始プログラム２００を読み込み、原始プログラム２００の字句解析や構文解析を実行する（ステップＳ１１）。次に、ベクトル化・最適化処理部４２により、原始プログラム２００に含まれるＤＯループのうち、内側にあるＤＯループは、すべてベクトル化される（ステップＳ１２）。つまり、図７における（２）、（３）の内側にあるＤＯループ部分がベクトル化される。
【００７８】
配列候補検出部４４は、配列Ａ、Ｂ、Ｃ、ＷＫ、Ｒのメモリアクセスについて解析する（ステップＳ１３）。ここで、配列候補検出部４４は、ベクトルデータレジスタ３５に最大で８１９２サイズの配列が割り当て可能である情報を記憶している。配列候補検出部４４は、その情報に基づいて、配列Ａ、Ｂ、Ｃ、ＷＫ、Ｒの配列サイズと、ベクトルデータレジスタ３５に最大で格納可能な配列サイズとを比較する。
【００７９】
配列候補検出部４４は、配列Ａの配列サイズが１０２８５７６であることを算出し、ベクトルデータレジスタ３５の割り当て可能な配列サイズ８１９２と比較する。ここで、配列Ａの配列サイズはベクトルデータレジスタ３５の割り当て可能な配列サイズより大きいため、配列候補検出部４４は配列Ａをベクトルレジスタに割り当て可能な配列とは判定しない。
【００８０】
同様に、配列候補検出部４４は、配列Ｂの配列サイズがＮ、配列Ｃの配列サイズがＮ×１０２４であることを算出し、ベクトルデータレジスタ３５の割り当て可能な配列サイズ８１９２と比較する。図７のサブルーチンにおいてＮは引数（具体的な数ではなく、変数として取り扱われる引数）で指定されているため、コンパイル時の配列Ｂ及び配列Ｃの具体的な配列サイズは不明である。従って、配列候補検出部４４は、配列Ｂ及び配列Ｃをベクトルレジスタに割り当て可能とは判定しない。
【００８１】
同様に、配列候補検出部４４は、配列Ｒ及び配列ＷＫの配列サイズが１０２４であることを算出し、ベクトルデータレジスタ３５の割り当て可能な配列サイズ８１９２と比較する。配列候補検出部４４は、コンパイル時に配列Ｒ及び配列ＷＫの具体的な配列サイズが判明していること、かつその配列サイズが８１９２より小さな配列であることを判定して、配列Ｒ及び配列ＷＫがベクトルデータレジスタ３５に割り当て可能な配列であると判定する。これにより、ベクトルデータレジスタ３５に割り当て可能な配列があると判定される（ステップＳ１３のＹｅｓ）。配列候補検出部４４は、配列Ｒ及び配列ＷＫを抽出し（ステップＳ１４）、抽出した配列Ｒ及び配列ＷＫの情報をメモリアクセス解析処理部４５に出力する。
【００８２】
メモリアクセス解析処理部４５は、配列候補検出部４４から出力された情報に基づいて、配列Ｒ及び配列ＷＫについてのメモリアクセスの解析を行う（ステップＳ１５）。ベクトルレジスタ３３の１個のレジスタに格納可能なデータは２５６ワードである。そのため、プログラムの実行の際に配列Ｒ又は配列ＷＫがメインメモリ３２に割り当てられた場合、メモリアクセスはベクトル演算処理部３１のベクトル命令により実行され、一度に２５６ワードアクセスされる。メモリアクセス回数は、このベクトル命令の実行回数で見積もられる。
【００８３】
メモリアクセス解析処理部４５は、配列Ｒ又は配列ＷＫをメインメモリ３２に割り当ててベクトル計算機３０が目的プログラムを実行するときのメモリアクセス回数を求める。ここでメモリアクセス解析処理部４５は、１個のレジスタに格納可能なデータの情報（２５６ワード）について記憶している。図７において、（１）は一重にループされたＤＯループ部分であり、（１）の演算式では、左辺の配列ＷＫが右辺の数０．０により定義されている。（１）のループ回数は１０２４であるため、配列ＷＫは１０２４回定義される。そのため、配列ＷＫはその定義において４（＝１０２４÷２５６）回メモリアクセスがなされることを、メモリアクセス解析処理部４５は算出する。
【００８４】
（２）は二重にループされたＤＯループ部分であり、（２）の演算式では、左辺の配列ＷＫが右辺の配列ＷＫ、配列Ｂ及び配列Ｃにより定義されている。つまり、（２）は、配列ＷＫが定義かつ参照される。（２）では、内側のＤＯループ部分のループ回数は１０２４、外側のＤＯループ部分のループ回数はＮであるため、配列ＷＫは１０２４×Ｎ回定義及び参照される。そのため、配列ＷＫはその定義及び参照において、それぞれ４×Ｎ（＝（１０２４×Ｎ）÷２５６）回メモリアクセスがなされることを、メモリアクセス解析処理部４５は算出する。
【００８５】
（３）は二重にループされたＤＯループ部分であり、（３）の演算式では、左辺の配列Ｒが右辺の配列Ｒ、Ａ、ＷＫにより定義されている。つまり、（３）では、配列ＷＫが参照されるとともに、配列Ｒが定義かつ参照される。（３）では、内側のＤＯループ部分のループ回数は１０２４、外側のＤＯループ部分のループ回数は１０２４であるため、配列ＷＫは１０２４×１０２４回参照され、配列Ｒは１０２４×１０２４回、定義及び参照がされる。そのため、配列ＷＫはその参照において４×１０２４（＝（１０２４×１０２４）÷２５６）回メモリアクセスがなされることを、メモリアクセス解析処理部４５は算出する。配列Ｒも同様にして、その定義及び参照において、それぞれ４×１０２４回メモリアクセスがなされることを、メモリアクセス解析処理部４５は算出する。
【００８６】
次にメモリアクセス解析処理部４５は、配列Ｒ又は配列ＷＫをベクトルデータレジスタ３５に割り当ててベクトル計算機３０が目的プログラムを実行するときのメモリアクセス回数を求める。配列Ｒは、（３）の内側のループで１０２４回ループされているため、その定義及び参照において４（＝１０２４÷２５６）回メモリアクセスがなされることを、メモリアクセス解析処理部４５は算出する。なお、配列Ｒをベクトルデータレジスタ３５に割り当てるためには、図７に示すサブルーチンの入口でベクトルデータレジスタ３５が初期値を読み込み、サブルーチンの出口で終値がメインメモリ３２に書き込まれるように、原始プログラム２００を編集する必要がある。
【００８７】
なお配列ＷＫは、ローカル変数であり、図７の（１）のＤＯループ部分にて最初に値０で初期化されているため、上記の処理は不要である。従ってメモリアクセス解析処理部４５は、配列ＷＫの定義及び参照におけるメモリアクセスは不要（０回）と判定する。以上のようにして、メモリアクセス解析処理部４５は第１のアクセス回数及び第２のアクセス回数を見積もる。
【００８８】
図８は、以上のメモリアクセス回数の解析結果について示した表である。図８（ａ）は、配列ＷＫ及び配列Ｒをメモリに割り当てた場合のメモリアクセスの回数を示した表であり、図８（ｂ）は、配列ＷＫ及び配列Ｒをベクトルデータレジスタ３５に割り当てた場合のメモリアクセスの回数を示した表である。このメモリアクセスの回数は、ベクトル演算処理部３１のメインメモリ３２に対するベクトル命令の実行回数である。図８（ａ）、（ｂ）により、メモリアクセスの削減が可能かどうかを判定できる（ステップＳ１６）。図８（ａ）、（ｂ）から、第１のアクセス回数は（８×Ｎ＋１２２９２）回であり、第２のアクセス回数は８回である。従って、配列ＷＫ及び配列Ｒのメモリアクセスを合計で（８×Ｎ＋１２２８４）回削減することができることが示せる。この解析結果から、メモリアクセス解析処理部４５は、配列ＷＫ及び配列Ｒをメモリに割り当てることにより、メモリアクセスの削減が可能と判定する（ステップＳ１６のＹｅｓ）。メモリアクセス解析処理部４５は、この判定結果を配列の割り当て変更処理部４６に出力する。
【００８９】
配列の割り当て変更処理部４６は、この判定結果に基づいて、配列ＷＫの割り当て先をメインメモリ３２からベクトルデータレジスタ３５内の４個のレジスタへ変更する（ステップＳ１７）。配列の割り当て変更処理部４６は、配列Ｒの割り当て先をベクトルデータレジスタ３５へ変更するために、中間言語２０３に指示を追加する。この指示は、図７に示すサブルーチンの入口でメインメモリ３２からベクトルデータレジスタ３５に配列Ｒの値をコピーする処理と、サブルーチンの出口でベクトルデータレジスタ３５からメインメモリ３２に配列Ｒの値をコピーする処理とを、ベクトル計算機３０に実行させるための指示である。
【００９０】
レジスタ割り当て処理部４７は、配列の割り当て変更処理部４６の処理結果に基づいて、配列Ｒ、ＷＫの割り当て先がベクトルデータレジスタ３５になるようにレジスタ割り当て処理をやり直し、中間言語２０４を作成する（ステップＳ１８）。
【００９１】
目的プログラム生成処理部４８は、中間言語２０４に基づいて、目的プログラム２０１を生成する（ステップＳ１９）。これにより、配列Ｒ、ＷＫをベクトルデータレジスタ３５に割り当ててベクトル計算機３０が目的プログラム２０１を実行するように設定されているため、メモリアクセスを削減することが可能になっている。
【００９２】
まとめると、コンパイラ４０において、メモリアクセス最適化処理部４３は、原始プログラム２００の配列のメモリアクセス状況や、ベクトルデータレジスタ３５の利用状況を解析する。メモリアクセス最適化処理部４３はその解析結果に基づき、メモリアクセスが削減されるように、配列の割り当て先をメインメモリ３２からベクトルデータレジスタ３５内の１又は複数のレジスタへ変更する。目的プログラム生成処理部４８は、メモリアクセス最適化処理部４３の解析結果に従って、配列をベクトルデータレジスタ３５に割り当てて、メモリアクセスを削減した目的プログラム２０１を生成する。コンパイラ４０は、このように原始プログラム２００をコンパイルして目的プログラム２０１を生成する。
【００９３】
配列ＷＫ及び配列Ｒの割り当て先をメインメモリ３２からベクトルデータレジスタ３５に変更することにより、配列ＷＫ及び配列Ｒのメモリアクセスを削減することができる。そのため、コンパイラ４０は、実施の形態１のコンパイラ２０と同様に、プログラム実行時間の削減（プログラム実行の高速化）といったベクトル計算機３０の特性・性能向上を実現することができる。そして、コンパイラ４０は自動的に配列の割り当て変更を実行するため、プログラム実行時間の削減をするのにプログラマの特別な知識が不要である。
【００９４】
配列候補検出部４４は、原始プログラム２００内の配列に対して、配列のサイズがベクトルデータレジスタ３５に割り当て可能か否かを判定し、割り当て可能と判定された配列のみを配列候補として検出している。これにより、ベクトルデータレジスタ３５には割り当て可能なサイズの配列のみが割り当てられることになるので、ベクトル計算機３０は無駄な処理を実行せずにすみ、プログラム実行時間の削減を確実に実行することができる。
【００９５】
配列候補検出部４４は、原始プログラム２００内の引数に基づいてサイズが決定された配列がある場合に、この配列をベクトルデータレジスタ３５に割り当て可能とは判定せず、配列候補として検出を実行しない。これにより、ベクトルデータレジスタ３５には割り当て可能な配列のみがより確実に配列候補として検出されることになるので、ベクトル計算機３０は無駄な処理を実行せずにすみ、プログラム実行時間の削減をより確実に実行することができる。
【００９６】
メモリアクセス解析処理部４５で判定を実行する第１のアクセス回数及び第２のアクセス回数は、原始プログラム２００内の演算式において配列候補検出部４４が抽出した配列が定義される回数及びその配列が参照される回数に基づいて算出される。このため、メモリアクセス回数を正確にカウントすることができるため、正確な比較処理が実行できることにより、プログラム実行時間の削減を正確に行うことができる。
【００９７】
実施の形態２では、ベクトル演算機能を有するベクトル計算機において、ベクトル演算を実行するのに図６に示した最適化フローを実行した。これにより、ベクトル計算機をより効率的に運用することができる。
【００９８】
前述の通り、ベクトル計算機において、プログラムの実行時間のうちメモリアクセス時間の割合が大きくなっているため、メモリアクセスを削減するコンパイラの最適化機能の重要性が増している。本願発明の発明者は、この背景技術に鑑み、メモリアクセスを削減することを可能とするコンパイラを見出した。
【００９９】
なお、スカラー計算機におけるコンパイラでは、キャッシュメモリの先読み機能を利用した最適化を実行しているものはあるものの、配列をレジスタに割り当てる機能を有するものは確認できなかった。ＯｐｅｎＣＬ（Open Computing Language）というＣＰＵとＧＰＵのヘテロジニアスな環境の並列プログラミングシステムもあるが、グラフィックのデバイスドライバ用の開発環境であるため、コンパイラがプログラムを最適化する余地は少ない。例えば、配列の割り当て先をメインメモリからレジスタに変更すると、絵が出力されなくなる等の可能性がある。この開発環境をＨＰＣ（High Performance Computing）として利用するためには、ＧＰＵやデバイスドライバなどの専門的な知識が必要となり、一般のプログラマにはハードルが高いと考えられる。そのほか、例えばコンパイラの一種であるＣＵＤＡ（Compute Unified Device Architecture）  Ｆｏｒｔａｒｎにおいても、レジスタに配列を割り当てることは困難であると考えられる。
【０１００】
なお、本発明は上記実施の形態に限られたものではなく、趣旨を逸脱しない範囲で適宜変更することが可能である。例えば、実施の形態２においては、ベクトルデータレジスタではなく、キャッシュメモリに配列を割り当てることも可能である。
【０１０１】
実施の形態１、２に示した処理フローは、制御方法の１つとして、コンピュータ（例えばコンパイラ）に実行させることができる。例えば、処理フローを制御プログラムとしてコンピュータに実行させてもよい。
【０１０２】
プログラムは、様々なタイプの非一時的なコンピュータ可読媒体（non-transitory computer readable medium）を用いて格納され、コンピュータに供給することができる。非一時的なコンピュータ可読媒体は、様々なタイプの実体のある記録媒体（tangible storage medium）を含む。非一時的なコンピュータ可読媒体の例は、磁気記録媒体（例えばフレキシブルディスク、磁気テープ、ハードディスクドライブ）、光磁気記録媒体（例えば光磁気ディスク）、ＣＤ−ＲＯＭ、ＣＤ−Ｒ、ＣＤ−Ｒ／Ｗ、半導体メモリ（例えば、マスクＲＯＭ、ＰＲＯＭ（Programmable ROM）、ＥＰＲＯＭ（Erasable PROM）、フラッシュＲＯＭ、ＲＡＭ（Random Access Memory））を含む。また、プログラムは、様々なタイプの一時的なコンピュータ可読媒体（transitory computer readable medium）によってコンピュータに供給されてもよい。一時的なコンピュータ可読媒体の例は、電気信号、光信号、及び電磁波を含む。一時的なコンピュータ可読媒体は、電線及び光ファイバ等の有線通信路、又は無線通信路を介して、プログラムをコンピュータに供給できる。
【符号の説明】
【０１０３】
１０  計算機
１１  演算装置
１２  メインメモリ
１３  一時記憶装置
２０  コンパイラ
２１  抽出部
２２  算出部
２３  比較部
２４  生成部
３０  ベクトル計算機
３１  ベクトル演算処理部
３２  メインメモリ
３３  ベクトルレジスタ
３４  演算器
３５  ベクトルデータレジスタ
４０  コンパイラ
４１  中間言語作成処理部
４２  ベクトル化・最適化処理部
４３  メモリアクセス最適化処理部
４４  配列候補検出部
４５  メモリアクセス解析処理部
４６  配列の割り当て変更処理部
４７  レジスタ割り当て処理部
４８  目的プログラム生成処理部
１００  原始プログラム
１０１  目的プログラム
２００  原始プログラム
２０１  目的プログラム
２０２、２０３、２０４  中間言語
【図１】
0005821697.tif 000002
【図２】
0005821697.tif 000003
【図３】
0005821697.tif 000004
【図４】
0005821697.tif 000005
【図５】
0005821697.tif 000006
【図６】
0005821697.tif 000007
【図７】
0005821697.tif 000008
【図８】
0005821697.tif 000009
【図９】
0005821697.tif 000010