JP5401676B2 - マルチスレッドアプリケーション用のハッシュテーブルのコンカレントリハッシュの実行 - Google Patents

マルチスレッドアプリケーション用のハッシュテーブルのコンカレントリハッシュの実行 Download PDF

Info

Publication number
JP5401676B2
JP5401676B2 JP2012504646A JP2012504646A JP5401676B2 JP 5401676 B2 JP5401676 B2 JP 5401676B2 JP 2012504646 A JP2012504646 A JP 2012504646A JP 2012504646 A JP2012504646 A JP 2012504646A JP 5401676 B2 JP5401676 B2 JP 5401676B2
Authority
JP
Japan
Prior art keywords
bucket
buckets
index
capacity
hash table
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.)
Expired - Fee Related
Application number
JP2012504646A
Other languages
English (en)
Other versions
JP2012523610A (ja
Inventor
アレクサンドロヴィック マラコヴ、アントン
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.)
Intel Corp
Original Assignee
Intel Corp
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 Intel Corp filed Critical Intel Corp
Publication of JP2012523610A publication Critical patent/JP2012523610A/ja
Application granted granted Critical
Publication of JP5401676B2 publication Critical patent/JP5401676B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5011Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals
    • G06F9/5016Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resources being hardware resources other than CPUs, Servers and Terminals the resource being the memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/46Multiprogramming arrangements

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
  • Punching Or Piercing (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Description

ハッシュテーブルは、データベース、サーチエンジン、統計処理、および動的スクリプト言語等、多岐にわたるアプリケーションの基本的な構築ブロックである。ハッシュテーブルは、鍵と値とを関連付けるコンテナ群である。ハッシュテーブルは、テーブルのエントリに格納されているアイテムの位置の配置(バケット)を、そのハッシュ値とコンテナの現在の容量とを利用して計算する。しかし、コンテナは通常、その容量を動的に増加させる必要があり、これは、再割り当て、またはさらなるメモリの部分の割り当てを意味する。従って、増加した容量により、アイテムの配置が無効になり、アイテムを新たな位置に移す必要がでてくることもあり、この処理は通常、リハッシュと称されている。
ハッシュテーブルの既知のコンカレントアルゴリズムでは、スレッドがコンテナのサイズを変更すると決定すると、一部の(あるいは全ての場合もある)並列処理をブロック(一時停止)して、サイズ変更とリハッシュ処理の両方が終わるのを待つ。これにより、並列性能ひいては性能が落ちる。また別の問題として、サイズ変更におけるランタイムおよび処理の複雑性は、サイズ変更を行わない同じ処理とかなり異なってしまうことがある。
本発明の一実施形態におけるハッシュテーブルを更新する方法のフロー図である。 本発明の一実施形態におけるバケットのブロック図である。 本発明の一実施形態における新たなバケットの割り当てを示すブロック図である。 本発明の別の実施形態における新たなバケットの割り当てを示すブロック図である。 本発明の一実施形態においてルックアップ/リハッシュを行う方法のフロー図である。 本発明の一実施形態におけるシステムのブロック図である。
実施形態は、マルチプロセッサシステム(例えば1以上のマルチコアプロセッサを有するシステム等)の1以上のコアを実行することのできる1以上のスレッドによりアクセスされる共有メモリである並列ハッシュテーブルをコンカレントにサイズ変更する、および、オンデマンドバケットごとにリハッシュするために利用することができる。バケットにアイテムセットを格納可能なハッシュテーブルに適用可能である。簡潔性のために、テーブルの初期容量を2の累乗とする。あるアイテムのハッシュ値を容量で除算した余剰は、そのアイテムを格納するバケットのインデックスを示す。簡潔性のために、一部の実施形態では、バケットインデックスを式1:バケット_idx=ハッシュ&(容量−1)により計算することができる。本式において、ハッシュとは、鍵をハッシュ関数に当てはめてハッシュ値を得るハッシュ計算により得られるハッシュ値であり、「&」は、二進表現のビット積ANDを示す。一実施形態では、容量は、ハッシュテーブルのバケット数の単位で示されるが、本発明の範囲はこの点に限定はされない。
容量を増やすという観点から、本発明の一実施形態におけるアルゴリズムは、既存のバケットと同数のバケットを割り当てて、既存のバケットも維持することで、バケット数を二倍にすることができる。各新たなバケットは、値が1である最高ビットを除いて、新たなバケットのインデックスと同じ値(つまりビットセット)を持つインデックスを有する既存のバケット(親)へと論理的にマッピングされる。例えばバケットのインデックスが二進法表記で00101101である場合、親バケットのインデックスは00001101となる。つまり、親のバケットのインデックスは式2:親_idx=バケット_idx&(1<<└Log2(バケット_idx)┘)−1)から得ることができる。本式において、<<は、二進左オペランドを、右オペランドが指定するビット数だけシフトすることを示す。
多くの実装例では、新たなバケットが他の新たなバケットを親とする、ということができる。後述するが一部の実装例では、そのための割り当てを単一のメモリ要求に組み合わせることができる。
図1は、本発明の一実施形態におけるハッシュテーブルを更新する方法のフロー図である。図1を参照すると、方法10は、ハッシュテーブルでスペースの増加が必要であると決定されることにより始められてよい(ブロック20)。本発明の範囲はこの点に限定はされないが、このような決定は、テーブルの負荷率(load factor)に基づき、ハッシュテーブルに格納されているデータ量が所定の閾値(例えばテーブル全量の一定のパーセント)に達したときの新たなデータ対の挿入処理の時点で、例えばシステムソフトウェアが行うことができる。もちろん、他の実施形態では、スペースの増加が必要であるという決定は他の様々な方法で行うことができる。例えばユーザは、ある呼び出しにおけるバケット数をリザーブ処理用に指定することもできる。
増加の決定が行われると、制御をブロック30に渡し、新たなバケットを割り当ててよい。より具体的には、ハッシュテーブルの現在のバケット数に対応する数のバケットを割り当ててよい。このようにして、テーブルに割り当てるバケット数を二倍にすることができる。一実施形態では、アロケータを呼び出して、必要なメモリ量を得て、バケットを新たな空のバケットとして初期化する。そして、この新たなスペースを公開することができる(ブロック40)。本発明の範囲はこの点に限定はされないが、公開は、容量の値を含む変数に更新することにより行うことができる。一実施形態では、この更新は、「容量」変数に対する、解放とともに行う格納処理(あるいは、アトミック・ライト)により行ってよい。または、このような更新を、容量から1を差し引いた値に対応するマスクに対して行うこともできる。従って新たなバケットを割り当て、この新たなスペースを公開することにより、割り当ては、元のバケットに存在しているデータを新たなバケットへと、完全リハッシュをする必要なく完了する。つまり、割り当ては、リハッシュとは独立して行われ、新たなスペースの公開で終了する。公開される新たなスペース内の各バケットは、最初は、リハッシュがなされていないものとしてマーキングされている。
図2Aは、本発明の一実施形態におけるバケットのブロック図である。図2Aに示すように、バケット100は、データ、つまり鍵およびアイテムの対を含むデータ部分110(ここでは概してデータ対と称される)を含んでよい。データ部分110は、オプションとして、直接に(埋め込みにより)または間接に、例えばポインタにより、限られた対のセット(アレイ)を含むことができる。加えて、制御情報120が存在している。制御情報120には、ミューテックス等の同期オブジェクト(a)、フラグ、カウンタ等の様々な情報を含みうる制御フィールド(b)、および、所与のバケットがリハッシュされたかを示す様々な情報およびリハッシュされたレベルの数を含んでよい、リハッシュ状態フィールド(c)を含む様々な情報が含まれてよい(これを一対多の方法で利用することができることは後述する)。
図2Bは、本発明の一実施形態における新たなバケットの割り当てを示すブロック図である。図2Bに示すように、複数の既存のバケット200−200が存在している。これら各バケットは、一例としては図2Aのバケット100に基づいている。再割り当て処理においては、新たなバケットを親バケットに論理的にマッピングして、新たな空のバケットのセット210−210を生成する。このように、割り当ては、既存のバケットと同じ数だけ行われる。これら新たなバケットはそれぞれ、親バケットのいずれかに論理的にマッピングされて、例えば図2Aに示すリハッシュフィールド(c)等の制御情報120内に、リハッシュがなされていないものとしてマーキングされる。
また、新たなバケットのうち少なくとも幾つかを、図2Cに示す他の新たなバケットにマッピングすることもできる。従って図2Cは図2Bのサブセットであり、(1)親バケットもリハッシュされていない、および、(2)割り当て同士の組み合わせ、という2つの別個の可能性を示す。このように、新たな空のバケット210−210を、既存のバケット200−200にマッピングする。そしてさらなる新たな空のバケット220−220も、既存のバケット200−200にマッピングする。加えて、他の新たな空のバケット230‐230を、新たな空のバケット210‐210にマッピングする。バケット210から始まり230で終わる新たな空のバケットを、組み合わせられた割り当てが連続したスペースとして、バケット数を一度で数倍にすることができる(例えば、バケット数を4倍にすることができる)。
新たな容量の値の割り当ておよび公開が終わると、ルックアップ処理により、新たな容量の値を利用してバケットインデックスを計算する。新たな容量を公開した後で、新たなバケットを探す処理は、先ず、親バケット(1または複数)を探して、オプションとして(しかし最終的には)そのコンテンツを新たなバケット(1または複数)へとリハッシュする。従って、コンテナ内で、リハッシュ処理を延期したり分割したりすることができる。新たな容量の値を利用して計算されたインデックスは、リハッシュがなされていないものとしてマーキングされているバケットを示している可能性がある。その場合には、リハッシュされたバケットまたは要求されている鍵を発見するために、先ず、親バケット、次に祖父母バケットを探す、というようにルックアップ処理を続ける。所望の情報が見つかると、ルックアップの結果を要求者に戻す。さらには、バケットごとのリハッシュ(処理済のバケットのリハッシュ)も行うことができる。このタイプのリハッシュは、再割り当て時に全テーブルの完全なリハッシュを行う時間とコストをかけるのではなく、ルックアップ要求に応じて個々のバケットをリハッシュ(オンデマンドにより)する処理であり、レイジー・リハッシュと称される場合がある。このタイプのリハッシュは、また、外部の(ユーザによる)要求に従って行うこともできる。
従ってオプションとして(しかし最終的には)、途上にある全てのアイテムを、データ対を(これに属していうる場合)新たなバケットに移動させることにより、リハッシュすることができる。このために異なる方法を利用することも可能である。一例としては、2状態を利用してバケットを、リハッシュされているものか、リハッシュされていないものかを識別する。この実装例では、専用オーナーをリハッシュ処理に割り当てる。こうするために、スレッドは、相互排他的な同期を利用してバケットをロックして、他のスレッドが処理中にアクセスできないようにして待たせる。
第3の状態である「部分的リハッシュ」と称される状態を加えて、他のスレッドが、リハッシュされた新たなバケットにコンカレントにアクセスしたり、同じ親バケットのリハッシュに参加したりすることがないようにすることもできる。3状態の実装の主な目的は、バケットが別のスレッドによりリハッシュされるまで待たなければならないスレッドのロックを解除することである。
2状態のロジックについては、2つのバケット(親および次の後継バケット)の間の再帰的なリハッシュを行うことができ、あるいは、親を全てのリハッシュされていない後続するものにリハッシュする一対多の方法を利用することができる。2状態の再帰的なリハッシュアルゴリズムにおいては、1つの状態変数(例えば図2Aの制御情報120に存在するもの等)が、NEW(空のリハッシュされていないもの)、EMPTY(しかしリハッシュされているもの)、およびFILLED(リハッシュされているもの)という状態をとることができる。例えば、データ対へのポインタは、そのデータのことを表しつつ、且つ、全ての3つの状態を表すことができる。一対多の実装では、あるバケットのリハッシュされたレベル(容量)の数を表すバケットデータ構造のさらなる部材が利用される点に留意されたい。
図3は、本発明の一実施形態においてルックアップ/リハッシュを行う方法のフロー図である。このフロー図は、一対一(再帰的)および一対多の方法両方に対応する高レベル図を示すことを目的としており、そのいずれをも実装可能であり、両方を以下に詳述する。ルックアップ要求は、発見のみ又は挿入処理(find-only or insert operations)についてのものであってよい。説明の便宜上、発見処理について説明する。図3に示すように、方法300は、ルックアップ要求のバケットインデックスおよびアドレスを計算することから始められてよい(ブロック305)。例えば、要求されたデータ対に関連付けられている鍵をハッシュ関数に導入してハッシュ値を生成して、これをハッシュテーブルの容量とともに利用して、インデックス、ひいてはメモリのアドレスを得ることができる。次に、ルックアップ要求が、リハッシュされていない空のバケットに対するものであるかを判断する(ダイアモンド310)。ルックアップ要求がリハッシュされていないバケットに対するものではないと判断された場合には、インデックスされたバケットにアクセスしてルックアップを行い、データ対を要求者に提供する(ブロック315)。同期、バケット内の検索、レース条件のチェック、およびオプションとして全ルックアップ処理の再開(レースが検知された場合)等の追加的な処理をこのステップ中に行うこともできる、これらに関しては後述する。
ルックアップ要求がリハッシュされていないバケットに対するものであると判断された場合には、制御をブロック320に渡す。ブロック320では、親バケットに対してインデックスおよびアドレスを計算することができる。上述したように、一部の実装例では、これらのインデックスは、式2に従って計算することができる。計算されたインデックスは、親バケットに対するアクセスに利用することができる。アクセスされたバケットをチェックして、リハッシュされたものであるか、または、要求されているデータ対を含んでいるか、を判断する(ダイアモンド330)。この判断は、一部にバケットのリハッシュ状態に基づいて行われてよい。リハッシュされたバケットが発見された場合、バケット同士を同期して(ブロック340)、データ対を要求者に戻すことができる(ブロック350)。発見されない場合には、制御はブロック320に戻されて、このループをさらに繰り返す。ブロック340の同期には、検索またはリハッシュ処理を実行する前に、対象となるバケットをロックする処理が含まれてよい。ブロック350におけるリハッシュするか否かの判断は、所与のアルゴリズム(オンデマンドのリハッシュ、部分的なリハッシュ、または専用スレッドによるリハッシュ等)に基づいていてよい。リハッシュを実行する場合、1以上のバケットのリハッシュ状態を、リハッシュが実行されたときに更新してよい。一対多の方法においては、親および全ての新たなバケットの状態を変更する。リハッシュ後のこの点においては、親バケットから一部の対を取り出して、後継バケットに移す(また、一対多の方法では変更された状態も移す)。
バケットは割り当てを解除されたりコンカレントに移動させられたりしないので、ブロックしない、またはロックフリーのアルゴリズム(non-blocking or lock-free algorithms)のなかには、バケットおよび埋め込みデータにアクセスするために利用可能なものもある。このようにして、ハッシュテーブルを利用するアプリケーションの性能およびスケーラビリティを増加させることができる。
多数のスレッドが、共有リソースである1つのハッシュテーブルにアクセスするケースでは、リハッシュ・ルックアップ・レース条件が生じることがある。鍵が発見されない場合には、バケットのリハッシュ中に一緒に移動された可能性がある。鍵が存在しないことを確かめるには、現在の容量を、バケットインデックスを計算する際に利用した初期容量と比較する。これら同士が等しくない場合には、次に、これら値で計算したバケットインデックスが異なっているかを判断する(両方の比較は最後のものに還元することができる)。異なっている場合には、直近の後継バケットがリハッシュされた、またはされている最中の場合、ルックアップを再開するべきである(鍵が存在しないことを確かめる目的で)。容量が2を超える数で乗算された場合には、後継バケットが1つではない可能性がある。レース条件の一例として、並列環境において可能な以下のシーケンスがある。
<表1>
1.スレッド1:現在の容量を取得して、ルックアップ処理用にバケットインデックス(X)を計算する。
2.スレッド2:新たなバケットの割り当てを終了して、新たな容量を公開する。
3.スレッド3:新たな容量の値を取得して、バケット(X)の新たなスペース(Y)へのリハッシュを開始する。
4.スレッド1:アイテムについてのバケット(X)を検索して、結果、発見できなかった。しかしこれは、全テーブルアイテムが存在しない、ということを示しているわけではない、というのも、コンカレント成長(2)およびリハッシュ(3)により(Yに)移動される可能性もあるからである。
表2は、本発明の一実施形態におけるレース条件の存在を判断する擬似コードの例(つまり、リハッシュ衝突が起こりうるかをチェックするアルゴリズムの一例)を示す。
Figure 0005401676
一実施形態では、3つの関数を有する、2状態の再帰的なリハッシュアルゴリズムが利用可能であり、3つの関数とはつまり、ルックアップ関数、同期と呼び出しとを第3の関数であるリハッシュ関数に行うバケット取得関数、および、リハッシュ関数である。表3は、このような2状態の再帰的なリハッシュアルゴリズムの擬似コードを示す。
<表3>
ルックアップ:
1.所与の鍵に対してハッシュ値を計算する
2.現在の容量の値を取得して、バケットインデックスを計算する(ハッシュおよび容量を利用して)
3.読み出し用のバケット取得を呼び出す
4.バケットから鍵を検索する
a.発見された場合:バケットを解放して、実行するデータを戻す
5.発見されなかった場合:リハッシュレースをチェックする(表2に基づいて)
a.レースがない場合:「挿入処理を実行することができる、または」バケットを解放して戻る
b.レースが検知された:バケットを解放して(2)に移行する
バケット取得(読み書きロックについて実装する):
1.バケットアドレスを計算/取得
2.バケットの状態を取得する
a.NEW(リハッシュされていない)である場合:バケットに対する排他的なアクセス件を取得しようとする(一部のスレッドでは成功するはずである)
失敗した場合は、(3)に移行する
b.取得された:バケット状態がまだNEWであるときには(ダブルチェック)、バケットリハッシュを呼び出して戻る、を呼び出す
3.バケットへの所定のアクセスを取得する
バケット取得(相互排他的ロックのみの実装):
1.ハッシュおよび容量の値を利用してバケットアドレスを計算する
2.バケットへの(排他的な)アクセスを取得する
3.バケットの状態を取得する。
a.NEW(リハッシュされていない)である場合:バケットリハッシュを呼び出す。
バケットリハッシュ:(「バケット取得」アルゴリズムにより排他的なロックにおいて行われる)
1.新たなバケットをリハッシュされたものとしてマーキングする
2.親バケットのインデックスを計算する
3.読み出し用の親バケット取得を呼び出す
4.親バケットの各データアイテムについて、
a.ハッシュ値を計算する
b.アイテムを新たなバケットに移動すべきかをチェックして、結果がイエスであった場合、
i.必要に応じて、親バケットを排他的アクセスにアップグレードする(アップグレード中にロックが遮断された場合、(4)から再開する)
ii.親バケットから新たなバケットへアイテムを移動させる
バケットリハッシュ関数およびバケット取得関数が相互参照されているということから、このアルゴリズムが再帰的であることが分かる。さらに、本発明の一実施形態における並列リハッシュアルゴリズムは、同期レベルを述べているだけであり、特定のロックアルゴリズムを必要としない。例えば、「読み出し用のバケット取得」とは、排他的なロック、共有(リーダ)ロック、またはバージョンカウンタのみ(ブロックしない読み取り処理)の利用、を実際に利用することを意味することができる。また別の実施形態では、一対多の方法を利用することもできる。表4は、一対多のアルゴリズムの擬似コード表現である。
<表4>
ルックアップ:
1.所与の鍵についてハッシュ値を計算する
2.現在の容量の値を取得して、バケットインデックス(ハッシュおよび容量を利用して)およびアドレスを計算する
3.バケットの状態を取得して、
リハッシュされていない場合(新たな場合):
a.直近のリハッシュされたルート(親/祖父母等)バケットを発見する
b.取得されるまで、または新たなバケットの状態が「リハッシュされた」と変更されるまで、ルートバケットへの排他的なアクセスを取得しようと努め、状態が変更された場合には、必要に応じてロックを解除して、(4)に移る、
c.バケットリハッシュを呼び出す
4.バケットへの所定のアクセスを取得する
5.バケットから鍵を探す
d.発見された場合:バケットを解放して、実行するデータを戻す
6.発見されなかった場合:リハッシュレースをチェックする(表2に基づいて)
e.レースがない場合:「挿入処理を実行することができる、または」バケットを解放して戻る
f.レースが検知された:バケットを解放して(2)に移行する
バケットリハッシュ(相互排他的ロックにおいて実行):
1.ルーとバケットおよびその後継バケットそれぞれ全てについて、
a.容量の値を格納して、レベルフィールドをリハッシュする(従ってバケットをリハッシュされているものとしてマーキングする)
2.ルートバケットの各データアイテムについて、
b.ハッシュ値を計算する
c.アイテムを新たなバケットに移動すべきかをチェックして、結果がイエスであった場合、
i.親バケットから適切な新たなバケットへアイテムを移動させる
一実施形態では、図書館の連想コンテナのコードに実装することができる。従って、様々な実施形態では、全コンテナ(またはコンテナの一部)をロックして更新する代わりに、割り当てによって、既存のものと同数のバケットを割り当てて、古いほうのバケットも維持することで、バケット数を二倍にすることも可能である。各新たなバケットをリハッシュされていないものとしてマーキングして、既存のバケットに同じインデックスで論理的にマッピングする。一部の実施形態では、割り当てをさらにある公開に組み合わせて、単一のメモリ要求を利用することもできる。従って本発明の一実施形態におけるサイズ変更は、既存のバケットの無効化またはロックのいずれをも行わないので、並列性を脅かさない。
実施形態は数多くの異なるシステムタイプで実装可能である。図4は、本発明の一実施形態におけるシステムのブロック図である。図4に示すように、マイクロプロセッサシステム500はポイントツーポイントシステムであり、ここでは第1のプロセッサ570と第2のプロセッサ580とがポイントツーポイントインターコネクト550により連結されている。図4に示す各プロセッサ570および580はマルチコアプロセッサであってよく、第1および第2のプロセッサコアを含むが(つまり、プロセッサコア574aおよび574b、並びに、プロセッサコア584aおよび584b)、これ以外にも多くのコアが本プロセッサ内に存在している可能性が高い。プロセッサコアは、少なくとも一部の変換済みコードを実行してパフォーマンスを向上させる、および/または、コアのマイクロアーキテクチャがサポートしない命令を処理することができるよう、部分的なエミュレーションモデルを実装することができる。
さらに図4を参照すると、第1のプロセッサ570はさらにメモリコントローラハブ(MCH)572と、ポイントツポイント(P−P)インタフェース576および578とを含む。同様に、第2のプロセッサ580は、MCH582と、P−Pインタフェース586および588とを含む。図4示すように、MCH572および582は、プロセッサをメモリそれぞれ(つまり、メモリ532およびメモリ534)に連結し、これらはメインメモリ(例えばプロセッサそれぞれにローカルにアタッチされるDRAM)の一部であってよい。第1のプロセッサ570および第2のプロセッサ580は、P−Pインターコネクト552および554をそれぞれ介してチップセット590に連結されてよい。図4に示すように、チップセット590はP−Pインタフェース594および598を含む。
さらにチップセット590は、チップセット590と高性能グラフィックスエンジン538とを、P−Pインターコネクト539により連結するインタフェース592を含む。そしてチップセット590は、インタフェース596を介して第1のバス516に連結されてよい。図3に示すように、第1のバス516を第2のバス520に連結するバスブリッジ518とともに、様々な入出力(I/O)デバイス514が第1のバス516に連結されてよい。例えば一実施形態では、キーボード/マウス522、通信デバイス526、および、コード530を含みうるデータ格納ユニット528(例えば、ディスクドライブその他の大容量記憶デバイス)を含む様々なデバイスが第2のバス520に連結されてよい。さらにオーディオI/O524が第2のバス520に連結されてよい。
実施形態は、コードで実装されて、システムをプログラムして命令を行わせるのに利用されうる命令を格納する記憶媒体上に格納されてよい。記憶媒体には、これらに限定はされないが、フロッピー(登録商標)ディスク、光ディスク、固体ドライブ(SSD)、CD−ROM、CD−RW、および光磁気ディスク、半導体デバイス(ROM、DRAM等のRAM、SRAM、EPROM、フラッシュメモリ、EEPROM(登録商標)、磁気カードまたは光学カード等)、および、電子命令を格納するのに適した他の種類の媒体が含まれてよい。
本発明を限られた数の実施形態を参照して記載してきたが、当業者には数多くの変形例および変更例が可能であることが明らかである。添付請求項はこれら全ての変形例および変更例を本発明の真の精神および範囲に含むことを意図している。

Claims (15)

  1. 複数のスレッドによりコンカレントに共有され、第1の数のバケットを有するハッシュテーブルに前記第1の数と少なくとも等しい第2の数のバケットを割り当てる段階と、
    前記第1の数のバケットおよび前記第2の数のバケットを含む前記ハッシュテーブルの更新された容量を公開する段階と、
    前記第1の数のバケットの第1のバケットの内容を、後で前記第1のバケットに存在するデータ対についてルックアップ処理を実行するときに、前記第2の数のバケットの第2のバケットにリハッシュする段階と
    を備え、
    前記第2の数のバケットの各々は、前記第1の数のバケットまたは前記第2の数のバケットの対応する親に論理的にマッピングされ
    前記割り当てる段階は、前記第1の数のバケットの内容をリハッシュすることなく前記更新された容量を公開することで完了する、方法。
  2. リハッシュが必要であるかを判断するためにバケットをロックせずにチェックを実行する段階をさらに備える請求項1に記載の方法。
  3. 前記更新した容量を利用してバケットインデックスを計算して、前記バケットインデックスを利用してバケットにアクセスして、前記バケットがリハッシュされていないと判断した場合、前記更新された容量を利用して前記バケットを論理的にマッピングした親バケットの親バケットインデックスを、リハッシュされたルートバケットが発見されるまで再帰的に計算する段階をさらに備える請求項1又は2に記載の方法。
  4. ルックアップ要求のデータ対を検索するとき、またはその前に、前記バケットに前記リハッシュされたルートバケットの内容の少なくとも一部をリハッシュする段階をさらに備える請求項1から3のいずれか一項に記載の方法。
  5. 前記ルートバケットの前記内容の一部のみをリハッシュするときに、部分的なリハッシュインジケータを設定する段階をさらに備える請求項に記載の方法。
  6. 前記バケットからルックアップ要求のデータ対を探して、前記データ対を戻して、前記バケットの内容をリハッシュしない段階をさらに備える請求項1から5のいずれか一項に記載の方法。
  7. 第1のスレッドによるルックアップ処理に応じて、要求されているデータ対を前記第1の数のバケットの第1のバケットに発見しない場合、前記ハッシュテーブルの容量の現在の値を、前記ルックアップ処理についてのバケットインデックスの決定に利用した前記ハッシュテーブルの容量の値と比較して、当該値が前記現在の値と異なっている場合に、直近の後継バケットのインデックスを計算して、前記直近の後継のバケットにアクセスして、前記直近の後継のバケットのリハッシュ状態を判断する段階をさらに備える請求項1から6のいずれか一項に記載の方法。
  8. 前記リハッシュ状態がリハッシュされていない新たな状態を示していない場合、前記ルックアップ処理を再開する段階をさらに備える請求項に記載の方法。
  9. コンピュータに、
    複数のスレッドによりコンカレントに共有されるハッシュテーブルにルックアップ処理を行う段階であって、前記ハッシュテーブルの第1の容量の値を利用して、前記ハッシュテーブルの第1のバケットについてのバケットインデックスを計算して、前記バケットインデックスを利用して前記第1のバケットにアクセスして、前記第1のバケットが前記ルックアップ処理のデータ対を含まないと判断することを含む段階と、
    前記ハッシュテーブルの容量の現在の容量の値を、前記第1の容量の値と比較して、前記現在の容量の値が前記第1の容量の値と異なっている場合に、前記現在の容量の値を利用して、更新されたバケットインデックスを計算する段階と、
    前記更新されたバケットインデックスが前記バケットインデックスと異なっている場合に、次のバケットインデックスを計算して、前記更新されたバケットインデックスに対応する次のバケットにアクセスして、前記次のバケットのリハッシュ状態を判断する段階と
    前記ハッシュテーブルのバケットを、前記ルックアップ処理中に前記バケットにアクセスしている間にリハッシュする段階と
    を実行させるためのプログラム。
  10. 前記リハッシュ状態が新たな状態を示していない場合、前記ルックアップ処理を再開する段階をさらに実行させる請求項に記載のプログラム。
  11. 前記ルックアップ処理は第1のスレッドにより実行され、
    前記第1のスレッドが前記計算用の前記第1の容量の値を取得した後に、前記ハッシュテーブルが第2のスレッドにより拡張され、前記第1のスレッドが前記第1のバケットにアクセスする前に、第3のスレッドが、前記第1のバケットのリハッシュを開始する請求項9又は10に記載のプログラム。
  12. システムであって、
    それぞれが1以上のスレッドを実行する第1のコアおよび第2のコアを含むマイクロプロセッサであって、第1のスレッドは、複数のスレッドによりコンカレントに共有されるハッシュテーブルに第2の数のバケットを割り当て、前記ハッシュテーブルは、以前に第1の数のバケットを有しており、前記第2の数は前記第1の数と少なくとも等しく、前記第2の数のバケットの各々は、前記第1の数のバケットまたは前記第2の数のバケットの対応する親に論理的にマッピングされ、前記第1の数のバケットおよび前記第2の数のバケットを含む前記ハッシュテーブルの更新された容量を公開して、前記第1のスレッドは、前記割り当てを、前記第1の数のバケットの内容をリハッシュすることなく前記更新された容量を公開することで完了し、第2のスレッドは、リハッシュが必要であるかを判断するためにロック変数をチェックすることなく前記第1の数のバケットの第1のバケットに対してルックアップ処理を行い、第3のスレッドは、前記第1の数のバケットの前記第1のバケットの内容を、前記第1のバケットに存在するデータ対についてルックアップ処理を実行するときに、前記第2の数のバケットの第2のバケットにリハッシュするプロセッサと、
    前記マイクロプロセッサに連結されて前記ハッシュテーブルを格納する共有メモリであって、前記ハッシュテーブルは前記複数のスレッドの少なくとも一部によりコンカレントにアクセスされる共有メモリと
    を備えるシステム。
  13. 前記第2のスレッドは、前記更新した容量を利用して前記第2の数のバケットの中のバケットのバケットインデックスを計算して、前記バケットインデックスを利用して前記バケットにアクセスして、前記バケットがリハッシュされていないと判断した場合、前記バケットを論理的にマッピングした親バケットの親バケットインデックスを、リハッシュされたルートバケットが発見されるまで再帰的に計算する請求項12に記載のシステム。
  14. 前記第2のスレッドは、前記ルックアップの要求のデータ対を検索するとき、またはその前に、前記バケットに前記リハッシュされたルートバケットの内容の少なくとも一部をリハッシュする請求項12又は13に記載のシステム。
  15. 前記第2のスレッドは、前記ルートバケットの前記内容の一部のみをリハッシュするときに、前記ルートバケットの部分的なリハッシュインジケータを設定する請求項14に記載のシステム。
JP2012504646A 2009-04-08 2009-04-08 マルチスレッドアプリケーション用のハッシュテーブルのコンカレントリハッシュの実行 Expired - Fee Related JP5401676B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/RU2009/000169 WO2010117294A1 (en) 2009-04-08 2009-04-08 Performing concurrent rehashing of a hash table for multithreaded applications

Publications (2)

Publication Number Publication Date
JP2012523610A JP2012523610A (ja) 2012-10-04
JP5401676B2 true JP5401676B2 (ja) 2014-01-29

Family

ID=42936410

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012504646A Expired - Fee Related JP5401676B2 (ja) 2009-04-08 2009-04-08 マルチスレッドアプリケーション用のハッシュテーブルのコンカレントリハッシュの実行

Country Status (7)

Country Link
US (1) US9563477B2 (ja)
JP (1) JP5401676B2 (ja)
KR (1) KR101367450B1 (ja)
CN (1) CN102460392B (ja)
RU (1) RU2517238C2 (ja)
SG (1) SG175109A1 (ja)
WO (1) WO2010117294A1 (ja)

Families Citing this family (36)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8515965B2 (en) 2010-05-18 2013-08-20 Lsi Corporation Concurrent linked-list traversal for real-time hash processing in multi-core, multi-thread network processors
US9444757B2 (en) 2009-04-27 2016-09-13 Intel Corporation Dynamic configuration of processing modules in a network communications processor architecture
US8539199B2 (en) * 2010-03-12 2013-09-17 Lsi Corporation Hash processing in a network communications processor architecture
US9461930B2 (en) 2009-04-27 2016-10-04 Intel Corporation Modifying data streams without reordering in a multi-thread, multi-flow network processor
US8606791B2 (en) * 2011-06-17 2013-12-10 Microsoft Corporation Concurrently accessed hash table
US8812555B2 (en) * 2011-06-18 2014-08-19 Microsoft Corporation Dynamic lock-free hash tables
US9009106B1 (en) 2011-08-10 2015-04-14 Nutanix, Inc. Method and system for implementing writable snapshots in a virtualized storage environment
US8850130B1 (en) 2011-08-10 2014-09-30 Nutanix, Inc. Metadata for managing I/O and storage for a virtualization
US9747287B1 (en) 2011-08-10 2017-08-29 Nutanix, Inc. Method and system for managing metadata for a virtualization environment
US8863124B1 (en) 2011-08-10 2014-10-14 Nutanix, Inc. Architecture for managing I/O and storage for a virtualization environment
US8601473B1 (en) 2011-08-10 2013-12-03 Nutanix, Inc. Architecture for managing I/O and storage for a virtualization environment
US9652265B1 (en) 2011-08-10 2017-05-16 Nutanix, Inc. Architecture for managing I/O and storage for a virtualization environment with multiple hypervisor types
US8549518B1 (en) 2011-08-10 2013-10-01 Nutanix, Inc. Method and system for implementing a maintenanece service for managing I/O and storage for virtualization environment
US20130080481A1 (en) * 2011-09-27 2013-03-28 Sybase, Inc. Extreme large space allocation
US9772866B1 (en) 2012-07-17 2017-09-26 Nutanix, Inc. Architecture for implementing a virtualization environment and appliance
FI124397B (en) * 2013-01-04 2014-08-15 Tellabs Oy A method and apparatus for defining a paging system for a network element of a software configurable network
US9311359B2 (en) 2013-01-30 2016-04-12 International Business Machines Corporation Join operation partitioning
US9317548B2 (en) 2013-01-30 2016-04-19 International Business Machines Corporation Reducing collisions within a hash table
US9519668B2 (en) * 2013-05-06 2016-12-13 International Business Machines Corporation Lock-free creation of hash tables in parallel
US9367556B2 (en) 2013-06-14 2016-06-14 International Business Machines Corporation Hashing scheme using compact array tables
US9471710B2 (en) 2013-06-14 2016-10-18 International Business Machines Corporation On-the-fly encoding method for efficient grouping and aggregation
US10503716B2 (en) * 2013-10-31 2019-12-10 Oracle International Corporation Systems and methods for generating bit matrices for hash functions using fast filtering
US10250519B2 (en) 2014-05-21 2019-04-02 Oracle International Corporation System and method for supporting a distributed data structure in a distributed data grid
WO2015179092A1 (en) * 2014-05-21 2015-11-26 Oracle International Corporation System and method for supporting a distributed data structure in a distributed data grid
US9405699B1 (en) 2014-08-28 2016-08-02 Dell Software Inc. Systems and methods for optimizing computer performance
US9672248B2 (en) 2014-10-08 2017-06-06 International Business Machines Corporation Embracing and exploiting data skew during a join or groupby
US9922064B2 (en) 2015-03-20 2018-03-20 International Business Machines Corporation Parallel build of non-partitioned join hash tables and non-enforced N:1 join hash tables
US10650011B2 (en) 2015-03-20 2020-05-12 International Business Machines Corporation Efficient performance of insert and point query operations in a column store
US10303791B2 (en) 2015-03-20 2019-05-28 International Business Machines Corporation Efficient join on dynamically compressed inner for improved fit into cache hierarchy
US10108653B2 (en) 2015-03-27 2018-10-23 International Business Machines Corporation Concurrent reads and inserts into a data structure without latching or waiting by readers
US10831736B2 (en) 2015-03-27 2020-11-10 International Business Machines Corporation Fast multi-tier indexing supporting dynamic update
US9401959B1 (en) 2015-12-18 2016-07-26 Dropbox, Inc. Network folder resynchronization
US10255208B2 (en) * 2016-03-04 2019-04-09 Toshiba Memory Corporation Data transfer apparatus and data transfer system
US10467103B1 (en) 2016-03-25 2019-11-05 Nutanix, Inc. Efficient change block training
US10467390B1 (en) 2016-08-18 2019-11-05 Snap Inc. Cyclically dependent checks for software tamper-proofing
US11797539B2 (en) * 2019-09-12 2023-10-24 Oracle International Corporation Accelerated building and probing of hash tables using symmetric vector processing

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3164257B2 (ja) 1993-02-02 2001-05-08 日本電信電話株式会社 索引方法
US6115802A (en) 1995-10-13 2000-09-05 Sun Mircrosystems, Inc. Efficient hash table for use in multi-threaded environments
GB9811574D0 (en) * 1998-05-30 1998-07-29 Ibm Indexed file system and a method and a mechanism for accessing data records from such a system
US6427039B1 (en) * 1999-01-25 2002-07-30 Massachusetts Institute Of Technology Wavelength shifting and optical switching
US6578083B2 (en) * 1999-02-05 2003-06-10 Pluris, Inc. Method for monitoring data flow at a node on a network facilitating data transfer on at least one link having at least one class of service
US6578131B1 (en) * 1999-04-27 2003-06-10 Microsoft Corporation Scaleable hash table for shared-memory multiprocessor system
US6915296B2 (en) * 2002-10-29 2005-07-05 Agere Systems Inc. Incremental reorganization for hash tables
US7287131B1 (en) 2003-03-21 2007-10-23 Sun Microsystems, Inc. Method and apparatus for implementing a fully dynamic lock-free hash table
US7277897B2 (en) * 2003-08-01 2007-10-02 Oracle International Corporation Dynamic reassignment of data ownership
US7702628B1 (en) * 2003-09-29 2010-04-20 Sun Microsystems, Inc. Implementing a fully dynamic lock-free hash table without dummy nodes
US7669241B2 (en) * 2004-09-30 2010-02-23 Alcatel-Lucent Usa Inc. Streaming algorithms for robust, real-time detection of DDoS attacks
US20060075486A1 (en) 2004-10-01 2006-04-06 Paul Lin Self-contained token device for installing and running a variety of applications
US7464103B2 (en) * 2004-10-29 2008-12-09 Microsoft Corporation Multi-level nested open hashed data stores
JP4768009B2 (ja) * 2005-03-11 2011-09-07 ロックソフト リミテッド データ・クラスタを使用する冗長性の少ないデータを格納する方法
RU71016U1 (ru) * 2006-05-10 2008-02-20 Алексей Юрьевич Попов Электронная вычислительная машина с многими потоками команд и одним потоком данных
US20080021908A1 (en) * 2006-07-20 2008-01-24 Barrett Alan Trask Synchronization and dynamic resizing of a segmented linear hash table
US7809916B1 (en) * 2007-09-28 2010-10-05 Oracle America, Inc. Method for dynamically refining locks in resizable concurrent hashing
US8392368B1 (en) * 2010-08-27 2013-03-05 Disney Enterprises, Inc. System and method for distributing and accessing files in a distributed storage system

Also Published As

Publication number Publication date
CN102460392B (zh) 2016-04-27
RU2517238C2 (ru) 2014-05-27
CN102460392A (zh) 2012-05-16
RU2011144807A (ru) 2013-05-20
JP2012523610A (ja) 2012-10-04
KR101367450B1 (ko) 2014-02-25
SG175109A1 (en) 2011-11-28
KR20120014141A (ko) 2012-02-16
WO2010117294A1 (en) 2010-10-14
US20120036134A1 (en) 2012-02-09
US9563477B2 (en) 2017-02-07

Similar Documents

Publication Publication Date Title
JP5401676B2 (ja) マルチスレッドアプリケーション用のハッシュテーブルのコンカレントリハッシュの実行
US8788543B2 (en) Scalable, concurrent resizing of hash tables
US9542227B2 (en) Parallel dynamic memory allocation using a lock-free FIFO
CN111552654B (zh) 对页表遍历的冗余进行检测的处理器
US6785888B1 (en) Memory allocator for a multiprocessor computer system
CN107844267B (zh) 缓冲区分配和存储器管理
US7624246B2 (en) Method and system for memory allocation in a multiprocessing environment
US11656908B2 (en) Allocation of memory resources to SIMD workgroups
JP2003337834A (ja) サイズ変更可能なキャッシュ・センシティブ・ハッシュ・テーブル
US10824555B2 (en) Method and system for flash-aware heap memory management wherein responsive to a page fault, mapping a physical page (of a logical segment) that was previously reserved in response to another page fault for another page in the first logical segment
US9417881B2 (en) Parallel dynamic memory allocation using a lock-free pop-only FIFO
US20140115291A1 (en) Numa optimization for garbage collection of multi-threaded applications
KR20130060187A (ko) 캐시 및/또는 소켓 감지 멀티-프로세서 코어 너비 우선 순회
US9104583B2 (en) On demand allocation of cache buffer slots
US7500073B1 (en) Relocation of virtual-to-physical mappings
EP2936313A1 (en) System and method for implementing numa-aware statistics counters
US7562204B1 (en) Identifying and relocating relocatable kernel memory allocations in kernel non-relocatable memory
Braginsky et al. CBPQ: High performance lock-free priority queue
US8185693B2 (en) Cache-line aware collection for runtime environments
Li et al. Phast: Hierarchical concurrent log-free skip list for persistent memory
US20220269675A1 (en) Hash-based data structure
WO2023029982A1 (zh) 一种内存的分配方法及系统
Chen et al. Lock-free high-performance hashing for persistent memory via PM-aware holistic optimization
US9063858B2 (en) Multi-core system and method for data consistency by memory mapping address (ADB) to hash table pattern associated with at least one core
US11797178B2 (en) System and method for facilitating efficient management of data structures stored in remote memory

Legal Events

Date Code Title Description
A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130402

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20130617

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20130903

A601 Written request for extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A601

Effective date: 20131002

A602 Written permission of extension of time

Free format text: JAPANESE INTERMEDIATE CODE: A602

Effective date: 20131008

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20131003

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees