JP6790646B2 - コンパイル装置、コンパイル方法、および、コンパイルプログラム - Google Patents

コンパイル装置、コンパイル方法、および、コンパイルプログラム Download PDF

Info

Publication number
JP6790646B2
JP6790646B2 JP2016184452A JP2016184452A JP6790646B2 JP 6790646 B2 JP6790646 B2 JP 6790646B2 JP 2016184452 A JP2016184452 A JP 2016184452A JP 2016184452 A JP2016184452 A JP 2016184452A JP 6790646 B2 JP6790646 B2 JP 6790646B2
Authority
JP
Japan
Prior art keywords
vector
variable
operations
instruction
executes
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2016184452A
Other languages
English (en)
Other versions
JP2018049461A (ja
Inventor
健人 岩川
健人 岩川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
NEC Corp
Original Assignee
NEC Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by NEC Corp filed Critical NEC Corp
Priority to JP2016184452A priority Critical patent/JP6790646B2/ja
Publication of JP2018049461A publication Critical patent/JP2018049461A/ja
Application granted granted Critical
Publication of JP6790646B2 publication Critical patent/JP6790646B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Description

本発明は、コンパイル装置、コンパイル方法、および、コンパイルプログラム、特に、制御文を含む配列演算を行うソースコードに対して、データをパックしてマスク付きベクトルSIMD(Single Instruction Multiple Data)命令で処理するようにオブジェクトプログラムを生成するものに関する。
特許文献1は、制御文を含むソースコードに対応する、ベクトルマスキングSIMDコードを生成する方法を開示する。この方法は、マスクを使用することにより、THEN節とELSE節の命令を、制御文無しで実行するSIMDコードを生成する。
特許文献2は、制御文の条件式が比較演算で、結果をビットマスクとして得られる場合には、代入文が選択的に実行されるだけの単純な制御文を、論理演算を使って、同じ効果が得られるRTL(Register Transfer Language)に変換する技術を開示する。この技術は、その後、同じ演算を異なるデータに適用しているものを見つけて、parallel式を使って1か所にまとめ、次いで、parallel式を使って記述されている代入文のうち、SIMD命令1つで処理できるものを抽出する。
特開2010−186467号公報 特開2003−202991号公報
特許文献1に開示される技術は、THEN節とELSE節のそれぞれに対する命令を別々に生成して、実行させる。THEN節とELSE節で同一演算を行っており、SIMD命令の並列度に余裕が有る場合、命令の実行効率が悪い。
特許文献2の技術は、制御文で選択的に実行される代入文を、1つのSIMD命令で実行できる可能性はあるものの、適用範囲は代入文に限定される。さらに、制御文から変換されたRTLは、他の部分を含めた全体的な最適化の対象となり、必ずしも制御文で選択的に実行される代入文が1つのSIMD命令で実行されるわけではない。
本発明は、上記課題を解決し、ソースコードから生成されるオブジェクトプログラムの命令数を削減し、実行性能を向上させるコンパイル装置、コンパイル方法、および、コンパイルプログラムを提供することを目的とする。
本発明の1実施の形態のコンパイル装置は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析手段と、1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行手段と、を備える。
本発明の1実施の形態のコンパイルプログラムは、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析処理と、1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行処理と、をコンピュータに実行させる。
本発明の1実施の形態のコンパイル方法は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出し、1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成する。
本発明にかかるコンパイルプログラムは、ソースコードから生成されるオブジェクトプログラムの命令数を削減し、実行性能を向上させる。
図1は、単純な配列演算を実行するソースプログラム1に対して、コンパイルプログラム7が生成するオブジェクトプログラム2を示す。 図2は、制御文(IF文)を含む配列演算を実行するソースプログラム1に対して、コンパイルプログラム7が生成するオブジェクトプログラム2を示す。 SIMD命令を説明する図である。 図4は、配列演算を実行するソースプログラム1に対して、ベクトルレジスタ上でどのようにデータがパックされるかを示す図である。 図5は、図4のb)が示すベクトルレジスタにおけるJ番目の要素についてのマスク付きベクトルSIMD命令による加算例を示す。 図6は、第一の実施の形態のコンパイルプログラム7の構成を示す図である。 図7は、コンピュータ装置600の構成を示す図である。 図8は、コンパイル装置8を備えるコンピュータ装置600の構成を示す図である。 図9は、配列演算処理部の形式解析部713が、パック可能と判定するFortranプログラムであって、複数の演算を行うソースプログラム1の例を示す。 図10は、図2が示したソースプログラム1と、そこから生成されるマスク付ベクトル演算SIMD命令を含むオブジェクトプログラム2の例を示す。 図11は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム1の例を示す。 図12は、第2の実施の形態にかかるコンパイル装置8の構成を示す図である。
<第1の実施の形態>
<概要>
本発明に係るコンパイルプログラム7は、配列演算を実行するソースプログラム1に対して、ベクトル演算を利用したオブジェクトプログラム2を生成する。
図1は、単純な配列演算を実行するソースプログラム1に対して、コンパイルプログラム7が生成するオブジェクトプログラム2を示す。このソースプログラム1は、ループにより、配列変数BとCの各要素を加算して、配列変数Aの各要素に格納するものである。
なお、配列演算のソースプログラム1は、全てループを用いたものを例示するが、本発明はこの条件に拘束されない。本発明は、配列演算を必ずしも明示的なループにより記述する必要が無いプログラム言語にも適用できる。
コンパイルプログラム7は、この配列に関する演算を、ベクトル命令に変換してベクトル化したオブジェクトプログラム2を生成する。すなわち、コンパイルプログラム7は、配列変数BとCの各要素を、其々、ベクトルレジスタvreg1とvreg2の各要素にロードするベクトルロード命令(VLD)を含むオブジェクトプログラム2を生成する。コンパイルプログラム7は、さらに、両ベクトルレジスタの各要素の加算を行いvreg3の各要素に格納するベクトル浮動小数点加算命令(VFADD)と、ベクトルレジスタvreg3の各要素を配列変数Aの各要素に格納するベクトルストア命令(VST)も生成する。
コンパイルプログラム7は、配列演算のベクトル化により、ベクトルプロセッサにおけるプログラムの実行性能を向上させている。
図2は、制御文(IF文)を含む配列演算を実行するソースプログラム1に対して、コンパイルプログラム7が生成するオブジェクトプログラム2を示す。このソースプログラム1は、配列変数Xの各要素の値がゼロか非ゼロかに応じて、1)配列変数B1とC1の要素を加算して、配列変数A1の要素に格納する、または、2)配列変数B2とC2の要素を加算して、配列変数A2の要素に格納するものである。
図2のような制御文を含む配列演算は、THEN節とELSE節で演算の対象となる変数群が変わるため、通常のベクトル命令に変換することができない。そこで、コンパイルプログラム7は、ソースプログラム1を、マスク付きベクトル浮動小数点加算命令(マスク指定のあるVFADD)に変換することでベクトル化しても良い。
マスク付きベクトル命令は、ベクトルマスクの各ビットの値の真偽により、当該ビットに対応する配列変数の要素に対する演算を実行するか否かを決定する。マスク付きベクトル命令は、例えば、ベクトルマスクのI(配列長N以下の整数)番目ビットの値が真であればベクトルレジスタのI番目の要素間の演算を実行し、偽であれば当該演算を実行しない。
図2のTHEN節をベクトル化するために、コンパイルプログラム7は、配列変数Xの各要素をベクトルレジスタvreg1にロードするベクトルロード命令を生成した後、vreg1からベクトルマスクvmreg1を生成するベクトルマスク生成命令(VFMK)を生成する。ベクトルマスク生成命令は、vreg1上の配列変数XのI番目の要素の値がゼロであればI番目のビットが真、配列変数XのI番目の要素の値が非ゼロであればI番目のビットが偽であるベクトルマスクを生成する。
続いて、コンパイルプログラム7は、配列変数B1とC1の各要素を、其々ベクトルレジスタvreg2とvreg3の各要素にロードするベクトルロード命令と、vmreg1が真であるビットに対応する要素について、vreg2とvreg3の要素の値を加算してvreg4に格納するマスク付きベクトル浮動小数点加算命令を生成する。さらに、コンパイルプログラム7は、vreg4の各要素を配列変数A1に格納するベクトルストア命令を生成する。
ELSE節に対し、コンパイルプログラム7は、先ず、ベクトルマスクvmreg1を反転させたベクトルマスクvmreg2を生成するマスクの論理否定命令(NEGN)を生成する。その後、コンパイルプログラム7は、THEN節と同様に、ベクトルロード命令、マスク付きベクトル浮動小数点加算命令、ベクトルストア命令を生成する。但し、それらの命令が使用する配列変数はA2、B2、C2であり、ベクトルマスクはvmreg2である。
このように、コンパイルプログラム7は、図2が例示するソースプログラム1に対して、THEN節とELSE節のそれぞれに対する命令を生成する。コンパイルプログラム7は、図2が例示するソースプログラム1に対して、さらに、実行効率の良いオブジェクトプログラム2を生成する機能を備えていても良い。以下、このオブジェクトプログラム2の生成機能について説明する。
このオブジェクトプログラム2の生成機能は、SIMD命令を含むオブジェクトプログラム2を生成する。SIMD命令は、図3のように一つのレジスタ、または、ベクトルレジスタの1つの要素に複数のデータを格納して、一回の演算命令で、複数のデータに対して同一の演算を行う。一つのレジスタ、または、ベクトルレジスタの要素に複数のデータを格納することを「パックする」と定義する。データのパックは、例えば、64ビット幅のレジスタ、または、ベクトルレジスタの要素の上位32ビットと下位32ビットに、別々のデータを格納することを指す。
図3は、レジスタreg1の上位にA1、下位にB1をパックし、レジスタreg2の上位にA2、下位にB2をパックし、一命令でA1とA2の加算、B1とB2の加算を行い、結果をreg3にパックしている例を示す。
図4は、配列演算を実行するソースプログラム1に対して、ベクトルレジスタ上でどのようにデータがパックされるかを示す図である。図4のa)は、図2で示したものと同じソースプログラム1を示す。図4のb)の3つのマトリクスは、其々、4つの要素(マトリクスの各行)からなるベクトルレジスタを示す。
コンパイルプログラム7は、3個のベクトルレジスタの各々を左から順に、配列変数A1とA2、B1とB2、C1とC2に割当て、ベクトルレジスタの各要素に、割り当てた二つの配列変数の要素の値をパックするように命令を生成する。コンパイルプログラム7は、例えば、THEN節で用いられている配列変数群(A1,B1,C1)の要素の値をベクトルレジスタの上位32ビットに、ELSE節で用いられている配列変数群(A2,B2,C2)の要素の値をベクトルレジスタの下位32ビットに格納するように命令を生成する。
コンパイルプログラム7が生成するマスク付きベクトルSIMD命令は、上位32ビットおよび下位23ビットのベクトル演算の実行、非実行を、上位用、および下位用の2つのベクトルマスクの値の真偽で決める。
マスク付きベクトルSIMD命令は、例えば、上位用ベクトルマスクのI(配列長N以下の整数)番目ビットの値が真であればベクトルレジスタのI番目の要素の上位32ビット間の演算を実行し、偽であれば演算を実行しない。同様に、マスク付きベクトルSIMD命令は、例えば、下位用ベクトルマスクのI番目ビットの値が真であればベクトルレジスタのI番目の要素の下位32ビット間の演算を実行し、偽であれば演算を実行しない。
ここで、上位用と下位用ベクトルマスクは、相互に論理否定となっている。これは、IF文における2者択一性を反映している。
図5は、図4のb)が示すベクトルレジスタにおけるJ(4以下の自然数)番目の要素についてのマスク付きベクトルSIMD命令による加算例を示す。この例においては、上位用のベクトルマスクのJ番目のビットが真で、下位用のベクトルマスクのJ番目のビットが偽であるため、J番目の要素の上位32ビット間の加算が行われている。すなわち、この例では、THEN節の配列変数群のJ番目の要素に対する演算のみが行われている。
<構成>
図6は、本実施の形態のコンパイルプログラム7の構成を示す図である。コンパイルプログラム7は、入力されたソースプログラム1を解析してベクトル化および配列データのパックができるか判定する解析部71、解析結果に基づき配列演算処理部をベクトル化するベクトル化実行部72を包含する。コンパイルプログラム7は、その他、一般のコンパイラが備える構文解析、最適化、オブジェクトプログラム2の生成機能も備える。
解析部71は、制御文を含む配列演算認識部711、ベクトル化判定部712、および、配列演算処理部の形式解析部713を包含する。制御文を含む配列演算認識部711は、ソースプログラム1の中から、IF文等の制御文を含む配列演算記述部分の検出を行う。ベクトル化判定部712は、検出した配列演算記述部分がベクトル化できるか判断する。配列演算処理部の形式解析部713は、配列演算の対象データがパックできるか判定する。
ベクトル化実行部72は、マスク生成部721、ベクトルロード命令生成部722、マスク付きベクトルSIMD命令生成部723、および、ベクトルストア命令生成部724を包含する。マスク生成部721は、ベクトルマスクを生成するマスク生成命令を生成する。ベクトルロード命令生成部722は、データをパックするためのベクトルロード命令を生成する。マスク付きベクトルSIMD命令生成部723は、パックされた配列データの演算を行うマスク付きベクトルSIMD命令を生成する。ベクトルストア命令生成部724は、パックされたデータをメモリへ保存するためのベクトルストア命令を生成する。
コンパイルプログラム7は、例えば、コンピュータ装置600で実行される。図7は、コンピュータ装置600の構成を示す図である。
コンピュータ装置600は、バス640で相互に接続された、プロセッサ610、主記憶部630、および、外部記憶装置620を備える。プロセッサ610は、バス640を経由して、主記憶部630、および、外部記憶装置620に対してデータの読み書きを行う。また、プロセッサ610は、主記憶部630に格納されているコンパイルプログラム7を実行する。すなわち、プロセッサ610は、解析部71や、ベクトル化実行部72を実行する。
なお、コンパイルプログラム7は、当初外部記憶装置620に格納されており、コンピュータ装置600の初期設定時に、プロセッサ610が外部記憶装置620から主記憶部630にロードしても良い。
ここで、主記憶部630は半導体メモリ装置である。外部記憶装置620はディスク装置、または、半導体記憶装置等の記憶装置である。
なお、解析部71や、ベクトル化実行部72は、それらの内部の部位(例えば、マスク付きベクトルSIMD命令生成部723)を含めて、論理回路や半導体記憶装置で構成されたコンパイル装置8として構成されても良い。この場合、コンピュータ装置600が、コンパイル装置8を備える。
図8は、コンパイル装置8を備えるコンピュータ装置600の構成を示す図である。このコンピュータ装置600は、図7のコンピュータ装置600の構成に加えて、バス640に接続されたコンパイル装置8を備える。また、図8のコンパイルプログラム7は、解析部71や、ベクトル化実行部72を含んでいない。
図8のコンピュータ装置600において、プロセッサ610が主記憶部630上のコンパイルプログラム7を実行する。コンパイルプログラム7、必要に応じてコンパイル装置8に、解析部71や、ベクトル化実行部72が行う処理の実行を依頼する。
<動作>
次に、コンパイルプログラム7の動作について説明する。
まず、解析部71における制御文を含む配列演算認識部711は、入力されたソースプログラム1から、制御文、例えばIF文を含みTHEN節とELSE節で配列演算を行う部分を検出する。続いて、ベクトル化判定部712が、検出された部分がベクトル化できるかを判定する。ベクトル化できる条件は、配列変数やスカラー変数の定義・参照関係にベクトル化を阻害する依存関係がないことである。依存関係が無いとの条件は、例えば、THEN節内やELSE節内で、前に行われた演算の結果が、後続して行われる演算に影響しないことである。
最後に、配列演算処理部の形式解析部713が、配列演算のオペランドとなる配列変数の値がパックできるかを判定する。パックできる基本条件は、THEN節とELSE節で異なる配列変数群に同じ順序で演算を実施することである。
前述の図2のソースプログラム1は、配列演算処理部の形式解析部713が、パック可能と判定するFortranプログラムのソースプログラム1の例である。このソースプログラム1は、配列変数Xの各要素の値がゼロか非ゼロかを判定するIF文に続いて、THEN節で、配列変数B1とC1の要素を加算して配列変数A1の要素に格納し、ELSE節で、配列変数B2とC2の要素を加算して配列変数A2の要素に格納する。
なお、上述した『異なる配列変数群』とは、少なくとも出力配列変数群が異なっていれば良い。入力配列変数の一部、または、全部が同一であっても良い。例えば、前述の図2のソースプログラム1は、1)THEN節で、配列変数BとC1の要素を加算して配列変数A1の要素に格納し、ELSE節で、配列変数BとC2の要素を加算して配列変数A2の要素に格納するものであっても良い。
図9は、配列演算処理部の形式解析部713が、パック可能と判定するFortranプログラムであって、複数の演算を行うソースプログラム1の例を示す。
図9のa)は、THEN節とELSE節で異なる配列変数群に、複数の演算を同じ順序で実行するソースプログラム1の例を示す。このソースプログラム1は、THEN節もELSE節も2つの配列変数間で、加算、減算、乗算、除算を、この同じ順序で行っており、パック可能である。
図9のb)は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム1の例を示す。このソースプログラム1において、THEN節は、2つの配列変数間で加算、減算、乗算、除算をこの順序で行う、ELSE節は、2つの配列変数間で加算、除算をこの順序で行う。したがって、この例において、ELSE節は、THEN節が行う演算の組のサブセットを、同じ順序で行う。
この場合、後に、ベクトル化実行部72が、サブセット外の演算(上記例においては減算と乗算)に対するマスク付きベクトルSIMD命令の、サブセット実行側(上記例においてはELSE節)のベクトルマスクを偽にして計算を行わないようにする。これにより、THEN節とELSE節は、異なる配列変数群に同じ順序で演算を実施することになる。従って、この例はパック可能である。
図9のc)は、THEN節とELSE節で異なる配列変数群に、同じ演算の組を異なった順序で実行するソースプログラム1の例を示す。この例においては、THEN節とELSE節の両者は、2つの配列変数間で、加算、減算、乗算、除算を行う。演算を行う順序が異なるだけである。
この場合、後に、ベクトル化実行部72が、両節の演算順を合わせる、例えば一方の順序を他方に合わせることで、THEN節とELSE節の両者は、異なる配列変数群に同じ順序で演算を実施することになる。複数の演算の間に依存関係が無いのは確認済みであるので、演算の順序は変更可能である。
図9のd)は、THEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを異なる順序で実行するソースプログラム1の例を示す。この例において、THEN節は、2つの配列変数間で、加算、減算、乗算、除算をこの順序で行う、ELSE節は、2つの配列変数間で、除算、加算、乗算をこの順序で行う。したがって、この例において、ELSE節は、THEN節が行う演算の組のサブセットを、異なる順序で行う。
この場合、ベクトル化実行部72は、サブセット外の演算(上記例においては減算)に対するマスク付きベクトルSIMD命令の、サブセット実行側(上記例においてはELSE節)のベクトルマスクを偽にして計算を行わないようにする。そのうえで、ベクトル化実行部72は、両節の演算順を合わせる、例えば、フルセット実行側(上記例においてはTHEN節)の順序に合わせる。これにより、THEN節とELSE節の両者は、異なる配列変数群に同じ順序で演算を実施することになる。従って、この例はパック可能である。
続いて、ベクトル化実行部72が、解析部71がパック可能と判定したソースプログラム1をベクトル化する。図10は、図2が示したソースプログラム1と、そこから生成されるマスク付ベクトル演算SIMD命令を含むオブジェクトプログラム2の例を示す。
ベクトル化実行部72は、図10または図9のa)の例のようにTHEN節とELSE節が、異なる配列変数群に同じ順序で演算を実施するソースプログラム1を読み込んだとき、以下のように動作する。
<ステップ1>マスクの生成命令の生成
ベクトル化のために、マスク生成部721は、IF文の条件式から、先ず、THEN節のベクトルマスクを生成するマスク生成命令(VFMK)と、そのベクトルマスクを論理否定してELSE節のベクトルマスクを生成する論理否定命令(NEGM)を生成する。
図10の例における該当部分は、a)で示した部分である。この例において、マスク生成部721は、IF文の判定対象となっている配列変数XからTHEN節のベクトルマスクvmreg1を生成するマスク生成命令と、vmreg1を論理否定してELSE節のベクトルマスクvmreg2を生成するマスク生成命令を生成する。ここで、マスク生成命令は、配列変数Xの値が0の要素に対応して真の、配列変数Xの値が非ゼロの要素に対して偽のビットマスクを生成する。
<ステップ2>データのパック命令の生成
ベクトル化されたSIMD命令は、パックされたデータを演算対象とする。データをパックするため、ベクトルロード命令生成部722は、THEN節及びELSE節の一方(例えば、THEN節)で演算対象となるベクトル変数群の入力変数の各要素をベクトルレジスタの各要素の上位32ビットにロードする上位32ビットベクトルロード命令(VLDU)を生成する。さらに、ベクトルロード命令生成部722は、THEN節及びELSE節の他方(例えば、ELSE節)で演算対象となるベクトル変数群の入力変数の各要素をベクトルレジスタの各要素の下位32ビットにロードする下位32ビットベクトルロード命令(VLDL)を生成する。
上位32ビットベクトルロード命令、および、下位32ビットベクトルロード命令の対は、2つの配列変数群における対応する入力変数の対ごとに生成される。
図10の例における該当部分は、b)で示した部分である。この例において、THEN節の配列変数群A1,B1,C1と、ELSE節の配列変数群A2,B2,C2における対応する入力変数の対は、B1とB2、C1とC2である。この例において、ベクトルロード命令生成部722は、ベクトルレジスタvreg2の上位32ビットにTHEN節の入力配列変数B1を、下位32ビットにELSE節の対応する入力配列変数B2を、ロードする2つのベクトルロード命令(VLDUとVLDL)を生成している。さらに、ベクトルロード命令生成部722は、ベクトルレジスタvreg3の上位32ビットにTHEN節の入力配列変数C1を、下位32ビットにELSE節の対応する入力配列変数C2を、ロードする2つのベクトルロード命令(VLDUとVLDL)を生成している。
<ステップ3>マスク付きベクトルSIMD命令の生成
マスク付きベクトルSIMD命令生成部723は、パックしたデータに対して演算を実行する為、THEN節とELSE節のベクトルマスクを設定したマスク付きベクトルSIMD命令を、所定の順序、例えばソースプログラム1に記載されていた順序、で生成する。
図10の例における該当部分は、c)で示した部分である。この例において、生成されたマスク付きベクトル浮動小数点加算SIMD命令(VFADD.P)は、上位32ビット用にvmreg1を、下位32ビット用にvmreg2のベクトルマスクを指定して、vreg2とvreg3を加算して結果をvreg4に格納する。このマスク付きベクトル浮動小数点加算SIMD命令は、vmreg1が真であるビットに対応する要素については上位32ビット(THEN節側)を加算し、vmreg2が真であるビットに対応する要素については下位32ビット(ELSE節側)を加算する。
<ステップ4>データのアンパック命令の生成
演算によって得られたパックされた結果データをメモリに保存するため、ベクトルストア命令生成部724は、ベクトルストア命令を生成する。上位32ビットベクトルストア命令(VSTU)は、演算結果を格納するベクトルレジスタ上の各要素の上位32ビットを、THEN節、および、ELSE節の一方(例えば、THEN節)の配列変数群の出力配列変数に格納する。下位32ビットベクトルストア命令(VSTL)は、演算結果を格納するベクトルレジスタ上の各要素の下位32ビットを、THEN節、および、ELSE節の他方(例えば、ELSE節)の配列変数群の出力配列変数に格納する。
図10の例における該当部分は、d)で示した部分である。この例において、生成された上位32ビットベクトルストア命令は、vreg4上の演算結果の各要素の上位32ビットを、THEN節の配列変数群の出力配列変数A1に格納する。下位32ビットベクトルストア命令は、vreg4上の演算結果の各要素の下位32ビットを、ELSE節の配列変数群の出力配列変数A2に格納する。
ベクトル化実行部72は、図11または図9のb)の例のようにTHEN節とELSE節で異なる配列変数群に、一方が他方の行う演算の組のサブセットを同じ順序で実行するソースプログラム1を読み込んだとき、以下のように動作する。
ステップ3において、マスク付きベクトルSIMD命令生成部723は、マスク付きベクトルSIMD命令を、所定の順序、例えばフルセットを実行する節のソースプログラム1に記載されていた順序、で生成する。このとき、マスク付きベクトルSIMD命令生成部723は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルマスクとして、全てのビットが偽であるものを指定する。
また、ステップ4において、ベクトルストア命令生成部724は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルストア命令を生成しない。
図11の例における該当部分は、a)で示した部分である。図11において、THEN節は加算と減算、ELSE側は加算のみ行う。従って、この例において、マスク付きベクトルSIMD命令生成部723は、サブセット外に属する減算を実行するマスク付ベクトル浮動小数点減算SIMD命令(VFSUB.P)の、ELSE側(下位32ビット)のベクトルマスクとして、全てが偽であるVm0を指定している
また、ベクトルストア命令生成部724は、サブセット外に属する減算を実行するマスク付ベクトル浮動小数点減算SIMD命令の、ELSE側(下位32ビット)のベクトルストア命令を生成していない。
ベクトル化実行部72は、他は、図10または図9のa)の例で上述したとおりに動作する。
ベクトル化実行部72は、図9のc)の例のようにTHEN節とELSE節で、同じ演算の組を異なった順序で実行するソースプログラム1を読み込んだとき、所定の順序、例えば一方の節の演算順序で、マスク付きベクトルSIMD命令を生成する。ベクトル化実行部72は、他は、図10または図9のa)の例で上述したとおりに動作する。
ベクトル化実行部72は、図9のd)の例のようにTHEN節とELSE節の一方が他方の行う演算の組のサブセットを異なる順序で実行するソースプログラム1を読み込んだとき、以下のように動作する。
ステップ3において、マスク付きベクトルSIMD命令生成部723は、マスク付きベクトルSIMD命令を、所定の順序、例えばフルセットを実行する節のソースプログラム1に記載されていた順序、で生成する。このとき、マスク付きベクトルSIMD命令生成部723は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルマスクとして、全てのビットが偽であるものを指定する。
また、ステップ4において、ベクトルストア命令生成部724は、サブセット外に属する演算の、サブセットを実行する側の節のベクトルストア命令を生成しない。
ベクトル化実行部72は、他は、図10または図9のa)の例で上述したとおりに動作する。
<効果>
本実施の形態にかかるコンパイルプログラム7は、ソースプログラム1から生成されるオブジェクトプログラム2の命令数を削減し、実行性能を向上させる。その理由は、ベクトル化実行部72が、制御文のTHEN節とELSE節で同一演算を行っている場合、両者を1つのSIMD命令で実行させるようにオブジェクトプログラム2を生成するからである。
ここで、演算対象となる配列変数群のデータをパックしていないときのオブジェクトプログラム2(図2)と、パックしたとき、すなわち、SIMD命令を用いたときのオブジェクトプログラム2(図10)を比較する。両オブジェクトプログラム2は、同じソースプログラム1から生成されたものである。両オブジェクトプログラム2の命令コストは以下となる。
・パックをしていないときの命令コスト:
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となる。従って、コンパイルプログラム7は、図10が示すような、演算対象となる配列変数群のデータをパックしたオブジェクトプログラム2を生成することで、浮動小数点加算命令分の演算コストを減らすことができる。
浮動小数点加算命令よりも命令コストが大きい浮動小数点乗除算命令などをパックできれば、さらに効果が高くなる。
さらに、本実施の形態にかかるコンパイルプログラム7は、図9のb)乃至d)に示すように、THEN節とELSE節で異なる配列変数群に同じ順序で演算を実施していないようなソースプログラム1に対しても、データをパックしたオブジェクトプログラム2を生成できる。その理由は、ベクトル化実行部72が、一方の節で実行していない演算についても、特殊なベクトルマスクを使用したSIMD命令を生成するからである。
<変形例>
上記では、マスク付きベクトルSIMD命令は、上位32ビット用のベクトルマスクと、下位32ビット用のベクトルマスク、例えば図10c)のvmreg1、および、vmreg2を別々入力した。マスク付きベクトルSIMD命令は、上位32ビット用のベクトルマスク部分と、下位32ビット用のベクトルマスク部分を連結したような1つのベクトルマスクを入力しても良い。
上記では、コンパイルプログラム7は、制御文として2者択一のIF文を対象とした。コンパイルプログラム7は、n(3以上)者択一の制御文、例えばCASE文を対象とするように拡張できる。この場合、マスク付きベクトルSIMD命令の各要素は、n個の配列変数の各要素のデータをパックし、n個の、または、n部分からなる1個のベクトルマスクを入力する。
<第2の実施形態>
図12は、本実施の形態にかかるコンパイル装置8の構成を示す図である。コンパイル装置8は、解析部71とベクトル化実行部72とを備える。
解析部71は、配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した変数群を対象に演算を実行するプログラム部分を検出する。
ベクトル化実行部72は、ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令を生成する。さらに、ベクトル化実行部72は、判定配列変数の要素の値に基づいて、ベクトルレジスタの要素において、第1と第2の部分の何れについて演算を実行するかを指示するベクトルマスクを生成するマスク生成命令を生成する。ベクトル化実行部72は、ベクトルマスクの指示に従って、ベクトルレジスタの各要素の第1と第2の部分の何れか一方で演算を実行するマスク付ベクトル演算命令も生成する。
本実施の形態にかかるコンパイル装置8は、ソースプログラム1から生成されるオブジェクトプログラム2の命令数を削減し、実行性能を向上させる。その理由は、ベクトル化実行部72が、制御文のTHEN節とELSE節で同一演算を行っている場合、両者を1つのSIMD命令で実行させるようにオブジェクトプログラム2を生成するからである。
以上、実施形態を参照して本願発明を説明したが、本願発明は上記実施形態に限定されるものではない。本願発明の構成や詳細には、本願発明のスコープ内で当業者が理解し得る様々な変更をすることができる。
1 ソースプログラム
2 オブジェクトプログラム
7 コンパイルプログラム
8 コンパイル装置
71 解析部
72 ベクトル化実行部
600 コンピュータ装置
610 プロセッサ
620 外部記憶装置
630 主記憶部
640 バス
711 制御文を含む配列演算認識部
712 ベクトル化判定部
713 配列演算処理部の形式解析部
721 マスク生成部
722 ベクトルロード命令生成部
723 マスク付きベクトルSIMD命令生成部
724 ベクトルストア命令生成部

Claims (10)

  1. 配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析手段と、
    1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行手段と、を備えるコンパイル装置。
  2. 前記解析手段は、第1と第2の前記変数群の何れかを選択し、選択した前記変数群を対象に、何れを選択した場合でも同一の順序で、複数の前記演算を実行する部分を検出し、
    前記ベクトル化実行手段は、前記複数の前記演算の各々を実行する前記マスク付ベクトル命令を前記同一の順序で生成する請求項1のコンパイル装置。
  3. 前記解析手段は、第1と第2の前記変数群の何れかを選択し、選択した前記変数群を対象に、いずれを選択した場合でも同一の前記演算の組を実行する部分を検出し、
    前記ベクトル化実行手段は、前記演算の前記組に属する各々の前記演算を実行する前記マスク付ベクトル命令を所定基準に基づいて決定した順序で生成する請求項1乃至請求項2の何れか一項のコンパイル装置。
  4. 前記解析手段は、第1と第2の前記変数群の何れかを選択し、1)前記第1の前記変数群を選択した場合、前記第1の前記変数群を対象に前記演算の組を実行し、2)前記第2の前記変数群を選択した場合、前記第2の前記変数群を対象に、前記演算の前記組のサブセットを実行する部分を検出し、
    前記ベクトル化実行手段は、3a)前記ベクトルマスクを用いて、前記演算の前記組の前記サブセットに属する各々の前記演算を実行するマスク付ベクトル演算命令と、3b)前記ベクトルレジスタの第2の前記部分について前記演算を実行しないことを示すように変更された前記ベクトルマスクを用いて、前記演算の前記組の前記サブセット外の各々の前記演算を実行するマスク付ベクトル演算命令と、を所定基準に基づいて決定した順序で生成する請求項1乃至請求項3の何れか一項のコンパイル装置。
  5. 前記ベクトルレジスタの第1と第2の前記部分は、前記ベクトルレジスタの上位半分と下位半分である、請求項1乃至請求項4の何れか1項のコンパイル装置。
  6. 配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出する解析処理と、
    1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成するベクトル化実行処理と、をコンピュータに実行させるコンパイルプログラム。
  7. 第1と第2の前記変数群の何れかを選択し、選択した前記変数群を対象に、何れを選択した場合でも同一の順序で、複数の前記演算を実行する部分を検出する前記解析処理と、
    前記複数の前記演算の各々を実行する前記マスク付ベクトル命令を前記同一の順序で生成する前記ベクトル化実行処理と、をコンピュータに実行させる請求項6のコンパイルプログラム。
  8. 第1と第2の前記変数群の何れかを選択し、選択した前記変数群を対象に、いずれを選択した場合でも同一の前記演算の組を実行する部分を検出する前記解析処理と、
    前記演算の前記組に属する各々の前記演算を実行する前記マスク付ベクトル命令を所定基準に基づいて決定した順序で生成する前記ベクトル化実行処理と、をコンピュータに実行させる、請求項6乃至請求項7の何れか一項のコンパイルプログラム。
  9. 第1と第2の前記変数群の何れかを選択し、1)前記第1の前記変数群を選択した場合、前記第1の前記変数群を対象に前記演算の組を実行し、2)前記第2の前記変数群を選択した場合、前記第2の前記変数群を対象に、前記演算の前記組のサブセットを実行する部分を検出する前記解析処理と、
    3a)前記ベクトルマスクを用いて、前記演算の前記組の前記サブセットに属する各々の前記演算を実行するマスク付ベクトル演算命令と、3b)前記ベクトルレジスタの第2の前記部分について前記演算を実行しないことを示すように変更された前記ベクトルマスクを用いて、前記演算の前記組の前記サブセット外の各々の前記演算を実行するマスク付ベクトル演算命令と、を所定基準に基づいて決定した順序で生成する前記ベクトル化実行処理とを、コンピュータに実行させる請求項6乃至請求項8の何れか一項のコンパイルプログラム。
  10. 配列変数の各要素について、判定配列変数の対応する要素の値に基づいて、第1と第2の変数群の何れかを選択し、選択した前記変数群を対象に演算を実行するプログラム部分を検出し、
    1)ベクトルレジスタの各要素の第1と第2の部分に、第1と第2の前記変数群の対応する入力配列変数の各要素値をロードするベクトルロード命令と、2)前記判定配列変数の要素の値に基づいて、前記ベクトルレジスタの要素において、第1と第2の前記部分の何れについて前記演算を実行するかを指示するベクトルマスクを生成するマスク生成命令と、3)前記ベクトルマスクの指示に従って、前記ベクトルレジスタの各要素の第1と第2の前記部分の何れか一方で前記演算を実行するマスク付ベクトル演算命令と、を生成する、コンパイル方法。
JP2016184452A 2016-09-21 2016-09-21 コンパイル装置、コンパイル方法、および、コンパイルプログラム Active JP6790646B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2016184452A JP6790646B2 (ja) 2016-09-21 2016-09-21 コンパイル装置、コンパイル方法、および、コンパイルプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2016184452A JP6790646B2 (ja) 2016-09-21 2016-09-21 コンパイル装置、コンパイル方法、および、コンパイルプログラム

Publications (2)

Publication Number Publication Date
JP2018049461A JP2018049461A (ja) 2018-03-29
JP6790646B2 true JP6790646B2 (ja) 2020-11-25

Family

ID=61767620

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2016184452A Active JP6790646B2 (ja) 2016-09-21 2016-09-21 コンパイル装置、コンパイル方法、および、コンパイルプログラム

Country Status (1)

Country Link
JP (1) JP6790646B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP7115563B2 (ja) * 2018-12-07 2022-08-09 日本電気株式会社 コンパイル装置、コンパイル方法、及び制御プログラム

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH01271874A (ja) * 1988-04-22 1989-10-30 Nec Corp ベクトル演算制御方式
JPH04349570A (ja) * 1991-05-28 1992-12-04 Nec Corp 情報処理装置
JPH05120323A (ja) * 1991-10-28 1993-05-18 Nec Software Ltd If文下ベクトル演算最適化方式
US9411593B2 (en) * 2013-03-15 2016-08-09 Intel Corporation Processors, methods, systems, and instructions to consolidate unmasked elements of operation masks

Also Published As

Publication number Publication date
JP2018049461A (ja) 2018-03-29

Similar Documents

Publication Publication Date Title
Stephens et al. The ARM scalable vector extension
Ho et al. Exploiting half precision arithmetic in Nvidia GPUs
Ainsworth et al. Software prefetching for indirect memory accesses
US6113650A (en) Compiler for optimization in generating instruction sequence and compiling method
TWI733798B (zh) 在執行向量操作時管理位址衝突的設備及方法
US11422781B1 (en) Generation of vector codes for tensor convolutions
CN114416045A (zh) 自动生成算子的方法和装置
JP6790646B2 (ja) コンパイル装置、コンパイル方法、および、コンパイルプログラム
US9158511B2 (en) Scalable partial vectorization
Zheng et al. Optimizing memory-access patterns for deep learning accelerators
Nawaz et al. Recursive variable expansion: A loop transformation for reconfigurable systems
Najjar et al. ROCCC 2.0
Cong et al. Compilation and architecture support for customized vector instruction extension
Zhao et al. Performance evaluation of NPB and SPEC CPU2006 on various SIMD extensions
JP7115563B2 (ja) コンパイル装置、コンパイル方法、及び制御プログラム
JPH04307624A (ja) ループ最適化方法及び装置
Sun et al. Vectorizing programs with IF-statements for processors with SIMD extensions
Rohde et al. Socao: Source-to-source opencl compiler for intel-altera fpgas
JP2019067117A (ja) コード生成装置、コード生成方法及びコード生成プログラム
Reznikova Smart Tiling for Program Optimization and Parallelization [C]
US11829321B2 (en) General-purpose systolic array
Mego et al. Instruction mapping techniques for processors with very long instruction word architectures
Tsuji et al. Performance tuning of the Helmholtz matrix-vector product kernel in the computational fluid dynamics solver Nek5000/RS for the A64FX processor
JP3817073B2 (ja) メモリアクセス処理装置、メモリアクセス処理システム、および記録媒体
Liu et al. A New Algorithm to Exploit Superword Level Parallelism

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20190820

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20200610

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20201006

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20201019

R150 Certificate of patent or registration of utility model

Ref document number: 6790646

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150