複数の命令を1個のSIMDSingleInstructionMultipleData命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組み合せである第1の組み合わせと第2の組み合わせを抽出し、抽出した前記第1の組み合わせと前記第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出する算出部と、前記第1の組み合わせと前記第2の組み合わせのうち、前記算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なうSIMD化部とを含むことを特徴とするコンパイル装置。前記算出部は、前記命令列に含まれる各々の命令の属性を表す命令データを生成し、生成した前記各々の命令についての命令データに基づいて、前記各々の命令の間における依存関係を表す依存データを生成する依存解析部を含むことを特徴とする請求項1に記載のコンパイル装置。前記依存解析部は、前記命令列として、連続する位置に存在する予め定められた数の命令を抽出して、前記依存関係の解析の対象とすることを特徴とする請求項2に記載のコンパイル装置。前記算出部は、前記各々の命令についての命令データと、前記依存データとに基づいて、前記SIMD化処理の候補を抽出する候補抽出部を含むことを特徴とする請求項2に記載のコンパイル装置。前記算出部は、前記第1の組み合わせと前記第2の組み合わせと、前記第1の組み合わせと前記第2の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、SIMD化する命令の組み合わせを生成し、生成した前記SIMD化する命令の組み合わせの各々について、SIMD化した場合の効果を解析する効果解析部を含むことを特徴とする請求項4に記載のコンパイル装置。前記効果解析部は、複数のSIMDレジスタにおいて対応する位置に存在するサブレジスタの集合であるスロット毎に、前記スロットに属するサブレジスタを管理するレジスタマップを生成し、生成した前記レジスタマップに基づいて、SIMD化した場合に必要となる転送命令を抽出することを特徴とする請求項5に記載のコンパイル装置。前記効果解析部は、前記第1の組み合わせと前記第2の組み合わせの各々について、SIMD化しない場合の命令実行時間と、SIMD化した場合の命令実行時間及び転送命令の実行時間の和との差分をスコアとして算出し、算出した前記スコアに基づいて、SIMD化した場合の効果を解析することを特徴とする請求項6に記載のコンパイル装置。算出部が、複数の命令を1個のSIMD命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第1の組み合わせと第2の組み合わせを抽出し、抽出した前記第1の組み合わせと前記第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出し、SIMD化部が、前記第1の組み合わせと前記第2の組み合わせのうち、前記算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なうことを特徴とするコンパイル方法。ソースプログラムをコンパイル処理することにより中間プログラムを生成するコンパイルプログラムであって、前記コンパイルプログラムは、コンピュータに、複数の命令を1個のSIMD命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第1の組み合わせと第2の組み合わせを抽出し、抽出した前記第1の組み合わせと前記第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出する処理と、前記第1の組み合わせと前記第2の組み合わせのうち、前記算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なう処理とを実行させることを特徴とするコンパイルプログラム。ソースプログラムをコンパイル処理することにより中間プログラムを生成するコンパイルプログラムを記録する記録媒体であって、複数の命令を1個のSIMD命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第1の組み合わせと第2の組み合わせを抽出し、抽出した前記第1の組み合わせと前記第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出する処理と、前記第1の組み合わせと前記第2の組み合わせのうち、前記算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なう処理とを実行させることを特徴とする記録媒体。図26の例においては、SIMD化により2つの加算命令を並行で実行したことになるので、SIMDの並列度が2であるという。並列度は、実行形式のプログラムを実行するコンピュータのアーキテクチャ及びSIMD命令セットに依存して定まる。並列度に合わせて、SIMDレジスタは、並列度の数の分のデータが保持できるように、並列度の数の分のサブレジスタを含む。図27Aは、SIMDレジスタにおいて、1つの大きなレジスタを分割してサブレジスタとして用いる場合を示す。この場合、1個のSIMDレジスタは、物理的な1個のレジスタを指すことになる。図27Aの例は、例えば分割方式と呼ばれる。図27Bは、SIMDレジスタにおいて、異なる複数のレジスタをグルーピングする場合を示す。この場合、1個のSIMDレジスタは、複数の物理的なサブレジスタを相互に関連付けた仮想的な集合を指すことになる。図27Aの例は、例えば結合方式と呼ばれる。図27A及び図27Bに示すように、並列度に応じて、SIMDレジスタに含まれるサブレジスタの数が変化する。例えば、並列度が2の場合にはサブレジスタsub1~sub2が含まれ、並列度が4の場合にはサブレジスタsub1~sub4が含まれる。同一の並列度の場合には、複数のサブレジスタのサイズは相互に等しくされる。実際には、複数のSIMDレジスタが設けられる。各々のSIMDレジスタは、同一の個数のサブレジスタを含み、相互に等しいサイズとされる。この明細書において、同一の並列度の場合に、各々のSIMDレジスタの中の同一の位置、換言すれば、対応する位置にあるサブレジスタの集合をスロットと呼ぶこととする。対応する位置とは、各々のSIMDレジスタにおいて、同一のビット位置にあることを言う。例えば、3個のSIMDレジスタS1~S3が存在し並列度が2である場合には、3個のサブレジスタsub1の集合が1個のスロットであり、3個のサブレジスタsub2の集合が1個のスロットである。SIMD命令においては、同じスロットに属するサブレジスタ同士が処理の対象とされる。例えば、SIMDレジスタS1、S2、S3が存在し、SIMD命令S1=S2S3を実行する場合における、スロットとサブレジスタとの関係を、図28に示す。この場合、図28Aに示すように、一方の命令がスロット1、換言すれば、SIMDレジスタのサブレジスタsub1側に割り当てられ、他方の命令がスロット2、換言すれば、SIMDレジスタのサブレジスタsub2側に割り当てられる。従って、図28Bに示すように、SIMDレジスタS2において、サブレジスタsub1へデータBIが割り当てられ、サブレジスタsub2へデータBI1が割り当てられる。SIMDレジスタS3において、サブレジスタsub1へデータCIが割り当てられ、サブレジスタsub2へデータCI1が割り当てられる。SIMDレジスタS1において、サブレジスタsub1へデータAIが割り当てられ、サブレジスタsub2へデータAI1が割り当てられる。SIMD命令S1=S2S3が実行されると、前述したように、同じスロットに属するサブレジスタ同士が演算処理の対象となる。従って、図28Cに示すように、スロット1において演算AI=BICIが実行され、スロット2において演算AI1=BI1CI1が実行される。ところで、SIMD化は、一般に、例えばDo文のようなループ構造の処理の並列化による高速化に有効である。そこで、図28に示すSIMD化を適用するために、図29に示すように、ソースプログラムに含まれるDoループを、一旦SIMD化の並列度の数分に展開、換言すれば、アンローリング最適化する。そして、Doループをアンローリング展開した命令列を、サブレジスタに割り当てる。これにより、展開した後のDoループに対して、SIMD最適化を適用することができる。なお、図29の例の場合、SIMD化の並列度の数は2である。従って、SIMDレジスタSnは、Sn{sub1|sub2}で示すように、各々、2個のサブレジスタsub1及びサブレジスタsub2を含む。ここで、コンパイラがソースプログラムに含まれるループ構造を認識することができれば、図29に示すように、コンパイラが、ループを並列度の数の分にアンローリング展開し、SIMD最適化を適用することができる。しかし、コンパイラがソースプログラムに含まれるループ構造を認識することができなければ、ループをアンローリング展開することができず、SIMD最適化を適用することができない。本発明の一側面として、ソースプログラムに含まれるループ構造に応じたSIMD化処理の処理量がループ構造の解析処理により増大することを抑制することを目的とする。開示されるコンパイル装置は、一側面によれば、算出部と、SIMD化部とを含む。算出部は、複数の命令を1個のSIMDSingleInstructionMultipleData命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組合せである第1の組合わせと第2の組み合わせを抽出し、抽出した第1の組み合わせと第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出する。SIMD化部は、第1の組み合わせと第2の組み合わせのうち、算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なう。一態様によれば、ソースプログラムに含まれるループ構造に応じたSIMD化処理の処理量がループ構造の解析処理により増大することを抑制することができる。前述したように、コンパイラがソースプログラムに含まれるループ構造を認識できない場合には、ループをアンローリング展開することができず、SIMD最適化を適用することができない。しかし、本発明者の検討によれば、ループ構造でなくても、同じ種類の演算を行う複数の命令に対しては、SIMD命令を適用することができる場合があると考えられる。換言すれば、図29の例のようにループ構造でない命令についても、SIMD最適化を適用することはできる場合があると考えられる。まず、並列度の数が2である場合について考える。この場合、隣接した2個の命令であれば、SIMD化することができる。例えば、図28Aに示す2個の命令が、図29のようにアンローリング展開の結果としてではなく、最初からソースプログラムに隣接して存在しているとする。この場合、隣接した2個の命令が、同じ種類の演算であるので、ループ構造でなくても、前述したように、SIMD化することができる。次に、並列度の数が4である場合について考える。一例として、図28の例における並列度を4にした場合を、図30に示す。なお、前述したように、SIMDレジスタS1、S2、S3が存在し、SIMD命令S1=S2S3を実行するものとする。並列度が4であるので、図28Aの2個の命令に代えて、図30Aに示す隣接する4個の命令を想定する。図30Aにおいて、隣接する4個の命令は、各々、スロット1~スロット4に割り当てられる。SIMD命令S1=S2S3が実行されると、図30Bに示すように、スロット1において演算AI=BICIが実行され、スロット2において演算AI1=BI1CI1が実行され、スロット3において演算AI2=BI2CI2が実行され、スロット4において演算AI3=BI3CI3が実行される。次に、多数の命令が隣接している場合について考える。なお、説明の簡単化のために、並列度の数は2であるとする。例えば、図31に示すように、8個の隣接する命令列があるとする。この場合、1行目の命令と2行目の命令とを、図28の例と同様に、SIMDレジスタS1~S3を用いてSIMD化することができる。更に、同様に、3行目の命令と4行目の命令とをSIMDレジスタS4~S6を用いてSIMD化し、5行目の命令と6行目の命令とをSIMDレジスタS7~S9を用いてSIMD化し、7行目の命令と8行目の命令とをSIMDレジスタS10~S12を用いてSIMD化することができる。ところが、複数の命令が隣接する命令列であっても、図32に示す場合には、SIMD化することができない。なお、並列度の数は2であるとする。この場合、1行目の演算結果AIを2行目の命令が参照し、2行目の演算結果DIを3行目の命令が参照し、3行目の演算結果FIを4行目の命令が参照している。このため、1行目の命令と2~4行目の命令とは、SIMD化することができない。同様に、2行目の命令と3~4行目の命令とは、SIMD化することができず、また、3行目の命令と4行目の命令とは、SIMD化することができない。この結果、1行目の命令~4行目の命令の組み合わせでは、SIMD化することはできない。同様に、5行目の命令~8行目の命令の組み合わせでは、SIMD化することはできない。換言すれば、複数の命令の間において依存関係がある場合には、当該複数の命令をSIMD化することはできない。一方、図32の例において、SIMD化の対象を隣接する命令に限らない場合について考える。具体的には、コンパイルの処理対象の命令に隣接しない位置、換言すれば、処理対象の命令から離れた位置の命令を、SIMD化する対象と考えることになる。この場合、図33に示すように、1行目の命令と5行目の命令とは、依存関係がないので、SIMD化することができる。同様に、2行目の命令と6行目の命令とはSIMD化することができ、3行目の命令と7行目の命令とはSIMD化することができ、4行目の命令と8行目の命令とはSIMD化することができる。ところが、本発明者の検討によれば、処理対象の命令から離れた位置の命令をSIMD化する場合には、SIMD化した結果を評価して、SIMD化により本当に最適化されているかを検証する必要があることが判った。換言すれば、SIMD化の対象を処理対象の命令から離れた位置からも選択可能とする場合には、SIMD化が高速化に直結しない場合があることが判った。具体的には、SIMDレジスタでは、異なるスロット間のデータを演算対象とすることができない。このため、あるスロットのサブレジスタに割り当てられたデータを、他のスロットのサブレジスタで使用する場合、サブレジスタ間でデータを転送する命令、換言すれば、サブレジスタ間の転送命令を実行する必要がある。例えば、図34Aに示す命令列について、図34Bに示すSIMD化を考えるとする。この場合、SIMDレジスタとサブレジスタとデータとの関係は、図35Aに示すような割り当てになる。なお、並列度の数は2であるとする。また、図35Aにおいては、図35Bに示すように、S1等のSIMDレジスタと共に、そのSIMDレジスタ内の2個のサブレジスタsub1及びsub2に割り当てられたデータを示している。図34B及び図35Aに示すように、1行目の命令と2行目の命令は、SIMDレジスタS1~S3を用いてSIMD化される。この結果、図35Aに示すように、データBI1は、SIMDレジスタS2において、サブレジスタsub2側スロット2に割り当てられる。一方、図34B及び図35Aに示すように、4行目の命令と5行目の命令は、SIMDレジスタS4~S6を用いてSIMD化される。この結果、図35Aに示すように、データBI1は、SIMDレジスタS5において、サブレジスタsub1側スロット1に割り当てられる。従って、図35Aの3行目に示すように、データBI1を、SIMDレジスタS2のサブレジスタsub2から、SIMDレジスタS5のサブレジスタsub1へ転送する必要がある。なお、サブレジスタ間の転送命令は高いオーバーヘッドになる場合が多く、レジスタ間の転送が無い方が望ましい。また、サブレジスタ間の転送命令のコストが少ないアーキテクチャにおいても、レジスタ転送命令の削減は、SIMD化の効果をより増加させる。ところが、図36に示すように、1行目の命令と2行目の命令についてのSIMD化において、データBI1が、SIMDレジスタS2のサブレジスタsub1側スロット1に割り当てられたとする。換言すれば、SIMDレジスタS1~S3において、データAI1及びデータAI、データBI1及びデータBI、データCI1及びデータCIが、各々、図35の例とは逆のサブレジスタに割り当てられたとする。この場合、図36に示すように、サブレジスタ間の転送命令の実行は不要となる。このように、SIMDレジスタへのデータの割り当てに依存して、サブレジスタ間の転送命令が必要となるかが変化する。従って、処理対象の命令から離れた位置の命令をSIMD化する場合には、SIMD化した結果を評価して、SIMD化により本当に最適化されているかを検証する必要がある。また、同じ種類の演算が複数存在する場合、SIMD化が可能な組み合わせは命令数に比例して大きくなる。このため、膨大な組み合わせの中から例えば図36の例のような有効な候補を抽出することは難しい。従って、処理対象の命令から離れた位置の命令をSIMD化する場合には、有効な候補の抽出のために多大なコンパイル時間が必要となることが判った。更に、同じ種類の演算として、図37Aのように加算命令が8つ存在する場合には、SIMD化処理の候補以下、SIMD化の候補と言うとして、図37B及び図37Cに示すように、40320通りの組み合わせが存在する。コンパイラは、これらの中から例えば図36のような有効な候補を抽出する。この時、40320通りのSIMD化の候補を、メモリに一旦格納する必要がある。なお、32ビットマシンのアドレス空間の最大値は4294967295であるが、この範囲で納まる命令数の数は12個であり、479001600通りの組み合わせまでとなる。従って、処理対象の命令から離れた位置の命令をSIMD化する場合には、大容量のメモリが必要となることが判った。開示されるコンパイル装置、コンパイル方法、コンパイルプログラム及び記録媒体は、ループに属さない命令についてもSIMD化を可能とする。図1は、コンパイルシステムの一例を示す図である。図2は、SIMD化によるコンパイル処理の説明図である。コンパイルシステムは、入力装置1と、コンパイル装置2とを含む。コンパイル装置2は、コンパイラ3と、記憶部4と、リンカ5とを含む。コンパイラ3は、ソースプログラム入力部31と、入出力制御部32と、中間言語生成部33と、最適化部34と、中間言語記憶部37と、コード生成部38と、オブジェクトファイル出力部39とを含む。最適化部34は、ソース解析部35と、最適化実行部36とを含む。ソース解析部35は、依存解析部351と、候補抽出部352と、効果解析部353とを含む。記憶部4は、ソースプログラム41と、オブジェクトファイル42と、実行ファイル43とを含む。入力装置1は、ソースプログラム41をコンパイル装置2に入力する。ソースプログラム41は、ユーザにより高級言語で記述されたプログラムである。入力されたソースプログラム41は、コンパイル装置2の記憶部4に格納される。コンパイル装置2において、コンパイラ3のソースプログラム入力部31は、ソースプログラム41を記憶部4から読み出して、入出力制御部32へ送る。入出力制御部32は、コンパイル処理時のオプションやソースプログラム41のファイルの種別等に応じて必要な処理をした後、ソースプログラム41を中間言語生成部33に送る。中間言語生成部33は、ソースプログラム41を受け取ると、受け取ったソースプログラム41を中間プログラムに変換して、中間言語記憶部37に格納する。中間プログラムは、コンパイラ3の内部で使用される中間コード又は中間言語で記述されたプログラムである。中間言語記憶部37は、中間プログラムを格納する。中間言語生成部33は、中間プログラムを生成したことを最適化部34に通知する。最適化部34は、中間プログラムの生成を通知されると、中間言語記憶部37に格納された中間プログラムを最適化する。具体的には、最適化部34は、中間言語記憶部37に格納された中間プログラムを読み出して、読み出した中間プログラムを解析する。又は、最適化部34は、ソースプログラム41を参照して、ソースプログラム41を解析する。そして、最適化部34は、解析結果に基づいて中間プログラムを最適化して、最適化した中間プログラムを中間言語記憶部37に格納する。最適化部34は、最適化の終了をコード生成部38に通知する。この時、最適化部34は、ソース解析部35及び最適化実行部36によるSIMD最適化を実行する。具体的には、ソース解析部35は、複数の命令を1個のSIMD命令に置き換えるSIMD化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組合せである第1の組合わせと第2の組み合わせを抽出し、抽出した第1の組み合わせと第2の組み合わせの各々についてSIMD化した場合の予測実行時間を算出する。ソース解析部35は、予測実行時間を算出する算出部である。最適化実行部36は、第1の組み合わせと第2の組み合わせのうち、算出部で算出された予測実行時間が短い組み合わせについてSIMD化を行なう。ソース解析部35は、SIMD化を行なうSIMD化部である。最適化部34におけるSIMD最適化処理については後述する。なお、最適化部34は、ループ内の命令、換言すれば、ループに属する命令についてもSIMD化することにより、最適化した中間プログラムを生成する。これにより、ループに属する命令及びループに属さない命令の双方、換言すれば、全ての命令に対して、最も有効なSIMD化を適用することができ、プログラムの実行性能を向上させることができる。コード生成部38は、最適化の終了を通知されると、中間言語記憶部37に格納された中間プログラムを読み出して、読み出した中間プログラムに基づいて、アセンブリ言語で記述されたオブジェクトプログラムを生成する。コード生成部38は、生成したオブジェクトプログラムを、入出力制御部32を介して、オブジェクトファイル出力部39に送る。オブジェクトファイル出力部39は、コード生成部38からオブジェクトプログラムを受け取ると、受け取ったオブジェクトプログラムからオブジェクトプログラムを格納するオブジェクトファイル42を生成して、記憶部4に格納する。オブジェクトファイル出力部39は、オブジェクトファイル42の生成をリンカ5に通知する。リンカ5は、オブジェクトファイル42の生成を通知されると、記憶部4に格納されたオブジェクトファイル42を読み出して、オブジェクトファイル42において指定されたライブラリとオブジェクトプログラムとを結合して、実行形式のプログラムを含む実行ファイル43を生成して、記憶部4に格納する。前述したように、最適化部34による最適化処理において、ソース解析部35及び最適化実行部36によるSIMD最適化を実行する。ソース解析部35は、中間言語記憶部37から読み出された中間プログラム、又は、ソースプログラム41を解析し、解析結果に基づいて有効なSIMD最適化の候補を選択し、選択したSIMD最適化の候補を最適化実行部36に通知する。具体的には、ソース解析部35において、依存解析部351は、中間プログラム又はソースプログラム41の命令列に含まれる各々の命令の間における依存関係を解析し、依存関係を解析した結果を候補抽出部352に通知する。候補抽出部352は、依存関係を解析した結果に基づいて、複数の命令を1個のSIMD命令に置き換えるSIMD化の候補として、依存関係の無い複数の命令の組合せを複数抽出し、抽出した複数のSIMD化の候補を効果解析部353に通知する。効果解析部353は、抽出した複数のSIMD化の候補の各々についてSIMD化した場合の効果を解析し、ソース解析部35に通知する。例えば、依存解析部351、候補抽出部352及び効果解析部353は、各々、サブルーチンであり、ソース解析部35から呼び出されて処理を実行する。例えば、図2に示すような入力コード、換言すれば、中間言語記憶部37から読み出された中間プログラムが、コンパイラ3の最適化部34へ読み込まれる。そして、中間プログラムの解析結果に基づいて、例えば、1行目の命令に対するSIMD化の候補として、2行目の命令が選択される。また、3行目の命令SIMD化の候補として、4行目の命令が選択される。なお、以下の説明においては、説明のために、例えば図2に示すように、各々の命令列を、中間コードではなく、ソースコードで表すこととする。最適化実行部36は、ソース解析部35から選択したSIMD最適化の候補を通知されると、通知されたSIMD最適化の候補を中間言語記憶部37に格納された中間プログラムに対して適用する。換言すれば、最適化実行部36は、解析部における効果の解析の結果に基づいて、効果の解析の結果が最も優れているSIMD化の候補についてSIMD化することにより、ソースプログラムから生成された中間プログラムを最適化する。具体的には、最適化実行部36は、中間言語記憶部37から中間プログラムを読み出し、読み出した中間プログラムにおいて、通知されたSIMD最適化の候補をSIMD命令に変換して、変換後の中間プログラムを中間言語記憶部37に格納する。これにより、SIMD最適化により中間プログラムが最適化される。なお、最適化実行部36は、ソース解析部35によるSIMD化のための解析以外の最適化部34による他の最適化のための解析結果に従って、SIMD化以外の最適化も実行する。例えば、図2に示すように、1行目の命令と、これに対するSIMD化の候補である2行目の命令とが、SIMD化により最適化される。また、3行目の命令と、これに対するSIMD化の候補である4行目の命令とが、SIMD化により最適化される。この時、図2に示すように、最適化部34は、サブレジスタを管理するためにレジスタマップ354を作成する。また、最適化部34は、有効なSIMD最適化の候補を選択するためにスコアリング部355を含む。図3は、コンパイル装置のハードウェアの構成の一例を示す図である。CPU101は、ROM102に格納された制御プログラムに従って、コンパイル装置2を制御する。CPU101は、例えば主メモリであるRAM103上のコンパイルプログラム及びリンカプログラムを実行する。これにより、コンパイラ3及びリンカ5が実現される。コンパイルプログラム及びリンカプログラムは、例えば、CD-ROMやDVD等の記録媒体109に格納され、記録媒体109からハードディスク106に入力され、ハードディスク106からCD-ROMドライブやDVDドライブ等を介してRAM103にロードされる。記憶部4は、例えばハードディスク106に設けられ、ソースプログラム41、オブジェクトファイル42、実行ファイル43を格納する。中間言語記憶部37は、例えばRAM103に設けられる。入力装置104は、入力装置1以外の入力装置であり、例えばキーボード、マウス等を含む。出力装置105は、例えばディスプレイであり、プリンタ等の出力装置を含んでも良い。CPU101、ROM102、RAM103、入力装置104、出力装置105、及び、ハードディスク106、ネットワーク接続部107は、バス108を介して、相互に接続される。ネットワーク接続部107は、例えば、送受信装置であり、ネットワークに接続され、ネットワークを介して他のコンピュータ、例えばソースプログラム41を生成する生成装置及び実行ファイルを実行する実行装置に接続される。以下、最適化部34のソース解析部35が、依存解析部351と候補抽出部352と効果解析部353とにより実行する、SIMD化による最適化処理について説明する。最初に、依存解析部351が実行する依存解析処理について説明する。依存解析部351は、ソースプログラム41又は中間プログラムを、予め定められた数の命令を含む命令列に区分し、区分した命令列を部分的に抽出する。換言すれば、依存解析部351は、命令列として、ソースプログラム41又は中間プログラムにおいて連続する位置に存在する予め定められた数の命令を、ソースプログラム41又は中間プログラムから抽出して、依存関係の解析の対象とする。抽出される命令列は依存関係の解析の対象であるので、抽出される命令列に含まれる命令の数を解析幅という。以下の説明において、予め定められた数、換言すれば、解析幅は、例えば12とされる。解析幅は、予め定められ、12以外の値であっても良い。依存解析部351は、抽出した解析幅の分の命令列に含まれる各々の命令の属性を表す命令データを生成し、生成した各々の命令についての命令データに基づいて、各々の命令の間における依存関係を表す依存データを生成する。これにより、命令列に含まれる命令の間における依存関係を構築する。ここで、依存関係とは、レジスタへ格納される複数の命令データの定義における参照の関係である。依存関係を構築するとは、前記参照の関係を結ぶこと、換言すれば、複数の命令データの定義に基づいて依存データを生成することである。例えば、ソースプログラム41又は中間プログラムが、図4Aに示すような命令列であるとする。図4Aの命令列において、各々の命令の命令形式は、図4Bに示すように、LOADのような命令と、mem01のような参照オペランドと、R01のような定義オペランドとを含む形式とされる。図4Cに示すように、命令LOADはメモリに格納されたデータをレジスタにロードする命令であり、命令MULTはレジスタのデータを積算する命令であり、命令ADDはレジスタのデータを加算する命令である。オペランドは、図4Dに示すように、mem01~mem08のようなメモリ名や、R01~R14のようなレジスタ名とされる。依存解析部351は、図4Aの命令列を、解析幅12で区切り、1個の解析幅の範囲で命令の依存関係を解析し、また、解析幅の範囲で複数の命令を組み合わせてSIMD化を行う。換言すれば、1個の解析幅の範囲に存在する複数の命令の組み合わせを、1個のSIMD命令に置き換える。解析幅が12である場合、図5Aに示すように、先頭から12個の命令を依存解析の対象とされる。図5Aに示す依存解析の対象は、例えば当該依存解析の対象についてのスコアの算出の終了まで、依存解析部351に保持される。例えば、先頭から12行目の命令と13行目の命令とがSIMD化できる関係にあるとしても、異なる命令列に属するので、SIMD化の対象とされない。このように、解析幅を制限することにより、コンパイラ3の処理の負担が大きくなることを回避して、事実上、全ての命令をSIMD化の対象とすることができる。依存解析部351は、図5Aの解析幅に属する命令列に含まれる各々の命令について、図5Aに示すように、各々の命令の属性を表す命令データを生成する。例えば、図5Aの解析幅における最初の命令について見ると、当該命令から、図4Bに示す命令形式に基づいて、命令名としてLOAD、定義オペランドとしてR01、参照オペランドとしてmem01が得られる。命令番号は、図5Aの解析幅における当該命令の行番号、換言すれば、当該命令が図5Aの解析幅の何行目であるかに基づいて定められる。解析済フラグは、解析されていないことを表すFALSEとされる。解析済フラグは、解析の後に、換言すれば、依存データの生成の後に、解析されたことを表すTRUEとされる。依存解析部351は、図5Aの解析幅における各々の命令について、同様にして命令データを生成する。これにより、図5Aの解析幅における各々の命令についての命令データが生成される。依存解析部351は、解析幅に属する各々の命令についての図5Aに示す命令データに基づいて、図5Aに示すように、各々の命令の間における依存関係を表す依存データを生成する。例えば、依存解析部351は、命令番号1の命令データの定義オペランドR01を取り出して、命令番号2~12の命令データを検索する。これにより、命令番号1の命令データの定義オペランドR01が、命令番号3の命令データの参照オペランドと同一であることを検出する。そこで、依存解析部351は、依存データとしてE1→3を生成する。依存データの形式は、図5Bに示すように、定義オペランドを持つ命令データの命令番号から、参照オペランドを持つ命令データの命令番号を指すようにされる。これにより、2個の命令間の依存関係が、命令番号を用いて表された依存データとして管理される。依存解析部351は、解析幅に属する各々の命令についての図5Aに示す命令データについて、同様にして依存データを生成する。これにより、図5Aの解析幅における各々の命令についての依存データが生成される。例えば、図5Aに示す依存データをグラフ化すると、図6に示すようになる。依存データにより、解析幅に属する各々の命令の間に、図6のような依存関係があることを抽出することができる。図6において、直線上にある複数の命令の間には、定義と参照の依存関係が成立する。直線上にある複数の命令とは、直線で結ばれた2個の命令、又は、直線で結ばれた1又は複数の他の命令を介して結ばれる2個の命令である。従って、直線上にある複数の命令は、依存関係があるので同時に処理することができず、SIMD化の対象とすることができない。換言すれば、依存関係のある複数の命令は、後述するように、SIMD化の候補として抽出されない。次に、依存解析部351が実行する依存解析処理を、図7~図9を参照して詳細に説明する。図7は、依存解析部351が実行する依存解析処理フローであり、特に、命令データの生成処理について示す。依存解析部351は、命令データの命令番号に1を設定しステップS11、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、未解析の命令の中から先頭の1個の命令を、処理対象として選択するステップS12。そして、依存解析部351は、選択した命令から、属性情報命令名定義オペランド参照オペランドを抽出し、その時点での命令番号に付加することにより、選択した命令についての命令データを生成するステップS13。この時、解析済フラグはFALSEとされる。この後、依存解析部351は、先に選択した命令の次の命令に処理対象を移動してステップS14、命令データの命令番号をインクリメントすることにより1を加算するステップS15。この後、依存解析部351は、解析幅の数だけステップS13を繰り返す。例えば、前述したように、解析幅が12であるとする。この場合、ステップS15において求めた命令番号が12であれば、解析幅の数だけ処理を繰り返したことになる。従って、ステップS15において求めた命令番号が12以下である場合にはステップS13を繰り返し、12より大きい場合には処理を終了する。これにより、解析幅の数の命令を含む命令列について、命令データが生成される。図8は、依存解析部351が実行する依存解析処理フローであり、特に、依存データの生成処理について示す。依存解析部351は、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、最後の命令についての命令データをMとするステップS21。例えば解析幅が12である場合、命令番号12の命令についての命令データがMとされる。この後、依存解析部351が、解析サブルーチン、換言すれば、解析サブルーチン実行部を呼び出して、命令データMを渡して解析を依頼すると、解析サブルーチンが命令データMを解析して、解析の結果を依存解析部351に返すステップS22。この後、依存解析部351は、処理した命令の1個前の命令についての命令データをMとしてステップS23、解析幅の数だけステップS22を繰り返す。例えば、前述したように、解析幅が12であるとする。この場合、最後の命令についての命令データ、換言すれば、命令番号が12から処理を開始しているので、ステップS23で求めた命令の命令番号が1であれば、解析幅の数だけ処理を繰り返したことになる。従って、ステップS23において求めた命令番号が1でない場合にはステップS13を繰り返し、1である場合には処理を終了する。図9は、依存解析部351が実行する依存解析処理フローであり、特に、依存データの生成処理における解析処理、換言すれば、解析サブルーチンによる処理について示す。解析サブルーチンは、命令データMが解析幅内のものか否かを判断するステップS31。例えば、前述したように、解析幅が12であるとする。この場合、命令データMの命令番号が12以下であれば、解析幅の数の範囲内である。従って、命令データMの命令番号が12以下である場合には命令データMが解析幅内のものと判断し、12より大きい場合には命令データMが解析幅内のものでないと判断する。命令データMが解析幅内のものでない場合ステップS31NO、解析サブルーチンは、命令データMが解析幅内のものでない旨を、依存解析部351へ返す。命令データMが解析幅内のものである場合ステップS31YES、解析サブルーチンは、命令データMの解析済フラグがFALSEかTRUEかを判定するステップS32。命令データMの解析済フラグがTRUEである場合、解析サブルーチンは、命令データMが解析済みである旨を、依存解析部351へ返す。命令データMの解析済フラグがFALSEである場合、解析サブルーチンは、命令データMの参照オペランドと同じデータを定義オペランドとして持つ命令データを検索し、該当する命令データが存在する場合には、該当する命令データを定義データDに代入するステップS33。この後、解析サブルーチンは、定義データDが解析幅内のものか否かを判断するステップS34。例えば、依存解析部351に保持されている図5Aに示す処理対象の命令列を定義データDを用いて検索することにより、定義データDと同一の命令が図5Aに示す処理対象の命令列に存在するか否かが調べられる。命令データMが解析幅内のものでない場合ステップS34NO、解析サブルーチンは、命令データMが解析幅内のものでない旨を、依存解析部351へ返す。命令データMが解析幅内のものである場合ステップS34YES、解析サブルーチンは、定義データDの命令番号を定義して、換言すれば、定義データDの命令番号を求めて、定義データDが命令データMの命令番号を参照する依存データを作成するステップS35。この後、解析サブルーチンは、命令データMの参照オペランドの数だけステップS33を繰り返す。これにより、命令データMの参照オペランドの各々についての依存データが作成される。次に、候補抽出部352が実行する候補抽出処理について説明する。候補抽出部352は、各々の命令についての命令データと、依存データとに基づいて、SIMD化の候補を抽出する。換言すれば、候補抽出部352は、命令データ及び依存データに基づいて、SIMD化の候補となる命令の組合せを抽出する。命令の組合せは、命令データの命令番号を関連付けることにより管理される。具体的には、候補抽出部352は、図5Aの解析幅に属する命令の中から、図6において直線上にある複数の命令、換言すれば、依存関係のある命令を除く、2個の命令の組合せを抽出する。例えば、図4Aの命令列から抽出された図5Aの解析幅に属する命令からは、図10に示すように、SIMD化の候補となる命令の組合せが抽出される。抽出される命令の組合せに含まれる命令の数は、前述したように、並列度の数が2であるので、2個である。抽出される命令の組合せに含まれる2個の命令は、同一の命令である。例えば、組合せ1-2は、共に、命令LOADである。なお、例えば、組合せ3-8と同時に、組合せ3-10のように、相互に一部が重なる組合せが存在しても良い。候補抽出部352は、図10に示す複数のSIMD化の候補の各々について、図11に示すように、エッジデータを生成する。エッジデータは、SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報、換言すれば、反転フラグを含む。エッジデータの格納領域は、図11Aに示すように、エッジ番号の格納領域、反転フラグの格納領域、命令番号[N]の格納領域を含む。エッジ番号は、エッジデータを一意に識別する識別情報であり、エッジデータの管理に用いられる。反転フラグは、組合せの並び替えが可能か否かを表す情報である。命令番号[N]は、SIMD化の候補となる組合せに属する命令を表し、当該命令についての命令データに含まれる命令番号である。反転フラグFALSEは、複数の命令の並び替えが可能であることを示す。反転フラグTRUEは、複数の命令の並び替えが可能でないことを示す。候補抽出部352は、命令の種類に応じて、エッジデータにおける反転フラグFALSE又はTRUEを設定する。例えば、命令LOADの場合及び命令ADDの場合には、反転フラグFALSEが設定される。命令MULTの場合には、反転フラグTRUEが設定される。図11Aに示すエッジデータの格納領域において、エッジ番号は、1から順に付与される。例えば、図10に示すSIMD化の候補の各々について、上段左側から順にエッジ番号1~5が付与され、次に、下段上段左側から順にエッジ番号6~8が付与される。Nは並列度の数である。従って、命令番号[N]の格納領域に含まれる命令番号の数、換言すれば、命令の数は、N個である。候補抽出部352は、最初に、図11Aに示すエッジデータの格納領域を生成する。この後、候補抽出部352は、生成したエッジデータの格納領域をコピーして、コピーしたエッジデータの格納領域にN個の命令番号を格納することを繰り返す。この例では、前述したように、並列度の数は2であるので、命令番号[1]の格納領域と命令番号[2]の格納領域とに、各々、命令番号が格納される。この時、格納される命令番号は、先頭から順に、1ずつシフトされる。例えば、エッジ番号が1のエッジデータにおいては1及び2の命令番号が格納され、エッジ番号が2のエッジデータにおいては2及び3の命令番号が格納され、最後のエッジデータにおいては11及び12の命令番号が格納される。これにより、図11Bに示すように、エッジデータの集合が得られる。図11Bにおいて、命令番号[1]に1が格納されている状態は、スロット1に命令番号1の命令が設定されている状態である。従って、命令番号[1]はスロット1に相当し、命令番号[2]はスロット2に相当する。SIMD化した場合において、命令番号[1]には各々のSIMDレジスタにおける対応する位置のサブレジスタsub1が割り当てられ、命令番号[2]には各々のSIMDレジスタにおける対応する位置のサブレジスタsub2が割り当てられる。換言すれば、命令番号[1]の命令にはサブレジスタsub1が割り当てられ、命令番号[2]にはサブレジスタsub2が割り当てられる。なお、命令番号[N]の格納領域に含まれる命令番号の数は、並列度の数が4である場合には4個となり、並列度の数が8である場合には8個となる。例えば、図30のように並列度が4の場合における、エッジデータと、スロット及びサブレジスタの関係は、図12のようになる。図12において、エッジデータには4個の命令番号が含まれる。従って、4個のスロットが存在する。例えば、命令番号[1]はスロット1に相当し、命令番号[1]には各々のSIMDレジスタにおける対応する位置のサブレジスタsub1が割り当てられる。次に、依存解析部351が実行する依存解析処理を、図13~図15を参照して詳細に説明する。図13は、候補抽出部352が実行する候補抽出処理フローであり、特に、命令データからのエッジデータの生成処理について示す。候補抽出部352は、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、最初の命令についての命令データをMとするステップS41。また、候補抽出部352は、図11Aに示すエッジデータEを生成するステップS42。この時、生成されたエッジデータEにおいて、エッジ番号は0とされ、反転フラグはFALSEとされる。更に、候補抽出部352は、スロットSを初期値0に設定するステップS43。この後、候補抽出部352が、エッジデータ設定サブルーチン、換言すれば、エッジデータ設定サブルーチン実行部を呼び出して、命令データM、エッジデータE及び変数Sを渡してエッジデータの設定を依頼すると、エッジデータ設定サブルーチンがエッジデータEを設定して、設定したエッジデータEを候補抽出部352に返すステップS44。この後、候補抽出部352は、処理した命令の次の命令についての命令データをMとしてステップS45、命令データの数だけステップS42を繰り返す。例えば、前述したように、解析幅が12であるとする。この場合、最初の命令についての命令データ、換言すれば、命令番号が1から処理を開始しているので、ステップS45で求めた命令の命令番号が12であれば、命令データの数だけ処理を繰り返したことになる。従って、ステップS45において求めた命令番号が12以下である場合にはステップS42を繰り返し、12より大きい場合には処理を終了する。図14は、候補抽出部352が実行する候補抽出処理フローであり、特に、エッジデータの設定処理、換言すれば、エッジデータ設定サブルーチンによる処理について示す。エッジデータ設定サブルーチンは、スロットSをインクリメントすることにより1を加算した後ステップS51、設定された値に対応するスロットが存在するか否かを判断するステップS52。例えば、並列度がNである場合、スロットSの値はNが最大値とされる。換言すれば、並列度がNである場合、スロットSの値がN以下である場合に、スロットSは存在する。スロットが存在しない場合ステップS52NO、エッジデータ設定サブルーチンは、エッジデータ確定サブルーチン、換言すれば、エッジデータ確定サブルーチン実行部を呼び出して、それまでに生成されたエッジデータEを渡してエッジデータの確定を依頼すると、エッジデータ確定サブルーチンが、エッジデータEをチェックした上で確定して、確定したエッジデータEをエッジデータ設定サブルーチンに返すステップS58。エッジデータ設定サブルーチンは、確定したエッジデータEを受け取ると、それまでに生成されたエッジデータEを候補抽出部352に返す。スロットが存在する場合ステップS52YES、エッジデータ設定サブルーチンは、命令データMが別のスロットに存在するか否かを判断するステップS53。命令データMが別のスロットに存在する場合ステップS53YES、エッジデータ設定サブルーチンは、以下のステップS54~S56の実行を省略して、ステップS57を実行する。命令データMが別のスロットに存在しない場合ステップS53NO、エッジデータ設定サブルーチンは、エッジデータEをコピーすることによりエッジデータE’を生成するステップS54。この時、エッジデータE’のエッジ番号は、コピー元のエッジデータEのエッジ番号に1を加えた値とされる。この後、エッジデータ設定サブルーチンは、エッジデータE’の命令番号[S]に命令データMの命令番号を設定するステップS55。この後、エッジデータ設定サブルーチンは、再度、エッジデータ設定サブルーチンを呼び出して、命令データM、エッジデータE’及び変数Sを渡してエッジデータの設定を依頼すると、再帰呼び出されたエッジデータ設定サブルーチンがエッジデータE’を設定して、設定したエッジデータE’を再帰呼び出したエッジデータ設定サブルーチンに返すステップS56。この後、エッジデータ設定サブルーチンは、処理した命令の次の命令についての命令データをMとしてステップS57、命令データの数だけステップS53を繰り返す。例えば、前述したように、解析幅が12であるとする。この場合、ステップS57で求めた命令の命令番号が12であれば、命令データの数だけ処理を繰り返したことになる。従って、ステップS57において求めた命令番号が12以下である場合にはステップS53を繰り返し、12より大きい場合には処理を終了する。図15は、候補抽出部352が実行する候補抽出処理フローであり、特に、エッジデータの確定処理、換言すれば、エッジデータ確定サブルーチンによる処理について示す。エッジデータ確定サブルーチンは、エッジデータEに含まれる命令が全て同じ命令であるか否かを判断するステップS61。エッジデータEに含まれる命令が全て同じ命令でない場合ステップS61NO、SIMD化することができないので、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータEを破棄してステップS65、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。エッジデータEに含まれる命令が同じ命令である場合ステップS61YES、換言すれば、エッジデータEに同じ命令が含まれる場合、エッジデータ確定サブルーチンは、更に、エッジデータEに含まれる命令に依存関係がないか否かを判断するステップS62。エッジデータEに含まれる命令に依存関係がある場合ステップS62NO、SIMD化することができないので、エッジデータ確定サブルーチンは、ステップS65を実行して、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。エッジデータEに含まれる命令に依存関係がない場合ステップS62YES、エッジデータ確定サブルーチンは、更に、エッジデータEに含まれる命令をSIMD化した場合に、SIMD命令のアーキテクチャの禁止事項に違反しないか否かを判断するステップS63。例えば、SIMD命令のアーキテクチャによっては、平方根の演算をSIMD化しないことが規定されている。これは、平方根の演算のための命令が別に用意されているためである。禁止事項に違反する場合ステップS63NO、SIMD化することができないので、エッジデータ確定サブルーチンは、ステップS65を実行して、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。禁止事項に違反しない場合ステップS63YES、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータEを保存してステップS64、エッジデータEを保存した旨をエッジデータ設定サブルーチンに返す。次に、効果解析部353が実行する効果解析処理について説明する。効果解析部353は、複数のSIMD化の候補と、SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、SIMD化する命令の組合せを生成する。複数のSIMD化の候補は、例えば、図10に示される8組の候補である。SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報は、図11Bに示すエッジデータにおける反転フラグの値FALSE又はTRUEである。そして、効果解析部353は、生成したSIMD化する命令の組合せの各々について、SIMD化した場合の効果を解析する。SIMD化する命令の組合せをSIMD化パターンと言うこととする。効果解析部353は、SIMD化パターンの各々について、SIMD化した場合の効果を評価する。例えば、効果解析部353は、図16に示すように、図10のSIMD化の候補から、SIMD化する命令の組合せ、換言すれば、SIMD化パターンを選択する。例えば、図10において、1-2の組合せを選択すると、命令番号2が重なることを回避しなければならないので、2-4の組合せを選択することはできない。命令番号2が重なることを回避するのは、命令が冗長実行になることを回避するためである。また、例えば、6-7の組合せを選択すると、命令番号6が重なることを回避しなければならないので、4-6及び7-9の組合せを選択することはできない。このようにして、例えば、図16に示す複数のSIMD化パターン1~SIMD化パターン3が選択される。1個のSIMD化パターンに含まれる命令の組合せの数は、1以上であれば良く、SIMD化パターン1のように3個でも良く、SIMD化パターン2のように4個でも良い。なお、図16は、選択されたSIMD化パターンの一部を示す。SIMD化パターンが生成された時点において、SIMD化パターンのスコアは不明であるが、図16においては、後述するようにして算出されるスコアを参考として示している。スコアについては後述する。図16において、SIMD化パターン2には3-8の組合せが含まれ、SIMD化パターン3には8-3の組合せが含まれる。このように、エッジデータにおいて、命令番号の順番が入れ替わったものが、SIMD化パターンに含まれる。例えば、図17に示すように、エッジ番号が7のエッジデータにおいて、反転フラグがTRUEであるとする。この場合、当該エッジデータにおいて、命令番号[1]に格納される命令番号3と、命令番号[2]に格納される命令番号8とが入れ替えられ、新たなエッジデータとされる。これにより、エッジ番号が7のエッジデータのサブレジスタを入れ替えたデータが表される。図16に示すように、新たなエッジデータも、SIMD化パターンの生成において用いられる。効果解析部353は、図16に示すSIMD化パターンに基づいて図18に示すパックデータを生成し、生成したパックデータにより、図16に示すSIMD化パターンを管理する。パックデータは、SIMD化パターン毎に生成される。図18は、パックデータの一例を示し、図16のSIMD化パターン2についてのパックデータである。SIMD化パターンに含まれる命令の組合せの各々が、パックデータにおける1個のパックとされる。従って、SIMD化パターン2についてのパックデータは、4個のパックを含む。パックデータにおいて、各々のパックに対応してエッジ番号が格納される。例えば、図16のSIMD化パターン2の先頭の命令の組合せがパック[1]とされる。具体的には、先頭の命令の組合せ1-2は、図11Bに示すエッジ番号1を持つので、パック[1]は、1-2であるエッジ番号1を持つエッジデータである。従って、パックデータにおいて、パック[1]に対応してエッジ番号1が格納される。これにより、エッジ番号1を持つエッジデータを参照することができる。効果解析部353のスコアリング部355は、パックデータに基づいて、図19に示すように、レジスタマップ354を生成する。レジスタマップ354は、複数のSIMDレジスタにおいて対応する位置に存在するサブレジスタの集合であるスロット毎に生成され、スロットに属するサブレジスタを管理する。従って、レジスタマップ354は、並列度の数の分だけ生成される。そして、効果解析部353は、生成したレジスタマップ354に基づいて、SIMD化した場合に必要となるサブレジスタの間における転送命令を抽出する。更に、スコアリング部355は、図19に示すように、複数のSIMD化の候補の各々について、スコアを算出し、算出したスコアに基づいて、SIMD化した場合の効果を解析する。スコアリング部355は、転送命令を抽出した後、複数のSIMD化の候補の各々について、SIMD化しない場合の命令実行時間と、SIMD化した場合の命令実行時間及び転送命令の実行時間の和との差分をスコアとして算出する。スコアリング部355は、図21を参照して後述するスコア計算式を保持し、スコア計算式を用いてスコアを算出する。図20は、レジスタマップ354の生成の一例を示し、図16のSIMD化パターン3についてのレジスタマップ354を示す。スコアリング部355は、図20に示すように、SIMD化パターンから、同一のスロットに割当てられる命令を抽出し、各々の命令が保持するデータを抽出する。前述したように、同一のスロットの命令が、対応する位置のサブレジスタに割り当てられる。このため、例えば、スロット1には、命令1、命令6、命令8、命令5が割当てられる。命令1は命令番号1を持つ命令である。各命令において使用されるデータ又はレジスタは、当該命令の参照オペランド及び定義オペランドに基づいて求めることができる。例えば、命令1には、サブレジスタR01が含まれる。従って、スロット1に対応するレジスタマップ[1]には、R01が格納される。R01は、実際には、サブレジスタのレジスタ名である。同様にして、命令6、命令8、命令5からサブレジスタのレジスタ名を抽出することにより、レジスタマップ[1]が生成される。また、スロット2には、命令2、命令7、命令3、命令10が割当てられる。命令2には、サブレジスタR02が含まれる。従って、スロット2に対応するレジスタマップ[2]には、R02が格納される。同様にして、命令7、命令3、命令10からサブレジスタのレジスタ名を抽出することにより、レジスタマップ[2]が生成される。このように、レジスタマップ354は、各スロットに属するサブレジスタをグループとして管理する。レジスタマップ[1]とレジスタマップ[2]との間において、同じレジスタ名が格納されている場合、相互に異なるスロットのデータを処理することになる。従って、サブレジスタ間におけるデータの転送命令が必要であることを抽出することができる。このように、レジスタマップ354によりサブレジスタ間のデータの転送の必要性を抽出することができるので、SIMD化のコストを計算することができ、最も有効なSIMD化パターンを抽出することができる。図20においては、レジスタ名R07とレジスタ名R03とが、各々、レジスタマップ[1]とレジスタマップ[2]の双方に出現する。これにより、2つのデータが異なるスロットで要求されるので、サブレジスタ間の転送命令が実行されることになる。図20においては、図16のSIMD化パターン3に従ってSIMD化した場合には、2個の転送命令を実行する必要があることが判る。図21は、スコアリング部355が保持するスコアの計算式の一例を示す。図21に示すように、SIMD化前の実行時間であるSIMD化前の時間は、元の命令の実行時間×並列度の数×命令の数により求まる。実行時間とは、命令を実行するために必要な想定時間である。実行時間及び並列度の数は、予め定められる。命令の数は、SIMD化の候補が定まれば、求めることができる。SIMD化により必要となる転送時間である転送命令の時間は、サブレジスタ間の転送命令の数×転送命令の実行時間により求まる。転送命令の数は、前述したように、レジスタマップ354から求めることができる。SIMD化後の実行時間であるSIMD化後の時間は、元の命令の実行時間×命令の数SIMD化により必要となる転送命令の時間により求まる。この場合において、SIMD化の効果を表すスコアは、SIMD化前の時間-SIMD化後の時間により求まる。ここで、SIMD化後の時間が、SIMD化した場合の予測実行時間である。以下に述べるように、複数のSIMD化処理の候補の中で、スコアが最も良いSIMD化パターンにより、実際のSIMD化が行われる。比較の対象である複数のSIMD化処理の候補についてSIMD化前の時間は同じであるから、予測実行時間が最も短いSIMD化パターンにより、実際のSIMD化が行われる。図22は、スコアリング部355が、図16のSIMD化パターン3について、図21のスコアの計算式によりスコアを計算した例を示す。図22において、命令LOAD及び四則演算の実行時間が6であるものとし、転送命令の実行時間が6であるものとする。この場合、図22に示すように、SIMD化パターン3についてのスコアは12となる。なお、図16に示すように、SIMD化パターン1についてのスコアは18となり、SIMD化パターン2についてのスコアは24となる。従って、SIMD化前後の差分が最大であるSIMD化パターン2が、効果の解析の結果が最も優れている、換言すれば、最もSIMD化の効果が大きいことが判る。以上のスコアリング部355による効果の解析の結果に基づいて、効果解析部353は、図16のSIMD化パターン2によるSIMD化を選択する。これにより、最適化実行部36は、中間プログラムの該当する命令をSIMD化パターン2によりSIMD化する。この結果、効果の解析の結果が最も優れているSIMD化を実現することができる。また、スコアを算出することにより、SIMD化パターンを容易かつ正確に評価することができる。この結果、コンパイル時間を削減することができ、また、有効なSIMD化パターンのみを保持すれば良いので、メモリ使用量を削減することができる。次に、効果解析部353が実行する効果解析処理を、図23~図25を参照して詳細に説明する。図23は、効果解析部353が実行する効果解析処理フローであり、特に、パックデータの生成に基づくSIMD化の依頼処理について示す。効果解析部353は、エッジ番号eを0に設定することによりエッジ番号を初期値に設定し、ベストなスコアを保存する領域Zをグローバルな領域に確保して-1に設定するステップS71。そして、効果解析部353は、Bをベストパックデータに設定し、Pをパックデータに設定するステップS72。ベストパックデータB、パックデータPを格納する領域は、グローバルな領域に確保される。この後、効果解析部353は、パックデータ設定サブルーチン、換言すれば、パックデータ設定サブルーチン実行部を呼び出して、エッジ番号e、パックデータPを渡してパックデータの設定を依頼すると、パックデータ設定サブルーチンがパックデータPを設定して、設定したパックデータPを効果解析部353に返すステップS73。この後、効果解析部353は、Z=-1であるか否かを判断するステップS74。Z=-1である場合ステップS74YES、効果解析部353は、ベストパックデータBを利用して、SIMD化の適用依頼を生成して、生成したSIMD化の適用依頼を最適化部35に返すステップS75。Z=-1でない場合ステップS74NO、効果解析部353は、SIMD化の中止依頼を生成して、生成したSIMD化の中止依頼を最適化部35に返すステップS76。図24は、効果解析部353が実行する効果解析処理フローであり、特に、パックデータの設定処理、換言すれば、パックデータ設定サブルーチンによる処理について示す。パックデータ設定サブルーチンは、スコア判定サブルーチン、換言すれば、スコア判定サブルーチン実行部を呼び出して、パックデータPを渡してスコアTの判定を依頼すると、スコア判定サブルーチンがパックデータPのスコアTを判定して、判定したパックデータPのスコアTをパックデータ設定サブルーチンに返すステップS81。スコアTは、現在のパックデータPのスコアであり、スコア判定サブルーチンの復帰値である。この後、パックデータ設定サブルーチンは、エッジデータeをインクリメントすることにより1を加算するステップS82。これにより、処理対象が次のエッジデータに移動する。そして、パックデータ設定サブルーチンは、エッジデータeが最大エッジ番号よりも大きいか否かを判断するステップS83。最大エッジ番号は、図10に示すエッジデータの数に等しい。エッジデータeが最大エッジ番号よりも大きい場合ステップS83YES、パックデータ設定サブルーチンは、パックデータPのスコアTを効果解析部353に返す。エッジデータeが最大エッジ番号よりも小さい場合ステップS83NO、パックデータ設定サブルーチンは、更に、判定条件Aのいずれかに合致するか否かを判断するステップS84。ここで、判定条件Aは以下の3つとされる。第1の判定条件は、エッジ番号eに含まれる命令番号は登録済みであることである。例えば、図10に示すエッジデータの中で、先頭の2個のエッジデータが、第1の判定条件に該当する。第2の判定条件は、既存のパックデータPに依存関係があることである。依存関係がある場合には、SIMD化することができない。第3の判定条件は、スコアTが既存のいずれかのスコアTよりも悪いことである。スコアTが悪いので、現在のパックデータPの処理を進める意味が無い。判定条件Aのいずれかに合致する場合ステップS84YES、パックデータ設定サブルーチンは、以下のステップS85~S87の実行を省略して、ステップS88を実行する。判定条件Aのいずれにも合致しない場合ステップS84NO、パックデータ設定サブルーチンは、エッジ番号eをパックデータPに追加してステップS85、再度、パックデータ設定サブルーチンを呼び出して、エッジ番号e及びパックデータPを渡してパックデータの設定を依頼すると、再帰呼び出されたパックデータ設定サブルーチンがパックデータPを設定して、設定したパックデータPを再帰呼び出したパックデータ設定サブルーチンに返すステップS86。この後、パックデータ設定サブルーチンは、ステップS85において追加したエッジ番号eを、パックデータPから削除するステップS87。そして、パックデータ設定サブルーチンは、再度、パックデータ設定サブルーチンを呼び出して、エッジ番号e及びパックデータPを渡してパックデータの設定を依頼すると、再帰呼び出されたパックデータ設定サブルーチンがパックデータPを設定して、設定したパックデータPを再帰呼び出したパックデータ設定サブルーチンに返すステップS88。この後、パックデータ設定サブルーチンは、パックデータPのスコアTを効果解析部353に返す。図25は、効果解析部353が実行する効果解析処理フローであり、特に、パックデータの設定処理におけるスコア判定処理、換言すれば、スコア判定サブルーチンによる処理について示す。スコア判定サブルーチンは、パックデータPから先頭のエッジデータEを取り出しステップS91、スロット番号Sを1に設定しステップS92、取り出したエッジデータEの命令番号[S]の命令データを取り出すステップS93。次に、スコア判定サブルーチンは、取り出した命令データにおいて、定義オペランド及び参照オペランドに含まれるサブレジスタをレジスタマップ[S]に登録するステップS94。換言すれば、スロットSについてのレジスタマップ354が生成される。そして、スコア判定サブルーチンは、スロットSをインクリメントすることにより1を加算し、換言すれば、スロットSの番号を更新しステップS95、並列度の数だけステップS93を繰り返す。次に、スコア判定サブルーチンは、パックデータPから先頭のエッジデータEを取り出しステップS96、エッジデータの数だけステップS92を繰り返す。これにより、図20に示すように、スロットSの各々について、レジスタマップ354が生成される。次に、スコア判定サブルーチンは、値Zにレジスタマップ354間で重なっているサブレジスタの数を求めて代入しステップS97、スコアTにスコアの計算式による計算結果を代入してステップS98、算出したスコアTが値Zよりも大きいか否かを判断するステップS99。スコアTが値Zよりも大きい場合ステップS99YES、スコア判定サブルーチンは、値ZにスコアTを代入し、パックデータPをベストパックデータBに代入するステップS910。この後、スコア判定サブルーチンは、求めたスコアT及びベストパックデータBをパックデータ設定サブルーチンに返す。これにより、図19に示すように、最も優れたスコアTと、そのスコアTを持つパックデータPが得られる。スコアTが値Zよりも大きくない場合ステップS99NO、スコア判定サブルーチンは、スコアTが値Zよりも大きくない旨をパックデータ設定サブルーチンに返す。