(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024087606
(43)【公開日】2024-07-01
(54)【発明の名称】プロセッサ、命令実行プログラムおよび情報処理装置
(51)【国際特許分類】
G06F 9/38 20180101AFI20240624BHJP
G06F 9/315 20180101ALI20240624BHJP
G06F 9/345 20180101ALI20240624BHJP
【FI】
G06F9/38 370A
G06F9/315 S
G06F9/345 A
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022202515
(22)【出願日】2022-12-19
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】110002147
【氏名又は名称】弁理士法人酒井国際特許事務所
(72)【発明者】
【氏名】川上 健太郎
【テーマコード(参考)】
5B013
5B033
【Fターム(参考)】
5B013DD01
5B033BD00
5B033BD03
(57)【要約】
【課題】効率的な実行コードを実現すること。
【解決手段】プロセッサ10cは、第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、該演算した結果を、第3のSIMDレジスタに格納し、第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納するSIMD命令の処理を実行する。
【選択図】
図3
【特許請求の範囲】
【請求項1】
第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
SIMD命令の処理を実行することを特徴とするプロセッサ。
【請求項2】
前記第2のSIMDレジスタの特定のレーンは、前記SIMD命令で規定される
ことを特徴とする請求項1に記載のプロセッサ。
【請求項3】
前記第2のSIMDレジスタのシフトは、1レーン分の固定のビット長をシフトする回路を用いる
ことを特徴とする請求項1に記載のプロセッサ。
【請求項4】
前記演算は、加算演算、減算演算、乗算演算、除算演算,剰余演算,積和演算および論理演算を含む
ことを特徴とする請求項1に記載のプロセッサ。
【請求項5】
前記演算する処理は、配列に対する多項式計算において、前記第1のSIMDレジスタのビット長に応じた前記配列の個数のデータをそれぞれレーンに記憶する前記第1のSIMDレジスタの各レーンと、前記多項式計算で用いられる複数の係数をそれぞれレーンに記憶する前記第2のSIMDレジスタの前記特定のレーンとの間で演算し、
前記第2のSIMDレジスタに格納する処理は、前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
ことを特徴とする請求項1に記載のプロセッサ。
【請求項6】
配列に対する多項式計算において、データを記憶するレーンを有する第1のSIMDレジスタのビット長に応じた前記配列の個数のデータをそれぞれレーンに記憶する前記第1のSIMDレジスタの各レーンと、前記多項式計算で用いられる複数の係数をそれぞれレーンに記憶する第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
処理をプロセッサに実行させることを特徴とする命令実行プログラム。
【請求項7】
第1の入力データを記憶するレーンを有する第1のSIMDレジスタと、
第2の入力データを記憶するレーンを有する第2のSIMDレジスタと、
第3のSIMDレジスタと、
制御部と、を有し、
前記制御部は、
前記第1のSIMDレジスタの各レーンと、前記第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、前記第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
SIMD命令の処理を実行することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プロセッサ、命令実行プログラムおよび情報処理装置に関する。
【背景技術】
【0002】
1命令で複数個のデータに対する演算を実行するSIMD(Single Instruction Multiple Data)命令が知られている(例えば、特許文献1~4参照)。SIMD命令は、複数の命令を使用するのではなく、単一の命令を使用することによって、2個のSIMDレジスタに含まれる複数のSIMDレーン内のそれぞれのデータに関して、同一の演算を並列に実行することができる。ここで、Armアーキテクチャの64ビットモードのCPUの場合、1つのSIMDレジスタのビット長については、CPUを開発するベンダーが128~2048ビットの中から128×n(n:自然数)の長さを1つ選択することができる。例えば、SIMDレジスタは、512ビットを備え、64ビットのデータを8個記憶できる。
【0003】
図11は、SIMD命令(乗算)の参考図である。なお、
図11では、乗算のSIMD命令が「fmul z0.d,z1.d,z2.d」である場合を示す。
図11に示すように、かかる乗算のSIMD命令は、SIMDレジスタz1とSIMDレジスタz2のデータ(64ビット浮動小数データ)を要素ごとに乗算してSIMDレジスタz0に格納する。ここで「.d」はSIMDレジスタを複数の64ビットデータを含むものとして扱うことを表し、「.b」「.h」「.s」はそれぞれ複数の8,16,32ビットデータを含むものとして扱うことを表す。例えば「fmul z0.s,z1.s,z2.s」はSIMDレジスタz1とSIMDレジスタz2のデータ(32ビット浮動小数データ)を要素ごとに乗算してSIMDレジスタz0に格納する。
【0004】
1個のSIMDレジスタの中の下位128ビットは、別のレジスタとデータを共有する。別のレジスタのことをここではvレジスタというものとする。vレジスタが乗算に用いられる場合には、レーンを指定したSIMD命令(乗算)が利用できる。
【0005】
図12は、レーン指定付きSIMD命令(乗算)の参考図である。なお、
図12では、乗算のレーン指定付きSIMD命令が「fmul v0.d,v1.d,v2.d[0]」である場合を示す。
図12に示すように、かかる乗算のSIMD命令は、レジスタv1の各要素とレジスタv2の「0」レーンのデータ(64ビット浮動小数データ)とを乗算して各要素をレジスタv0に格納する。v0の各SIMDレーンには、(v1レジスタの各レーンの値)×(v2レジスタのd0(レーン#0))の値が格納される。乗算のレーン指定付きSIMD命令は「fmul v0.d,v1.d,v2.d[1]」であっても良い。
【0006】
ところが、SIMDレジスタが256ビット以上の場合、乗算のレーン指定付きSIMD命令は利用できない。例えば、SIMDレジスタが512ビットの場合、「fmul z0.d,z1.d,z2.d[0~7]」のSIMD命令(乗算)は利用できない。また、SIMDレジスタが1024ビットの場合、「fmul z0.d,z1.d,z2.d[0~31]」のSIMD命令(乗算)は利用できない。
【0007】
SIMDレジスタが256ビット以上の場合、乗算のレーン指定付きSIMD命令が存在しないのは、以下の理由のとおりである。Armアーキテクチャの64ビットモードのCPUの命令は、1命令あたり32ビットで構成されるが、32ビットの構成の中に、レーンを指定するビットが1ビットしか確保できないからである。
【0008】
図13は、レーン指定付きSIMD命令(乗算)のビット構成を示す参考図である。なお、
図13では、乗算のレーン指定付きSIMD命令が「fmul vd.d,vn.d,vm.d[h]」である場合を示す。
図13に示すように、5~9ビットは、「vn」で示される第1ソースレジスタの番号を表すビット列である。16~20ビットは、「vm」で示される第2ソースレジスタの番号を表すビット列である。0~4ビットは、「vd」で示されるdestinationレジスタの番号を表すビット列である。そして、10ビット、12~15ビットおよび21~31ビットは、レーン指定付きSIMD命令であることを表すビット列である。そして、11ビットが、レーン番号を指定するビットを示す。値が2進数の「0」の場合には、レーン番号が「0」(h=0)であることを示し、値が2進数の「1」の場合には、レーン番号が「1」(h=1)であることを示す。つまり、レーン指定付きSIMD命令の32ビットの中には、レーン番号を指定するビットが1ビットだけしかない。
【0009】
例えば、SIMDレジスタが1024ビットの場合には、64ビットデータを32個含むので,32ビットからなる命令フォーマットのビット構成の中に0~31を指定できる必要がある。0~31を指定するには5ビット確保する必要があるが、5ビット確保する空きビットがないので、SIMDレジスタを使ったSIMD命令でレーン指定付きの命令フォーマットを定義する余地がない。
【先行技術文献】
【特許文献】
【0010】
【特許文献1】特開2018-206413号公報
【特許文献2】特表2018-525730号公報
【特許文献3】特表2018-523237号公報
【特許文献4】特表2020-533691号公報
【発明の概要】
【発明が解決しようとする課題】
【0011】
しかしながら、256ビット以上のSIMDレジスタの場合に、レーンを指定することは断念しても、レジスタz1の各要素とレジスタz2の特定のレーンのデータとの演算を実施して、効率的な実行コード(実行可能プログラム)を実現したい場合がある。
【0012】
一側面によれば、効率的な実行コードを実現することを目的とする。
【課題を解決するための手段】
【0013】
一側面によれば、第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、該演算した結果を、第3のSIMDレジスタに格納し、前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納するSIMD命令の処理を実行可能なプロセッサを提供する。
【発明の効果】
【0014】
一側面によれば、効率的な実行コードを処理できるプロセッサを実現できる。
【図面の簡単な説明】
【0015】
【
図1】
図1は、多項式計算を含むソースプログラムの一例を示す図である。
【
図2A】
図2Aは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムを示す参考図(1)である。
【
図2B】
図2Bは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムを示す参考図(2)である。
【
図3】
図3は、実施例に係るSIMDレーンシフト付きの乗算命令の処理の流れを示す図である。
【
図4】
図4は、実施例に係るSIMDレーンシフト付きの加算命令の処理の流れを示す図である。
【
図5】
図5は、実施例に係る情報処理装置のハードウェア構成図である。
【
図6】
図6は、実施例に係るプロセッサが備えるレジスタファイルの模式図である。
【
図7】
図7は、実施例に係る情報処理装置の機能構成図である。
【
図8A】
図8Aは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムの一例を示す図(1)である。
【
図8B】
図8Bは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムの一例を示す図(2)である。
【
図9】
図9は、実施例に係るレーンシフト付き演算命令実行処理のフローチャートの一例を示す図である。
【
図10】
図10は、実施例に係るSIMDレーンシフト付きの乗算命令の変形例を示す図である。
【
図12】
図12は、レーン指定付きSIMD命令(乗算)の参考図である。
【
図13】
図13は、レーン指定付きSIMD命令(乗算)のビット構成を示す参考図である。
【
図14】
図14は、SIMDレジスタ内のデータをシフトする命令を示す参考図である。
【発明を実施するための形態】
【0016】
本実施形態の説明に先立ち、本実施形態の基礎となる事項について説明する。
【0017】
ソースプログラムには、様々な演算を行うためのコードが記述されることがある。その演算を効率的に実行できればソースプログラムに記述した演算の実行速度も高速化する。そこで、以下では、特に、多項式計算を含むソースプログラムについて説明する。
【0018】
図1は、多項式計算を含むソースプログラムの一例を示す図である。このソースプログラム100は、6行目~9行目のfor文によるループ処理の内部において、7,8行目に記載された多項式計算をループ長128だけ繰り返し行うプログラムである。a[i](i=0~127)が配列データである。c
0,c
1,c
2,c
3は、係数である。なお、各データの型は、64ビット浮動小数(float64_t)である。
【0019】
図2Aおよび
図2Bは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムを示す参考図である。
図2Aには、
図1で示したソースプログラム100をコンパイルしてアセンブラ命令に変換したアセンブラ命令列が表されている。ソースプログラム100で示された係数c
0,c
1,c
2,c
3は、c0,c1,c2,c3と表す。また、
図2Bには、アセンブラ命令列で使用される複数のレジスタが示され、各レジスタが保持している値が各アセンブラ命令に対応付けて示されている。
【0020】
まず、1行目では、情報処理装置は、係数c0をSIMDレジスタz0にロードするSIMD命令を実行する。SIMDレジスタzのサイズが512ビットの場合、SIMDレジスタz0には、64ビットで示される係数c0が8個格納される(
図2B z0参照)。同様に、2~4行では、情報処理装置1は、係数c1~c3をそれぞれSIMDレジスタz1~z3にロードするSIMD命令を実行する(
図2B z1,z2,z3参照)。
【0021】
次に、5行目では、情報処理装置は、汎用レジスタx3にループカウンタの初期値として「0」を設定する。そして、6行目では、情報処理装置は、汎用レジスタx0がアドレスを保持するメモリ領域に格納されている入力データを、SIMDレジスタz16にロードする。例えば、最初に6行目の命令が実行される場合には,SIMDレジスタz16には、
図1で示す入力データaの配列要素の先頭から8個分(i=0~7)が格納される(
図2B z16参照)。
【0022】
次に、7行目では、情報処理装置は、SIMDレジスタz0に格納された係数c0と0.0を加算した結果をSIMDレジスタz24に格納する。
【0023】
そして、8,9行目では、情報処理装置は、以下のように、「c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置は、配列aのデータが8個格納されたSIMDレジスタz16と係数c1が8個格納されたSIMDレジスタz1とを乗算して、SIMDレジスタz18に格納する(8行目)。つまり、SIMDレジスタzのサイズが512ビットの場合、情報処理装置は、SIMDレジスタzを用いたSIMD命令「fmul」を使えば、64ビットデータ×8個ずつ計算できる。そして、情報処理装置は、乗算結果を示すSIMDレジスタz18と係数c0が8個格納されたSIMDレジスタz24とを加算して、SIMDレジスタz24に格納する(9行目)。
【0024】
そして、10~12行目では、情報処理装置は、以下のように、「c2×a^2+c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置は、配列aのデータが8個格納されたSIMDレジスタz16を2乗して、SIMDレジスタz17に格納する(10行目)。つまり、SIMDレジスタzのサイズが512ビットの場合、情報処理装置は、SIMDレジスタzを用いたSIMD命令「fmul」を使えば、64ビットデータ×8個ずつ計算できる。そして、情報処理装置は、乗算結果のSIMDレジスタz17と係数c2が8個格納されたSIMDレジスタz2とを乗算して、SIMDレジスタz18に格納する(11行目)。そして、情報処理装置1は、乗算結果「c2×a^2」を示すSIMDレジスタz18と「c1×a+c0」の結果が格納されたSIMDレジスタz24とを加算して、SIMDレジスタz24に格納する(12行目)。
【0025】
そして、13~15行目では、情報処理装置は、以下のように、「c3×a^3+c2×a^2+c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置は、配列aのデータが8個格納されたSIMDレジスタz16と、配列aのデータの2乗の値が8個格納されたSIMDレジスタz17とを乗算して、SIMDレジスタz17に格納する(13行目)。つまり、SIMDレジスタzのサイズが512ビットの場合、情報処理装置は、SIMDレジスタzを用いたSIMD命令「fmul」を使えば、64ビットデータ×8個ずつ計算できる。そして、情報処理装置は、乗算結果「a^3」のSIMDレジスタz17と係数c3が8個格納されたSIMDレジスタz3とを乗算して、SIMDレジスタz18に格納する(14行目)。そして、情報処理装置1は、乗算結果「c3×a^3」を示すSIMDレジスタz18と「c2×a^2+c1×a+c0」の結果が格納されたSIMDレジスタz24とを加算して、SIMDレジスタz24に格納する(15行目)。
【0026】
そして、16行目では、情報処理装置は、SIMDレジスタz24に格納された、8個の入力データaに対する計算結果をメモリへストアする。そして、17行目では、情報処理装置は、汎用レジスタx3に保持されているループカウンタの値を8だけ加算する。そして、18,19行目では、情報処理装置は、次のループ処理のために、入力データをロードするメモリ領域のアドレスx0および計算結果をストアするメモリ領域のアドレスx1を64バイト(=(64ビットデータ)×8/(8(ビット/バイト)))だけ更新する。そして、20,21行目では、情報処理装置は、処理済みの配列要素数(変数x3で示されるループカウンタ)が128未満の場合、6行目のloopへ戻る。情報処理装置は、処理済みの配列要素数(変数x3で示されるループカウンタ)が128以上の場合、終了する。
【0027】
このように、ソースプログラム100をコンパイルして得られた機械語の実行可能プログラムでは、情報処理装置は、係数c0~c3のデータ保持のために、SIMDレジスタを4個(z0~z3)使用する。すなわち、128ビットより大きなビット長を持つSIMDレジスタであるzレジスタを用いたSIMD命令では、レーン指定付きの命令がないので、係数c0~c3をそれぞれ4個のSIMDレジスタ(z0~z3)に格納する必要がある。つまり、多項式計算を含むソースプログラム100に対応する実行可能プログラムでは、複数の係数をそれぞれ異なるSIMDレジスタに格納するので、多くのSIMDレジスタを使う必要がある。
図2Bの例では,SIMDレジスタとしてz0,z1,z2,z3,z16,z17,z18,z24を用いる.これらのSIMDレジスタが,このループ処理の後に使用するデータを保持している場合,このループ処理を開始する前に8個のレジスタが保存されているデータをメモリに一時保存し,このループ処理が終了した後に8個のレジスタのデータをメモリから復帰する必要がある.より少ないSIMDレジスタ数で多項式の計算が可能であれば,データのメモリへの退避と復帰のために実行しなければならない命令が少なくなるので望ましい。
【0028】
そこで、実施例では、レーンシフト付きのSIMD命令を追加して、多項式計算を含むソースプログラム100をコンパイルして得られる機械語の実行可能プログラムの計算効率を向上させる。なお、以下では、Arm社のArmアーキテクチャ(AArch64)の命令セットに新たなレーンシフト付きのSIMD命令を追加する場合を説明する。
【実施例0029】
まず、レーンシフト付きのSIMD命令について説明する。レーンシフト付きのSIMD命令は、2つの入力SIMDレジスタをz1,z2とし、出力SIMDレジスタをz0とする場合に、z1の各レーンの値と、z2のLSB(Least Significant Bit)側のレーンの値とで演算を行い、演算結果をz0の各レーンに格納し、且つ、z2の各レーンの値を1レーン分シフトしてz2に格納する。すなわち、レーンシフト付きのSIMD命令は、z2のレーン番号を指定することは断念して、z1の各要素とz2のLSB側のレーンのデータとの演算を行い、演算後、z2のデータを1レーンだけサイクリックにシフトする。ここでいう演算には、加算,減算,乗算,除算,剰余演算,積和演算、論理演算が含まれる。また、サイクリックにシフトする方向は、右シフトであっても、左シフトであっても良い。シフトが右シフトの場合には、シフト後のMSB(Most Significant Bit)側のレーンには、LSB側のレーンの値が記憶される。なお、以下では、シフトが右シフトであるとして説明する。
【0030】
図3は、実施例に係るSIMDレーンシフト付きの乗算命令の処理の流れを示す図である。
図3に示すSIMDレーンシフト付きの乗算命令は、例えば、「fmul´ z0.d,z1.d,z2.d」と定義する。SIMDレジスタz1は、各レーンに被乗数を記憶する。SIMDレジスタz2は、各レーンに乗数を記憶する。SIMDレジスタz0は、destinationのレジスタである。
【0031】
SIMDレーンシフト付きの乗算命令fmul´は、[SIMDレジスタz1の各レーンの値]×[SIMDレジスタz2のd0(レーン#0)]を乗算し、乗算結果をSIMDレジスタz0の各レーンに格納する。加えて、fmul´は、乗算後、SIMDレジスタz2のデータを1レーンだけ右シフトさせる。すなわち、SIMDレジスタz2の#i(i=0~6)番目のレーンには、#(i+1)番目のレーンの値が格納される。7番目(MSB側)のレーンには、0番目(LSB側)のレーンの値が格納される。なお、SIMDレジスタz1の各レーンの値は、変更されない。
【0032】
これにより、多項式計算を含むソースプログラム100は、効率の良い実行コードを実現することが可能となる。つまり、
図1で示す配列a[i],b[i]に対する「b[i]=c3×a[i]^3+c2×a[i]^2+c1×a[i]+c0」のような多項式を計算するソースプログラム100において、
図2Aおよび
図2Bで示す実行コードでは、全てのレーンに同じ係数c3,c2,c1,c0を持つSIMDレジスタを4個用意する必要があった。しかしながら、SIMDレーンシフト付きの乗算命令が新たに追加されれば、各レーンに係数c3,c2,c1,c0を持つ1つのSIMDレジスタで計算を実現できるようになり、SIMDレジスタの必要な個数が削減できる。この結果、多項式計算を含むソースプログラム100は、効率の良い実行コードを実現することが可能となる。
【0033】
図4は、実施例に係るSIMDレーンシフト付きの加算命令の処理の流れを示す図である。
図4に示すSIMDレーンシフト付きの加算命令は、例えば、「fadd´ z0.d,z1.d,z2.d」と定義する。SIMDレジスタz1は、各レーンに被加数を記憶する。SIMDレジスタz2は、各レーンに加数を記憶する。SIMDレジスタz0は、destinationのレジスタである。
【0034】
SIMDレーンシフト付きの加算命令fadd´は、[SIMDレジスタz1の各レーンの値]+[SIMDレジスタz2のd0(レーン#0)]を加算し、加算結果をSIMDレジスタz0の各レーンに格納する。加えて、fadd´は、加算後、SIMDレジスタz2のデータを1レーンだけ右シフトさせる。すなわち、SIMDレジスタz2の#i(i=0~6)番目のレーンには、#(i+1)番目のレーンの値が格納される。7番目(MSB側)のレーンには、0番目(LSB側)のレーンの値が格納される。なお、SIMDレジスタz1の各レーンの値は、変更されない。
【0035】
なお、上記では、乗算命令および加算命令について説明したが、その他の四則演算や積和演算、論理演算についても同様に処理される。
【0036】
図5は、実施例に係る情報処理装置のハードウェア構成図である。
図5に示すように、情報処理装置1は、HPC(High Performance Computer)やサーバ等のコンピュータであって、記憶装置10a、メモリ10b、プロセッサ10c、通信インターフェース10d、表示装置10eおよび入力装置10fを有する。これらの各部は、バス10gにより相互に接続される。
【0037】
このうち、記憶装置10aは、HDD(Hard Disk Drive)やSSD(Solid State Drive)等の不揮発性のストレージデバイスであり、実行可能プログラム11を記憶する。実行可能プログラム11は、
図1で示す多項式計算を含むソースプログラム100をコンパイルして得られた機械語のバイナリファイルである。
【0038】
なお、実行可能プログラム11をコンピュータが読み取り可能な記録媒体10hに記録させておき、プロセッサ10cに記録媒体10hの実行可能プログラム11を読み取らせるようにしても良い。
【0039】
そのような記録媒体10hとしては、例えばCD-ROM(Compact Disc - Read Only Memory)、DVD(Digital Versatile Disc)、およびUSB(Universal Serial Bus)メモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体10hとして使用しても良い。これらの記録媒体10hは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【0040】
更に、公衆回線、インターネット、およびLAN(Local Area Network)等に接続された装置に実行可能プログラム11を記憶させておき、プロセッサ10cがその実行可能プログラム11を読み出して実行するようにしても良い。
【0041】
一方、メモリ10bは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に前述の実行可能プログラム11が展開される。展開される実行可能プログラム11は、複数の命令12を含む。命令12には、SIMDレーンシフト付きの乗算命令fmul´やSIMDレーンシフト付きの加算命令fadd´等が含まれる。
【0042】
プロセッサ10cは、情報処理装置1の各部を制御したり、メモリ10bと協働して実行可能プログラム11を実行したりするCPU(Central Processing Unit)やGPU(Graphical Processing Unit)等のハードウェアである。プロセッサ10cは、SIMDアーキテクチャ13およびレジスタファイル14を備える。レジスタファイル14は、算出演算に必要なデータを保持する。
【0043】
SIMDアーキテクチャ13には、例えば、Armアーキテクチャ(AArch64)の命令セットに対応する演算回路が含まれる。また、SIMDアーキテクチャ13には、例えば、レーンシフト付きの乗算命令を処理するfmul´演算回路13aやレーンシフト付きの加算命令を処理するfadd´演算回路13bが含まれる。fmul´演算回路13aやfadd´演算回路13bには、1レーン分シフトするシフト回路が搭載される。1レーン分シフトするシフト回路は、固定の64ビット(8バイト)をシフトするものであり、セレクタが不要になるので、処理時間を高速化できる。
【0044】
なお、命令セットには、任意バイト数に対応するシフト命令「ext」が含まれている。
図14は、SIMDレジスタ内のデータをシフトする命令を示す参考図である。
図14左図に示すように、シフト命令を示す「ext z0.b,z1.b,z2.b,n」が表されている。
図14の例では、ext命令は、SIMDレジスタz2とSIMDレジスタz1を連結した1024ビットのデータを、nバイト分右にシフトした512ビットをSIMDレジスタz0に格納する。すなわち、ext命令は、nバイト分の右シフトを実行する。nは、0以上64以下を満たす整数を示す。
図14右図には、任意バイト数に対応するext命令を実行するシフト回路が表されている。かかるシフト回路は、nに応じてシフトするように、セレクタが複数個搭載される。そうすると、任意バイト数に対応するext命令を実行するシフト回路は、任意バイト数に対応する分、レイテンシ(実行完了にかかるCPUクロック数)が大きく、処理時間が長くなる回路で実現せざるを得ない。これに対して、fmul´演算回路13aやfadd´演算回路13bが搭載するシフト回路は、固定の1レーン分の64ビット(8バイト)をシフトするものであり、より回路が簡単になり,レイテンシが小さく,処理時間を高速化した回路で実現できる。
【0045】
図5に戻って、更に、通信インターフェース10dは、情報処理装置1をLAN(Local Area Network)等のネットワークに接続するためのインターフェースである。
【0046】
そして、表示装置10eは、液晶表示装置等のハードウェアであって、開発者に種々の情報の入力を促すプロンプトを表示する。また、入力装置10fは、キーボードやマウス等のハードウェアである。
【0047】
図6は、プロセッサ10cが備えるレジスタファイル14の模式図である。以下では、AArch64の命令セットをプロセッサ10cが実行する場合を例にして説明する。
【0048】
図6に示すように、レジスタファイル14には、SIMDレジスタ140を複数備える。なお、レジスタファイル14は、図示しないが、プレディケートレジスタやスカラレジスタをそれぞれ複数備える。
【0049】
Armアーキテクチャ(AArch64)に基づくCPUの場合、SIMDレジスタ140のビット長は、CPUを開発するベンダーが128,256,384,512・・・2048の中から1つを選択して実装して良いことになっている。
図6において、SIMDレジスタのビット長は512ビットとなる。そして、1つのSIMDレジスタ140は、64ビットのデータを8個記憶できる。以下では、複数のSIMDレジスタ140の各々を「z0」、「z1」、…「z31」の文字列で識別する。
【0050】
なお、1個のSIMDレジスタ140の中の下位128ビットは、別のレジスタとデータを共有する。別のレジスタのことをvレジスタというものとする。vレジスタが演算に用いられる場合には、レーンを指定したSIMD命令が利用できる。
【0051】
図7は、実施例に係る情報処理装置1の機能構成図である。
図7に示すように、情報処理装置1は、記憶部30と制御部20とを有する。
【0052】
このうち、記憶部30は、実行可能プログラム11を記憶する。一例として、記憶部30は、
図5の記憶装置10aとメモリ10bとにより実現される。なお、実行可能プログラム11は、
図1で示す多項式計算を含むソースプログラム100をコンパイルして得られた機械語のバイナリファイルである。
【0053】
制御部20は、情報処理装置1の各部を制御する処理部である。制御部20の機能は、メモリ10bとプロセッサ10cとが協働して実行可能プログラム11を実行することにより実現される。制御部20は、命令実行部21を有する。命令実行部21は、実行可能プログラム11の実行時に、各命令を実行する処理部である。命令実行部21は、レーンシフト付き演算命令実行部211および演算命令実行部212を有する。なお、命令実行部21は、演算命令以外のAArch64の命令セットに含まれる各命令を実行する。
【0054】
レーンシフト付き演算命令実行部211は、SIMDレジスタ140のレーンシフト付きの演算命令を実行する。例えば、レーンシフト付き演算命令実行部211は、第1の入力データを記憶するレーンを有する第1のSIMDレジスタ140の各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタ140のLSB側のレーンのデータとで演算を実行する。そして、レーンシフト付き演算命令実行部211は、演算した結果を第3のSIMDレジスタ140に格納する。そして、レーンシフト付き演算命令実行部211は、第2のSIMDレジスタ140の各レーンのデータを1レーン分右シフトして第2のSIMDレジスタ140に格納する。ここでいうレーンシフト付き演算命令には、SIMDレーンシフト付きの乗算命令fmul´やSIMDレーンシフト付きの加算命令fadd´が含まれる。
【0055】
演算命令実行部212は、レーンシフト付き演算命令以外の演算命令を実行する。レーンシフト付き演算命令以外の演算命令は、fmulやfaddを含むAArch64の命令セットに含まれる演算命令であれば良い。
【0056】
ここで、実施例に係るSIMDレーンシフト付きの演算命令を用いた実行可能プログラムの一例を、
図8Aおよび
図8Bを参照して説明する。
図8Aおよび
図8Bは、ソースプログラムをコンパイルして得られた機械語の実行可能プログラムの一例を示す図である。
図8Aには、
図1で示したソースプログラム100をコンパイルしてアセンブラ命令に変換したアセンブラ命令列が表されている。ソースプログラム100で示された係数c
0,c
1,c
2,c
3は、c0,c1,c2,c3と表す。また、
図8Bには、アセンブラ命令列で使用される複数のレジスタが示され、各レジスタが保持している値が各アセンブラ命令に対応付けて示されている。
【0057】
まず、1行目では、情報処理装置1は、係数c0,c1,c2,c3をSIMDレジスタz0にロードするSIMD命令を実行する。SIMDレジスタzのサイズが512ビットの場合、SIMDレジスタz0には、64ビットで示される係数c0,c1,c2,c3がこの順で2セット分格納される。すなわち、SIMDレジスタz0には、(c3,c2,c1,c0,c3,c2,c1,c0)が格納されている(
図8B z0参照)。なお,汎用レジスタx2がアドレスを保持するメモリ領域に,あらかじめこのような順序で係数データが格納されているものとする。
【0058】
次に、2行目では、情報処理装置1は、汎用レジスタx3で保持するループカウンタに初期値として「0」を設定する。そして、3行目では、情報処理装置1は、汎用レジスタx0が保持するアドレスのメモリ領域に格納されている入力データを、SIMDレジスタz16にロードする。例えば、変数x3で示されるループカウンタが「0」である場合には、SIMDレジスタz16には、
図1で示す入力データaの配列要素の先頭から8個分(i=0~7)が格納される。
【0059】
そして、4行目では、情報処理装置1は、初期値「0」をSIMDレジスタz24に格納する。
【0060】
次に、5行目では、情報処理装置1は、fadd´を用いて、SIMDレジスタz0に格納された係数c0をSIMDレジスタz24に格納する。すなわち、情報処理装置1は、[SIMDレジスタz24の各レーンの値]+[SIMDレジスタz0のd0(レーン#0)]を加算し、加算結果をSIMDレジスタz24の各レーンに格納する。SIMDレジスタz24には、(c0,c0,c0,c0,c0,c0,c0,c0)が格納される((
図8B z24参照))。加えて、情報処理装置1は、乗算後、SIMDレジスタz0のデータを1レーンだけ右シフトさせる。この結果、SIMDレジスタz0には、(c0,c3,c2,c1,c0,c3,c2,c1)が格納される(
図8B z0参照)。つまり、情報処理装置1は、SIMD命令「fadd´」を使えば、多項式計算に使用する係数「c0」をSIMDレジスタz24に格納でき、係数「c1」をSIMDレジスタz0のLSB側のレーンに格納できる。
【0061】
次に、6行目では、情報処理装置1は、fmul´を用いて、「c1×a」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置1は、配列aのデータが8個格納された[SIMDレジスタz16の各レーンの値]×[係数c1]が格納された[SIMDレジスタz0のd0(レーン#0)]を乗算し、乗算結果をSIMDレジスタz18の各レーンに格納する。SIMDレジスタz18には、(c1×a[8×i+7],・・・,c1×a[8×i+0])(i=0)が格納される(
図8B z18参照)。加えて、情報処理装置1は、乗算後、SIMDレジスタz0のデータを1レーンだけ右シフトさせる。この結果、SIMDレジスタz0には、(c1,c0,c3,c2,c1,c0,c3,c2)が格納される(
図8B z0参照)。つまり、情報処理装置1は、SIMD命令「fmul´」を使うことで、多項式計算の「c1×a」を計算し、多項式計算の次に使用する係数「c2」をSIMDレジスタz0のLSB側のレーンに格納できる。
【0062】
そして、7行目では、情報処理装置1は、faddを用いて、「c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置1は、[SIMDレジスタz24の各レーンの値]+[SIMDレジスタz18の各レーンの値]をそれぞれ加算し、加算結果をSIMDレジスタz24の各レーンに格納する。
【0063】
次に、8,9行目では、情報処理装置1は、fmulおよびfmul´を用いて、「c2×a^2」を計算した結果をSIMDレジスタz18に格納する。すなわち、情報処理装置1は、配列aのデータが8個格納された[SIMDレジスタz16の各レーンの値]を2乗し、乗算結果をSIMDレジスタz17の各レーンに格納する(8行目)。そして、情報処理装置1は、[SIMDレジスタz17の各レーンの値]×[係数c2]が格納された[SIMDレジスタz0のd0(レーン#0)]を乗算し、乗算結果をSIMDレジスタz18の各レーンに格納する。SIMDレジスタz18には、(c2×a[8×i+7]^2,・・・,c2×a[8×i+0]^2)(i=0)が格納される(
図8B z18参照)。加えて、情報処理装置1は、乗算後、SIMDレジスタz0のデータを1レーンだけ右シフトさせる(9行目)。この結果、SIMDレジスタz0には、(c2,c1,c0,c3,c2,c1,c0,c3)が格納される(
図8B z0参照)。つまり、情報処理装置1は、SIMD命令「fmul´」を使うことで、多項式計算の「c2×a^2」を計算し、多項式計算の次に使用する係数「c3」をSIMDレジスタz0のLSB側のレーンに格納できる。
【0064】
そして、10行目では、情報処理装置1は、faddを用いて、「c2×a^2+c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置1は、[SIMDレジスタz24の各レーンの値]+[SIMDレジスタz18の各レーンの値]をそれぞれ加算し、加算結果をSIMDレジスタz24の各レーンに格納する。
【0065】
次に、11,12行目では、情報処理装置1は、fmulおよびfmul´を用いて、「c3×a^3」を計算した結果をSIMDレジスタz18に格納する。すなわち、情報処理装置1は、配列aのデータの2乗が8個格納された[SIMDレジスタz17の各レーンの値]と配列aのデータが8個格納された[SIMDレジスタz16の各レーンの値]とを乗算し、乗算結果をSIMDレジスタz17の各レーンに格納する(11行目)。そして、情報処理装置1は、[SIMDレジスタz17の各レーンの値]×係数c3が格納された[SIMDレジスタz0のd0(レーン#0)]を乗算し、乗算結果をSIMDレジスタz18の各レーンに格納する。SIMDレジスタz18には、(c3×a[8×i+7]^3,・・・,c3×a[8×i+0]^3)(i=0)が格納される(
図8B z18参照)。加えて、情報処理装置1は、乗算後、SIMDレジスタz0のデータを1レーンだけ右シフトさせる(12行目)。この結果、SIMDレジスタz0には、(c3,c2,c1,c0,c3,c2,c1,c0)が格納される(
図8B z0参照)。つまり、情報処理装置1は、SIMD命令「fmul´」を使うことで、多項式計算の「c3×a^3」を計算し、多項式計算のループ後に使用する係数「c0」をSIMDレジスタz0のLSB側のレーンに格納できる。
【0066】
そして、13行目では、情報処理装置1は、faddを用いて、「c3×a^3+c2×a^2+c1×a+c0」を計算した結果をSIMDレジスタz24に格納する。すなわち、情報処理装置1は、[SIMDレジスタz24の各レーンの値]+[SIMDレジスタz18の各レーンの値]をそれぞれ加算し、加算結果をSIMDレジスタz24の各レーンに格納する。
【0067】
そして、14行目では、情報処理装置1は、SIMDレジスタz24に格納された、8個の入力データaに対する計算結果をメモリへストアする。そして、15行目では、情報処理装置1は、汎用レジスタx3で保持するループカウンタの値を8だけ加算する。そして、16,17行目では、情報処理装置1は、次のループ処理のために、入力データをロードするメモリ領域のアドレスx0および計算結果をストアするメモリ領域のアドレスx1を64バイトだけ更新する。そして、18、19行目では、情報処理装置1は、処理済みの配列要素数(変数x3で示されるループカウンタ)が128未満の場合、loopへ戻る。情報処理装置1は、処理済みの配列要素数(汎用レジスタx3で保持されるループカウンタ)が128以上の場合、終了する。
【0068】
このように、情報処理装置1は、係数c0~c3のデータ保持のために、SIMDレジスタ140を1個(z0)だけ使用し、レーンシフト付きSIMD命令を使用して配列に対する多項式計算を実行する。これにより、情報処理装置1は、レーンシフト付きSIMD命令を使用しない場合と比べて、係数格納用のSIMDレジスタ140の数を減らすことができ、効率の良い実行コードを実現できる。
図8Bの例では,SIMDレジスタとしてz0,z16,z17,z18,z24を用いる.これらのSIMDレジスタが,このループ処理の後に使用するデータを保持している場合,このループ処理を開始する前に5個のレジスタが保存されているデータをメモリに一時保存し,このループ処理が終了した後に5個のレジスタのデータをメモリから復帰する必要がある.これは
図2Bと比較して,データの待避と復帰が必要なSIMDレジスタの個数が減っており,データのメモリへの退避と復帰のために実行しなければならない命令が少なくなるので望ましい。
【0069】
また、ループ内で使用するSIMDレジスタ140が減ると、より次数の高い多項式の計算が1つのループで実現できる。また、ループ内で使用するSIMDレジスタ140が減ると、より高速処理可能な命令列に並び替える余地(ループアンローリング、ソフトウェアパイプライニング等のコンパイラによる実行コードの最適化)が増える。
【0070】
次に、実施例に係るレーンシフト付き演算命令実行処理のフローチャートを、
図9を参照して説明する。
図9は、実施例に係るレーンシフト付き演算命令実行処理のフローチャートの一例を示す図である。なお、SIMDレジスタは、512ビットであるとする。そして、第1のSIMDレジスタの各レーンには、例えば、8個のデータが格納されている。第2のSIMDレジスタの各レーンには、例えば、多項式計算で用いられる複数の係数の値が格納されている。
【0071】
図9に示すように、レーンシフト付き演算命令実行部211は、第1のSIMDレジスタの各レーンと、第2のSIMDレジスタのLSB側のレーンとの間で演算する(ステップS10)。そして、レーンシフト付き演算命令実行部211は、演算結果をdst(destination)のSIMDレジスタに格納する(ステップS20)。
【0072】
そして、レーンシフト付き演算命令実行部211は、第2のSIMDレジスタの値を1レーン分シフトして第2のSIMDレジスタに格納する(ステップS30)。
【0073】
例えば、演算がレーンシフト付き加算命令である場合には、レーンシフト付き演算命令実行部211は、
図8Aの5行目のレーンシフト付き演算命令「fadd´ z24.d,z24.d,z0.d」を実行することができる。ここでは、z24が第1ソースオペランドのSIMDレジスタであり、z0が第2ソースオペランドのSIMDレジスタであり、またz24はdestinationのSIMDレジスタでもある。z24には、初期値を示す「0」が8個格納されている。z0には、多項式計算で用いられる係数として(c3,c2,c1,c0,c3,c2,c1,c0)が格納されている。fadd´は、z24の各レーンと、z0のLSB側のレーン(c0)とで加算し、加算結果をz24に格納する(ステップS10,S20)。そして、fadd´は、z0の値を1レーン分シフトしてz0に格納する(ステップS30)。z0には、(c2,c3,c2,c1,c0,c3,c2,c1)が格納される。
【0074】
また、演算がレーンシフト付き乗算命令である場合には、レーンシフト付き演算命令実行部211は、
図8Aの6行目で示される「c1×a」を実行するレーンシフト付き演算命令「fmul´ z18.d,z16.d,z0.d」を実行することができる。ここでは、z16が第1ソースオペランドのSIMDレジスタであり、z0が第2ソースオペランドのSIMDレジスタであり、z18がdestinationオペランドのSIMDレジスタである。z16には、配列aの連続する8個のデータが格納されている。z0には、多項式計算で用いられる係数として(c0,c3,c2,c1,c0,c3,c2,c1)が格納されている。fmul´は、z16の各レーンと、z0のLSB側のレーン(c1)とで乗算し、「c1×a」の乗算結果をz18に格納する(ステップS10,S20)。そして、fmul´は、z0の値を1レーン分シフトしてz0に格納する(ステップS30)。z0には、(c1,c0,c3,c2,c1,c0,c3,c2)が格納される。
【0075】
これにより、レーンシフト付き演算命令実行部211は、さらに、z0の新たなLSB側のレーンの値を用いた多項式計算を実行できる。
【0076】
なお、実施例では、レーンシフト付き演算が乗算および加算である場合を説明したが、これに限定されるものではない。レーンシフト付き演算は、減算、剰余算,積和、論理和、論理積、排他的論理和等の様々な四則演算、論理演算であっても良い。また,SIMDレジスタに格納されているデータは浮動小数点データとして扱ってもよいし,整数データとして扱ってもよい。レーンシフト付き演算が減算である場合には、SIMDレーンシフト付きの減算命令は、例えば「fsub´ z0.d,z1.d,z2.d」と定義すれば良い。また、レーンシフト付き演算が積和である場合には、SIMDレーンシフト付きの積和命令は、例えば「fmad´ z0.d,z1.d,z2.d」と定義すれば良い。積和は、「z0.d=z1.d*z2.d+z1.d」を計算する。また、レーンシフト付き演算が論理和である場合には、SIMDレーンシフト付きの論理和命令は、例えば「orr´ z0.d,z1.d,z2.d」と定義すれば良い。また、レーンシフト付き演算が論理積である場合には、SIMDレーンシフト付きの論理積命令は、例えば「and´ z0.d,z1.d,z2.d」と定義すれば良い。また、レーンシフト付き演算が排他的論理和である場合には、SIMDレーンシフト付きの排他的論理和命令は、例えば「eor´ z0.d,z1.d,z2.d」と定義すれば良い。
【0077】
また、実施例では、レーンシフト付き演算命令実行部211は、第1のSIMDレジスタ140の各レーンの値と、第2のSIMDレジスタのLSB側のレーンの値とで演算を行い、演算結果を第3のSIMDレジスタ140の各レーンに格納する。そして、レーンシフト付き演算命令実行部211は、演算後に、第2のSIMDレジスタ140の各レーンの値を1レーン分右シフトして第2のSIMDレジスタ140に格納すると説明した。しかしながら、レーンシフト付き演算命令実行部211は、右シフトを左シフトとしても良い。すなわち、レーンシフト付き演算命令実行部211は、演算後に、第2のSIMDレジスタ140の各レーンの値を1レーン分左シフトして第2のSIMDレジスタ140に格納しても良い。
【0078】
また、実施例では、レーンシフト付き演算命令実行部211は、第1のSIMDレジスタ140の各レーンの値と、第2のSIMDレジスタのLSB側のレーンの値とで演算を行い、演算結果を第3のSIMDレジスタ140の各レーンに格納すると説明した。しかしながら、レーンシフト付き演算命令実行部211は、第2のSIMDレジスタのLSB側のレーンの代わりに、LSB側以外の特定のレーンを使用しても良い。
【0079】
ここで、レーンシフト付き演算命令実行部211は、第2のSIMDレジスタのLSB側のレーンの代わりに、LSB側以外の特定のレーンを使用する変形例について説明する。ここでは、演算の一例として乗算を適用して説明する。
図10は、実施例に係るSIMDレーンシフト付きの乗算命令の変形例を示す図である。
図10では、レーンシフト付き演算命令実行部211が、MSB側のレーンを使用する場合について説明する。
図10に示すSIMDレーンシフト付きの乗算命令は、「fmul´ z0.d,z1.d,z2.d」と定義する。SIMDレジスタz1は、各レーンに被乗数を記憶する。SIMDレジスタz2は、各レーンに乗数を記憶する。SIMDレジスタz0は、destinationのレジスタである。
【0080】
SIMDレーンシフト付きの乗算命令fmul´は、[SIMDレジスタz1の各レーンの値]×[SIMDレジスタz2のd7(レーン#7)]を乗算し、乗算結果をSIMDレジスタz0の各レーンに格納する。加えて、fmul´は、乗算後、SIMDレジスタz2のデータを1レーンだけ右シフトさせる。すなわち、SIMDレジスタz2の#i(i=0~6)番目のレーンには、#(i+1)番目のレーンの値が格納される。7番目(MSB側)のレーンには、0番目(LSB側)のレーンの値が格納される。なお、SIMDレジスタz1の各レーンの値は、変更されない。
【0081】
これにより、
図1で示す多項式計算の係数c0,c1,c2,c3について、予め、SIMDレジスタz2に(c3,c2,c1,c0,c3,c2,c1,c0)が格納されれば、多項式計算を含むソースプログラム100は、効率の良い実行コードを実現することが可能である。
【0082】
また、実施例では、レーンシフト付き演算命令実行部211は、第1のSIMDレジスタ140の各レーンの値と、第2のSIMDレジスタの予め定めた特定のレーンの値とで演算を行い、演算結果を第3のSIMDレジスタ140の各レーンに格納する。そして、レーンシフト付き演算命令実行部211は、演算後に、第2のSIMDレジスタ140の各レーンの値を1レーン分シフトして第2のSIMDレジスタ140に格納すると説明した。しかしながら、レーンシフト付き演算命令実行部211は、第2のSIMDレジスタの特定のレーンの代わりに、指定されるレーンを使用しても良い。但し、指定可能なレーンは、「0」または「1」に限られる。これは、Armアーキテクチャの64ビットモードのCPUの命令は、32ビットで構成されるが、32ビットの構成の中に、レーンを指定するビットが1ビットしか確保できないからである(
図14参照)。したがって、指定可能なレーンは、「0」または「1」に限られる。指定レーンシフト付き演算が乗算である場合には、SIMDレーンの指定レーンシフト付きの乗算命令は、例えば「fmul´ z0.d,z1.d,z2.d[n]」(n=0 or 1)と定義すれば良い。
【0083】
[実施例の効果]
上記実施例によれば、情報処理装置1は、第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、情報処理装置1は、演算した結果を、第3のSIMDレジスタに格納し、第2のSIMDレジスタの各レーンのデータを1レーン分シフトして第2のSIMDレジスタに格納する、SIMD命令の処理を実行する。かかる構成によれば、情報処理装置1は、SIMD命令を用いることで、効率的な実行コードを実現できる。
【0084】
また、上記実施例によれば、第2のSIMDレジスタの特定のレーンは、SIMD命令で規定される。これにより、Armアーキテクチャにおける256ビット以上のSIMDレジスタの場合であっても、第1のSIMDレジスタの各要素と第2のSIMDレジスタの特定のレーンのデータとの演算を実施することができる。
【0085】
また、上記実施例によれば、第2のSIMDレジスタのシフトは、1レーン分の固定の長さをシフトする回路を用いる。これにより、情報処理装置1は、任意の長さをシフトする回路と比べてシフト処理の処理時間が高速化された演算回路を実現できる。
【0086】
また、上記実施例によれば、演算は、加算演算、減算演算、乗算演算、除算演算,剰余演算,積和演算および論理演算を含む。これにより、情報処理装置1は、レーンシフト付き演算命令を各種演算に用いることで、さらに、効率的な実行コードを実現できる。
【0087】
また、上記実施例によれば、情報処理装置1は、演算する処理について、配列に対する多項式計算において、第1のSIMDレジスタのビット長に応じた配列の個数のデータをそれぞれレーンに記憶する第1のSIMDレジスタの各レーンと、多項式計算で用いられる複数の係数をそれぞれレーンに記憶する第2のSIMDレジスタの特定のレーンとの間で演算する。そして、情報処理装置1は、格納する処理について、第2のSIMDレジスタの各レーンのデータを1レーン分シフトして第2のSIMDレジスタに格納する。これにより、情報処理装置1は、多項式計算で用いられる複数の係数を1つのSIMDレジスタ(第2のSIMDレジスタ)に格納しておくことで、順番に複数の項の計算を実現できるようになり、SIMDレジスタの必要な個数が削減できる。この結果、情報処理装置1は、配列に対する多項式計算について、効率の良い実行コードを実現できるようになる。
【0088】
[その他]
なお、図示した情報処理装置1の各構成要素は、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、情報処理装置1の分散・統合の具体的態様は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。また、記憶部30を情報処理装置1の外部装置としてネットワーク経由で接続するようにしても良い。
【0089】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【0090】
(付記1)第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
SIMD命令の処理を実行することを特徴とするプロセッサ。
【0091】
(付記2)前記第2のSIMDレジスタの特定のレーンは、前記SIMD命令で規定される
ことを特徴とする付記1に記載のプロセッサ。
【0092】
(付記3)前記第2のSIMDレジスタのシフトは、1レーン分の固定のビット長をシフトする回路を用いる
ことを特徴とする付記1に記載のプロセッサ。
【0093】
(付記4)前記演算は、加算演算、減算演算、乗算演算、除算演算,剰余演算,積和演算および論理演算を含む
ことを特徴とする付記1に記載のプロセッサ。
【0094】
(付記5)前記演算する処理は、配列に対する多項式計算において、前記第1のSIMDレジスタのビット長に応じた前記配列の個数のデータをそれぞれレーンに記憶する前記第1のSIMDレジスタの各レーンと、前記多項式計算で用いられる複数の係数をそれぞれレーンに記憶する前記第2のSIMDレジスタの前記特定のレーンとの間で演算し、
前記格納する処理は、前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
ことを特徴とする付記1に記載のプロセッサ。
【0095】
(付記6)配列に対する多項式計算において、データを記憶するレーンを有する第1のSIMDレジスタのビット長に応じた前記配列の個数のデータをそれぞれレーンに記憶する前記第1のSIMDレジスタの各レーンと、前記多項式計算で用いられる複数の係数をそれぞれレーンに記憶する第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
処理をプロセッサに実行させることを特徴とする命令実行プログラム。
【0096】
(付記7)第1の入力データを記憶するレーンを有する第1のSIMDレジスタと、
第2の入力データを記憶するレーンを有する第2のSIMDレジスタと、
第3のSIMDレジスタと、
制御部と、を有し、
前記制御部は、
前記第1のSIMDレジスタの各レーンと、前記第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、前記第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
SIMD命令の処理を実行することを特徴とする情報処理装置。
【0097】
(付記8)第1の入力データを記憶するレーンを有する第1のSIMDレジスタの各レーンと、第2の入力データを記憶するレーンを有する第2のSIMDレジスタの特定のレーンとの間で演算し、
該演算した結果を、第3のSIMDレジスタに格納し、
前記第2のSIMDレジスタの各レーンのデータを1レーン分シフトして前記第2のSIMDレジスタに格納する
SIMD命令の処理をプロセッサが実行することを特徴とする命令実行方法。