From 87bbca2449bdb104dc016fd38fa4856e746b8726 Mon Sep 17 00:00:00 2001 From: Pascal Zittlau Date: Thu, 26 Feb 2026 13:05:16 +0100 Subject: [PATCH] init --- .gitignore | 2 + LICENSE | 11 + README.md | 52 ++ benchmark_results.csv | 73 ++ benchmark_results.png | Bin 0 -> 233165 bytes build.zig | 36 + build.zig.zon | 13 + hashmap_concurrent.zig | 1698 ++++++++++++++++++++++++++++++++++++++++ plot.gp | 76 ++ 9 files changed, 1961 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 benchmark_results.csv create mode 100644 benchmark_results.png create mode 100644 build.zig create mode 100644 build.zig.zon create mode 100644 hashmap_concurrent.zig create mode 100644 plot.gp diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d8c8979 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.zig-cache +zig-out diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..73d42f8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,11 @@ +Copyright 2026 Pascal Zittlau + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..85bab43 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# HashMapConcurrent + +A thread-safe, fixed-capacity, open-addressing hash map for Zig. + +This implementation combines *Robin Hood hashing* (to minimize probe lengths) with *Sequence +Locking* (to provide wait-free-like read performance) and *Shard-Level Locking* for writers. +Deletions use *Backward-Shift* to maintain table compactness without the performance degradation +of tombstones. + +![Benchmark Results](benchmark_results.png) + +## Quick Start + +```zig +const std = @import("std"); +const HashMap = @import("hashmap_concurrent.zig").AutoHashMapConcurrent; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{}){}; + const allocator = gpa.allocator(); + + // capacity must be a power of two. + // num_shards balances writer contention vs reader retry probability. + var map = try HashMap(u64, u64).init(allocator, 1024, 64); + defer map.deinit(allocator); + + map.put(42, 1337); + const val = map.get(42); + std.debug.print("Value: {d}\n", .{val}); +} +``` + +## Iteration + +There are two ways to iterate over entries, depending on your consistency requirements: + +`lockingIterator()`: Uses *Lock Coupling* to prevent elements from being missed or seen twice if they +are moved across shard boundaries during iteration. Due to the locking you must call `it.deinit()` +if you break or return from the loop early to release the held shard lock. + +`approximateIterator()`: Optimistic and approximate because it just uses *Sequence Locks*. It may +miss entries or see the same entry twice if concurrent writers move elements. It's Lock-free and +safe to use on const references. Safe to break early without cleanup. + +## Usage & Safety + +For a detailed explanation of the concurrency model, deadlock safety, and memory reclamation, please +refer to the documentation at the top of `hashmap_concurrent.zig`. + +## License + +BSD 3-Clause. See `hashmap_concurrent.zig` and `LICENSE` for the full text. diff --git a/benchmark_results.csv b/benchmark_results.csv new file mode 100644 index 0000000..a3d793b --- /dev/null +++ b/benchmark_results.csv @@ -0,0 +1,73 @@ +implementation,load_factor,workload,threads,time_ns,ops_per_sec +Concurrent,0.50,Read-Heavy,1,271214274,36871215 +Concurrent,0.50,Read-Heavy,2,143124738,69869123 +Concurrent,0.50,Read-Heavy,4,87717673,114002112 +Concurrent,0.50,Read-Heavy,8,52661958,189890394 +Concurrent,0.50,Balanced,1,329395173,30358671 +Concurrent,0.50,Balanced,2,185577943,53885714 +Concurrent,0.50,Balanced,4,125742054,79527888 +Concurrent,0.50,Balanced,8,97082480,103005197 +Concurrent,0.50,Write-Heavy,1,338436603,29547631 +Concurrent,0.50,Write-Heavy,2,210645228,47473185 +Concurrent,0.50,Write-Heavy,4,161165800,62047903 +Concurrent,0.50,Write-Heavy,8,147405663,67839998 +Concurrent,0.80,Read-Heavy,1,350774337,28508356 +Concurrent,0.80,Read-Heavy,2,176895999,56530391 +Concurrent,0.80,Read-Heavy,4,112098347,89207381 +Concurrent,0.80,Read-Heavy,8,66763988,149781346 +Mutex,0.80,Read-Heavy,1,118618369,84303974 +Mutex,0.80,Read-Heavy,2,232759824,42962740 +Mutex,0.80,Read-Heavy,4,387506802,25805998 +Mutex,0.80,Read-Heavy,8,482177910,20739232 +Concurrent,0.80,Balanced,1,446312104,22405845 +Concurrent,0.80,Balanced,2,241178563,41463054 +Concurrent,0.80,Balanced,4,159215445,62807976 +Concurrent,0.80,Balanced,8,114053320,87678289 +Mutex,0.80,Balanced,1,395063061,25312414 +Mutex,0.80,Balanced,2,712581877,14033475 +Mutex,0.80,Balanced,4,1031445991,9695127 +Mutex,0.80,Balanced,8,1581436960,6323363 +Concurrent,0.80,Write-Heavy,1,513414397,19477443 +Concurrent,0.80,Write-Heavy,2,291053875,34357900 +Concurrent,0.80,Write-Heavy,4,204070623,49002643 +Concurrent,0.80,Write-Heavy,8,158653499,63030440 +Mutex,0.80,Write-Heavy,1,660978068,15129095 +Mutex,0.80,Write-Heavy,2,1179866451,8475535 +Mutex,0.80,Write-Heavy,4,1704761281,5865923 +Mutex,0.80,Write-Heavy,8,2417159373,4137087 +Concurrent,0.90,Read-Heavy,1,417094992,23975353 +Concurrent,0.90,Read-Heavy,2,211592438,47260668 +Concurrent,0.90,Read-Heavy,4,130765194,76472948 +Concurrent,0.90,Read-Heavy,8,83629750,119574672 +Concurrent,0.90,Balanced,1,685793218,14581654 +Concurrent,0.90,Balanced,2,367383739,27219495 +Concurrent,0.90,Balanced,4,242404207,41253409 +Concurrent,0.90,Balanced,8,166020753,60233433 +Concurrent,0.90,Write-Heavy,1,914211584,10938386 +Concurrent,0.90,Write-Heavy,2,491254857,20356032 +Concurrent,0.90,Write-Heavy,4,330013876,30301756 +Concurrent,0.90,Write-Heavy,8,236983500,42197030 +Concurrent,0.95,Read-Heavy,1,546474852,18299103 +Concurrent,0.95,Read-Heavy,2,288135632,34705877 +Concurrent,0.95,Read-Heavy,4,185975581,53770500 +Concurrent,0.95,Read-Heavy,8,127102271,78676800 +Concurrent,0.95,Balanced,1,1510859227,6618750 +Concurrent,0.95,Balanced,2,796566144,12553885 +Concurrent,0.95,Balanced,4,545869033,18319412 +Concurrent,0.95,Balanced,8,362585843,27579675 +Concurrent,0.95,Write-Heavy,1,2399725873,4167142 +Concurrent,0.95,Write-Heavy,2,1264147766,7910467 +Concurrent,0.95,Write-Heavy,4,870680794,11485265 +Concurrent,0.95,Write-Heavy,8,610506395,16379844 +Concurrent,0.98,Read-Heavy,1,1185684905,8433943 +Concurrent,0.98,Read-Heavy,2,747856212,13371554 +Concurrent,0.98,Read-Heavy,4,557728969,17929855 +Concurrent,0.98,Read-Heavy,8,412282979,24255185 +Concurrent,0.98,Balanced,1,6334692279,1578608 +Concurrent,0.98,Balanced,2,3499583498,2857482 +Concurrent,0.98,Balanced,4,2676704901,3735936 +Concurrent,0.98,Balanced,8,1723361504,5802613 +Concurrent,0.98,Write-Heavy,1,13658053465,732168 +Concurrent,0.98,Write-Heavy,2,7398089149,1351700 +Concurrent,0.98,Write-Heavy,4,5440264030,1838146 +Concurrent,0.98,Write-Heavy,8,3359251517,2976853 diff --git a/benchmark_results.png b/benchmark_results.png new file mode 100644 index 0000000000000000000000000000000000000000..426163f82bc9bff24124cdc7244cfd072a8bd2bd GIT binary patch literal 233165 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�U0wVAV|;?-+#rzqM+xD*y6b2 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%0A47hX}sPT?J3>t$V6!}7)eBS>5iKu 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 Shard[0]) while the other threads simultaneously bridge it from the other size. +//! - Given that shards typically contain hundreds or thousands of slots and there are usually +//! dozens or hundreds of shards, the probability of multiple simultaneous probe sequences being +//! long enough to bridge the whole table is practically zero for well-sized tables and shards. +//! +//! The following experimental results show PSLs for various `load_factors` for a table with a +//! capacity of 2**21(2 million entries). +//! +//! load_factor | max PSL | avg PSL | median PSL +//! 0.50 | 12 | 0.50 | 0 +//! 0.70 | 23 | 1.17 | 1 +//! 0.80 | 31 | 2.01 | 1 +//! 0.90 | 65 | 4.56 | 3 +//! 0.95 | 131 | 9.72 | 6 +//! 0.99 | 371 | 78.72 | 34 +//! +//! ## Benchmarks +//! +//! You can run the included benchmark suite yourself to evaluate throughput and scaling on your own +//! hardware. Simply run the `main` function of this file (e.g., using `zig run .zig -O +//! ReleaseFast`). The benchmark compares this concurrent implementation against a standard +//! `std.AutoHashMap` wrapped in a `std.Thread.Mutex` across varying read/write/delete workloads. +//! +//! ## License +//! +//! Copyright 2026 Pascal Zittlau +//! +//! Redistribution and use in source and binary forms, with or without modification, are permitted +//! provided that the following conditions are met: +//! 1. Redistributions of source code must retain the above copyright notice, this list of +//! conditions and the following disclaimer. +//! 2. Redistributions in binary form must reproduce the above copyright notice, this list of +//! conditions and the following disclaimer in the documentation and/or other materials provided +//! with the distribution. +// +//! 3. Neither the name of the copyright holder nor the names of its contributors may be used to +//! endorse or promote products derived from this software without specific prior written +//! permission. +// +//! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR +//! IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +//! FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR +//! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +//! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +//! SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +//! THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR +//! OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +//! POSSIBILITY OF SUCH DAMAGE. + +const std = @import("std"); +const builtin = @import("builtin"); + +const atomic = std.atomic; +const math = std.math; +const mem = std.mem; +const testing = std.testing; + +const assert = std.debug.assert; + +const cache_line_size = atomic.cacheLineForCpu(builtin.cpu); + +const Allocator = mem.Allocator; + +pub fn getAutoHashFn(comptime K: type) (fn (K) u64) { + return struct { + fn hash(key: K) u64 { + if (std.meta.hasUniqueRepresentation(K)) { + return std.hash.Wyhash.hash(0, std.mem.asBytes(&key)); + } else { + var hasher = std.hash.Wyhash.init(0); + std.hash.autoHash(&hasher, key); + return hasher.final(); + } + } + }.hash; +} + +pub fn getAutoEqlFn(comptime K: type) (fn (K, K) bool) { + return struct { + fn eql(a: K, b: K) bool { + return std.meta.eql(a, b); + } + }.eql; +} + +pub fn AutoHashMapConcurrent(comptime K: type, comptime V: type) type { + if (!isSafe(K)) { + @compileError("AutoHashMapConcurrent: Key type '" ++ @typeName(K) ++ + "' is potentially tearable (e.g. contains slices or is larger than a machine word). " ++ + "Optimistic readers do not take locks and might see a partially updated key. " ++ + "This causes automatically generated 'hash' and 'eql' functions to produce garbage " ++ + "results or trigger memory safety violations (segfaults on torn slices). " ++ + "To use this safely, you must provide your own robust 'hash' and 'eql' " ++ + "functions and use 'HashMapConcurrent' directly."); + } + const hash = getAutoHashFn(K); + const eql = getAutoEqlFn(K); + return HashMapConcurrent(K, V, hash, eql, .{}); +} + +// By default mark all composite types as unsafe and assume that values smaller than `usize` are +// never torn. +fn isSafe(comptime T: type) bool { + switch (@typeInfo(T)) { + .bool => return true, + .int => |i| return i.bits <= @bitSizeOf(usize), + .float => |f| return f.bits <= @bitSizeOf(usize), + .@"enum" => |e| return @sizeOf(e.tag_type) <= @sizeOf(usize), + .pointer => |p| return p.size != .slice, + // TODO: add more safe ones as needed + else => return false, + } +} + +pub const Config = struct { + /// The maximum load factor before the table is considered "at capacity". Default: 0.8 + /// This is not really a strict maximum. The table still continues to perform okay up to about + /// to 95% fill. At 99% the performance degrades sharply. Even higher and the risk of deadlocks + /// increases. See the module documentation for more information or run a benchmark. + max_fill_factor: f64 = 0.8, + /// When fetching we need to save versions of the shards we visit. This is the maximum + /// number of shards we traverse in search for the entry. Visiting more shards than this + /// could happen under the following circumstances: + /// - the hash function is bad or + /// - the shards are small or + /// - the fill factor is close to 1 + fetch_version_array_size: u64 = 8, +}; + +pub fn HashMapConcurrent( + /// The key has to be carefully chosen such that the `hash` and `eql` functions work correctly. + /// In particular the combination shouldn't be susceptible to torn reads. + K: type, + V: type, + hash: fn (K) u64, + eql: fn (K, K) bool, + config: Config, +) type { + return struct { + const Self = @This(); + + pub const Entry = struct { + key: K, + value: V, + }; + + const EMPTY_DIST = 0; + const SATURATED_DIST = 255; + + /// How many entries can be saved in the table at most. + capacity: usize, + /// Number of used entries. + // This is heap allocated with a complete cache line to remove false sharing when other + // threads just try to access members of the HashTable struct. + count: *align(cache_line_size) atomic.Value(usize), + + // NOTE: No slices because we don't want the bounds checks. All accesses are protected by + // masking of the excess bits with the masks below. + + /// The entries saved in the table. + /// `entries.len == capacity` + entries: [*]align(cache_line_size) Entry, + /// The distances of the entries. `dists[i]` refers to the distance of `entries[i]`. + /// `dists.len == entries.len == capacity` + dists: [*]align(cache_line_size) u8, + /// Locks for the shards. `locks.len == num_shards` + locks: [*]align(cache_line_size) ShardLock, + + num_shards: usize, + + /// Maximum capacity before the table signals it is full in `atCapacity()`. + /// Pre-calculated to avoid math in hot paths. + max_count_threshold: usize, + + entry_mask: usize, + shard_mask: usize, + /// shift **right** to get shard index. + shard_shift: u6, + /// Used to efficiently detect shard boundaries during linear probing. + /// `(entries_per_shard - 1)`. + partition_mask: usize, + + /// Initializes the Hash Table. + /// + /// `capacity`: The number of elements the table should hold. Must be a power of two. + /// If you just have a minimum capacity that should fit, use + /// `capacityForMin` to get value that respects the fill factor and is a power + /// of two. + /// + /// `num_shards`: Number of mutexes. Must be a power of two and `<= capacity`. + /// See the module documentation for guidance on selecting this value. + /// + /// bytes_used ≈ + /// @sizeOf(ConcurrentHashTable) // structure + /// + capacity * @sizeOf(K) // keys + /// + capacity * @sizeOf(V) // values + /// + capacity // distances + /// + num_shards * cache_line_size // locks + /// + cache_line_size // count + pub fn init(allocator: Allocator, capacity: usize, num_shards: usize) !Self { + assert(math.isPowerOfTwo(capacity)); + assert(math.isPowerOfTwo(num_shards)); + assert(num_shards > 0); + assert(capacity >= num_shards); + + const entries = try allocator.alignedAlloc( + Entry, + .fromByteUnits(cache_line_size), + capacity, + ); + errdefer allocator.free(entries); + + const dists = try allocator.alignedAlloc( + u8, + .fromByteUnits(cache_line_size), + capacity, + ); + errdefer allocator.free(dists); + @memset(dists, EMPTY_DIST); + + // Enforce that `count` has a complete cache line for itself to remove false sharing. + const count_line = try allocator.alignedAlloc( + u8, + .fromByteUnits(cache_line_size), + cache_line_size, + ); + errdefer allocator.free(count_line); + const count = mem.bytesAsValue(atomic.Value(usize), count_line); + count.*.raw = 0; + + const shards = try allocator.alignedAlloc( + ShardLock, + .fromByteUnits(cache_line_size), + num_shards, + ); + errdefer allocator.free(shards); + @memset(shards, .{}); + + const entries_per_shard = capacity / num_shards; + assert(math.isPowerOfTwo(entries_per_shard)); + const shift = math.log2_int(usize, entries_per_shard); + + const capacity_f: f64 = @floatFromInt(capacity); + return .{ + .entries = entries.ptr, + .dists = dists.ptr, + .locks = shards.ptr, + .capacity = capacity, + .num_shards = num_shards, + .count = count, + .entry_mask = capacity - 1, + .shard_mask = num_shards - 1, + .shard_shift = @intCast(shift), + .partition_mask = entries_per_shard - 1, + .max_count_threshold = @intFromFloat(capacity_f * config.max_fill_factor), + }; + } + + /// Calculates the required power-of-two capacity to hold `min_capacity` entries while + /// staying under the `max_fill_factor`. + pub fn capacityForMin(min_capacity: usize) usize { + const min_capacity_f: f64 = @floatFromInt(min_capacity); + const adj_min_capacity: u64 = @intFromFloat(min_capacity_f / config.max_fill_factor); + return math.ceilPowerOfTwoAssert(u64, adj_min_capacity); + } + + /// **Not** threadsafe + pub fn deinit(ht: *Self, allocator: Allocator) void { + allocator.free(ht.entries[0..ht.capacity]); + allocator.free(ht.dists[0..ht.capacity]); + allocator.free(ht.locks[0..ht.num_shards]); + + // Rebuild the used cache-line + var count_line_ptr: [*]align(cache_line_size) u8 = @ptrCast(ht.count); + allocator.free(count_line_ptr[0..cache_line_size]); + + ht.* = undefined; + } + + /// Thread-safely removes all entries from the table. + /// Acquires all shard locks to ensure consistency. + pub fn clearRetainingCapacity(ht: *Self) void { + for (0..ht.num_shards) |i| ht.locks[i].lock(); + defer { + var i: usize = 0; + while (i < ht.num_shards) : (i += 1) ht.locks[i].unlock(); + } + + @memset(ht.dists[0..ht.capacity], EMPTY_DIST); + ht.count.store(0, .release); + } + + /// Returns true if the current number of entries has reached the pre-calculated threshold + /// based on `max_fill_factor`. + pub fn atCapacity(ht: *Self) bool { + return ht.count.load(.monotonic) > ht.max_count_threshold; + } + + /// Returns the current load factor of the table (0.0 to 1.0). + pub fn loadFactor(ht: *Self) f64 { + const count: f64 = @floatFromInt(ht.count.load(.monotonic)); + const capacity: f64 = @floatFromInt(ht.entries.len); + return count / capacity; + } + + inline fn getShardIndex(ht: *const Self, entry_idx: usize) usize { + return (entry_idx >> ht.shard_shift) & ht.shard_mask; + } + + /// If the key exists, it **is overwritten**. + /// + /// This function asserts that the table has enough physical capacity to perform the + /// insertion. Use `atCapacity()` to check load factors, or `tryPut()` if you need + /// to handle absolute capacity limits gracefully. + pub fn put(ht: *Self, key: K, value: V) void { + _ = ht.fetchPut(key, value); + } + + /// Inserts or updates an entry. If the key already exists, the value is updated. + /// Returns the previous value if the key was present, otherwise null. + /// + /// This function asserts that the table has enough physical capacity. + pub fn fetchPut(ht: *Self, key: K, value: V) ?V { + return ht.tryFetchPut(key, value) catch unreachable; + } + + pub const TryPutError = error{TableFull}; + + /// Attempts to insert or update a key-value pair. + /// + /// If the table is physically full (the probe sequence wraps around), it returns + /// `TryPutError.TableFull`. + pub fn tryPut(ht: *Self, key: K, value: V) TryPutError!void { + _ = try ht.tryFetchPut(key, value); + } + + /// Attempts to insert or update an entry, returning the previous value if it existed. + /// + /// This is the primary insertion logic for the table. It handles: + /// 1. Shard-level locking (acquiring additional locks if the probe crosses boundaries). + /// 2. Robin Hood swaps to minimize probe sequence length. + /// 3. Wrap-around detection to prevent infinite loops in a 100% full table. + /// + /// Returns: + /// - `V`: The previous value if the key was already present. + /// - `null`: If the key was newly inserted. + /// - `TryPutError.TableFull`: If no space could be found. + pub fn tryFetchPut(ht: *Self, key: K, value: V) TryPutError!?V { + const incoming = Entry{ .key = key, .value = value }; + var current = incoming; + var idx = hash(current.key) & ht.entry_mask; + // Distance from the ideal position for the `current` entry we are trying to insert. + var dist: u64 = 0; + + const start_lock = ht.getShardIndex(idx); + var end_lock = start_lock; + ht.locks[start_lock].lock(); + + // Unlock all touched shards + defer { + var i = start_lock; + while (true) { + ht.locks[i].unlock(); + if (i == end_lock) break; + i = (i + 1) & ht.shard_mask; + } + } + + while (true) { + const stored_dist = ht.dists[idx]; + + if (stored_dist == EMPTY_DIST) { + ht.entries[idx] = current; + ht.dists[idx] = @intCast(@min(dist + 1, SATURATED_DIST)); + _ = ht.count.fetchAdd(1, .monotonic); + return null; + } else if (eql(ht.entries[idx].key, current.key)) { + assert(eql(current.key, incoming.key)); + const old_val = ht.entries[idx].value; + ht.entries[idx].value = current.value; + return old_val; + } + + // Collision, so apply Robin Hood logic. + var existing_dist: u64 = stored_dist - 1; + if (stored_dist == SATURATED_DIST) { + @branchHint(.cold); + // If saturated, we must recompute the hash to find the real distance. + const existing_ideal = hash(ht.entries[idx].key) & ht.entry_mask; + existing_dist = (idx -% existing_ideal) & ht.entry_mask; + } + + if (dist > existing_dist) { + mem.swap(Entry, ¤t, &ht.entries[idx]); + ht.dists[idx] = @intCast(@min(dist + 1, SATURATED_DIST)); + dist = existing_dist; + } + + idx = (idx + 1) & ht.entry_mask; + dist += 1; + + if ((idx & ht.partition_mask) == 0) { + @branchHint(.unlikely); + // Since we move linearly, the new shard is simply the next one. + const next_lock = (end_lock + 1) & ht.shard_mask; + if (next_lock == start_lock) return TryPutError.TableFull; + + ht.locks[next_lock].lock(); + end_lock = next_lock; + } + } + } + + /// Fetches a value from the table. + /// + /// This asserts that the probe sequence does not span more shards than the internal + /// tracking buffer allows. For properly sized tables and shards, this is the standard + /// lookup method. + pub fn get(ht: *const Self, key: K) ?V { + return ht.getChecked(key) catch unreachable; + } + + pub const GetError = error{ProbeLimitExceeded}; + + /// Performs an optimistic concurrent lookup. + /// + /// Use this if you are operating at extreme load factors (>99%), with a small capacity, or + /// with a hash function that might produce very long clusters. + /// + /// Returns: + /// - `null` if the key is not found. + /// - `GetError.ProbeLimitExceeded` if the probe sequence spans more than + /// `fetch_version_array_size` shards. This can happen with very poor hash distributions + /// or extremely high load factors. Use `getBuffer` to provide a larger stack-allocated + /// buffer if this occurs. + pub fn getChecked(ht: *const Self, key: K) GetError!?V { + var versions: [config.fetch_version_array_size]u64 = undefined; + return ht.getBuffer(key, &versions); + } + + /// Low-level lookup allowing the caller to provide a version buffer. + /// + /// Use this with a bigger buffer if `get()` returns `ProbeLimitExceeded` due to high shard + /// density. + /// + /// This does not acquire any mutexes. It reads a version counter before and after reading + /// the data. If the version changed (meaning a writer touched the shard), the read is + /// retried. + pub fn getBuffer(ht: *const Self, key: K, versions: []u64) GetError!?V { + assert(versions.len > 0); + + var shard_count: usize = 0; + var first_shard_idx: usize = undefined; + + retry: while (true) { + var idx = hash(key) & ht.entry_mask; + var dist: u64 = 0; + + var current_shard = ht.getShardIndex(idx); + first_shard_idx = current_shard; + versions[0] = ht.locks[current_shard].readBegin(); + shard_count = 1; + + const val: ?V = while (true) { + const stored_dist = ht.dists[idx]; + if (stored_dist == EMPTY_DIST) break null; + // Robin Hood invariant check + if (stored_dist < (dist + 1) and stored_dist != SATURATED_DIST) break null; + + const slot = &ht.entries[idx]; + const k = slot.key; + const v = slot.value; + + if (eql(k, key)) break v; + + idx = (idx + 1) & ht.entry_mask; + dist += 1; + + if ((idx & ht.partition_mask) == 0) { + @branchHint(.unlikely); + if (shard_count == versions.len) return GetError.ProbeLimitExceeded; + current_shard = (current_shard + 1) & ht.shard_mask; + versions[shard_count] = ht.locks[current_shard].readBegin(); + shard_count += 1; + } + }; + + // We need a memory barrier here to ensure the data reads from the entries aren't + // reordered after the sequence version validations below. + loadFence(); + + // Validate all traversed shards + var check_idx = first_shard_idx; + for (0..shard_count) |i| { + if (!ht.locks[check_idx].readValid(versions[i])) { + @branchHint(.unlikely); + atomic.spinLoopHint(); + continue :retry; + } + check_idx = (check_idx + 1) & ht.shard_mask; + } + return val; + } + } + + /// Removes an entry from the table and performs a backward-shift to fill the gap. + pub fn remove(ht: *Self, key: K) void { + _ = ht.fetchRemove(key); + } + + /// Removes an entry from the table and performs a backward-shift to fill the gap. + /// Returns the value of the removed entry, or null if the key was not found. + pub fn fetchRemove(ht: *Self, key: K) ?V { + var idx = hash(key) & ht.entry_mask; + var dist: u64 = 0; + + const start_lock = ht.getShardIndex(idx); + var end_lock = start_lock; + ht.locks[start_lock].lock(); + + // Release all shards locked during probe and shift. + defer { + var i = start_lock; + while (true) { + ht.locks[i].unlock(); + if (i == end_lock) break; + i = (i + 1) & ht.shard_mask; + } + } + + // Find slot + while (true) { + const stored_dist = ht.dists[idx]; + + if (stored_dist == EMPTY_DIST) return null; + // Robin Hood invariant check + if (stored_dist < (dist + 1) and stored_dist != SATURATED_DIST) return null; + if (eql(ht.entries[idx].key, key)) break; + + idx = (idx + 1) & ht.entry_mask; + dist += 1; + + if ((idx & ht.partition_mask) == 0) { + @branchHint(.unlikely); + const next_lock = (end_lock + 1) & ht.shard_mask; + if (next_lock == start_lock) return null; // Wrap-around safety + + ht.locks[next_lock].lock(); + end_lock = next_lock; + } + } + const removed_value = ht.entries[idx].value; + _ = ht.count.fetchSub(1, .monotonic); + + // Backward Shift Deletion + while (true) { + // Mark current slot as empty (temporarily, will be filled if shifting) + ht.dists[idx] = EMPTY_DIST; + + const next_idx = (idx + 1) & ht.entry_mask; + + if ((next_idx & ht.partition_mask) == 0) { + @branchHint(.unlikely); + const next_lock = (end_lock + 1) & ht.shard_mask; + if (next_lock != start_lock) { + @branchHint(.unlikely); + ht.locks[next_lock].lock(); + end_lock = next_lock; + } + } + + const next_dist_stored = ht.dists[next_idx]; + // If the next element is empty (0) the item is at its ideal position, we can't + // shift it back. + if (next_dist_stored == EMPTY_DIST or next_dist_stored == 1) { + return removed_value; + } + + // Shift back into the hole + ht.entries[idx] = ht.entries[next_idx]; + var new_dist: u64 = next_dist_stored - 1; + if (next_dist_stored == SATURATED_DIST) { + @branchHint(.cold); + // Recompute real distance + const ideal = hash(ht.entries[next_idx].key) & ht.entry_mask; + const real_dist = (next_idx -% ideal) & ht.entry_mask; + new_dist = real_dist; + } + + ht.dists[idx] = @intCast(@min(new_dist, SATURATED_DIST)); + idx = next_idx; + } + } + + /// Removes all entries from the table using lock-crabbing. This *is thread-safe* but + /// depending on the usage the table might never be fully empty. + /// + /// It locks shards sequentially (holding at most two at a time) to avoid stalling the + /// entire table while preventing elements from shifting across boundaries. Concurrent + /// writers are still allowed, though depending on where the cleaning logic is, their entry + /// might be overwritten shortly after. + pub fn clear(ht: *Self) void { + ht.locks[0].lock(); + var current_shard: usize = 0; + var elements_cleared: usize = 0; + + for (0..ht.capacity) |i| { + // Check if we crossed a shard boundary + if (i > 0 and (i & ht.partition_mask) == 0) { + if (elements_cleared > 0) { + _ = ht.count.fetchSub(elements_cleared, .monotonic); + elements_cleared = 0; + } + + const next_shard = current_shard + 1; + if (next_shard < ht.num_shards) { + ht.locks[next_shard].lock(); + } + ht.locks[current_shard].unlock(); + current_shard = next_shard; + } + + if (ht.dists[i] != EMPTY_DIST) { + ht.dists[i] = EMPTY_DIST; + elements_cleared += 1; + } + } + + // Flush remaining cleared elements and release the last lock + if (elements_cleared > 0) { + _ = ht.count.fetchSub(elements_cleared, .monotonic); + } + ht.locks[current_shard].unlock(); + } + + pub const LockingIterator = struct { + ht: *Self, + current_index: usize, + current_shard: usize, + + /// Releases any shard locks held by the iterator. + /// This MUST be called if you stop iterating before `next()` returns `null`. + /// It is safe to call this even if the iterator is fully exhausted. + pub fn deinit(self: *LockingIterator) void { + if (self.current_shard < self.ht.num_shards) { + self.ht.locks[self.current_shard].unlock(); + self.current_shard = self.ht.num_shards; // Prevent double-unlock + } + } + + pub fn next(self: *LockingIterator) ?Entry { + while (self.current_index < self.ht.capacity) { + // Check if we crossed a shard boundary + if (self.current_index > 0 and (self.current_index & self.ht.partition_mask) == 0) { + const next_shard = self.current_shard + 1; + if (next_shard < self.ht.num_shards) { + self.ht.locks[next_shard].lock(); + } + self.ht.locks[self.current_shard].unlock(); + self.current_shard = next_shard; + } + + const dist = self.ht.dists[self.current_index]; + const entry = self.ht.entries[self.current_index]; + self.current_index += 1; + + if (dist != EMPTY_DIST) { + return entry; + } + } + + // Reached the end, release the last lock + self.deinit(); + return null; + } + }; + + /// Returns a thread-safe iterator using lock coupling. This will **not** provide a + /// consistent state because concurrent writers are still allowed. Though no elements will + /// be returned twice. + /// + /// You MUST either exhaust the iterator (until `next()` returns `null`) or explicitly call + /// `it.deinit()`(or both) if you break early. Otherwise, a lock will be leaked and the + /// table will deadlock. + /// + /// Do not call a locking function on the same table while an iterator is active in the same + /// thread. + pub fn lockingIterator(ht: *Self) LockingIterator { + ht.locks[0].lock(); + return .{ + .ht = ht, + .current_index = 0, + .current_shard = 0, + }; + } + + pub const ApproximateIterator = struct { + ht: *const Self, + current_index: usize, + + pub fn next(self: *ApproximateIterator) ?Entry { + while (self.current_index < self.ht.capacity) { + defer self.current_index += 1; + + const shard_idx = self.ht.getShardIndex(self.current_index); + var dist: u8 = undefined; + var entry: Entry = undefined; + + // Optimistic read loop for this specific slot + while (true) { + const version = self.ht.locks[shard_idx].readBegin(); + dist = self.ht.dists[self.current_index]; + + // Only copy the entry if the slot isn't empty + if (dist != EMPTY_DIST) { + entry = self.ht.entries[self.current_index]; + } + + loadFence(); + + if (self.ht.locks[shard_idx].readValid(version)) { + break; // Successfully read a consistent state + } + atomic.spinLoopHint(); + } + + if (dist != EMPTY_DIST) { + return entry; + } + } + + return null; + } + }; + + /// Returns a non-locking, approximate iterator using optimistic concurrency control. + /// + /// Because this iterator does not hold locks, concurrent `put` and `remove` operations can + /// shift elements backwards or forwards. As a result, this iterator may miss entries or + /// return the same entry multiple times. However, it strictly guarantees that any returned + /// `Entry` is internally consistent (no torn reads). + /// + /// It is perfectly safe to break out of this iterator early, as no locks are held. + pub fn approximateIterator(ht: *const Self) ApproximateIterator { + return .{ + .ht = ht, + .current_index = 0, + }; + } + + /// Collects health statistics about the table. + /// This is a slow, non-atomic operation. Use only for monitoring or debugging. + pub fn collectStatistics(ht: *const Self) Statistics { + var total_psl: usize = 0; + var max_psl: usize = 0; + const count: usize = ht.count.load(.acquire); + + // Histogram for median calculation. + const hist_size = 1024; // If more are needed you likely have other worse problems + var psl_histogram = [_]usize{0} ** (hist_size); + var actual_count: usize = 0; + + for (0..ht.capacity) |i| { + const slot = ht.entries[i]; + const k = slot.key; + if (ht.dists[i] != EMPTY_DIST) { + const ideal = hash(k) & ht.entry_mask; + const psl = (i -% ideal) & ht.entry_mask; + + total_psl += psl; + actual_count += 1; + if (psl > max_psl) max_psl = psl; + + const bucket = @min(psl, psl_histogram.len - 1); + psl_histogram[bucket] += 1; + } + } + + // Calculate Median from Histogram + var median_psl: usize = 0; + if (actual_count > 0) { + const target = actual_count / 2; + var accumulated: usize = 0; + for (psl_histogram, 0..) |freq, psl_val| { + accumulated += freq; + if (accumulated >= target) { + median_psl = psl_val; + break; + } + } + } + + const count_f: f64 = @floatFromInt(count); + + return .{ + .capacity = ht.capacity, + .count = count, + .load_factor = count_f / @as(f64, @floatFromInt(ht.capacity)), + .max_psl = max_psl, + .avg_psl = if (count > 0) @as(f64, @floatFromInt(total_psl)) / count_f else 0, + .median_psl = median_psl, + .num_shards = ht.num_shards, + }; + } + + /// Exhaustively validates the internal state of the table. + /// This is slow, not threadsafe, and should only really be used in tests. + pub fn verifyIntegrity(ht: *const Self) !void { + assert(builtin.is_test); + var actual_total_count: usize = 0; + var count: usize = 0; + + for (0..ht.capacity) |i| { + const entry = ht.entries[i]; + if (ht.dists[i] == EMPTY_DIST) continue; + + actual_total_count += 1; + count += 1; + + // Ensure the key can actually be found by the get() logic + const found_val = try ht.getChecked(entry.key); + try testing.expectEqual(entry.value, found_val); + + // Validate Robin Hood Invariant. A slot's PSL cannot be less than (next_slot.PSL - 1) + const next_idx = (i + 1) & ht.entry_mask; + const next_stored_dist = ht.dists[next_idx]; + if (next_stored_dist != EMPTY_DIST) { + const current_ideal = hash(entry.key) & ht.entry_mask; + const next_ideal = hash(ht.entries[next_idx].key) & ht.entry_mask; + const current_psl = (i -% current_ideal) & ht.entry_mask; + const next_psl = (next_idx -% next_ideal) & ht.entry_mask; + try testing.expect(next_psl <= current_psl + 1); + } + } + + try testing.expectEqual(ht.count.load(.acquire), count); + } + }; +} + +pub const Statistics = struct { + capacity: usize, + count: usize, + load_factor: f64, + max_psl: usize, + avg_psl: f64, + median_psl: usize, + num_shards: usize, +}; + +/// Emits an optimal architecture-specific LoadLoad barrier. +/// Required for the read-side of sequence locks to ensure the data reads are not reordered before +/// the first version read, or after the second version read. +inline fn loadFence() void { + switch (builtin.cpu.arch) { + .x86_64, .x86 => { + // x86 memory model is TSO. Hardware does not reorder loads with other loads. + // A compiler barrier is strictly sufficient. + asm volatile ("" ::: .{ .memory = true }); + }, + .aarch64, .aarch64_be => { + asm volatile ("dmb ishld" ::: .{ .memory = true }); + }, + .riscv64 => { + asm volatile ("fence r, r" ::: .{ .memory = true }); + }, + else => { + // Fallback: emulate a full sequence point using a dummy atomic RMW. + var dummy: u8 = 0; + _ = @cmpxchgWeak(u8, &dummy, 0, 0, .seq_cst, .seq_cst); + }, + } +} + +/// A hybrid Spinlock / Sequence Lock. +/// - Writers use `lock()` which utilizes a CAS-based spinlock and `unlock()`. Both increase the +/// version/timestamp. +/// - Readers use `readBegin()` and `readValid()` to perform lock-free reads. +const ShardLock = struct { + /// Even = Unlocked, Odd = Locked + version: atomic.Value(u64) = atomic.Value(u64).init(0), + /// To remove false_sharing. + /// OPTIM: If there are a lot of shards compared to the number of cores, we could probably drop + /// the padding and save some memory, while having similar performance. + padding: [cache_line_size - @sizeOf(u64)]u8 = undefined, + + fn readBegin(self: *const ShardLock) u64 { + while (true) { + const current = self.version.load(.acquire); + if (current & 1 == 0) return current; + atomic.spinLoopHint(); + } + } + + fn readValid(self: *const ShardLock, ts: u64) bool { + return ts == self.version.load(.acquire); + } + + fn lock(self: *ShardLock) void { + var current = self.version.load(.acquire); + while (true) { + // Wait for even + while (current & 1 != 0) { + atomic.spinLoopHint(); + current = self.version.load(.monotonic); + } + + // CAS to switch to odd + if (self.version.cmpxchgWeak(current, current + 1, .acquire, .monotonic)) |c| { + current = c; + } else { + return; // Locked successfully + } + } + } + + fn unlock(self: *ShardLock) void { + const before = self.version.fetchAdd(1, .release); + assert(before & 1 == 1); + } +}; + +test "basic usage" { + var ht = try AutoHashMapConcurrent(u64, u64).init(testing.allocator, 4, 2); + defer ht.deinit(testing.allocator); + + ht.put(1, 10); + ht.put(2, 20); + ht.put(3, 30); + + try testing.expectEqual(10, ht.get(1)); + try testing.expectEqual(20, ht.get(2)); + try testing.expectEqual(30, ht.get(3)); + try testing.expectEqual(null, ht.get(99)); + + ht.put(2, 22); + try testing.expectEqual(22, ht.get(2).?); + + const val = ht.fetchRemove(2); + try testing.expectEqual(22, val); + try testing.expectEqual(null, ht.get(2)); + + try testing.expectEqual(10, ht.get(1)); + try testing.expectEqual(30, ht.get(3)); +} + +test "collision and robin hood" { + var ht = try AutoHashMapConcurrent(u64, u64).init(testing.allocator, 4, 4); + defer ht.deinit(testing.allocator); + + ht.put(10, 100); + ht.put(20, 200); + ht.put(30, 300); + ht.put(40, 400); // Full + + try testing.expectEqual(100, ht.get(10)); + try testing.expectEqual(400, ht.get(40)); + + ht.remove(10); + try testing.expectEqual(null, ht.get(10)); + try testing.expectEqual(400, ht.get(40)); +} + +test "clear" { + var ht = try AutoHashMapConcurrent(u64, u64).init(testing.allocator, 16, 4); + defer ht.deinit(testing.allocator); + + const num_entries = 8; + for (0..num_entries) |i| ht.put(i, i); + try testing.expectEqual(num_entries, ht.count.load(.monotonic)); + for (0..num_entries) |i| try testing.expectEqual(i, ht.get(i)); + + ht.clear(); + try testing.expectEqual(0, ht.count.load(.monotonic)); + for (0..num_entries) |i| try testing.expectEqual(null, ht.get(i)); +} + +test "iterators basic" { + var ht = try AutoHashMapConcurrent(u64, u64).init(testing.allocator, 16, 4); + defer ht.deinit(testing.allocator); + + const num_entries = 10; + for (0..num_entries) |i| ht.put(i, i); + + // Test Locking Iterator + { + var it = ht.lockingIterator(); + defer it.deinit(); + var count: usize = 0; + while (it.next()) |entry| { + try testing.expectEqual(entry.key, entry.value); + count += 1; + } + try testing.expectEqual(num_entries, count); + } + + // Test Optimistic Iterator + { + var it = ht.approximateIterator(); + var count: usize = 0; + while (it.next()) |entry| { + try testing.expectEqual(entry.key, entry.value); + count += 1; + } + try testing.expectEqual(num_entries, count); + } +} + +test "locking iterator early break" { + var ht = try AutoHashMapConcurrent(u64, u64).init(testing.allocator, 16, 4); + defer ht.deinit(testing.allocator); + + for (0..10) |i| ht.put(i, i); + + { + var it = ht.lockingIterator(); + defer it.deinit(); + _ = it.next(); + } + + // If deinit failed, this put will deadlock + ht.put(99, 99); + try testing.expectEqual(99, ht.get(99).?); +} + +test "single threaded fuzz" { + const Seed = 42; + const capacity = 1024; + const shards = 32; + const iterations = 100_000; + + var prng = std.Random.DefaultPrng.init(Seed); + const random = prng.random(); + const allocator = testing.allocator; + + var ht = try AutoHashMapConcurrent(u64, u64).init(allocator, capacity, shards); + defer ht.deinit(allocator); + + var ref_map = std.AutoHashMapUnmanaged(u64, u64).empty; + try ref_map.ensureTotalCapacity(allocator, capacity * 2); + defer ref_map.deinit(allocator); + + for (0..iterations) |i| { + const action = random.uintAtMostBiased(u8, 9); + const key = random.int(u64) & ((capacity * 8) - 1); + + if (action <= 2) { // put + if (!ht.atCapacity()) { + const val = random.int(u64); + ht.put(key, val); + ref_map.putAssumeCapacity(key, val); + } + } else if (action <= 7) { // fetch + const ht_val = ht.getChecked(key); + const ref_val = ref_map.get(key); + try testing.expectEqual(ref_val, ht_val); + } else { // remove + ht.remove(key); + _ = ref_map.remove(key); + } + + // verify integrity + if (i % 1000 == 0) { + var it = ref_map.iterator(); + while (it.next()) |entry| { + const stored_val = ht.get(entry.key_ptr.*); + try testing.expect(stored_val != null); + try testing.expectEqual(entry.value_ptr.*, stored_val.?); + } + } + } +} + +fn stressTest( + comptime capacity: usize, + comptime shards: u64, + comptime iterations: u64, + comptime keys_per_thread: u64, + comptime num_threads: u64, +) !void { + const allocator = testing.allocator; + + var ht = try AutoHashMapConcurrent(u64, u64).init(allocator, capacity, shards); + defer ht.deinit(allocator); + + const Context = struct { + id: u64, + allocator: Allocator, + ht: *AutoHashMapConcurrent(u64, u64), + iterations: u64, + keys_per_thread: u64, + + fn run( + id: u64, + alloc: Allocator, + table: *AutoHashMapConcurrent(u64, u64), + iter: u64, + k_per_t: u64, + ) !void { + var prng = std.Random.DefaultPrng.init(id); + const random = prng.random(); + + var ref_map = std.AutoHashMapUnmanaged(u64, u64).empty; + try ref_map.ensureTotalCapacity(alloc, capacity * 2); + defer ref_map.deinit(alloc); + + const start = id * k_per_t; + const end = start + k_per_t; + + for (0..iter) |_| { + const action = random.uintAtMostBiased(u8, 9); + const key = random.intRangeLessThan(u64, start, end); + + if (action <= 3) { // put + if (!table.atCapacity()) { + const val = random.int(u64); + table.put(key, val); + ref_map.putAssumeCapacity(key, val); + } + } else if (action <= 4) { // fetch + const ht_val = table.getChecked(key); + const ref_val = ref_map.get(key); + try testing.expectEqual(ref_val, ht_val); + } else { // remove + table.remove(key); + _ = ref_map.remove(key); + } + } + } + }; + + var threads: [num_threads]std.Thread = undefined; + for (0..num_threads) |i| { + threads[i] = try std.Thread.spawn( + .{ .allocator = allocator }, + Context.run, + .{ i, allocator, &ht, iterations, keys_per_thread }, + ); + } + + for (threads) |t| { + t.join(); + } + try ht.verifyIntegrity(); +} + +test "multithreaded fuzz" { + try stressTest( + 1024, + 32, + 100_000, + 512, + 8, + ); +} + +test "multithreaded stress" { + if (true) { + return error.SkipZigTest; + } + try stressTest( + 1024 * 1024, + 1024, + 1_000_000_000, + 1024 * 1024, + 8, + ); +} + +test "torn reads and value clobbering" { + const num_threads = 16; + const capacity = 64; + const shards = 4; + const num_keys = 8; + const keys = [_]u64{ 0, 1, 2, 3, 4, 5, 6, 7 }; + const time_ns = 1 * std.time.ns_per_s; + + const allocator = testing.allocator; + var ht = try AutoHashMapConcurrent(u64, u64).init(allocator, capacity, shards); + defer ht.deinit(allocator); + + var stop = atomic.Value(bool).init(false); + + const Context = struct { + fn run( + id: usize, + _ht: *AutoHashMapConcurrent(u64, u64), + _stop: *atomic.Value(bool), + ) !void { + var prng = std.Random.DefaultPrng.init(id); + const random = prng.random(); + + // Each thread has a unique pattern like 0x0000000100000001 + const thread_pattern: u32 = @intCast(id + 1); + const thread_val: u64 = (@as(u64, thread_pattern) << 32) | thread_pattern; + + while (!_stop.load(.monotonic)) { + const key = keys[random.uintLessThan(usize, num_keys)]; + + // 50% Put, 50% Get + if (random.boolean()) { + _ht.put(key, thread_val); + } else { + const val = try _ht.getChecked(key); + + if (val) |v| { + const high: u32 = @intCast(v >> 32); + const low: u32 = @intCast(v & 0xFFFFFFFF); + + try testing.expectEqual(high, low); // torn read + try testing.expect(low != 0); + try testing.expect(low <= num_threads); + try testing.expect(high != 0); + try testing.expect(high <= num_threads); + } + } + } + } + }; + + var threads: [num_threads]std.Thread = undefined; + for (0..num_threads) |i| { + threads[i] = try std.Thread.spawn( + .{}, + Context.run, + .{ i, &ht, &stop }, + ); + } + + std.Thread.sleep(time_ns); + stop.store(true, .monotonic); + + for (threads) |t| t.join(); + + try ht.verifyIntegrity(); +} + +test "structural integrity" { + const cap = 512; + const shards = 16; + const num_threads = 16; + const key_range = 1024; + const num_rounds = 50; + const time_per_round_ns = 25 * std.time.ns_per_ms; + + const allocator = testing.allocator; + var ht = try AutoHashMapConcurrent(u64, u64).init(allocator, cap, shards); + defer ht.deinit(allocator); + + var stop = atomic.Value(bool).init(false); + var exit = atomic.Value(bool).init(false); + var start_sem = std.Thread.Semaphore{}; + var done_sem = std.Thread.Semaphore{}; + const Context = struct { + fn run( + _ht: *AutoHashMapConcurrent(u64, u64), + _stop: *atomic.Value(bool), + _exit: *atomic.Value(bool), + _start: *std.Thread.Semaphore, + _done: *std.Thread.Semaphore, + seed: u64, + ) !void { + var prng = std.Random.DefaultPrng.init(seed); + const random = prng.random(); + + while (true) { + _start.wait(); + if (_exit.load(.monotonic)) break; + + while (!_stop.load(.monotonic)) { + const key = random.uintLessThan(u64, key_range); + const action = random.uintLessThan(u8, 10); + + if (action < 4) { // 40% Put + if (!_ht.atCapacity()) { + _ht.put(key, key); + } + } else if (action < 8) { // 40% Remove + _ht.remove(key); + } else { // 20% Get + _ = try _ht.getChecked(key); + } + + // Yield occasionally to increase interleaving + if (random.uintLessThan(u8, 100) == 0) try std.Thread.yield(); + } + _done.post(); + } + } + }; + + var threads: [num_threads]std.Thread = undefined; + for (0..num_threads) |i| { + threads[i] = try std.Thread.spawn( + .{}, + Context.run, + .{ &ht, &stop, &exit, &start_sem, &done_sem, i }, + ); + } + + // We run multiple rounds of stress. In each rounds, threads cause chaos, then we stop them and + // verify the table isn't corrupted. + for (0..num_rounds) |_| { + stop.store(false, .monotonic); + for (0..num_threads) |_| start_sem.post(); + + std.Thread.sleep(time_per_round_ns); + + // Stop the world + stop.store(true, .monotonic); + for (0..num_threads) |_| done_sem.wait(); + + try ht.verifyIntegrity(); + } + + exit.store(true, .monotonic); + for (0..num_threads) |_| start_sem.post(); + for (threads) |t| t.join(); +} + +test "linearizability and reference matching" { + const cap = 1024; + const shards = 64; + const num_keys = 128; + const num_workers = 8; + const time_ns = 1 * std.time.ns_per_s; + + const allocator = testing.allocator; + var ht = try AutoHashMapConcurrent(u64, u64).init(allocator, cap, shards); + defer ht.deinit(allocator); + + var stop = atomic.Value(bool).init(false); + + const Reference = struct { + values: [num_keys]atomic.Value(u64), + locks: [num_keys]std.Thread.Mutex, + + fn init() @This() { + var self: @This() = undefined; + for (0..num_keys) |i| { + self.values[i] = atomic.Value(u64).init(0); + self.locks[i] = .{}; + } + return self; + } + }; + var ref = Reference.init(); + + const Worker = struct { + fn run( + table: *AutoHashMapConcurrent(u64, u64), + reference: *Reference, + is_stop: *atomic.Value(bool), + seed: u64, + ) !void { + var prng = std.Random.DefaultPrng.init(seed); + const random = prng.random(); + + while (!is_stop.load(.monotonic)) { + const key = random.uintLessThan(usize, num_keys); + const val = random.intRangeAtMost(u64, 1, math.maxInt(u64) - 1); + + // Lock the reference key to ensure the Map and the Reference are updated atomically + reference.locks[key].lock(); + defer reference.locks[key].unlock(); + + table.put(key, val); + reference.values[key].store(val, .release); + + if (random.uintLessThan(u8, 100) == 0) try std.Thread.yield(); + } + } + }; + + const Observer = struct { + fn run( + table: *AutoHashMapConcurrent(u64, u64), + reference: *Reference, + is_stop: *atomic.Value(bool), + ) !void { + while (!is_stop.load(.monotonic)) { + for (0..num_keys) |key| { + reference.locks[key].lock(); + defer reference.locks[key].unlock(); + + const map_val = try table.getChecked(key) orelse 0; // 0 instead of null + const ref_val = reference.values[key].load(.acquire); + try testing.expectEqual(ref_val, map_val); + } + } + } + }; + + var workers: [num_workers]std.Thread = undefined; + for (0..num_workers) |i| { + workers[i] = try std.Thread.spawn(.{}, Worker.run, .{ &ht, &ref, &stop, i }); + } + const observer_thread = try std.Thread.spawn(.{}, Observer.run, .{ &ht, &ref, &stop }); + + std.Thread.sleep(time_ns); + stop.store(true, .monotonic); + + for (workers) |t| t.join(); + observer_thread.join(); + + // Final check + for (0..num_keys) |i| { + const map_v = try ht.getChecked(i); + const ref_v = ref.values[i].load(.monotonic); + try testing.expectEqual(ref_v, map_v.?); + } + try ht.verifyIntegrity(); +} + +/// Wrapper to make standard HashMap thread-safe for comparison +fn MutexHashMap(K: type, V: type, max_fill_factor: f64) type { + const max_load_percentage: u64 = @intFromFloat(max_fill_factor * 100); + return struct { + const Self = @This(); + mutex: std.Thread.Mutex = .{}, + map: std.HashMapUnmanaged(K, V, std.hash_map.AutoContext(K), max_load_percentage) = .empty, + + fn init(allocator: Allocator, capacity: u32, _: usize) !Self { + var self = Self{}; + // Pre-allocate to be fair + try self.map.ensureTotalCapacity(allocator, capacity); + return self; + } + + fn deinit(self: *Self, allocator: Allocator) void { + self.map.deinit(allocator); + } + + fn atCapacity(self: *Self) bool { + return self.map.available == 0; + } + + fn put(self: *Self, k: u64, v: u64) void { + self.mutex.lock(); + defer self.mutex.unlock(); + self.map.putAssumeCapacity(k, v); + } + + fn get(self: *Self, k: u64) ?u64 { + self.mutex.lock(); + defer self.mutex.unlock(); + return self.map.get(k); + } + + fn remove(self: *Self, k: u64) void { + self.mutex.lock(); + defer self.mutex.unlock(); + _ = self.map.remove(k); + } + }; +} + +const BenchOptions = struct { + name: []const u8, + size: u32, + num_threads: u64, + iterations: u64, + put_prob: u8, + remove_prob: u8, + baseline_ns: ?u64 = null, +}; + +fn benchWorker( + comptime MapType: type, + map: *MapType, + seed: u64, + options: BenchOptions, +) void { + var prng = std.Random.DefaultPrng.init(seed); + const random = prng.random(); + + const total_ops = options.iterations / options.num_threads; + const key_range = options.size * 2; + + for (0..total_ops) |_| { + const action = random.uintLessThanBiased(u8, 100); + const key = random.uintLessThanBiased(u64, key_range); + + if (action < options.put_prob and !map.atCapacity()) { + map.put(key, key); + continue; + } + if (action < options.put_prob + options.remove_prob) { + map.remove(key); + continue; + } + _ = map.get(key); + } +} + +fn runBench( + allocator: Allocator, + comptime MapType: type, + options: BenchOptions, +) !u64 { + const num_shards = @min(@max(64, options.num_threads * 4), 1024); + var map = try MapType.init(allocator, options.size, num_shards); + defer map.deinit(allocator); + + var threads = try allocator.alloc(std.Thread, options.num_threads); + defer allocator.free(threads); + + // Pre fill to avoid empty bias + var k: u64 = 0; + while (!map.atCapacity()) : (k += 1) { + map.put(k, k); + } + + const timer_start = std.time.nanoTimestamp(); + for (0..options.num_threads) |i| { + threads[i] = try std.Thread.spawn(.{}, benchWorker, .{ + MapType, &map, i, options, + }); + } + for (threads) |t| t.join(); + return @intCast(std.time.nanoTimestamp() - timer_start); +} + +/// These are by no means statistically sound benchmarks. They are just to give a rough guidance on +/// how to choose parameters. +pub fn main() !void { + const size = 1024 * 1024; + const iterations = 10_000_000; + const load_factors = [_]f64{ 0.5, 0.8, 0.9, 0.95, 0.98 }; + + const configs = [_]struct { name: []const u8, p: u8, r: u8 }{ + .{ .name = "Read-Heavy", .p = 3, .r = 2 }, + .{ .name = "Balanced", .p = 25, .r = 25 }, + .{ .name = "Write-Heavy", .p = 45, .r = 45 }, + }; + + const allocator = std.heap.page_allocator; + + var thread_counts = std.ArrayListUnmanaged(u64).empty; + defer thread_counts.deinit(allocator); + + const cpu_count = try std.Thread.getCpuCount(); + var t: u64 = 1; + while (t <= cpu_count) : (t *= 2) { + try thread_counts.append(allocator, t); + } + + const csv_file = try std.fs.cwd().createFile("benchmark_results.csv", .{}); + defer csv_file.close(); + var csv_buffer: [1024]u8 = undefined; + var csv_file_writer = csv_file.writer(&csv_buffer); + const csv = &csv_file_writer.interface; + try csv.print("implementation,load_factor,workload,threads,time_ns,ops_per_sec\n", .{}); + + var stdout_buffer: [1024]u8 = undefined; + var stdout_file_writer = std.fs.File.stdout().writer(&stdout_buffer); + const stdout = &stdout_file_writer.interface; + + // Header + try stdout.print( + "{s:<14} | {s:<4} | {s:<11}", + .{ "Implementation", "LF", "Workload" }, + ); + for (thread_counts.items) |threads| { + try stdout.print(" | {d:>3} Threads", .{threads}); + } + try stdout.print("\n", .{}); + + // Separator + try stdout.print("{s:-<14}-+-{s:-<4}-+-{s:-<11}", .{ "", "", "" }); + for (thread_counts.items) |_| try stdout.print("-+------------", .{}); + try stdout.print("\n", .{}); + try stdout.flush(); + + inline for (load_factors) |lf| { + for (configs) |cfg| { + const impls = [_][]const u8{ "Concurrent", "Mutex" }; + inline for (impls) |impl_name| { + // Do not spam with unnecessary mutex benchmarks. + if (comptime mem.eql(u8, impl_name, "Mutex") and lf != 0.8) continue; + + try stdout.print("{s:<14} | {d:<4.2} | {s:<11}", .{ impl_name, lf, cfg.name }); + + for (thread_counts.items) |threads| { + const options = BenchOptions{ + .name = impl_name, + .size = size, + .num_threads = threads, + .iterations = iterations, + .put_prob = cfg.p, + .remove_prob = cfg.r, + }; + + const time_ns = if (mem.eql(u8, impl_name, "Concurrent")) + try runBench( + allocator, + HashMapConcurrent( + u64, + u64, + getAutoHashFn(u64), + getAutoEqlFn(u64), + .{ .max_fill_factor = lf }, + ), + options, + ) + else + try runBench(allocator, MutexHashMap(u64, u64, lf), options); + + try stdout.print(" | {D:>9} ", .{time_ns}); + + const total_ops: f64 = @floatFromInt(iterations); + const time_s: f64 = @as(f64, @floatFromInt(time_ns)) / 1e9; + const ops_sec: u64 = @intFromFloat(total_ops / time_s); + try csv.print( + "{s},{d:.2},{s},{d},{d},{d}\n", + .{ impl_name, lf, cfg.name, threads, time_ns, ops_sec }, + ); + } + try stdout.print("\n", .{}); + try stdout.flush(); + } + } + // Small separator between Load Factors + try stdout.print("{s:-<14}-+-{s:-<4}-+-{s:-<11}", .{ "", "", "" }); + for (thread_counts.items) |_| try stdout.print("-+------------", .{}); + try stdout.print("\n", .{}); + try stdout.flush(); + } + try csv.flush(); + try stdout.flush(); +} diff --git a/plot.gp b/plot.gp new file mode 100644 index 0000000..2865d43 --- /dev/null +++ b/plot.gp @@ -0,0 +1,76 @@ +# Output Settings +set terminal pngcairo size 1200,1600 enhanced font 'Segoe UI,12' linewidth 2 +set output 'benchmark_results.png' + +# Data Settings +set datafile separator "," +set title font "Segoe UI,16" + +# Layout: 3 rows, 1 column +set multiplot layout 3,1 title "Concurrent HashMap Benchmark Results\nThroughput vs Thread Count" offset 0, -0.05 scale 1, 0.95 + +# Axis Settings +set grid y +set grid x +set xlabel "Threads (Log Scale)" +set ylabel "Throughput (Operations / Sec)" +set logscale x 2 +set format y "%.1s%c" # Formats 1000000 as 1.0M + +# Key (Legend) Settings +set key outside right top box +set key title "Configuration" + +# Colors (Semantic Spectrum: Cool to Critical) +c_050 = "#17becf" # Cyan (Light Load) +c_080 = "#2ca02c" # Green (Standard) +c_090 = "#1f77b4" # Blue (Heavy) +c_095 = "#ff7f0e" # Orange (Warning) +c_098 = "#d62728" # Red (Critical) + +# Point Types (Shapes) +# 13=Diamond, 7=Circle, 5=Square, 9=Triangle Up, 11=Triangle Down +pt_conc_050 = 13 +pt_conc_080 = 7 +pt_conc_090 = 5 +pt_conc_095 = 9 +pt_conc_098 = 11 +# Open versions for Mutex (Index - 1 usually) +pt_mutex_050 = 12 +pt_mutex_080 = 6 +pt_mutex_090 = 4 +pt_mutex_095 = 8 +pt_mutex_098 = 10 + +# Helper function to filter data +# Col 1: Impl, Col 2: LF, Col 3: Workload, Col 6: Ops/Sec +filter(workload, impl, lf) = (strcol(3) eq workload && strcol(1) eq impl && abs($2 - lf) < 0.001) ? $6 : 1/0 + +set title "Workload: Read-Heavy (3% Put, 2% Remove, 95% Get)" +plot \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Concurrent", 0.50)) w lp lc rgb c_050 pt pt_conc_050 t "Concurrent (LF 0.50)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Concurrent", 0.80)) w lp lc rgb c_080 pt pt_conc_080 t "Concurrent (LF 0.80)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Concurrent", 0.90)) w lp lc rgb c_090 pt pt_conc_090 t "Concurrent (LF 0.90)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Concurrent", 0.95)) w lp lc rgb c_095 pt pt_conc_095 t "Concurrent (LF 0.95)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Concurrent", 0.98)) w lp lc rgb c_098 pt pt_conc_098 t "Concurrent (LF 0.98)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Read-Heavy", "Mutex", 0.80)) w lp lc rgb c_080 dt 2 pt pt_mutex_080 t "Mutex (LF 0.80)", + +set title "Workload: Balanced (25% Put, 25% Remove, 50% Get)" +plot \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Concurrent", 0.50)) w lp lc rgb c_050 pt pt_conc_050 t "Concurrent (LF 0.50)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Concurrent", 0.80)) w lp lc rgb c_080 pt pt_conc_080 t "Concurrent (LF 0.80)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Concurrent", 0.90)) w lp lc rgb c_090 pt pt_conc_090 t "Concurrent (LF 0.90)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Concurrent", 0.95)) w lp lc rgb c_095 pt pt_conc_095 t "Concurrent (LF 0.95)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Concurrent", 0.98)) w lp lc rgb c_098 pt pt_conc_098 t "Concurrent (LF 0.98)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Balanced", "Mutex", 0.80)) w lp lc rgb c_080 dt 2 pt pt_mutex_080 t "Mutex (LF 0.80)", + +set title "Workload: Write-Heavy (45% Put, 45% Remove, 10% Get)" +plot \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Concurrent", 0.50)) w lp lc rgb c_050 pt pt_conc_050 t "Concurrent (LF 0.50)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Concurrent", 0.80)) w lp lc rgb c_080 pt pt_conc_080 t "Concurrent (LF 0.80)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Concurrent", 0.90)) w lp lc rgb c_090 pt pt_conc_090 t "Concurrent (LF 0.90)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Concurrent", 0.95)) w lp lc rgb c_095 pt pt_conc_095 t "Concurrent (LF 0.95)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Concurrent", 0.98)) w lp lc rgb c_098 pt pt_conc_098 t "Concurrent (LF 0.98)", \ + 'benchmark_results.csv' every ::1 using 4:(filter("Write-Heavy", "Mutex", 0.80)) w lp lc rgb c_080 dt 2 pt pt_mutex_080 t "Mutex (LF 0.80)", + +unset multiplot