Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
db77ced
Add initial templates for Robin Hood probing.
aterenin Jun 2, 2026
d177546
Add Robin Hood probe distance test.
aterenin Jun 2, 2026
75a78df
Add Robin Hood get methods.
aterenin Jun 2, 2026
dc90ebe
Add Robin Hood invariant test.
aterenin Jun 2, 2026
12b8e57
Add non-CG insert for Robin Hood.
aterenin Jun 3, 2026
0cc3fbd
Add CG insert for Robin Hood.
aterenin Jun 3, 2026
2a92131
Propagate Robin Hood insert to variants.
aterenin Jun 3, 2026
c27f483
Add initial tests and fix insert_or_assign for Robin Hood.
aterenin Jun 4, 2026
d2341e5
Add Robin Hood erase and tests.
aterenin Jun 5, 2026
1f3d64e
[pre-commit.ci] auto code formatting
pre-commit-ci[bot] Jun 5, 2026
f26495a
Disallow 96-bit slots for Robin Hood.
aterenin Jun 6, 2026
826eb84
Revert to original version.
aterenin Jun 24, 2026
10af0f9
Copy baseline implementation.
aterenin Jun 25, 2026
1fb7cf3
Add Robin Hood get and insert.
aterenin Jun 25, 2026
53c884c
[pre-commit.ci] auto code formatting
pre-commit-ci[bot] Jun 25, 2026
d4cff56
Merge branch 'NVIDIA:dev' into dev
aterenin Jun 25, 2026
7c4cd12
Adapt tests and comment expected failures.
aterenin Jun 29, 2026
d7c8fed
[pre-commit.ci] auto code formatting
pre-commit-ci[bot] Jun 29, 2026
628889a
Merge branch 'dev' into dev
aterenin Jun 29, 2026
c9c2e6c
Fix compile error on sm90.
aterenin Jul 19, 2026
51f04c6
Merge branch 'dev' into dev
aterenin Jul 19, 2026
40187dd
[pre-commit.ci] auto code formatting
pre-commit-ci[bot] Jul 19, 2026
23dc7f7
Merge branch 'dev' into dev
aterenin Aug 25, 2026
8c8f168
Update license statement to match upstream.
aterenin Aug 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions README.md

Large diffs are not rendered by default.

11 changes: 7 additions & 4 deletions benchmarks/dynamic_map/contains_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> dynamic_map_contains(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(dynamic_map_contains,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_contains_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -73,8 +76,8 @@ NVBENCH_BENCH_TYPES(dynamic_map_contains,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(dynamic_map_contains,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_contains_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
11 changes: 7 additions & 4 deletions benchmarks/dynamic_map/erase_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> dynamic_map_erase(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(dynamic_map_erase,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_erase_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -75,8 +78,8 @@ NVBENCH_BENCH_TYPES(dynamic_map_erase,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(dynamic_map_erase,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_erase_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
11 changes: 7 additions & 4 deletions benchmarks/dynamic_map/find_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> dynamic_map_find(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(dynamic_map_find,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_find_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -73,8 +76,8 @@ NVBENCH_BENCH_TYPES(dynamic_map_find,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(dynamic_map_find,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_find_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
15 changes: 9 additions & 6 deletions benchmarks/dynamic_map/insert_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> dynamic_map_insert(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(dynamic_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_insert_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -75,8 +78,8 @@ NVBENCH_BENCH_TYPES(dynamic_map_insert,
.add_int64_axis("BatchSize", {defaults::BATCH_SIZE});

NVBENCH_BENCH_TYPES(dynamic_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::uniform>))
.set_name("dynamic_map_insert_uniform_multiplicity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -86,8 +89,8 @@ NVBENCH_BENCH_TYPES(dynamic_map_insert,
.add_int64_axis("Multiplicity", defaults::MULTIPLICITY_RANGE);

NVBENCH_BENCH_TYPES(dynamic_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::gaussian>))
.set_name("dynamic_map_insert_gaussian_skew")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
11 changes: 7 additions & 4 deletions benchmarks/dynamic_map/retrieve_all_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -60,18 +60,21 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> dynamic_map_retrieve_all(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(dynamic_map_retrieve_all,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_retrieve_all_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
.add_int64_axis("NumInputs", defaults::N_RANGE)
.add_int64_axis("InitSize", {defaults::INITIAL_SIZE});

NVBENCH_BENCH_TYPES(dynamic_map_retrieve_all,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("dynamic_map_retrieve_all_fixed_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
15 changes: 9 additions & 6 deletions benchmarks/static_map/contains_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> static_map_contains(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(static_map_contains,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_contains_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -74,8 +77,8 @@ NVBENCH_BENCH_TYPES(static_map_contains,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_contains,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_contains_unique_occupancy")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -84,8 +87,8 @@ NVBENCH_BENCH_TYPES(static_map_contains,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_contains,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_contains_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
15 changes: 9 additions & 6 deletions benchmarks/static_map/erase_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> static_map_erase(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(static_map_erase,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_erase_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -77,8 +80,8 @@ NVBENCH_BENCH_TYPES(static_map_erase,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_erase,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_erase_unique_occupancy")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -87,8 +90,8 @@ NVBENCH_BENCH_TYPES(static_map_erase,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_erase,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_erase_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
15 changes: 9 additions & 6 deletions benchmarks/static_map/find_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,12 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> static_map_find(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(static_map_find,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_find_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -74,8 +77,8 @@ NVBENCH_BENCH_TYPES(static_map_find,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_find,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_find_unique_occupancy")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -84,8 +87,8 @@ NVBENCH_BENCH_TYPES(static_map_find,
.add_float64_axis("MatchingRate", {defaults::MATCHING_RATE});

NVBENCH_BENCH_TYPES(static_map_find,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_find_unique_matching_rate")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
19 changes: 11 additions & 8 deletions benchmarks/static_map/insert_bench.cu
Original file line number Diff line number Diff line change
Expand Up @@ -59,27 +59,30 @@ std::enable_if_t<(sizeof(Key) != sizeof(Value)), void> static_map_insert(
state.skip("Key should be the same type as Value.");
}

// Robin Hood (hard-wired into static_map) requires a single-CAS slot, so the shared
// defaults::KEY_TYPE_RANGE x VALUE_TYPE_RANGE cross product cannot be used here: the padded
// int32/int64 and int64/int32 combos (12 bytes) are unsupported. Restricted to int32/int32 (8B).
NVBENCH_BENCH_TYPES(static_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_insert_unique_capacity")
.set_type_axes_names({"Key", "Value", "Distribution"})
.add_int64_axis("NumInputs", defaults::N_RANGE_CACHE)
.add_float64_axis("Occupancy", {defaults::OCCUPANCY});

NVBENCH_BENCH_TYPES(static_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::unique>))
.set_name("static_map_insert_unique_occupancy")
.set_type_axes_names({"Key", "Value", "Distribution"})
.add_int64_axis("NumInputs", {defaults::N})
.add_float64_axis("Occupancy", defaults::OCCUPANCY_RANGE);

NVBENCH_BENCH_TYPES(static_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::uniform>))
.set_name("static_map_insert_uniform_multiplicity")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand All @@ -88,8 +91,8 @@ NVBENCH_BENCH_TYPES(static_map_insert,
.add_int64_axis("Multiplicity", defaults::MULTIPLICITY_RANGE);

NVBENCH_BENCH_TYPES(static_map_insert,
NVBENCH_TYPE_AXES(defaults::KEY_TYPE_RANGE,
defaults::VALUE_TYPE_RANGE,
NVBENCH_TYPE_AXES(nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<nvbench::int32_t>,
nvbench::type_list<distribution::gaussian>))
.set_name("static_map_insert_gaussian_skew")
.set_type_axes_names({"Key", "Value", "Distribution"})
Expand Down
Loading