(57)【特許請求の範囲】
【請求項１】
複数の命令を１個のＳＩＭＤ（Single Instruction Multiple Data）命令に置き換えるＳＩＭＤ化処理の候補となる、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第１の組み合わせと第２の組み合わせを抽出し、抽出した前記第１の組み合わせと前記第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出し、前記第１の組み合わせと、前記第２の組み合わせと、前記第１の組み合わせと前記第２の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組み合わせを生成し、生成した前記ＳＩＭＤ化する命令の組み合わせの各々について、ＳＩＭＤ化した場合の効果を解析し、解析された前記ＳＩＭＤ化した場合の効果に基づいて、前記第１の組み合わせと前記第２の組み合わせのうち、前記予測実行時間が短い組み合わせを、ＳＩＭＤ化を行なう対象として選択する算出部と、
前記第１の組み合わせと前記第２の組み合わせのうち、前記算出部で選択された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なうＳＩＭＤ化部とを含む
ことを特徴とするコンパイル装置。
【請求項２】
前記算出部は、前記命令列に含まれる各々の命令の属性を表す命令データを生成し、生成した前記各々の命令についての命令データに基づいて、前記各々の命令の間における依存関係を表す依存データを生成する依存解析部を含む
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項３】
前記依存解析部は、前記命令列として、連続する位置に存在する予め定められた数の命令を抽出して、前記依存関係の解析の対象とする
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項４】
前記算出部は、前記各々の命令についての命令データと、前記依存データとに基づいて、前記ＳＩＭＤ化処理の候補を抽出する候補抽出部を含む
ことを特徴とする請求項２に記載のコンパイル装置。
【請求項５】
前記算出部は、複数のＳＩＭＤレジスタにおいて対応する位置に存在するサブレジスタの集合であるスロット毎に、前記スロットに属するサブレジスタを管理するレジスタマップを生成し、生成した前記レジスタマップに基づいて、ＳＩＭＤ化した場合に必要となる転送命令を抽出する
ことを特徴とする請求項１に記載のコンパイル装置。
【請求項６】
前記算出部は、前記第１の組み合わせと前記第２の組み合わせの各々について、ＳＩＭＤ化しない場合の命令実行時間と、ＳＩＭＤ化した場合の命令実行時間及び転送命令の実行時間の和との差分をスコアとして算出し、算出した前記スコアに基づいて、ＳＩＭＤ化した場合の効果を解析する
ことを特徴とする請求項５に記載のコンパイル装置。
【請求項７】
算出部が、複数の命令を１個のＳＩＭＤ命令に置き換えるＳＩＭＤ化処理の候補となる、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第１の組み合わせと第２の組み合わせを抽出し、抽出した前記第１の組み合わせと前記第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出し、
効果解析部が、前記第１の組み合わせと、前記第２の組み合わせと、前記第１の組み合わせと前記第２の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組み合わせを生成し、生成した前記ＳＩＭＤ化する命令の組み合わせの各々について、ＳＩＭＤ化した場合の効果を解析し、
前記算出部が、前記効果解析部で解析されたＳＩＭＤ化した場合の効果に基づいて、前記第１の組み合わせと前記第２の組み合わせのうち、前記予測実行時間が短い組み合わせを、ＳＩＭＤ化を行なう対象として選択し、
ＳＩＭＤ化部が、前記第１の組み合わせと前記第２の組み合わせのうち、前記算出部で選択された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なう
ことを特徴とするコンパイル方法。
【請求項８】
ソースプログラムをコンパイル処理することにより中間プログラムを生成するコンパイルプログラムであって、
前記コンパイルプログラムは、コンピュータに、
複数の命令を１個のＳＩＭＤ命令に置き換えるＳＩＭＤ化処理の候補となる、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第１の組み合わせと第２の組み合わせを抽出し、抽出した前記第１の組み合わせと前記第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出する処理と、
前記第１の組み合わせと、前記第２の組み合わせと、前記第１の組み合わせと前記第２の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組み合わせを生成し、生成した前記ＳＩＭＤ化する命令の組み合わせの各々について、ＳＩＭＤ化した場合の効果を解析する処理と、
解析された前記ＳＩＭＤ化した場合の効果に基づいて、前記第１の組み合わせと前記第２の組み合わせのうち、前記予測実行時間が短い組み合わせを、ＳＩＭＤ化を行なう対象として選択する処理と、
前記第１の組み合わせと前記第２の組み合わせのうち、前記選択する処理で選択された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なう処理とを実行させる
ことを特徴とするコンパイルプログラム。
【請求項９】
ソースプログラムをコンパイル処理することにより中間プログラムを生成するコンパイルプログラムを記録する記録媒体であって、
前記コンパイルプログラムは、コンピュータに、
複数の命令を１個のＳＩＭＤ命令に置き換えるＳＩＭＤ化処理の候補となる、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第１の組み合わせと第２の組み合わせを抽出し、抽出した前記第１の組み合わせと前記第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出する処理と、
前記第１の組み合わせと、前記第２の組み合わせと、前記第１の組み合わせと前記第２の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組み合わせを生成し、生成した前記ＳＩＭＤ化する命令の組み合わせの各々について、ＳＩＭＤ化した場合の効果を解析する処理と、
解析された前記ＳＩＭＤ化した場合の効果に基づいて、前記第１の組み合わせと前記第２の組み合わせのうち、前記予測実行時間が短い組み合わせを、ＳＩＭＤ化を行なう対象として選択する処理と、
前記第１の組み合わせと前記第２の組み合わせのうち、前記選択する処理で選択された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なう処理とを実行させる
ことを特徴とする記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル装置、コンパイル方法、コンパイルプログラム、記録媒体に関する。
【背景技術】
【０００２】
ＳＩＭＤ（Single Instruction Multiple Data）命令は、単一命令で複数のデータを同時に処理することができる命令セットである。そこで、ソースプログラムのコンパイル処理において、複数の通常命令を１個のＳＩＭＤ命令に置き換えれば、プログラムの実行速度の高速化を図ることができる。
【０００３】
このような、ソースプログラムに含まれる通常の命令をＳＩＭＤ命令に置き換えることによる最適化を「ＳＩＭＤ最適化」と呼ぶ。ＳＩＭＤ最適化により、複数の通常の命令が１個のＳＩＭＤ命令に置き換えられる。また、ソースプログラムに含まれる命令にＳＩＭＤ最適化を適用することを「ＳＩＭＤ化」と呼ぶ。
【０００４】
例えば、図２６の例では、加算命令Ａ＝Ｂ＋Ｃと加算命令Ｘ＝Ｙ＋ＺとをＳＩＭＤ化することにより、１つのＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３で実行することができる。ここで、Ａ〜Ｃ及びＸ〜Ｚは、各々、通常のレジスタであり、Ｓ１〜Ｓ３は、各々、ＳＩＭＤレジスタである。ＳＩＭＤ命令は、ＳＩＭＤレジスタを含むＳＩＭＤ命令実行部により実行される。
【０００５】
加算命令Ａ＝Ｂ＋Ｃは、通常のレジスタＢに存在するデータと通常のレジスタＣに存在するデータとを加算して通常のレジスタＡに格納する命令である。加算命令Ｘ＝Ｙ＋Ｚも同様である。ＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３は、ＳＩＭＤレジスタＳ２に存在するデータとＳＩＭＤレジスタＳ３に存在するデータとを加算してＳＩＭＤレジスタＳ１に格納する命令である。ＳＩＭＤレジスタは、ＳＩＭＤ命令によって利用されるデータを格納するレジスタであり、通常のレジスタに相当するサブレジスタを複数個含む。例えば、ＳＩＭＤレジスタＳ１は、通常のレジスタＡ及びＸに相当するサブレジスタを含む。ＳＩＭＤレジスタＳ２及びＳ３も同様である。従って、ＳＩＭＤレジスタを用いた１個の加算命令の実行により、２個の加算命令の実行と同等の結果が得られる。換言すれば、２個の加算命令をＳＩＭＤ化することにより、２個の加算命令を並列に実行したことになる。
【０００６】
なお、例えば、管理機構がマップ・セットを含むレジスタ・マッピングを含み、マップ・セットの各マップが複数のマップ・レジスタを有し、実レジスタ・セットは、マップ・セットのマップ・エントリを介してプロセッサによって間接的にアクセスされ、実レジスタ・セット内の実レジスタの数は、マップ・セット内のマップ・エントリの数より多く、マップ・セットのマップ・エントリは、任意の時点で実レジスタ・セットのサブセットのみを参照し、この機構が、単一の更新命令の実行に応答して、マップ・セットのうちの少なくとも１つのマップの複数のマップ・エントリを更新することにより、レジスタ・マッピングのマップ・セットの複数のエントリへの更新を管理する、ことが提案されている。
【０００７】
また、例えば、ソースプログラムを解析して並列実行可能な演算子を検出し、並列実行可能な演算子の組を示す並列化情報を生成する並列性解析部と、ＳＩＭＤ型のコプロセッサに実行させるＳＩＭＤ命令の命令生成規則と並列化情報の一致判定を行い、一致判定の結果に応じて、ソースプログラム中のＳＩＭＤ命令への置換対象となるプログラム記述を定義した動作定義とＳＩＭＤ命令とが組み込まれた機械命令関数を記憶装置から読み出すＳＩＭＤ命令生成部と、機械命令関数に基づいてソースプログラム中の動作定義に一致するプログラム記述をＳＩＭＤ命令に置換するＳＩＭＤコンパイラとを備える、ことが提案されている。
【０００８】
また、例えば、ソースプログラム並び替え処理機構が、ソースプログラム中のループ取出し部、当該ループ内のブロックに対して処理の実行順序について深さ優先の探索処理によって認識して順序付けを行う実行順序認識部、および実行順序認識部によって順序付けの行われたループ内のブロックについて物理的な順序並び換えを順序付けの結果にもとづいて行う物理的な順序並び替え部を少なくともそなえる、ことが提案されている。
【０００９】
また、例えば、制御構造解析処理が多重ループを検出し、多重ループの最内側ループから順次外側へ向かって、ループ内のアクセス算出処理が当該ループｎより内側ループでアクセスする配列要素の数を計算し、この値がバッファやローカルメモリの大きさより大きい場合は、配列添字可変不変判定処理が当該ループｎより外側のループｍで、ループ不変添字でアクセスされる配列を探し、該当する配列があれば、ループ交換可否判定処理が当該ループｎと外側ループｍとの交換可否を調べ、可能であれば、ループ構造変換処理が当該ループｎを２重ループに分解し、その一方を外側ループｍと交換し、外へ追い出すことにより、配列の各要素のアクセスを局所化する、ことが提案されている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００７−２３４０１１号公報
【特許文献２】特開２００６−２４３８３９号公報
【特許文献３】特公平０６−４０３０９号公報
【特許文献４】特開平０１−２６１７２８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
図２６の例においては、ＳＩＭＤ化により２つの加算命令を並行で実行したことになるので、ＳＩＭＤの並列度が「２」であるという。並列度は、実行形式のプログラムを実行するコンピュータのアーキテクチャ及びＳＩＭＤ命令セットに依存して定まる。並列度に合わせて、ＳＩＭＤレジスタは、並列度の数の分のデータが保持できるように、並列度の数の分のサブレジスタを含む。
【００１２】
図２７（Ａ）は、ＳＩＭＤレジスタにおいて、１つの大きなレジスタを分割してサブレジスタとして用いる場合を示す。この場合、１個のＳＩＭＤレジスタは、物理的な１個のレジスタを指すことになる。図２７（Ａ）の例は、例えば分割方式と呼ばれる。
【００１３】
図２７（Ｂ）は、ＳＩＭＤレジスタにおいて、異なる複数のレジスタをグルーピングする場合を示す。この場合、１個のＳＩＭＤレジスタは、複数の物理的なサブレジスタを相互に関連付けた仮想的な集合を指すことになる。図２７（Ａ）の例は、例えば結合方式と呼ばれる。
【００１４】
図２７（Ａ）及び図２７（Ｂ）に示すように、並列度に応じて、ＳＩＭＤレジスタに含まれるサブレジスタの数が変化する。例えば、並列度が２の場合にはサブレジスタｓｕｂ１〜ｓｕｂ２が含まれ、並列度が４の場合にはサブレジスタｓｕｂ１〜ｓｕｂ４が含まれる。同一の並列度の場合には、複数のサブレジスタのサイズは相互に等しくされる。
【００１５】
実際には、複数のＳＩＭＤレジスタが設けられる。各々のＳＩＭＤレジスタは、同一の個数のサブレジスタを含み、相互に等しいサイズとされる。この明細書において、同一の並列度の場合に、各々のＳＩＭＤレジスタの中の同一の位置、換言すれば、対応する位置にあるサブレジスタの集合を「スロット」と呼ぶこととする。対応する位置とは、各々のＳＩＭＤレジスタにおいて、同一のビット位置にあることを言う。例えば、３個のＳＩＭＤレジスタＳ１〜Ｓ３が存在し並列度が２である場合には、３個のサブレジスタｓｕｂ１の集合が１個のスロットであり、３個のサブレジスタｓｕｂ２の集合が１個のスロットである。
【００１６】
ＳＩＭＤ命令においては、同じスロットに属するサブレジスタ同士が処理の対象とされる。例えば、ＳＩＭＤレジスタＳ１、Ｓ２、Ｓ３が存在し、ＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３を実行する場合における、スロットとサブレジスタとの関係を、図２８に示す。
【００１７】
この場合、図２８（Ａ）に示すように、一方の命令が「スロット１」、換言すれば、ＳＩＭＤレジスタのサブレジスタｓｕｂ１側に割り当てられ、他方の命令が「スロット２」、換言すれば、ＳＩＭＤレジスタのサブレジスタｓｕｂ２側に割り当てられる。従って、図２８（Ｂ）に示すように、ＳＩＭＤレジスタＳ２において、サブレジスタｓｕｂ１へデータＢ（Ｉ）が割り当てられ、サブレジスタｓｕｂ２へデータＢ（Ｉ＋１）が割り当てられる。ＳＩＭＤレジスタＳ３において、サブレジスタｓｕｂ１へデータＣ（Ｉ）が割り当てられ、サブレジスタｓｕｂ２へデータＣ（Ｉ＋１）が割り当てられる。ＳＩＭＤレジスタＳ１において、サブレジスタｓｕｂ１へデータＡ（Ｉ）が割り当てられ、サブレジスタｓｕｂ２へデータＡ（Ｉ＋１）が割り当てられる。
【００１８】
ＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３が実行されると、前述したように、同じスロットに属するサブレジスタ同士が演算処理の対象となる。従って、図２８（Ｃ）に示すように、スロット１において演算Ａ（Ｉ）＝Ｂ（Ｉ）＋Ｃ（Ｉ）が実行され、スロット２において演算Ａ（Ｉ＋１）＝Ｂ（Ｉ＋１）＋Ｃ（Ｉ＋１）が実行される。
【００１９】
ところで、ＳＩＭＤ化は、一般に、例えばＤｏ文のようなループ構造の処理の並列化による高速化に有効である。そこで、図２８に示すＳＩＭＤ化を適用するために、図２９に示すように、ソースプログラムに含まれるＤｏループを、一旦ＳＩＭＤ化の並列度の数分に展開、換言すれば、アンローリング最適化する。そして、Ｄｏループをアンローリング展開した命令列を、サブレジスタに割り当てる。これにより、展開した後のＤｏループに対して、ＳＩＭＤ最適化を適用することができる。
【００２０】
なお、図２９の例の場合、ＳＩＭＤ化の並列度の数は「２」である。従って、ＳＩＭＤレジスタＳｎは、「Ｓｎ｛ｓｕｂ１｜ｓｕｂ２｝」で示すように、各々、２個のサブレジスタｓｕｂ１及びサブレジスタｓｕｂ２を含む。
【００２１】
ここで、コンパイラがソースプログラムに含まれるループ構造を認識することができれば、図２９に示すように、コンパイラが、ループを並列度の数の分にアンローリング展開し、ＳＩＭＤ最適化を適用することができる。しかし、コンパイラがソースプログラムに含まれるループ構造を認識することができなければ、ループをアンローリング展開することができず、ＳＩＭＤ最適化を適用することができない。
【００２２】
本発明の一側面として、ソースプログラムに含まれるループ構造に応じたＳＩＭＤ化処理の処理量がループ構造の解析処理により増大することを抑制することを目的とする。
【課題を解決するための手段】
【００２３】
開示されるコンパイル装置は、一側面によれば、算出部と、ＳＩＭＤ化部とを含む。算出部は、複数の命令を１個のＳＩＭＤ（Single Instruction Multiple Data）命令に置き換えるＳＩＭＤ化処理の候補となる、処理対象の命令列から依存関係の無い複数の命令の組み合わせである第１の組み合わせと第２の組み合わせを抽出し、抽出した第１の組み合わせと第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出し、第１の組み合わせと、第２の組み合わせと、第１の組み合わせと第２の組み合わせに含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組み合わせを生成し、生成したＳＩＭＤ化する命令の組み合わせの各々について、ＳＩＭＤ化した場合の効果を解析し、解析されたＳＩＭＤ化した場合の効果に基づいて、第１の組み合わせと第２の組み合わせのうち、予測実行時間が短い組み合わせを、ＳＩＭＤ化を行なう対象として選択する。ＳＩＭＤ化部は、第１の組み合わせと第２の組み合わせのうち、算出部で選択された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なう。
【発明の効果】
【００２４】
一態様によれば、ソースプログラムに含まれるループ構造に応じたＳＩＭＤ化処理の処理量がループ構造の解析処理により増大することを抑制することができる。
【図面の簡単な説明】
【００２５】
【図１】コンパイルシステムの一例を示す図である。
【図２】ＳＩＭＤ化によるコンパイル処理の説明図である。
【図３】コンパイル装置のハードウェアの構成の一例を示す図である。
【図４】ＳＩＭＤ化の説明図である。
【図５】ＳＩＭＤ化の説明図である。
【図６】ＳＩＭＤ化の説明図である。
【図７】依存解析処理フローである。
【図８】依存解析処理フローである。
【図９】依存解析処理フローである。
【図１０】ＳＩＭＤ化の説明図である。
【図１１】ＳＩＭＤ化の説明図である。
【図１２】ＳＩＭＤ化の説明図である。
【図１３】候補抽出処理フローである。
【図１４】候補抽出処理フローである。
【図１５】候補抽出処理フローである。
【図１６】ＳＩＭＤ化の説明図である。
【図１７】ＳＩＭＤ化の説明図である。
【図１８】ＳＩＭＤ化の説明図である。
【図１９】ＳＩＭＤ化の説明図である。
【図２０】ＳＩＭＤ化の説明図である。
【図２１】ＳＩＭＤ化の説明図である。
【図２２】ＳＩＭＤ化の説明図である。
【図２３】効果解析処理フローである。
【図２４】効果解析処理フローである。
【図２５】効果解析処理フローである。
【図２６】ＳＩＭＤレジスタとサブレジスタの関係の説明図である。
【図２７】ＳＩＭＤレジスタとサブレジスタの関係の説明図である。
【図２８】ＳＩＭＤレジスタとサブレジスタの関係の説明図である。
【図２９】ＳＩＭＤ化の説明図である。
【図３０】本発明者が検討したＳＩＭＤ化の説明図である。
【図３１】本発明者が検討したＳＩＭＤ化の説明図である。
【図３２】本発明者が検討したＳＩＭＤ化の説明図である。
【図３３】本発明者が検討したＳＩＭＤ化の説明図である。
【図３４】本発明者が検討したＳＩＭＤ化の説明図である。
【図３５】本発明者が検討したＳＩＭＤ化の説明図である。
【図３６】本発明者が検討したＳＩＭＤ化の説明図である。
【図３７】本発明者が検討したＳＩＭＤ化の説明図である。
【発明を実施するための形態】
【００２６】
前述したように、コンパイラがソースプログラムに含まれるループ構造を認識できない場合には、ループをアンローリング展開することができず、ＳＩＭＤ最適化を適用することができない。
【００２７】
しかし、本発明者の検討によれば、ループ構造でなくても、同じ種類の演算を行う複数の命令に対しては、ＳＩＭＤ命令を適用することができる場合があると考えられる。換言すれば、図２９の例のようにループ構造でない命令についても、ＳＩＭＤ最適化を適用することはできる場合があると考えられる。
【００２８】
まず、並列度の数が「２」である場合について考える。この場合、隣接した２個の命令であれば、ＳＩＭＤ化することができる。
【００２９】
例えば、図２８（Ａ）に示す２個の命令が、図２９のようにアンローリング展開の結果としてではなく、最初からソースプログラムに隣接して存在しているとする。この場合、隣接した２個の命令が、同じ種類の演算であるので、ループ構造でなくても、前述したように、ＳＩＭＤ化することができる。
【００３０】
次に、並列度の数が「４」である場合について考える。一例として、図２８の例における並列度を「４」にした場合を、図３０に示す。なお、前述したように、ＳＩＭＤレジスタＳ１、Ｓ２、Ｓ３が存在し、ＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３を実行するものとする。
【００３１】
並列度が「４」であるので、図２８（Ａ）の２個の命令に代えて、図３０（Ａ）に示す隣接する４個の命令を想定する。図３０（Ａ）において、隣接する４個の命令は、各々、「スロット１」〜「スロット４」に割り当てられる。ＳＩＭＤ命令Ｓ１＝Ｓ２＋Ｓ３が実行されると、図３０（Ｂ）に示すように、「スロット１」において演算Ａ（Ｉ）＝Ｂ（Ｉ）＋Ｃ（Ｉ）が実行され、「スロット２」において演算Ａ（Ｉ＋１）＝Ｂ（Ｉ＋１）＋Ｃ（Ｉ＋１）が実行され、「スロット３」において演算Ａ（Ｉ＋２）＝Ｂ（Ｉ＋２）＋Ｃ（Ｉ＋２）が実行され、「スロット４」において演算Ａ（Ｉ＋３）＝Ｂ（Ｉ＋３）＋Ｃ（Ｉ＋３）が実行される。
【００３２】
次に、多数の命令が隣接している場合について考える。なお、説明の簡単化のために、並列度の数は「２」であるとする。
【００３３】
例えば、図３１に示すように、８個の隣接する命令列があるとする。この場合、１行目の命令と２行目の命令とを、図２８の例と同様に、ＳＩＭＤレジスタＳ１〜Ｓ３を用いてＳＩＭＤ化することができる。更に、同様に、３行目の命令と４行目の命令とをＳＩＭＤレジスタＳ４〜Ｓ６を用いてＳＩＭＤ化し、５行目の命令と６行目の命令とをＳＩＭＤレジスタＳ７〜Ｓ９を用いてＳＩＭＤ化し、７行目の命令と８行目の命令とをＳＩＭＤレジスタＳ１０〜Ｓ１２を用いてＳＩＭＤ化することができる。
【００３４】
ところが、複数の命令が隣接する命令列であっても、図３２に示す場合には、ＳＩＭＤ化することができない。なお、並列度の数は「２」であるとする。
【００３５】
この場合、１行目の演算結果Ａ（Ｉ）を２行目の命令が参照し、２行目の演算結果Ｄ（Ｉ）を３行目の命令が参照し、３行目の演算結果Ｆ（Ｉ）を４行目の命令が参照している。このため、１行目の命令と２〜４行目の命令とは、ＳＩＭＤ化することができない。同様に、２行目の命令と３〜４行目の命令とは、ＳＩＭＤ化することができず、また、３行目の命令と４行目の命令とは、ＳＩＭＤ化することができない。この結果、１行目の命令〜４行目の命令の組み合わせでは、ＳＩＭＤ化することはできない。同様に、５行目の命令〜８行目の命令の組み合わせでは、ＳＩＭＤ化することはできない。換言すれば、複数の命令の間において依存関係がある場合には、当該複数の命令をＳＩＭＤ化することはできない。
【００３６】
一方、図３２の例において、ＳＩＭＤ化の対象を隣接する命令に限らない場合について考える。具体的には、コンパイルの処理対象の命令に隣接しない位置、換言すれば、処理対象の命令から離れた位置の命令を、ＳＩＭＤ化する対象と考えることになる。
【００３７】
この場合、図３３に示すように、１行目の命令と５行目の命令とは、依存関係がないので、ＳＩＭＤ化することができる。同様に、２行目の命令と６行目の命令とはＳＩＭＤ化することができ、３行目の命令と７行目の命令とはＳＩＭＤ化することができ、４行目の命令と８行目の命令とはＳＩＭＤ化することができる。
【００３８】
ところが、本発明者の検討によれば、処理対象の命令から離れた位置の命令をＳＩＭＤ化する場合には、ＳＩＭＤ化した結果を評価して、ＳＩＭＤ化により本当に最適化されているかを検証する必要があることが判った。換言すれば、ＳＩＭＤ化の対象を処理対象の命令から離れた位置からも選択可能とする場合には、ＳＩＭＤ化が高速化に直結しない場合があることが判った。
【００３９】
具体的には、ＳＩＭＤレジスタでは、異なるスロット間のデータを演算対象とすることができない。このため、あるスロットのサブレジスタに割り当てられたデータを、他のスロットのサブレジスタで使用する場合、サブレジスタ間でデータを転送する命令、換言すれば、サブレジスタ間の転送命令を実行する必要がある。
【００４０】
例えば、図３４（Ａ）に示す命令列について、図３４（Ｂ）に示すＳＩＭＤ化を考えるとする。この場合、ＳＩＭＤレジスタとサブレジスタとデータとの関係は、図３５（Ａ）に示すような割り当てになる。なお、並列度の数は「２」であるとする。また、図３５（Ａ）においては、図３５（Ｂ）に示すように、「Ｓ１」等のＳＩＭＤレジスタと共に、そのＳＩＭＤレジスタ内の２個のサブレジスタ「ｓｕｂ１」及び「ｓｕｂ２」に割り当てられたデータを示している。
【００４１】
図３４（Ｂ）及び図３５（Ａ）に示すように、１行目の命令と２行目の命令は、ＳＩＭＤレジスタＳ１〜Ｓ３を用いてＳＩＭＤ化される。この結果、図３５（Ａ）に示すように、データＢ（Ｉ＋１）は、ＳＩＭＤレジスタＳ２において、サブレジスタｓｕｂ２側（スロット２)に割り当てられる。一方、図３４（Ｂ）及び図３５（Ａ）に示すように、４行目の命令と５行目の命令は、ＳＩＭＤレジスタＳ４〜Ｓ６を用いてＳＩＭＤ化される。この結果、図３５（Ａ）に示すように、データＢ（Ｉ＋１）は、ＳＩＭＤレジスタＳ５において、サブレジスタｓｕｂ１側（スロット１)に割り当てられる。従って、図３５（Ａ）の３行目に示すように、データＢ（Ｉ＋１）を、ＳＩＭＤレジスタＳ２のサブレジスタｓｕｂ２から、ＳＩＭＤレジスタＳ５のサブレジスタｓｕｂ１へ転送する必要がある。
【００４２】
なお、サブレジスタ間の転送命令は高いオーバーヘッドになる場合が多く、レジスタ間の転送が無い方が望ましい。また、サブレジスタ間の転送命令のコストが少ないアーキテクチャにおいても、レジスタ転送命令の削減は、ＳＩＭＤ化の効果をより増加させる。
【００４３】
ところが、図３６に示すように、１行目の命令と２行目の命令についてのＳＩＭＤ化において、データＢ（Ｉ＋１）が、ＳＩＭＤレジスタＳ２のサブレジスタｓｕｂ１側（スロット１)に割り当てられたとする。換言すれば、ＳＩＭＤレジスタＳ１〜Ｓ３において、データＡ（Ｉ＋１）及びデータＡ（Ｉ）、データＢ（Ｉ＋１）及びデータＢ（Ｉ）、データＣ（Ｉ＋１）及びデータＣ（Ｉ）が、各々、図３５の例とは逆のサブレジスタに割り当てられたとする。この場合、図３６に示すように、サブレジスタ間の転送命令の実行は不要となる。
【００４４】
このように、ＳＩＭＤレジスタへのデータの割り当てに依存して、サブレジスタ間の転送命令が必要となるかが変化する。従って、処理対象の命令から離れた位置の命令をＳＩＭＤ化する場合には、ＳＩＭＤ化した結果を評価して、ＳＩＭＤ化により本当に最適化されているかを検証する必要がある。
【００４５】
また、同じ種類の演算が複数存在する場合、ＳＩＭＤ化が可能な組み合わせは命令数に比例して大きくなる。このため、膨大な組み合わせの中から例えば図３６の例のような有効な候補を抽出することは難しい。従って、処理対象の命令から離れた位置の命令をＳＩＭＤ化する場合には、有効な候補の抽出のために多大なコンパイル時間が必要となることが判った。
【００４６】
更に、同じ種類の演算として、図３７（Ａ）のように加算命令が８つ存在する場合には、ＳＩＭＤ化処理の候補（以下、ＳＩＭＤ化の候補と言う）として、図３７（Ｂ）及び図３７（Ｃ）に示すように、４０３２０通りの組み合わせが存在する。コンパイラは、これらの中から例えば図３６のような有効な候補を抽出する。この時、４０３２０通りのＳＩＭＤ化の候補を、メモリに一旦格納する必要がある。なお、３２ビットマシンのアドレス空間の最大値は４２９４９６７２９５であるが、この範囲で納まる命令数の数は１２個であり、４７９００１６００通りの組み合わせまでとなる。従って、処理対象の命令から離れた位置の命令をＳＩＭＤ化する場合には、大容量のメモリが必要となることが判った。
【００４７】
開示されるコンパイル装置、コンパイル方法、コンパイルプログラム及び記録媒体は、ループに属さない命令についてもＳＩＭＤ化を可能とする。
【００４８】
図１は、コンパイルシステムの一例を示す図である。図２は、ＳＩＭＤ化によるコンパイル処理の説明図である。
【００４９】
コンパイルシステムは、入力装置１と、コンパイル装置２とを含む。コンパイル装置２は、コンパイラ３と、記憶部４と、リンカ５とを含む。コンパイラ３は、ソースプログラム入力部３１と、入出力制御部３２と、中間言語生成部３３と、最適化部３４と、中間言語記憶部３７と、コード生成部３８と、オブジェクトファイル出力部３９とを含む。最適化部３４は、ソース解析部３５と、最適化実行部３６とを含む。ソース解析部３５は、依存解析部３５１と、候補抽出部３５２と、効果解析部３５３とを含む。記憶部４は、ソースプログラム４１と、オブジェクトファイル４２と、実行ファイル４３とを含む。
【００５０】
入力装置１は、ソースプログラム４１をコンパイル装置２に入力する。ソースプログラム４１は、ユーザにより高級言語で記述されたプログラムである。入力されたソースプログラム４１は、コンパイル装置２の記憶部４に格納される。
【００５１】
コンパイル装置２において、コンパイラ３のソースプログラム入力部３１は、ソースプログラム４１を記憶部４から読み出して、入出力制御部３２へ送る。入出力制御部３２は、コンパイル処理時のオプションやソースプログラム４１のファイルの種別等に応じて必要な処理をした後、ソースプログラム４１を中間言語生成部３３に送る。
【００５２】
中間言語生成部３３は、ソースプログラム４１を受け取ると、受け取ったソースプログラム４１を中間プログラムに変換して、中間言語記憶部３７に格納する。中間プログラムは、コンパイラ３の内部で使用される中間コード又は中間言語で記述されたプログラムである。中間言語記憶部３７は、中間プログラムを格納する。中間言語生成部３３は、中間プログラムを生成したことを最適化部３４に通知する。
【００５３】
最適化部３４は、中間プログラムの生成を通知されると、中間言語記憶部３７に格納された中間プログラムを最適化する。具体的には、最適化部３４は、中間言語記憶部３７に格納された中間プログラムを読み出して、読み出した中間プログラムを解析する。又は、最適化部３４は、ソースプログラム４１を参照して、ソースプログラム４１を解析する。そして、最適化部３４は、解析結果に基づいて中間プログラムを最適化して、最適化した中間プログラムを中間言語記憶部３７に格納する。最適化部３４は、最適化の終了をコード生成部３８に通知する。
【００５４】
この時、最適化部３４は、ソース解析部３５及び最適化実行部３６によるＳＩＭＤ最適化を実行する。具体的には、ソース解析部３５は、複数の命令を１個のＳＩＭＤ命令に置き換えるＳＩＭＤ化処理の候補として、処理対象の命令列から依存関係の無い複数の命令の組合せである第１の組合わせと第２の組み合わせを抽出し、抽出した第１の組み合わせと第２の組み合わせの各々についてＳＩＭＤ化した場合の予測実行時間を算出する。ソース解析部３５は、予測実行時間を算出する算出部である。最適化実行部３６は、第１の組み合わせと第２の組み合わせのうち、算出部で算出された予測実行時間が短い組み合わせについてＳＩＭＤ化を行なう。ソース解析部３５は、ＳＩＭＤ化を行なうＳＩＭＤ化部である。最適化部３４におけるＳＩＭＤ最適化処理については後述する。
【００５５】
なお、最適化部３４は、ループ内の命令、換言すれば、ループに属する命令についてもＳＩＭＤ化することにより、最適化した中間プログラムを生成する。これにより、ループに属する命令及びループに属さない命令の双方、換言すれば、全ての命令に対して、最も有効なＳＩＭＤ化を適用することができ、プログラムの実行性能を向上させることができる。
【００５６】
コード生成部３８は、最適化の終了を通知されると、中間言語記憶部３７に格納された中間プログラムを読み出して、読み出した中間プログラムに基づいて、アセンブリ言語で記述されたオブジェクトプログラムを生成する。コード生成部３８は、生成したオブジェクトプログラムを、入出力制御部３２を介して、オブジェクトファイル出力部３９に送る。
【００５７】
オブジェクトファイル出力部３９は、コード生成部３８からオブジェクトプログラムを受け取ると、受け取ったオブジェクトプログラムからオブジェクトプログラムを格納するオブジェクトファイル４２を生成して、記憶部４に格納する。オブジェクトファイル出力部３９は、オブジェクトファイル４２の生成をリンカ５に通知する。
【００５８】
リンカ５は、オブジェクトファイル４２の生成を通知されると、記憶部４に格納されたオブジェクトファイル４２を読み出して、オブジェクトファイル４２において指定されたライブラリとオブジェクトプログラムとを結合して、実行形式のプログラムを含む実行ファイル４３を生成して、記憶部４に格納する。
【００５９】
前述したように、最適化部３４による最適化処理において、ソース解析部３５及び最適化実行部３６によるＳＩＭＤ最適化を実行する。
【００６０】
ソース解析部３５は、中間言語記憶部３７から読み出された中間プログラム、又は、ソースプログラム４１を解析し、解析結果に基づいて有効なＳＩＭＤ最適化の候補を選択し、選択したＳＩＭＤ最適化の候補を最適化実行部３６に通知する。
【００６１】
具体的には、ソース解析部３５において、依存解析部３５１は、中間プログラム又はソースプログラム４１の命令列に含まれる各々の命令の間における依存関係を解析し、依存関係を解析した結果を候補抽出部３５２に通知する。候補抽出部３５２は、依存関係を解析した結果に基づいて、複数の命令を１個のＳＩＭＤ命令に置き換えるＳＩＭＤ化の候補として、依存関係の無い複数の命令の組合せを複数抽出し、抽出した複数のＳＩＭＤ化の候補を効果解析部３５３に通知する。効果解析部３５３は、抽出した複数のＳＩＭＤ化の候補の各々についてＳＩＭＤ化した場合の効果を解析し、ソース解析部３５に通知する。例えば、依存解析部３５１、候補抽出部３５２及び効果解析部３５３は、各々、サブルーチンであり、ソース解析部３５から呼び出されて処理を実行する。
【００６２】
例えば、図２に示すような入力コード、換言すれば、中間言語記憶部３７から読み出された中間プログラムが、コンパイラ３の最適化部３４へ読み込まれる。そして、中間プログラムの解析結果に基づいて、例えば、１行目の命令に対するＳＩＭＤ化の候補として、２行目の命令が選択される。また、３行目の命令ＳＩＭＤ化の候補として、４行目の命令が選択される。
【００６３】
なお、以下の説明においては、説明のために、例えば図２に示すように、各々の命令列を、中間コードではなく、ソースコードで表すこととする。
【００６４】
最適化実行部３６は、ソース解析部３５から選択したＳＩＭＤ最適化の候補を通知されると、通知されたＳＩＭＤ最適化の候補を中間言語記憶部３７に格納された中間プログラムに対して適用する。換言すれば、最適化実行部３６は、解析部における効果の解析の結果に基づいて、効果の解析の結果が最も優れているＳＩＭＤ化の候補についてＳＩＭＤ化することにより、ソースプログラムから生成された中間プログラムを最適化する。
【００６５】
具体的には、最適化実行部３６は、中間言語記憶部３７から中間プログラムを読み出し、読み出した中間プログラムにおいて、通知されたＳＩＭＤ最適化の候補をＳＩＭＤ命令に変換して、変換後の中間プログラムを中間言語記憶部３７に格納する。これにより、ＳＩＭＤ最適化により中間プログラムが最適化される。なお、最適化実行部３６は、ソース解析部３５によるＳＩＭＤ化のための解析以外の最適化部３４による他の最適化のための解析結果に従って、ＳＩＭＤ化以外の最適化も実行する。
【００６６】
例えば、図２に示すように、１行目の命令と、これに対するＳＩＭＤ化の候補である２行目の命令とが、ＳＩＭＤ化により最適化される。また、３行目の命令と、これに対するＳＩＭＤ化の候補である４行目の命令とが、ＳＩＭＤ化により最適化される。
【００６７】
この時、図２に示すように、最適化部３４は、サブレジスタを管理するためにレジスタマップ３５４を作成する。また、最適化部３４は、有効なＳＩＭＤ最適化の候補を選択するためにスコアリング部３５５を含む。
【００６８】
図３は、コンパイル装置のハードウェアの構成の一例を示す図である。
【００６９】
ＣＰＵ１０１は、ＲＯＭ１０２に格納された制御プログラムに従って、コンパイル装置２を制御する。ＣＰＵ１０１は、例えば主メモリであるＲＡＭ１０３上のコンパイルプログラム及びリンカプログラムを実行する。これにより、コンパイラ３及びリンカ５が実現される。コンパイルプログラム及びリンカプログラムは、例えば、ＣＤ−ＲＯＭやＤＶＤ等の記録媒体１０９に格納され、記録媒体１０９からハードディスク１０６に入力され、ハードディスク１０６からＣＤ−ＲＯＭドライブやＤＶＤドライブ等を介してＲＡＭ１０３にロードされる。
【００７０】
記憶部４は、例えばハードディスク１０６に設けられ、ソースプログラム４１、オブジェクトファイル４２、実行ファイル４３を格納する。中間言語記憶部３７は、例えばＲＡＭ１０３に設けられる。
【００７１】
入力装置１０４は、入力装置１以外の入力装置であり、例えばキーボード、マウス等を含む。出力装置１０５は、例えばディスプレイであり、プリンタ等の出力装置を含んでも良い。ＣＰＵ１０１、ＲＯＭ１０２、ＲＡＭ１０３、入力装置１０４、出力装置１０５、及び、ハードディスク１０６、ネットワーク接続部１０７は、バス１０８を介して、相互に接続される。
【００７２】
ネットワーク接続部１０７は、例えば、送受信装置であり、ネットワークに接続され、ネットワークを介して他のコンピュータ、例えばソースプログラム４１を生成する生成装置及び実行ファイルを実行する実行装置に接続される。
【００７３】
以下、最適化部３４のソース解析部３５が、依存解析部３５１と候補抽出部３５２と効果解析部３５３とにより実行する、ＳＩＭＤ化による最適化処理について説明する。
【００７４】
最初に、依存解析部３５１が実行する依存解析処理について説明する。
【００７５】
依存解析部３５１は、ソースプログラム４１又は中間プログラムを、予め定められた数の命令を含む命令列に区分し、区分した命令列を部分的に抽出する。換言すれば、依存解析部３５１は、命令列として、ソースプログラム４１又は中間プログラムにおいて連続する位置に存在する予め定められた数の命令を、ソースプログラム４１又は中間プログラムから抽出して、依存関係の解析の対象とする。
【００７６】
抽出される命令列は依存関係の解析の対象であるので、抽出される命令列に含まれる命令の数を「解析幅」という。以下の説明において、予め定められた数、換言すれば、解析幅は、例えば「１２」とされる。解析幅は、予め定められ、「１２」以外の値であっても良い。
【００７７】
依存解析部３５１は、抽出した解析幅の分の命令列に含まれる各々の命令の属性を表す命令データを生成し、生成した各々の命令についての命令データに基づいて、各々の命令の間における依存関係を表す依存データを生成する。これにより、命令列に含まれる命令の間における依存関係を構築する。ここで、依存関係とは、レジスタへ格納される複数の命令データの定義における参照の関係である。依存関係を構築するとは、前記参照の関係を結ぶこと、換言すれば、複数の命令データの定義に基づいて依存データを生成することである。
【００７８】
例えば、ソースプログラム４１又は中間プログラムが、図４（Ａ）に示すような命令列であるとする。図４（Ａ）の命令列において、各々の命令の命令形式は、図４（Ｂ）に示すように、「ＬＯＡＤ」のような命令と、「ｍｅｍ０１」のような参照オペランドと、「Ｒ０１」のような定義オペランドとを含む形式とされる。図４（Ｃ）に示すように、命令ＬＯＡＤはメモリに格納されたデータをレジスタにロードする命令であり、命令ＭＵＬＴはレジスタのデータを積算する命令であり、命令ＡＤＤはレジスタのデータを加算する命令である。オペランドは、図４（Ｄ）に示すように、「ｍｅｍ０１」〜「ｍｅｍ０８」のようなメモリ名や、「Ｒ０１」〜「Ｒ１４」のようなレジスタ名とされる。
【００７９】
依存解析部３５１は、図４（Ａ）の命令列を、解析幅「１２」で区切り、１個の解析幅の範囲で命令の依存関係を解析し、また、解析幅の範囲で複数の命令を組み合わせてＳＩＭＤ化を行う。換言すれば、１個の解析幅の範囲に存在する複数の命令の組み合わせを、１個のＳＩＭＤ命令に置き換える。
【００８０】
解析幅が「１２」である場合、図５（Ａ）に示すように、先頭から１２個の命令を依存解析の対象とされる。図５（Ａ）に示す依存解析の対象は、例えば当該依存解析の対象についてのスコアの算出の終了まで、依存解析部３５１に保持される。例えば、先頭から１２行目の命令と１３行目の命令とがＳＩＭＤ化できる関係にあるとしても、異なる命令列に属するので、ＳＩＭＤ化の対象とされない。このように、解析幅を制限することにより、コンパイラ３の処理の負担が大きくなることを回避して、事実上、全ての命令をＳＩＭＤ化の対象とすることができる。
【００８１】
依存解析部３５１は、図５（Ａ）の解析幅に属する命令列に含まれる各々の命令について、図５（Ａ）に示すように、各々の命令の属性を表す命令データを生成する。
【００８２】
例えば、図５（Ａ）の解析幅における最初の命令について見ると、当該命令から、図４（Ｂ）に示す命令形式に基づいて、命令名として「ＬＯＡＤ」、定義オペランドとして「Ｒ０１」、参照オペランドとして「ｍｅｍ０１」が得られる。命令番号は、図５（Ａ）の解析幅における当該命令の行番号、換言すれば、当該命令が図５（Ａ）の解析幅の何行目であるかに基づいて定められる。解析済フラグは、解析されていないことを表す「ＦＡＬＳＥ」とされる。解析済フラグは、解析の後に、換言すれば、依存データの生成の後に、解析されたことを表す「ＴＲＵＥ」とされる。
【００８３】
依存解析部３５１は、図５（Ａ）の解析幅における各々の命令について、同様にして命令データを生成する。これにより、図５（Ａ）の解析幅における各々の命令についての命令データが生成される。
【００８４】
依存解析部３５１は、解析幅に属する各々の命令についての図５（Ａ）に示す命令データに基づいて、図５（Ａ）に示すように、各々の命令の間における依存関係を表す依存データを生成する。
【００８５】
例えば、依存解析部３５１は、命令番号＃１の命令データの定義オペランド「Ｒ０１」を取り出して、命令番号＃２〜＃１２の命令データを検索する。これにより、命令番号＃１の命令データの定義オペランド「Ｒ０１」が、命令番号＃３の命令データの参照オペランドと同一であることを検出する。そこで、依存解析部３５１は、依存データとして「Ｅ１→＃３」を生成する。依存データの形式は、図５（Ｂ）に示すように、定義オペランドを持つ命令データの命令番号から、参照オペランドを持つ命令データの命令番号を指すようにされる。これにより、２個の命令間の依存関係が、命令番号を用いて表された依存データとして管理される。
【００８６】
依存解析部３５１は、解析幅に属する各々の命令についての図５（Ａ）に示す命令データについて、同様にして依存データを生成する。これにより、図５（Ａ）の解析幅における各々の命令についての依存データが生成される。
【００８７】
例えば、図５（Ａ）に示す依存データをグラフ化すると、図６に示すようになる。依存データにより、解析幅に属する各々の命令の間に、図６のような依存関係があることを抽出することができる。
【００８８】
図６において、直線上にある複数の命令の間には、定義と参照の依存関係が成立する。直線上にある複数の命令とは、直線で結ばれた２個の命令、又は、直線で結ばれた１又は複数の他の命令を介して結ばれる２個の命令である。従って、直線上にある複数の命令は、依存関係があるので同時に処理することができず、ＳＩＭＤ化の対象とすることができない。換言すれば、依存関係のある複数の命令は、後述するように、ＳＩＭＤ化の候補として抽出されない。
【００８９】
次に、依存解析部３５１が実行する依存解析処理を、図７〜図９を参照して詳細に説明する。
【００９０】
図７は、依存解析部３５１が実行する依存解析処理フローであり、特に、命令データの生成処理について示す。
【００９１】
依存解析部３５１は、命令データの命令番号に「１」を設定し（ステップＳ１１）、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、未解析の命令の中から先頭の１個の命令を、処理対象として選択する（ステップＳ１２）。そして、依存解析部３５１は、選択した命令から、属性情報「命令名」「定義オペランド」「参照オペランド」を抽出し、その時点での命令番号に付加することにより、選択した命令についての命令データを生成する（ステップＳ１３）。この時、解析済フラグは「ＦＡＬＳＥ」とされる。この後、依存解析部３５１は、先に選択した命令の次の命令に処理対象を移動して（ステップＳ１４）、命令データの命令番号をインクリメントすることにより「１」を加算する（ステップＳ１５）。この後、依存解析部３５１は、解析幅の数だけステップＳ１３を繰り返す。例えば、前述したように、解析幅が「１２」であるとする。この場合、ステップＳ１５において求めた命令番号が「１２」であれば、解析幅の数だけ処理を繰り返したことになる。従って、ステップＳ１５において求めた命令番号が「１２」以下である場合にはステップＳ１３を繰り返し、「１２」より大きい場合には処理を終了する。これにより、解析幅の数の命令を含む命令列について、命令データが生成される。
【００９２】
図８は、依存解析部３５１が実行する依存解析処理フローであり、特に、依存データの生成処理について示す。
【００９３】
依存解析部３５１は、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、最後の命令についての命令データをＭとする（ステップＳ２１）。例えば解析幅が「１２」である場合、命令番号１２の命令についての命令データがＭとされる。
【００９４】
この後、依存解析部３５１が、解析サブルーチン、換言すれば、解析サブルーチン実行部を呼び出して、命令データＭを渡して解析を依頼すると、解析サブルーチンが命令データＭを解析して、解析の結果を依存解析部３５１に返す（ステップＳ２２）。この後、依存解析部３５１は、処理した命令の１個前の命令についての命令データをＭとして（ステップＳ２３）、解析幅の数だけステップＳ２２を繰り返す。例えば、前述したように、解析幅が「１２」であるとする。この場合、最後の命令についての命令データ、換言すれば、命令番号が「１２」から処理を開始しているので、ステップＳ２３で求めた命令の命令番号が「１」であれば、解析幅の数だけ処理を繰り返したことになる。従って、ステップＳ２３において求めた命令番号が「１」でない場合にはステップＳ１３を繰り返し、「１」である場合には処理を終了する。
【００９５】
図９は、依存解析部３５１が実行する依存解析処理フローであり、特に、依存データの生成処理における解析処理、換言すれば、解析サブルーチンによる処理について示す。
【００９６】
解析サブルーチンは、命令データＭが解析幅内のものか否かを判断する（ステップＳ３１）。例えば、前述したように、解析幅が「１２」であるとする。この場合、命令データＭの命令番号が「１２」以下であれば、解析幅の数の範囲内である。従って、命令データＭの命令番号が「１２」以下である場合には命令データＭが解析幅内のものと判断し、「１２」より大きい場合には命令データＭが解析幅内のものでないと判断する。命令データＭが解析幅内のものでない場合（ステップＳ３１  ＮＯ）、解析サブルーチンは、命令データＭが解析幅内のものでない旨を、依存解析部３５１へ返す。
【００９７】
命令データＭが解析幅内のものである場合（ステップＳ３１  ＹＥＳ）、解析サブルーチンは、命令データＭの解析済フラグがＦＡＬＳＥかＴＲＵＥかを判定する（ステップＳ３２）。命令データＭの解析済フラグがＴＲＵＥである場合、解析サブルーチンは、命令データＭが解析済みである旨を、依存解析部３５１へ返す。
【００９８】
命令データＭの解析済フラグがＦＡＬＳＥである場合、解析サブルーチンは、命令データＭの参照オペランドと同じデータを定義オペランドとして持つ命令データを検索し、該当する命令データが存在する場合には、該当する命令データを定義データＤに代入する（ステップＳ３３）。
【００９９】
この後、解析サブルーチンは、定義データＤが解析幅内のものか否かを判断する（ステップＳ３４）。例えば、依存解析部３５１に保持されている図５（Ａ）に示す処理対象の命令列を定義データＤを用いて検索することにより、定義データＤと同一の命令が図５（Ａ）に示す処理対象の命令列に存在するか否かが調べられる。命令データＭが解析幅内のものでない場合（ステップＳ３４  ＮＯ）、解析サブルーチンは、命令データＭが解析幅内のものでない旨を、依存解析部３５１へ返す。
【０１００】
命令データＭが解析幅内のものである場合（ステップＳ３４  ＹＥＳ）、解析サブルーチンは、定義データＤの命令番号を定義して、換言すれば、定義データＤの命令番号を求めて、定義データＤが命令データＭの命令番号を参照する依存データを作成する（ステップＳ３５）。この後、解析サブルーチンは、命令データＭの参照オペランドの数だけステップＳ３３を繰り返す。これにより、命令データＭの参照オペランドの各々についての依存データが作成される。
【０１０１】
次に、候補抽出部３５２が実行する候補抽出処理について説明する。
【０１０２】
候補抽出部３５２は、各々の命令についての命令データと、依存データとに基づいて、ＳＩＭＤ化の候補を抽出する。換言すれば、候補抽出部３５２は、命令データ及び依存データに基づいて、ＳＩＭＤ化の候補となる命令の組合せを抽出する。命令の組合せは、命令データの命令番号を関連付けることにより管理される。
【０１０３】
具体的には、候補抽出部３５２は、図５（Ａ）の解析幅に属する命令の中から、図６において直線上にある複数の命令、換言すれば、依存関係のある命令を除く、２個の命令の組合せを抽出する。
【０１０４】
例えば、図４（Ａ）の命令列から抽出された図５（Ａ）の解析幅に属する命令からは、図１０に示すように、ＳＩＭＤ化の候補となる命令の組合せが抽出される。抽出される命令の組合せに含まれる命令の数は、前述したように、並列度の数が「２」であるので、２個である。抽出される命令の組合せに含まれる２個の命令は、同一の命令である。例えば、組合せ「＃１−＃２」は、共に、命令ＬＯＡＤである。なお、例えば、組合せ「＃３−＃８」と同時に、組合せ「＃３−＃１０」のように、相互に一部が重なる組合せが存在しても良い。
【０１０５】
候補抽出部３５２は、図１０に示す複数のＳＩＭＤ化の候補の各々について、図１１に示すように、エッジデータを生成する。エッジデータは、ＳＩＭＤ化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報、換言すれば、反転フラグを含む。
【０１０６】
エッジデータの格納領域は、図１１（Ａ）に示すように、エッジ番号の格納領域、反転フラグの格納領域、命令番号［Ｎ］の格納領域を含む。エッジ番号は、エッジデータを一意に識別する識別情報であり、エッジデータの管理に用いられる。反転フラグは、組合せの並び替えが可能か否かを表す情報である。命令番号［Ｎ］は、ＳＩＭＤ化の候補となる組合せに属する命令を表し、当該命令についての命令データに含まれる命令番号である。
【０１０７】
反転フラグＦＡＬＳＥは、複数の命令の並び替えが可能であることを示す。反転フラグＴＲＵＥは、複数の命令の並び替えが可能でないことを示す。候補抽出部３５２は、命令の種類に応じて、エッジデータにおける反転フラグＦＡＬＳＥ又はＴＲＵＥを設定する。例えば、命令ＬＯＡＤの場合及び命令ＡＤＤの場合には、反転フラグＦＡＬＳＥが設定される。命令ＭＵＬＴの場合には、反転フラグＴＲＵＥが設定される。
【０１０８】
図１１（Ａ）に示すエッジデータの格納領域において、エッジ番号は、「１」から順に付与される。例えば、図１０に示すＳＩＭＤ化の候補の各々について、上段左側から順にエッジ番号「１」〜「５」が付与され、次に、下段上段左側から順にエッジ番号「６」〜「８」が付与される。Ｎは並列度の数である。従って、命令番号［Ｎ］の格納領域に含まれる命令番号の数、換言すれば、命令の数は、Ｎ個である。
【０１０９】
候補抽出部３５２は、最初に、図１１（Ａ）に示すエッジデータの格納領域を生成する。この後、候補抽出部３５２は、生成したエッジデータの格納領域をコピーして、コピーしたエッジデータの格納領域にＮ個の命令番号を格納することを繰り返す。この例では、前述したように、並列度の数は「２」であるので、命令番号［１］の格納領域と命令番号［２］の格納領域とに、各々、命令番号が格納される。この時、格納される命令番号は、先頭から順に、１ずつシフトされる。例えば、エッジ番号が「１」のエッジデータにおいては＃１及び＃２の命令番号が格納され、エッジ番号が「２」のエッジデータにおいては＃２及び＃３の命令番号が格納され、最後のエッジデータにおいては＃１１及び＃１２の命令番号が格納される。これにより、図１１（Ｂ）に示すように、エッジデータの集合が得られる。
【０１１０】
図１１（Ｂ）において、命令番号［１］に＃１が格納されている状態は、スロット１に命令番号＃１の命令が設定されている状態である。従って、命令番号［１］はスロット１に相当し、命令番号［２］はスロット２に相当する。ＳＩＭＤ化した場合において、命令番号［１］には各々のＳＩＭＤレジスタにおける対応する位置のサブレジスタｓｕｂ１が割り当てられ、命令番号［２］には各々のＳＩＭＤレジスタにおける対応する位置のサブレジスタｓｕｂ２が割り当てられる。換言すれば、命令番号［１］の命令にはサブレジスタｓｕｂ１が割り当てられ、命令番号［２］にはサブレジスタｓｕｂ２が割り当てられる。
【０１１１】
なお、命令番号［Ｎ］の格納領域に含まれる命令番号の数は、並列度の数が「４」である場合には４個となり、並列度の数が「８」である場合には８個となる。例えば、図３０のように並列度が４の場合における、エッジデータと、スロット及びサブレジスタの関係は、図１２のようになる。図１２において、エッジデータには４個の命令番号が含まれる。従って、４個のスロットが存在する。例えば、命令番号［１］はスロット１に相当し、命令番号［１］には各々のＳＩＭＤレジスタにおける対応する位置のサブレジスタｓｕｂ１が割り当てられる。
【０１１２】
次に、依存解析部３５１が実行する依存解析処理を、図１３〜図１５を参照して詳細に説明する。
【０１１３】
図１３は、候補抽出部３５２が実行する候補抽出処理フローであり、特に、命令データからのエッジデータの生成処理について示す。
【０１１４】
候補抽出部３５２は、依存関係の解析の対象とされた、換言すれば、解析幅の命令列において、最初の命令についての命令データをＭとする（ステップＳ４１）。また、候補抽出部３５２は、図１１（Ａ）に示すエッジデータＥを生成する（ステップＳ４２）。この時、生成されたエッジデータＥにおいて、エッジ番号は「０」とされ、反転フラグはＦＡＬＳＥとされる。更に、候補抽出部３５２は、スロットＳを初期値「０」に設定する（ステップＳ４３）。
【０１１５】
この後、候補抽出部３５２が、エッジデータ設定サブルーチン、換言すれば、エッジデータ設定サブルーチン実行部を呼び出して、命令データＭ、エッジデータＥ及び変数Ｓを渡してエッジデータの設定を依頼すると、エッジデータ設定サブルーチンがエッジデータＥを設定して、設定したエッジデータＥを候補抽出部３５２に返す（ステップＳ４４）。この後、候補抽出部３５２は、処理した命令の次の命令についての命令データをＭとして（ステップＳ４５）、命令データの数だけステップＳ４２を繰り返す。例えば、前述したように、解析幅が「１２」であるとする。この場合、最初の命令についての命令データ、換言すれば、命令番号が「１」から処理を開始しているので、ステップＳ４５で求めた命令の命令番号が「１２」であれば、命令データの数だけ処理を繰り返したことになる。従って、ステップＳ４５において求めた命令番号が「１２」以下である場合にはステップＳ４２を繰り返し、「１２」より大きい場合には処理を終了する。
【０１１６】
図１４は、候補抽出部３５２が実行する候補抽出処理フローであり、特に、エッジデータの設定処理、換言すれば、エッジデータ設定サブルーチンによる処理について示す。
【０１１７】
エッジデータ設定サブルーチンは、スロットＳをインクリメントすることにより「１」を加算した後（ステップＳ５１）、設定された値に対応するスロットが存在するか否かを判断する（ステップＳ５２）。例えば、並列度がＮである場合、スロットＳの値はＮが最大値とされる。換言すれば、並列度がＮである場合、スロットＳの値がＮ以下である場合に、スロットＳは存在する。
【０１１８】
スロットが存在しない場合（ステップＳ５２  ＮＯ）、エッジデータ設定サブルーチンは、エッジデータ確定サブルーチン、換言すれば、エッジデータ確定サブルーチン実行部を呼び出して、それまでに生成されたエッジデータＥを渡してエッジデータの確定を依頼すると、エッジデータ確定サブルーチンが、エッジデータＥをチェックした上で確定して、確定したエッジデータＥをエッジデータ設定サブルーチンに返す（ステップＳ５８）。エッジデータ設定サブルーチンは、確定したエッジデータＥを受け取ると、それまでに生成されたエッジデータＥを候補抽出部３５２に返す。
【０１１９】
スロットが存在する場合（ステップＳ５２  ＹＥＳ）、エッジデータ設定サブルーチンは、命令データＭが別のスロットに存在するか否かを判断する（ステップＳ５３）。命令データＭが別のスロットに存在する場合（ステップＳ５３  ＹＥＳ）、エッジデータ設定サブルーチンは、以下のステップＳ５４〜Ｓ５６の実行を省略して、ステップＳ５７を実行する。
【０１２０】
命令データＭが別のスロットに存在しない場合（ステップＳ５３  ＮＯ）、エッジデータ設定サブルーチンは、エッジデータＥをコピーすることによりエッジデータＥ’を生成する（ステップＳ５４）。この時、エッジデータＥ’のエッジ番号は、コピー元のエッジデータＥのエッジ番号に「１」を加えた値とされる。この後、エッジデータ設定サブルーチンは、エッジデータＥ’の命令番号［Ｓ］に命令データＭの命令番号を設定する（ステップＳ５５）。
【０１２１】
この後、エッジデータ設定サブルーチンは、再度、エッジデータ設定サブルーチンを呼び出して、命令データＭ、エッジデータＥ’及び変数Ｓを渡してエッジデータの設定を依頼すると、再帰呼び出されたエッジデータ設定サブルーチンがエッジデータＥ’を設定して、設定したエッジデータＥ’を再帰呼び出したエッジデータ設定サブルーチンに返す（ステップＳ５６）。
【０１２２】
この後、エッジデータ設定サブルーチンは、処理した命令の次の命令についての命令データをＭとして（ステップＳ５７）、命令データの数だけステップＳ５３を繰り返す。例えば、前述したように、解析幅が「１２」であるとする。この場合、ステップＳ５７で求めた命令の命令番号が「１２」であれば、命令データの数だけ処理を繰り返したことになる。従って、ステップＳ５７において求めた命令番号が「１２」以下である場合にはステップＳ５３を繰り返し、「１２」より大きい場合には処理を終了する。
【０１２３】
図１５は、候補抽出部３５２が実行する候補抽出処理フローであり、特に、エッジデータの確定処理、換言すれば、エッジデータ確定サブルーチンによる処理について示す。
【０１２４】
エッジデータ確定サブルーチンは、エッジデータＥに含まれる命令が全て同じ命令であるか否かを判断する（ステップＳ６１）。エッジデータＥに含まれる命令が全て同じ命令でない場合（ステップＳ６１  ＮＯ）、ＳＩＭＤ化することができないので、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータＥを破棄して（ステップＳ６５）、エッジデータＥを破棄した旨をエッジデータ設定サブルーチンに返す。
【０１２５】
エッジデータＥに含まれる命令が同じ命令である場合（ステップＳ６１  ＹＥＳ）、換言すれば、エッジデータＥに同じ命令が含まれる場合、エッジデータ確定サブルーチンは、更に、エッジデータＥに含まれる命令に依存関係がないか否かを判断する（ステップＳ６２）。エッジデータＥに含まれる命令に依存関係がある場合（ステップＳ６２  ＮＯ）、ＳＩＭＤ化することができないので、エッジデータ確定サブルーチンは、ステップＳ６５を実行して、エッジデータＥを破棄した旨をエッジデータ設定サブルーチンに返す。
【０１２６】
エッジデータＥに含まれる命令に依存関係がない場合（ステップＳ６２  ＹＥＳ）、エッジデータ確定サブルーチンは、更に、エッジデータＥに含まれる命令をＳＩＭＤ化した場合に、ＳＩＭＤ命令のアーキテクチャの禁止事項に違反しないか否かを判断する（ステップＳ６３）。例えば、ＳＩＭＤ命令のアーキテクチャによっては、平方根の演算をＳＩＭＤ化しないことが規定されている。これは、平方根の演算のための命令が別に用意されているためである。禁止事項に違反する場合（ステップＳ６３  ＮＯ）、ＳＩＭＤ化することができないので、エッジデータ確定サブルーチンは、ステップＳ６５を実行して、エッジデータＥを破棄した旨をエッジデータ設定サブルーチンに返す。
【０１２７】
禁止事項に違反しない場合（ステップＳ６３  ＹＥＳ）、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータＥを保存して（ステップＳ６４）、エッジデータＥを保存した旨をエッジデータ設定サブルーチンに返す。
【０１２８】
次に、効果解析部３５３が実行する効果解析処理について説明する。
【０１２９】
効果解析部３５３は、複数のＳＩＭＤ化の候補と、ＳＩＭＤ化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、ＳＩＭＤ化する命令の組合せを生成する。複数のＳＩＭＤ化の候補は、例えば、図１０に示される８組の候補である。ＳＩＭＤ化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報は、図１１（Ｂ）に示すエッジデータにおける反転フラグの値ＦＡＬＳＥ又はＴＲＵＥである。そして、効果解析部３５３は、生成したＳＩＭＤ化する命令の組合せの各々について、ＳＩＭＤ化した場合の効果を解析する。ＳＩＭＤ化する命令の組合せを「ＳＩＭＤ化パターン」と言うこととする。効果解析部３５３は、ＳＩＭＤ化パターンの各々について、ＳＩＭＤ化した場合の効果を評価する。
【０１３０】
例えば、効果解析部３５３は、図１６に示すように、図１０のＳＩＭＤ化の候補から、ＳＩＭＤ化する命令の組合せ、換言すれば、ＳＩＭＤ化パターンを選択する。例えば、図１０において、「＃１−＃２」の組合せを選択すると、命令番号＃２が重なることを回避しなければならないので、「＃２−＃４」の組合せを選択することはできない。命令番号＃２が重なることを回避するのは、命令が冗長実行になることを回避するためである。また、例えば、「＃６−＃７」の組合せを選択すると、命令番号＃６が重なることを回避しなければならないので、「＃４−＃６」及び「＃７−＃９」の組合せを選択することはできない。
【０１３１】
このようにして、例えば、図１６に示す複数の「ＳＩＭＤ化パターン１」〜「ＳＩＭＤ化パターン３」が選択される。１個のＳＩＭＤ化パターンに含まれる命令の組合せの数は、１以上であれば良く、「ＳＩＭＤ化パターン１」のように３個でも良く、「ＳＩＭＤ化パターン２」のように４個でも良い。なお、図１６は、選択されたＳＩＭＤ化パターンの一部を示す。ＳＩＭＤ化パターンが生成された時点において、ＳＩＭＤ化パターンのスコアは不明であるが、図１６においては、後述するようにして算出されるスコアを参考として示している。スコアについては後述する。
【０１３２】
図１６において、「ＳＩＭＤ化パターン２」には「＃３−＃８」の組合せが含まれ、「ＳＩＭＤ化パターン３」には「＃８−＃３」の組合せが含まれる。このように、エッジデータにおいて、命令番号の順番が入れ替わったものが、ＳＩＭＤ化パターンに含まれる。
【０１３３】
例えば、図１７に示すように、エッジ番号が「７」のエッジデータにおいて、反転フラグがＴＲＵＥであるとする。この場合、当該エッジデータにおいて、命令番号［１］に格納される命令番号＃３と、命令番号［２］に格納される命令番号＃８とが入れ替えられ、新たなエッジデータとされる。これにより、エッジ番号が「７」のエッジデータのサブレジスタを入れ替えたデータが表される。図１６に示すように、新たなエッジデータも、ＳＩＭＤ化パターンの生成において用いられる。
【０１３４】
効果解析部３５３は、図１６に示すＳＩＭＤ化パターンに基づいて図１８に示すパックデータを生成し、生成したパックデータにより、図１６に示すＳＩＭＤ化パターンを管理する。パックデータは、ＳＩＭＤ化パターン毎に生成される。
【０１３５】
図１８は、パックデータの一例を示し、図１６の「ＳＩＭＤ化パターン２」についてのパックデータである。ＳＩＭＤ化パターンに含まれる命令の組合せの各々が、パックデータにおける１個のパックとされる。従って、「ＳＩＭＤ化パターン２」についてのパックデータは、４個のパックを含む。パックデータにおいて、各々のパックに対応してエッジ番号が格納される。例えば、図１６の「ＳＩＭＤ化パターン２」の先頭の命令の組合せがパック［１］とされる。具体的には、先頭の命令の組合せ「＃１−＃２」は、図１１（Ｂ）に示すエッジ番号「１」を持つので、パック［１］は、「＃１−＃２」であるエッジ番号「１」を持つエッジデータである。従って、パックデータにおいて、パック［１］に対応してエッジ番号「１」が格納される。これにより、エッジ番号「１」を持つエッジデータを参照することができる。
【０１３６】
効果解析部３５３のスコアリング部３５５は、パックデータに基づいて、図１９に示すように、レジスタマップ３５４を生成する。レジスタマップ３５４は、複数のＳＩＭＤレジスタにおいて対応する位置に存在するサブレジスタの集合であるスロット毎に生成され、スロットに属するサブレジスタを管理する。従って、レジスタマップ３５４は、並列度の数の分だけ生成される。そして、効果解析部３５３は、生成したレジスタマップ３５４に基づいて、ＳＩＭＤ化した場合に必要となるサブレジスタの間における転送命令を抽出する。
【０１３７】
更に、スコアリング部３５５は、図１９に示すように、複数のＳＩＭＤ化の候補の各々について、スコアを算出し、算出したスコアに基づいて、ＳＩＭＤ化した場合の効果を解析する。スコアリング部３５５は、転送命令を抽出した後、複数のＳＩＭＤ化の候補の各々について、ＳＩＭＤ化しない場合の命令実行時間と、ＳＩＭＤ化した場合の命令実行時間及び転送命令の実行時間の和との差分をスコアとして算出する。スコアリング部３５５は、図２１を参照して後述するスコア計算式を保持し、スコア計算式を用いてスコアを算出する。
【０１３８】
図２０は、レジスタマップ３５４の生成の一例を示し、図１６の「ＳＩＭＤ化パターン３」についてのレジスタマップ３５４を示す。スコアリング部３５５は、図２０に示すように、ＳＩＭＤ化パターンから、同一のスロットに割当てられる命令を抽出し、各々の命令が保持するデータを抽出する。
【０１３９】
前述したように、同一のスロットの命令が、対応する位置のサブレジスタに割り当てられる。このため、例えば、スロット１には、命令＃１、命令＃６、命令＃８、命令＃５が割当てられる。命令＃１は命令番号「１」を持つ命令である。各命令において使用されるデータ又はレジスタは、当該命令の参照オペランド及び定義オペランドに基づいて求めることができる。例えば、命令＃１には、サブレジスタＲ０１が含まれる。従って、スロット１に対応するレジスタマップ［１］には、Ｒ０１が格納される。Ｒ０１は、実際には、サブレジスタのレジスタ名である。同様にして、命令＃６、命令＃８、命令＃５からサブレジスタのレジスタ名を抽出することにより、レジスタマップ［１］が生成される。
【０１４０】
また、スロット２には、命令＃２、命令＃７、命令＃３、命令＃１０が割当てられる。命令＃２には、サブレジスタＲ０２が含まれる。従って、スロット２に対応するレジスタマップ［２］には、Ｒ０２が格納される。同様にして、命令＃７、命令＃３、命令＃１０からサブレジスタのレジスタ名を抽出することにより、レジスタマップ［２］が生成される。このように、レジスタマップ３５４は、各スロットに属するサブレジスタをグループとして管理する。
【０１４１】
レジスタマップ［１］とレジスタマップ［２］との間において、同じレジスタ名が格納されている場合、相互に異なるスロットのデータを処理することになる。従って、サブレジスタ間におけるデータの転送命令が必要であることを抽出することができる。このように、レジスタマップ３５４によりサブレジスタ間のデータの転送の必要性を抽出することができるので、ＳＩＭＤ化のコストを計算することができ、最も有効なＳＩＭＤ化パターンを抽出することができる。
【０１４２】
図２０においては、レジスタ名Ｒ０７とレジスタ名Ｒ０３とが、各々、レジスタマップ［１］とレジスタマップ［２］の双方に出現する。これにより、２つのデータが異なるスロットで要求されるので、サブレジスタ間の転送命令が実行されることになる。図２０においては、図１６の「ＳＩＭＤ化パターン３」に従ってＳＩＭＤ化した場合には、２個の転送命令を実行する必要があることが判る。
【０１４３】
図２１は、スコアリング部３５５が保持するスコアの計算式の一例を示す。
【０１４４】
図２１に示すように、ＳＩＭＤ化前の実行時間である「ＳＩＭＤ化前の時間」は、（元の命令の実行時間）×（並列度の数）×（命令の数）により求まる。実行時間とは、命令を実行するために必要な想定時間である。実行時間及び並列度の数は、予め定められる。命令の数は、ＳＩＭＤ化の候補が定まれば、求めることができる。ＳＩＭＤ化により必要となる転送時間である「転送命令の時間」は、（サブレジスタ間の転送命令の数）×（転送命令の実行時間）により求まる。転送命令の数は、前述したように、レジスタマップ３５４から求めることができる。ＳＩＭＤ化後の実行時間である「ＳＩＭＤ化後の時間」は、（元の命令の実行時間）×（命令の数）＋（ＳＩＭＤ化により必要となる転送命令の時間）により求まる。この場合において、ＳＩＭＤ化の効果を表す「スコア」は、（ＳＩＭＤ化前の時間）−（ＳＩＭＤ化後の時間）により求まる。
【０１４５】
ここで、「ＳＩＭＤ化後の時間」が、ＳＩＭＤ化した場合の予測実行時間である。以下に述べるように、複数のＳＩＭＤ化処理の候補の中で、「スコア」が最も良い「ＳＩＭＤ化パターン」により、実際のＳＩＭＤ化が行われる。比較の対象である複数のＳＩＭＤ化処理の候補について「ＳＩＭＤ化前の時間」は同じであるから、予測実行時間が最も短い「ＳＩＭＤ化パターン」により、実際のＳＩＭＤ化が行われる。
【０１４６】
図２２は、スコアリング部３５５が、図１６の「ＳＩＭＤ化パターン３」について、図２１のスコアの計算式によりスコアを計算した例を示す。図２２において、命令「ＬＯＡＤ」及び四則演算の実行時間が「６」であるものとし、転送命令の実行時間が「６」であるものとする。この場合、図２２に示すように、「ＳＩＭＤ化パターン３」についてのスコアは「１２」となる。
【０１４７】
なお、図１６に示すように、「ＳＩＭＤ化パターン１」についてのスコアは「１８」となり、「ＳＩＭＤ化パターン２」についてのスコアは「２４」となる。従って、ＳＩＭＤ化前後の差分が最大である「ＳＩＭＤ化パターン２」が、効果の解析の結果が最も優れている、換言すれば、最もＳＩＭＤ化の効果が大きいことが判る。
【０１４８】
以上のスコアリング部３５５による効果の解析の結果に基づいて、効果解析部３５３は、図１６の「ＳＩＭＤ化パターン２」によるＳＩＭＤ化を選択する。これにより、最適化実行部３６は、中間プログラムの該当する命令を「ＳＩＭＤ化パターン２」によりＳＩＭＤ化する。この結果、効果の解析の結果が最も優れているＳＩＭＤ化を実現することができる。また、スコアを算出することにより、ＳＩＭＤ化パターンを容易かつ正確に評価することができる。この結果、コンパイル時間を削減することができ、また、有効なＳＩＭＤ化パターンのみを保持すれば良いので、メモリ使用量を削減することができる。
【０１４９】
次に、効果解析部３５３が実行する効果解析処理を、図２３〜図２５を参照して詳細に説明する。
【０１５０】
図２３は、効果解析部３５３が実行する効果解析処理フローであり、特に、パックデータの生成に基づくＳＩＭＤ化の依頼処理について示す。
【０１５１】
効果解析部３５３は、エッジ番号ｅを「０」に設定することによりエッジ番号を初期値に設定し、ベストなスコアを保存する領域Ｚをグローバルな領域に確保して「−１」に設定する（ステップＳ７１）。そして、効果解析部３５３は、Ｂをベストパックデータに設定し、Ｐをパックデータに設定する（ステップＳ７２）。ベストパックデータＢ、パックデータＰを格納する領域は、グローバルな領域に確保される。
【０１５２】
この後、効果解析部３５３は、パックデータ設定サブルーチン、換言すれば、パックデータ設定サブルーチン実行部を呼び出して、エッジ番号ｅ、パックデータＰを渡してパックデータの設定を依頼すると、パックデータ設定サブルーチンがパックデータＰを設定して、設定したパックデータＰを効果解析部３５３に返す（ステップＳ７３）。
【０１５３】
この後、効果解析部３５３は、Ｚ！＝−１であるか否かを判断する（ステップＳ７４）。Ｚ！＝−１である場合（ステップＳ７４  ＹＥＳ）、効果解析部３５３は、ベストパックデータＢを利用して、ＳＩＭＤ化の適用依頼を生成して、生成したＳＩＭＤ化の適用依頼を最適化部３５に返す（ステップＳ７５）。Ｚ！＝−１でない場合（ステップＳ７４  ＮＯ）、効果解析部３５３は、ＳＩＭＤ化の中止依頼を生成して、生成したＳＩＭＤ化の中止依頼を最適化部３５に返す（ステップＳ７６）。
【０１５４】
図２４は、効果解析部３５３が実行する効果解析処理フローであり、特に、パックデータの設定処理、換言すれば、パックデータ設定サブルーチンによる処理について示す。
【０１５５】
パックデータ設定サブルーチンは、スコア判定サブルーチン、換言すれば、スコア判定サブルーチン実行部を呼び出して、パックデータＰを渡してスコアＴの判定を依頼すると、スコア判定サブルーチンがパックデータＰのスコアＴを判定して、判定したパックデータＰのスコアＴをパックデータ設定サブルーチンに返す（ステップＳ８１）。スコアＴは、現在のパックデータＰのスコアであり、スコア判定サブルーチンの復帰値である。
【０１５６】
この後、パックデータ設定サブルーチンは、エッジデータｅをインクリメントすることにより「１」を加算する（ステップＳ８２）。これにより、処理対象が次のエッジデータに移動する。そして、パックデータ設定サブルーチンは、エッジデータｅが最大エッジ番号よりも大きいか否かを判断する（ステップＳ８３）。最大エッジ番号は、図１０に示すエッジデータの数に等しい。
【０１５７】
エッジデータｅが最大エッジ番号よりも大きい場合（ステップＳ８３  ＹＥＳ）、パックデータ設定サブルーチンは、パックデータＰのスコアＴを効果解析部３５３に返す。
【０１５８】
エッジデータｅが最大エッジ番号よりも小さい場合（ステップＳ８３  ＮＯ）、パックデータ設定サブルーチンは、更に、判定条件Ａのいずれかに合致するか否かを判断する（ステップＳ８４）。ここで、判定条件Ａは以下の３つとされる。第１の判定条件は、エッジ番号ｅに含まれる命令番号は登録済みであることである。例えば、図１０に示すエッジデータの中で、先頭の２個のエッジデータが、第１の判定条件に該当する。第２の判定条件は、既存のパックデータＰに依存関係があることである。依存関係がある場合には、ＳＩＭＤ化することができない。第３の判定条件は、スコアＴが既存のいずれかのスコアＴよりも悪いことである。スコアＴが悪いので、現在のパックデータＰの処理を進める意味が無い。
【０１５９】
判定条件Ａのいずれかに合致する場合（ステップＳ８４  ＹＥＳ）、パックデータ設定サブルーチンは、以下のステップＳ８５〜Ｓ８７の実行を省略して、ステップＳ８８を実行する。
【０１６０】
判定条件Ａのいずれにも合致しない場合（ステップＳ８４  ＮＯ）、パックデータ設定サブルーチンは、エッジ番号ｅをパックデータＰに追加して（ステップＳ８５）、再度、パックデータ設定サブルーチンを呼び出して、エッジ番号ｅ及びパックデータＰを渡してパックデータの設定を依頼すると、再帰呼び出されたパックデータ設定サブルーチンがパックデータＰを設定して、設定したパックデータＰを再帰呼び出したパックデータ設定サブルーチンに返す（ステップＳ８６）。この後、パックデータ設定サブルーチンは、ステップＳ８５において追加したエッジ番号ｅを、パックデータＰから削除する（ステップＳ８７）。
【０１６１】
そして、パックデータ設定サブルーチンは、再度、パックデータ設定サブルーチンを呼び出して、エッジ番号ｅ及びパックデータＰを渡してパックデータの設定を依頼すると、再帰呼び出されたパックデータ設定サブルーチンがパックデータＰを設定して、設定したパックデータＰを再帰呼び出したパックデータ設定サブルーチンに返す（ステップＳ８８）。この後、パックデータ設定サブルーチンは、パックデータＰのスコアＴを効果解析部３５３に返す。
【０１６２】
図２５は、効果解析部３５３が実行する効果解析処理フローであり、特に、パックデータの設定処理におけるスコア判定処理、換言すれば、スコア判定サブルーチンによる処理について示す。
【０１６３】
スコア判定サブルーチンは、パックデータＰから先頭のエッジデータＥを取り出し（ステップＳ９１）、スロット番号Ｓを「１」に設定し（ステップＳ９２）、取り出したエッジデータＥの命令番号［Ｓ］の命令データを取り出す（ステップＳ９３）。
【０１６４】
次に、スコア判定サブルーチンは、取り出した命令データにおいて、定義オペランド及び参照オペランドに含まれるサブレジスタをレジスタマップ［Ｓ］に登録する（ステップＳ９４）。換言すれば、スロットＳについてのレジスタマップ３５４が生成される。そして、スコア判定サブルーチンは、スロットＳをインクリメントすることにより「１」を加算し、換言すれば、スロットＳの番号を更新し（ステップＳ９５）、並列度の数だけステップＳ９３を繰り返す。
【０１６５】
次に、スコア判定サブルーチンは、パックデータＰから先頭のエッジデータＥを取り出し（ステップＳ９６）、エッジデータの数だけステップＳ９２を繰り返す。これにより、図２０に示すように、スロットＳの各々について、レジスタマップ３５４が生成される。
【０１６６】
次に、スコア判定サブルーチンは、値Ｚにレジスタマップ３５４間で重なっているサブレジスタの数を求めて代入し（ステップＳ９７）、スコアＴにスコアの計算式による計算結果を代入して（ステップＳ９８）、算出したスコアＴが値Ｚよりも大きいか否かを判断する（ステップＳ９９）。
【０１６７】
スコアＴが値Ｚよりも大きい場合（ステップＳ９９  ＹＥＳ）、スコア判定サブルーチンは、値ＺにスコアＴを代入し、パックデータＰをベストパックデータＢに代入する（ステップＳ９１０）。この後、スコア判定サブルーチンは、求めたスコアＴ及びベストパックデータＢをパックデータ設定サブルーチンに返す。これにより、図１９に示すように、最も優れたスコアＴと、そのスコアＴを持つパックデータＰが得られる。
【０１６８】
スコアＴが値Ｚよりも大きくない場合（ステップＳ９９  ＮＯ）、スコア判定サブルーチンは、スコアＴが値Ｚよりも大きくない旨をパックデータ設定サブルーチンに返す。
【符号の説明】
【０１６９】
１    入力装置
２    コンパイル装置
３    コンパイラ
４    記憶部
５    リンカ
３１    ソースプログラム入力部
３２    入出力制御部
３３    中間言語生成部
３４    最適化部
３５    ソース解析部
３６    最適化実行部
３７    中間言語記憶部
３８    コード生成部
３９    オブジェクトファイル出力部
４１    ソースプログラム
４２    オブジェクトファイル
４３    実行ファイル
３５１    依存解析部
３５２    候補抽出部
３５３    効果解析部
３５４    レジスタマップ
３５５    スコアリング部
【図１】
0005887811.tif 000002
【図２】
0005887811.tif 000003
【図３】
0005887811.tif 000004
【図４】
0005887811.tif 000005
【図５】
0005887811.tif 000006
【図６】
0005887811.tif 000007
【図７】
0005887811.tif 000008
【図８】
0005887811.tif 000009
【図９】
0005887811.tif 000010
【図１０】
0005887811.tif 000011
【図１１】
0005887811.tif 000012
【図１２】
0005887811.tif 000013
【図１３】
0005887811.tif 000014
【図１４】
0005887811.tif 000015
【図１５】
0005887811.tif 000016
【図１６】
0005887811.tif 000017
【図１７】
0005887811.tif 000018
【図１８】
0005887811.tif 000019
【図１９】
0005887811.tif 000020
【図２０】
0005887811.tif 000021
【図２１】
0005887811.tif 000022
【図２２】
0005887811.tif 000023
【図２３】
0005887811.tif 000024
【図２４】
0005887811.tif 000025
【図２５】
0005887811.tif 000026
【図２６】
0005887811.tif 000027
【図２７】
0005887811.tif 000028
【図２８】
0005887811.tif 000029
【図２９】
0005887811.tif 000030
【図３０】
0005887811.tif 000031
【図３１】
0005887811.tif 000032
【図３２】
0005887811.tif 000033
【図３３】
0005887811.tif 000034
【図３４】
0005887811.tif 000035
【図３５】
0005887811.tif 000036
【図３６】
0005887811.tif 000037
【図３７】
0005887811.tif 000038