前述したように、コンパイラがソースプログラムに含まれるループ構造を認識できない場合には、ループをアンローリング展開することができず、SIMD最適化を適用することができない。
しかし、本発明者の検討によれば、ループ構造でなくても、同じ種類の演算を行う複数の命令に対しては、SIMD命令を適用することができる場合があると考えられる。換言すれば、図29の例のようにループ構造でない命令についても、SIMD最適化を適用することはできる場合があると考えられる。
まず、並列度の数が「2」である場合について考える。この場合、隣接した2個の命令であれば、SIMD化することができる。
例えば、図28(A)に示す2個の命令が、図29のようにアンローリング展開の結果としてではなく、最初からソースプログラムに隣接して存在しているとする。この場合、隣接した2個の命令が、同じ種類の演算であるので、ループ構造でなくても、前述したように、SIMD化することができる。
次に、並列度の数が「4」である場合について考える。一例として、図28の例における並列度を「4」にした場合を、図30に示す。なお、前述したように、SIMDレジスタS1、S2、S3が存在し、SIMD命令S1=S2+S3を実行するものとする。
並列度が「4」であるので、図28(A)の2個の命令に代えて、図30(A)に示す隣接する4個の命令を想定する。図30(A)において、隣接する4個の命令は、各々、「スロット1」〜「スロット4」に割り当てられる。SIMD命令S1=S2+S3が実行されると、図30(B)に示すように、「スロット1」において演算A(I)=B(I)+C(I)が実行され、「スロット2」において演算A(I+1)=B(I+1)+C(I+1)が実行され、「スロット3」において演算A(I+2)=B(I+2)+C(I+2)が実行され、「スロット4」において演算A(I+3)=B(I+3)+C(I+3)が実行される。
次に、多数の命令が隣接している場合について考える。なお、説明の簡単化のために、並列度の数は「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行目の演算結果A(I)を2行目の命令が参照し、2行目の演算結果D(I)を3行目の命令が参照し、3行目の演算結果F(I)を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レジスタでは、異なるスロット間のデータを演算対象とすることができない。このため、あるスロットのサブレジスタに割り当てられたデータを、他のスロットのサブレジスタで使用する場合、サブレジスタ間でデータを転送する命令、換言すれば、サブレジスタ間の転送命令を実行する必要がある。
例えば、図34(A)に示す命令列について、図34(B)に示すSIMD化を考えるとする。この場合、SIMDレジスタとサブレジスタとデータとの関係は、図35(A)に示すような割り当てになる。なお、並列度の数は「2」であるとする。また、図35(A)においては、図35(B)に示すように、「S1」等のSIMDレジスタと共に、そのSIMDレジスタ内の2個のサブレジスタ「sub1」及び「sub2」に割り当てられたデータを示している。
図34(B)及び図35(A)に示すように、1行目の命令と2行目の命令は、SIMDレジスタS1〜S3を用いてSIMD化される。この結果、図35(A)に示すように、データB(I+1)は、SIMDレジスタS2において、サブレジスタsub2側(スロット2)に割り当てられる。一方、図34(B)及び図35(A)に示すように、4行目の命令と5行目の命令は、SIMDレジスタS4〜S6を用いてSIMD化される。この結果、図35(A)に示すように、データB(I+1)は、SIMDレジスタS5において、サブレジスタsub1側(スロット1)に割り当てられる。従って、図35(A)の3行目に示すように、データB(I+1)を、SIMDレジスタS2のサブレジスタsub2から、SIMDレジスタS5のサブレジスタsub1へ転送する必要がある。
なお、サブレジスタ間の転送命令は高いオーバーヘッドになる場合が多く、レジスタ間の転送が無い方が望ましい。また、サブレジスタ間の転送命令のコストが少ないアーキテクチャにおいても、レジスタ転送命令の削減は、SIMD化の効果をより増加させる。
ところが、図36に示すように、1行目の命令と2行目の命令についてのSIMD化において、データB(I+1)が、SIMDレジスタS2のサブレジスタsub1側(スロット1)に割り当てられたとする。換言すれば、SIMDレジスタS1〜S3において、データA(I+1)及びデータA(I)、データB(I+1)及びデータB(I)、データC(I+1)及びデータC(I)が、各々、図35の例とは逆のサブレジスタに割り当てられたとする。この場合、図36に示すように、サブレジスタ間の転送命令の実行は不要となる。
このように、SIMDレジスタへのデータの割り当てに依存して、サブレジスタ間の転送命令が必要となるかが変化する。従って、処理対象の命令から離れた位置の命令をSIMD化する場合には、SIMD化した結果を評価して、SIMD化により本当に最適化されているかを検証する必要がある。
また、同じ種類の演算が複数存在する場合、SIMD化が可能な組み合わせは命令数に比例して大きくなる。このため、膨大な組み合わせの中から例えば図36の例のような有効な候補を抽出することは難しい。従って、処理対象の命令から離れた位置の命令をSIMD化する場合には、有効な候補の抽出のために多大なコンパイル時間が必要となることが判った。
更に、同じ種類の演算として、図37(A)のように加算命令が8つ存在する場合には、SIMD化処理の候補(以下、SIMD化の候補と言う)として、図37(B)及び図37(C)に示すように、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又は中間プログラムが、図4(A)に示すような命令列であるとする。図4(A)の命令列において、各々の命令の命令形式は、図4(B)に示すように、「LOAD」のような命令と、「mem01」のような参照オペランドと、「R01」のような定義オペランドとを含む形式とされる。図4(C)に示すように、命令LOADはメモリに格納されたデータをレジスタにロードする命令であり、命令MULTはレジスタのデータを積算する命令であり、命令ADDはレジスタのデータを加算する命令である。オペランドは、図4(D)に示すように、「mem01」〜「mem08」のようなメモリ名や、「R01」〜「R14」のようなレジスタ名とされる。
依存解析部351は、図4(A)の命令列を、解析幅「12」で区切り、1個の解析幅の範囲で命令の依存関係を解析し、また、解析幅の範囲で複数の命令を組み合わせてSIMD化を行う。換言すれば、1個の解析幅の範囲に存在する複数の命令の組み合わせを、1個のSIMD命令に置き換える。
解析幅が「12」である場合、図5(A)に示すように、先頭から12個の命令を依存解析の対象とされる。図5(A)に示す依存解析の対象は、例えば当該依存解析の対象についてのスコアの算出の終了まで、依存解析部351に保持される。例えば、先頭から12行目の命令と13行目の命令とがSIMD化できる関係にあるとしても、異なる命令列に属するので、SIMD化の対象とされない。このように、解析幅を制限することにより、コンパイラ3の処理の負担が大きくなることを回避して、事実上、全ての命令をSIMD化の対象とすることができる。
依存解析部351は、図5(A)の解析幅に属する命令列に含まれる各々の命令について、図5(A)に示すように、各々の命令の属性を表す命令データを生成する。
例えば、図5(A)の解析幅における最初の命令について見ると、当該命令から、図4(B)に示す命令形式に基づいて、命令名として「LOAD」、定義オペランドとして「R01」、参照オペランドとして「mem01」が得られる。命令番号は、図5(A)の解析幅における当該命令の行番号、換言すれば、当該命令が図5(A)の解析幅の何行目であるかに基づいて定められる。解析済フラグは、解析されていないことを表す「FALSE」とされる。解析済フラグは、解析の後に、換言すれば、依存データの生成の後に、解析されたことを表す「TRUE」とされる。
依存解析部351は、図5(A)の解析幅における各々の命令について、同様にして命令データを生成する。これにより、図5(A)の解析幅における各々の命令についての命令データが生成される。
依存解析部351は、解析幅に属する各々の命令についての図5(A)に示す命令データに基づいて、図5(A)に示すように、各々の命令の間における依存関係を表す依存データを生成する。
例えば、依存解析部351は、命令番号#1の命令データの定義オペランド「R01」を取り出して、命令番号#2〜#12の命令データを検索する。これにより、命令番号#1の命令データの定義オペランド「R01」が、命令番号#3の命令データの参照オペランドと同一であることを検出する。そこで、依存解析部351は、依存データとして「E1→#3」を生成する。依存データの形式は、図5(B)に示すように、定義オペランドを持つ命令データの命令番号から、参照オペランドを持つ命令データの命令番号を指すようにされる。これにより、2個の命令間の依存関係が、命令番号を用いて表された依存データとして管理される。
依存解析部351は、解析幅に属する各々の命令についての図5(A)に示す命令データについて、同様にして依存データを生成する。これにより、図5(A)の解析幅における各々の命令についての依存データが生成される。
例えば、図5(A)に示す依存データをグラフ化すると、図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が解析幅内のものでない場合(ステップS31 NO)、解析サブルーチンは、命令データMが解析幅内のものでない旨を、依存解析部351へ返す。
命令データMが解析幅内のものである場合(ステップS31 YES)、解析サブルーチンは、命令データMの解析済フラグがFALSEかTRUEかを判定する(ステップS32)。命令データMの解析済フラグがTRUEである場合、解析サブルーチンは、命令データMが解析済みである旨を、依存解析部351へ返す。
命令データMの解析済フラグがFALSEである場合、解析サブルーチンは、命令データMの参照オペランドと同じデータを定義オペランドとして持つ命令データを検索し、該当する命令データが存在する場合には、該当する命令データを定義データDに代入する(ステップS33)。
この後、解析サブルーチンは、定義データDが解析幅内のものか否かを判断する(ステップS34)。例えば、依存解析部351に保持されている図5(A)に示す処理対象の命令列を定義データDを用いて検索することにより、定義データDと同一の命令が図5(A)に示す処理対象の命令列に存在するか否かが調べられる。命令データMが解析幅内のものでない場合(ステップS34 NO)、解析サブルーチンは、命令データMが解析幅内のものでない旨を、依存解析部351へ返す。
命令データMが解析幅内のものである場合(ステップS34 YES)、解析サブルーチンは、定義データDの命令番号を定義して、換言すれば、定義データDの命令番号を求めて、定義データDが命令データMの命令番号を参照する依存データを作成する(ステップS35)。この後、解析サブルーチンは、命令データMの参照オペランドの数だけステップS33を繰り返す。これにより、命令データMの参照オペランドの各々についての依存データが作成される。
次に、候補抽出部352が実行する候補抽出処理について説明する。
候補抽出部352は、各々の命令についての命令データと、依存データとに基づいて、SIMD化の候補を抽出する。換言すれば、候補抽出部352は、命令データ及び依存データに基づいて、SIMD化の候補となる命令の組合せを抽出する。命令の組合せは、命令データの命令番号を関連付けることにより管理される。
具体的には、候補抽出部352は、図5(A)の解析幅に属する命令の中から、図6において直線上にある複数の命令、換言すれば、依存関係のある命令を除く、2個の命令の組合せを抽出する。
例えば、図4(A)の命令列から抽出された図5(A)の解析幅に属する命令からは、図10に示すように、SIMD化の候補となる命令の組合せが抽出される。抽出される命令の組合せに含まれる命令の数は、前述したように、並列度の数が「2」であるので、2個である。抽出される命令の組合せに含まれる2個の命令は、同一の命令である。例えば、組合せ「#1−#2」は、共に、命令LOADである。なお、例えば、組合せ「#3−#8」と同時に、組合せ「#3−#10」のように、相互に一部が重なる組合せが存在しても良い。
候補抽出部352は、図10に示す複数のSIMD化の候補の各々について、図11に示すように、エッジデータを生成する。エッジデータは、SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報、換言すれば、反転フラグを含む。
エッジデータの格納領域は、図11(A)に示すように、エッジ番号の格納領域、反転フラグの格納領域、命令番号[N]の格納領域を含む。エッジ番号は、エッジデータを一意に識別する識別情報であり、エッジデータの管理に用いられる。反転フラグは、組合せの並び替えが可能か否かを表す情報である。命令番号[N]は、SIMD化の候補となる組合せに属する命令を表し、当該命令についての命令データに含まれる命令番号である。
反転フラグFALSEは、複数の命令の並び替えが可能であることを示す。反転フラグTRUEは、複数の命令の並び替えが可能でないことを示す。候補抽出部352は、命令の種類に応じて、エッジデータにおける反転フラグFALSE又はTRUEを設定する。例えば、命令LOADの場合及び命令ADDの場合には、反転フラグFALSEが設定される。命令MULTの場合には、反転フラグTRUEが設定される。
図11(A)に示すエッジデータの格納領域において、エッジ番号は、「1」から順に付与される。例えば、図10に示すSIMD化の候補の各々について、上段左側から順にエッジ番号「1」〜「5」が付与され、次に、下段上段左側から順にエッジ番号「6」〜「8」が付与される。Nは並列度の数である。従って、命令番号[N]の格納領域に含まれる命令番号の数、換言すれば、命令の数は、N個である。
候補抽出部352は、最初に、図11(A)に示すエッジデータの格納領域を生成する。この後、候補抽出部352は、生成したエッジデータの格納領域をコピーして、コピーしたエッジデータの格納領域にN個の命令番号を格納することを繰り返す。この例では、前述したように、並列度の数は「2」であるので、命令番号[1]の格納領域と命令番号[2]の格納領域とに、各々、命令番号が格納される。この時、格納される命令番号は、先頭から順に、1ずつシフトされる。例えば、エッジ番号が「1」のエッジデータにおいては#1及び#2の命令番号が格納され、エッジ番号が「2」のエッジデータにおいては#2及び#3の命令番号が格納され、最後のエッジデータにおいては#11及び#12の命令番号が格納される。これにより、図11(B)に示すように、エッジデータの集合が得られる。
図11(B)において、命令番号[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は、図11(A)に示すエッジデータ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は存在する。
スロットが存在しない場合(ステップS52 NO)、エッジデータ設定サブルーチンは、エッジデータ確定サブルーチン、換言すれば、エッジデータ確定サブルーチン実行部を呼び出して、それまでに生成されたエッジデータEを渡してエッジデータの確定を依頼すると、エッジデータ確定サブルーチンが、エッジデータEをチェックした上で確定して、確定したエッジデータEをエッジデータ設定サブルーチンに返す(ステップS58)。エッジデータ設定サブルーチンは、確定したエッジデータEを受け取ると、それまでに生成されたエッジデータEを候補抽出部352に返す。
スロットが存在する場合(ステップS52 YES)、エッジデータ設定サブルーチンは、命令データMが別のスロットに存在するか否かを判断する(ステップS53)。命令データMが別のスロットに存在する場合(ステップS53 YES)、エッジデータ設定サブルーチンは、以下のステップS54〜S56の実行を省略して、ステップS57を実行する。
命令データMが別のスロットに存在しない場合(ステップS53 NO)、エッジデータ設定サブルーチンは、エッジデータ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に含まれる命令が全て同じ命令でない場合(ステップS61 NO)、SIMD化することができないので、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータEを破棄して(ステップS65)、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。
エッジデータEに含まれる命令が同じ命令である場合(ステップS61 YES)、換言すれば、エッジデータEに同じ命令が含まれる場合、エッジデータ確定サブルーチンは、更に、エッジデータEに含まれる命令に依存関係がないか否かを判断する(ステップS62)。エッジデータEに含まれる命令に依存関係がある場合(ステップS62 NO)、SIMD化することができないので、エッジデータ確定サブルーチンは、ステップS65を実行して、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。
エッジデータEに含まれる命令に依存関係がない場合(ステップS62 YES)、エッジデータ確定サブルーチンは、更に、エッジデータEに含まれる命令をSIMD化した場合に、SIMD命令のアーキテクチャの禁止事項に違反しないか否かを判断する(ステップS63)。例えば、SIMD命令のアーキテクチャによっては、平方根の演算をSIMD化しないことが規定されている。これは、平方根の演算のための命令が別に用意されているためである。禁止事項に違反する場合(ステップS63 NO)、SIMD化することができないので、エッジデータ確定サブルーチンは、ステップS65を実行して、エッジデータEを破棄した旨をエッジデータ設定サブルーチンに返す。
禁止事項に違反しない場合(ステップS63 YES)、エッジデータ確定サブルーチンは、それまでに生成されたエッジデータEを保存して(ステップS64)、エッジデータEを保存した旨をエッジデータ設定サブルーチンに返す。
次に、効果解析部353が実行する効果解析処理について説明する。
効果解析部353は、複数のSIMD化の候補と、SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報とに基づいて、SIMD化する命令の組合せを生成する。複数のSIMD化の候補は、例えば、図10に示される8組の候補である。SIMD化の候補に含まれる複数の命令の並び替えが可能か否かを表す情報は、図11(B)に示すエッジデータにおける反転フラグの値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」は、図11(B)に示すエッジ番号「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である場合(ステップS74 YES)、効果解析部353は、ベストパックデータBを利用して、SIMD化の適用依頼を生成して、生成したSIMD化の適用依頼を最適化部35に返す(ステップS75)。Z!=−1でない場合(ステップS74 NO)、効果解析部353は、SIMD化の中止依頼を生成して、生成したSIMD化の中止依頼を最適化部35に返す(ステップS76)。
図24は、効果解析部353が実行する効果解析処理フローであり、特に、パックデータの設定処理、換言すれば、パックデータ設定サブルーチンによる処理について示す。
パックデータ設定サブルーチンは、スコア判定サブルーチン、換言すれば、スコア判定サブルーチン実行部を呼び出して、パックデータPを渡してスコアTの判定を依頼すると、スコア判定サブルーチンがパックデータPのスコアTを判定して、判定したパックデータPのスコアTをパックデータ設定サブルーチンに返す(ステップS81)。スコアTは、現在のパックデータPのスコアであり、スコア判定サブルーチンの復帰値である。
この後、パックデータ設定サブルーチンは、エッジデータeをインクリメントすることにより「1」を加算する(ステップS82)。これにより、処理対象が次のエッジデータに移動する。そして、パックデータ設定サブルーチンは、エッジデータeが最大エッジ番号よりも大きいか否かを判断する(ステップS83)。最大エッジ番号は、図10に示すエッジデータの数に等しい。
エッジデータeが最大エッジ番号よりも大きい場合(ステップS83 YES)、パックデータ設定サブルーチンは、パックデータPのスコアTを効果解析部353に返す。
エッジデータeが最大エッジ番号よりも小さい場合(ステップS83 NO)、パックデータ設定サブルーチンは、更に、判定条件Aのいずれかに合致するか否かを判断する(ステップS84)。ここで、判定条件Aは以下の3つとされる。第1の判定条件は、エッジ番号eに含まれる命令番号は登録済みであることである。例えば、図10に示すエッジデータの中で、先頭の2個のエッジデータが、第1の判定条件に該当する。第2の判定条件は、既存のパックデータPに依存関係があることである。依存関係がある場合には、SIMD化することができない。第3の判定条件は、スコアTが既存のいずれかのスコアTよりも悪いことである。スコアTが悪いので、現在のパックデータPの処理を進める意味が無い。
判定条件Aのいずれかに合致する場合(ステップS84 YES)、パックデータ設定サブルーチンは、以下のステップS85〜S87の実行を省略して、ステップS88を実行する。
判定条件Aのいずれにも合致しない場合(ステップS84 NO)、パックデータ設定サブルーチンは、エッジ番号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よりも大きい場合(ステップS99 YES)、スコア判定サブルーチンは、値ZにスコアTを代入し、パックデータPをベストパックデータBに代入する(ステップS910)。この後、スコア判定サブルーチンは、求めたスコアT及びベストパックデータBをパックデータ設定サブルーチンに返す。これにより、図19に示すように、最も優れたスコアTと、そのスコアTを持つパックデータPが得られる。
スコアTが値Zよりも大きくない場合(ステップS99 NO)、スコア判定サブルーチンは、スコアTが値Zよりも大きくない旨をパックデータ設定サブルーチンに返す。