【文献】
Yi Shan et al.,FPMR: MapReduce Framework on FPGA A Case Study of RankBoost Acceleration,Proceedings of the 18th annual ACM/SIGDA international symposium on Field programmable gate arrays,ACM,2010年 2月21日,pp.93-102
(58)【調査した分野】(Int.Cl.,DB名)
前記第1keyの入力に対して、ハッシュ関数によって前記第1key及び前記第1valueが記憶された前記第1のアドレスを生成するハッシュ生成器をさらに具備する請求項1に記載のメモリ。
前記第1のメモリは、前記第1keyの入力に対して、前記第1keyと、前記第1のメモリ内に格納されたデータとの比較を行い、一致したデータが記憶された第3のアドレスを出力する連想メモリ(Content-addressable memory:CAM)と、
前記第3のアドレスの指定により書き込み及び読み出しが行われるRAMとを備える請求項1に記載のメモリ。
前記第2のメモリは、前記第1keyの入力に対して、前記第1keyと、前記第2のメモリ内に格納されたデータとの比較を行い、一致したデータが記憶された第3のアドレスを出力するコンテンツ連想メモリ(CAM)と、
前記第3のアドレスの指定により書き込み及び読み出しが行われるRAMとを備える請求項1乃至4のいずれかに記載のメモリ。
【発明を実施するための形態】
【0010】
以下の説明において、同一の機能及び構成を有する構成要素については、同一符号を付し、重複説明は必要な場合にのみ行う。
【0011】
本実施形態に係る、集合演算が可能なメモリシステム(検索メモリ)は、少なくとも1つのkey-valueストア機能(以下、KVSと記す)を有するメモリを備えている。KVSとは、キー(key)と値(value)の組を書き込み、キーを指定することで値を読み出せるデータベース管理方式のことを意味する。KVSでは、データはkeyとkeyに対応するvalueの組であるkey-value型データとして管理され、検索要求としてkeyが与えられると、それに対応付けられていたvalueを出力することが可能である。ここでは、このようなKVSを有するメモリを、以降、KVSメモリと記す。
【0012】
以下に、KVSメモリ及びその命令について詳しく説明する。
【0013】
KVSメモリは通常のメモリアクセスの命令に加え、少なくともGET、PUT、DELETEなどのKVS命令を備えたメモリであり、各命令の意味は次の通りである。
【0014】
(1)GET(key, value):要素(value)が指定されなかった(NULL)場合は、keyに対応するデータ集合を得る。要素(value)が指定された場合は、データ集合の中にvalueが存在したらvalueそのもの、あるいはTRUEを返す。データ集合の中にvalueが存在しなかったら、空集合(NULL)あるいはFALSEを返す。keyに対応するデータ集合が無い場合も、空集合(NULL)あるいはFALSEを返す。
【0015】
(2)PUT(key, value):keyに対応するデータ集合に要素(value)を追加する。要素がデータ集合中に既に存在する場合は何もしない。
【0016】
(3)DELETE(key, value):keyに対応するデータ集合から要素(value)を削除する。要素がデータ集合中に存在しなければ何もしない。
【0017】
以下に、KVSメモリの具体的な構成例と動作例を示す。
図1は、実施形態に用いられるKVSメモリの第1構成例を示す図である。
図示するように、KVSメモリ14には、例えば、メモリコントローラ13及びハッシュ生成器16が接続されている。さらに、メモリコントローラ13には、上位システム100が接続されている。ハッシュ生成器16は、任意長のデータを固定長のビット列に変換する、いわゆるハッシュ関数の機能を持つ。上位システム100は、例えば、中央演算処理装置(CPU)及びメインメモリ等を備えたホストシステムである。
【0018】
KVSメモリ14には、例えばDRAM等の汎用メモリが用いられる。KVSメモリ14は、少なくともハッシュテーブル領域14Aと実データ領域14Bの2つの記憶領域に分けられる。これらの記憶領域は複数持つことができるが、ハッシュテーブル領域14Aのサイズは、ハッシュ生成器16が生成するハッシュ値(固定長ビットデータ)が表現できるサイズよりも大きい。ハッシュテーブル領域14Aは、keyの実アドレスを記憶できる領域とvalueの実アドレスを記憶できる領域とに分けられる。ハッシュテーブル領域14Aの記憶容量は、固定されているわけではなく、key-valueストアに基づく要求に応じて可変(拡張あるいは縮小)することができる。また、実データ領域14Bにはデータが記憶される。
【0019】
メモリコントローラ13は、上位システム100から受け取ったKVS命令を解釈し、KVSメモリ14及びハッシュ生成器16に対して、次に述べるような動作を行う。
【0020】
いま、animalというkeyがKVSメモリ14中にまだ存在しない場合を考える。ここで、PUT(animal, dog)、PUT(animal, cat)という命令をメモリコントローラ13が順に受け取ると、ハッシュ生成器16によって、animal、dog、catのそれぞれに対応するハッシュ値が生成される。これらが順に、158、98、188という固定長のビット列だったとする。
【0021】
ここで、ハッシュテーブル領域14A中のハッシュ値に対応するアドレスの内容が調べられ、animalというkeyが既にストアされているかどうかを調べる。ここではまだ存在していないため(値が0なので)、それぞれの実データを記憶するための領域が確保され(1020, 1055, 1090)、これらの先頭アドレスがハッシュテーブル領域14Aのkey領域に記憶される。確保された領域(1020, 1055, 1090)には、animal、dog、cat等の実データが記憶される。
【0022】
さらに、animalというkeyとデータ集合{dog, cat}とを関連付けるため、実データ領域14Bに各要素用の領域を確保し、その先頭アドレス(1100)をハッシュテーブル領域14Aのanimalに相当するvalue領域に書き込む。そして、各要素の先頭アドレスを書き並べたもの(1055, 1090)が実データ領域14B中に記憶される。
【0023】
これで、KVSメモリ14内にanimalというkeyに対応するデータ集合{dog, cat}が作られたことになる。
図1には、このときのKVSメモリ14内の状態が示されている。
【0024】
次に、GET(animal, NULL)という命令をメモリコントローラ13が受け取ったとすると、ハッシュテーブル領域14Aのanimalのハッシュ値であるアドレス(0158)に書かれたvalue領域(1100)の中身(要素の実データの先頭アドレス)から実データが読み出される。すなわち{dog, cat}が上位システム100に出力される。
【0025】
もしここで、命令がGET(animal, dog)である場合は、メモリコントローラ13は各要素を出力せずに、第二引数であるdogと一致する要素があったときだけ、dogまたはTRUEを上位システム100に出力する。また、命令がGET(animal, lion)である場合は、一致する要素がないため、NULLまたはFALSEを上位システム100に出力する。
【0026】
さらに、DELETE(animal, dog)という命令をメモリコントローラ13が受け取ると、animalに対応するデータ集合よりdogが削除される。具体的には、アドレス(1100)から始まる各要素が調べられ、dogを除いた残り(1090)が値として書き込まれる。あるいは、このとき、新たに実データ領域14B中に確保されたメモリ領域にdogを除いた要素を順に書き出して行き、最後にハッシュテーブル領域14Aのanimalのvalue領域を書き換え、元のアドレス(1100)を開放する、というやり方もある。
【0027】
なお、DELETEの際、dogの要素そのものがanimal以外の集合に属していない場合に、dogという要素が使用しているメモリを開放する(ガベージコレクション)という動作が伴う場合がある。
【0028】
ここで、命令がGET(animal, NULL)である場合、{cat}が上位システム100に返される。さらに、命令がDELETE(animal, cat)である場合、ハッシュテーブル領域14A内のanimalのkey領域、value領域が開放され、animalというkeyに対応するデータ集合は無くなる。すなわち、命令がGET(animal, NULL)である場合、空集合(NULL)が上位システム100に返される。
【0029】
また、KVSメモリの構成例としては上記のほかにもいくつかの実現方法がある。具体的には、
図1に示した構成において、ハッシュテーブル領域14Aを連想メモリ(CAM:Content-Addressable Memory)を用いて構成する方法を以下に説明する。
【0030】
図2は、実施形態に用いられるKVSメモリの第2構成例を示す図である。
本構成例は,KVSメモリとしてのCAM−RAM142と、上位システム100から入力されたKVS命令を解釈し、CAM−RAM142及び他のモジュールを制御するメモリコントローラ13とを備える。
【0031】
CAM−RAM142は、テーブル領域としてのCAM部142Aと、データ領域としてのRAM(random access memory)部142Bとを有する。RAM部142Bには、DRAMやNAND型フラッシュメモリなどの汎用メモリを用いることができる。連想メモリ(CAM部)にはいくつか種類があるが、ここではCAM部142Aに、アドレスを介した通常の読み書きに加え、入力されたデータ(key)がCAM中に含まれていた場合に固定長のデータ(value)を返す種類のCAMを用いる。すなわち、CAM部142Aは、データ(key)の入力に対して、そのデータと全ての格納データとの一致・不一致の比較演算を同時並列に行い、一致した格納データのvalueを出力する機能を持つ。
【0032】
CAM−RAMとは、コンテンツ連想メモリ(CAM)でアドレスを出力させ、アドレス指定アクセスのRAMでデータを出力させるように組み合わせたシステムである。CAM−RAMでは、ハッシュ値を介さずに、keyとvalueを直接読み書きできるため、
図1に示した構成例と比べてハッシュ生成器16が不要となる。
【0033】
次に、第2構成例でのKVS命令の動作について説明する。
いま、animal、dog、catというkeyがCAM部142Aにまだ存在しない場合を考える。ここで、PUT(animal, dog)、PUT(animal, cat)という命令をメモリコントローラ13が順に受け取ると、keyがCAM部142Aに既にストアされているかどうかを調べる。ここではまだ存在していないため、それぞれのkeyをCAM部142Aにストアする。そして、CAM部中の各要素(dog, cat)のvalue(ここでは先頭アドレスの1055, 1090)をRAM部142Bに記憶領域を確保して、集合としてストアする。さらに、この集合の先頭アドレス(1100)をCAM部142Aのkey(animal)のvalueとしてストアする。
【0034】
このとき、前記の集合はCAM部中にストアすることもできるが、一般にCAMはRAMに比べてビットあたりのコストが高いため、上記のような実現方法を用いたほうがよい。
図2には、このときのCAM−RAM142内の状態が示されている。
【0035】
次に、GET(animal, NULL)という命令をメモリコントローラ13が受け取ったとすると、CAM部142Aのanimal(key)に対するvalueである1100をRAM部142Bのアドレスと読み替えたときに、集合{1055, 1090}が読み出せ、さらに集合{1055, 1090}をCAM部142Aのアドレスとして読み替えたkey領域、すなわち{dog, cat}が上位システム100に出力される。
【0036】
もしここで、命令がGET(animal, dog)である場合、メモリコントローラ13は各要素を出力せずに,第二引数であるdogと一致する要素があったときだけ、dogまたはTRUEを上位システム100に出力する。また、命令がGET(animal, lion)である場合は、一致する要素がないため、NULLまたはFALSEを上位システム100に出力する。
【0037】
さらに、DELETE(animal, dog)という命令をメモリコントローラ13が受け取ると,animalに対応するデータ集合よりdogが削除される.具体的には、アドレス(1100)から始まる各要素が調べられ、dogを除いた残り(1090)が値として書き込まれる。あるいは、このとき、新たにRAM部中に確保されたメモリ領域にdogを除いた要素を順に書き出して行き、最後にCAM部142Aのanimalのvalue領域を書き換え、元のアドレス(1100)を開放する、というやり方もある。
【0038】
なお、DELETEの際、dogの要素そのものがanimal以外の集合に属していない場合に、dogという要素が使用しているメモリを開放する(ガベージコレクション)という動作が伴う場合がある。
【0039】
ここで、命令がGET(animal, NULL)である場合、{cat}が上位システム100に返される。さらに、命令がDELETE(animal, cat)である場合、CAM部142A内のanimalのkey領域、 value領域が開放され、animalというkeyに対応するデータ集合は無くなる。すなわち、GET(animal, NULL)の場合、空集合(NULL)が上位システム100に返される。
【0040】
[第1実施形態]
[1]ハードウェア構成
まず、第1実施形態のメモリシステムのハードウェア構成について説明する。
図3は、第1実施形態のメモリシステムのハードウェア構成を示すブロック図である。
図示するように、メモリシステムは、CPU11、メインメモリ12、メモリコントローラ13、及びKVSメモリ14を備える。さらに、CPU11、メインメモリ12、及びメモリコントローラ13の間は、バス15にて接続されている。
【0041】
CPU11は、メインメモリ12、メモリコントローラ13、及びKVSメモリ14を制御し、後述する集合演算を行う。メモリコントローラ13は、KVSメモリ14及びその他のメモリ(図示しない)を制御する。メモリコントローラ13は、ダイレクトメモリアクセス(DMA:Direct Memory Access)機能を持つ回路を有する。DMA機能を用いれば、メモリコントローラ13とメインメモリ12との間のデータ転送を、CPU11を介さずに、直接制御することができる。
【0042】
KVSメモリ14は、
図1または
図2に示したようなデータ領域を格納している。KVSメモリ14の構成及び動作は、
図1または
図2を用いて説明した通りであり、その説明は省略する。
【0043】
また、
図4はメインメモリ12におけるデータ領域の構成例を示す。CPU11とメインメモリ12は、key-valueストア(KVS)を有するメモリを構成する。例えば、CPU11がハッシュ値を生成する機能を有する場合、
図4に示すように、メインメモリ12はハッシュテーブル領域12Aと実データ領域12Bとを有する。また、メインメモリ12は、主記憶としてデータや命令コードを記憶する。
【0044】
[2]集合演算
次に、第1実施形態のメモリシステムにおける集合演算について説明する。
【0045】
いま、KVSメモリ14中に、animal = {dog, tuna, cat}と、fish = {porgy, tuna, salmon}という2つのデータ集合がストアされていたとする。以下に、AND演算、OR演算、及びNOT演算の動作を述べる。
【0046】
(1)AND演算
図5は、第1実施形態におけるAND演算の動作を示すフローチャートである。
具体的な例として、animal AND fishという演算を行う場合の処理を示す。まず、CPU11はメモリコントローラ13を介してKVSメモリ14に対して、GET(animal, NULL)という命令を発行する(ステップS1)。続いて、CPU11は、GET(animal, NULL)の命令に対して、KVSメモリ14から出力されたデータ集合を前述したKVS命令の動作と同様に(ハッシュ関数等をソフトウェア的に処理して)、answer集合としてメインメモリ12に記憶させる。すなわち、CPU11はメインメモリ12に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ12に記憶される(ステップS2)。これにより、メインメモリ12はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ12には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【0047】
次に、CPU11は、メインメモリ12中のanswer集合の中の各要素が、KVSメモリ14内のfish集合の中に存在するかどうか調べる。最初は、CPU11がKVSメモリ14に対して、GET(fish, dog)という命令を発行する(ステップS3)。この返り値はFALSEであるため、CPU11はメインメモリ12中のanswer集合の中の要素dogを削除する。すなわち、CPU11はメインメモリ12に対して、DELETE(answer, dog)の命令を発行する(ステップS4)。
【0048】
続いて、CPU11は、メインメモリ12中のanswer集合の中の全ての要素の処理が終了したかを判定する(ステップS5)。ここでは、answer集合の中の全ての要素の処理が終了していないため、ステップS3に戻り、ステップS3以降の処理を繰り返す。
【0049】
CPU11は、KVSメモリ14中のfish集合の中からtunaを探す。すなわち、CPU11はKVSメモリ14に対して、GET(fish, tuna)という命令を発行する(ステップS3)。すると、この返り値はTRUEであるため、次に進む。
【0050】
catについても同様に、CPU11はKVSメモリ14中のfish集合の中からcatを探す。すなわち、CPU11はKVSメモリ14に対して、GET(fish, cat)という命令を発行する(ステップS3)。すると、この返り値はFALSEであるため、CPU11はメインメモリ12中のanswer集合の中の要素catを削除する。すなわち、CPU11はメインメモリ12に対して、DELETE(answer, cat)の命令を発行する(ステップS4)。
【0051】
ステップS5において、answer集合の中の全ての要素の処理が終了すると、結果として、メインメモリ12中のanswer集合はanswer = {tuna}となり、AND演算の解となる(ステップS6)。
【0052】
なお、answerと別の名前の解集合を用意すれば、同時に複数のAND演算を行うことも可能である。
【0053】
(2)OR演算
図6は、第1実施形態におけるOR演算の動作を示すフローチャートである。
具体的な例として、animal OR fishという演算を行う場合の処理を示す。まず、CPU11はメモリコントローラ13を介してKVSメモリ14に対して、GET(animal, NULL)という命令を発行する(ステップS11)。続いて、GET(animal, NULL)の命令に対して、KVSメモリ14から出力されたデータ集合を、CPU11はanswer集合としてメインメモリ12に記憶させる。すなわち、CPU11はメインメモリ12に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ12に記憶される(ステップS12)。これにより、メインメモリ12はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ12には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【0054】
次に、CPU11は、KVSメモリ14中のfish集合の中の各要素がメインメモリ12中のanswer集合の中に存在するかどうかを調べる。最初は、CPU11がメインメモリ12に対して、GET(answer, porgy)という命令を発行する(ステップS13)。この返り値はFALSEであるため、CPU11はporgyをメインメモリ12中のanswer集合に入れる。すなわち、CPU11はメインメモリ12に対して、PUT(answer, porgy)の命令を発行する(ステップS14)。
【0055】
続いて、CPU11は、KVSメモリ14中のfish集合の中の全ての要素の処理が終了したかを判定する(ステップS15)。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップS13に戻り、ステップS13以降の処理を繰り返す。
【0056】
CPU11は、KVSメモリ14中のfish集合の中のtunaがメインメモリ12中のanswer集合の中に存在するかどうかを調べる。すなわち、CPU11はメインメモリ12に対して、GET(answer, tuna)という命令を発行する(ステップS13)。すると、返り値はTRUEであるため、次に進む。
【0057】
salmonについても同様に、CPU11はfish集合の中のsalmonがメインメモリ12中のanswer集合の中に存在するかどうかを調べる。すなわち、CPU11はメインメモリ12に対して、GET(answer, salmon)という命令を発行する(ステップS15)。すると、この返り値はFALSEであるため、CPU11はsalmonをメインメモリ12中のanswer集合に入れる。すなわち、CPU11はメインメモリ12に対して、PUT(answer, salmon)の命令を発行する(ステップS14)。
【0058】
ステップS15において、fish集合の中の全ての要素の処理が終了すると、結果として、メインメモリ12中のanswer集合はanswer = {dog, tuna, cat, porgy, salmon}となり、OR演算の解となる(ステップS16)。
【0059】
なお、answerと別の名前の解集合を用意すれば、同時に複数のOR演算を行うことも可能である。
【0060】
(3)NOT演算
図7は、第1実施形態におけるNOT演算の動作を示すフローチャートである。
具体的な例として、animal NOT fishという演算を行う場合の処理を示す。まず、CPU11はメモリコントローラ13を介してKVSメモリ14に対して、GET(animal, NULL)という命令を発行する(ステップS21)。続いて、GET(animal, NULL)の命令に対して、KVSメモリ14から出力されたデータ集合を、CPU11はanswer集合としてメインメモリ12に記憶させる。すなわち、CPU11はメインメモリ12に対して、PUT(answer, dog)、PUT(answer, tuna)、PUT(answer, cat)という命令を発行する。この結果、answer = {dog, tuna, cat}という集合がメインメモリ12に記憶される(ステップS22)。これにより、メインメモリ12はkey-value型データを有するメモリとして機能する。すなわち、メインメモリ12には、keyとしてのanswerとvalueとしての{dog, tuna, cat}のペアが記憶される。
【0061】
次に、CPU11は、KVSメモリ14中のfish集合の中の各要素を、メインメモリ12中のanswer集合から削除する。最初は、CPU11がメインメモリ12に対して、DELETE(answer, porgy)という命令を発行する(ステップS23)。
【0062】
続いて、CPU11は、KVSメモリ14中のfish集合の中の全ての要素の処理が終了したかを判定する(ステップS24)。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップS23に戻り、ステップS23以降の処理を繰り返す。
【0063】
CPU11は、KVSメモリ14中のfish集合の中のtuna, salmonについても同様に、メインメモリ12中のanswer集合から削除する(ステップS23)。
【0064】
ステップS24において、fish集合の中の全ての要素の処理が終了すると、結果として、メインメモリ12中のanswer集合はanswer = {dog, cat}となり、NOT演算の解となる(ステップS25)。
【0065】
なお、answerと別の名前の解集合を用意すれば、同時に複数のNOT演算を行うことも可能である。
【0066】
また、前述したCPU11が行っている作業は、メモリコントローラ13が有するダイレクトメモリアクセス(DMA)機能によりすべて実行することができる。CPU11が行っている作業を、メモリコントローラ13のDMA機能によって全て行うことにより、CPU11に負荷をかけることなく、前述の集合演算を行うことが可能である。
【0067】
[3]変形例1
図8は、第1実施形態における変形例1のメモリシステムのハードウェア構成を示すブロック図である。
【0068】
図示するように、変形例1は、
図3に示した第1実施形態のメモリシステムにおいて、ハッシュ生成器16を備える構成を有する。ハッシュ生成器16は、任意長のデータを固定長のビット列に変換する、いわゆるハッシュ関数の機能を持つ。ここでは、ハッシュ生成器16は、データ(key)の入力に対して、key-value型データが記憶されたアドレスを生成する。
【0069】
図8におけるKVSメモリ14は、
図1に示したKVSメモリ14と同様な構成を有する。また、メインメモリ12は、
図4に示したメインメモリ12と同様な構成を有する。したがってここでは、
図8のKVSメモリ14及びメインメモリ12の詳細な構成及び動作の説明は省略する。
【0070】
変形例1における集合演算の動作は、第1実施形態における動作と同様である。変形例1では、ハッシュ生成器16を備えることにより、集合演算の実行時におけるCPU11の負荷を低減することができる。その他の構成及び効果は前述した第1実施形態と同様である。
【0071】
[4]変形例2
図9は、第1実施形態における変形例2のメモリシステムのハードウェア構成を示すブロック図である。
【0072】
図示するように、変形例2は、
図3に示した第1実施形態のメモリシステムにおいて、ハッシュ生成器16を備え、KVSメモリとしてDRAM141を用いている。さらに、メモリコントローラ13に接続されたメモリ装置としてNANDフラッシュメモリ17を備える。
【0073】
図9におけるDRAM141は、
図1に示したKVSメモリ14と同様な構成を有する。また、メインメモリ12は、
図4に示したメインメモリ12と同様な構成を有する。したがってここでは、
図9のDRAM141及びメインメモリ12の詳細な構成及び動作の説明は省略する。
【0074】
変形例2では、第1実施形態におけるKVSメモリ14としてDRAM141が用いられており、変形例2における集合演算の動作は、第1実施形態における動作と同様である。さらに、ハッシュ生成器16を備えることにより、集合演算の実行時におけるCPU11の負荷を低減することができる。その他の構成及び効果は前述した第1実施形態と同様である。
【0075】
[5]変形例3
図10は、第1実施形態における変形例3のメモリシステムのハードウェア構成を示すブロック図である。
【0076】
図示するように、変形例3は、
図3に示した第1実施形態のメモリシステムにおいて、KVSメモリとしてCAM−RAM142を用いている。さらに、メモリコントローラ13に接続されたメモリ装置としてNANDフラッシュメモリ17を備える。
【0077】
図10におけるCAM−RAM142は、
図2に示したCAM−RAM142と同様な構成を有する。また、メインメモリ12は、
図4に示したメインメモリ12と同様な構成を有する。したがってここでは、
図10のCAM−RAM142及びメインメモリ12の詳細な構成及び動作の説明は省略する。
【0078】
変形例3では、第1実施形態におけるKVSメモリ14としてCAM−RAM142が用いられており、変形例3における集合演算の動作は、第1実施形態における動作と同様である。さらに、CAM−RAM142を備えることにより、集合演算の実行時におけるCPU11の負荷を低減することができる。その他の構成及び効果は前述した第1実施形態と同様である。
【0079】
[第2実施形態]
[1]ハードウェア構成
第2実施形態のメモリシステムのハードウェア構成について説明する。
図11は、第2実施形態のメモリシステムのハードウェア構成を示すブロック図である。
図示するように、メモリシステムは、CPU11、メインメモリ12、メモリコントローラ13、第1のKVSメモリ24、及び第2のKVSメモリ34を備える。さらに、CPU11、メインメモリ12、及びメモリコントローラ13の間は、バス15にて接続されている。
【0080】
CPU11は、メインメモリ12、メモリコントローラ13、及び第1、第2のKVSメモリ24、34を制御し、後述する集合演算を行う。メモリコントローラ13は、KVSメモリ24、34及びその他のメモリ(図示しない)を制御する。メモリコントローラ13は、ダイレクトメモリアクセス(DMA:Direct Memory Access)機能を持つ回路を有する。DMA機能を用いれば、メモリコントローラ13とメインメモリ12との間のデータ転送を、CPU11を介さずに、直接制御することができる。
【0081】
第1、第2のKVSメモリ24、34は、
図1または
図2に示したようなデータ領域を格納している。KVSメモリ24、34の構成及び動作は、
図1または
図2を用いて説明した通りであり、その説明は省略する。
【0082】
[2]集合演算
次に、第2実施形態のメモリシステムにおける集合演算について説明する。
【0083】
第2実施形態における集合演算の動作は、前述した第1実施形態の集合演算の動作において、CPU11をメモリコントローラ13に置き換え、KVSメモリ14を第1のKVSメモリ24に、メインメモリ12を第2のKVSメモリ34にそれぞれ置き換えたものである。
【0084】
いま、第1のKVSメモリ24中に、animal = {dog, tuna, cat}と、fish = {porgy, tuna, salmon}という2つのデータ集合がストアされていたとする。以下に、
図3〜
図5を参照してAND演算、OR演算、及びNOT演算の動作を述べる。
【0085】
(1)AND演算
具体的な例として、animal AND fishという演算を行う場合の処理を示す。まず、メモリコントローラ13は第1のKVSメモリ24に対して、GET(animal, NULL)という命令を発行する(ステップS1)。続いて、GET(animal, NULL)の命令に対して、第1のKVSメモリ24から出力されたデータ集合を、メモリコントローラ13はanswer集合として第2のKVSメモリ34に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第2のKVSメモリ34に記憶される(ステップS2)。
【0086】
次に、メモリコントローラ13は、第2のKVSメモリ34中のanswer集合の中の各要素が第1のKVSメモリ24内のfish集合の中に存在するかどうか調べる。最初は、メモリコントローラ13が第1のKVSメモリ24に対して、GET(fish, dog)という命令を発行する(ステップS3)。この返り値はFALSEであるため、メモリコントローラ13は第2のKVSメモリ34中のanswer集合の中の要素dogを削除する(ステップS4)。
【0087】
続いて、メモリコントローラ13は、第2のKVSメモリ34中のanswer集合の中の全ての要素の処理が終了したかを判定する(ステップS5)。ここでは、answer集合の中の全ての要素の処理が終了していないため、ステップS3に戻り、ステップS3以降の処理を繰り返す。
【0088】
メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中からtunaを探す。すなわち、メモリコントローラ13は第1のKVSメモリ24に対して、GET(fish, tuna)という命令を発行する(ステップS3)。すると、この返り値はTRUEであるため、次に進む。
【0089】
catについても同様に、メモリコントローラ13は第1のKVSメモリ24中のfish集合の中からcatを探す。すなわち、メモリコントローラ13は第1のKVSメモリ24に対して、GET(fish, cat)という命令を発行する(ステップS3)。すると、この返り値はFALSEであるため、メモリコントローラ13は第2のKVSメモリ34中のanswer集合の中の要素catを削除する(ステップS4)。
【0090】
ステップS5において、answer集合の中の全ての要素の処理が終了すると、結果として、第2のKVSメモリ34中のanswer集合はanswer = {tuna}となり、AND演算の解となる(ステップS6)。
【0091】
(2)OR演算
具体的な例として、animal OR fishという演算を行う場合の処理を示す。まず、メモリコントローラ13は第1のKVSメモリ24に対して、GET(animal, NULL)という命令を発行する(ステップS11)。続いて、GET(animal, NULL)の命令に対して、第1のKVSメモリ24から出力されたデータ集合を、メモリコントローラ13はanswer集合として第2のKVSメモリ34に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第2のKVSメモリ34に記憶される(ステップS12)。
【0092】
次に、メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中の各要素が第2のKVSメモリ34中のanswer集合の中に存在するかどうかを調べる。最初は、メモリコントローラ13が第2のKVSメモリ34に対して、GET(answer, porgy)という命令を発行する(ステップS13)。この返り値はFALSEであるため、メモリコントローラ13はporgyを第2のKVSメモリ34中のanswer集合に入れる(ステップS14)。
【0093】
続いて、メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中の全ての要素の処理が終了したかを判定する(ステップS15)。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップS13に戻り、ステップS13以降の処理を繰り返す。
【0094】
メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中のtunaが第2のKVSメモリ34中のanswer集合の中に存在するかどうかを調べる。すなわち、メモリコントローラ13は第2のKVSメモリ34に対して、GET(answer, tuna)という命令を発行する(ステップS13)。すると、返り値はTRUEであるため、次に進む。
【0095】
salmonについても同様に、メモリコントローラ13はfish集合の中のsalmonが第2のKVSメモリ34中のanswer集合の中に存在するかどうかを調べる。すなわち、メモリコントローラ13は第2のKVSメモリ34に対して、GET(answer, salmon)という命令を発行する(ステップS15)。すると、この返り値はFALSEであるため、メモリコントローラ13はsalmonを第2のKVSメモリ34中のanswer集合に入れる(ステップS14)。
【0096】
ステップS15において、fish集合の中の全ての要素の処理が終了すると、結果として、第2のKVSメモリ34中のanswer集合はanswer = {dog, tuna, cat, porgy, salmon}となり、OR演算の解となる(ステップS16)。
【0097】
(3)NOT演算
具体的な例として、animal NOT fishという演算を行う場合の処理を示す。まず、メモリコントローラ13は第1のKVSメモリ24に対して、GET(animal, NULL)という命令を発行する(ステップS21)。続いて、GET(animal, NULL)の命令に対して、第1のKVSメモリ24から出力されたデータ集合を、メモリコントローラ13はanswer集合として第2のKVSメモリ34に記憶させる。すなわち、answer = {dog, tuna, cat}という集合が第2のKVSメモリ34に記憶される(ステップS22)。
【0098】
次に、メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中の各要素を、第2のKVSメモリ34中のanswer集合から削除する。最初は、メモリコントローラ13が第2のKVSメモリ34に対して、DELETE(answer, porgy)という命令を発行する(ステップS23)。
【0099】
続いて、メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中の全ての要素の処理が終了したかを判定する(ステップS24)。ここでは、fish集合の中の全ての要素の処理が終了していないため、ステップS23に戻り、ステップS23以降の処理を繰り返す。
【0100】
メモリコントローラ13は、第1のKVSメモリ24中のfish集合の中のtuna, salmonについても同様に、第2のKVSメモリ34中のanswer集合から削除する(ステップS23)。
【0101】
ステップS24において、fish集合の中の全ての要素の処理が終了すると、結果として、第2のKVSメモリ34中のanswer集合はanswer = {dog, cat}となり、NOT演算の解となる(ステップS25)。
【0102】
また、前述のメモリコントローラ13が行っている作業は、メモリコントローラ13が有するダイレクトメモリアクセス(DMA)機能によりすべて実行することができる。メモリコントローラ13が行っている作業を、メモリコントローラ13のDMA機能によって全て行うことにより、メモリコントローラ13に負荷をかけることなく、前述の集合演算を行うことが可能である。
【0103】
[3]変形例1
図12は、第2実施形態における変形例1のメモリシステムのハードウェア構成を示すブロック図である。
【0104】
図示するように、変形例1は、
図11に示した第2実施形態のメモリシステムにおいて、ハッシュ生成器16を備え、KVSメモリとしてDRAM241とCAM−RAM型のNANDフラッシュメモリ341を用いている。
【0105】
図12におけるDRAM241は、
図1に示したKVSメモリ14と同様な構成を有する。また、CAM−RAM型のNANDフラッシュメモリ341は、
図2に示したCAM−RAM142と同様な構成を有する。したがってここでは、
図12のDRAM241及びCAM−RAM型のNANDフラッシュメモリ341の詳細な構成及び動作の説明は省略する。
【0106】
変形例1における集合演算の動作は、第2実施形態における動作と同様である。さらに、ハッシュ生成器16及びCAM−RAM型のNANDフラッシュメモリ341を備えることにより、集合演算の実行時におけるCPU11の負荷を低減することができる。その他の構成及び効果は前述した第2実施形態と同様である。
【0107】
[4]変形例2
図13は、第2実施形態における変形例2のメモリシステムのハードウェア構成を示すブロック図である。
【0108】
図示するように、変形例2は、
図11に示した第2実施形態のメモリシステムにおいて、KVSメモリとしてCAM−RAM242とCAM−RAM型のNANDフラッシュメモリ341を用いている。
【0109】
図13におけるCAM−RAM242とCAM−RAM型のメモリ341は、
図2に示したCAM−RAM142と同様な構成を有する。したがってここでは、
図12のCAM−RAM242とCAM−RAM型のメモリ341の詳細な構成及び動作の説明は省略する。
【0110】
変形例2における集合演算の動作は、第2実施形態における動作と同様である。さらに、CAM−RAM242及びCAM−RAM型のNANDフラッシュメモリ341を備えることにより、集合演算の実行時におけるCPU11の負荷を低減することができる。その他の構成及び効果は前述した第2実施形態と同様である。
【0111】
実施形態によれば、全文検索システム等で多発する集合演算に係るシステム負荷を著しく低減し、さらに高速に集合演算を行うことが可能なメモリシステムを提供できる。
【0112】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。