JP2015219823A - プロセッサ - Google Patents

プロセッサ Download PDF

Info

Publication number
JP2015219823A
JP2015219823A JP2014104456A JP2014104456A JP2015219823A JP 2015219823 A JP2015219823 A JP 2015219823A JP 2014104456 A JP2014104456 A JP 2014104456A JP 2014104456 A JP2014104456 A JP 2014104456A JP 2015219823 A JP2015219823 A JP 2015219823A
Authority
JP
Japan
Prior art keywords
data
value
register
simd
8simd
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.)
Pending
Application number
JP2014104456A
Other languages
English (en)
Inventor
真紀子 伊藤
Makiko Ito
真紀子 伊藤
充 伴野
Mitsuru Banno
充 伴野
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.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
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 Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2014104456A priority Critical patent/JP2015219823A/ja
Publication of JP2015219823A publication Critical patent/JP2015219823A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Advance Control (AREA)
  • Executing Machine-Instructions (AREA)
  • Complex Calculations (AREA)

Abstract

【課題】命令メモリに格納するプログラムのサイズを小さくすることができるプロセッサを提供することを課題とする。【解決手段】プロセッサは、複数データを記憶するレジスタ(vd0)と、ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラ(111)とを有する。【選択図】図1

Description

本発明は、プロセッサに関する。
1つのベクトル命令により配列データに対して複数の演算を実行する演算処理装置が知られている(特許文献1参照)。第1マスク格納部は、複数の演算に対して、それぞれ有効又は無効な演算を指定する第1マスクデータを格納する。第2マスク格納部は、複数の演算に対して、連続して有効になる数を指定する第2マスクデータを格納する。
特開2013−186547号公報
プロセッサは、プログラムを実行することにより処理を行う。ループ処理内において、1サイクルの演算により、レジスタ内の一部のデータのみが格納された場合、次回のサイクルの演算により、レジスタ内の他部のデータを書き込む。レジスタ内のすべてのデータが格納された状態で、レジスタのデータをメモリにストアする。この場合、各ループ処理において、レジスタのデータをストアするには、2サイクル分の演算が必要になるため、命令メモリに格納するプログラムのサイズが大きくなってしまう。
本発明の目的は、命令メモリに格納するプログラムのサイズを小さくすることができるプロセッサを提供することである。
プロセッサは、複数データを記憶するレジスタと、ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラとを有する。
マスク値を用いることにより、ループ処理内の命令数を減らすことができるので、命令メモリに格納するプログラムのサイズを小さくすることができる。
図1は、本実施形態による処理システムの構成例を示す図である。 図2(A)〜(D)は、レジスタのデータフォーマットを示す図である。 図3(A)及び(B)は、プロセッサがSIMD加算命令を実行する例を示す図である。 図4(A)〜(C)は、プロセッサがSIMD命令を処理する例を示す図である。 図5(A)及び(B)は、プロセッサがSIMD命令を処理する例を示す図である。 図6(A)〜(C)は、本実施形態によるプロセッサがSIMD命令を処理する例を示す図である。 図7(A)〜(H)は、マスクレジスタのマスク値を示す図である。 図8(A)及び(B)は、マスク値を生成するための回路の構成例を示す図である。 図9(A)〜(C)は、マスクレジスタの値を更新するための回路の構成例を示す図である。 図10(A)〜(C)は、マスク値を生成するための他の回路の構成例を示す図である。 図11は、データ位置レジスタの値を更新するための回路の構成例を示す図である。 図12(A)及び(B)は、本実施形態によるプロセッサがSIMD命令を処理する他の例を示す図である。 図13は、本実施形態によるプロセッサがSIMD命令を処理する他の例を示す図である。
図1は、本実施形態による処理システムの構成例を示す図である。処理システムは、プロセッサ101、命令ランダムアクセスメモリ(命令RAM)102及びデータランダムアクセスメモリ(データRAM)103を有する。プロセッサ101は、単一命令複数データ処理(SIMD:Single Instruction Multiple Data)プロセッサであり、1命令で複数のデータを処理することができる。処理システムは、無線通信処理又は動画像のデコードなど、大量のデータを高速に処理することができる。命令RAM102は、命令(プログラム)を記憶する。データRAM103は、データを記憶する。プロセッサ101は、命令RAM102内の命令を読み出し、読み出した命令に従った処理を行い、データRAM103に対してデータのロード又はストアを行う。
プロセッサ101は、命令フェッチユニット104、デコーダ107、アドレスレジスタファイルユニット108、コントローラ111、ベクトルレジスタファイルユニット113、算術論理演算ユニット(ALU:Arithmetic and Logic Unit)114、バス115及びレジスタvs0,vs1,vt0,vt1,vd0,vd1を有する。命令フェッチユニット104は、ループバッファ105及びプログラムカウンタ値記憶部106を有する。アドレスレジスタファイルユニット108は、アドレスレジスタファイル109を有する。アドレスレジスタファイル109は、複数のインデックスのアドレスレジスタを有する。コントローラ111は、マスクレジスタファイル112を有する。マスクレジスタファイル112は、複数のインデックスのマスクレジスタを有する。ベクトルレジスタファイルユニット113は、ベクトルレジスタファイル116を有する。ベクトルレジスタファイル116は、複数のインデックスのベクトルレジスタを有する。各ベクトルレジスタは、例えば128ビット長のレジスタである。
プログラムカウンタ値記憶部106は、プログラムカウンタ値を記憶する。命令フェッチユニット104は、プログラムカウンタ値記憶部106に記憶されているプログラムカウンタ値が示すアドレスの命令を命令RAM102から読み出し、読み出した命令をデコーダ107に出力する。命令フェッチユニット104は、読み出した命令がループ命令である場合には、その読み出した命令をループバッファ105に書き込む。ループ命令は、複数回繰り返し実行される命令である。命令フェッチユニット104は、2回目以降のループ処理では、命令RAM102から命令を読み出さず、ループバッファ105に記憶されている命令をデコーダ107に出力する。ループバッファ105を用いることにより、命令RAM102に対するアクセス数が減り、消費電力を削減することができる。なお、ループバッファ105は、なくてもよい。
デコーダ107は、命令をデコードし、制御信号をアドレスレジスタファイルユニット108、コントローラ111、ベクトルレジスタファイルユニット113及びALU114に出力する。
アドレスレジスタファイルユニット108は、デコーダ107の制御により、アドレスレジスタファイル109の指定インデックスのアドレスレジスタに記憶されているアドレスADRをデータRAM103に出力する。また、アドレスレジスタファイルユニット108は、デコーダ107の制御により、アドレスレジスタファイル109の2個の指定インデックスのアドレスレジスタに記憶されている値as及びatをコントローラ111に出力する。コントローラ110は、値as及びatを比較する。
コントローラ111は、デコーダ107の制御により、マスクレジスタファイル112の指定インデックスのマスクレジスタに記憶されているマスク値を基に、書き込み制御信号vd0_wen及びvd1_wenをベクトルレジスタファイルユニット113に出力し、ロードイネーブル信号ENL及びストアイネーブル信号ENSをデータRAM103に出力する。書き込み制御信号vd0_wenは、レジスタvd0に対する書き込み制御信号である。書き込み制御信号vd1_wenは、レジスタvd1に対する書き込み制御信号である。
ベクトルレジスタファイルユニット113は、デコーダ107の制御により、ベクトルレジスタファイル116の指定インデックスのベクトルレジスタに記憶されているデータをレジスタvs0,vs1,vt0及び/又はvt1に書き込み、レジスタvd0及び/又はvd1に記憶されているデータをベクトルレジスタファイル116の指定インデックスのベクトルレジスタに書き込む。
複数のALU114は、それぞれ、レジスタvs0,vs1,vt0又はvt1に記憶されているデータを選択的に入力し、入力したデータに対して算術演算又は論理演算を行い、バス115を介して、データRAM103又はレジスタvd0,vd1に出力する。
データRAM103のサイズの制約が厳しく、必要最小限のビット精度でデータを取り扱うことが多い。そのため、16ビット精度のデータや32ビット精度のデータが混在するケースも多い。例えば、ALU114は、2個の16ビットのデータの乗算を行い、32ビットの乗算結果を出力することがある。また、信号処理では、複素数データを扱うことも多く、16ビット複素数データと16ビット実数データが混在することもある。
プロセッサ101では、並列処理できるデータ数は、ベクトルレジスタファイル116内の各ベクトルレジスタのビット幅によって決まる。例えば、ベクトルレジスタのビット幅が128ビットの場合、並列処理できるデータ数は、図2(A)のように16ビット精度であれば8データとなり、図2(B)のように32ビット精度であれば4データとなる。また、並列処理できるデータ数は、図2(C)のように、16ビット精度の実数部及び16ビット精度の虚数部を有する複素数であれば4データとなる。また、並列処理できるデータ数は、図2(D)のように、32ビット精度の実数部及び32ビット精度の虚数部を有する複素数であれば2データとなる。
図3(A)は、プロセッサ101が16ビットデータのSIMD加算命令ADD8X16を実行する例を示す図である。レジスタvs0は、16ビット×8個のデータを記憶する。レジスタvt0は、16ビット×8個のデータを記憶する。ALU114は、レジスタvs0の16ビット×8個のデータとレジスタvt0の16ビット×8個のデータを並列に加算し、加算結果の16ビット×8個のデータをレジスタvd0に出力する。
図3(B)は、プロセッサ101が32ビットデータのSIMD加算命令ADD4X32を実行する例を示す図である。レジスタvs0は、32ビット×4個のデータを記憶する。レジスタvt0は、32ビット×4個のデータを記憶する。ALU114は、レジスタvs0の32ビット×4個のデータとレジスタvt0の32ビット×4個のデータを並列に加算し、加算結果の32ビット×4個のデータをレジスタvd0に出力する。
図4(A)はSIMD化されていないプログラムを示す図であり、図4(B)は図4(A)のプログラムをSIMD命令のプログラムに変換したプログラムを示す図である。図4(B)のプログラムが命令RAM102に記憶され、プロセッサ101により実行される。図4(C)は、プロセッサ101が図4(B)のプログラムを処理する例を示す図である。プロセッサ101は、データRAM103からデータx0〜x3,y0〜y3をロードし、データva0〜va3,vb0〜vb3として入力する。ALU114は、32ビット×4個のデータva0〜va3と32ビット×4個のデータvb0〜vb3のデータに対して所定のオペレーションを行い、32ビット×4個のデータvw0〜vw3を出力する。次に、ALU114は、32ビット×4個のデータvw0〜vw3を16ビット×4個のデータvc0〜vc3に変換する。プロセッサ101は、データRAM103に対して、ベクトルレジスタファイル116内のベクトルレジスタのビット幅の128ビット単位でデータをストアする。しかし、16ビット×4個(=64ビット)のデータvc0〜vc3は、128ビットに満たないので、ストア命令401において効率的なストアができない。
図5(A)は、図4(B)に対応し、128ビット長のデータをストアするためのSIMD命令のプログラムを示す図である。図5(B)は、プロセッサ101が図5(A)のプログラムを処理する例を示す図である。命令群501では、プロセッサ101は、データRAM103からデータx0〜x3,y0〜y3をロードし、データva0〜va3,vb0〜vb3として入力する。そして、ALU114は、32ビット×4個のデータx0〜x3と32ビット×4個のデータy0〜y3に対して所定のオペレーションを行い、32ビット×4個のデータvw0〜vw3を出力する。次に、命令群502では、プロセッサ101は、データRAM103からデータx4〜x7,y4〜y7をロードし、データva0〜va3,vb0〜vb3として入力する。そして、ALU114は、32ビット×4個のデータx4〜x7と32ビット×4個のデータy4〜y7に対して所定のオペレーションを行い、32ビット×4個のデータvu0〜vu3を出力する。次に、命令503では、ALU114は、32ビット×8個のデータvw0〜vw3及びvu0〜vu3を16ビット×8個のデータvc0〜vc7に変換する。次に、ストア命令504では、16ビット×8個(=128ビット)のデータvc0〜vc7をデータRAM103にストアする。図5(A)のプログラムは、図4(B)のプログラムに対して、命令群502が追加されるため、プログラムのサイズが大きくなる。そのため、プログラムのサイズが命令RAM102の容量を超えてしまったり、大容量の命令RAM102が必要になる課題が生じる。そこで、プログラムのサイズを小さくすることが望まれている。
図6(A)は、本実施形態によるSIMD命令のプログラムを示す図であり、図6(B)及び(C)は、プロセッサ101が図6(A)のプログラムを処理する例を示す図である。ループ命令601は、変数iが0からNまで複数回のループ処理を行う。図6(B)はループ処理が奇数回目の処理を示す図であり、図6(C)はループ処理が偶数回目の処理を示す図である。なお、図6(A)のプログラム中の「m」は、マスクレジスタファイルのインデックス番号を示す。8SIMD命令は、16ビット×8個のデータのSIMD命令である。4SIMD命令は、32ビット×4個のデータのSIMD命令である。
1回目のループ処理では、図6(B)に示すように、8SIMD命令用マスク値は「00001111」に設定され、4SIMD命令用マスク値は「1111」に設定される。これらのマスク値は、図1のマスクレジスタファイル112に記憶される。命令602では、プロセッサ101は、データRAM103からデータx0〜x3をロードし、データva0〜va3として入力する。命令603では、プロセッサ101は、データRAM103からデータy0〜y3をロードし、データvb0〜vb3として入力する。命令604では、ALU114は、32ビット×4個のデータva0〜va3と32ビット×4個のデータvb0〜vb3に対して所定のオペレーションを行う。そして、ALU114は、8SIMD命令用マスク値が「00001111」に設定されているので、オペレーション結果の32ビット×4個のデータを16ビット×4個のデータに変換し、下位半分の16ビット×4個のデータvc0〜vc3として設定する。次に、ストア命令605では、8SIMD命令用マスク値「00001111」の左端ビットが0であるので、データvc0〜vc3のストアを行わない。
次に、ループ処理は、1回目から2回目に繰り越す。この際、図6(C)に示すように、8SIMD命令用マスク値は「11110000」に更新され、4SIMD命令用マスク値は「1111」に更新される。
2回目のループ処理では、図6(C)に示す処理を行う。命令602では、プロセッサ101は、データRAM103からデータx0〜x3をロードし、データva0〜va3として入力する。命令603では、プロセッサ101は、データRAM103からデータy0〜y3をロードし、データvb0〜vb3として入力する。命令604では、ALU114は、32ビット×4個のデータva0〜va3と32ビット×4個のデータvb0〜vb3に対して所定のオペレーションを行う。そして、ALU114は、8SIMD命令用マスク値が「11110000」に設定されているので、オペレーション結果の32ビット×4個のデータを16ビット×4個のデータに変換し、上位半分の16ビット×4個のデータvc4〜vc7として設定する。次に、ストア命令605では、8SIMD命令用マスク値「11110000」の左端ビットが1であるので、128ビットのデータvc0〜vc7をデータRAM103にストアする。
次に、ループ処理は、2回目から3回目に繰り越す。この際、図6(B)に示すように、8SIMD命令用マスク値は「00001111」に更新され、4SIMD命令用マスク値は「1111」に更新される。
同様に、3回目のループ処理では、図6(B)の処理を行い、4回目のループ処理では、図6(C)の処理を行う。以上のように、奇数回目のループ処理では図6(B)の処理を行い、偶数回目のループ処理では図6(C)の処理を行う。図6(B)の奇数回目のループ処理では、64ビットデータvc0〜vc3が128ビットに満たないので、ストアを行わない。これに対し、図6(C)の偶数回目のループ処理では、128ビットデータvc0〜vc7が揃ったので、ストアを行う。これにより、プロセッサ101がデータRAM103にアクセスする回数を減らし、消費電力を低減することができる。
なお、ループ回数が偶数回数である場合には、図6(C)の処理でループ処理が終了するので、すべてのデータvc0〜vc7をストアして、終了する。これに対し、ループ回数が奇数回数である場合には、図6(B)の処理でループ処理が終了するので、データvc0〜vc3がストアされずに、ループ命令の処理が終了してしまう。そこで、ループ命令601の後、ストア命令606では、ループ回数が奇数回数である場合には、未ストアデータvc0〜vc3をデータRAM103にストアする。
以上の処理により、図6(A)のプログラムは、図5(A)のプログラムに対して、サイズが小さくなる。そのため、本実施形態によれば、プログラムを命令RAM102に格納することが可能になる。また、命令RAM102の容量を小さくすることができる。また、ループバッファ105が存在するプロセッサ101では、ループ内の命令数が少なくなると、ループバッファ105にヒットしやすくなり、プロセッサ101が命令RAM102へアクセスする回数が減るので、消費電力を低減することができる。
図7(A)〜(H)は、上記のマスクレジスタのマスク値の更新方法を示す図である。図7(A)〜(C)は並列処理データ数SIMD_WIDTHが2の場合を示す図であり、図7(D)及び(E)は並列処理データ数SIMD_WIDTHが4の場合を示す図であり、図7(F)〜(H)は並列処理データ数SIMD_WIDTHが1の場合を示す図である。
図6(A)の命令600では、図7(D)及び(E)に示すように、ループ処理内で処理するデータ数(並列処理データ数)SIMD_WIDTHが4であることを指定している。
図7(D)は、図6(B)及び(C)に示した8SIMD命令用マスク値の更新例を示す。奇数回目のループ処理(図6(B))では、8SIMD命令用マスク値は、「00001111」に設定される。偶数回目のループ処理(図6(C))では、8SIMD命令用マスク値は、「11110000」に設定される。上記の2種類のマスク値の間を交互に遷移する。
図7(E)は、図6(B)及び(C)に示した4SIMD命令用マスク値の更新例を示す。奇数回目のループ処理(図6(B))では、4SIMD命令用マスク値は、「1111」に設定される。偶数回目のループ処理(図6(C))では、4SIMD命令用マスク値は、「1111」に設定される。すなわち、マスク値は変わらない。
図7(A)〜(C)は、並列処理データ数SIMD_WIDTHが2の場合を示す図である。図7(A)は、8SIMD命令用マスク値の更新例を示す。1回目のループ処理では、8SIMD命令用マスク値は、「00000011」に設定される。2回目のループ処理では、8SIMD命令用マスク値は、「00001100」に設定される。3回目のループ処理では、8SIMD命令用マスク値は、「00110000」に設定される。4回目のループ処理では、8SIMD命令用マスク値は、「11000000」に設定される。上記の4種類のマスク値の間を巡回して遷移する。
図7(B)は、4SIMD命令用マスク値の更新例を示す。1回目のループ処理では、4SIMD命令用マスク値は、「0011」に設定される。2回目のループ処理では、4SIMD命令用マスク値は、「1100」に設定される。3回目のループ処理では、4SIMD命令用マスク値は、「0011」に設定される。4回目のループ処理では、4SIMD命令用マスク値は、「1100」に設定される。上記の2種類のマスク値の間を交互に遷移する。
図7(C)は、2SIMD命令用マスク値の更新例を示す。2SIMD命令は、64ビット×2個のデータのSIMD命令である。2SIMD命令用マスク値は、常に「11」であり、変わらない。
図7(F)〜(H)は、並列処理データ数SIMD_WIDTHが1の場合を示す図である。図7(F)は、8SIMD命令用マスク値の更新例を示す。8SIMD命令用マスク値は、「00000001」、「00000010」、「00000100」、「00001000」、「00010000」、「00100000」、「01000000」、「10000000」の間を巡回して遷移する。
図7(G)は、4SIMD命令用マスク値の更新例を示す。4SIMD命令用マスク値は、「0001」、「0010」、「0100」、「1000」の間を巡回して遷移する。
図7(H)は、2SIMD命令用マスク値の更新例を示す。2SIMD命令用マスク値は、「01」、「10」の間を巡回して遷移する。
以上のように、マスクレジスタには、最下位ビット側から指定した並列処理データ数だけ1を格納し、残りに0を格納する。ループ命令にて、ループ処理を繰り越す際に、指定された並列処理データ数だけ左側(最上位ビット側)にローテーションする。
なお、ループ命令601は、ループ処理開始時に、開始アドレス、終了アドレス、ループ回数を専用レジスタに保存し、終了アドレスに到達すると、ループ回数が1以上の場合は、ループ回数を1つ減らし、開始アドレスに分岐する命令である。ループ回数が0になると、ループ処理が終了する。
本実施形態では、ループ処理内で処理するデータ数を指定する命令600を用いる。命令600は、「set_loop_simd_width(n)」である。nは、データ数を表す。命令600では、nが4である。この命令により、8SIMD命令用のマスクレジスタMR_8SIMDm、4SIMD命令用のマスクレジスタMR_4SIMDm、2SIMD命令用のマスクレジスタMR_2SIMDmには、それぞれ次式の値がセットされる。ここでは、データ数nは、1,2,4のいずれかである。
MR_8SIMDm = (n == 1)? 8'b00000001 : (n==2)? 8'b00000011 : 8'b00001111;
MR_4SIMDm = (n == 1)? 4'b0001 : (n==2)? 4'b0011 : 4'b1111;
MR_2SIMDm = (n == 1)? 2'b01 : 2'b11;
LOOP_SIMD_NUMm = n;
すなわち、マスクレジスタMR_8SIMDmの値は、nが1の場合には「00000001」になり、nが2の場合には「00000011」になり、nが4の場合には「00001111」になる。マスクレジスタMR_4SIMDmの値は、nが1の場合には「0001」になり、nが2の場合には「0011」になり、nが4の場合には「1111」になる。マスクレジスタMR_2SIMDmの値は、nが1の場合には「01」になり、nが2の場合には「11」になる。また、レジスタLOOP_SIMD_NUMmには、nがセットされる。なお、レジスタLOOP_SIMD_NUMmを使用せず、マスクレジスタMR_8SIMDmの値が「1」であるビット数をカウントし、nの値を得るようにしてもよい。
また、4SIMD用のマスクレジスタMR_4SIMDmのマスク値、及び2SIMD用のマスクレジスタMR_2SIMDmのマスク値は、8SIMD用のマスクレジスタMR_8SIMDmのマスク値を基に求めることもできる。その場合、マスクレジスタMR_4SIMDm及びMR_2SIMDmは使用せず、4SIMDのマスク値及び2SIMDのマスク値は、次式のように、8SIMD用のマスクレジスタMR_8SIMDのマスク値を用いて求めることができる。以下、mを省略して示す。なお、「|」の記号は、論理和(OR)を示す。
4SIMDのマスク値 =
[ (MR_8SIMD[0] | MR_8SIMD[4]), (MR_8SIMD[1] | MR_8SIMD[5]),
(MR_8SIMD[2] | MR_8SIMD[6]), (MR_8SIMD[3] | MR_8SIMD[7]) ]
2SIMDのマスク値 =
[ (MR_8SIMD[0] | MR_8SIMD[2] | MR_8SIMD[4] | MR_8SIMD[6] ),
(MR_8SIMD[1] | MR_8SIMD[3] | MR_8SIMD[5] | MR_8SIMD[7] )]
図8(A)は、上式の4SIMDのマスク値を生成するための回路の構成例を示す図である。MR_8SIMD[0]〜MR_8SIMD[7]は、8ビットのマスクレジスタMR_8SIMDの各ビット値を示す。論理和(OR)回路801は、ビット値MR_8SIMD[7]及びMR_8SIMD[3]の論理和を4SIMDのマスク値の3ビット目の値として出力する。論理和回路802は、ビット値MR_8SIMD[6]及びMR_8SIMD[2]の論理和を4SIMDのマスク値の2ビット目の値として出力する。論理和回路803は、ビット値MR_8SIMD[5]及びMR_8SIMD[1]の論理和を4SIMDのマスク値の1ビット目の値として出力する。論理和回路804は、ビット値MR_8SIMD[4]及びMR_8SIMD[0]の論理和を4SIMDのマスク値の0ビット目の値として出力する。
図8(B)は、上式の2SIMDのマスク値を生成するための回路の構成例を示す図である。論理和回路811は、ビット値MR_8SIMD[7]、MR_8SIMD[5]、MR_8SIMD[3]及びMR_8SIMD[1]の論理和を2SIMDのマスク値の1ビット目の値として出力する。論理和回路812は、ビット値MR_8SIMD[6]、MR_8SIMD[4]、MR_8SIMD[2]及びMR_8SIMD[0]の論理和を2SIMDのマスク値の0ビット目の値として出力する。
次に、ループ命令601に対して、ループ処理の繰り越し時にマスク値を更新する方法を説明する。ループ命令は、ループ命令601に限定されず、例えば、「loop cnt, addr」のように、ループ制御レジスタに値を格納する命令である。ループ制御レジスタは、ループ開始アドレスレジスタLOOP_START、ループ終了アドレスレジスタLOOP_END及びループ回数レジスタLOOP_COUNTを有する。ループ終了アドレスレジスタLOOP_ENDには、ループ終了アドレスaddrが格納される。ループ回数レジスタLOOP_COUNTには、ループ回数cntが格納される。
プロセッサ101は、次のプログラムカウンタ値がループ終了アドレスレジスタLOOP_ENDと同じになる場合、ループ回数レジスタLOOP_COUNTの値が0より大きければ、ループ回数レジスタLOOP_COUNTの値を1つ減らし、ループ開始アドレスレジスタLOOP_STARTに格納されているアドレスに分岐する。
本実施形態では、プロセッサ101は、ループ終了アドレスレジスタLOOP_ENDに格納されているアドレスからループ開始アドレスレジスタLOOP_STARTに格納されているアドレスに分岐するときに、マスクレジスタMR_8SIMDm、MR_4SIMDm及びMR_2SIMDmの値を次式のように更新する。
MR_8SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_8SIMDm [6:0], MR_8SIMDm [7] ] :
(LOOP_SIMD_NUM m==2)? [ MR_8SIMDm [5:0], MR_8SIMDm [7:6] ] :
[ MR_8SIMDm [3:0], MR_8SIMDm [7:4] ];
MR_4SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_4SIMDm [2:0], MR_8SIMDm [3] ]:
(LOOP_SIMD_NUMm ==2)? [ MR_4SIMDm [1:0], MR_8SIMDm [3:2] ]:
MR_4SIMDm;
MR_2SIMDm = (LOOP_SIMD_NUMm == 1)? [ MR_2SIMDm [0], MR_2SIMDm [1] ]:
MR_2SIMDm;
図9(A)は、上式のマスクレジスタMR_8SIMDの値を更新するための回路の構成例を示す図である。セレクタ901は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[7]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[6]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[4]の値を選択し、選択した値を新たなビット値MR_8SIMD[0]として更新する。
セレクタ902は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[7]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[5]の値を選択し、選択した値を新たなビット値MR_8SIMD[1]として更新する。
セレクタ903は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[6]の値を選択し、選択した値を新たなビット値MR_8SIMD[2]として更新する。
セレクタ904は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[7]の値を選択し、選択した値を新たなビット値MR_8SIMD[3]として更新する。
セレクタ905は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[0]の値を選択し、選択した値を新たなビット値MR_8SIMD[4]として更新する。
セレクタ906は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[4]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[1]の値を選択し、選択した値を新たなビット値MR_8SIMD[5]として更新する。
セレクタ907は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[5]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[4]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[2]の値を選択し、選択した値を新たなビット値MR_8SIMD[6]として更新する。
セレクタ908は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_8SIMD[6]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_8SIMD[5]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_8SIMD[3]の値を選択し、選択した値を新たなビット値MR_8SIMD[7]として更新する。
図9(B)は、上式のマスクレジスタMR_4SIMDの値を更新するための回路の構成例を示す図である。MR_4SIMD[0]〜MR_4SIMD[3]は、4ビットのマスクレジスタMR_4SIMDの各ビット値を示す。
セレクタ911は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_4SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_4SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_4SIMD[0]の値を選択し、選択した値を新たなビット値MR_4SIMD[0]として更新する。
セレクタ912は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_4SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_4SIMD[3]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_4SIMD[1]の値を選択し、選択した値を新たなビット値MR_4SIMD[1]として更新する。
セレクタ913は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_4SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_4SIMD[0]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_4SIMD[2]の値を選択し、選択した値を新たなビット値MR_4SIMD[2]として更新する。
セレクタ914は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値MR_4SIMD[2]の値を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値MR_4SIMD[1]の値を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値MR_4SIMD[3]の値を選択し、選択した値を新たなビット値MR_4SIMD[3]として更新する。
図9(C)は、上式のマスクレジスタMR_2SIMDの値を更新するための回路の構成例を示す図である。MR_2SIMD[0]〜MR_2SIMD[1]は、2ビットのマスクレジスタMR_2SIMDの各ビット値を示す。LOOP_SIMD_NUM[0]は、レジスタLOOP_SIMD_NUMの0ビット目(最下位ビット)のビット値を示す。
セレクタ921は、ビット値LOOP_SIMD_NUM[0]が0の場合にはビット値MR_2SIMD[0]の値を選択し、ビット値LOOP_SIMD_NUM[0]が1の場合にはビット値MR_2SIMD[1]の値を選択し、選択した値を新たなビット値MR_2SIMD[0]として更新する。
セレクタ922は、ビット値レジスタLOOP_SIMD_NUM[0]が0の場合にはビット値MR_2SIMD[1]の値を選択し、ビット値LOOP_SIMD_NUM[0]が1の場合にはビット値MR_2SIMD[0]の値を選択し、選択した値を新たなビット値MR_2SIMD[1]として更新する。
なお、マスクレジスタ値を更新する命令を追加し、その命令をループ処理の最後に記述するようにしてもよい。マスク値更新命令は、例えば「update_simd_mask(m)」であり、現在のループ回数レジスタLOOP_COUNTの値が0より大きい場合に、上記のようにマスクレジスタ値を更新する。
また、ループ回数レジスタLOOP_COUNTの値を参照せずに、マスク値更新命令の引数として終了条件を渡すようにしてもよい。その場合、マスク値更新命令は、例えば、「update_simd_mask_cond(m, as, at)であり、引数の2つのレジスタ値as及びatが異なる場合に、上記のようにマスクレジスタ値を更新する。コントローラ111は、レジスタ値as及びatが異なる場合に、マスクレジスタ値を更新する。例えば、マスク値更新命令は、update_simd_mask_cond(m, i+1, cnt)のように表記される。この場合、変数i+1がループ回数cntと異なる場合に、マスクレジスタ値を更新する。
上記では、マスクレジスタを用いてマスク値を設定する方法を説明した。次に、他のレジスタを用いてマスク値を設定する方法を説明する。データ数レジスタLOOP_SIMD_NUMとデータ位置レジスタSIMD_DATA_LOCを用意し、処理対象のデータ位置を指定するマスク値を生成する。
上記と同様に、ループ処理内で処理するデータ数を指定する命令600として、「set_loop_simd_width(n)」を使用する。この命令により、データ数レジスタLOOP_SIMD_NUMとデータ位置レジスタSIMD_DATA_LOCに、それぞれ次式の値がセットされる。
LOOP_SIMD_NUMm = n;
SIMD_DATA_LOCm = 8'b00000001;
すなわち、データ数レジスタLOOP_SIMD_NUMmにはnがセットされ、8ビットのデータ位置レジスタSIMD_DATA_LOCmには「00000001」がセットされる。
上記の2つのレジスタLOOP_SIMD_NUMm及びSIMD_DATA_LOCmの値を基に、次式のマスク値MR_8SIMDm、MR_4SIMDm及びMR_2SIMDmを生成する。マスク値MR_8SIMDm、MR_4SIMDm及びMR_2SIMDmは、それぞれ、上記の8SIMDのマスク値、4SIMDのマスク値及び2SIMDのマスク値である。
loc = SIMD_DATA_LOCm;
MR_8SIMDm = (LOOP_SIMD_NUMm== 1)? loc :
(LOOP_SIMD_NUMm==2)? [ 2[loc[3]], 2[loc[2]], 2[loc[1]], 2[loc[0]]] :
[4 [loc[1]], 4[loc[0] ];
MR_4SIMDm = (LOOP_SIMD_NUMm == 1)? loc[3:0] :
(LOOP_SIMD_NUMm==2)? [ 2[loc[1]], 2[loc[0]]] :
0b1111;
MR_2SIMDm = (LOOP_SIMD_NUMm == 1)? loc[1:0] :
0b11;
図10(A)は、上式のマスク値MR_8SIMDを生成するための回路の構成例を示す図である。MR_8SIMD[0]〜MR_8SIMD[7]は、8ビットのマスク値MR_8SIMDの各ビット値を示す。SIMD_DATA_LOC[0]〜SIMD_DATA_LOC[7]は、8ビットのデータ位置レジスタSIMD_DATA_LOCの各ビット値を示す。ビット値MR_8SIMD[0]は、ビット値SIMD_DATA_LOC[0]と同じ値として出力される。
セレクタ1001は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[1]として出力する。
セレクタ1002は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[2]として出力する。
セレクタ1003は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_8SIMD[3]として出力する。
セレクタ1004は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[4]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[4]として出力する。
セレクタ1005は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[5]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[5]として出力する。
セレクタ1006は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[6]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[6]として出力する。
セレクタ1007は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[7]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_8SIMD[7]として出力する。
図10(B)は、上式のマスク値MR_4SIMDを生成するための回路の構成例を示す図である。MR_4SIMD[0]〜MR_4SIMD[3]は、4ビットのマスク値MR_4SIMDの各ビット値を示す。
セレクタ1011は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「1」の値を選択し、選択した値をビット値MR_4SIMD[0]として出力する。
セレクタ1012は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[0]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「1」の値を選択し、選択した値をビット値MR_4SIMD[1]として出力する。
セレクタ1013は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「1」の値を選択し、選択した値をビット値MR_4SIMD[2]として出力する。
セレクタ1014は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「1」の値を選択し、選択した値をビット値MR_4SIMD[3]として出力する。
図10(C)は、上式のマスク値MR_2SIMDを生成するための回路の構成例を示す図である。MR_2SIMD[0]〜MR_2SIMD[1]は、2ビットのマスク値MR_2SIMDの各ビット値を示す。
セレクタ1021は、ビット値LOOP_SIMD_NUM[0]が0の場合には「1」の値を選択し、ビット値LOOP_SIMD_NUM[0]が1の場合にはビット値SIMD_DATA_LOC[0]を選択し、選択した値をビット値MR_2SIMD[0]として出力する。
セレクタ1022は、ビット値LOOP_SIMD_NUM[0]が0の場合には「1」の値を選択し、ビット値LOOP_SIMD_NUM[0]が1の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値をビット値MR_2SIMD[1]として出力する。
次に、ループ処理の繰り越し時にデータ位置レジスタSIMD_DATA_LOCを更新する方法を説明する。ループ終了アドレスレジスタLOOP_ENDに格納されているアドレスからループ開始アドレスLOOP_STARTに格納されているアドレスに分岐するときに、データ位置レジスタSIMD_DATA_LOCの値は、次式のように更新される。
SIMD_DATA_LOCm =
(LOOP_SIMD_NUMm == 1)? [ SIMD_DATA_LOCm [6:0], SIMD_DATA_LOCm [7] ] :
(LOOP_SIMD_NUMm==2)? [ 4'b0000, SIMD_DATA_LOCm [2:0], SIMD_DATA_LOCm [3] ]:
[ 6'b000000, SIMD_DATA_LOCm [0], SIMD_DATA_LOCm [1] ];
図11は、上式のデータ位置レジスタSIMD_DATA_LOCの値を更新するための回路の構成例を示す図である。
セレクタ1101は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[7]を選択し、レジスタLOOP_SIMD_NUMの値が2の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合にはビット値SIMD_DATA_LOC[1]を選択し、選択した値を新たなビット値SIMD_DATA_LOC[0]として更新する。
ビット値SIMD_DATA_LOC[0]は、新たなビット値SIMD_DATA_LOC[1]として更新される。
セレクタ1102は、レジスタLOOP_SIMD_NUMの値が1又は2の場合にはビット値SIMD_DATA_LOC[1]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[2]として更新する。
セレクタ1103は、レジスタLOOP_SIMD_NUMの値が1又は2の場合にはビット値SIMD_DATA_LOC[2]を選択し、レジスタLOOP_SIMD_NUMの値が4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[3]として更新する。
セレクタ1104は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[3]を選択し、レジスタLOOP_SIMD_NUMの値が2又は4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[4]として更新する。
セレクタ1105は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[4]を選択し、レジスタLOOP_SIMD_NUMの値が2又は4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[5]として更新する。
セレクタ1106は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[5]を選択し、レジスタLOOP_SIMD_NUMの値が2又は4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[6]として更新する。
セレクタ1107は、レジスタLOOP_SIMD_NUMの値が1の場合にはビット値SIMD_DATA_LOC[6]を選択し、レジスタLOOP_SIMD_NUMの値が2又は4の場合には「0」の値を選択し、選択した値を新たなビット値SIMD_DATA_LOC[7]として更新する。
なお、データ位置レジスタSIMD_DATA_LOCの値及びマスク値を更新する命令を追加し、その命令をループ処理の最後に記述してもよい。マスク値更新命令は、例えば、「update_simd_mask(m)」であり、現在のループ回数レジスタLOOP_COUNTの値が0より大きい場合に、上記のようにマスク値を更新する。
また、ループ回数レジスタLOOP_COUNTの値を参照せずに、マスク値更新命令の引数として終了条件を渡すようにしてもよい。その場合、マスク値更新命令は、例えば、「update_simd_mask_cond(m, as, at)」であり、引数の2つのレジスタ値as及びatが異なる場合に、上記のようにマスク値を更新する。例えば、マスク値更新命令は、上記と同様に、「update_simd_mask_cond(m, i+1, cnt)」である。
次に、指定されたデータ位置のデータを処理する命令を説明する。ただし、ロード命令602,603及びストア命令605においては、ベクトルレジスタファイル116内のベクトルレジスタのビット幅分のデータをまとめてロード及びストアする。これにより、データRAM103に対するアクセス回数を低減し、消費電力を低減することができる。
プロセッサ101は、SIMD命令に対して、上記のマスク値に応じて演算を行う。具体的には、プロセッサ101は、ベクトルレジスタファイル116内のベクトルレジスタから入力データを読み出し、ALU114を用いて演算し、マスク値に対応するデータ位置のみ演算結果をレジスタvd0又はvd1に書き込む。
図2(A)の16ビット×8個のデータを対象とするSIMD命令は、以下のように動作する。
命令: op8x16(vd0, vs0, vt0, m):
vd0 = [ op16(vs0[127:112],vt0[127:112]), op16(vs0[111:96], vt0[111:96]), op16(vs0[95:80], vt0[95:80]),
op16(vs0[79:64], vt0[79:64]), op16(vs0[63:48], vt0[63:48]), op16(vs0[47:32], vt0[47:32]),
op16(vs0[31:16], vt0[31:16]), op16(vs0[15:0], vt0[15:0]) ]
vd0_wen = MR_8SIMDm
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0は出力レジスタである。書き込み制御信号vd0_wenは、レジスタvd0への2バイト単位の書き込み制御信号である。1バイトは8ビットである。op16は、2個の16ビットの入力データを入力し、16ビットの出力データを出力する演算である。レジスタvs0及びvt0には、それぞれ、16ビット×8個の入力データが記憶される。レジスタvd0には、16ビット×8個の演算結果が書き込まれる。書き込み制御信号vd0_wenは、マスクレジスタMR_8SIMDmの値と同じである。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
図2(B)の32ビット×4個のデータを対象とするSIMD命令は、以下のように動作する。
命令: op4x32(vd0, vs0, vt0, m):
vd0 = [ op32(vs0[127:96], vt0[127:96]), op32(vs0[95:64], vt0[95:64]),
op32(vs0[63:32], vt0[63:32]), op32(vs0[31:0], vt0[31:0]) ];
vd0_wen = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [0], MR_4SIMDm [0]];
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0は出力レジスタである。op32は、2個の32ビットの入力データを入力し、32ビットの出力データを出力する演算である。レジスタvs0及びvt0には、それぞれ、32ビット×4個の入力データが記憶される。レジスタvd0には、32ビット×4個の演算結果が書き込まれる。書き込み制御信号vd0_wenは、上式のように、マスクレジスタMR_4SIMDm の値を基に設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
図2(D)の64ビット×2個のデータを対象とするSIMD命令は、以下のように動作する。
命令: op2x64(vd0, vs0, vt0, m):
vd0 = [ op64(vs0[127:64], vt0[127:64]), op64(vs0[63:0], vt0[63:0]) ];
vd0_wen = [MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0]];
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0は出力レジスタである。op64は、2個の64ビットの入力データを入力し、64ビットの出力データを出力する演算である。レジスタvs0及びvt0には、それぞれ、64ビット×2個のデータが記憶される。レジスタvd0には、64ビット×2個のデータの演算結果が書き込まれる。書き込み制御信号vd0_wenは、上式のように、マスクレジスタMR_2SIMDm の値を基に設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
また、16ビット×8個のデータを入力し、32ビット×4個の2組みのデータを出力するSIMD命令は、以下のように動作する。
命令: op8x16_8x32(vd1, vd0, vs0, vt0, m):
vd1 = [op16_32(vs0[127:112], vt0[127:112]), op16_32(vs0[111:96], vt0[111:96]),
op16_32(vs0[95:80], vt0[95:80]), op16_32(vs0[79:64], vt0[79:64])]
vd0 = [op16_32(vs0[63:48], vt0[63:48]), op16_32(vs0[47:32], vt0[47:32]),
op16_32(vs0[31:16], vt0[31:16]), op16_32(vs0[15:0], vt0[15:0])]
vd1_wen = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [6], MR_8SIMDm [6], MR_8SIMDm [5], MR_8SIMDm [5], MR_8SIMDm [4], MR_8SIMDm [4]];
vd0_wen = [MR_8SIMDm [3], MR_8SIMDm [3], MR_8SIMDm [2], MR_8SIMDm [2], MR_8SIMDm [1], MR_8SIMDm [1], MR_8SIMDm [0], MR_8SIMDm [0]];
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0及びvd1は出力レジスタである。op16_32は、2個の16ビットの入力データを入力し、32ビットの出力データを出力する演算であり、例えば乗算である。レジスタvs0及びvt0には、それぞれ、16ビット×8個の入力データが記憶される。レジスタvd0及びvd1には、それぞれ、32ビット×4個の演算結果が書き込まれる。書き込み制御信号vd0_wen及びvd1_wenは、上式のように、マスクレジスタMR_8SIMDm の値を基に設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。レジスタvd1には、書き込み制御信号vd1_wenが「1」であるデータ位置のバイトのみが書き込まれる。
次に、処理するデータ数を4以下に限定するSIMD命令を説明する。このSIMD命令は、図12(A)のSIMD命令1204に対応し、以下のように動作する。
命令: op8x16_4x32(vd0, vs0, vt0, m):
t = [ op16_32(vs0[127:112], vt0[127:112]), op16_32(vs0[111:96], vt0[111:96]),
op16_32(vs0[95:80], vt0[95:80]), op16_32(vs0[79:64], vt0[79:64])]
u = [ op16_32(vs0[63:48], vt0[63:48]), op16_32(vs0[47:32], vt0[47:32]),
op16_32(vs0[31:16], vt0[31:16]), op16_32(vs0[15:0], vt0[15:0]) ]
x = MR_8SIMDm [3] | MR_8SIMDm [2] | MR_8SIMDm [1] | MR_8SIMDm [0];
vd0 = (x == 1'b1)? u : t;
t_wen = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [6], MR_8SIMDm [6], MR_8SIMDm [5], MR_8SIMDm [5], MR_8SIMDm [4], MR_8SIMDm [4]];
u_wen = [MR_8SIMDm [3], MR_8SIMDm [3], MR_8SIMDm [2], MR_8SIMDm [2], MR_8SIMDm [1], MR_8SIMDm [1], MR_8SIMDm [0], MR_8SIMDm [0]];
vd0_wen = (x == 1'b1)? u_wen : t_wen;
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0は出力レジスタである。OP16_32は、2個の16ビットの入力データを入力し、32ビットの出力データを出力する演算であり、例えば乗算である。レジスタvs0及びvt0には、それぞれ、16ビット×8個の入力データが記憶される。レジスタvd0には、32ビット×4個の演算結果が書き込まれる。変数xは、ビット値MR_8SIMDm [3]、MR_8SIMDm [2]、MR_8SIMDm [1]及び MR_8SIMDm [0]の論理和である。レジスタvd0は、変数xが1の場合には変数uの値が格納され、変数xが0の場合には変数tの値が格納される。書き込み制御変数t_wen及びu_wenは、上式のように、マスクレジスタMR_8SIMDm の値を基に設定される。書き込み制御信号vd0_wenは、変数xが1の場合には書き込み制御変数u_wenの値になり、変数xが0の場合には書き込み制御変数t_wenの値になる。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
次に、32ビット×8個のデータを入力し、16ビット×8個のデータを出力するSIMD命令を説明する。このSIMD命令は、以下のように動作する。
命令: op8x32_8x16(vd0, vs1, vs0, vt1, vt0, m):
vd0 = [ op32_16(vs1[127:96], vt1[127:96]), op32_16(vs1[95:64], vt1[95:64]),
op32_16(vs1[63:32], vt1[63:32]), op32_16(vs1[31:0], vt1[31:0])],
op32_16(vs0[127:96], vt0[127:96]), op32_16(vs0[95:64], vt0[95:64]),
op32_16(vs0[63:32], vt0[63:32]), op32_16(vs0[31:0], vt0[31:0])]];
vd0_wen = MR_8SIMDm;
ここで、レジスタvs0、vs1、vt0及びvt1は入力レジスタ、レジスタvd0は出力レジスタである。レジスタvs0及びvs1には、32ビット×8個の入力データが記憶される。レジスタvt0及びvt1には、32ビット×8個の入力データが記憶される。OP32_16は、2個の32ビットの入力データを入力し、16ビットの出力データを出力する演算である。レジスタvd0には、16ビット×8個の演算結果が書き込まれる。書き込み制御信号vd0_wenは、上式のように、マスクレジスタMR_8SIMDm の値が設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
次に、処理するデータ数を4以下に限定するSIMD命令を説明する。このSIMD命令は、図6のSIMD命令604に対応し、以下のように動作する。
命令: op4x32_8x16(vd0, vs0, vt0, m):
t = [ op32_16(vs0[127:96], vs0[127:96]), op32_16(vs0[95:64], vs0[95:64]),
op32_16(vs0[63:32], vs0[63:32]), op32_16(vs0[31:0], vs0[31:0])] ];
vd0 = [t, t];
vd0_wen = MR_8SIMDm;
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0は出力レジスタである。レジスタvs0及びvt0には、それぞれ、32ビット×4個の入力データが記憶される。OP32_16は、2個の32ビットの入力データを入力し、16ビットの出力データを出力する演算である。レジスタvd0には、16ビット×4個の同じ演算結果が2組み書き込まれる。書き込み制御信号vd0_wenは、上式のように、マスクレジスタMR_8SIMDm の値が設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。マスクレジスタMR_8SIMDm の値は、例えば、図7(D)のように、「00001111」又は「11110000」であるので、レジスタvd0の下位半分のデータ位置及び上位半分のデータ位置のいずれかに、16ビット×4個のデータtが書き込まれる。
次に、32ビット×4個のデータを入力し、64ビット×4個のデータを出力するSIMD命令を説明する。このSIMD命令は、以下のように動作する。
命令: op4x32_4x64(vd1, vd0, vs0, vt0, m):
vd1 = [ op32_64(vs0[127:96], vt0[127:96]), op32_64(vs0[95:64], vt0[95:64]) ]
vd0 = [ op32_64(vs0[63:32], vt0[63:32]), op32_64(vs0[31:0], vt0[31:0]) ]
vd1_wen = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2]];
vd0_wen = [MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [1], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0]];
ここで、レジスタvs0及びvt0は入力レジスタ、レジスタvd0及びvd1は出力レジスタである。レジスタvs0及びvt0には、それぞれ、32ビット×4個の入力データが記憶される。OP32_64は、2個の32ビットの入力データを入力し、64ビットの出力データを出力する演算である。レジスタvd0及びvd1には、64ビット×4個の演算結果が書き込まれる。書き込み制御信号vd1_wenは、上式のように、ビット値MR_4SIMDm[2]及びMR_4SIMDm[3]を基に設定される。書き込み制御信号vd0_wenは、上式のように、ビット値MR_4SIMDm[0]及びMR_4SIMDm[1]を基に設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。レジスタvd1には、書き込み制御信号vd1_wenが「1」であるデータ位置のバイトのみが書き込まれる。
次に、64ビット×4個のデータを入力し、32ビット×4個のデータを出力するSIMD命令を説明する。このSIMD命令は、以下のように動作する。
命令: op4x64_4x32(vd0, vs1, vs0, vt1, vt0, m):
vd0 = [ op64_32(vs1[127:64], vt1[127:64]), op64_32(vs1[63:0], vt1[63:0]),
op64_32(vs0[127:64], vt0[127:64]), op64_32(vs0[63:0], vt0[63:0]) ]
vd0_wen = [MR_4SIMD[3], MR_4SIMD[3], MR_4SIMD[2], MR_4SIMD[2], MR_4SIMD[1], MR_4SIMD[1], MR_4SIMD[0], MR_4SIMD[0]];
ここで、レジスタvs0、vs1、vt0及びvt1は入力レジスタ、レジスタvd0は出力レジスタである。レジスタvs0及びvs1には、64ビット×4個の入力データが記憶される。レジスタvt0及びvt1には、64ビット×4個の入力データが記憶される。OP64_32は、2個の64ビットの入力データを入力し、32ビットの出力データを出力する演算である。レジスタvd0には、32ビット×4個の演算結果が書き込まれる。書き込み制御信号vd0_wenは、上式のように、ビット値MR_4SIMDm[0]〜MR_4SIMDm[3]を基に設定される。レジスタvd0には、書き込み制御信号vd0_wenが「1」であるデータ位置のバイトのみが書き込まれる。
なお、上記と同様に、16ビット×4個のデータを入力し、64ビット×4個のデータを演算する命令、及び、64ビット×4個のデータを入力し、16ビット×4個のデータを演算する命令を使用することができる。
次に、プロセッサ101がロードイネーブル信号ENL又はストアイネーブル信号ENSを用いてデータRAM103に対してロード又はストアする方法を説明する。プロセッサ101は、ベクトルレジスタファイル116内のベクトルレジスタのビット幅(128ビット)分のデータをまとめてロード又はストアする。これにより、プロセッサ101はデータRAM103に対するアクセス数を低減し、消費電力を低減することができる。ロードイネーブル信号ENLは、データRAM103に対するロードの可否をバイト(8ビット)単位で制御するための信号である。ストアイネーブル信号ENLは、データRAM103に対するストアの可否をバイト(8ビット)単位で制御するための信号である。
図2(A)の16ビット×8個のデータをロードする場合、ロードイネーブル信号ENLは、次式のように、ビット値MR_8SIMDm[0]を基に設定される。
命令: load8x16(ptr, m)
ENL = [MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0], MR_8SIMDm [0]]
命令: load4x32(ptr, m)
また、図2(B)の32ビット×4個のデータをロードする場合、ロードイネーブル信号ENLは、次式のように、ビット値MR_4SIMDm[0]を基に設定される。これは、図6(A)のロード命令602及び603に対応する。
ENL = [MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0]]
また、64ビット×2個のデータをロードする場合、ロードイネーブル信号ENLは、次式のように、ビット値MR_2SIMDm[0]を基に設定される。
命令: load2x64(ptr, m)
ENL = [MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0], MR_2SIMDm [0]]
また、図2(A)の16ビット×8個のデータをストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_8SIMDm[7]を基に設定される。
命令: store8x16(ptr, m)
ENS = [MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7], MR_8SIMDm [7]]
また、図2(B)の32ビット×4個のデータをストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_4SIMDm[3]を基に設定される。
命令: store4x32(ptr, m)
ENS = [MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3], MR_4SIMDm [3]]
また、64ビット×2個のデータをストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_2SIMDm[1]を基に設定される。
命令: store2x64(ptr, m)
ENS = [MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1], MR_2SIMDm [1]]
なお、図6(A)〜(C)のループ回数が奇数回数の場合のように、ストアするデータがベクトルレジスタのビット幅に到達する前にループ処理を終了する場合がある。そのような場合、ベクトルレジスタのビット幅に達しないデータがストアされずに、ループ処理が終了してしまう。その場合、ループ処理後のストア命令606により、未ストアのデータをストアする。
また、図2(A)の16ビット×8個のデータ形式の未ストアデータをストア命令606によりストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_8SIMDm[0]〜MR_8SIMDm[7]を基に設定される。なお、「|」の記号は、論理和(OR)を示す。
命令: store8x16_f(ptr, m)
ENS = [0, 0,
MR_8SIMDm [6], MR_8SIMDm [6],
[MR_8SIMDm [6]|MR_8SIMDm [5]], [MR_8SIMDm [6]|MR_8SIMDm [5]],
[MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]], [MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]],
[MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]], [MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]],
MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]|MR_8SIMDm [0]], MR_8SIMDm [6]|MR_8SIMDm [5]|MR_8SIMDm [4]|MR_8SIMDm [3]|MR_8SIMDm [2]|MR_8SIMDm [1]|MR_8SIMDm [0]]]
また、図2(B)及び(C)の32ビット×4個のデータ形式の未ストアデータをストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_4SIMDm[0]〜MR_4SIMDm[2]を基に設定される。
命令: store4x32_f(ptr, m)
ENS = [0, 0, 0, 0,
MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2], MR_4SIMDm [2],
[MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]], [MR_4SIMDm [2]|MR_4SIMDm [1]],
[MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]], [MR_4SIMDm [2]|MR_4SIMDm [1]|MR_4SIMDm [0]]]
また、図2(D)の64ビット×2個のデータ形式の未ストアデータをストアする場合、ストアイネーブル信号ENSは、次式のように、ビット値MR_2SIMDm[0]を基に設定される。
命令: store2x64_f(ptr, m)
ENS = [0, 0, 0, 0, 0, 0, 0, 0,
MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0], MR_4SIMDm [0] ]
次に、図6(A)〜(C)の処理を説明する。命令600は、図7(D)及び(E)に示すように、ループ処理内で処理するデータ数(並列処理データ数)SIMD_WIDTHが4であることを指定している。ループ命令601は、変数iが0からNまで複数回のループ処理を行う。図6(B)はループ処理が奇数回目の処理を示す図であり、図6(C)はループ処理が偶数回目の処理を示す図である。
1回目のループ処理では、図6(B)に示すように、8SIMD命令用マスクレジスタMR_8SIMDmは「00001111」に設定され、4SIMD命令用マスクレジスタMR_4SIMDmは「1111」に設定される。これらのマスクレジスタは、図1のマスクレジスタファイル112内のマスクレジスタである。ロード命令602では、プロセッサ101は、データRAM103から32ビット×4個のデータva0〜va3をロードする。次に、ロード命令603では、プロセッサ101は、データRAM103から32ビット×4個のデータvb0〜vb3をロードする。次に、命令604では、プロセッサ101は、上記のように、32ビット×4個のデータva0〜va3及び32ビット×4個のデータvb0〜vb3を基に演算し、8SIMD命令用マスクレジスタMR_8SIMDmの値「00001111」を用い、16ビット×4個のデータvc0〜vc3を出力する。次に、ストア命令605では、ビット値MR_8SIMDm[7]が0であるので、ストアイネーブル信号ENSの全ビットが0になり、プロセッサ101は、データRAM103に16ビット×4個のデータvc0〜vc3をストアしない。
次に、ループ処理は、1回目から2回目に繰り越す。この際、図6(C)に示すように、8SIMD命令用マスクレジスタMR_8SIMDmは「11110000」に更新され、4SIMD命令用マスクレジスタMR_4SIMDmは「1111」に更新される。
2回目のループ処理では、図6(C)の処理が行われる。ロード命令602では、プロセッサ101は、データRAM103から32ビット×4個のデータva0〜va3をロードする。次に、ロード命令603では、プロセッサ101は、データRAM103から32ビット×4個のデータvb0〜vb3をロードする。次に、命令604では、プロセッサ101は、上記のように、32ビット×4個のデータva0〜va3及び32ビット×4個のデータvb0〜vb3を基に演算し、8SIMD命令用マスクレジスタMR_8SIMDmの値「11110000」を用いて、16ビット×4個のデータvc4〜vc7を出力する。次に、ストア命令605では、ビット値MR_8SIMDm[7]が1であるので、ストアイネーブル信号ENSの全ビットが1になり、プロセッサ101は、データRAM103に16ビット×8個のデータvc0〜vc7をストアする。
以上のように、奇数回目のループ処理では図6(B)の処理を行い、偶数回目のループ処理では図6(C)の処理を行う。図6(B)の奇数回目のループ処理では、64ビットデータvc0〜vc3が128ビットに満たないので、ストアを行わない。これに対し、図6(C)の偶数回目のループ処理では、128ビットデータvc0〜vc7が揃ったので、ストアを行う。これにより、プロセッサ101がデータRAM103にアクセスする回数を減らし、消費電力を低減することができる。
本実施形態によれば、図6(A)のプログラムは、図5(A)のプログラムに対して、サイズが小さくなる。そのため、本実施形態によれば、プログラムを命令RAM102に格納することが可能になる。また、命令RAM102の容量を小さくすることができる。また、ループバッファ105が存在するプロセッサ101では、ループ内の命令数が少なくなると、ループバッファ105にヒットしやすくなり、プロセッサ101が命令RAM102へアクセスする回数が減るので、消費電力を低減することができる。
図12(A)は、本実施形態によるSIMD命令の他のプログラムを示す図であり、図12(B)及び図13は、プロセッサ101が図12(A)のプログラムを処理する例を示す図である。
命令1200は、図6(A)の命令600と同様に、図7(D)及び(E)に示すように、ループ処理内で処理するデータ数(並列処理データ数)SIMD_WIDTHが4であることを指定している。
ループ命令1201は、図6(A)のループ命令601と同様に、変数iが0からNまで複数回のループ処理を行う。図12(B)はループ処理が奇数回目の処理を示す図であり、図13はループ処理が偶数回目の処理を示す図である。
1回目のループ処理では、図12(B)に示すように、8SIMD命令用マスクレジスタMR_8SIMDmは「00001111」に設定され、4SIMD命令用マスクレジスタMR_4SIMDmは「1111」に設定される。これらのマスクレジスタは、図1のマスクレジスタファイル112内のマスクレジスタである。ロード命令1202では、プロセッサ101は、データRAM103から16ビット×8個のデータva0〜va7をロードする。次に、ロード命令1203では、プロセッサ101は、データRAM103から16ビット×8個のデータvb0〜vb7をロードする。次に、命令1204では、プロセッサ101は、上記のように、16ビット×8個のデータva0〜va7及び16ビット×8個のデータvb0〜vb7を入力し、8SIMD命令用マスクレジスタMR_8SIMDmの値「00001111」を用いて、16ビット×4個のデータva0〜va3及び16ビット×4個のデータvb0〜vb3を基に演算し、32ビット×4個のデータvw0〜vw3を出力する。次に、ロード命令1205では、プロセッサ101は、データRAM103から32ビット×4個のデータvd0〜vd3をロードする。次に、加算命令1206では、プロセッサ101は、32ビット×4個のデータvd0〜vd3及び32ビット×4個のデータvw0〜vw3を加算し、32ビット×4個のデータvc0〜vc3を出力する。次に、ストア命令1207では、ビット値MR_4SIMDm[3]が1であるので、ストアイネーブル信号ENSの全ビットが1になり、プロセッサ101は、データRAM103に32ビット×4個のデータvc0〜vc3をストアする。
次に、ループ処理は、1回目から2回目に繰り越す。この際、図13に示すように、8SIMD命令用マスクレジスタMR_8SIMDmは「11110000」に更新され、4SIMD命令用マスクレジスタMR_4SIMDmは「1111」に更新される。
2回目のループ処理では、図13の処理が行われる。ロード命令1202では、ビット値MR_8SIMDm[0]が0であるので、ロードイネーブル信号ENLの全ビットが0になり、プロセッサ101は、データRAM103から16ビット×8個のデータva0〜va7をロードしない。次に、ロード命令1203では、ビット値MR_8SIMDm[0]が0であるので、ロードイネーブル信号ENLの全ビットが0になり、プロセッサ101は、データRAM103から16ビット×8個のデータvb0〜vb7をロードしない。次に、命令1204では、プロセッサ101は、上記のように、16ビット×8個のデータva0〜va7及び16ビット×8個のデータvb0〜vb7を入力し、8SIMD命令用マスクMR_8SIMDmの値「11110000」を用いて、16ビット×4個のデータva4〜va7及び16ビット×4個のデータvb4〜vb7を基に演算し、32ビット×4個のデータvw0〜vw3を出力する。次に、ロード命令1205では、プロセッサ101は、データRAM103から32ビット×4個のデータvd0〜vd3をロードする。次に、加算命令1206では、プロセッサ101は、32ビット×4個のデータvd0〜vd3及び32ビット×4個のデータvw0〜vw3を加算し、32ビット×4個のデータvc0〜vc3を出力する。次に、ストア命令1207では、ビット値MR_4SIMDm[3]が1であるので、ストアイネーブル信号ENSの全ビットが1になり、プロセッサ101は、データRAM103に32ビット×4個のデータvc0〜vc3をストアする。
次に、ループ処理は、2回目から3回目に繰り越す。この際、図12(B)に示すように、8SIMD命令用マスクレジスタMR_8SIMDmは「00001111」に更新され、4SIMD命令用マスクレジスタMR_4SIMDmは「1111」に更新される。
同様に、3回目のループ処理では、図12(B)の処理を行い、4回目のループ処理では、図13の処理を行う。以上のように、奇数回目のループ処理では図12(B)の処理を行い、偶数回目のループ処理では図13の処理を行う。
仮に図12(B)の処理と図13の処理の両方の命令を1回のループ処理内に記述すると、命令RAM102に記憶されるプログラムのサイズが大きくなってしまう。本実施形態では、1個の命令1204で図12(B)の処理及び図13の処理の両方を行うことができるので、図12(A)のプログラムのサイズが小さくなる。そのため、本実施形態によれば、プログラムを命令RAM102に格納することが可能になる。また、命令RAM102の容量を小さくすることができる。また、ループバッファ105が存在するプロセッサ101では、ループ内の命令数が少なくなると、ループバッファ105にヒットしやすくなり、プロセッサ101が命令RAM102へアクセスする回数が減るので、消費電力を低減することができる。
本実施形態によれば、入力レジスタvs0、vs1、vt0及びvt1は、それぞれ、複数の入力データを記憶する。出力レジスタvd0及びvd1は、それぞれ、複数の出力データを記憶する。コントローラ111は、ループ処理内の単一命令複数データ処理(SIMD)命令604,1204により、レジスタに対して、マスク値に対応する位置のデータの処理を行い、ループ処理の繰り越し時にマスク値を更新する。
図6(A)〜(C)の場合、コントローラ111は、書き込み制御信号vd0_wen及び/又はvd1_wenに応じて、マスク値に対応する位置のデータをレジスタvd0及び/又はvd1に書き込むように制御する。また、コントローラ111は、ストア命令605に対し、マスク値に応じて、レジスタvd0のデータをデータRAM103にストアするか否かを制御する。
具体的には、コントローラ111は、ループ処理の繰り越し毎に、レジスタvd内の異なる位置にデータを書き込み、ストア命令605に対し、レジスタvd0内のすべての位置にデータが書き込まれていない場合には、レジスタvd0のデータをデータRAM103にストアせず、ストア命令605に対し、レジスタvd0内のすべての位置にデータが書き込まれている場合には、レジスタvd0のデータをデータRAM103にストアするように制御する。
また、コントローラ111は、ストア命令606に対し、ループ処理の終了後に、レジスタvd0に書き込まれかつストアされていないデータがある場合には、レジスタvd0に書き込まれかつストアされていないデータをデータRAM103にストアするように制御する。
図12(A)、(B)及び図13の場合、コントローラ111は、SIMD命令1204に対し、レジスタvs0及びvt0内のマスク値に対応する位置のデータを用いて演算するように制御する。
なお、マスク値は、SIMD命令604,1204が処理するデータ数に応じて異なる。例えば、SIMD命令604の出力データ数は8であるので、SIMD命令604に使用するマスク値はマスクレジスタMR_8SIMDmの値になる。また、SIMD命令1204の入力データ数は8であるので、SIMD命令1204に使用するマスク値はマスクレジスタMR_8SIMDmの値になる。
本実施形態によれば、マスク値を用いることにより、ループ処理内の命令数を減らすことができるので、命令RAM102に格納するプログラムのサイズを小さくすることができる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。
101 プロセッサ
102 命令RAM
103 データRAM
104 命令フェッチユニット
105 ループバッファ
106 プログラムカウンタ値記憶部
107 デコーダ
108 アドレスレジスタファイルユニット
109 アドレスレジスタファイル
111 コントローラ
112 マスクレジスタファイル
113 ベクトルレジスタファイルユニット
114 算術論理演算ユニット(ALU)
115 バス
116 ベクトルレジスタファイル

Claims (7)

  1. 複数データを記憶するレジスタと、
    ループ処理内の単一命令複数データ処理命令により、前記レジスタに対して、マスク値に対応する位置のデータの処理を行い、前記ループ処理の繰り越し時に前記マスク値を更新するコントローラと
    を有することを特徴とするプロセッサ。
  2. 前記コントローラは、前記マスク値に対応する位置のデータを前記レジスタに書き込むように制御することを特徴とする請求項1記載のプロセッサ。
  3. 前記コントローラは、ストア命令に対し、前記マスク値に応じて、前記レジスタのデータをメモリにストアするか否かを制御することを特徴とする請求項1又は2記載のプロセッサ。
  4. 前記コントローラは、前記ループ処理の繰り越し毎に、前記レジスタ内の異なる位置にデータを書き込み、ストア命令に対し、前記レジスタ内のすべての位置にデータが書き込まれていない場合には、前記レジスタのデータを前記メモリにストアせず、ストア命令に対し、前記レジスタ内のすべての位置にデータが書き込まれている場合には、前記レジスタのデータを前記メモリにストアするように制御することを特徴とする請求項1〜3のいずれか1項に記載のプロセッサ。
  5. 前記コントローラは、前記ループ処理の終了後に、前記レジスタに書き込まれかつストアされていないデータがある場合には、前記レジスタに書き込まれかつストアされていないデータを前記メモリにストアするように制御することを特徴とする請求項4記載のプロセッサ。
  6. 前記コントローラは、前記レジスタ内の前記マスク値に対応する位置のデータを用いて演算するように制御することを特徴とする請求項1記載のプロセッサ。
  7. 前記マスク値は、前記単一命令複数データ処理命令が処理するデータ数に応じて異なることを特徴とする請求項1〜6のいずれか1項に記載のプロセッサ。
JP2014104456A 2014-05-20 2014-05-20 プロセッサ Pending JP2015219823A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2014104456A JP2015219823A (ja) 2014-05-20 2014-05-20 プロセッサ

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014104456A JP2015219823A (ja) 2014-05-20 2014-05-20 プロセッサ

Publications (1)

Publication Number Publication Date
JP2015219823A true JP2015219823A (ja) 2015-12-07

Family

ID=54779115

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014104456A Pending JP2015219823A (ja) 2014-05-20 2014-05-20 プロセッサ

Country Status (1)

Country Link
JP (1) JP2015219823A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2019511056A (ja) * 2016-04-01 2019-04-18 エイアールエム リミテッド 複素数乗算命令
US11080063B2 (en) 2018-11-09 2021-08-03 Fujitsu Limited Processing device and method of controlling processing device

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10307814A (ja) * 1997-05-07 1998-11-17 Kofu Nippon Denki Kk ベクトル処理装置
WO2014051733A2 (en) * 2012-09-28 2014-04-03 Intel Corporation Vector move instruction controlled by read and write masks

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH10307814A (ja) * 1997-05-07 1998-11-17 Kofu Nippon Denki Kk ベクトル処理装置
WO2014051733A2 (en) * 2012-09-28 2014-04-03 Intel Corporation Vector move instruction controlled by read and write masks

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2019511056A (ja) * 2016-04-01 2019-04-18 エイアールエム リミテッド 複素数乗算命令
US11080063B2 (en) 2018-11-09 2021-08-03 Fujitsu Limited Processing device and method of controlling processing device

Similar Documents

Publication Publication Date Title
US10908907B2 (en) Instruction for determining histograms
KR101817034B1 (ko) 반복 종속 조건을 갖는 반복들의 벡터 루프들을 구현하기 위한 명령어
US20190108029A1 (en) Systems, apparatuses, and methods for blending two source operands into a single destination using a writemask
KR101814356B1 (ko) 적분 이미지 계산 명령어를 위한 방법 및 장치
US6671797B1 (en) Microprocessor with expand instruction for forming a mask from one bit
JP5500652B2 (ja) 並列比較選択演算装置、プロセッサ及び並列比較選択演算方法
JPH03218523A (ja) データプロセッサ
US10303630B2 (en) Configurable hardware accelerators
US6553474B2 (en) Data processor changing an alignment of loaded data
US20200249955A1 (en) Pair merge execution units for microinstructions
JP2015219823A (ja) プロセッサ
US8604946B2 (en) Data processing device and data processing method
JP2000322235A (ja) 情報処理装置
US20220261251A1 (en) Processing device with vector transformation execution
JP5862397B2 (ja) 演算処理装置
US20090037702A1 (en) Processor and data load method using the same
JP4901891B2 (ja) 画像処理プロセッサ
US9043510B2 (en) Hardware streaming unit
US9396113B2 (en) Flexible configuration hardware streaming unit
JP3547316B2 (ja) プロセッサ
JP2629479B2 (ja) 情報処理装置
JP2015130057A (ja) 処理装置
JP2003233496A (ja) マイクロプロセッサ
JP2009193466A (ja) 半導体装置
JP2013140472A (ja) ベクトルプロセッサ

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170206

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20171122

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20171212

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20180612