Download presentation
Presentation is loading. Please wait.
Published bySamantha Bates Modified over 8 years ago
1
Hopscotch Hashing Nir Shavit Tel Aviv U. & Sun Labs Joint work with Maurice Herlihy and Moran Tzafrir
2
A new family of highly effective hash-map algorithms for Multicore Machines Great performance also on Uniprocessors Our Results
3
Hash Tables Add(), Remove(), and Contains() with expected O(1) complexity Extensible/Resizable Typical hash table usage pattern: high fraction of Contains(), small fraction of Add() and Remove(). Assume universal hash function h(k) for key k.
4
Concurrent Hash Tables Linearizable implementation of a Set. In theory, two adversaries, the scheduler and the distributer of keys. Lets look at the state-of-the-art Ignore resizing for now…
5
Chained Hashing [Luhn] Add(x) if !Contains(x) then Malloc( ) and link in bucket h(x)
6
Chained Hashing N buckets, M items, Uniform h O(1) items expected in bucket (expected ~2.1 items) [Knuth] Add(), Remove(), Contains() in Expected O(1)
7
Chained Hashing Advantages: retains good performance as table density (M/N) increases less resizing Disadvantages: dynamic memory allocation extra full size word for pointer bad cache behavior (no locality)
8
Subliminal Cut
9
Linear Probing [Amdahl] Contains(x) – search linearly from h(x) until last location H noted in bucket. x x h(x) =7 z z
10
Linear Probing Add(x) - add in first empty bucket and update its H. z z h(x) =3 z z z z z z z z z z z z z z z z z z z z z z z z x x =6
11
Linear Probing Open address means M <= N Expected items in bucket same as Chaining Expected distance till open slot [Knuth]: ½(1+(1/(1-M/N)) 2 M/N = 0.5 search 2.5 buckets M/N = 0.9 search 50 buckets
12
Linear Probing Advantages: Good locality less cache misses Disadvantages: As M/N increases more cache misses searching 10’s of unrelated buckets “Clustering” of keys into neighboring buckets As computation proceeds “Contamination” by deleted items more cache misses * *
13
Cuckoo Hashing Add(x) – if h 1 (x) and h 2 (x) full evict y and move it to h 2 (y) != h 2 (x). Then place x in its place. z z h 1 (x) z z z z z z z z z z z z z z z z z z z z z z z z h 2 (x) z z z z z z w w z z z z z z z z z z z z z z z z h 2 (y) y y x x [Pagh&Rodler]
14
Cuckoo Hashing Advantages: Contains() : deterministic 2 buckets No clustering or contamination Disadvantages: 2 tables h i (x) are complex As M/N increases relocation cycles Above M/N = 0.5 Add() does not work!
15
Can we do better? Highly efficient Contains() Using simple hash functions In a table that will continue to work well when it is more than 50% full (M/N>0.5)
16
Hopscotch Approach Single Array, Simple hash function Idea: define neighborhood of original bucket In neighborhood items found quickly Use sequences of displacements to move items into their neighborhood
17
Simple Hopscotch Hashing Contains(x) – search in at most H buckets (the hop-range) based on hop-info bitmap. H is a constant. z z h(x) H=4 x x
18
Simple Hopscotch Hashing Add(x) – probe linearly to find open slot. Move the empty slot via sequence of displacements into the hop-range of h(x). z z h(x) x x r r s s v v u u w w
19
Add(x) Starting at h(x) =i, use linear probing to find an empty slot j. If j is within H-1 of i, place x and return. Otherwise, Find y with h(y) = k within H-1 left of j. Displacing y to j creates a new empty slot k closer to i. Repeat. If no such item exists, or if the bucket i already contains H items, Resize().
20
Simple Hopscotch Hashing Contains(): Max number of items H is a constant Theoretically expected num items in bucket ~2.1 same as Chaining [Kunth], but they have a better chance of sitting in the same cache line!
21
Simple Hopscotch Hashing Add(): Expected distance till open slot same as in linear probing What are the chances of a Resize() because more than H items are hashed to a bucket? Lemma [following Knuth] : same as num items in chained bucket being greater than H, which is 1/H! If H=32 1/H! = 1/32! < 10 -35
22
Simple Hopscotch Hashing Advantages: Good locality and cache behavior Good performance as table density (M/N) increases less resizing Withstands clustering and contamination Pay price in Add() not in frequent Contains()
23
Simple Hopscotch Hashing Disadvantages: As in Linear probing Add() may have to search 10s of buckets Later: we can do better than the simple algorithm…
24
Concurrent Hash Tables State-of-the-art is Lea’s ConcurrentHashMap from Java.util.concur: lock-based chaining Also lock-free split-ordered incremental chaining algorithm [Shalev&Shavit] Non-resizable lock-free linear probing [Purcell&Harris] Resizable Lock-based Cuckoo [Herlihy,Shavit, Zafrir]
25
Concurrent Chained Hashing [Lea] 12345 Lock for Add() and unsuccessful Contains() Stripped Locks
26
Concurrent Simple Hopscotch Stripped locking same as Lea Contains() is wait-free h(x) 1 1 2 2 3 3 4 4 5 5
27
Concurrent Simple Hopscotch Add(x) – lock bucket, mark empty slot using CAS, add x erasing mark z z r r v v u u ts x x
28
Concurrent Simple Hopscotch Add(x) – lock bucket, mark empty slot using CAS, lock bucket and update timestamp of bucket being displaced before erasing old value z z v v u u ts r r s s s s
29
Concurrent Simple Hopscotch Wait-free Contains(x) – read ts, hop- info, goto marked buckets, if no x compare ts, if diff repeat, after k attempts search all H buckets z z r r v v u u ts s s X not found
30
Simple Hopscotch Limitations Minimizing cache misses key to hash table performance: On SPARC line holds ~4 buckets (on Intel ~8 buckets) If hopscotch neighborhood is num of buckets in a cache line With H=4 or 8, long sequences of displacements during Add() are expensive
31
Cache Aware Hopscotch Hop-info consists of two pointers of distance hop range. z z c-line x x y y
32
Cache Aware Hopscotch Add(x) - if no place in cache line probe in hop-range and point to new location else perform hopscotch displacements z z x x c-line z z z z
33
Cache Aware Hopscotch Add(x) - if no place in cache line probe in hop-range and point to new location else perform hopscotch displacements z z x x c-line z z z z z z x x hop-range y y w w
34
Cache Aware Hopscotch Remove(x) - erase x, redirect pointer or move last item in x’s list into x’s empty slot. Move some item hashed to this cache line into new empty slot z z x x c-line z z z z y y x x (1) Redirect pointer (2) If pointer outside hop range move last list item
35
Cache Aware Hopscotch Remove(x) - …Move some item hashed to this cache line into new empty slot z z c-line z z z z Scan all items in cache line Moving some item into its hashed cache line z z …repeat recursively for new empty slot Anti-Contamination
36
Performance We ran a series of benchmarks on state of the art multicores and uniprocessors: Sun 64 way Niagara II, and Intel 3GHz Xeon Grain of Salt: we used standard microbenchmarks, not real application data
37
Benchmarking We used the same locking structure for concurrent algs We show graphs with pre-allocated memory to eliminate effects of memory management
46
Cuckoo stops here
51
Conclusions & Future New Hopscotch family of hash table algorithms: great cache behavior – good fit with modern architectures Superior to all known algorithms in performance and memory utilization? Especially impressive at high table densities Will be interesting to formally analyze performance
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.