(57)【要約】【課題】  生成されるオブジェクトプログラムの命令数を削減し、実行性能を向上させる。【解決手段】  配列変数の各要素について、判定配列変数の対応する要素値に基づいて、第１と第２の変数群の何れかを選択し、選択した変数群を対象に演算を実行するプログラム部分を検出する手段と、ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、判定配列変数の要素値に基づいて、ベクトルレジスタの要素において、第１と第２の部分の何れについて演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、ベクトルマスクの指示に従って、ベクトルレジスタの各要素の第１と第２の部分の何れか一方で演算を実行するマスク付ベクトル演算命令を生成する手段と、を備えるコンパイル装置。【選択図】      図６
2018049461.tif 000002
【特許請求の範囲】
【請求項１】
配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析手段と、
１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行手段と、を備えるコンパイル装置。
【請求項２】
前記解析手段は、第１と第２の前記変数群の何れかを選択し、選択した前記変数群を対象に、何れを選択した場合でも同一の順序で、複数の前記演算を実行する部分を検出し、
前記ベクトル化実行手段は、前記複数の前記演算の各々を実行する前記マスク付ベクトル命令を前記同一の順序で生成する請求項１のコンパイル装置。
【請求項３】
前記解析手段は、第１と第２の前記変数群の何れかを選択し、選択した前記変数群を対象に、いずれを選択した場合でも同一の前記演算の組を実行する部分を検出し、
前記ベクトル化実行手段は、前記演算の前記組に属する各々の前記演算を実行する前記マスク付ベクトル命令を所定基準に基づいて決定した順序で生成する請求項１乃至請求項２の何れか一項のコンパイル装置。
【請求項４】
前記解析手段は、第１と第２の前記変数群の何れかを選択し、１）前記第１の前記変数群を選択した場合、前記第１の前記変数群を対象に前記演算の組を実行し、２）前記第２の前記変数群を選択した場合、前記第２の前記変数群を対象に、前記演算の前記組のサブセットを実行する部分を検出し、
前記ベクトル化実行手段は、３ａ）前記ベクトルマスクを用いて、前記演算の前記組の前記サブセットに属する各々の前記演算を実行するマスク付ベクトル演算命令と、３ｂ）前記ベクトルレジスタの第２の前記部分について前記演算を実行しないことを示すように変更された前記ベクトルマスクを用いて、前記演算の前記組の前記サブセット外の各々の前記演算を実行するマスク付ベクトル演算命令と、を所定基準に基づいて決定した順序で生成する請求項１乃至請求項３の何れか一項のコンパイル装置。
【請求項５】
前記ベクトルレジスタの第１と第２の前記部分は、前記ベクトルレジスタの上位半分と下位半分である、請求項１乃至請求項４の何れか１項のコンパイル装置。
【請求項６】
配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析処理と、
１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行処理と、をコンピュータに実行させるコンパイルプログラム。
【請求項７】
第１と第２の前記変数群の何れかを選択し、選択した前記変数群を対象に、何れを選択した場合でも同一の順序で、複数の前記演算を実行する部分を検出する前記解析処理と、
前記複数の前記演算の各々を実行する前記マスク付ベクトル命令を前記同一の順序で生成する前記ベクトル化実行処理と、をコンピュータに実行させる請求項６のコンパイルプログラム。
【請求項８】
第１と第２の前記変数群の何れかを選択し、選択した前記変数群を対象に、いずれを選択した場合でも同一の前記演算の組を実行する部分を検出する前記解析処理と、
前記演算の前記組に属する各々の前記演算を実行する前記マスク付ベクトル命令を所定基準に基づいて決定した順序で生成する前記ベクトル化実行処理と、をコンピュータに実行させる、請求項６乃至請求項７の何れか一項のコンパイルプログラム。
【請求項９】
第１と第２の前記変数群の何れかを選択し、１）前記第１の前記変数群を選択した場合、前記第１の前記変数群を対象に前記演算の組を実行し、２）前記第２の前記変数群を選択した場合、前記第２の前記変数群を対象に、前記演算の前記組のサブセットを実行する部分を検出する前記解析処理と、
３ａ）前記ベクトルマスクを用いて、前記演算の前記組の前記サブセットに属する各々の前記演算を実行するマスク付ベクトル演算命令と、３ｂ）前記ベクトルレジスタの第２の前記部分について前記演算を実行しないことを示すように変更された前記ベクトルマスクを用いて、前記演算の前記組の前記サブセット外の各々の前記演算を実行するマスク付ベクトル演算命令と、を所定基準に基づいて決定した順序で生成する前記ベクトル化実行処理とを、コンピュータに実行させる請求項６乃至請求項８の何れか一項のコンパイルプログラム。
【請求項１０】
配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出し、
１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成する、コンパイル方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイル装置、コンパイル方法、および、コンパイルプログラム、特に、制御文を含む配列演算を行うソースコードに対して、データをパックしてマスク付きベクトルＳＩＭＤ（Single Instruction Multiple Data）命令で処理するようにオブジェクトプログラムを生成するものに関する。
【背景技術】
【０００２】
特許文献１は、制御文を含むソースコードに対応する、ベクトルマスキングＳＩＭＤコードを生成する方法を開示する。この方法は、マスクを使用することにより、THEN節とELSE節の命令を、制御文無しで実行するＳＩＭＤコードを生成する。
【０００３】
特許文献２は、制御文の条件式が比較演算で、結果をビットマスクとして得られる場合には、代入文が選択的に実行されるだけの単純な制御文を、論理演算を使って、同じ効果が得られるＲＴＬ（Register Transfer Language）に変換する技術を開示する。この技術は、その後、同じ演算を異なるデータに適用しているものを見つけて、parallel式を使って１か所にまとめ、次いで、parallel式を使って記述されている代入文のうち、ＳＩＭＤ命令１つで処理できるものを抽出する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１０−１８６４６７号公報
【特許文献２】特開２００３−２０２９９１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
特許文献１に開示される技術は、THEN節とELSE節のそれぞれに対する命令を別々に生成して、実行させる。THEN節とELSE節で同一演算を行っており、ＳＩＭＤ命令の並列度に余裕が有る場合、命令の実行効率が悪い。
【０００６】
特許文献２の技術は、制御文で選択的に実行される代入文を、１つのＳＩＭＤ命令で実行できる可能性はあるものの、適用範囲は代入文に限定される。さらに、制御文から変換されたＲＴＬは、他の部分を含めた全体的な最適化の対象となり、必ずしも制御文で選択的に実行される代入文が１つのＳＩＭＤ命令で実行されるわけではない。
【０００７】
本発明は、上記課題を解決し、ソースコードから生成されるオブジェクトプログラムの命令数を削減し、実行性能を向上させるコンパイル装置、コンパイル方法、および、コンパイルプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明の１実施の形態のコンパイル装置は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析手段と、１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行手段と、を備える。
【０００９】
本発明の１実施の形態のコンパイルプログラムは、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析処理と、１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行処理と、をコンピュータに実行させる。
【００１０】
本発明の１実施の形態のコンパイル方法は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出し、１）ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、２）前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第１と第２の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、３）前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第１と第２の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成する。
【発明の効果】
【００１１】
本発明にかかるコンパイルプログラムは、ソースコードから生成されるオブジェクトプログラムの命令数を削減し、実行性能を向上させる。
【図面の簡単な説明】
【００１２】
【図１】図１は、単純な配列演算を実行するソースプログラム１に対して、コンパイルプログラム７が生成するオブジェクトプログラム２を示す。
【図２】図２は、制御文（IF文）を含む配列演算を実行するソースプログラム１に対して、コンパイルプログラム７が生成するオブジェクトプログラム２を示す。
【図３】SIMD命令を説明する図である。
【図４】図４は、配列演算を実行するソースプログラム１に対して、ベクトルレジスタ上でどのようにデータがパックされるかを示す図である。
【図５】図５は、図４のｂ）が示すベクトルレジスタにおけるＪ番目の要素についてのマスク付きベクトルSIMD命令による加算例を示す。
【図６】図６は、第一の実施の形態のコンパイルプログラム７の構成を示す図である。
【図７】図７は、コンピュータ装置６００の構成を示す図である。
【図８】図８は、コンパイル装置８を備えるコンピュータ装置６００の構成を示す図である。
【図９】図９は、配列演算処理部の形式解析部７１３が、パック可能と判定するFortranプログラムであって、複数の演算を行うソースプログラム１の例を示す。
【図１０】図１０は、図２が示したソースプログラム１と、そこから生成されるマスク付ベクトル演算SIMD命令を含むオブジェクトプログラム２の例を示す。
【図１１】図１１は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム１の例を示す。
【図１２】図１２は、第２の実施の形態にかかるコンパイル装置８の構成を示す図である。
【発明を実施するための形態】
【００１３】
＜第１の実施の形態＞
＜概要＞
本発明に係るコンパイルプログラム７は、配列演算を実行するソースプログラム１に対して、ベクトル演算を利用したオブジェクトプログラム２を生成する。
【００１４】
図１は、単純な配列演算を実行するソースプログラム１に対して、コンパイルプログラム７が生成するオブジェクトプログラム２を示す。このソースプログラム１は、ループにより、配列変数BとCの各要素を加算して、配列変数Aの各要素に格納するものである。
【００１５】
なお、配列演算のソースプログラム１は、全てループを用いたものを例示するが、本発明はこの条件に拘束されない。本発明は、配列演算を必ずしも明示的なループにより記述する必要が無いプログラム言語にも適用できる。
【００１６】
コンパイルプログラム７は、この配列に関する演算を、ベクトル命令に変換してベクトル化したオブジェクトプログラム２を生成する。すなわち、コンパイルプログラム７は、配列変数BとCの各要素を、其々、ベクトルレジスタvreg1とvreg2の各要素にロードするベクトルロード命令（VLD）を含むオブジェクトプログラム２を生成する。コンパイルプログラム７は、さらに、両ベクトルレジスタの各要素の加算を行いvreg3の各要素に格納するベクトル浮動小数点加算命令（VFADD）と、ベクトルレジスタvreg3の各要素を配列変数Aの各要素に格納するベクトルストア命令（VST）も生成する。
【００１７】
コンパイルプログラム７は、配列演算のベクトル化により、ベクトルプロセッサにおけるプログラムの実行性能を向上させている。
【００１８】
図２は、制御文（IF文）を含む配列演算を実行するソースプログラム１に対して、コンパイルプログラム７が生成するオブジェクトプログラム２を示す。このソースプログラム１は、配列変数Xの各要素の値がゼロか非ゼロかに応じて、１）配列変数B1とC1の要素を加算して、配列変数A1の要素に格納する、または、２）配列変数B2とC2の要素を加算して、配列変数A2の要素に格納するものである。
【００１９】
図２のような制御文を含む配列演算は、THEN節とELSE節で演算の対象となる変数群が変わるため、通常のベクトル命令に変換することができない。そこで、コンパイルプログラム７は、ソースプログラム１を、マスク付きベクトル浮動小数点加算命令（マスク指定のあるVFADD）に変換することでベクトル化しても良い。
【００２０】
マスク付きベクトル命令は、ベクトルマスクの各ビットの値の真偽により、当該ビットに対応する配列変数の要素に対する演算を実行するか否かを決定する。マスク付きベクトル命令は、例えば、ベクトルマスクのI（配列長N以下の整数）番目ビットの値が真であればベクトルレジスタのI番目の要素間の演算を実行し、偽であれば当該演算を実行しない。
【００２１】
図２のTHEN節をベクトル化するために、コンパイルプログラム７は、配列変数Xの各要素をベクトルレジスタvreg1にロードするベクトルロード命令を生成した後、vreg1からベクトルマスクvmreg1を生成するベクトルマスク生成命令（VFMK）を生成する。ベクトルマスク生成命令は、vreg1上の配列変数XのI番目の要素の値がゼロであればI番目のビットが真、配列変数XのI番目の要素の値が非ゼロであればI番目のビットが偽であるベクトルマスクを生成する。
【００２２】
続いて、コンパイルプログラム７は、配列変数B1とC1の各要素を、其々ベクトルレジスタvreg2とvreg3の各要素にロードするベクトルロード命令と、vmreg1が真であるビットに対応する要素について、vreg2とvreg3の要素の値を加算してvreg4に格納するマスク付きベクトル浮動小数点加算命令を生成する。さらに、コンパイルプログラム７は、vreg4の各要素を配列変数A1に格納するベクトルストア命令を生成する。
【００２３】
ELSE節に対し、コンパイルプログラム７は、先ず、ベクトルマスクvmreg1を反転させたベクトルマスクvmreg2を生成するマスクの論理否定命令（NEGN）を生成する。その後、コンパイルプログラム７は、THEN節と同様に、ベクトルロード命令、マスク付きベクトル浮動小数点加算命令、ベクトルストア命令を生成する。但し、それらの命令が使用する配列変数はA2、B2、C2であり、ベクトルマスクはvmreg2である。
【００２４】
このように、コンパイルプログラム７は、図２が例示するソースプログラム１に対して、THEN節とELSE節のそれぞれに対する命令を生成する。コンパイルプログラム７は、図２が例示するソースプログラム１に対して、さらに、実行効率の良いオブジェクトプログラム２を生成する機能を備えていても良い。以下、このオブジェクトプログラム２の生成機能について説明する。
【００２５】
このオブジェクトプログラム２の生成機能は、SIMD命令を含むオブジェクトプログラム２を生成する。SIMD命令は、図３のように一つのレジスタ、または、ベクトルレジスタの1つの要素に複数のデータを格納して、一回の演算命令で、複数のデータに対して同一の演算を行う。一つのレジスタ、または、ベクトルレジスタの要素に複数のデータを格納することを「パックする」と定義する。データのパックは、例えば、６４ビット幅のレジスタ、または、ベクトルレジスタの要素の上位３２ビットと下位３２ビットに、別々のデータを格納することを指す。
【００２６】
図３は、レジスタreg1の上位にA1、下位にB1をパックし、レジスタreg2の上位にA2、下位にB2をパックし、一命令でA1とA2の加算、B1とB2の加算を行い、結果をreg3にパックしている例を示す。
【００２７】
図４は、配列演算を実行するソースプログラム１に対して、ベクトルレジスタ上でどのようにデータがパックされるかを示す図である。図４のａ）は、図２で示したものと同じソースプログラム１を示す。図４のｂ）の３つのマトリクスは、其々、４つの要素（マトリクスの各行）からなるベクトルレジスタを示す。
【００２８】
コンパイルプログラム７は、３個のベクトルレジスタの各々を左から順に、配列変数A1とA2、B1とB2、C1とC2に割当て、ベクトルレジスタの各要素に、割り当てた二つの配列変数の要素の値をパックするように命令を生成する。コンパイルプログラム７は、例えば、THEN節で用いられている配列変数群（A1,B1,C1）の要素の値をベクトルレジスタの上位３２ビットに、ELSE節で用いられている配列変数群（A2,B2,C2）の要素の値をベクトルレジスタの下位３２ビットに格納するように命令を生成する。
【００２９】
コンパイルプログラム７が生成するマスク付きベクトルSIMD命令は、上位３２ビットおよび下位２３ビットのベクトル演算の実行、非実行を、上位用、および下位用の２つのベクトルマスクの値の真偽で決める。
【００３０】
マスク付きベクトルSIMD命令は、例えば、上位用ベクトルマスクのI（配列長N以下の整数）番目ビットの値が真であればベクトルレジスタのI番目の要素の上位３２ビット間の演算を実行し、偽であれば演算を実行しない。同様に、マスク付きベクトルSIMD命令は、例えば、下位用ベクトルマスクのI番目ビットの値が真であればベクトルレジスタのI番目の要素の下位３２ビット間の演算を実行し、偽であれば演算を実行しない。
【００３１】
ここで、上位用と下位用ベクトルマスクは、相互に論理否定となっている。これは、IF文における２者択一性を反映している。
【００３２】
図５は、図４のｂ）が示すベクトルレジスタにおけるＪ（４以下の自然数）番目の要素についてのマスク付きベクトルSIMD命令による加算例を示す。この例においては、上位用のベクトルマスクのJ番目のビットが真で、下位用のベクトルマスクのJ番目のビットが偽であるため、J番目の要素の上位３２ビット間の加算が行われている。すなわち、この例では、THEN節の配列変数群のJ番目の要素に対する演算のみが行われている。
【００３３】
＜構成＞
図６は、本実施の形態のコンパイルプログラム７の構成を示す図である。コンパイルプログラム７は、入力されたソースプログラム１を解析してベクトル化および配列データのパックができるか判定する解析部７１、解析結果に基づき配列演算処理部をベクトル化するベクトル化実行部７２を包含する。コンパイルプログラム７は、その他、一般のコンパイラが備える構文解析、最適化、オブジェクトプログラム２の生成機能も備える。
【００３４】
解析部７１は、制御文を含む配列演算認識部７１１、ベクトル化判定部７１２、および、配列演算処理部の形式解析部７１３を包含する。制御文を含む配列演算認識部７１１は、ソースプログラム１の中から、IF文等の制御文を含む配列演算記述部分の検出を行う。ベクトル化判定部７１２は、検出した配列演算記述部分がベクトル化できるか判断する。配列演算処理部の形式解析部７１３は、配列演算の対象データがパックできるか判定する。
【００３５】
ベクトル化実行部７２は、マスク生成部７２１、ベクトルロード命令生成部７２２、マスク付きベクトルSIMD命令生成部７２３、および、ベクトルストア命令生成部７２４を包含する。マスク生成部７２１は、ベクトルマスクを生成するマスク生成命令を生成する。ベクトルロード命令生成部７２２は、データをパックするためのベクトルロード命令を生成する。マスク付きベクトルSIMD命令生成部７２３は、パックされた配列データの演算を行うマスク付きベクトルSIMD命令を生成する。ベクトルストア命令生成部７２４は、パックされたデータをメモリへ保存するためのベクトルストア命令を生成する。
【００３６】
コンパイルプログラム７は、例えば、コンピュータ装置６００で実行される。図７は、コンピュータ装置６００の構成を示す図である。
【００３７】
コンピュータ装置６００は、バス６４０で相互に接続された、プロセッサ６１０、主記憶部６３０、および、外部記憶装置６２０を備える。プロセッサ６１０は、バス６４０を経由して、主記憶部６３０、および、外部記憶装置６２０に対してデータの読み書きを行う。また、プロセッサ６１０は、主記憶部６３０に格納されているコンパイルプログラム７を実行する。すなわち、プロセッサ６１０は、解析部７１や、ベクトル化実行部７２を実行する。
【００３８】
なお、コンパイルプログラム７は、当初外部記憶装置６２０に格納されており、コンピュータ装置６００の初期設定時に、プロセッサ６１０が外部記憶装置６２０から主記憶部６３０にロードしても良い。
【００３９】
ここで、主記憶部６３０は半導体メモリ装置である。外部記憶装置６２０はディスク装置、または、半導体記憶装置等の記憶装置である。
【００４０】
なお、解析部７１や、ベクトル化実行部７２は、それらの内部の部位（例えば、マスク付きベクトルSIMD命令生成部７２３）を含めて、論理回路や半導体記憶装置で構成されたコンパイル装置８として構成されても良い。この場合、コンピュータ装置６００が、コンパイル装置８を備える。
【００４１】
図８は、コンパイル装置８を備えるコンピュータ装置６００の構成を示す図である。このコンピュータ装置６００は、図７のコンピュータ装置６００の構成に加えて、バス６４０に接続されたコンパイル装置８を備える。また、図８のコンパイルプログラム７は、解析部７１や、ベクトル化実行部７２を含んでいない。
【００４２】
図８のコンピュータ装置６００において、プロセッサ６１０が主記憶部６３０上のコンパイルプログラム７を実行する。コンパイルプログラム７、必要に応じてコンパイル装置８に、解析部７１や、ベクトル化実行部７２が行う処理の実行を依頼する。
【００４３】
＜動作＞
次に、コンパイルプログラム７の動作について説明する。
【００４４】
まず、解析部７１における制御文を含む配列演算認識部７１１は、入力されたソースプログラム１から、制御文、例えばIF文を含みTHEN節とELSE節で配列演算を行う部分を検出する。続いて、ベクトル化判定部７１２が、検出された部分がベクトル化できるかを判定する。ベクトル化できる条件は、配列変数やスカラー変数の定義・参照関係にベクトル化を阻害する依存関係がないことである。依存関係が無いとの条件は、例えば、THEN節内やELSE節内で、前に行われた演算の結果が、後続して行われる演算に影響しないことである。
【００４５】
最後に、配列演算処理部の形式解析部７１３が、配列演算のオペランドとなる配列変数の値がパックできるかを判定する。パックできる基本条件は、THEN節とELSE節で異なる配列変数群に同じ順序で演算を実施することである。
【００４６】
前述の図２のソースプログラム１は、配列演算処理部の形式解析部７１３が、パック可能と判定するFortranプログラムのソースプログラム１の例である。このソースプログラム１は、配列変数Xの各要素の値がゼロか非ゼロかを判定するIF文に続いて、THEN節で、配列変数B1とC1の要素を加算して配列変数A1の要素に格納し、ELSE節で、配列変数B2とC2の要素を加算して配列変数A2の要素に格納する。
【００４７】
なお、上述した『異なる配列変数群』とは、少なくとも出力配列変数群が異なっていれば良い。入力配列変数の一部、または、全部が同一であっても良い。例えば、前述の図２のソースプログラム１は、１）THEN節で、配列変数BとC1の要素を加算して配列変数A1の要素に格納し、ELSE節で、配列変数BとC2の要素を加算して配列変数A2の要素に格納するものであっても良い。
【００４８】
図９は、配列演算処理部の形式解析部７１３が、パック可能と判定するFortranプログラムであって、複数の演算を行うソースプログラム１の例を示す。
【００４９】
図９のa）は、THEN節とELSE節で異なる配列変数群に、複数の演算を同じ順序で実行するソースプログラム１の例を示す。このソースプログラム１は、THEN節もELSE節も２つの配列変数間で、加算、減算、乗算、除算を、この同じ順序で行っており、パック可能である。
【００５０】
図９のｂ）は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム１の例を示す。このソースプログラム１において、THEN節は、２つの配列変数間で加算、減算、乗算、除算をこの順序で行う、ELSE節は、２つの配列変数間で加算、除算をこの順序で行う。したがって、この例において、ELSE節は、THEN節が行う演算の組のサブセットを、同じ順序で行う。
【００５１】
この場合、後に、ベクトル化実行部７２が、サブセット外の演算（上記例においては減算と乗算）に対するマスク付きベクトルSIMD命令の、サブセット実行側（上記例においてはELSE節）のベクトルマスクを偽にして計算を行わないようにする。これにより、THEN節とELSE節は、異なる配列変数群に同じ順序で演算を実施することになる。従って、この例はパック可能である。
【００５２】
図９のｃ）は、THEN節とELSE節で異なる配列変数群に、同じ演算の組を異なった順序で実行するソースプログラム１の例を示す。この例においては、THEN節とELSE節の両者は、２つの配列変数間で、加算、減算、乗算、除算を行う。演算を行う順序が異なるだけである。
【００５３】
この場合、後に、ベクトル化実行部７２が、両節の演算順を合わせる、例えば一方の順序を他方に合わせることで、THEN節とELSE節の両者は、異なる配列変数群に同じ順序で演算を実施することになる。複数の演算の間に依存関係が無いのは確認済みであるので、演算の順序は変更可能である。
【００５４】
図９のｄ）は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを異なる順序で実行するソースプログラム１の例を示す。この例において、THEN節は、２つの配列変数間で、加算、減算、乗算、除算をこの順序で行う、ELSE節は、２つの配列変数間で、除算、加算、乗算をこの順序で行う。したがって、この例において、ELSE節は、THEN節が行う演算の組のサブセットを、異なる順序で行う。
【００５５】
この場合、ベクトル化実行部７２は、サブセット外の演算（上記例においては減算）に対するマスク付きベクトルSIMD命令の、サブセット実行側（上記例においてはELSE節）のベクトルマスクを偽にして計算を行わないようにする。そのうえで、ベクトル化実行部７２は、両節の演算順を合わせる、例えば、フルセット実行側（上記例においてはTHEN節）の順序に合わせる。これにより、THEN節とELSE節の両者は、異なる配列変数群に同じ順序で演算を実施することになる。従って、この例はパック可能である。
【００５６】
続いて、ベクトル化実行部７２が、解析部７１がパック可能と判定したソースプログラム１をベクトル化する。図１０は、図２が示したソースプログラム１と、そこから生成されるマスク付ベクトル演算SIMD命令を含むオブジェクトプログラム２の例を示す。
【００５７】
ベクトル化実行部７２は、図１０または図９のａ）の例のようにTHEN節とELSE節が、異なる配列変数群に同じ順序で演算を実施するソースプログラム１を読み込んだとき、以下のように動作する。
【００５８】
＜ステップ１＞マスクの生成命令の生成
ベクトル化のために、マスク生成部７２１は、IF文の条件式から、先ず、THEN節のベクトルマスクを生成するマスク生成命令（VFMK）と、そのベクトルマスクを論理否定してELSE節のベクトルマスクを生成する論理否定命令（NEGM）を生成する。
【００５９】
図１０の例における該当部分は、ａ）で示した部分である。この例において、マスク生成部７２１は、IF文の判定対象となっている配列変数XからTHEN節のベクトルマスクvmreg1を生成するマスク生成命令と、vmreg1を論理否定してELSE節のベクトルマスクvmreg2を生成するマスク生成命令を生成する。ここで、マスク生成命令は、配列変数Xの値が０の要素に対応して真の、配列変数Xの値が非ゼロの要素に対して偽のビットマスクを生成する。
【００６０】
＜ステップ２＞データのパック命令の生成
ベクトル化されたSIMD命令は、パックされたデータを演算対象とする。データをパックするため、ベクトルロード命令生成部７２２は、THEN節及びELSE節の一方（例えば、THEN節）で演算対象となるベクトル変数群の入力変数の各要素をベクトルレジスタの各要素の上位３２ビットにロードする上位３２ビットベクトルロード命令（VLDU）を生成する。さらに、ベクトルロード命令生成部７２２は、THEN節及びELSE節の他方（例えば、ELSE節）で演算対象となるベクトル変数群の入力変数の各要素をベクトルレジスタの各要素の下位３２ビットにロードする下位３２ビットベクトルロード命令（VLDL）を生成する。
【００６１】
上位３２ビットベクトルロード命令、および、下位３２ビットベクトルロード命令の対は、２つの配列変数群における対応する入力変数の対ごとに生成される。
【００６２】
図１０の例における該当部分は、ｂ）で示した部分である。この例において、THEN節の配列変数群A1,B1,C1と、ELSE節の配列変数群A2,B2,C2における対応する入力変数の対は、B1とB2、C1とC2である。この例において、ベクトルロード命令生成部７２２は、ベクトルレジスタvreg2の上位３２ビットにTHEN節の入力配列変数B1を、下位３２ビットにELSE節の対応する入力配列変数B2を、ロードする２つのベクトルロード命令（VLDUとVLDL）を生成している。さらに、ベクトルロード命令生成部７２２は、ベクトルレジスタvreg3の上位３２ビットにTHEN節の入力配列変数C1を、下位３２ビットにELSE節の対応する入力配列変数C2を、ロードする２つのベクトルロード命令（VLDUとVLDL）を生成している。
【００６３】
＜ステップ３＞マスク付きベクトルSIMD命令の生成
マスク付きベクトルSIMD命令生成部７２３は、パックしたデータに対して演算を実行する為、THEN節とELSE節のベクトルマスクを設定したマスク付きベクトルSIMD命令を、所定の順序、例えばソースプログラム１に記載されていた順序、で生成する。
【００６４】
図１０の例における該当部分は、ｃ）で示した部分である。この例において、生成されたマスク付きベクトル浮動小数点加算SIMD命令（VFADD.P）は、上位３２ビット用にvmreg1を、下位３２ビット用にvmreg2のベクトルマスクを指定して、vreg2とvreg3を加算して結果をvreg4に格納する。このマスク付きベクトル浮動小数点加算SIMD命令は、vmreg1が真であるビットに対応する要素については上位３２ビット（THEN節側）を加算し、vmreg2が真であるビットに対応する要素については下位３２ビット（ELSE節側）を加算する。
【００６５】
＜ステップ４＞データのアンパック命令の生成
演算によって得られたパックされた結果データをメモリに保存するため、ベクトルストア命令生成部７２４は、ベクトルストア命令を生成する。上位３２ビットベクトルストア命令（VSTU）は、演算結果を格納するベクトルレジスタ上の各要素の上位３２ビットを、THEN節、および、ELSE節の一方（例えば、THEN節）の配列変数群の出力配列変数に格納する。下位３２ビットベクトルストア命令（VSTL）は、演算結果を格納するベクトルレジスタ上の各要素の下位３２ビットを、THEN節、および、ELSE節の他方（例えば、ELSE節）の配列変数群の出力配列変数に格納する。
【００６６】
図１０の例における該当部分は、ｄ）で示した部分である。この例において、生成された上位３２ビットベクトルストア命令は、vreg4上の演算結果の各要素の上位３２ビットを、THEN節の配列変数群の出力配列変数A1に格納する。下位３２ビットベクトルストア命令は、vreg4上の演算結果の各要素の下位３２ビットを、ELSE節の配列変数群の出力配列変数A2に格納する。
【００６７】
ベクトル化実行部７２は、図１１または図９のｂ）の例のようにTHEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム１を読み込んだとき、以下のように動作する。
【００６８】
ステップ３において、マスク付きベクトルSIMD命令生成部７２３は、マスク付きベクトルSIMD命令を、所定の順序、例えばフルセットを実行する節のソースプログラム１に記載されていた順序、で生成する。このとき、マスク付きベクトルSIMD命令生成部７２３は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルマスクとして、全てのビットが偽であるものを指定する。
【００６９】
また、ステップ４において、ベクトルストア命令生成部７２４は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルストア命令を生成しない。
【００７０】
図１１の例における該当部分は、ａ）で示した部分である。図１１において、THEN節は加算と減算、ELSE側は加算のみ行う。従って、この例において、マスク付きベクトルSIMD命令生成部７２３は、サブセット外に属する減算を実行するマスク付ベクトル浮動小数点減算SIMD命令（VFSUB.P）の、ELSE側（下位３２ビット）のベクトルマスクとして、全てが偽であるVm0を指定している
また、ベクトルストア命令生成部７２４は、サブセット外に属する減算を実行するマスク付ベクトル浮動小数点減算SIMD命令の、ELSE側（下位３２ビット）のベクトルストア命令を生成していない。
【００７１】
ベクトル化実行部７２は、他は、図１０または図９のａ）の例で上述したとおりに動作する。
【００７２】
ベクトル化実行部７２は、図９のｃ）の例のようにTHEN節とELSE節で、同じ演算の組を異なった順序で実行するソースプログラム１を読み込んだとき、所定の順序、例えば一方の節の演算順序で、マスク付きベクトルSIMD命令を生成する。ベクトル化実行部７２は、他は、図１０または図９のａ）の例で上述したとおりに動作する。
【００７３】
ベクトル化実行部７２は、図９のｄ）の例のようにTHEN節とELSE節の一方が他方の行う演算の組のサブセットを異なる順序で実行するソースプログラム１を読み込んだとき、以下のように動作する。
【００７４】
ステップ３において、マスク付きベクトルSIMD命令生成部７２３は、マスク付きベクトルSIMD命令を、所定の順序、例えばフルセットを実行する節のソースプログラム１に記載されていた順序、で生成する。このとき、マスク付きベクトルSIMD命令生成部７２３は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルマスクとして、全てのビットが偽であるものを指定する。
【００７５】
また、ステップ４において、ベクトルストア命令生成部７２４は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルストア命令を生成しない。
【００７６】
ベクトル化実行部７２は、他は、図１０または図９のａ）の例で上述したとおりに動作する。
【００７７】
＜効果＞
本実施の形態にかかるコンパイルプログラム７は、ソースプログラム１から生成されるオブジェクトプログラム２の命令数を削減し、実行性能を向上させる。その理由は、ベクトル化実行部７２が、制御文のTHEN節とELSE節で同一演算を行っている場合、両者を１つのSIMD命令で実行させるようにオブジェクトプログラム２を生成するからである。
【００７８】
ここで、演算対象となる配列変数群のデータをパックしていないときのオブジェクトプログラム２（図２）と、パックしたとき、すなわち、SIMD命令を用いたときのオブジェクトプログラム２（図１０）を比較する。両オブジェクトプログラム２は、同じソースプログラム１から生成されたものである。両オブジェクトプログラム２の命令コストは以下となる。
・パックをしていないときの命令コスト：
VLD + VFMK + VLD + VLD + VFADD + VST + NEGM + VLD + VLD + VFADD + VST
・パックをしたとき（SIMD命令を用いたとき）の命令コスト：
VLD + VFMK + NEGM + VLDU + VLDL + VLDU + VLDL + VFADD.P + VSTU + VSTL
ここで、命令コストの点で、VLD = VLDU = VLDL 、VST = VSTU = VSTL、 VFADD = VFADD.P と仮定するとコストの差は、VFADDとなる。従って、コンパイルプログラム７は、図１０が示すような、演算対象となる配列変数群のデータをパックしたオブジェクトプログラム２を生成することで、浮動小数点加算命令分の演算コストを減らすことができる。
【００７９】
浮動小数点加算命令よりも命令コストが大きい浮動小数点乗除算命令などをパックできれば、さらに効果が高くなる。
【００８０】
さらに、本実施の形態にかかるコンパイルプログラム７は、図９のｂ）乃至ｄ）に示すように、THEN節とELSE節で異なる配列変数群に同じ順序で演算を実施していないようなソースプログラム１に対しても、データをパックしたオブジェクトプログラム２を生成できる。その理由は、ベクトル化実行部７２が、一方の節で実行していない演算についても、特殊なベクトルマスクを使用したSIMD命令を生成するからである。
【００８１】
＜変形例＞
上記では、マスク付きベクトルSIMD命令は、上位３２ビット用のベクトルマスクと、下位３２ビット用のベクトルマスク、例えば図１０ｃ）のvmreg1、および、vmreg2を別々入力した。マスク付きベクトルSIMD命令は、上位３２ビット用のベクトルマスク部分と、下位３２ビット用のベクトルマスク部分を連結したような１つのベクトルマスクを入力しても良い。
【００８２】
上記では、コンパイルプログラム７は、制御文として２者択一のIF文を対象とした。コンパイルプログラム７は、ｎ（３以上）者択一の制御文、例えばCASE文を対象とするように拡張できる。この場合、マスク付きベクトルSIMD命令の各要素は、ｎ個の配列変数の各要素のデータをパックし、ｎ個の、または、ｎ部分からなる１個のベクトルマスクを入力する。
【００８３】
＜第２の実施形態＞
図１２は、本実施の形態にかかるコンパイル装置８の構成を示す図である。コンパイル装置８は、解析部７１とベクトル化実行部７２とを備える。
【００８４】
解析部７１は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第１と第２の変数群の何れかを選択し、選択した変数群を対象に演算を実行するプログラム部分を検出する。
【００８５】
ベクトル化実行部７２は、ベクトルレジスタの各要素の第１と第２の部分に、第１と第２の変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令を生成する。さらに、ベクトル化実行部７２は、判定配列変数の要素の値に基づいて、ベクトルレジスタの要素において、第１と第２の部分の何れについて演算を実行するかを指示するベクトルマスクを生成するマスク生成命令を生成する。ベクトル化実行部７２は、ベクトルマスクの指示に従って、ベクトルレジスタの各要素の第１と第２の部分の何れか一方で演算を実行するマスク付ベクトル演算命令も生成する。
【００８６】
本実施の形態にかかるコンパイル装置８は、ソースプログラム１から生成されるオブジェクトプログラム２の命令数を削減し、実行性能を向上させる。その理由は、ベクトル化実行部７２が、制御文のTHEN節とELSE節で同一演算を行っている場合、両者を１つのSIMD命令で実行させるようにオブジェクトプログラム２を生成するからである。
【００８７】
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
【符号の説明】
【００８８】
１    ソースプログラム
２    オブジェクトプログラム
７    コンパイルプログラム
８    コンパイル装置
７１    解析部
７２    ベクトル化実行部
６００    コンピュータ装置
６１０    プロセッサ
６２０    外部記憶装置
６３０    主記憶部
６４０    バス
７１１    制御文を含む配列演算認識部
７１２    ベクトル化判定部
７１３    配列演算処理部の形式解析部
７２１    マスク生成部
７２２    ベクトルロード命令生成部
７２３    マスク付きベクトルSIMD命令生成部
７２４    ベクトルストア命令生成部
【図１】
2018049461.tif 000003
【図２】
2018049461.tif 000004
【図３】
2018049461.tif 000005
【図４】
2018049461.tif 000006
【図５】
2018049461.tif 000007
【図６】
2018049461.tif 000008
【図７】
2018049461.tif 000009
【図８】
2018049461.tif 000010
【図９】
2018049461.tif 000011
【図１０】
2018049461.tif 000012
【図１１】
2018049461.tif 000013
【図１２】
2018049461.tif 000014