(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2025-01-08
(45)【発行日】2025-01-17
(54)【発明の名称】コンパイル装置、コンパイル方法、及びコンパイルプログラム
(51)【国際特許分類】
G06F 8/41 20180101AFI20250109BHJP
G06F 17/16 20060101ALI20250109BHJP
【FI】
G06F8/41 170
G06F17/16 G
(21)【出願番号】P 2020212156
(22)【出願日】2020-12-22
【審査請求日】2023-11-15
(73)【特許権者】
【識別番号】000004237
【氏名又は名称】日本電気株式会社
(74)【代理人】
【識別番号】100109313
【氏名又は名称】机 昌彦
(74)【代理人】
【識別番号】100149618
【氏名又は名称】北嶋 啓至
(72)【発明者】
【氏名】西村 佳晃
【審査官】今川 悟
(56)【参考文献】
【文献】特開平09-062654(JP,A)
【文献】特開平11-066046(JP,A)
【文献】特開平09-259113(JP,A)
【文献】特開2005-038185(JP,A)
【文献】特表2014-513340(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 8/41
G06F 17/16
(57)【特許請求の範囲】
【請求項1】
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析部と、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成部と、を含
み、
前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
コンパイル装置。
【請求項2】
前記成分として第1の変数及び第2の変数を持つ構造型の配列は、実部、虚部が4バイト毎に交互に配置された、単精度複素数型の配列である、請求項
1に記載のコンパイル装置。
【請求項3】
前記成分として第1の変数及び第2の変数を持つ構造型の配列は、要素が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、請求項
1に記載のコンパイル装置。
【請求項4】
前記成分として第1の変数及び第2の変数を持つ構造型の配列は、第1の単精度変数、第2の単精度変数が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、請求項
1に記載のコンパイル装置。
【請求項5】
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかをコード解析部が判定し、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令をベクトル命令
生成部が生成
し、
前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
コンパイル方法。
【請求項6】
前記成分として第1の変数及び第2の変数を持つ構造型の配列は、実部、虚部が4バイト毎に交互に配置された、単精度複素数型の配列である、請求項
5に記載のコンパイル方法。
【請求項7】
前記成分として第1の変数及び第2の変数を持つ構造型の配列は、要素が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、請求項
5に記載のコンパイル方法。
【請求項8】
コンピュータを、
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析手段と、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成手段と、して機能させ
、
前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
コンパイルプログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、コンパイル装置、コンパイル方法、及びコンパイルプログラムに関し、特にプログラムの高速化に関する。
【背景技術】
【0002】
計算機の演算装置からメインメモリへのアクセス時間は、演算装置の演算時間と比べると大きく、メインメモリと演算装置との間のデータ転送性能は不足している。この広がる性能差を埋めるために、一般にスカラ計算機では、演算装置とメインメモリ間に高速なキャッシュメモリを設けることにより、メインメモリへのアクセス時間を短縮している。一方、ベクトル計算機では、ベクトル命令により一度に多くのデータをまとめて転送することにより、メインメモリへのアクセス時間を短縮している。データ1個あたりのメモリアクセス時間は、同時に転送されたデータの個数分の1とみなすことができる。この個数の最大値はベクトル計算機のベクトル長で決まり、ベクトル長の値が256の場合は、メモリアクセス時間は256分の1と、小さい値になる。
【0003】
またベクトル計算機では、メインメモリに配置されているデータをベクトルレジスタ上にロードしてそのベクトルレジスタを介して、高速な演算を実現している。このため、メインメモリ上のデータをいかに効率良くレジスタ上に持ってくるかということが、高速化のために重要である。
【0004】
特許文献1は、情報処理装置に関するものであり、複素数データのベクトル演算を高速化することが提案されている。
【0005】
特許文献2は、計算機で用いられるコンパイル方法に関するものであり、ソースプログラムにおける配列を抽出し、アクセス回数に応じてメインメモリ又は一時記憶装置に割り当てることが提案されている。
【0006】
ここで、
図1に示されるソースプログラムのコンパイル方法について検討する。
図1のソースプログラムは、間接参照を含み、間接参照を含む演算はリスト演算と呼ばれる。
図1のソースプログラムはFortran言語で記したもので、その内容は、単精度複素数型の配列AのIX(I)番目の要素の実部、虚部を取り出して、その加算結果を配列Bに代入するものである。
【0007】
配列IXはリストと呼ばれ、I番目のIXの配列要素のとき、参照すべきAの配列要素が何番目の要素であるかの値が格納されている。このときAの配列要素は、配列IXの要素を使ってアクセスされるため、「間接参照される」と呼ばれる。なおここで
図1のソースプログラムにおいては、配列AのIX(I)番目の要素の実部を参照する式をreal(A(IX(I)))と記述しており、配列AのIX(I)番目の要素の虚部を参照する式をaimag(A(IX(I)))と記述している。
【0008】
背景技術のコンパイル方法では
図1のソースプログラムを、
図11に示すアセンブラの命令列に翻訳する。
図11の命令列では、まずベクトルロード命令(VLD命令)で、配列IXの値をベクトルレジスタVR1にロードする。次に、ベクトル論理シフト命令(VSLL命令)で、ベクトルレジスタVR1の各要素を3ビット左論理シフトした値を、ベクトルレジスタVR2に設定する。これは、配列Aの一要素のサイズ、つまり、単精度複素数型のサイズである8をベクトルレジスタVR1の各要素に乗じた値を、ベクトルレジスタVR2に設定することに等しい。こうして求めた値は、配列Aの先頭からの相対オフセット値である。
【0009】
次に、ベクトル加算命令(VADD命令)で、ベクトルレジスタVR2の各要素(上記相対オフセット値)と配列Aの先頭アドレスを加算した結果を、ベクトルレジスタVR3に設定する。このVADD命令の結果を、
図12の「VR3」に示す。単精度複素数型の配列のメモリ配置は
図12の「A(メモリ)」に示すように、実部、虚部が4バイト毎に交互に配置されているため、結果としてベクトルレジスタVR3にはA(IX(I))の各要素の実部のアドレスが設定されることとなる。
【0010】
次に、4バイトベクトルギャザー命令(VGT4命令)で、ベクトルレジスタVR3の各要素に格納されたアドレスにある、幅4バイトの値をメモリからベクトルレジスタVR4へ
図12の「VR4(Aの実部)」のとおりロード(ギャザー)する。
【0011】
次に、ベクトル加算命令(VADD命令)で、ベクトルレジスタVR5の各要素にベクトルレジスタVR2の各要素と4を加算したものを設定する。これは
図12の「A(メモリ)」に示すように、単精度複素数の実部、虚部が4バイト毎に交互に配置されているためで、虚部のアドレスを取得する際に配列Aの各要素のアドレスの4バイト先をロード(ギャザー)する必要があるためである。この結果、ベクトルレジスタVR5にはA(IX(I))の各要素の虚部のアドレスが設定される。
【0012】
次に、4バイトベクトルギャザー命令(VGT4命令)で、このベクトルレジスタVR5の各要素に格納されたアドレスにある4バイトの値をメモリからベクトルレジスタVR6へ
図12の「VR6(Aの虚部)」のとおりロード(ギャザー)する。単精度複素数のメモリ配置は
図12の「A(メモリ)」に示すように実部、虚部が4バイト毎に交互に配置されているため、配列Aの要素のA(IX(I))のアドレスに4を加算したアドレスにある4バイトの値をロード(ギャザー)することは、単精度複素数型の配列Aの一要素の虚部の値をロード(ギャザー)することと等しい。
【0013】
最後にベクトル加算命令(VADD命令)で、ベクトルレジスタVR7にベクトルレジスタVR4とベクトルレジスタVR6とを加算したものを設定し、ベクトルストア命令(VST命令)でベクトルレジスタVR7の値を、配列Bに格納する。
【0014】
リスト演算は、科学技術分野における数値解析で高い頻度で利用されている。これらの解析処理では、複雑に変化する現象をシミュレーションするために膨大な計算時間を要しており、中でもリスト演算の計算コストが極めて大きく、その処理の高速化が望まれている。
【先行技術文献】
【特許文献】
【0015】
【文献】国際公開第2020/066375号
【文献】特開2013-182293号公報
【発明の概要】
【発明が解決しようとする課題】
【0016】
しかしながら、
図11、
図12を参照して説明した、背景技術のコンパイル方法には、以下のような課題がある。
【0017】
図11に示す命令列の4バイトベクトルギャザー命令(VGT4命令)でベクトルレジスタにロード(ギャザー)する値は、メモリ上に連続して並んでおらず、また、そのメモリ上の並び方は等間隔でもないため、配列内に広くアクセスする必要がある。配列内に広くアクセスする場合、ロード(ギャザー)する値がメモリキャッシュに載っている確率は低く、ベクトルギャザー命令の実行時間は他の命令に比べて著しく長くなる。
【0018】
4バイトベクトルギャザー命令(VGT4命令)は、8バイト幅のベクトルレジスタの上位4バイトに値をロード(ギャザー)しているため、
図12の「VR4(Aの実部)」や「VR6(Aの虚部)」に示すように、ベクトルレジスタVR4、ベクトルレジスタVR6の各要素の下位4バイトには有意な値を格納しておらず、空いている状態(empty)である。また実行時間が長いベクトルギャザー命令を2回発行し、さらにこれらの命令がループの繰り返しごとに実行されることとなるため、リスト演算自体の実行時間が長くなってしまうという課題がある。
【0019】
なお、この課題は、単精度複素数型の配列を対象としたリスト演算に限られず、成分として第1の変数及び第2の変数を持つ構造型の配列を対象としたリスト演算で生じうる。
【0020】
本発明の目的は、成分として第1の変数及び第2の変数を持つ構造型の配列を対象としたリスト演算を高速化することができる、コンパイル装置、コンパイル方法、及びコンパイルプログラムを提供することにある。
【課題を解決するための手段】
【0021】
前記目的を達成するため、本発明に係るコンパイル装置は、
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析部と、
上記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成部と、を含む。
【0022】
本発明に係るコンパイル方法は、
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかをコード解析部が判定し、
上記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令をベクトル命令が生成する。
【0023】
本発明に係るコンパイルプログラムは、
コンピュータを、
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析手段と、
上記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成手段と、して機能させる。
【発明の効果】
【0024】
本発明によれば、成分として第1の変数及び第2の変数を持つ構造型の配列を対象としたリスト演算を高速化することができる。
【図面の簡単な説明】
【0025】
【
図1】本発明の実施形態が対象とするソースプログラムの一例である。
【
図2】本発明の第1実施形態によるコンパイル方法を説明するためのフローチャートである。
【
図3】本発明の第1実施形態により生成される命令列である。
【
図4A】本発明の第1実施形態によるコンパイラを説明するためのブロック図である。
【
図4B】本発明の実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムに関して、目的プログラムを実行する計算機の構成を説明するためのブロック図である。
【
図5】本発明の第1実施形態によるコンパイル方法のうち、ベクトルレジスタに対する操作を説明するための概念図である。
【
図6】本発明の第1実施形態によるコンパイル方法のうち、ベクトルレジスタに対する操作動作を説明するための概念図である。
【
図7】本発明の第1実施形態によるコンパイル方法のうち、ベクトルレジスタに対する操作を説明するための概念図である。
【
図8】(a)は背景技術による生成される命令列であり、(b)は本発明の実施形態により生成される命令列である。
【
図9】(a)は本発明の第2実施形態が対象とするソースプログラムの一例であり、(b)は本発明の第2実施形態で用いられるメモリ配列を説明するための概念図である。
【
図10】(a)は本発明の第3実施形態が対象とするソースプログラムの一例であり、(b)は本発明の第3実施形態で用いられるメモリ配列を説明するための概念図である。
【
図12】背景技術によるコンパイル方法のうち、ベクトル演算の動作を説明するための概念図である。
【発明を実施するための形態】
【0026】
本発明の具体的な実施形態について説明する前に、実施形態の概要について説明する。
【0027】
本発明の実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムは、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算に用いられ、その一例として複素数型の配列を対象とするリスト演算に用いられる。本発明の実施形態では、配列の一例としての複素数型配列の実部と虚部の値を同一ベクトルレジスタに格納するために、単精度の値をロード(ギャザー)するベクトルギャザー命令を2回発行するのではなく、倍精度の値をロード(ギャザー)するベクトルギャザー命令を1回発行する。これにより、メモリアクセスの回数を削減して、リスト演算を高速化するコンパイラを提供する。
【0028】
本発明の実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムは、目的プログラム(オブジェクトプログラム)を実行する計算機に用いられる。このような計算機は、
図4Bに示される計算機150であり、演算装置151、メインメモリ152、及び一時記憶装置153を含んで構成される。計算機150はコンピュータであり、ベクトル演算が可能なベクトル計算機である。このような構成の計算機は、特許文献2で提案されている。
【0029】
図4Bの演算装置151は、プログラムに基づいて計算機150が演算を実行するための装置である。演算装置151は、具体的には計算機のCPU(Central Processing Unit)、GPU(Graphics Processing Unit)といったプロセッサ内の演算装置であり、例えばCPUにおけるALU(Arithmetic Logic Unit)により構成される。演算装置151は、メインメモリ152又は一時記憶装置153からデータを取得し、それに応じて演算を実行する。
【0030】
図4Bのメインメモリ152は、計算機150において演算装置151がアクセス可能な主記憶装置である。メインメモリ152は、演算装置151が演算を実行するために必要なデータ及び演算を実行した結果のデータを保持することができる。
【0031】
図4Bの一時記憶装置153は、演算装置151がメインメモリ152よりも高速にアクセス可能な記憶装置であり、例えばレジスタが該当する。例えば、演算装置151及び一時記憶装置153がCPUを構成する場合には、演算装置151はCPU内のALU、一時記憶装置153はCPU内のレジスタである。
【0032】
本発明の実施形態のコンパイル装置は、上記計算機150が実行する目的プログラムを、原始プログラム(ソースプログラム)に基づいて生成するコンパイラである。コンパイラは、ソースプログラムをコンパイルすることにより、オブジェクトコードを生成し、目的プログラム(オブジェクトプログラム)を生成する。以下、本発明の具体的な実施形態について、図面を参照しながら詳細に説明する。
【0033】
〔第1実施形態〕
初めに、本発明の第1実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。
【0034】
(実施形態の構成)
図4Aは、本実施形態によるコンパイル装置を説明するためのブロック図である。
図4Aのコンパイル装置は、ソースプログラムをコンパイルしてオブジェクトコードを生成するコンパイラ100である。
図4Aのコンパイラ100は、プログラムとしてのソースプログラムを解析するコード解析部10、及びコード解析部10での解析結果に基づいて命令を生成する命令生成部20を含む。本実施形態によるコンパイル装置は、上述した計算機に用いられ、コンパイラに組み込まれる一機能である。
【0035】
コード解析部10は、ソースプログラムのリスト演算がベクトル化可能な形式であるかを解析するリスト演算構文解析手段11を含む。
【0036】
命令生成部20は、コード解析部10での解析結果に基づいて、ベクトル化コードを生成するベクトル命令生成部を含む。命令生成部20のベクトル命令生成部は、リスト演算判定部21、ベクトルロード命令生成手段22、ベクトル論理シフト命令生成手段23、ベクトル加算命令生成手段24、8バイトベクトルギャザー命令生成手段25、ベクトル論理積命令生成手段26、及びベクトルストア命令生成手段27を含む。
【0037】
ベクトル命令生成部は、リスト演算が含まれるか否かをリスト演算判定部21が判定し、リスト演算が含まれるときにはそのリスト演算が単精度複素数型の配列に対する演算であるかどうかを判定する。リスト演算が単精度複素数型の配列に対する演算であるときには、8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成し、これによって配列の実部、虚部の値をロード(ギャザー)する命令を生成する。
【0038】
(実施形態の動作)
次に、図を用いて動作について説明する。
図2は、本発明の第1実施形態によるコンパイル方法を説明するためのフローチャートである。
図1は、本発明の第1実施形態が対象とするソースプログラムの一例である。本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムは、
図1に示されるソースプログラムをコンパイルしてオブジェクトコードを生成する。
図1のソースプログラムは間接参照を含んでおり、ソースプログラムの内容は、単精度複素数型の配列AのIX(I)番目の要素の実部、虚部を取り出して、その加算結果を配列Bに代入するものである。
【0039】
まず、コード解析部10のリスト演算構文解析手段11が、対象のソースプログラムのリスト演算構文を解析する(ステップS1)。リスト演算かどうかを判定し、リスト演算でないときには通常のベクトル命令を生成(ステップ6)した後、目的プログラムを生成(ステップS8)して終了する。
【0040】
リスト演算であるときには、ステップS3に進む。ステップS3では命令生成部20のリスト演算判定部21が、リスト演算の対象が単精度複素数型の配列であるかどうかを判定する。ここでは、コード解析部10の情報に基づき、ある配列の定義、参照の際の添字式に配列参照が含まれ、さらにその配列の添字式がループの繰り返し毎に一定の割合で増加、減少するときリスト演算だと判定し、リスト演算生成処理に入る。リスト演算の対象が単精度複素数型の配列でないとき(ステップS3のNO)には、背景技術と同様のリスト演算命令を生成(ステップS7)した後、目的プログラムを生成(ステップS8)して終了する。
【0041】
リスト演算の対象が単精度複素数型の配列であるときには、ステップS4に進む。
図1のソースプログラムの場合、配列参照A(IX(I))の添字式には配列IX(I)の参照が含まれ、配列参照IX(I)の添字式Iはループの繰り返し毎に1増加するので、リスト演算と判定される。
【0042】
リスト演算において同一の配列要素の実部、虚部へのアクセスが存在するかどうかを判定する(ステップS4)。リスト演算において同一の配列要素の実部、虚部へのアクセスが存在するとき(ステップS4のYES)は、本実施形態によるベクトル命令を生成(ステップS5)した後、目的プログラムを生成(ステップS8)して終了する。このステップS5で生成されるベクトル命令は、上述した8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を含んで構成される。
【0043】
以下、本実施形態により生成されるベクトル命令について、説明する。
図3は、本発明の第1実施形態により生成される命令列である。
図5乃至
図7は、本発明の第1実施形態によるコンパイル方法のうち、ベクトルレジスタに対する操作を説明するための概念図である。
図3の命令列では、まずベクトルロード命令(VLD命令)で、配列IXの値をベクトルレジスタVR1にロードする。次に、ベクトル論理シフト命令(VSLL命令)で、ベクトルレジスタVR1の各要素を3ビット左論理シフトした値を、ベクトルレジスタVR2に設定する。これは、配列Aの一要素のサイズ、つまり、単精度複素数型のサイズである8をベクトルレジスタVR1の各要素に乗じた値を、ベクトルレジスタVR2に設定することに等しい。こうして求めた値は、配列Aの先頭からの相対オフセット値である。
【0044】
次に、ベクトル加算命令(VADD命令)で、ベクトルレジスタVR2の各要素(上記相対オフセット値)と配列Aの先頭アドレスを加算した結果を、ベクトルレジスタVR3に設定する。このVADD命令の結果を、
図5の「VR3」に示す。単精度複素数型の配列のメモリ配置は
図5の「A(メモリ)」に示すように、実部、虚部が4バイト毎に交互に配置されているため、結果としてベクトルレジスタVR3にはA(IX(I))の各要素の実部のアドレスが設定されることとなる。
【0045】
次に、8バイトベクトルギャザー命令(VGT8命令)で、ベクトルレジスタVR3の各要素に格納されたアドレスにある幅8バイトの値を、メモリからベクトルレジスタVR4へ
図5の「VR4(Aの実部、虚部)」のとおりロード(ギャザー)する。単精度複素数型の配列Aのメモリ配置は、
図5の「A(メモリ)」のとおり実部、虚部が4バイト毎に交互に配置されているため、配列Aの要素であるA(IX(I))のアドレスにある幅8バイトをロード(ギャザー)することは単精度複素数型の配列Aの一要素の実部と虚部の値を同時にロード(ギャザー)することと等しい。
【0046】
次に、ベクトル論理積命令(VAND命令)で、ベクトルレジスタVR5にベクトルレジスタVR4の各要素の上位4バイトのみを論理積で
図6の「VR5(Aの実部)」のとおり取り出す。ベクトルレジスタVR4には、単精度複素数型の配列Aの実部と虚部が格納されているので、上位4バイトのみを取り出した値は単精度複素数型の配列Aの実部の値と等しい。
【0047】
次に、ベクトル論理シフト命令(VSLL命令)で、ベクトルレジスタVR6にベクトルレジスタVR4の各要素を4バイト左論理シフトした値を
図7の「VR6(Aの虚部)」のとおり設定する。ベクトルレジスタVR4には、単精度複素数型の配列Aの実部と虚部が格納されているため、4バイト左論理シフトした値は単精度複素数型の配列Aの虚部の値と等しい。
【0048】
最後にベクトル加算命令(VADD命令)で、ベクトルレジスタVR7にベクトルレジスタVR5とベクトルレジスタVR6とを加算したものを設定し、ベクトルストア命令(VST命令)でベクトルレジスタVR7の値を、配列Bに格納する。
【0049】
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、単精度複素数型の配列を対象としたリスト演算を高速化することができる。
【0050】
図8の(a)は背景技術のコンパイル方法により生成された命令列であり、(b)は本発明の実施形態のコンパイル方法により生成された命令列である。背景技術では2つの4バイトベクトルギャザー命令(VGT4命令)を生成していたのに対して、本発明の実施形態のコンパイル方法では8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成している。本実施形態では、実行時間が長いベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができる。ベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができ、プログラムを高速化できる。
【0051】
〔第2実施形態〕
次に、本発明の第2実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、上述した第1実施形態と同様な内容についてはその詳細な説明を省略して、相違点について説明する。
【0052】
上述した第1実施形態では、単精度複素数型の配列を対象としたリスト演算を含むプログラムを例に説明したが、本発明はこれに限られない。例えば、2行N列の単精度浮動小数点数型の配列を対象としたリスト演算を含むプログラムにおいても適用できる。
【0053】
図9の(a)は2行N列の単精度浮動小数点数型の配列Cを対象としたリスト演算を含むソースプログラムであり、
図9の(b)は2行N列の単精度浮動小数点数型の配列Cのメモリ配列を示す概念図である。
図9の(a)のソースプログラムの内容は、2行N列の単精度浮動小数点数型の配列CのIX(I)番目の要素のC(1,IX(I))、C(2,IX(I))を取り出して、その加算結果を配列Bに代入するものである。
【0054】
図9の(b)に示すように、2行N列の単精度浮動小数点数型の配列Cでは、C(1,1)、C(2,1)~C(1,N)、C(2,N)が4バイト毎に交互に配置されている。
【0055】
このような2行N列の単精度浮動小数点数型の配列Cを対象としたリスト演算においても、上述した第1実施形態と同様に、8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成し、これによって配列CのC(1,IX(I))、C(2,IX(I))の値をロード(ギャザー)する命令を生成する。
【0056】
本実施形態では、第1実施形態の
図2のステップS3の代わりに、命令生成部20が、リスト演算の対象が2行N列の単精度浮動小数点数型の配列であるかどうかを判定する。さらに本実施形態では、第1実施形態の
図2のステップS4の代わりに、リスト演算において2行N列の単精度浮動小数点数型の配列の同一行のC(1,IX(I))、C(2,IX(I))へのアクセスが存在するかどうかを判定する。これらに該当するときには、本実施形態のベクトル命令を生成する。
【0057】
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、第1実施形態と同様に、8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成することにより、リスト演算を高速化することができる。
【0058】
本実施形態では、実行時間が長いベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができる。ベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができ、プログラムを高速化することができる。
【0059】
さらに本実施形態によれば、2行N列の単精度浮動小数点数型の配列を対象としたリスト演算を高速化することができ、高速化が可能な対象プログラムの範囲を拡げることができる。
【0060】
〔第3実施形態〕
次に、本発明の第3実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、説明する。本実施形態によるコンパイル装置、コンパイル方法、及びコンパイルプログラムについて、上述した第1実施形態と同様な内容についてはその詳細な説明を省略して、相違点について説明する。第1実施形態では、単精度複素数型の配列を対象としたリスト演算を含むプログラムを例に説明し、第2実施形態では、2行N列の単精度浮動小数点数型の配列を対象としたリスト演算を含むプログラムを例に説明したが、本発明はこれに限られない。例えば、成分として単精度浮動小数点数を2つ持つ構造型の配列を対象としたリスト演算を含むプログラムにおいても適用できる。
【0061】
図10の(a)は成分として単精度変数aa、bbを持つ構造型の配列Dを対象としたリスト演算を含むソースプログラムであり、
図10の(b)は成分として単精度変数aa、bbを持つ構造型の配列Dのメモリ配列を示す概念図である。
図10の(a)のソースプログラムの内容は、成分として単精度変数aa、bbを持つ構造型の配列DのIX(I)番目の要素の単精度変数aa、単精度変数bbを取り出して、その加算結果を配列Bに代入するものである。
【0062】
図10の(b)に示すように、成分として単精度変数aa、bbを持つ構造型の配列Dでは、D(1)%aa、D(1)%bb、D(2)%aa、D(2)%bb~D(N)%aa、D(N)%bbが4バイト毎に交互に配置されている。
【0063】
このような成分として単精度変数aa、bbを持つ構造型の配列Dを対象としたリスト演算においても、上述した第1実施形態と同様に、8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成し、これによって配列Dの単精度変数aa、単精度変数bbの値をロード(ギャザー)する命令を生成する。
【0064】
本実施形態では、第1実施形態の
図2のステップS3の代わりに、命令生成部20が、リスト演算の対象が成分として単精度変数aa、bbを持つ構造型の配列であるかどうかを判定する。さらに本実施形態では、第1実施形態の
図2のステップS4の代わりに、リスト演算において同一の配列要素の単精度変数aa、単精度変数bbへのアクセスが存在するかどうかを判定する。これらに該当するときには、本実施形態のベクトル命令を生成する。
【0065】
(実施形態の効果)
本実施形態のコンパイル装置、コンパイル方法、及びコンパイルプログラムによれば、第1実施形態と同様に、8バイトベクトルギャザー命令(VGT8命令)、ベクトル論理積命令(VAND命令)、ベクトル論理シフト命令(VSLL命令)を生成することにより、リスト演算を高速化することができる。
【0066】
本実施形態では、実行時間が長いベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができる。ベクトルギャザー命令の実行数を削減することでメモリへのアクセスを減らすことができ、プログラムを高速化することができる。
【0067】
さらに本実施形態によれば、成分として単精度変数aa、bbを持つ構造型の配列を対象としたリスト演算を高速化することができ、高速化が可能な対象プログラムの範囲を拡げることができる。
【0068】
以上、本発明の好ましい実施形態を説明したが、本発明はこれに限定されるものではない。例えば、上述した第1乃至第3実施形態で言及した具体的な配列の名称に限られず、成分として第1の変数及び第2の変数を持つ構造型の配列を対象としたリスト演算を含むソースプログラムにも、本発明は適用可能である。特許請求の範囲に記載した発明の範囲内で、種々の変形が可能であり、それらも本発明の範囲に含まれることはいうまでもない。
【0069】
上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
(付記1)ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析部と、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成部と、を含む、
コンパイル装置。
(付記2)前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
付記1に記載のコンパイル装置。
(付記3)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、実部、虚部が4バイト毎に交互に配置された、単精度複素数型の配列である、
付記2に記載のコンパイル装置。
(付記4)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、要素が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記2に記載のコンパイル装置。
(付記5)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、第1の単精度変数、第2の単精度変数が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記2に記載のコンパイル装置。
(付記6)ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかをコード解析部が判定し、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令をベクトル命令が生成する、
コンパイル方法。
(付記7)前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
付記6に記載のコンパイル方法。
(付記8)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、実部、虚部が4バイト毎に交互に配置された、単精度複素数型の配列である、
付記7に記載のコンパイル方法。
(付記9)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、要素が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記7に記載のコンパイル方法。
(付記10)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、第1の単精度変数、第2の単精度変数が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記7に記載のコンパイル方法。
(付記11)コンピュータを、
ソースプログラムに、成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるかどうかを判定するコード解析手段と、
前記成分として第1の変数及び第2の変数を持つ構造型の配列を対象とするリスト演算が含まれるときに、ベクトルギャザー命令、ベクトル論理積命令、及びベクトルシフト命令を生成するベクトル命令生成手段と、して機能させる、
コンパイルプログラム。
(付記12)前記構造型の配列は、前記成分として第1の変数及び第2の変数が4バイト毎に交互にメモリに配列されており、
前記ベクトルギャザー命令は、8バイトベクトルギャザー命令であり、第1のベクトルレジスタの各要素に格納されたアドレスにある幅8バイトの値を、前記メモリから第2のベクトルレジスタへロードするものであり、
前記ベクトル論理積命令は、前記第2のベクトルレジスタの各要素の上位4バイトのみを第3のベクトルレジスタに取り出すものであり、
前記ベクトルシフト命令は、前記第2のベクトルレジスタの各要素を4バイト左シフトした値を第4のベクトルレジスタに取り出すものである、
付記11に記載のコンパイルプログラム。
(付記13)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、実部、虚部が4バイト毎に交互に配置された、単精度複素数型の配列である、
付記12に記載のコンパイルプログラム。
(付記14)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、要素が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記12に記載のコンパイルプログラム。
(付記15)前記成分として第1の変数及び第2の変数を持つ構造型の配列は、第1の単精度変数、第2の単精度変数が4バイト毎に交互に配置された、2行N列の単精度浮動小数点数型の配列である、
付記12に記載のコンパイルプログラム。
【符号の説明】
【0070】
10 コード解析部
11 リスト演算構文解析手段
20 命令生成部
21 リスト演算判定部
22 ベクトルロード命令生成手段
23 ベクトル論理シフト命令生成手段
24 ベクトル加算命令生成手段
25 8バイトベクトルギャザー命令生成手段
26 ベクトル論理積命令生成手段
27 ベクトルストア命令生成手段
100 コンパイラ