(第1の実施形態)
図1は、第1の実施形態による演算装置の構成例を示す図である。演算装置は、プロセッサ101、命令ランダムアクセスメモリ(RAM:Random Access Memory)102及びデータRAM103を有する。プロセッサ101は、プログラムカウンタ(PC)111、デコーダ112、スカラレジスタファイル113、ベクトルレジスタファイル114、加算器115及び算術論理ユニット(ALU:Arithmetic Logic Unit)118を有する。スカラレジスタファイル113は、一次元配列データを記憶する複数のレジスタを有する。ベクトルレジスタファイル114は、2次元配列データを記憶する複数のレジスタを有する。命令RAM102は、命令を記憶する。データRAM103は、データを記憶する。
プロセッサ101は、単一命令複数データ(SIMD:Single Instruction Multiple Data)型プロセッサであり、1個の命令で複数のデータを処理する。SIMD型プロセッサ101は、無線通信処理又はや動画像のデコードなど、大量のデータを高速に処理することができる。プロセッサ101は、プログラムカウンタ111が示すアドレスの命令を命令RAM102から読み出す。デコーダ112は、命令RAM102から読み出した命令をデコードし、スカラレジスタファイル113のインデックス及び/又はベクトルレジスタファイル114のインデックスを指定する。
スカラレジスタファイル113は、指定されたインデックスのレジスタの値を例えばベースアドレスとしてレジスタsに出力する。レジスタsは、ベースアドレスを記憶する。ベクトルレジスタファイル114は、指定されたインデックスのm個のレジスタの値をm個のオフセットアドレスとしてm個のレジスタvrに出力する。m個のレジスタvrは、m個のオフセットアドレスを記憶する。m個の加算器115は、それぞれ、レジスタsのベースアドレスに対して、m個のレジスタvrのオフセットアドレスを加算する。プロセッサ101は、その加算されたm個のアドレスをデータRAM103に出力し、m個のアドレスのnビットデータをデータRAM103からロードする。ロードされたm個のデータは、m個のレジスタvtにストアされる。8個のレジスタvtのデータは、例えば、ベクトルレジスタファイル114の指定されたインデックスのm個のレジスタに書き込まれる。
また、デコーダ112は、ベクトルレジスタファイル114の2個のインデックスを指定することができる。ベクトルレジスタファイル114は、デコーダ112により指定された第1のm個のレジスタの値をm個のレジスタ116に出力し、デコーダ112により指定された第2のm個のレジスタの値をm個のレジスタ117に出力する。m個のALU118は、m個のレジスタ116の値及びm個のレジスタ117の値に対して演算を行う。プロセッサ101は、演算結果のm個のnビットデータをデータRAM103にストアしたり、m個のレジスタvtにストアすることができる。m個のレジスタvtのデータは、ベクトルレジスタファイル114の指定されたインデックスにストアすることができる。
図2は、インダイレクトロード命令の実行例を示す図である。図1において、mが8であり、nが16である場合を例に説明する。レジスタsのベースアドレスは、例えば、「800000(16進数)」である。8個のオフセットアドレスのレジスタvrは、レジスタvr[0]=7(10進数)、レジスタvr[1]=3(10進数)、レジスタvr[2]=2(10進数)、レジスタvr[3]=5(10進数)、レジスタvr[4]=6(10進数)、レジスタvr[5]=4(10進数)、レジスタvr[6]=1(10進数)、レジスタvr[7]=1(10進数)を有する。データRAM103は、各アドレスに2バイトデータを記憶する。
加算器115は、s+2×vrを演算する。なお、レジスタvrの出力ビット線を1ビットシフトして加算器115に入力することにより、2×vrを実現できる。
第1の加算器115は、s+2×vr[0]を演算し、アドレス「80000e(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「80000e(16進数)」のデータ「0080」をロードし、結果データレジスタvt[0]に格納する。
第2の加算器115は、s+2×vr[1]を演算し、アドレス「800006(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「800006(16進数)」のデータ「0008」をロードし、結果データレジスタvt[1]に格納する。
第3の加算器115は、s+2×vr[2]を演算し、アドレス「800004(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「800004(16進数)」のデータ「0004」をロードし、結果データレジスタvt[2]に格納する。
第4の加算器115は、s+2×vr[3]を演算し、アドレス「80000a(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「80000a(16進数)」のデータ「0020」をロードし、結果データレジスタvt[3]に格納する。
第5の加算器115は、s+2×vr[4]を演算し、アドレス「80000c(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「80000c(16進数)」のデータ「0040」をロードし、結果データレジスタvt[4]に格納する。
第6の加算器115は、s+2×vr[5]を演算し、アドレス「800008(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「800008(16進数)」のデータ「0010」をロードし、結果データレジスタvt[5]に格納する。
第7の加算器115は、s+2×vr[6]を演算し、アドレス「800002(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「800002(16進数)」のデータ「0002」をロードし、結果データレジスタvt[6]に格納する。
第8の加算器115は、s+2×vr[7]を演算し、アドレス「800002(16進数)」を出力する。プロセッサ101は、データRAM103からアドレス「800002(16進数)」のデータ「0002」をロードし、結果データレジスタvt[7]に格納する。
8個のレジスタvt[0]〜vt[7]の結果データは、例えば、ベクトルレジスタ114の指定されたインデックスの8個のレジスタに格納される。上記のように、プロセッサ101は、データRAM103の8個のアドレスのデータに対して並列にアクセス可能である。
図3は、メモリインタリーブを説明するための図である。図1のデータRAM103は、並列にアクセス可能な複数のバンクBK1〜BK4に分割されている。mが8の場合、バンクBK1〜BK4は、連続する8個のアドレスのデータに対して同時にアクセスできるように設計される。例えば、プロセッサ101のレジスタの各データのサイズを2バイトとすると、バンクBK1〜BK4は、それぞれ、連続するアドレスの16バイトデータを1個のデータラインとして、16バイトのデータライン単位でロードするインタフェースを持つ。この場合、16バイトのデータライン内のアドレスであれば1サイクルで複数のアドレスのデータをロードできる。ただし、複数のアドレスが異なるデータラインに属する場合には、複数サイクルで複数のアドレスのデータをロードする。
第1のバンクBK1は、2進数アドレスの4ビット目が「0」であり、5ビット目が「0」であるデータラインのデータを記憶する。すなわち、図4に示すように、第1のバンクBK1は、アドレス「800000(16進数)」、「800040(16進数)」等のデータラインのデータを記憶する。
第2のバンクBK2は、2進数アドレスの4ビット目が「1」であり、5ビット目が「0」であるデータラインのデータを記憶する。すなわち、図4に示すように、第2のバンクBK2は、アドレス「800010(16進数)」、「800050(16進数)」等のデータラインのデータを記憶する。
第3のバンクBK3は、2進数アドレスの4ビット目が「0」であり、5ビット目が「1」であるデータラインのデータを記憶する。すなわち、図4に示すように、第3のバンクBK3は、アドレス「800020(16進数)」、「800060(16進数)」等のデータラインのデータを記憶する。
第4のバンクBK4は、2進数アドレスの4ビット目が「1」であり、5ビット目が「1」であるデータラインのデータを記憶する。すなわち、図4に示すように、第4のバンクBK4は、アドレス「800030(16進数)」、「800070(16進数)」等のデータラインのデータを記憶する。
図4はインダイレクトロード及びメモリインタリーブの例を示す図であり、図5はアドレス、バンク及びデータラインの関係を示す図である。レジスタsは、ベースアドレス「800000(16進数)」を記憶する。レジスタvr[0]は、オフセットアドレス「15(10進数)」を記憶する。レジスタvr[1]は、オフセットアドレス「31(10進数)」を記憶する。レジスタvr[2]は、オフセットアドレス「20(10進数)」を記憶する。レジスタvr[3]は、オフセットアドレス「0(10進数)」を記憶する。レジスタvr[4]は、オフセットアドレス「1(10進数)」を記憶する。レジスタvr[5]は、オフセットアドレス「2(10進数)」を記憶する。レジスタvr[6]は、オフセットアドレス「8(10進数)」を記憶する。レジスタvr[7]は、オフセットアドレス「9(10進数)」を記憶する。
データラインLN11〜LN41等は、それぞれ、16バイトのデータを含む。データラインLN11は、アドレス「800000(16進数)」〜「80000e(16進数)」の8個の2バイトデータを含む。データラインLN21は、アドレス「800010(16進数)」〜「80001e(16進数)」の8個の2バイトデータを含む。データラインLN31は、アドレス「800020(16進数)」〜「80002e(16進数)」の8個の2バイトデータを含む。データラインLN41は、アドレス「800030(16進数)」〜「80003e(16進数)」の8個の2バイトデータを含む。
データラインLN11は、アドレス「800000(16進数)」の16バイトデータラインであり、第1のバンクBK1に格納される。データラインLN21は、アドレス「800010(16進数)」の16バイトデータラインであり、データラインLN11に続くデータラインであり、第2のバンクBK2に格納される。データラインLN31は、アドレス「800020(16進数)」の16バイトデータラインであり、データラインLN21に続くデータラインであり、第3のバンクBK3に格納される。データラインLN41は、アドレス「800030(16進数)」の16バイトデータラインであり、データラインLN31に続くデータラインであり、第4のバンクBK4に格納される。
同様に、アドレス「800040(16進数)」の16バイトデータラインは、アドレス「800030(16進数)」のデータラインに続くデータラインであり、第1のバンクBK1に格納される。アドレス「800050(16進数)」の16バイトデータラインは、アドレス「800040(16進数)」のデータラインに続くデータラインであり、第2のバンクBK2に格納される。アドレス「800060(16進数)」の16バイトデータラインは、アドレス「800050(16進数)」のデータラインに続くデータラインであり、第3のバンクBK3に格納される。アドレス「800070(16進数)」の16バイトデータラインは、アドレス「800060(16進数)」のデータラインに続くデータラインであり、第4のバンクBK4に格納される。以上のように、複数のバンクBK1〜BK4は、複数のデータラインのアドレスがシーケンシャルに振り分けられる。
第1の加算器115は、s+2×vr[0]を演算し、アドレス「80001e(16進数)」を出力する。図5に示すように、アドレス「80001e(16進数)」のデータは、第2のバンクBK2のアドレス「800010(16進数)」のデータラインLN21に含まれるデータである。
第2の加算器115は、s+2×vr[1]を演算し、アドレス「80003e(16進数)」を出力する。図5に示すように、アドレス「80003e(16進数)」のデータは、第4のバンクBK4のアドレス「800030(16進数)」のデータラインLN41に含まれるデータである。
第3の加算器115は、s+2×vr[2]を演算し、アドレス「800028(16進数)」を出力する。図5に示すように、アドレス「800028(16進数)」のデータは、第3のバンクBK3のアドレス「800020(16進数)」のデータラインLN31に含まれるデータである。
第4の加算器115は、s+2×vr[3]を演算し、アドレス「800000(16進数)」を出力する。図5に示すように、アドレス「800000(16進数)」のデータは、第1のバンクBK1のアドレス「800000(16進数)」のデータラインLN11に含まれるデータである。
第5の加算器115は、s+2×vr[4]を演算し、アドレス「800002(16進数)」を出力する。図5に示すように、アドレス「800002(16進数)」のデータは、第1のバンクBK1のアドレス「800000(16進数)」のデータラインLN11に含まれるデータである。
第6の加算器115は、s+2×vr[5]を演算し、アドレス「800004(16進数)」を出力する。図5に示すように、アドレス「800004(16進数)」のデータは、第1のバンクBK1のアドレス「800000(16進数)」のデータラインLN11に含まれるデータである。
第7の加算器115は、s+2×vr[6]を演算し、アドレス「800010(16進数)」を出力する。図5に示すように、アドレス「800010(16進数)」のデータは、第2のバンクBK2のアドレス「800010(16進数)」のデータラインLN21に含まれるデータである。
第8の加算器115は、s+2×vr[7]を演算し、アドレス「800012(16進数)」を出力する。図5に示すように、アドレス「800012(16進数)」のデータは、第2のバンクBK2のアドレス「800010(16進数)」のデータラインLN21に含まれるデータである。
バンクBK1〜BK4は、それぞれ、1サイクルで1個のデータラインをロードすることができ、データライン単位でデータを入出力することができる。また、プロセッサ101は、バンクBK1〜BK4の各データラインを並列にロードすることができる。具体的には、プロセッサ101は、第1のバンクBK1のデータラインLN11、第2のバンクBK2のデータラインLN21、第3のバンクBK3のデータラインLN31及び第4のバンクBK4のデータラインLN41を1サイクルで並列にロードする。
次に、プロセッサ101は、ロードしたデータラインLN21内のアドレス「80001e(16進数)」のデータを結果データレジスタvt[0]に格納する。また、プロセッサ101は、ロードしたデータラインLN41内のアドレス「80003e(16進数)」のデータを結果データレジスタvt[1]に格納する。また、プロセッサ101は、ロードしたデータラインLN31内のアドレス「800028(16進数)」のデータを結果データレジスタvt[2]に格納する。また、プロセッサ101は、ロードしたデータラインLN11内のアドレス「800000(16進数)」のデータを結果データレジスタvt[3]に格納する。また、プロセッサ101は、ロードしたデータラインLN11内のアドレス「800002(16進数)」のデータを結果データレジスタvt[4]に格納する。また、プロセッサ101は、ロードしたデータラインLN11内のアドレス「800004(16進数)」のデータを結果データレジスタvt[5]に格納する。また、プロセッサ101は、ロードしたデータラインLN21内のアドレス「800010(16進数)」のデータを結果データレジスタvt[6]に格納する。また、プロセッサ101は、ロードしたデータラインLN21内のアドレス「800012(16進数)」のデータを結果データレジスタvt[7]に格納する。
以上のように、8個のレジスタvr[0]〜vr[7]に基づく8個のアドレスのデータのロードがバンクBK1〜BK4に分散すると、1サイクルで全データをロードすることができ、ロード時間を短くすることができる。
図6はインダイレクトロード及びメモリインタリーブの他の例を示す図であり、図7はアドレス、バンク及びデータラインの関係を示す図である。レジスタsは、ベースアドレス「800000(16進数)」を記憶する。レジスタvr[0]は、オフセットアドレス「0(10進数)」を記憶する。レジスタvr[1]は、オフセットアドレス「33(10進数)」を記憶する。レジスタvr[2]は、オフセットアドレス「66(10進数)」を記憶する。レジスタvr[3]は、オフセットアドレス「99(10進数)」を記憶する。レジスタvr[4]は、オフセットアドレス「132(10進数)」を記憶する。レジスタvr[5]は、オフセットアドレス「165(10進数)」を記憶する。レジスタvr[6]は、オフセットアドレス「198(10進数)」を記憶する。レジスタvr[7]は、オフセットアドレス「231(10進数)」を記憶する。
第1の加算器115は、s+2×vr[0]を演算し、アドレス「800000(16進数)」を出力する。図7に示すように、アドレス「800000(16進数)」のデータは、第1のバンクBK1のアドレス「800000(16進数)」のデータラインに含まれるデータである。
第2の加算器115は、s+2×vr[1]を演算し、アドレス「800042(16進数)」を出力する。図7に示すように、アドレス「800042(16進数)」のデータは、第1のバンクBK1のアドレス「800040(16進数)」のデータラインに含まれるデータである。
第3の加算器115は、s+2×vr[2]を演算し、アドレス「800086(16進数)」を出力する。図7に示すように、アドレス「800086(16進数)」のデータは、第1のバンクBK1のアドレス「800080(16進数)」のデータラインに含まれるデータである。
第4の加算器115は、s+2×vr[3]を演算し、アドレス「8000c6(16進数)」を出力する。図7に示すように、アドレス「8000c6(16進数)」のデータは、第1のバンクBK1のアドレス「8000c0(16進数)」のデータラインに含まれるデータである。
第5の加算器115は、s+2×vr[4]を演算し、アドレス「800108(16進数)」を出力する。図7に示すように、アドレス「800108(16進数)」のデータは、第1のバンクBK1のアドレス「800100(16進数)」のデータラインに含まれるデータである。
第6の加算器115は、s+2×vr[5]を演算し、アドレス「80014a(16進数)」を出力する。図7に示すように、アドレス「80014a(16進数)」のデータは、第1のバンクBK1のアドレス「800140(16進数)」のデータラインに含まれるデータである。
第7の加算器115は、s+2×vr[6]を演算し、アドレス「80018c(16進数)」を出力する。図7に示すように、アドレス「80018c(16進数)」のデータは、第1のバンクBK1のアドレス「800180(16進数)」のデータラインに含まれるデータである。
第8の加算器115は、s+2×vr[7]を演算し、アドレス「8001ce(16進数)」を出力する。図7に示すように、アドレス「8001ce(16進数)」のデータは、第1のバンクBK1のアドレス「8001c0(16進数)」のデータラインに含まれるデータである。
バンクBK1〜BK4は、それぞれ、1サイクルで1個のデータラインしかロードできない。まず、プロセッサ101は、第1のバンクBK1のアドレス「800000(16進数)」のデータラインをロードし、アドレス「800000(16進数)」のデータライン内のアドレス「800000(16進数)」のデータを結果データレジスタvt[0]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「800040(16進数)」のデータラインをロードし、アドレス「800040(16進数)」のデータライン内のアドレス「800042(16進数)」のデータを結果データレジスタvt[1]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「800080(16進数)」のデータラインをロードし、アドレス「800080(16進数)」のデータライン内のアドレス「800086(16進数)」のデータを結果データレジスタvt[2]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「8000c0(16進数)」のデータラインをロードし、アドレス「8000c0(16進数)」のデータライン内のアドレス「8000c6(16進数)」のデータを結果データレジスタvt[3]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「800100(16進数)」のデータラインをロードし、アドレス「800100(16進数)」のデータライン内のアドレス「800108(16進数)」のデータを結果データレジスタvt[4]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「800140(16進数)」のデータラインをロードし、アドレス「800140(16進数)」のデータライン内のアドレス「80014a(16進数)」のデータを結果データレジスタvt[5]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「800180(16進数)」のデータラインをロードし、アドレス「800180(16進数)」のデータライン内のアドレス「80018c(16進数)」のデータを結果データレジスタvt[6]に格納する。次に、プロセッサ101は、第1のバンクBK1のアドレス「8001c0(16進数)」のデータラインをロードし、アドレス「8001c0(16進数)」のデータライン内のアドレス「8001ce(16進数)」のデータを結果データレジスタvt[7]に格納する。
以上のように、8個のレジスタvr[0]〜vr[7]に基づく8個のアドレスのデータのロードが第1のバンクBK1に集中すると、8サイクルのロードが必要になり、ロード時間が長くなってしまう。以上のように、一定間隔のアドレスのデータをロードする場合には、1個のバンクへのアクセスが集中し易く、アクセス時間が長くなってしまう。この課題を解決するための実施形態を、以下、説明する。
図8は、第1の実施形態による演算装置の構成例を示す図である。演算装置は、プロセッサ101、制御回路CT、調停回路AR、第1のバンクBK1、第2のバンクBK2、第3のバンクBK3及び第4のバンクBK4を有する。プロセッサ101は、図1のプロセッサ101と同じ構成を有し、図1と同様に、命令RAM102内の命令を読み出してデコードする。バンクBK1〜BK4は、図1のデータRAM103に含まれる。データRAM103は、並列にアクセス可能な複数のバンクBK1〜BK4に分割されている。
第1のバンクBK1は、2進数アドレスの下位8ビットが「00000000」、「01110000」、「10100000」及び「11010000」のデータラインを記憶する。すなわち、図10に示すように、第1のバンクBK1は、アドレス「800000(16進数)」、「800070(16進数)」、「8000a0(16進数)」、「8000d0(16進数)」等のデータラインのデータを記憶する。
第2のバンクBK2は、2進数アドレスの下位8ビットが「00010000」、「01000000」、「10110000」及び「11100000」のデータラインを記憶する。すなわち、図10に示すように、第2のバンクBK2は、アドレス「800010(16進数)」、「800040(16進数)」、「8000b0(16進数)」、「8000e0(16進数)」等のデータラインのデータを記憶する。
第3のバンクBK3は、2進数アドレスの下位8ビットが「00100000」、「01010000」、「10000000」及び「11110000」のデータラインを記憶する。すなわち、図10に示すように、第3のバンクBK3は、アドレス「800020(16進数)」、「800050(16進数)」、「800080(16進数)」、「8000f0(16進数)」等のデータラインのデータを記憶する。
第4のバンクBK4は、2進数アドレスの下位8ビットが「00110000」、「01100000」、「10010000」及び「11000000」のデータラインを記憶する。すなわち、図10に示すように、第4のバンクBK4は、アドレス「800030(16進数)」、「800060(16進数)」、「800090(16進数)」、「8000c0(16進数)」等のデータラインのデータを記憶する。
図9は、データラインの2進数下位8ビットアドレスとバンクBK1〜BK4との対応関係を示す図である。図3の演算装置では、複数のバンクBK1〜BK4は、複数のデータラインのアドレスがシーケンシャルに振り分けられている。これに対し、図8の演算装置では、複数のバンクBK1〜BK4は、複数のデータラインのアドレスがシーケンシャルではなく、アドレスaddr[6]及びaddr[7]が同一の4つのラインが、バンクBK1〜KB4に不規則に振り分けられている。
具体的には、2進数下位8ビットのデータラインアドレス「00000000」、「00010000」、「00100000」及び「00110000」は、バンクBK1〜BK4の中で相互に異なるバンクに振り分けられる。同様に、2進数下位8ビットのデータラインアドレス「01000000」、「01010000」、「01100000」及び「01110000」は、バンクBK1〜BK4の中で相互に異なるバンクに振り分けられる。同様に、2進数下位8ビットのデータラインアドレス「10000000」、「10010000」、「10100000」及び「10110000」は、バンクBK1〜BK4の中で相互に異なるバンクに振り分けられる。同様に、2進数下位8ビットのデータラインアドレス「11000000」、「11010000」、「11100000」及び「11110000」は、バンクBK1〜BK4の中で相互に異なるバンクに振り分けられる。図8の演算装置は、図3の演算装置に対して、上記の条件下で、データラインのアドレスとバンクBK1〜BK4との対応関係を不規則にシャッフルしたものである。
図10は図8の演算装置のインダイレクトロードの例を示す図であり、図11はアドレス、バンク及びデータラインの関係を示す図である。レジスタs及びレジスタvr[0]〜vr[7]の記憶内容は、図6と同じである。
第1の加算器115は、s+2×vr[0]を演算し、アドレス「800000(16進数)」を出力する。図11に示すように、アドレス「800000(16進数)」のデータは、第1のバンクBK1のアドレス「800000(16進数)」のデータラインLN11に含まれるデータである。
第2の加算器115は、s+2×vr[1]を演算し、アドレス「800042(16進数)」を出力する。図11に示すように、アドレス「800042(16進数)」のデータは、第2のバンクBK2のアドレス「800040(16進数)」のデータラインLN21に含まれるデータである。
第3の加算器115は、s+2×vr[2]を演算し、アドレス「800086(16進数)」を出力する。図11に示すように、アドレス「800086(16進数)」のデータは、第3のバンクBK3のアドレス「800080(16進数)」のデータラインLN31に含まれるデータである。
第4の加算器115は、s+2×vr[3]を演算し、アドレス「8000c6(16進数)」を出力する。図11に示すように、アドレス「8000c6(16進数)」のデータは、第4のバンクBK4のアドレス「8000c0(16進数)」のデータラインLN41に含まれるデータである。
第5の加算器115は、s+2×vr[4]を演算し、アドレス「800108(16進数)」を出力する。図11に示すように、アドレス「800108(16進数)」のデータは、第1のバンクBK1のアドレス「800100(16進数)」のデータラインLN12に含まれるデータである。
第6の加算器115は、s+2×vr[5]を演算し、アドレス「80014a(16進数)」を出力する。図11に示すように、アドレス「80014a(16進数)」のデータは、第2のバンクBK2のアドレス「800140(16進数)」のデータラインLN22に含まれるデータである。
第7の加算器115は、s+2×vr[6]を演算し、アドレス「80018c(16進数)」を出力する。図11に示すように、アドレス「80018c(16進数)」のデータは、第3のバンクBK3のアドレス「800180(16進数)」のデータラインLN32に含まれるデータである。
第8の加算器115は、s+2×vr[7]を演算し、アドレス「8001ce(16進数)」を出力する。図11に示すように、アドレス「8001ce(16進数)」のデータは、第4のバンクBK4のアドレス「8001c0(16進数)」のデータラインLN42に含まれるデータである。
まず、プロセッサ101は、第1のバンクBK1のアドレス「800000(16進数)」のデータラインLN11、第2のバンクBK2のアドレス「800040(16進数)」のデータラインLN21、第3のバンクBK3のアドレス「800080(16進数)」のデータラインLN31、及び第4のバンクBK4のアドレス「8000c0(16進数)」のデータラインLN41を1サイクルで並列にロードする。次に、プロセッサ101は、データラインLN11内のアドレス「800000(16進数)」のデータを結果データレジスタvt[0]に格納する。また、プロセッサ101は、データラインLN21内のアドレス「800042(16進数)」のデータを結果データレジスタvt[1]に格納する。また、プロセッサ101は、データラインLN31内のアドレス「800086(16進数)」のデータを結果データレジスタvt[2]に格納する。また、プロセッサ101は、データラインLN41内のアドレス「8000c6(16進数)」のデータを結果データレジスタvt[3]に格納する。
次に、プロセッサ101は、第1のバンクBK1のアドレス「800100(16進数)」のデータラインLN12、第2のバンクBK2のアドレス「800140(16進数)」のデータラインLN22、第3のバンクBK3のアドレス「800180(16進数)」のデータラインLN32、及び第4のバンクBK4のアドレス「8001c0(16進数)」のデータラインLN42を1サイクルで並列にロードする。次に、プロセッサ101は、データラインLN12内のアドレス「800108(16進数)」のデータを結果データレジスタvt[4]に格納する。また、プロセッサ101は、データラインLN22内のアドレス「80014a(16進数)」のデータを結果データレジスタvt[5]に格納する。また、プロセッサ101は、データラインLN32内のアドレス「80018c(16進数)」のデータを結果データレジスタvt[6]に格納する。また、プロセッサ101は、データラインLN42内のアドレス「8001ce(16進数)」のデータを結果データレジスタvt[7]に格納する。
以上のように、8個のレジスタvr[0]〜vr[7]に基づく8個のアドレスのデータのロードが4個のバンクBK1〜BK4に分散し、2サイクルの短時間でロードすることができる。
図12は、図8の演算装置の具体的な構成例を示す図である。図1のデータRAM103は、並列にアクセス可能な複数のバンクBK1〜BK4に分割されている。複数のバンクBK1〜BK4は、上記のように、複数のデータラインのアドレスがシーケンシャルではなく不規則に振り分けられている。プロセッサ101は、データRAM103の複数のアドレスのデータに並列にアクセス可能である。m個の制御回路CT1〜CTmは、プロセッサ101及びデータRAM103の間に設けられ、図9に示すように、プロセッサ101から入力するm個のアドレスが属するバンクBK1〜BK4をアクセス可能状態に制御する。調停回路AR1〜AR4の数は、バンクBK1〜BK4の数と同じである。調停回路AR1〜AR4は、それぞれ、バンクBK1〜BK4に対応して設けられる。また、調停回路AR1〜AR4は、制御回路CT1〜CTm及びバンクBK1〜BK4の間に設けれ、複数のバンクBK1〜BK4のアクセスを調停する。プロセッサ101が並列に出力するアドレスの数mは、バンクBK1〜BK4の数よりも多いことが好ましい。
図13は、図12の制御回路CT1の構成例を示す図である。制御回路CT1は、プロセッサ101に対して、レジスタvr[0]を基に、アドレスaddrを入力し、ストアデータdata_inを入力し、書き込み制御信号wrを入力し、ロードデータdata_outを出力する。書き込み制御信号wrは、例えば、「1」がストアデータdata_inのストアを示し、「0」がロードデータdata_outのロードを示す。
また、制御回路CT1は、第1の調停回路AR1に対して、アドレスaddr0を出力し、ストアデータdata_in0を出力し、ロードデータdata_out0を入力し、書き込み制御信号wr0を出力し、バイトイネーブル信号byte_en0を出力する。
また、制御回路CT1は、第2の調停回路AR2に対して、アドレスaddr1を出力し、ストアデータdata_in1を出力し、ロードデータdata_out1を入力し、書き込み制御信号wr1を出力し、バイトイネーブル信号byte_en1を出力する。
また、制御回路CT1は、第3の調停回路AR3に対して、アドレスaddr2を出力し、ストアデータdata_in2を出力し、ロードデータdata_out2を入力し、書き込み制御信号wr2を出力し、バイトイネーブル信号byte_en2を出力する。
また、制御回路CT1は、第4の調停回路AR4に対して、アドレスaddr3を出力し、ストアデータdata_in3を出力し、ロードデータdata_out3を入力し、書き込み制御信号wr3を出力し、バイトイネーブル信号byte_en3を出力する。
書き込み制御信号wr0〜wr3は、書き込み制御信号wrと同じである。アドレスaddr0〜addr3は、nビットアドレスaddrのうちの6ビット目からn−1ビット目のアドレスaddr[6]〜addr[n−1]である。ストアデータdata_in0〜data_in3は、ストアデータdata_inと同じである。
バンク選択回路1301は、図9に従い、nビットアドレスaddrのうちの4ビット目から7ビット目のアドレスaddr[4]〜addr[7]に応じて、イネーブル信号en0〜en3のうちのいずれか1つを「1」にする。バイト選択信号生成回路1311は、図22に示すように、nビットアドレスaddrのうちの1ビット目から3ビット目のアドレスaddr[1]〜addr[3]に応じて、出力信号を出力する。論理積(AND)回路1307〜1310は、それぞれ、バイト選択信号生成回路1311の出力信号とイネーブル信号en0〜en3の論理積信号を、バイトイネーブル信号byte_en0〜byte_en3として出力する。
例えば、バンク選択回路1301は、図14(A)〜(D)のカルノー図で表現される論理回路であり、4ビットアドレスaddr[4]〜addr[7]を入力し、4ビットのイネーブル信号en0〜en3を出力する。イネーブル信号en0〜en3の「1」は、それぞれ、バンクBK1〜BK4がイネーブル状態であることを示す。イネーブル信号en0〜en3の「0」は、それぞれ、バンクBK1〜BK4がイネーブル状態でないことを示す。図14(A)はイネーブル信号en0のカルノー図であり、図14(B)はイネーブル信号en1のカルノー図であり、図14(C)はイネーブル信号en2のカルノー図であり、図14(D)はイネーブル信号en3のカルノー図である。
図13において、バンクBK1〜BK4は、それぞれ、書き込み制御信号wr0〜wr3が「0」の場合には、アドレスaddr0〜addr3のデータラインからバイトイネーブル信号byte_en0〜byte_en3が「1」となっているビットに対応する位置のデータをロードし、ロードデータdata_out0〜data_out3を出力する。
また、バンクBK1〜BK4は、それぞれ、書き込み制御信号wr0〜wr3が「1」の場合には、アドレスaddr0〜addr3のデータラインのバイトイネーブル信号byte_en0〜byte_en3が「1」となっているビットに対応する位置にストアデータdata_in0〜data_in3のデータをストアする。
論理積(AND)回路1302は、イネーブル信号en0及びロードデータdata_out0の論理積信号を出力する。論理積回路1303は、イネーブル信号en1及びロードデータdata_out1の論理積信号を出力する。論理積回路1304は、イネーブル信号en2及びロードデータdata_out2の論理積信号を出力する。論理積回路1305は、イネーブル信号en3及びロードデータdata_out3の論理積信号を出力する。論理和(OR)回路1306は、論理積回路1302〜1305の出力信号の論理和信号をロードデータdata_outとして出力する。すなわち、イネーブル状態になっている1個のバンクのロードデータのみがプロセッサ101に出力される。
以上、制御回路CT1について説明したが、制御回路CT2〜CTmも制御回路CT1と同様の構成を有する。ただし、制御回路CT2〜CTmは、それぞれ、プロセッサ101に対して、レジスタvr[1]〜vr[m−1]に応じた情報を入出力する。
図12の調停回路AR1〜AR4は、それぞれ、制御回路CT1〜CTmからバンクBK1〜BK4の情報を入力し、それらの情報を調停し、各バンクBK1〜BK4に対していずれか1個のデータラインのアドレスをバンクBK1〜BK4に出力する。制御回路CTiのデータラインアドレスにアクセスする場合、制御回路CTiの書き込み制御信号wr0〜wr3が「0」のときには、バイトイネーブル信号byte_en信号が「1」となっているバイト位置のデータを切り出して制御回路CTiに返す。また、書き込み制御信号wr0〜wr3が「1」のときには、バイトイネーブルbyte_en信号が「1」となっているバイト位置に制御回路CTiからのデータをストアする。図10の場合、調停回路AR1〜AR4は、バンクBK1〜BK4に対して、第1のサイクルでは、データラインLN11、LN21、LN31及びLN41をロードし、その次の第2のサイクルでは、データラインLN12、LN22、LN32及びLN42をロードする。
本実施形態によれば、複数のバンクBK1〜BK4は、複数のデータラインのアドレスがシーケンシャルではなく不規則に振り分けられているので、複数のバンクBK1〜BK4に対してアクセスを分散させることができ、データRAN103のアクセス時間を短縮することができる。
(第2の実施形態)
図15は、第2の実施形態による演算装置の構成例を示す図である。図15の演算装置は、図8の演算装置に対して、2ビット1505の位置を可変にしたものである。以下、本実施形態が第1の実施形態と異なる点を説明する。2ビット1504は、図8の4ビット目及び5ビット目のアドレスaddr[4]及びaddr[5]に対応する。2ビット1505は、図8の6ビット目及び7ビット目のアドレスaddr[6]及びaddr[7]に対応する。ビット1501は、2ビット1504及び2ビット1505の間に設けられる。ビット1501の数は、可変である。制御回路CTは、切り替えレジスタ1502及びビット数指定レジスタファイル1503を有する。ビット数指定レジスタファイル1503は、ビット1501の数として指定可能な0以上の整数を記憶する複数のレジスタを有し、切り替えレジスタ1502の値に応じたインデックスのレジスタの値を出力する。切り替えレジスタ1502の値を書き換えることにより、ビット1501の数を変更することができる。
なお、ビット数指定レジスタファイル1503のインデックスが0のレジスタは、ビット1501の数として0を記憶するようにしてもよい。また、ビット数指定レジスタファイル1503のレジスタ数は、特に限定しない。ただし、ビット数指定レジスタファイル1503のレジスタ数が1の場合は、切り替えレジスタ1502を設けず、レジスタ数が1個であるビット数指定レジスタファイル1503のみを設けてもよい。
プロセッサ101がアクセスするアドレスパターンによっては、第1の実施形態の場合でも特定のバンクにアクセスが集中してアクセスの衝突が頻発することがある。本実施形態では、アプリケーションのアクセスアドレスパターンに応じて、シャッフル対象のビット1505の位置を切り替えるようにする。
図16は、図9に対応し、データラインのアドレスとバンクBK1〜BK4との対応関係を示す図である。図15の演算装置では、複数のバンクBK1〜BK4は、複数のデータラインのアドレスがシーケンシャルではなく不規則に振り分けられている。
第1の実施形態(図8)では、4ビット目及び5ビット目のアドレスaddr[4]及びaddr[5]並びに6ビット目及び7ビット目のアドレスaddr[6]及びaddr[7]に応じて、バンクBK1〜BK4の振り分けが行われる。
本実施形態(図15)では、ビット1501の数をxとすると、4ビット目及び5ビット目のアドレスaddr[4]及びaddr[5]並びにx+6ビット目及びx+7ビット目のアドレスaddr[x+6]及びaddr[x+7]に応じて、バンクBK1〜BK4の振り分けが行われる。
図16の4ビット目及び5ビット目のアドレスaddr[4]及びaddr[5]は、図9の4ビット目及び5ビット目のアドレスaddr[4]及びaddr[5]に対応する。図16のx+6ビット目及びx+7ビット目のアドレスaddr[x+6]及びaddr[x+7]は、図9の6ビット目及び7ビット目のアドレスaddr[6]及びaddr[7]に対応する。すなわち、ビット1501の数xを0にすると、本実施形態と第1の実施形態は同じになる。
図17は、本実施形態による図12の制御回路CT1の構成例を示す図である。図17の制御回路CT1は、図13の制御回路CT1に対して、切り替えレジスタ1502、ビット数指定レジスタファイル1503及びビット切り出し回路1701を追加したものである。以下、図17の制御回路CT1が図13の制御回路CT1と異なる点を説明する。
ビット数指定レジスタファイル1503は、ビット1501の数として指定可能な0以上の整数を記憶する複数のレジスタを有する。プロセッサ101は、ビット数指定レジスタファイル1503に対して、書き込み制御信号w_enに応じて、ストアデータbit_cnt_inをストアし、ロードデータbit_cnt_outをロードする。
切り替えレジスタ1502は、ビット数指定レジスタファイル1503内の複数のレジスタのうちのいずれかのインデックスを記憶する。プロセッサ101は、切り替えレジスタ1502に対して、書き込み制御信号w_enに応じて、ストアデータsel_inをストアし、ロードデータsel_outをロードする。
ビット数指定レジスタファイル1503は、切り替えレジスタ1502が記憶するインデックスを入力し、そのインデックスのレジスタが記憶するビット数bit_cntを出力する。ビット切り出し回路1701は、プロセッサ101からアドレスaddrをアドレスaddr_inとして入力し、ビット数bit_cntに応じて、アドレスaddr_inから切り出した4ビットアドレスaddr_selをバンク選択回路1301に出力する。なお、制御回路CT2〜CTmも制御回路CT1と同様の構成を有する。
図18は、図17のビット切り出し回路1701の構成例を示す図である。ビット切り出し回路1701は、セレクタ1801を有し、4ビットアドレスaddr_sel[0]〜addr_sel[3]を出力する。アドレスaddr_sel[0]は、アドレスaddr_in[4]と同じビット値である。アドレスaddr_sel[1]は、アドレスaddr_in[5]と同じビット値である。
セレクタ1801は、ビット数bit_cntに応じて、2ビットアドレスaddr_in[6],addr_in[7]、2ビットアドレスaddr_in[7],addr_in[8]、・・・、2ビットアドレスaddr_in[n−2],addr_in[n−1]のうちのいずれか1個を選択し、2ビットアドレスaddr_sel[2],addr_sel[3]を出力する。例えば、ビット数bit_cntが0である場合、2ビットアドレスaddr_sel[2],addr_sel[3]は、2ビットアドレスaddr_in[6],addr_in[7]と同じになる。ビット数bit_cntが1である場合、2ビットアドレスaddr_sel[2],addr_sel[3]は、2ビットアドレスaddr_in[7],addr_in[8]と同じになる。すなわち、ビット数bit_cntをビット数xとすると、セレクタ1801は、図16のように、2ビットアドレスaddr[x+6],addr[x+7]を2ビットアドレスaddr_sel[2],addr_sel[3]として出力する。
図19は、ビット数xを決定するための処理方法を示すフローチャートである。プロセッサ101は、命令RAM102内のターゲットプログラム1901を実行することにより、データRAM103にアクセスする。最適なビット数xは、プロセッサ101が実行するターゲットプログラム1901により異なる。シミュレータ1902は、例えばコンピュータであり、ターゲットプログラム1901の実行によりシミュレーションを行い、その結果として、データRAM103のアクセスパターン1903を出力する。アクセスパターン1903は、ターゲットプログラム1901のうちのデータRAM103に対するアクセス命令の命令カウント値、ベースアドレス及びオフセットアドレスの組みを含む。これにより、データRAM103にアクセスするベースアドレス及びオフセットアドレスを得ることができる。次に、コンピュータは、ビット数決定プログラム1904を実行することにより、アクセスパターン1903を基にビット数1905(ビット数x)を決定して出力(表示)する。
図20は、図19のビット数決定プログラム1904の処理例を示すフローチャートである。ステップS2001では、コンピュータは、ビット数xを0から指定可能なビット数の上限まで変化させるループ処理を開始する。次に、ステップS2002では、コンピュータは、ビット数xの全サイクル数[x]の変数を0にリセットする。次に、ステップS2003では、コンピュータは、各アクセスパターン1903についてのループ処理を開始する。次に、ステップS2004では、コンピュータは、指定されたビット数x及びアクセスパターン1903についてのサイクル数を求め、そのサイクル数を全サイクル数[x]の変数に累積加算する。サイクル数を求める処理は、後に図21を参照しながら説明する。次に、ステップS2005では、コンピュータは、アクセスパターン1903のループ処理を終了し、ステップS2003に戻り、次のアクセスパターン1903の処理を繰り返す。すべてのアクセスパターン1903の処理が終了すると、ステップS2006では、コンピュータは、ビット数xのループ処理を終了し、ステップS2001に戻り、次のビット数xの処理を繰り返す。すべてのビット数xの処理が終了すると、ステップS2007では、コンピュータは、全サイクル数[x]の変数が最小となるビット数xを探索し、最も少ないサイクル数でアクセスするビット数xを出力する。
図21は、図20のステップS2004のサイクル数を求める処理を示すフローチャートである。ステップS2101では、コンピュータは、バンク番号iを0から3まで変化させるループ処理を開始する。次に、ステップS2102では、コンピュータは、バンク番号iのアクセスアドレス集合bank[i]の変数を空にリセットする。次に、ステップS2103では、コンピュータは、バンク番号iのループ処理を終了し、ステップS2101に戻り、次のバンク番号iの処理を繰り返す。
次に、ステップS2104では、コンピュータは、アクセスパターン1903内の各オフセットアドレスについてのループ処理を開始する。次に、ステップS2105では、コンピュータは、オフセットアドレスを2倍した値にベースアドレスを加算し、その加算結果をアドレスaddrとする。次に、コンピュータは、指定されたビット数x及びアドレスaddrが属するバンク番号を変数tに格納する。次に、コンピュータは、指定されたビット数x及びアドレスaddrが属するデータラインアドレスを変数aに格納する。次に、コンピュータは、データラインアドレスaをアクセスアドレス集合bank[i]に追加する。次に、ステップS2106では、コンピュータは、オフセットアドレスのループ処理を終了し、ステップS2104に戻り、次のオフセットアドレスの処理を繰り返す。すべてのオフセットアドレスの処理が終了すると、ステップS2107に進む。
ステップS2107では、コンピュータは、アクセスアドレス集合bank[0]〜bank[3]の各々の中でユニークな要素(データラインアドレス)の数を求め、そのユニークな要素の数の最大値をサイクル数とする。すなわち、同一データラインのアクセスは1サイクルで行えるため、各バンクのアクセスアドレス集合bank[0]〜bank[3]の中から、重複しないデータラインアドレスの数を求め、その値の最大値をサイクル数として返す。
なお、第1及び第2の実施形態では、4個のバンクBK1〜BK4の例を説明したが、4個に限定されない。データRAM103は、2p(pは自然数)個のバンクに分割することができる。2p個のバンクは、データRAM103のアドレスのうちの2×pビットの値に応じて、複数のデータラインのアドレスが振り分けられる。制御回路CT1〜CTmは、プロセッサ101から入力するアドレスのうちの2×pビットの値に応じて、プロセッサ101から入力するアドレスが属するバンクをアクセス可能状態に制御する。第1の実施形態では、上記のアドレスのうちの2×pビットは、相互に隣接した2×pビットである。
第2の実施形態では、上記のアドレスのうちの2×pビットは、相互に隣接した第1のpビット1504と、相互に隣接した第2のpビット1505とを有し、第1のpビット1504及び第2のpビット1505は、相互に隣接していない。第1のpビット1504と第2のpビット1505との間隔は、変更可能である。
第1及び第2の実施形態によれば、複数のバンクBK1〜BK4に対してアクセスを分散させることができるので、データRAM103に対するアクセス時間を短くすることができる。
なお、上記実施形態は、何れも本発明を実施するにあたっての具体化の例を示したものに過ぎず、これらによって本発明の技術的範囲が限定的に解釈されてはならないものである。すなわち、本発明はその技術思想、又はその主要な特徴から逸脱することなく、様々な形で実施することができる。