diff --git a/.clang-format b/.clang-format
index a11d3e8be..24ca02860 100644
--- a/.clang-format
+++ b/.clang-format
@@ -56,7 +56,7 @@ BreakConstructorInitializers: BeforeColon
BreakInheritanceList: BeforeColon
BreakStringLiterals: true
ColumnLimit: 100
-CommentPragmas: '^ IWYU pragma:'
+CommentPragmas: '(IWYU pragma:|SPDX-)'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
# Kept the below 2 to be the same as `IndentWidth` to keep everything uniform
@@ -113,6 +113,7 @@ PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 200
PointerAlignment: Left
+QualifierAlignment: Right
RawStringFormats:
- Language: Cpp
Delimiters:
diff --git a/.devcontainer/cuda12.0-gcc11/devcontainer.json b/.devcontainer/cuda12.0-gcc11/devcontainer.json
index 1535cefbd..06f034bae 100644
--- a/.devcontainer/cuda12.0-gcc11/devcontainer.json
+++ b/.devcontainer/cuda12.0-gcc11/devcontainer.json
@@ -1,6 +1,6 @@
{
"shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-gcc11-cuda12.0-ubuntu22.04",
+ "image": "rapidsai/devcontainers:26.04-cpp-gcc11-cuda12.0-ubuntu22.04",
"hostRequirements": {
"gpu": true
},
diff --git a/.devcontainer/cuda12.0-llvm14/devcontainer.json b/.devcontainer/cuda12.0-llvm14/devcontainer.json
index 33804ed68..64d141aab 100644
--- a/.devcontainer/cuda12.0-llvm14/devcontainer.json
+++ b/.devcontainer/cuda12.0-llvm14/devcontainer.json
@@ -1,6 +1,6 @@
{
"shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-llvm14-cuda12.0-ubuntu20.04",
+ "image": "rapidsai/devcontainers:26.04-cpp-llvm14-cuda12.0-ubuntu20.04",
"hostRequirements": {
"gpu": true
},
diff --git a/.devcontainer/cuda13.0-gcc13/devcontainer.json b/.devcontainer/cuda13.0-gcc13/devcontainer.json
deleted file mode 100644
index 0ae541055..000000000
--- a/.devcontainer/cuda13.0-gcc13/devcontainer.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-gcc13-cuda13.0-ubuntu24.04",
- "hostRequirements": {
- "gpu": true
- },
- "initializeCommand": [
- "/bin/bash",
- "-c",
- "mkdir -m 0755 -p ${localWorkspaceFolder}/.{aws,cache,config}"
- ],
- "containerEnv": {
- "SCCACHE_REGION": "us-east-2",
- "SCCACHE_BUCKET": "rapids-sccache-devs",
- "AWS_ROLE_ARN": "arn:aws:iam::279114543810:role/nv-gha-token-sccache-devs",
- "HISTFILE": "${containerWorkspaceFolder}/.cache/._bash_history",
- "DEVCONTAINER_NAME": "cuda13.0-gcc13",
- "CUCO_CUDA_VERSION": "13.0",
- "CUCO_HOST_COMPILER": "gcc",
- "CUCO_HOST_COMPILER_VERSION": "13"
- },
- "workspaceFolder": "/home/coder/${localWorkspaceFolderBasename}",
- "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",
- "mounts": [
- "source=${localWorkspaceFolder}/.aws,target=/home/coder/.aws,type=bind,consistency=consistent",
- "source=${localWorkspaceFolder}/.cache,target=/home/coder/.cache,type=bind,consistency=consistent",
- "source=${localWorkspaceFolder}/.config,target=/home/coder/.config,type=bind,consistency=consistent"
- ],
- "customizations": {
- "vscode": {
- "extensions": [
- "llvm-vs-code-extensions.vscode-clangd"
- ],
- "settings": {
- "clangd.arguments": [
- "--compile-commands-dir=${workspaceFolder}/build/latest"
- ]
- }
- }
- },
- "name": "cuda13.0-gcc13"
-}
diff --git a/.devcontainer/cuda13.0-llvm20/devcontainer.json b/.devcontainer/cuda13.0-llvm20/devcontainer.json
deleted file mode 100644
index 76936f8f2..000000000
--- a/.devcontainer/cuda13.0-llvm20/devcontainer.json
+++ /dev/null
@@ -1,42 +0,0 @@
-{
- "shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-llvm20-cuda13.0ext-ubuntu24.04",
- "hostRequirements": {
- "gpu": true
- },
- "initializeCommand": [
- "/bin/bash",
- "-c",
- "mkdir -m 0755 -p ${localWorkspaceFolder}/.{aws,cache,config}"
- ],
- "containerEnv": {
- "SCCACHE_REGION": "us-east-2",
- "SCCACHE_BUCKET": "rapids-sccache-devs",
- "AWS_ROLE_ARN": "arn:aws:iam::279114543810:role/nv-gha-token-sccache-devs",
- "HISTFILE": "${containerWorkspaceFolder}/.cache/._bash_history",
- "DEVCONTAINER_NAME": "cuda13.0-llvm20",
- "CUCO_CUDA_VERSION": "13.0",
- "CUCO_HOST_COMPILER": "llvm",
- "CUCO_HOST_COMPILER_VERSION": "20"
- },
- "workspaceFolder": "/home/coder/${localWorkspaceFolderBasename}",
- "workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",
- "mounts": [
- "source=${localWorkspaceFolder}/.aws,target=/home/coder/.aws,type=bind,consistency=consistent",
- "source=${localWorkspaceFolder}/.cache,target=/home/coder/.cache,type=bind,consistency=consistent",
- "source=${localWorkspaceFolder}/.config,target=/home/coder/.config,type=bind,consistency=consistent"
- ],
- "customizations": {
- "vscode": {
- "extensions": [
- "llvm-vs-code-extensions.vscode-clangd"
- ],
- "settings": {
- "clangd.arguments": [
- "--compile-commands-dir=${workspaceFolder}/build/latest"
- ]
- }
- }
- },
- "name": "cuda13.0-llvm20"
-}
diff --git a/.devcontainer/cuda12.9-gcc13/devcontainer.json b/.devcontainer/cuda13.1-gcc14/devcontainer.json
similarity index 86%
rename from .devcontainer/cuda12.9-gcc13/devcontainer.json
rename to .devcontainer/cuda13.1-gcc14/devcontainer.json
index a33105965..81f7c4c8f 100644
--- a/.devcontainer/cuda12.9-gcc13/devcontainer.json
+++ b/.devcontainer/cuda13.1-gcc14/devcontainer.json
@@ -1,6 +1,6 @@
{
"shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-gcc13-cuda12.9-ubuntu24.04",
+ "image": "rapidsai/devcontainers:26.04-cpp-gcc14-cuda13.1-ubuntu24.04",
"hostRequirements": {
"gpu": true
},
@@ -14,10 +14,10 @@
"SCCACHE_BUCKET": "rapids-sccache-devs",
"AWS_ROLE_ARN": "arn:aws:iam::279114543810:role/nv-gha-token-sccache-devs",
"HISTFILE": "${containerWorkspaceFolder}/.cache/._bash_history",
- "DEVCONTAINER_NAME": "cuda12.9-gcc13",
- "CUCO_CUDA_VERSION": "12.9",
+ "DEVCONTAINER_NAME": "cuda13.1-gcc14",
+ "CUCO_CUDA_VERSION": "13.1",
"CUCO_HOST_COMPILER": "gcc",
- "CUCO_HOST_COMPILER_VERSION": "13"
+ "CUCO_HOST_COMPILER_VERSION": "14"
},
"workspaceFolder": "/home/coder/${localWorkspaceFolderBasename}",
"workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",
@@ -38,5 +38,5 @@
}
}
},
- "name": "cuda12.9-gcc13"
+ "name": "cuda13.1-gcc14"
}
diff --git a/.devcontainer/cuda12.9-llvm18/devcontainer.json b/.devcontainer/cuda13.1-llvm21/devcontainer.json
similarity index 85%
rename from .devcontainer/cuda12.9-llvm18/devcontainer.json
rename to .devcontainer/cuda13.1-llvm21/devcontainer.json
index 6140f6007..1f95f76d7 100644
--- a/.devcontainer/cuda12.9-llvm18/devcontainer.json
+++ b/.devcontainer/cuda13.1-llvm21/devcontainer.json
@@ -1,6 +1,6 @@
{
"shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-llvm18-cuda12.9-ubuntu22.04",
+ "image": "rapidsai/devcontainers:26.04-cpp-llvm21-cuda13.1-ubuntu24.04",
"hostRequirements": {
"gpu": true
},
@@ -14,10 +14,10 @@
"SCCACHE_BUCKET": "rapids-sccache-devs",
"AWS_ROLE_ARN": "arn:aws:iam::279114543810:role/nv-gha-token-sccache-devs",
"HISTFILE": "${containerWorkspaceFolder}/.cache/._bash_history",
- "DEVCONTAINER_NAME": "cuda12.9-llvm18",
- "CUCO_CUDA_VERSION": "12.9",
+ "DEVCONTAINER_NAME": "cuda13.1-llvm21",
+ "CUCO_CUDA_VERSION": "13.1",
"CUCO_HOST_COMPILER": "llvm",
- "CUCO_HOST_COMPILER_VERSION": "18"
+ "CUCO_HOST_COMPILER_VERSION": "21"
},
"workspaceFolder": "/home/coder/${localWorkspaceFolderBasename}",
"workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",
@@ -38,5 +38,5 @@
}
}
},
- "name": "cuda12.9-llvm18"
+ "name": "cuda13.1-llvm21"
}
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 0ae541055..81f7c4c8f 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,6 +1,6 @@
{
"shutdownAction": "stopContainer",
- "image": "rapidsai/devcontainers:25.12-cpp-gcc13-cuda13.0-ubuntu24.04",
+ "image": "rapidsai/devcontainers:26.04-cpp-gcc14-cuda13.1-ubuntu24.04",
"hostRequirements": {
"gpu": true
},
@@ -14,10 +14,10 @@
"SCCACHE_BUCKET": "rapids-sccache-devs",
"AWS_ROLE_ARN": "arn:aws:iam::279114543810:role/nv-gha-token-sccache-devs",
"HISTFILE": "${containerWorkspaceFolder}/.cache/._bash_history",
- "DEVCONTAINER_NAME": "cuda13.0-gcc13",
- "CUCO_CUDA_VERSION": "13.0",
+ "DEVCONTAINER_NAME": "cuda13.1-gcc14",
+ "CUCO_CUDA_VERSION": "13.1",
"CUCO_HOST_COMPILER": "gcc",
- "CUCO_HOST_COMPILER_VERSION": "13"
+ "CUCO_HOST_COMPILER_VERSION": "14"
},
"workspaceFolder": "/home/coder/${localWorkspaceFolderBasename}",
"workspaceMount": "source=${localWorkspaceFolder},target=/home/coder/${localWorkspaceFolderBasename},type=bind,consistency=consistent",
@@ -38,5 +38,5 @@
}
}
},
- "name": "cuda13.0-gcc13"
+ "name": "cuda13.1-gcc14"
}
diff --git a/.devcontainer/launch.sh b/.devcontainer/launch.sh
index 157a49bef..86c38bd67 100755
--- a/.devcontainer/launch.sh
+++ b/.devcontainer/launch.sh
@@ -1,18 +1,6 @@
#! /usr/bin/env bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
launch_devcontainer() {
diff --git a/.devcontainer/make_devcontainers.sh b/.devcontainer/make_devcontainers.sh
index 2df603c4e..8cf297347 100755
--- a/.devcontainer/make_devcontainers.sh
+++ b/.devcontainer/make_devcontainers.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# This script parses the CI matrix.yaml file and generates a devcontainer.json file for each unique combination of
# CUDA version, compiler name/version, and Ubuntu version. The devcontainer.json files are written to the
diff --git a/.devcontainer/verify_devcontainer.sh b/.devcontainer/verify_devcontainer.sh
index 439be1b5a..9a5ca7cf4 100755
--- a/.devcontainer/verify_devcontainer.sh
+++ b/.devcontainer/verify_devcontainer.sh
@@ -1,4 +1,6 @@
#!/bin/bash
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
function usage {
echo "Usage: $0"
diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml
index d2be5c900..cbed4fee7 100644
--- a/.github/ISSUE_TEMPLATE/config.yml
+++ b/.github/ISSUE_TEMPLATE/config.yml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
blank_issues_enabled: true
contact_links:
- name: Question
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
index a96f6afb6..5f1ddbc1d 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
name: Enhancement
description: Suggest an idea to improve cuCollections
title: '[ENHANCEMENT]: '
diff --git a/.github/actions/compute-matrix/action.yml b/.github/actions/compute-matrix/action.yml
index fbbe49b54..69803205b 100644
--- a/.github/actions/compute-matrix/action.yml
+++ b/.github/actions/compute-matrix/action.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
name: Compute Matrix
description: "Compute the matrix for a given matrix type from the specified matrix file"
diff --git a/.github/actions/compute-matrix/compute-matrix.sh b/.github/actions/compute-matrix/compute-matrix.sh
index db79721d1..b58f10a70 100755
--- a/.github/actions/compute-matrix/compute-matrix.sh
+++ b/.github/actions/compute-matrix/compute-matrix.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
set -euo pipefail
diff --git a/.github/actions/configure_cccl_sccache/action.yml b/.github/actions/configure_cccl_sccache/action.yml
index 458669688..62521fb2c 100644
--- a/.github/actions/configure_cccl_sccache/action.yml
+++ b/.github/actions/configure_cccl_sccache/action.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
name: Set up AWS credentials and environment variables for sccache
description: "Set up AWS credentials and environment variables for sccache"
diff --git a/.github/copy-pr-bot.yaml b/.github/copy-pr-bot.yaml
index 895ba83ee..214845ccc 100644
--- a/.github/copy-pr-bot.yaml
+++ b/.github/copy-pr-bot.yaml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
# Configuration file for `copy-pr-bot` GitHub App
# https://docs.gha-runners.nvidia.com/apps/copy-pr-bot/
diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml
index 046cb9cfa..ad79a8c35 100644
--- a/.github/workflows/build-and-test.yml
+++ b/.github/workflows/build-and-test.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
name: build and test
@@ -47,8 +35,8 @@ jobs:
uses: ./.github/workflows/run-as-coder.yml
with:
name: Test ${{inputs.test_name}}
- runner: linux-${{inputs.cpu}}-gpu-v100-latest-1
+ runner: linux-${{inputs.cpu}}-gpu-h100-latest-1
image: ${{inputs.container_image}}
command: |
nvidia-smi
- ${{ inputs.test_script }}
\ No newline at end of file
+ ${{ inputs.test_script }}
diff --git a/.github/workflows/dispatch-build-and-test.yml b/.github/workflows/dispatch-build-and-test.yml
index b37da8ec7..18c3d0858 100644
--- a/.github/workflows/dispatch-build-and-test.yml
+++ b/.github/workflows/dispatch-build-and-test.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
name: Dispatch build and test
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
index 4b6b5aba1..8e009d425 100644
--- a/.github/workflows/pr.yml
+++ b/.github/workflows/pr.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# This is the main workflow that runs on every PR and push to main
name: pr
diff --git a/.github/workflows/run-as-coder.yml b/.github/workflows/run-as-coder.yml
index 573ef134a..e1ce95f03 100644
--- a/.github/workflows/run-as-coder.yml
+++ b/.github/workflows/run-as-coder.yml
@@ -1,17 +1,5 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
name: Run as coder user
diff --git a/.github/workflows/verify-devcontainers.yml b/.github/workflows/verify-devcontainers.yml
index 2ba13a8a9..c3c930cfd 100644
--- a/.github/workflows/verify-devcontainers.yml
+++ b/.github/workflows/verify-devcontainers.yml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
name: Verify devcontainers
on:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 229963b86..d670586f0 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,3 +1,6 @@
+# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+
ci:
autofix_commit_msg: |
[pre-commit.ci] auto code formatting
@@ -15,6 +18,17 @@ repos:
- id: clang-format
types_or: [c, c++, cuda]
args: ['-fallback-style=none', '-style=file', '-i']
+ - repo: https://github.com/rapidsai/pre-commit-hooks
+ rev: v1.6.0
+ hooks:
+ - id: verify-copyright
+ args: [--fix, --spdx]
+ exclude: ^[.]github/ISSUE_TEMPLATE/bug_report[.]yml$
+ files: |
+ (?x)
+ [.](cmake|cpp|cu|cuh|h|hpp|inl|sh|py|yaml|yml)$|
+ CMakeLists[.]txt$|
+ ^include/cuco/detail/__config$
- repo: local
hooks:
- id: check-doxygen
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 1a068b424..7f9886e12 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,24 +1,15 @@
#=============================================================================
-# Copyright (c) 2018-2025, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
#=============================================================================
cmake_minimum_required(VERSION 3.23.1 FATAL_ERROR)
-set(rapids-cmake-version 25.12)
+set(rapids-cmake-branch "main")
if(NOT EXISTS ${CMAKE_CURRENT_BINARY_DIR}/CUCO_RAPIDS.cmake)
file(DOWNLOAD
- https://raw.githubusercontent.com/rapidsai/rapids-cmake/release/${rapids-cmake-version}/RAPIDS.cmake
+ https://raw.githubusercontent.com/rapidsai/rapids-cmake/${rapids-cmake-branch}/RAPIDS.cmake
${CMAKE_CURRENT_BINARY_DIR}/CUCO_RAPIDS.cmake)
endif()
include(${CMAKE_CURRENT_BINARY_DIR}/CUCO_RAPIDS.cmake)
@@ -91,7 +82,7 @@ target_compile_features(cuco INTERFACE cxx_std_17 cuda_std_17)
###################################################################################################
# - Optionally download RoaringFormatSpec test data -----------------------------------------------
-option(CUCO_DOWNLOAD_ROARING_TESTDATA "Download RoaringFormatSpec test data" ON)
+option(CUCO_DOWNLOAD_ROARING_TESTDATA "Download RoaringFormatSpec test data" ${default_build_option_state})
include(${CMAKE_CURRENT_LIST_DIR}/cmake/roaring_testdata.cmake)
###################################################################################################
diff --git a/README.md b/README.md
index 0357c97e8..fa5885281 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,5 @@
# cuCollections
-
-
`cuCollections` (`cuco`) is an open-source, header-only library of GPU-accelerated, concurrent data structures.
Similar to how [Thrust](https://github.com/thrust/thrust) and [CUB](https://github.com/thrust/cub) provide STL-like, GPU-accelerated algorithms and primitives, `cuCollections` provides STL-like concurrent data structures. `cuCollections` is not a one-to-one, drop-in replacement for STL data structures like `std::unordered_map`. Instead, it provides functionally similar data structures optimized for efficient use with GPUs.
@@ -212,37 +207,37 @@ We plan to add many GPU-accelerated, concurrent data structures to `cuCollection
`cuco::static_set` is a fixed-size container that stores unique elements in no particular order. See the Doxygen documentation in `static_set.cuh` for more detailed information.
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJx9VgtvIjcQ_ivTraqSu-UVKTqJPFSapCq6EzmF3J1OpSLGa1grxqZ-wFHEf--MvcvjHk0kYD3jmW9mvs_rbeaEc9Jol_X-2mayyHrdPFNMzwObi6yX8VCwLM-cCZbTc_vVWMMruDXLjZXz0kODn8F55_y8iR8XOQw_Du4Gfbh9eHz_8Nh_GjwMW7QhbnonudBOFBB0ISz4UkB_yTh-VZYcPgpLaOC81YEGOYyzyjbOzi5jlI0JsGAb0MZDcALDSAczqQSIL1wsPUgN3CyWSjLNBaylL2OqKk6EA5-rIGbqGfoz3LHEp9mxJzC_h05_pffLXru9Xq9bLMJuGTtvq-Ts2u8Gt_fD0X0Toe-3fdAK2wtW_BOkxcKnG2BLRMbZFPEqtgZjgc2tQJs3hHxtpZd6noMzM79mVsQ4hXTeymnwJ82rcWL9xw7YPqaxcf0RDEbjDH7vjwajPMb5NHj68-HDE3zqPz72h0-D-xE8POKwhncDGhU-_QH94Wd4Oxje5SCwdZhKfFlaqgKhSmqrKFIPR0KcwJiZBMstBZczyaGmEczNSliNZcFS2IVMhEOQRYyj5EJ65uPaN8XFVO2xHuufpeYqFAKueOCm7WgLnzjhWzyUN197FAw9ivYsaE6Rmbo5tvvSBufbhVhhlslKcG9sq_yeizJznJb6vtHhXAWSrPV1fmlwHIItTjbFOl30bL9K_Pgt8rZE78k0qJeJ-MKwwwIrSuaplWIGd2KBvfGWeYEdctTRiqmHJuC8KQKOm6JB__3AHYT3hK5kjcuApEKOqA3SbWUSE2fWLGLAuBkHE50CaZWmWhiancHhVWNS8kXAs8T5WP-MxIhZnrnRpCb3HCkIhApxvojNAQpOUmqP0pO6sTKyOBvrLa5jKsrwVmzgGmH5S2oSQLsN94ul34BTxifgVhAZhfZJTfTbrvD3OKNFqYXCFqyYCsK1qG7kZXoCV5qgcBN2TSicOG5ygZdVHl8yTx3Ac0UgWcFwHiwJEo8b-l4GDwXzjCqJODmNhKQBgiBOsMxJDQGLaHYPNQzDYkohUy9I6AgiNU-QBHCMRa_n5L9i4o_i6rCYxA3XcNH5tdPpHCLe4vmGWgdOB5HEBk2Zq5SPvr-AMgwnx4jWtIMFzHkITNZJsmLsTuvi8rsgDtGvk5ELqRp7VO3jOGfH2IirgdPAIgfiCYzdVYJh0Oc66nM11TT6ZheYixSM7UydqvsZm06qR4B7xl_hFG4owbaOmFc--4Fsvx3NbneEFCWKTSSUScf7EW07OXRzOM-h1cpB7mhD0nyvd3JoJBC0Z9-Y-Jrae9ehG1EGUzFH4p_lSRRCF_S7c9S8QWQFdk6phATFYJIymSup2jgqPPQSf34Y9ijmCHHSmUFKRr0E5X9cztQYdYOeeA6fFFR3rBT8BeTsgI80WekeCYh6icfSAWZ9JvxP_TFbbTpKhncBOdskZe7zlWyFZ5kQOm0jV8JcMRbdIuRJNCJv6yrJYGaNk1R15goGvTOIX0h0WRBb_Ga7q-FgyY3T4GewrVRh8Gi4usITaBQ4xxflT_BHzF5jbo0xRnYJuxTKCh-sBlIzruDdii4r-BqwhytYplecd88vQhfNZunT_SxrYr5r_vp19w00meXltVtM3nSg2URVe_zwWIkomootpvHSpuT0KCbnXOHiKt2wcAFFql-yXV7bUTsndmRGtvs7_v8HAzB-mg==))
-- [Device-ref APIs for individual operations](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJztWG1v4zYS_itTFcU5G_klQfdaeJPgfMkWNVokRZJtUdSFSlO0xYssqiJlxw3y3-8ZUrLsTbZov9ynS4DEEofPPPPCmaGfIqus1aaw0fiXp0in0fgkjnJRLGuxVNE4knUqojiypq4kPw_fzAp6Q5em3FZ6mTnqySM6HZ2e9vHnbUzXP06vphO6vLn94eZ2cj-9uR7wBr_pey1VYVVKdZGqilymaFIKiX_NSkw_qorZ0OlgRD0WmEXN2iw6eudRtqamldhSYRzVVgFGW1roXJF6lKp0pAuSZlXmWhRS0Ua7zKtqcDwd-rkBMXMnIC-wo8TTYl-ShNtR55_MuXI8HG42m4HwtAemWg7zIGyH308v31_fve-D-m7bhyKHe6lSv9e6guHzLYkSzKSYg28uNmQqEstKYc0ZZr6ptNPFMiZrFm4jKuVxUm1dpee1O3BeyxP27wvAfaKA4yZ3NL2bRfTvyd30LvY4P03vv735cE8_TW5vJ9f30_d3dHOLYF1fTTlUePqGJtc_03fT66uYFFwHVeqxrNgKUNXsVpUGH94pdUBjYQItWyqpF1pSm0a0NGtVFTCLSlWtdEg4kEw9Tq5X2gnn370wzqsazopZ8bkuZF6nis5kLc3Q8haZWOUGss4uPpZIBSTS4aIuJCOL_GJ_3WVVbd0wVWtoSdZKOlMNstdEcrNEtPLXFy3iqpBkgxf6jYGlILhWybIydWlfioBeqhYHsNogikqsvOjwTcihf_ncbqhWaqEqVpmoR4FgKBgfpOaVVgu6Uiu40UG1gjMtO79J6s5fDVbfauic_DC13QndEyors4YAwoSTVvTNxsdvp582mZYZSWTaXPE5bBLYwWzp_KnziKxamoJPGQK7qMzKryHTAwsspntBHg6BYVXloJZZgPyD2loGNniVCZv597VlNqbg_TtXk3e1z0OF80lO2IcZGMFP8Aeiti1VIVYKmetu1SKm3YtpUdZuytyRCPB-kixzMxd5ktDa6JQkom1WyX5YA81egGJO8SGK541j7NLx2Oo_VOKoOJoVTzCVWKdFCQH7JZ3Ty2x5x74gdpx1fPxI1LBfLhNGwo6gdTxu3jTiXshxtgBzOR7zxzQpReU0n4GzRjoOixkyLU3muZEPF73wRttk_3Xv6KhBhvv_-SUs8IQoB9-E603Kmpb4f6VXg0dE228LD0PqyHUAOn2kw59z6u3taiCm6SMejimw8U9HB4iMiQyEqT2GPINvybuWOBSDJjjsgJje9HwKHbNybxFL8a7j831T_MLzrHhm9L-dNHvvb2r3F7PJHwv793Io_ggf6Y6i-f_M-h9k1tyYvCEKe9qqlkKR70JtOP8s6xbklweNMypRwBd0fk4jaAmh_AUbfgXmvop3nJh_IW3hDIw1uuhxnrU5EWrld2rLoIVrbESlfb8q3ZZsbhyqfKVQ3LnRq8KFSYU_V2t8nkX8EjxyTBNrkdfKDug-w3LzRDYzdZ5yJ7AqRzfFJlvLrNHjMuG4EWBmUxgEyEhZVzzsYJTj_8hmSoUT3AY8zy47FVNM4MmkpQAj-iedDdf1as6QTZ9AmoJEOP6Kx4uDw9PhFvUq8RvO6e3oH6PRqEO8xOyIOQqtDedIw0FzYZupCrJfwPcipYXgkWF3NDpgXk3CKrBHg7fvXiXRoZ-HRal03tuxGu7jHO1z4-ZeSw5Y1wz9iAsX50oAeRa12IhWCG7IgP4JCesbsvcqO4xar3rX81wFmrsZ4AyxuGANTy1i3MjswvL0MkDPz3t8keVwJffyMCntAvU0iukkptOYBoOYtE_vMFWNxwdjWSDBe3buCaeplW6h_XkbzNUS6X8U-x0DVaT8ebTnwmkYL9gNC13BX5nIF-2Q1M0afmRSzgevayivqGiecND3onf6ukKrEPx0p9ELh9iIpinQ5YerCRaqLiafmDzOzs5OTr-GE0-_vri46HW9DyNaL0QpCP450fhTtO_gex4feZpCJahz9-kQcWG8CNXrIEhtFmRKPnDtE3kejOZqU5gNdTUU1aBx-YCujVOhaGwUlcJysneDp18QOdfPLZ-BXZFR9Ftbg3-j4C5M9bso0FJhBBV53LjcbQxfaVbGV74W3cz_o_h4tSnADb2bX3HBakdbBhW4dy38TtdOq61ey7tQ5ngt3_IVja82C2_rXGVirTtu93yDTQ3qKN9p-YIIw4BK4CnDHYvJhqxgSS_Hd6pclIdZEsz_KDcOs6IV-igvukSIQyTbhb1A4nauF9s2Ak0sYYuCSaoI21h0r1FCzIMmfhHVrs0gXjCL3oGqVnNzbPkWx_UI5RGNDtXFbZ-ed4MDWukhOHfQUEsNwnR2hkp4V0uJq-tn9I3X3nIezIAR-abKUJVydVUQ9wC8ieKIvz5Al666L0WiYi3lyenb-gTLpnThG5OoD33n8vj45Cvqi0pm53aVfDWifh-9wOGPgyUq7ediNfdfo-R6vocppczxch2-88ALlPbiIXqO23XE62Adpy56_tX__hezoiBz))
-- [One single storage for multiple sets](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_subsets_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzNWQtvGkkS_iu9nHTCNgbjXC5ZbKP12U4ObWTnYmdXq3U028w00Od5sN09YBbx3--rfgzDI1Fy2pOOCBNmqquqv_rq0cOyoYXWssh1o_frsiGTRq_baqQ8H5d8LBq9RlwmvNFq6KJUMX3vHD7m7JBdFdOFkuOJYc34gJ2enL44xp-XLXb70-B6cMmu7j68v_tw-TC4u23TArvonYxFrkXCyjwRipmJYJdTHuPD32mxn4Qib9hp-4Q1SeCx4e89Ng7OrJZFUbKML1heGFZqATVSs5FMBRPPsZgaJnMWF9k0lTyPBZtLM7GmvB7rDvvFKymGhkOeY8UU30Z1ScZN5Tq9JsZMe53OfD5vc-t2u1DjTuqEdefd4Orm9v7mGK5Xyz7mKeBlSvxeSoWNDxeMT-FZzIfwN-VzVijGx0rgninI87mSRubjFtPFyMy5ElZPIrVRcliaDfCCn9h_XQDw8RzAXd6zwf1jg_3j8n5w37J6fh48_PPu4wP7-fLDh8vbh8HNPbv7gGDdXg8oVPj2hl3e_sJ-HNxet5gAdDAlnqeKdgFXJcEqEofhvRAbbowK55aeiliOZMwCjdi4mAmVY1tsKlQmHeHgZGL1pDKThht7bWdz1lTnMX_M_yLzOC0Twc7jMi46mpbEkRYmUmLUjstJf1sq4ZBKOlwpvujvvTUq85gM83TjvpmoUptOImZwIpqJ2BSqPdkngqCWsdh_T8c8b-94VRTAAK7PRDRWRTnVOyI8HRdgwSTb9Bn-JmK0cU0WiLrgm4J5mQklY6u0c-h4-IPND78fXQ6Bmo7EM0c4BaBzMkMlxYhdiwyBMHBRaDYp5sRLSrMiF2xYpk8Ma5kGIBRY3IvhgBEsK1MjoY157RRdijZIkVn1Mk_kTCYlT5lHgOI9k9y7dawlvEco2eX7gV4XjYcC8gYU-QNG4JtawB3YBj0t0XiaLth8InLo4SlxzGY8SAv6AGWWcMMZpIrY2rSOBW-thQnXE3K5hTIwVRyEiOGkLtLSyst8VqQzgCGAVrEgC5xpfKQBEA8G8X8scrs3CHkgXK48UJESxPTcAksMzynraZEWU64siG5_W87SvqoLJC9QfFCwcipdQrWtcmsFhGND1K14IsXMlZuSPLXmUirXc2GLdl7kx8XcZiQhbhZTsUb8B1RW4T12FKEKQ4aTihvkyrRU0wKVD9RIF202MCRGVVnmRiCPbUnTlkIwn4GrVr0nBc8Nm6MCQyYprEQwVvF_nfu8JKaRbSpGLB5HmvhArwv2-gwfnU7nnKHvfLzGn3WOsbeUY1TYX8MGqJposjgBrtQwCEgXpx0bwzJ-Qm2xdi5Yt7JxW2ZDlChohGxcKiWwEZ0WoLzTamG3mp3BHc23bP2C5pOzHc0iFRnUatcTtFDGEuH3UqgFweGC-iQWEUUOSoB40PKjWNh4BqmpKob4jDQaVib8AgDLqIr2esgYwVXkpc49stQt9r_cKhQijhSKKHWiUETPg0P9fnDmgawRU1WRanb1lo0Vz8uUI7yLz5r46pc1YeuM8565PbKm29SfZCAon7V1G1QtqXPTvnHtABW203G7RNhsNajlqi8MIRL-a4iZQzLQzN2rIGzV-dc_c3be7c_gUH9CJm_bw_Vgkz5yDojqvvR6QeIsLK2WhFdwd7Prrt39VqypA_d6LkFATeRr5NrAf6kJzbHXw5TF08gUayJ-s7Y92fLNOrZxr7LhHp1zHSQX03tX82yT2pvtkQcmiuoFcL1pO93UeHPbd8ou2LLbYi9aDEP5qxb7vsW6-N7FhS6udHGp-_3KE-smm5qFL2IYOeEkTXyoQK6Y0f8V9ZPHBl1EcqUYK2c8LYWm7oPb_huV-zJNqAlpFLGYFOgynjgzZsINVXrM7mhPqHQx6icNvRjp6XNaGus76n5V29Z7FuRkRDeCE9jjcfdsY85xM8zAoghvauCiRBbVcFI1xto4xuw4VnXBG6rgu53EjTuaSWhB_nmNNmDSW_3t9re65VpjpTafMZ88mr0vqFMqijv1PxtJqiNeZzH8NxDUvglG0TgthuB3xGaFDNaagWSHlVoUpSVRlvJc45wCDMeUvzuDp0WOsXV3YoamRIiOkZr4bxLBYSNtbQ-Nwd10eTtEpXvqN90VqaP65eaBPa6B-OwtDYxuS00MEVdvD2gYFM9bxmXyDNtNu_paZu1nIGa_DJJnfDny7dR-O2CdMATUd6H4PJQmSsQLdtiswD4iA84nK-vwq8Qv6ovbSqAKJJFDrFC66aqfW3PgTWJrjmg24tSzDSZayzN7DMJ-7SiKtucW0iIao5qQYRIm0folQ-PHx9HRAVu6SrPpWdsHmgLSsoT6VX5y-1g95qs97L9MU68D2We57-fCUVG6I9eXCK6EDYcqQb1tlhNQQ67dGdPu0bceS2wBLq9PdUhwHAKRKfyL7vyPsmOE8P3f58YW-f9U9n-R-4TOtzGfVtR4_0FojH84D2DcpzIqR4h79fxkM9r-UBDIx6JIT9BkEoSK8kBZVdY3aGnWtskukCHICi_i8mXlVSwwc7p5vhn8-orUguv_ora6maAb_jrBWmis49BYB61t-bUnJT06caES2s4uGpgcwX2Rr_GAMVNkMr5Tzb-6nbbYoTP63cVOwn9u85_BrvJp4JzxUCImGt6n7KS1Jz9pBKiSkzndIQY-JFMFoEfNx8Z9GcdC6-_YG-vxhrJwjGk_wsfGgQ9eqFoUqQwn2GZISni5PgKFTo0woFS4rptsJo2dCvIyo0PU30OzuVkf6ewDvglHZeMskaORsEc1ehYntB1MkD97NLrFNru0OynRSFdNWva_dDNCnGC9vzwFiPX3i63337beLzfeq3oKY4qSSTDtrLqnT3Wz_aZjQ0247Ue0JhzaSAe3op4RkDhjR0eyIkddDT3iQFWMhhxVys_6Mddm03wYiF1pyPiTiJwS8YyDvznfN0TvTsXNOtBE8YOK5PTxuc2DHCNiBm0VhQ0z7UmtMGFuHclnxDCzz6aKDDOlCEvslGYKw1NCIRCNpt7KoMfLn-sjbdl1crbGsyZUA7WOIf1FhDYwrus7uqiLY-O-cHgnf5W0q0_2xFUtqgNDg_S-PVBS26MnqO3mbEZhDEW5woBYvN3bSF8EfZHTdBGk25YINXyv3NO-_Q_ASu0fcaMI-PytDOn1Idcye3389BBt-dDy7KKTTuTP1GBCdbJbrlrVKYgegRKvlnTh3n01y7xM06lRq9Uq1IZBjn4N6P_wD-CCP9VPBGMMABh2whmHSLF2G4NYWN7cPYsEjOq0rahezR9rIP1j0xpMX-LXTtLunO1rF5ab9GptbIIKfPMAFKvo9mnlCRic3KwCIdmDpaWLS4VALSS7qCBIy9q75uRqI9ndE3N6rlR74l7Dr2q8uhpqdqfw2pnLdkR79fz8nI69p6_7_X5zrcbj0B4LUzupvJHbLSwoo37_tapIXglTqtxWDmyx0WpQKcK4oNa_szXyWRx3T1-WXdymR9z2R7jGMShwER8ddV-xY67iyYXOolcn7PgYzckc2wqbiOQ45dnQ_jKXymFNZxzHKS7O3M9ouIBBPn9qrFrhPoK3cR-IN1af7L__ALzCdP8=))
-- [Using shared memory as storage](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/shared_memory_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVWA1vGzcS_SvEHgrIqSzZwRUtFNk41fbhhOTsg-0kKKpiTXEpiefVUuVypaiG__u9GXK1K9nppQ7iRPyYGb55fDPUU1LqsjS2KJPBr0-JyZLBaTfJZTGv5Fwng0RVmUy6SWkrp-hz_82kEG_EhV1tnZkvvOioI_H25O3fj_Hrh664_jS-HI_Exc3tf25uR_fjm-sebeBNH4zSRakzURWZdsIvtBitpMI_caYrPmlH0Yi3vRPRoQWTJM5NkqN3bGVrK7GUW1FYL6pSw4wpxczkWugvSq-8MIVQdrnKjSyUFhvjF-wq2uFwxC_RiJ16ifUSO1b4NGuvFNLvQqefhferQb-_2Wx6ksPuWTfv52Fx2f8wvri6vrs6Rui7bR-LHPAKp3-vjMPBp1shV4hMySnizeVGWCfk3GnMeUuRb5zxpph3RWlnfiOdZjuZKb0z08rvgVfHifO3FwA-WQC40Z0Y300S8fPobnzXZTufx_f_uvl4Lz6Pbm9H1_fjqztxc4tkXV-OKVX49E8xuv5FvB9fX3aFBnRwpb-sHJ0CoRqCVWcBwzut98KY2RBWudLKzIwSNY3E3K61K3AssdJuaQLhEGTGdnKzNF56HntxOHbVnxST4m-mUHmVaTFUlbL9kraotNS-p6rF-eGKTGJF1p9VhSLLMj9cYS1igYm1TufOVquyF4z034TU_YMpVS6Qgixd6qV121R_kQBAw2FYMnVGz8QlJgvAL73GAUo6cCRSEyOlNtgSwVZzLq9hE3sRUy4B8532t3qGWNJ0ntupzNNUrK3JsB9byVj6CDR13vHblS7kUsctg4H-4nXhUxoXa5mbLA0jlPz_90OgwsJy5bewvx2-MI5BtnwudosQTAG26vxoUjyRj35ffAYRjCu9kHluFZ2LkWifHbhYRzDVjHnAoR560cA9AxcWgNl0lZ0h1QCoysLfvLJVKaaVetS-pNEyt77sxu2bhVELdr5h-2utYMz8AQO5lVnJbtI0JjYVL84J4CodMGTDv7aR7PFs5-i3d5Q6dniNma7YaAoOLKiU5zNJ5SuZ705ip_9FIGLm7JKnHe6-dE4yEYSscPvrpWe7UOJI6vSMA-rsJTWEx6rIceDAFAXuvkEgEkjt0Nctz9Foyy9ma5-dl7ntiqfn5m_cfdScn_KlKuewHPadlpC5XNlH0RcX96PGDcODKase4e7l_RsMSMnTYCLldZ2Wm3EBYcTx_9A7_GrAqpKkBSmP_ku6bbSIjXAEJBNmZ6HDEzvk7raFWjhb1LZDjAh5KR-BV-VAxHov65RYSCo5hSkXQQyjpxKGOgfQMLfr9GcWEkGFC6yOpUkWW9GolPHbXnOFFnKtKQ5oS1GCzEthSEkwImsX0bBfSI9IVyvrcCfoELVN4kRB9aXDoNCNkhDrB3BEO_9w1CQojBDZkB8CzOmpKbI0JMq6shM0IqxrHfMKxbBOfZhEBjiMMJSFmCMT2eFX1SXSBB8RREA1MgIYBEJEtjO3cWoz45ZgI4l_llsClPN5WlI6LVcw_CpQFtFf0Moa1dA86DYVa1BRrkgsgo5TexHB7ArT071uPGVHoU4j0hBUA18vTsepr7BMebnPMSJw2CliQFQROdo_49q-CNUwoD0Bh02oQwikZGGYkuaixqLnoLYnXBxWYFJWDJUPu7MyDxWg9zUsEkTagL7Fsd1wNY_km8oytB1sqcHh4YCWLSfoVGAIilzMtYvmm3WRm3VFuBh9uhrdD4gatdBQ7pCcPWfoJxoXYciEjgLwUfOlgaWx7lCS2ltAulYev3IB6g2t5F7UcFMSX8DN9JiJTrj5jbde_YGpciSeBEpd4WedSXJ1e3tzOxDvcQ--y1gygiV4TCLpxPOkeKYIsAU0MkWH2oS6FIfcvud7hAX7ojRJWOfRHNYqT1BJNKo4-xpYcZnb61vxAOD2Ty-xg7nZ2ykzAcZ8cNiCPlSvA69gMxjCfz7-zOsP2wwEeB7yQG3mK63F0_Hpc83yzyaDYiLvh0VdZJXj9tJZZGx-kGG2HPqFoApn4rQ2edFcfsF1SNCKV_bXihL2xt3_xr1cVktRVMspdKbuRer6U6sd3X5uBQ_6oIhvEGy2DpdT1i90PdR_erOkVs4ZejDUtiKG3AUMDXUCpycnJ-eEMhkE5DqIwEMTPnFE0bMFFYbOgA3vHhqetDvHs685qDG75AvFQUfARQm9WYYAg8E4kYaJfcM5dkuXxiXDiGw3zuK6yir3KWrsIq3FiHly3gAPacqaKKiDYQ9zpDFAv5IO5cXjOSnkFHreCo066L14mjad3HxLs4yfFmLfuIMeJdTkcDUr8eDUocv5S9vxqEFmfkdrmXrLqHzj9lcS8s2OWfTgPo09vXV_xXMNMjdrw9Y9PD9_Ub5INfECpNtIWWzVGsilhvTjRc-5a9rZmPvm-YBrYMKV4pUbzdUiXsnwdKLLsXFyRZJHjeTereS2XEjSw4eGGg8HDKp7crBo18zUzBoM6tlhi7MXwIEk1JaabDeaQaeEaq7RYHJ5cNByetmEiHe3lqV075hNj2eo-aVOgntj8EOX9FXAbm-HLvARl0godOWC6QKw45XumhrMD4zI7ddUtP0AEWch_yG_1Mek7enha4z7MzJ0Wlfq6blVXD9InHPRTl_onAUlg0SyfnXsuv2Dl_KwnbDz4XB4CkV7-9M5fO6_qF552b4LVSuTl6hqSre6OO6-UICTbhLl2jXfoiXFWqnTtz9Up5i2Kx--YkuOcX_P1Pffn_4ojqVTi7Nymf54Io6Pga4_5jAynR3ncjnl791yM23ZVErlGFyHL8kwgOdm8Zg8d-t5gLs3n-l18vwb__kfZVnMsw==))
-- [Using set as mapping table to handle large keys or indeterministic sentinels](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/mapping_table_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy1WQ1v20YS_SsDHe4iJZRkKck1UGyjOqdFjRb2IXZaFLYhr8iVRITkqsulFJ3g_35vZknqw3KdHnIOHIvk7OybmTcfS60buc7z2GR5Y3CzbsRRY9ALGonKpoWa6sagERaRagSN3BQ25Ovuy9uMXtKZma9sPJ05aoYt6h_13wR08ev5h_MhnV1-_Pflx-H1-eVFh2VF_pc41FmuIyqySFtyM03DuQrxp3wS0K_aMhDqd46oyQK3jfLZbaP1XrSsTEGpWlFmHBW5hpo4p0mcaNJfQj13FGcUmnSexCoLNS1jN5OtSj0Ch34vlZixU5BXWDHH1WRbkpSrofPPzLn5oNtdLpcdJbA7xk67iRfOu7-cn_1wcfVDG9DrZZ-yBJ4lq_8oYgvDxytScyAL1Rh4E7UkY0lNrcYzZxj50sYuzqYB5Wbilspq0RPFubPxuHA7zqtwwv5tAbhPZXDc8IrOr24b9K_h1flVIHp-O7_-6fLTNf02_PhxeHF9_sMVXX5EsC4-nHOocPUjDS9-p5_PLz4EpOE6bKW_zC1bAagxu1VH3odXWu_AmBgPK5_rMJ7EIVUMoqlZaJvBLJprm8aeawAZiZ4kTmOnnNx7ZJxs1b3NbrO_xVmYFJGm47AITTfnJeEo164TFrPTfYlIQSLqKmvV6vTgI1fME73zyM1skbtupBfYe7TQoTO2s686NvC0Vqnc7r70cf5e-JcitjBy5Di6I_1FwVsa6Go6fD-2sZ7QB53CVmeV0znNzJJDz0yeqXxGMIgUnEOJMZ-LOYmyipkG6RZnKqFIOVWrvWeH3PvlIp5TXoQzViOPBoONs-45jLt3AfseC-ZzYx3Ik6zoTfcdqOo0fdar3Af7mrNsEylSNgbpaaxDxdAPQLAamljSmRRkOENKgs7tYRa1r5ZqTs2z4VVLdBuwoow_cwibIhNybf2tJm79UWh4Lm8FTBrxxEzZiNODMqxc8FalBXlpQlsMqDj2zl9iyw5dG9KZeLUymndNlJ1q2TwPoEJzolqDNOf04tzkYKY6c5VBiQk_V7b6SuHZX-YtJRqwOvSTWeKDDXydqpUuTZFEkFGS-IqrmUCCK4AmldIV6RBMg3ejAplm6i1mqLlki8zFqUbhyh3T4zGqTeEdRlHMzlRJsgoOxYpDiCggWFHEuc6pCvZ4R0MsNEkSS2HGU5MUQoFUu5mJtuhRG1fWO9FrxXt4sIiRPgr8Bu5MJ1CuuFZHKIacB0VWcGvIE4MQohDy3hXLCclShK6wGtFjH1c6FioppP4pBqbtAhr8PdGeIp1BUco4AsRVjONXKgck2J526MI4XfpWEAnz4ICSdytxxoE9uVZNcAtlXc_UIkax8H4IUX7H9QacY776aqmMHARazrRHEWfzwomh5FZz0SvNS38RqkfaccXMPAZsHUcHkIA8lZsU92MwCBSMNgQQWLnUI6iPmFpbJQjGVTFlLnoKMDrpLXnBeb5CLBnETo3KRDnH0KJYCid8CSyrFrQ9qloD30_bEkjOttLjcGMZmA0xifNIKAIIh0ogSX3vVCo_CcT7du_el9DHnsrVRNdFS4VhyfV7VnbT7t3ds1CciaNrtWegkUkFF9OZ48I1CiSHmFtJwBRcafghENftHvaLMbzCC23hZ9ur2WKsct-4S2M3kfsesdU-fmVDYYRcsDYhZMfPCzs3XJG5-nXo3JW8gEanQVQBk0uzgRNTFA1RX5cbR0uMQ5CJfMyqzVQyBWI3SzeNuG56vpt9QvTaVSbUfmFVlcluaWpr_UrH_krpmi63vCEJUO7iNHYHOdGUcTNTKHTX6Li-DlC6GvlN1hCvr5rX2BEiL4UaLRrQiD-s-b8HWj-wrMdOG_RnMx1-RsgnNUpPuoipE2KLOjTwSmxrNnqulroOcNI_qfby5iazXFif6IkDMUCKnGsiVOovu5K2lPTT9ROiVqMiZvQCPtEvKgtkqtmzwS_o8p_RqJxuRt5XPNvR2JikbMLGNltNUOZ1f-QYb0DVBSC1_BrWI46HO7vegaBJQm9I-w4puao8FKFUWcT0syCptImHNJ5PosFgqt3x0WlTQnkDRHctOjl5UsCKgO_6m5896d5z6np_SV3_OXX9v6Tu9XPqXu-o40MRCbdr-stT3H94_1y6SnWaFFlYFX9fex-V2U19kubsSfjNctkX1jqZ_eXXZPMWm1UB9Ac4LGAPEveSx0TZyw86k9hiWigpvM3gp4vtV3FWEPwPcXKxNBcZnmCNYMRCV6ObYu7N6F5A3h-IxzXPE2XXFKE_j8fCYLaQrSrX_8Mvw5AuXhPTQoNx5fgYx8sbHC3x4bHZfpEXCuigVO-x1E5KHFjS_4olT4F6Xa29Obr7U1wbwd7d10PbrOp_rfrXpeDd3S1i32ASMAc4zqmKsyYHo_I7uHo92x0c6lmxPLVgcs2qM041bPAIyT1_rpPEE7zgD7yQY86a_Uj3M_TtFBnBeFyUKRRQiMNWIF0i2BaTPnccmQKTWkBvPv1yevq-xHueqinXe95WxNC-_iOAZ8WUTZEn24akxuoKNpoOj-244kabItXy2I-TpfpNQ3liJuaXPkxUmGANT90y0G8dKXy9EJbTTPKQTnyYxTR_9j-GZ07X-45Z93pFQC_UCxzp0Hkfu2Td6wTUx-9r_L7pPDwEuwQ6VPj_35r7fdY8flrzW2j8J36_w--7b4r5G2ieqCT_Gnc8vN8LrbDupIxwh6-avhD7Vz2Dwc67Hok3Rb7P-DW-NNc5qHAI3ctAlfkeIzdwuC6z5r7OTtKZKXBgF1CL8u3WcmaS6vBnVTbV5SacvNWri_K9yfCqzg89mcRhrKUZKH9YKpPeZPKmrMzoocD0eV3iqTJTDkdyYD6YOFgeijakEKqFPzj7c9LWIYl1bfbYDJJoLG41gndGtdoTavdKH27FhTWN5s7isXd3h_9rtjqokmWERJoPmlyadt9hrf0N_YV74bHwgUM7cqdrCfhL6j8E3p1jrgJvj_5OiVEReMRhfoJ_W0QU7ZUt68dWPcnh-qc6k6wrS59f4rdNoF_ZEb87QCSPe8FmIhJ6nq53rzcbPDzJ1Xz_HP22ntT34uLXjGTNyRNJUgf-dH0UEAD2kYDIP598_D7WH-ibW8o6Y41-0OT3d1s3cS5ttlrb7Ciy-I9C-_03P88jaXLcW_vZv6VthL2gh9FhXMOAtdAjnFmaWyIVxkdqsiLdCdSJ7xH8yp1f0x3SEezvXVm5N0MhTta_5fDzAm8lD-SFPnLRlTWiitegGhdIxtKmwIwB6eg9_oiC9_TqVdzaGnQ_lgb7t1mEzVnj_isHL-7nP1_7brZsuInvNiMs_ymH3iM_uTSCBvfuONF28x1SI1uEYa__tujhsZk7_wVTow0fnISvXvW-o7ay4ewkT0ffHVG7jRLi2pLUkY7aiUrH8q1TEo-3dIZhmODmwn9PhBvoOtnnxkNQPUcW7TwHZRoPd_Lvv3bzBxQ=))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJx9Vg1vIjcQ_SvTPbWFHAsLUu4k8qGi5CKhnpLoEp0qlWpjvANrxWtz_qChiP_esZeFzTVXRSLBM_PmzZsZO9vEorVCK5uM_9wmokjGw14imVp6tsRknHBfsKSXWO0ND98HJzMFJ_Bwf_1HeiMkXunVxohl6R7xxY3h8BU6vAujbDRK6eNDD26_Tq-nE7i6-3J_92XyOL27hV9gcnMz_TydPH566MNESoiRFgxaNGss-sdUnwVHZTGdFqicWAg0Y5isGC8xHfWz4DeYqZl6JxSXvkA4557rgXXMCZ5bdH3uy8vvPQpGHsVg4RV3JAGTl227K423blDgmnLna-ROm375lovUS8GZfNto8ZtHxbH_fX6hrTPIqldBUlTC2eg5OKml_m1BMkNJ3vncy-ccX1i1kkgV1ea5EbiAa6yoic4whxa8peaBXoArEY4iwCwJCLMkosHkfmqjxBHnkVyDNR4DMxSv5AaEWmvO5sRgYXQVAWMwU0V08hYLWGgDhRZqCXqFRCHME0jxjPAkqGvGPYE2McsT18oxOqQTBQwCK-L5jJsjFeqkUA4qcuustSi6M7Wlc0oVMvyOG7ggWu4siAQwGMCnauU2YKV2NXGDqzBCyhG1-eYwTlR-OBQKJUmwZtKj7Ye6Le6_gS21lxREqqGkjlOQ9bzc53Elc0GBDShcowHNuTdEBTY6_l55BwVzLFQSefLQEnxZGcBAMacy84YCFZEOjzXc-moeIGstwOlAohYPi-BDkzoeW_EP5q6Fq3yVx4ALOM1-zbLsiHilKyKEwBntiSCB5iz0Ksp-mv0MUjPqHAtjHSKYp5xH4GDNaythZ_3TszdJHNEvaiNHITsHVoM2TrfNLcyq56FhcQb-Fq4EUlciI9CnBvVp39W69ekQmI0jGOWslWr0jKKHrSeCh4k_py5chgTbBrG39zk0ZPvf1ux2Laa0oiRiYFnv8aFF26wHwx6MetDv90DsQkC98-Pxq0ujJhFiDsJ0z9reDXQnrsEclzT43V69FKiK8HfWEm8ap4KUoxszMqFl0PVmMluGamOr6NKr5-eHsC3MB-IZ7oywybQvXroflzPXWl6SpyeMdkGNYiXyZxCLI7-wk_u9pwGkfYnX0pFmcyf8T_0xW2NqJfuKRiw29WYe8pVsTXcZoqrDgmvgvJ9YcouU82ikuW2qDAa96LxK1WTe0whvRpgvGnQRXyK32e4aOlRy5zV4F7b7rdB0NZyf0w304DmnF_cnuInZG879GWEkZ7CroQw6bxSEbaYTen85LTM9A-b4TCdqzflwdOqHZNYrV7_hSUr5Lvj798OPkDLDywtb5R8zSFPaakcfjirBIpWsmseHXYp5C5NzLumQLrfwPwEd0JKq52TXa-y0O6_sNBnJ7q_48y9b4Nyb))
+- [Device-ref APIs for individual operations](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJztV21v2zYQ_is3DducRpYdY90K1w4WNCtgbGiLJisG1INGUyeLi0xqIuXEC_Lfd0e9uk2L7cs-rQWSiHd87nj38O54H1i0Vhltg_n7-0AlwfwsDHKht5XYYjAPZJWIIAysqUrJ35Mnaw1P4OrN5a_jlyrHF6Y4lGqbuWu8c3PoPmEkT2A2nc3G9OO7EF69W12uLuDF67dvXr-9uF69fgVfw8XLl6ufVxfXP15FcJHn4HdaKNFiucck6k39rCRqi-NVgtqpVGE5h4tCyAzHs2jKepO1XusvlZZ5lSAsZCXNxDrhlIwtukhW2fmHGokgjWSSVlo6CoHIz4dyl5WVdZME92Q73qN0poyyx1Rys1VS5I8LLf5ZoZYYfWTfmAJLcnCP8bY0VWE_ViH3EkyPYJWxrkSx86qTJ3U6fkgpFdC4WmKKJZuM8U7sihzp8LXWplSYwiXuKN-OTKOFylKewaTgMoQ-Xg3W2CqyefFmZX0uPMpAqSjNnhQsCNBGj82tVnoLnX24zZTMQAoNGyRLmIAzoLSjY0sHt8plHpFNS6OdUBpLSEuz8zKlGy9ImGDUJXkyIQxiiCOz7AU5f4MHy8CGljJhM79eWfbGaN7fhRp8qCE1JSDRB5ywN2vyiOJE8aCsHQrUYodwhe4tpiF0CytdVG7FvhMRKPpxvM3NRuRxDHujEpCUbbOLh2mt3RzVUOxTeIzi_Q4posl8btVfGDvQJ2t9T0cFtmmJ4eT9FpbwMVuecyyAA2cd3hUliIrOL7cxI9GO2up83qw06l7JMVsIczuf859JXIjSKb4Di0Y7rIUZMS2JN7mRN-ejekXZeLg8OjlpkCn8331LJ_AOQU7-xkQy5s-Sgq6SS7WL7ijbflv9MYHeuR5AJXdw_G8Jo8GuBmKV3NHHKdTe-K-TI0TGJAbSUUcMuaDYgg8tcCqiJjkcgBCejDyFTtm4PxFr8a7T5fAoXvCw1g-M_q9JM1h_Xbl_yCZ_Ley_41D4AT7RvdLJ_8z6D5i1MSZvHKXztFUtIUO-C7Xp_BzrUvDiqAlGKTTFApZLmJKVOpXvacNvhDk08ZyJ-Q9oS8GAHe0YMc9aTtS18ic8MKh2zRmp0v64K9wBbG6oL4sSqbgX3J6J_AlsDl2rhnXAi-RHvg5gL_IKbQTXGYmbL7CZqfKEO4HFnLopbbKVzBo7LhOOG8EBNO6pCxgpq5JcgYPxv4nNkAgnuA14P3t2IrsYUyTj1gU6xPisP8OrardhyKZPEE3Jifr6Y8I6w8vT4-pqF_sNS3g6_WY6nfaIL8yOHKILJOgeKQrQRnB3M5r6z9PpVxR7kUAqeGTorkYPzNK4lhL2NHr6_FEnevRlLZSo8lHn1WSIczL0jZt7JTlhfTPkhgoU4hwFIa-DFpuyVSe3ZsD4DIT1DdlHlQMGbVR96HmuIje7GWBBuThnC_ctYtjodGm5_zhBDw8Df4nlFEru5fWk1CXqfhrCWQizEKIoBOXpXU9V8_nRWFY7wXu68NS3qdVuof19iza4JfqfhH5HhDrhv6eDEK7q8YLDkKqS4pWJPG2HpH7W8CMTOp-8vqE8YqL5oos-yN7scYMWKflJZ9Er17kRTVOAF79cXpCg7HPyicljsViczZ5REGfPzs_PR33voxFtVGepVvy8o-Gn3L6i2PP4yNMUVYIqd59OERfG87p6HSWpZUGG8oZrn6B3gDfF1UabW-hrKFWDJuQRvDLEGV80bhEKYZns_eDpBSLn-nngO9AVGYTf2xr8O9Thoqm-ywJskUZQkYdNyN2tATrbzvjK16KbzR_I16ulADf0fn7dVN1oy6ACEpX6na6dVlu7lndRmWNZfqBiDhQcTP1ZN5iJvep9u6b2CImhOqoNHa0oaENGqEB--gOjd7ZmBWt6PUOlNBfFMUvq43_AjWNWtEof8KInQlhnshUMEvkOS5Ue2gw0uaSzIB0Jdb2NVQeNktQ8aOyFVO1aBrHApKMjU63l5tryK47rEZVH5d-G7nD_0A0O1EqPwbmD1rXUUJoWC6qEV5WU9Ab-Al56663P0ZowAt9UGapEV5UauAfQCr2IJbUA6tJl_3AO9F7Ks9nT6ozEpnD1qzoYk72lPD09-x7GopTZ0u7i76cwHlMvcPTD0UkwGedit_FP7VxtBphSypwWKY_8SqcFKu36JngIWznl60hOty54-M3__xvZnH50))
+- [One single storage for multiple sets](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/device_subsets_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzNWQtv28gR_itzKnCQbT0sp7nkZFs4I04C4QInjd2iQBzwVuRK2poidbukbJ2g_95v9kFRj6RJcQUqQ5K53J2Z_eabx1KrhpHGqDwzjf6nVUMljX6v1UhFNinFRDb6jbhMRKPVMHmpY77uHt9ndEy3H67_2X6jUvkqny-1mkyLO_lU9Km6pGZ8RGenZ8_a-PipRTf_GF4Pr-jV-48f3n-8uhu-v6Ef6erNm-G74dXd69sOXaUp2ZWGtDRSL2TS2ah6p2KZGdkeJjIr1FhJ3aeruYinsn3WOeV53fvsPvuLyuK0TCRdxGWcd00hChVHRhaRluNOXE4Hu7MSgVlJV2gtloODt8ZlFhdASKRb94upLk3RTeQCpkULGRe57kwPTdEyKWN5-J6JRdbZsyrP51LD9IWMJjov52ZvikgnuVbFdLZtM-xN5HhrTOWm0FJsT8zKmdQqtkK7x86lv4zhTvL7MeUIqJlIPonZPJWAzs0ZaSXHdC1nYEwBE6Whaf5IRU6lkZRnkkZl-kBYSwaAgEN8L4YBhaRZmRYK0shLJ5ElhJ2Ocz2z4lWWqIVKSpGSRwBqaKGEN6ttFKyHK-nqw9BYeth1dznmF2qm_oAS2KaXMAe6WyTNXMZKpOmSHqcygxyRqmxCj8CO5NMcpALKlIhCEGblsdVpDQvWWg1TYaZscosEzbUAIWIYafK0tPNVtsjTBcCQQCtfsgZBBl9pAMSDga3SRGZ2b5jkgXBEv5sqCEixjcwCW0wlZVImdpGRc6EtiG5_O8byvqoBni8RGxTnWSEUtHWscKsFhKORJNxWEjFGI8aKbWF1KQfgo7QBnOVZO3_M-BYjXizncoP4L1kOW5zFjiKEf1lxUnGDTZmXep4jxYAa6bJDw4KnYS0QK2SWQD_oYSyFoH4GrlrxnhQiK-hRLHlOktsZQVnF_04V-6JkprFu-FVTPIkM84Ffl_TyHF_dbveCkIP-fo2PTYzRW44xysf0EjpA1cSwxilwhSYLpPPTno5RGT8gt1g9l9SrdNyUs5HULBFz41JrJC0yaQ7KO6kWdivZKdyTfEObFySfnu9JlqmcQaw1VSE16sIS4fdS6iXD4Zz6IJcRew5CgHiQ8qtcWn-GWXOdj_AdGeTTmfQLACxxFu33ETFS6MjPuvDItnjCwZdbhUQkEEIRh04UkuhFMGgwCMbcsTZmqs5TQ6_e0kSLrEwF3Lv8oopvflkVNs8468ntkZpuU3-SgiB80TEdULUcgTi8b4wdIcN2u26XcJvNBrVY9YkheMJfBp85JAPN3L0Kwladf4Nzp-fd4QgO-SdE8q4-jAed_JUJQFS3pd8PM87D0mpJeAVzt6vuxtzvxZorcL_vAgTURLxGrgz8l5JQHPt9-TuqS1TkGyJ-t7QD0fLdMnZxr6LhFpVz4yTn01uX82yROhjtkQcmiuoJcLNp293UeHMzcMIuadVr0bMWPW_Rixb93KIernsY6GGkh6Hez2tPrNezebH0SUxoZtKc-zSkcZvMQs9G9w0eRHCl9w1aiLSUhqsPbvsrTvdlmnARMkhiMQswZTx1aoqpKDjTL1H6FpzpYuRPbJmWuf2el4W1HXm_ym2bPUs2MuIbwQjssd073-pzXA8ztCjCmhq4SJF51ZxUhbHWjpFtx6oq-Joz-H4lce2OIQUpiD8v0TpMea2_3fxW11wrrFzmZ-SDx9CHnCulZr9z_bOe5DziZeajfwFB44tgFE3SfAR-R7TIVdDWDCQ7rsQiKa2YshznBm00MJxw_O41nhY5ok11ooK7REydIDTxbxLB4ELZ3B4Kg7vp4naETPcwaLoRZaL6cPPo6Jylw-1vuWF0W2qiiXj19oibQfm0o1wlT9DdtKuv1azzBMTsxTB5wsWJL6f26oi6oQmo70KLx5CaOBAv6bhZgX3CCpxNdq7Dr5p-WV_c0RJZIIkcYrk2TZf93JojrxJbc0SzHueaXaCjtTxjd_J-bSuKsucW8iJuo5qYQwoqUfoVofDj6-TkiFYu02xb1vGOZoe0LKE-qc9uH-v7bH2A_XzacosQfZb7vi8c52WW_CeCa2ndoUtQb5flDNRIGIhFdbN79KXHEluCy7bvt-IR4HyWM1wQv2LO_yg6xnDf_31s7JD_T2X_V7nP6Hwf83lFjfcfpUH7h_MA2n1Oo2oMv1vvsKu2ve0PBYF8FEVmiiKTwFUcB9qKsrZBSrO2TbpEhCAq_BQXL2svYome0_XzzWDXN4QWTP8bl9XtAN2y102sucYaDol10DqWXwdC0qMT5zrh7eyjgc4R3JfZBg8oK_KZit_r5o9upy06dkp_uNwL-C9t_gvYVTYNnTEeSvjEwPqUTlsH4pNbgCo4yckOPvAumWsAPW7eN27LOJbG_EBvrMVbwsIxpnMPGxtH3nkha7GnZjjBNkNQwsrNEShUargBqcJV3WQ7aGxXkJUzPkT9FIrN682RDtKXwBuZTVCixmNpj2oaXaI0tjFB_ByQ6Bbb6DLupMQtXdVp2X_5ZgQ_QftgdQYQ6-9nO--_7ryfb73X9RBGF6WSoNppdU-f6moHTceG2uSOb9GaMGgrHNyKekRgxjmdnKiKHHUx_IgDWTEaCWQp3-vHwhTb6kND7FLDTDzIyAmRTzj4FxeHmuj9rrhZB5opflSRnL--tHmQY8zM4K0isaGnPa0lJvStY_UEH87ss6l8hp5ShiW2SyvyQqSMQiAad72VQo-XP9dHxrLr9HyDZ21SDdQ6hvwJD21hXJd3clmfjo37xOGN_KR4V5_tiataVAeGG-lDe-CgtkdPUNv12cRuDEm5woBZvFvbWF4EeZGTdBlmdywRavi-ck_7Dj8AK407L3AS8PFbKTKbQ65l9ub46SHasaHl2cUnncifqcGE6mS3WreqUxA_AmVerXjg1l0Wq6xM03mh1-t1yA3DDPUa0P_hH8AFe2wR4IEJGgA0O-GMw6TYmI1GLCxv7p9FAkZ12lZUr_qPDZD-sWkNpq_xay9o9872tYHVNr1aW5vgBN88AsUqun1eewIGI7ezQAj2oGnl_FIhUHPJPipw0qr2rhm53gp298ScnyvVnrjX8KsKr6mamv0uvHbmshXRjl5cXPCx9-zlYDBobsR4HDoTWdROKm_UbgkLwrjef6sonq9lUerMZg5ssdFqcCpCu6A3v8U0skUc986elz3c5kfc9oeaRhsUuIxPTnovqC10PL00s-jFKbXbKE5F22bYRCbtVMxG9tebVI1qMuM4TjGI5pt_-MEAGvnsobFuhftw3tZ9IN5Yf7Z__waeANMA))
+- [Using shared memory as storage](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/shared_memory_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVWItuGzcW_RViFl3IqSQ_sH1AkYXV2glgNJsUjrddoC5GFIeSuB6RKjkjRTX87z2Xj5mR7HRTGw6iIe-D5557eEePmZPOKaNdNvrlMVNFNjrvZyXXy5ovZTbKRF3wrJ85U1tBn09f3Wv2in388fq_g7eqlFdms7dquaru5KdqxJqPrCdO2MXZxT8G-OfbPnv_0831zZRdfbj98cPt9O7mw3v2dzZ9-_bm3c307s3HIZuWJfOWjlnppN3KYtiGeqeE1E4ObgqpK7VQ0o7YdMPFSg4uhme07_Re3-u_KS3KupBsLGphTl3FKyVyJ6uhqFeT4x0Fx47idFFrUQECXh7vMGYjLVxsZb60pt64YXBy-iqg8M8FEGBuxa0s8rVcG7vP5Se-3pQSAcOWuVVywa6xqF0FZ9Kx2gFbZhasWsG6yZEpHX2x4GvYnKuS8Alb5FRy59hHWd3KBXLJ82Vp5rzMc7Y1qoA9TMlZ_iCtlmWv2m-k5msZTUYjlAkQ5vScbXmpijw86SPY__shUOFhvan28L8fP3OOh97zhDWbkAwqhlRO7vUjxTg9ZT9LtlDWVYyXpRF0Lo9E9-zAxViCaWGsX53hULNhdHDngQsblGPCrDdWORgDVGEQb1mb2rF5LR4kCIWnrjSV60fz3UqJlQ--8_63UsCZ-h0OSsML58PkeSxszp6dE8DVMmDoHf_SRXLoV3snv76m0vmA77HSZztJyYEFtaj8mbioal42JzHz_yERtrBm7Zct3zFuLfdEYLyuTLP1skklPsmtXPiEegdFDemdvE554MCUBdcgG5gHpBr0ZSdydNqJi9UUs_e8tn32-NT-ReuT9vxUL1Fbi-3wbyUv2LwU5oGdsqu7aRvGw4MlIx4Q7nn_jUbVSrk8uMj9vl4nzI1WOFCJQjb4JcBqp_SSSh7jO-o22uSd-AxIJlTjoecXGuQ-7rVYWaOT75AjUl7zB-BVWxAx2XJSE7biDizXyq2CksVIDo56R9B4bqfyFwYSoU1FrJZspyowVe9Zq1Kq2g_bFlrxraQ8oC3agcxrpkhJ8ISnENFxteIVMt1sjEVP0CGST-KElmB_z4NCHcUd0gJHpK1mJ22BwhMiG-pDgFk5V7rIQ6GMdb2gEWFf55hvoNWp9GERFfBphEdFyDky0Qf8rLpEmuAjkgioRkYAg0CIyHbPbZxaLdje1GzHiX8GZEDvMbHMHZXTIKjXGM2Mln2_M6FKOymnDhUTqFtpSSyCjgOyBGafqaEc9uMpe2LZp0xDUi18w7gclz7DMlHxQ44RgYMliwkBipDtn3HtUIQSDLg9wWEV7iEk4rwwzElza10wvuSgQ2gcr8CkrHjkZs1ZPQ8FoK8SLBxE2oG-emB2miwj-ebcy3PouVmLw-yIlp0g87qCIyiyXkob3bf7IjfTjXA1_enN9G5E1EhCQ7VDcQ6CcZyrCREeoXQ4rQR8SHAugaUy9liSuiYgXaeOn2mAZNAp7lWCm4r4DG5PjwXrhc5vow3TB0-VE_bIcNXpatG7z97c3n64HbEf0AdfFV4ygidEzCLp2NO9fqIMYAIaKd2jMSFdxaG2P_g-woZDUbrPvM7fZyypPEHFm-mM-WsOH3-rFd3b8z3DkMgUTT9rWHhuDhtlJsA8HyxMKgxF28Ar-AyO8J___MvvPx4zkOAk1EF-2tgXRovHwflTYvnPqoBiou7HlzorakshN9agYsujCnvPYV4IqnDJzpPLq7b5mb-HGO14wT4pSrCN1v9GX67rNdP1eg6dSbNIun-S2lH3-1HwaA6K-AbB9t4Rcu71C1MPzZ-VWtMoZxWflzL5ihj6KWCsaBI4Pzs7mxDK5BCQyyACszZ94ojgmKpxw9AZYPB61vKkOzlefi5AwuzaN5RPOgLOHPRmHRIMDuNCHhYOHZew5jaPW8YR2X5cRbvyuqxy3LGrPImR58mkBR7SVLRZ0ATjIyxRxgD9hltcL5W0oPUcet5JjSbog3zaMZ3CfMmwjJ8OYl9oQS8lNOT428wJ8C5MOX_JHC81qMxvGC3zynhUvtD8hYJ8cWAvegifx5ne2L8SOYHsh7Vxpw8nk2fXF6lmIS11I1Wxc9dALiWkX8hQ6XacjbVvXx_QBiq0lN-5k_62iC0ZXp2oOXaWb0jyaJA86Eo_ljNOejhrqTE7YlCaycGiZphJzBqN0uq4w9kr4EASavBaTndpoxl0SqjmFgOmvx4stJzebELGTdd6KT04ZjvjKRp-aZLwszH4IdH3RWvbowY-8VckFLq2wbUG7Kzktr2D_QtG5PZLKtp9AWGXof6hvjTH5N3l8UuM-zMy9Dot9fjUuVzfcZxz1S1fmJwZFYNEMr11NNP-0ZvyuFuwyXg8PoeiXXw_QczDN6oX3mxfh1ur4Ne41YTsTHF--sIFnPWzKNe2_aYl01shzi--qc-xbDZV-BomG6B_L8XXX59_xwbcitWlW-ffnbHBAOhWA59GIYtByddz_91MqeYdn0KIEg8xndLXOniA1039kD310zrAPVgv5DZ7-tX__gGTrirD))
+- [Using set as mapping table to handle large keys or indeterministic sentinels](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_set/mapping_table_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy1WQtPG0kS_isln25jJ2ODDdlE5qFFyUaHLkpWCTmdBMg0M227lZlpp6cH8Fn89_uqemb8wCzsKQcCMzPVX72-qq4eFq1CF4WxedEani9aJmkN-1ErVfmkVBPdGrbiMlGtqFXY0sV8vfPyIqeX9PWP9__ufjCpfmdnc2cmU3-m7_yQmktqxx0a7A72u_j1a0Sf_nX6_vSE3n3-8sfnLydnp58_0S908uHD6cfTk7Pfv_boJE1JVhbkdKHdjU56S1UfTazzQndPE517MzbaDelkpuKp7g56uyy3c5Ff5H8zeZyWiabDuIztTuGVN_Go0L4Xl9PjTYlEQSLZUc6p-fHWR76cpXrtkZ-6svA7ib6BRaMbHXvrepvQxhbeaZXJ7Z2XIWS_jREuytRsZvLJyKvrVI_0ncqgAdaxSBC7dkaP6b3OkBTvlNcFTe0teUtloWmqiinBIVIFKUqt_V7OSMDIjslP8YEomlyllCivGtgrDshVWC7iBRVlPGUYeTQcLoN1BYyNuzD7CgtmM-s82Tyd0_7OW7qee03f9bwImTqbmoJSkxleY3NSzoBddK1jxaZvMcFpILGkt5mJwZ5sppzunuRJ9-utmlH73cnXjmDbmXaCWtAY1kEpGRDChVtt3PpRakSu6ESk8kQiMVUuuQUe5Vh5w6oqD4rKha44AHFR8TZcQmWPzizpXKJaO81aU-UmWpQXESCwdDZzFiwkOI4EGU5mBobWDqU2_l77qrxoYcMKO_ZiWKphVo_-YW_xh4vwEEAN6K0t0wQyKmFwRbkNiUYoYE2m8lhTomMwDdFNSg2pRsUUpUSuRLFkmmLwkenx0KpeQ5CTJDEcTJWm82hbrjiFyAKSlSSOm0Y-YfaEQEMstmlquJVw_dq0FApk2k9tskKPxjmnf5TGBVwn0cODG4PyUeA37M51CnDlkefExFIHZQ7hhIrUIoUmF901ywnFUsa-dBrZ4xjXGDcqRWhYddNYqnuCnqGcQVHKOQOwQfPCGhwmwfesR5-s11VsxSJhHgJQ8W4uwdiis8wTPcatBCqm6sagWYQ4xCpnrZUCrrFI8HUx07HhJNDtVAcrTD4rvThKfj4T3Ngy1e6E6on22mUmDzZAtUm2WALy1GFS3GbBIFAwWRJAzCqkHwE-YWqttCA4V-eUuRgowNYVjF6UXOdz5JKNWOtRuYBzDh2apXAitMCqawHtQdcayhrqSiK52qqII4xVYpbEJK4joQhM2NYCSfp7r4b8JiZedftXoYU-jFShxrppWiqOK65fMdh5t395xUIml0A3sO9AI5uJXUxnzgv3KJAcYn4uCVMIpeWHsLiiv1S2OMMrgtCK_ex70EB0rZj7iF_l7DJzvyG3OuSv2lDYQm5YyxRy4Gelm1nuyNz9enTqK14A0WsQVYwpZLNBEDM0DYFv2o2nWzVnmSTkrFam0gks9tOs12zEzaYXdrNvyF63roQmLgxVu-xvbeNtWOk5Xhmd0eeVaEgBVFq8hnaQE5sybuYKje4MO27oA5TNR0HJAuLNVfsMGiHyUqjRoSGN-I8F_7qnxT3LBttpaf27qY6_I-XjxspAOplFYqhoUoOoGNewMXC1wtrCyfCk1hXcTaeFsD7VYw9igBQF90RA6rt1SVdJhnHrEVGn0RFzeoGY6Be1BzLVbPgQFuzwx2hUTTejECt9N3N0bW1abcLWtTttUGZvMPJsb0T1BUzqhDWMI4FHOHdCAEGTlPZJhx1SalUFU4RSVRPTTxpJlU88pPF8kgyHE-0Pd4_bkspzWHTZoaOjRwWcCIRdf_m1Id1_Cq7_l-AGT8EN_hLc3lNwe2twB4wl3G7oL09x__7gqXKV7jQu87hu_qH3Pmizy_4km3Mg4U-r5dBYm2IOl8-p5hU2qxLWb-GwGLuVuJ95TBRdYdAZG4dpoaLwKoMfb7bP4qxY8D_kyRvZXGR4gjdiIxb6xroJ5t6crsTIqy35OON5oto1RejP83FjMVuIqjr0v4RlGNIlauJabDGuHB7SRev8osV_PHQ7LApCEW2V6j-UWiuJLUsGz1jymFF79drz3cs_tWsp2L98vmnLVYPnwu9VgpeXF8h9i0nAHOA8Z8rkbU5GHXdw9Wy6Pjg0s2J1asHkmtdnnHrY4BGS9_yZTtNA8JL_4IWcc0YOI90_gbfWZMTGw7IqoYhiHLYi2SWiVTHZ5w4TW2JSi2j_28fj44PK3tNMTbjfs1oRw_b1HzF4Wk7YFXmy6khmna7NxqbDYzuueKPNUGqFCeNkBb_cUB6ZiW8xsTBR4YKzPHXLQL9ypAj9QlhOU6lDOgppFtfC2f8QkTlebAZm0e-XEb1QL3Ckw877MCSLfi-iAX728LPfu7-P1gm0rfH_v5EHA0a-fhz5NRB_xc8b_Lz9qTb_BOSxSovnhOP-YCO1wrqjKsM9vmqHRhxe9QyHa-96JN-UhH0mrAmtualBhUPoRgWqPOwxcgOH66pqrprqJJ3bEgd2MepGB-rfTm1aH_6cyie6UsLFW7-6qN6bnHxt6kOPxyY2WjYDFQ5LVdHbXPeWFX0iZoa6ruypK1MOR3Jg3lo4WB4LGkoI3SIcnMM5aeWQxFhLHctBEhuLn48QnVEDe0TdfhXDlbww0mjmHR6HcPf4V7vTQ5esMiTSfNDk1rT-DmsRbug73gsPhQ-c2pE_XkjCX9LgPgrhvOYu8Hr375RalYBHnOZH-LdCREGvfVk89OpRDjdf9ZlkUXv69JKgNgW-ciN-d4BMHvaj5UQk9DxerF8vFdw_ytVi8xz9upnUN_IS1oxkzdEjRdIk_nixGxEMHKAAUX-h-Ph9bDjQt1fAetca-0Gb39-t3MS5tN3prLKjzM2PUgf9y6-nLWlz3jub1b-CNoIu4LB1GNcwYN3oEc4s7RWR2sYHMHmZrSXqKOwRiQEjUS3bMKJN3bWXGzMU8uTCW44wL7AqeUCMjlr0VY-o8zWsxwWSsbQtZhqYtHuADwE4oFevTGdl0P1SORzeZhGUM-LmK4cgHua_0PvOV3w4N5fLEZY_qqF3N0wurajFe7dJtVv-s6GV38Rxf_C67OOxnfnwn4hWFzE4il-96r-hrnLx9KjIRm92qdtFC_FdKepEJ91UZdfy74nUXK9gxnGc4ibaEr-OxA3sOvn31n1UP0cVrT0HZVr3l_L9X_fJZgs=))
### `static_map`
-`cuco::static_map` is a fixed-size hash table using open addressing with linear probing. See the Doxygen documentation in `static_map.cuh` for more detailed information.
+`cuco::static_map` is a fixed-size hash table using open addressing with linear probing by default. It supports switching to double hashing. See the Doxygen documentation in `static_map.cuh` for more detailed information.
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyNVw1v2zYQ_Ss3DcOcVv4KEBRw4mBe0mJGC6eI0xZFXSg0RcdEJFEjKaee4f--O5Ky5cRA2wKxTd7H47t3R2kTGWGMVIWJBt82kUyjQT-OMlY8VOxBRIOIVymL4sioSnP63X01K-AVXKlyreXD0kKLn8Bp77TXxj9nMUw-j6_HI7i6uf14czu6G99MOuTgnD5ILgojUqiKVGiwSwGjknH8CDsxfBaa0MBppwctMphFYW8WnZy7KGtVQc7WUCgLlREYRhpYyEyA-MFFaUEWwFVeZpIVXMCTtEuXKsRxcOBrCKLmlqE9Q48Sfy2alsDsDjr9W1pbDrrdp6enDnOwO0o_dDNvbLofxldvJ9O3bYS-c_tUZEgvaPFvJTUefL4GViIyzuaIN2NPoDSwBy1wzypC_qSllcVDDEYt7BPTwsVJpbFazit7QF6NE8_fNED6WIHEjaYwns4i-Hs0HU9jF-fL-O6fm0938GV0ezua3I3fTuHmFos1uR5TqfDXOxhNvsL78eQ6BoHUYSrxo9R0CoQqiVaReg6nQhzAWCgPy5SCy4XkUMsIHtRK6AKPBaXQufSCQ5Cpi5PJXFpm3dqLw7lU3VkxK36XBc-qVMAFr7jqGnLhSc7KDq-Wl4cWdqkrY7upWGGUZCW4VbpDRi9MsDIsO74lrdAMHbtcVQUVJalXfmJvNSsMspH_xMFgcoEaPb67i9J5fjqeM3vowo1NU7E4WJMKJSFYfrDouDYuXveV1-hfrneWaJ3Mq-wxET8YVlkgq357rqVYwLXIsT6IyQqskqGqhm7ZFwI1RxFQchQNRh_HZt_8d2hKu24ZUNio02yNkl8p3w0LrXIX0DmjOJxRRfOClJUq0o8qiVAnlUw-ovRRItqiNF2OhSy8_MEIS_gexXoPwalIFhYbXxatlZLpyazY4A4modjvxRq7fIgx7fl-9TPLKrFbpfVuF97mpV2DyZT1R9GCWkQU1vc4fdcr_D6LaFEWIkNSVhTJdIgJ7Bb_C8xSVRk6IY8iQ52ik6n4MuSxS2aJE5x2AlsIFOeVpjGBQ5A-y8pCyiyjMzr8nIpEDQuCICZIQFJDcENsCO2-O50_13N7h2rvEawDmkmVzwmE47XrTKFkUhuaXfO6GIK6GlWRDgZG_icS20hSVDlBMhj4rPdnr9fbB7_CkY3jCzjNVonszpkJwwxt_4BMMRQCo04mD1Zhzn1g2k38Lsbudc7Oj4LYRx_6TS5k1tqh6jbjnDSxkfQrTtUGErq7VGZRHQ2L67XgJdPuO_nSh3GKdtw2SKv5ddr0R6GoQ6DJhoh3HeXUCTvUcTDY1XbzssrbQyOXcHOsuNtt44A4KJB76hs_kurmcQfxUiVTP5oGg4PBeoHCuwzFdzzuCHU39s6pjt1qmHbm4gGb8SRu-ndEkdJS79D_MKnT7y6th_iLiUMjPk8dlg-Te2XOkbDnfNBEUEH_m00v7iHzm37cx49OpwMbGcvtdldfbzfcYcrZI6ryxUXR8gWvrV7cPBcNSV9uMGUQCD6lDQalVjxjMk-0sJUuErsuxYUXA6WnOsW-7y8vQyKAb6EfjxYlnHQIR5n7DkkSipK03CnlCWzqwAAeBhxHsKFM3-T3Ogl-3Z7XvtuTRveNXW6kPssCjY55aixsETKihwCPsOUM4mD3GpqCCOGmSCNdX3SpLJDfn-s7SM0ZH1NaCPwObx-P0lGKkoB-DKdODlsnHIPRkE5mjOKS0axvSum-meC-PvwCuxLjwT0FTaxK6JJDsu7xRhSm-NPi8xk-_MWH7mgAw-HRoX5fM0aBfrkXm8Frw8bZ8bldLtb-viIGqDhNcjGh5f45vL4lGrTPlcrCgEbnkCXxLsPDjnDPa61jaJ5hDLiPCrcGLhfQep4QFRyuBoWX68UFjvlpxTk-AP8G79yJ6Hwh3gzjROew9eGC3ulSwxV8a6LXEHy40vuXq6hYcd4_Pav6uK1K69-8ojZmHPLXr_tvoM00Xw5NnrzpQbuNl5vFPxZPI9J2xvK5ex3L5LwRk3Oe4eLKvzvhAt5VxWO0jet9bMCDfZR3tP3u_v8PKKbiNA==))
-- [Device-ref APIs for individual operations](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzNWftvG8cR_lc2LNJSFp9G3QCUKES1nZZIKgeS4iCwjPPybkkufK_c7ZFiCP3v_WZ270XRFpX-Uhkwydvdec83M3u7Tq7yXCdx3pl82HV00JmMe51QxstCLlVn0vGLQHZ6nTwpMp9-D1_cxeKFeJ2k20wvV0Z0_RPxcvRy1Md_f--Jq_ezN7NL8frd9c_vri9vZ--uBnSAD_2kfRXnKhBFHKhMmJUSl6n08eFWeuK9ykga8XIwEl3acNdxa3edkzOmsk0KEcmtiBMjilyBjM7FQodKqHtfpUboWPhJlIZaxr4SG21WzMrRYXHEb45IMjcS-yVOpPi1aO4U0lSi09_KmHQyHG42m4FksQdJthyGdnM-_Gn2-u3Vzds-RK-O_RKHMK_I1O-FzqD4fCtkCsl8OYe8odyIJBNymSmsmYQk32Ta6HjZE3myMBuZKaYT6Nxkel6YlvFKOaF_cwPMJ2MY7vJGzG7uOuKflzezmx7T-XV2--93v9yKXy-vry-vbmdvb8S7azjr6s2MXIVfP4jLq9_Ej7OrNz2hYDqwUvdpRlpAVE1mVYG14Y1SLTEWiRUrT5WvF9oXZRiJZbJWWQy1RKqySNuAg5AB0wl1pI00_OyRcsxqeBffxX_RsR8WgRLnfuEnw5yO-F4k04FfrC72dwQSO4Lhooh9oizDi4PrpkhD1Voyq6zIzTBQawjgrZVvkmywOrRF3Su_IOJemsCl28O7tFGZBI3hHzr1yh-Ht-YIE4WYHTxSJ5KmfcKH8IFatJ7pBDGgZNR6yMbNmd7whQ3K7zlZnIKZWnjqXsKvCna06_NMq4V4oyJ4xEBeBb_k5EeXH_aoyDUYXP48y9nzOg70WgeFDEWSkpbsz1B_RnzCj5kZLrClBoPZl_dLkI6XYXmQAo_OCh9hPVcUQ2AYIdKRL04WP4Esay1JPiZ_16kDhJREHphtqvJagO8BIErcEno4A1AikSpBpTlBUVpkaYIER16F24GYGdpG4KNjoxCunLn5KtmwbSI4gck7KWVsxAZAgz1BwjtKZjJcJkj2VVSJNGx5yXphxibIxWe1zXFcGpHKPG_mGQRAfgbAFMMmMZYNJUatq0llJiPxH5mKW5ih9CQ2lRaEjVRG0dc68KPazhCzECMtoLELX7FZwSJiLcNCeWRW2D9GihtNsAYBwGcygci82CL4ns4cRRJWPkQVIqcqeEz459IGAF2ZbWub1EbgjR90_FG4oBDXpdJNg7AJNyvtr1wA5igiYdgKvX2CpOtcLRGQt6DC3xjvHNkMSMg8rBsTR3ifitX-GDq8ExCa54mv2fFc5xTKEvH4Mou4iDwWguibxCD98GgOf5TSAZYd-f2zZNJ969p6ZpOg5D4Q75Aqh0K2EajOpMzDilrWFccxKYwVt1z9ssh54fuoUIsiBNtyu8soo5BtJOg5hUwsI0Vx1BPVLxfijSdVjDaeVeEFKPW8ZZjMZeh5Yp3ogJoPbEZQWtZdyjIXYVR2n_grU6wKoSPO1FnUCJkjzqFqTCa5_gMpVkXCEcfq3CIHHnEAKfSi5buTu3hHx2RB8ASbTREPKFbBLLgf3ItTMQ8T_7P98cL-eKOjwf0ZQWJbbj8pYtJ8KkbUEFKmAh66RPS8UupE7KyUw6ENRldKvhaT9oBeiC496lb--ADSH08qikyTocjRzJQpMtSuTyYr1CcioLlGEPGFznIDhSPbKi31WsWcoBuZN8hVIU7J92khw9wSojO0W4Zkqy1qB_o8Dm1RyuoCbeBij3qjySSVOtu1Feg1Q4WfPDR1EuL01Fn2jEV6TT8aiXYwx9ieJYkH-8V9kD9Op2KZ6YA9ue9W3kgf4PVLGlBw2ayyDiaWj7igUETavwyCbjO2emVI0IDwcKCG_pBkDcev5JpaDLRUDPAl7Pfw3c9UpGLDrtMZyGZofNMEnQogmM1HHXwSq_-jytqAzKPLGtpMGObrZe3ZJY2IbpsEniw1z0ToA8hbucyzFasFvQeQ9SAA_g_YdAT6zOos5uzNWzHHfW0JIGhvqzhwXVzd49m6SgPZRtPMZyoO5XHq-NCQdk_sCquzQGaQQiVKEL99ZDurgc9u_6bez_Ta0PdIoZ7LS2mRwXmENzX6E3ZQSYZlo0id1vhDM9lkYkkR71Y0tPq-nttrveTlmN2VZ5PtYscq9C9yhcQJHs5K-qy8Qsp7EvAxLklEaPWzrZdkGDvBNJT3qFVnzwcyhh1kGAyn4y7FZhlVBc0yFIogNaUkPKufchmvnjowfBulZivyMEGoYP6H5DR-w6L2_oC-Z2t8x4SDhzpWIWYbG_4DSrUSPnIaSoowoATPVYhBFoeA4ivHh8EQTtqKWK0pKX2_oDGOLljok2AJsCwJ61h-n4YiugwQikSkSPdKEdjGU9Efs3ZWr_39FtSqE263k-aqiQxDi7VUxRha5qrZ1e11AyWTCm6m4tXob6PRqCb-GnFieK50E_aBZlfsdqPe6KEnduPeGB-DwUDsdE8_cBjYCX0yaV0LnMMqF04yZt2tAOCseajk2m1sHXACdk96zfM23Xpi1D7fZsrGrdg63DuOsYuSfdbucZN5abgkQhjAlXThpRGWc5m7GyYY-VsRJhLtryS5KgStPUKrnl2lbm3w6uyg92rqU7voKx1WGolhk05LNprRC5_ShAscT0B3nZIassImkc21_pidTR-2NeOgbERbGZh8RWBVIapTYVuq-jphV3J4shG2J6ts2T3Om4dn0WBBd4ey6Rg6hHdsX0QFSqhJOH53x4oQgo_MvDRL5rDnOUMoPQ_UQhah8VYyX3nlfRuTBu2H2l__UgaOipO4n2xivuKMCsP3oNmhdoXhCSUl2eTVGA6XcNsOGLQ-K287HIvPKiM4LN3nwpvrDFdHfHMNsl1qRFM94nBTlDRmBuV69rwmnHv8cCo-fBSeKz2e1-VF7DwR_QsxT5JQ7Fx1FlR0xbfi5YmY0uAiGoa5hJLMOUeA0zUb3UFVTXDdMj1qhw_jA2xy0Zq9uuNSz7385DLmUSpCk5ev_nHW3sMlzy47eK-T8rR5uC_GJ0jT-gkT2puKz8_PK3q9xt6Li4tu7agjZsvW3yFE_XMk9rDxmUSeMUy3mdtI-jPsqksTKtLdk8FSGbRqzYEZMWTE-Tkw8ap9X1IenWCJNjTJfRh9pEcWKOIg_HICP5233N02bnefmb90_GD20kKp6f4I8LU4Kwn2DsaNaBZRJ9G1MpiU1tzMGB4NoSq0Y3XJFKrRrdWN_RMtAxFDn4jcqLqGhvmPKP41gUb9f0TCGs0q4EHobptvrfg-uXKlhRv8qoTfYJRdeyliJD8rr_l6o9soNnxs91zOD1YDGjeYJkKMelSyPNm6dgc3cJhmF1sbeZ9oeUBgeyrGhLX8m4l_oksZGW4kzatZoeo6j54aFczOfawR-HjJotv2wdNJWpvoOXsh6Z77nj59oO4wZv_V0m0UoCOQxZWohtOAJeeji66j5Sy5tz4u18-eZPFQJStmTGtszJT7IHVjb5i-EbcyA4PqjjujOzpCkeZ4SZfFoNk5K6-RnBIjewfU6XXoHTBm86x-s92J174_fvmqGGM5SY197d3pQ46pf3o6_k70ZeavpnnkfTcS_T6KpMF_9i1PP5TRnN-Fh3reoOn7foiHa_viGg8QWvHnzkOvXAditdbhtc7DR_73Xx4ZenE=))
-- [Custom data types, key equality operators and hash functions](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/custom_type_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJytV41vGjcU_1febtoG7XFAtqkVASSWtBpaRaaQtqpKdTE-A1bu7NvZB2GI_33P9h0cH21SaURKgp_9_Hvv_d6HN55iSnEplNf5vPF45HXavhcTMc_JnHkdj-YR8XxPyTyj5nvzxUTAC7iS6Trj84WGGq3DReui3cBfv_kw-jC8Hg7g6ub275vbwd3wZhSYA_bQO06ZUCyCXEQsA71gMEgJxT-FxIcPLDNo4CJoQc1smHiFbOLVL62WtcwhIWsQUkOuGKrhCmY8ZsAeKUs1cAFUJmnMiaAMVlwv7FWFHgsHPhVK5FQT3E_wRIrfZtWdQPQOuvkstE47zeZqtQqIhR3IbN6M3WbVfDe8ejMav2kg9N2x9yJG90LG_sl5hoZP10BSREbJFPHGZAUyAzLPGMq0NMhXGddczH1QcqZXJGNWT8SVzvg01wfOK3Gi_dUN6D4i0HGDMQzHEw_-GIyHY9_q-Ti8-_Pm_R18HNzeDkZ3wzdjuLnFYI2uhyZU-O0tDEaf4K_h6NoHhq7Dq9hjmhkrECo3bmWR8-GYsQMYM-lgqZRRPuMUShrBXC5ZJtAsSFmWcEc4BBlZPTFPuCbarp0YZ69qTsRE_MgFjfOIQZfmVDaVOULDhKQBzRf94x0Rac5yQY1WEverMr3IcqWbEVviDeGSUS2zYHFuC9csIyhtUpkLE5WwXHliv86IUOiO5IkDsZwjFeLzwp2SwFnXbMJ7xbJGxGZcYJgf2Br0OkWCYOhzqoHiKZmEuB6addig65BS-teLUAO5rH6bXhqNAGG4kEqHIf5T-CM8VlOrw2b73L2l_sc6dIBsHrc-TPG31bC9PGfFksQ5O2uHlZyxZHZgiXrakr2i59hS2X1gzcxao75tjVMGC6IWgIGNTZof22WFG4did3le3iVTR5havXYcT4oJon-Gh7r7DwtgUfA2WGB0ngl4CMglGGTfRGeIgwWJxF-FaK50O45xTqWMn4ExXij_hI-FLFuoYwvMJfYmKC1BBQGBXs_sDhx3d05HV2Ht5qK2lDyqT4Q9aRWaSgVKR52O4v9iEEHkSZgSninowevWL61Wq6ALumbMNLBEY9lXzGQ3i5WRkBwLsYPHklSvLf5yBwLsHdu1abS3l2dPOirtzvZOKVacLRBdZYxoZop3WTZMR-IizbUJWtPlirVnd5_9Fk7ZHHtHD1zp6HQS8oAXnFShmvPxwa6T2tYtqNivteq-O2DKaaeTZpLGhCehi5E1wNZiFCGK7pFf_FNz-_0CAcDnLxVa1awpvL5n8l7t5tjdfHtGM65ukfr1esWbsmQ1QbqkbhBot1o-sgBULDV2G2V6kuk2c75kwoWt4uodMQIYSW27XaGcmgmA42bsvRRrCR5-EHJl1K3MzBHHGDfMPY20sxeiUkwJ0yIxvLEkEcwILSL8uvVTsAuogdor7N_3uI1bYI8aIXUrFPeNSYbY_c3WL537tU-hpKT15pTg36fDemlzjuzP0XNYap4NP0b9JAuRjVN0d7ftVwsreqGSUEMbAlXGwFUCpLe0MTeexoFsTwKnx1ZvZuIUlSsWoIn2vmCCOR64GNcqSegfZOTLfQWqMPOWIfgox1Lszrtmvs9pt2pcg3XrTMqeSezvTumnPt9M-YOE3Of0U58nc_440asZXVp4MLd1TT_qm6JrxngW1c65-5ppM3UKdPcMMIA21geex7gKmJoJFufPQ04okrAqI0oqFLrLGROIgnun8z6AId5j2-x9JZSf-Zd7iCRT4hdsEI84sPtwv0OOUtPuZiRW7D4o-VWIVa2ixz_gR4Vh_t4PgaVfzTrP4rwzjyRblmaExxCZmcsQzbQrRIJZ64YWY-JuPgiKw_8XkkLdYFccS_fjM2d_4qiVYsDCnazS4sy6nBXcO7muioCJyCycYV8xkUzr0Oi70WZHxqnhnps0Z1A7AGEoaysw5pmGbhefWuOcUnwi_QBvLYMMyWw9VMEEzfYuzfBidBXKzRSCK_iuNg9VfLpm--e3J5aUti9-z9solql2b3OvgTf26MuX7VfQIBld9FQSvmpBo4Ezj27YvhCxqBGTZGof7DGfVnRSSmNcXLrXNS5gYxQP3tYv5VhZD-ToJ2_7xf78BwHUjUo=))
-- [Key histogram](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/count_by_key_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVWQtPI0cS_it9PkVnL34AuU1OBqMlsLlYyUEEbKIIVpN2T9tuMQ_fTA_GQfz3-6p6eh7GLHusxNr9qKqux1dfN0-dXOe5SZO8M7596piwMz7odyKZLAq50J1xRxWh7PQ7eVpkir6P3t0l4p04S1ebzCyWVnRVTxzuH347wK_3fXHx2_R8eirOLq9-vbw6vZleXgxpA2_6xSid5DoURRLqTNilFqcrqfBfOdMXv-mMrBGHw33RpQV3nXLurtM7YimbtBCx3IgktaLINcSYXMxNpIV-VHplhUmESuNVZGSitFgbu2RVpRw2R_xRCklnVmK9xI4Vvs2bK4W0len0s7R2NR6N1uv1ULLZwzRbjCK3OB_9Mj37eHH9cQDTq22fkgjuFZn-b2EyHHy2EXIFy5Scwd5IrkWaCbnINOZsSpavM2NNsuiLPJ3btcw0ywlNbjMzK2zLed5OnL-5AO6TCRx3ei2m13cd8cPp9fS6z3J-n978dPnpRvx-enV1enEz_XgtLq8QrIvzKYUK334Upxd_iJ-nF-d9oeE6qNKPq4xOAVMNuVWHzofXWrfMmKfOrHyllZkbJXwaiUX6oLMExxIrncXGJRyMDFlOZGJjpeWxF4djVaO75C75u0lUVIRaHKtCpaOctqgglquhKpYn2ytmo1mUqnv3O4DvC6XLhc1loYSgcCRtGhu1e25eJIqMk1Fr3i6zIrejUD_A0OBBK5tmw-WuJTaTSQ7nxMMXZsbSblkEjaGevxgziW2NmRTx1jJuDbIjc9YxeucS8AMXhkqLxAazTXCvN4F-lIgiOcOtmGVGz8W5juF_mGo1opBT1MpqcCcUuYGK01-nOcfZJKF5MGEhI5EipmX0InOPbETUMjuaYwk-sw4So9LE6kdLUqUzaDDbDGBQLaAvzFAPWb4UqGqbLjIZC0oegYV5jSTT19VLWJosIm8HZS2bolATM00JSKHQZJs_mkpxtAcjyU4Wf9epswu5M0cR2c1KNwz4APTR4oagp_QnVSFZHlaOJBxbFdkqBTqgKKPNUEwtLSPkQkA1cp3LPl-ma_ZRjKiy-NJKmVixBkphTZjyCq9MRosUSLGMK5NGrbC7oE7ZBTk7j8rN-T0XpA_wohOSiQAoVVBIWYNJVoUVORBLAz4bJ7YrSdH4gQrq2vylxdmn81PB9QWX_6Vbq_4jV-IGLvNJBEd6b8OfOiPZrQ0_683UIs5TVm8sBRXeXC_hPfEgo0IHFAJKI6SDNYSfcAv0jMeU1TTZEvgpMTgCy7ws7JeFIiZbcgvE57t_BnUD-MBSb03yWZRJIa78QZqHxL4UCoxalgmYowNFUSv1tgWS_TO9QABuIIU_MViWYgEfrho5jNwmSPC2lKSIA15BQmxqURsYmuH8fitlAJ86b-5NC-s2F-yx12VQjwHWWCfMGeEOg9yzGnkJ8AA0Oc_VidLn4klkrClcjW9lzBsjddCAYkGwiNKZjIJAPKQmbKFYlxKsDAS1ti_9-NQis99a6-NeefOtDY002_Jh7y55os0F4ZHzxhW3ITER6E_jcWPo2Ovt1247IbojgiBfggWEcELlpcbG8fgGjr9GVhNiUxCC3H05IjwQwp9HESiJKE1pQUZYPhEL_H9u4uEjkqFSe9TcZcLHrfNOGgDwzlX_NHyEiD3kKjpSyN9K5ZU33VQrwyZin1WhVlByXdJ0XHm9J56c30cjj-PUKbi4fKUxsStbCaXngdshC6y5zaMUvjR5kOg1SfwMfWW6DJ3AANUQUGfoEp0Yj1fSZE-k-xamfO6Lg2fmm_gxc5hXSapMY-PmJoNbGUBbUICFftXLs-_tlZKfhY6ARE2BfEyUakSbNh6U6byDE3xTmY51Yt2p_TY-MiESJVYox2NHZ-iwnFjfHlJiuanSmhx8VwcOkU-eyFuDk1wjScLnIy-WfDXXVi0DGYbdAy8hRoPLNkGagalBRSQfdehd9Vx6DMHcmzSzjeefXVbglMTPwVUb4JIXSoFkzoso2lTYIuBzhzbUWTU4t8u4UgrhmTuqpF2wUpT5Ad6QhA7AWnno2GA7DRvV1G0WUG94XcTdl9FzZ6WkaCS8mCCfq9TYGQVX3q9HgcuxqajrA_HOEcnxOJPrYJUSdcgCJXPb3YYcH4dtUY04vnDB23FF3Dh0UIxMNEmX4NjDG-JwQVzILqVlrxAXSOddoG5vr_x8Rtna6538i4JTZrRJTFzE9dWI2YTM1BJtWtki466cx8H3-zWIQiZDkE_qo3qKVbSnSus-xiu7EZTiKKuM-AddZ1BE7j5Gn7MHfAbpw6BJdAS659rkkPqgpwo58bQiCqmV5zqCkdiEtF2WetgBzKcSTYy1YlW4sGYlrQqllUSp-CQMyXS5EppMZHLuTSixtqShFOtjbDnpDg5cSNxxtyU4SlPJaO_nLV6Cj1ybIKB6ZrrZ2R201GoqjjER7_f_sb_vIByCfqoYJVdpkyo4R-Qeyiq6TA7ZoYK8EBZ8R6arCBSxjvIkMifbut3KkG-2NvS4End07bvOj3w_rRl7vz5OjPKio9OtImcOiMzYsgT2c22Ql1awAxJ3aaEzorqQCjq3Q_dqQet8DbcujBzU0uGu5qsO6D17BqSwfK0pKbmP1lB8fOnrpcy37cYtYoNfqH93gaksqe6lJdD48Vje64AbDAor8KzZ5d9-r__1ixvnGhISdHt-d3OG-W7Xz9x-BuUpfRR0OTdMj3ofVcwTqhXQkLysC4NEqJNitJ0UvSPx3Ej70wggSF4toZ7bS0Uk6qbkUJK9_XoIPbafbBPAbrPSzsqOp-jpyACQZjIv32pQSt-gV8pQzCVJ3FEUNBu4WSJOw_e14KkjHLXRgCaiCDnh532SrhPKXBk-0GtYX6w134Tp4YxyFEpkpApm7p5oeBNd2YXjMcWuopB0yErFRLzq8-bR6T5cKMLfmrntMJh6dqhzbgcNfwwrh9Bm4jjE1-ob-lPTpLf4etOVb651mip0fnqJ08__lwzG56ddWP01cqhJczwABLgV2ZRT_-lrTYigR2bBKktnKNVj5nM0Huq5LCIbADqWgX_sYtGQ_VyH8d_aIn5JmgyQU_xEGReW3zGzXRdhbofgZek6F39uUe4_61cbj6alEsAuO6am-vc6o5bcSIHAUV16-cOnkr5vafCVt1VHjvxQPkPA4fvvjtprHG_iaf6ZNDBlr7l5IA56yPh6hAU1L6jH9dyJi8_x8XElvt_YenJy0vU32Z3AWN9FtxFmSHyi22vAzJUG3Qb9cM9tVFT03hZFDiMQO91gQ_Xl4o0GBY5EGVI1qIYJt_ufXavavd2RDi_APT-9KsJF1B0ggNHdht7aGy1ZfriJtEut7omJtmHRbSvfLui9Bxc2tUVAKk8HioVMth0OU4lffKHTNICZe6F2z5cUgtKC8g2OH2N0ZuabBnMkfrrbMrersst7G3IDEGyXYTs9s-0wjRsvBtt9tkEnnSZuubM0jerLadl6XZuEE17APS2quizdBLa8WT9AugFcl1x_waBFeYA8Xbtb4N_uIKRz5C-MpWYimxjp9Dt0fTSRzuo_WnWSB6UODt8XB5hOV9b9RaszgPyJ2ts7-F4M6G4x4QuFGAyABha_3BvsIJLxjP_MFZlZQ6ZSKsLgg_ubFAbQxZL7znPfzwN5WvPwZ-f5M__7H7PCY_4=))
-- [Pre-allocated memory](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/preallocated_memory_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJylWAtv4zYS_itzOuDOzvoRe9vrQbGNpskuarRNiji7xeJ8EGiKtolIokpScVwj__1mSEmWnTi923OAJBbn8c3HmeFQu8AIY6TKTBD-axfIOAgHnSBh2apgKxGEAS9iFnQCowrN6Xv_bJ7BGVypfKvlam2hxdswPB9-24Gbz9Pr6SVc3d79ent3eT-9vemRrJP_WXKRGRFDkcVCg10LuMwZxz_lSgc-C01AYNg7hxYJzINybR60L5yVrSogZVvIlIXCCDQjDSxlIkA8cZFbkBlwleaJZBkXsJF27VyVdhwc-FIaUQvLUJ6hRo7flk1JYLaGTp-1tXnY7282mx5zsHtKr_qJFzb9n6dXH25mH7oIvVb7lCXILGjxeyE1Br7YAssRGWcLxJuwDSgNbKUFrllFyDdaWpmtOmDU0m6YFs5OLI3VclHYA_IqnBh_UwDpYxkSdzmD6WwewA-Xs-ms4-z8Nr3_8fbTPfx2eXd3eXM__TCD2zvcrJvrKW0VfvsIlzdf4KfpzXUHBFKHrsRTrikKhCqJVhF7DmdCHMBYKg_L5ILLpeRQZRCs1KPQGYYFudCp9LmGIGNnJ5GptMy6Zy-Cc67682ye_VVmPCliASNecNU3pMKjlOU9XqwnxxIxQ4m4z7Rm28mrS86tOVZUCiGi5UcRrbQqctN7YRuVpTqwKRWyL1jqJPtnfu-_dzmJ1LEkUZzhzkSpSJXeRuKJIY8CcXvBhZZiCde4mKEdlEQeDPGG-bgP02cy2uvWBiEWj0gTeLv7Qrunkii9gFmrjQH8RRlGBcNeGD0wg-wzSzlVu3E28RlVFcVkZSp63gnHTFsIMrssEpcBnGExwAYTR7hS3bDMkmf2qCQC3mYsxdTwrrxh74aqHtVREYtA6QfKFgfOi3a5J0dmGLbIHqVWWSoya_ZRf48dQRzGTp0BjcY1teQlL3SuCKTKkm0Ppi5Y6iYyswLzz5WicYRhHqa4t8485gXaSimcDXYOlImVk6icsWSlsHrX6T5n-334gRmM125zYeZZYSiszywpBIyhQIfvh5G9qBZ-ElvsM2MCclGqzzBGjDmBR1Ly4Yg0t1swibJoknQcN1Smfil6ENvIVIrgTHYHaNE7PpZ2lvfyY6ASCUNM8zDMilRoTBVfLCNnYBKGqcxa7QriL5hGaHMpV4VneJ45XSP_EJFtuOPUNiVCH8Pg_Pzv5-fnlYl7pAf5ky53XBYlgmXYCbiKRcVOrtUC_0YGW2-KlkmHwHIVhglCZzoqRUaDTvk8FktWJDZaM7OOlkXGCd8IOZtMataNVRqrzRssP5XdRcEfhI1KkZF_mDOpyUbH7-SkA4OX1rRY1hbHbv8x88WBszCshGptLMkDzSaWfdWSiAOAifa_fhzkr1H0WWHX2NBi3APsk5HvG19vzKUJno0siaxyu_I1tl7Ji68xc7xxkyo5fz3dcudZVJIQRcAK7An7bMeykjH2euwpFsYEyG9jyh5E1FwcvRZAvec-8QaTScs_KXV8cXXqmprsnn1BNgA1SHbn4OhFFlaxhqFvAt51E1zPLbTaEwqgUnPWLg58YcvCwsXjO-L4GwOG8wsAKm3N-ANgH1lgOeOBJq1IjReFFpU6jgY0LbjO0S4p_1Ek2G6hKlhqthzzDts7nVmIGk8XGu6WWqVHR2KJ8QDcQVV5Q1RGLXS3a8ZVyzQe7F5jo3NIRS9mlrXazzSgIjpb6OzAZ7V1VXPevWzTzydTtqnr3O9ea9tv6b9earvTKq8k5BvSHiC5iZrdYXSyYbzlusE85fPzwUTlB6VphiMybsoffvw8sf3uBI6iVaIWGHMEbvyQqIq0aySs3nxXtpRW1Wd8kCIXtYwrbVigpweSeTEpUqzSVBw4ufKQdIXQgF2CBN_zETx4JUM3AIrJKZMejbeyVmy55x6S-7dnthlvnSbKCG0B06zrkgXo4DLQwgfQndDzs2H7JFOk-2dcnaKq1MZNRBGKQQtMqDjylCltyorwcg2SPuC9qiSjNEJjmjiKofZDkYxL-Wn81HuCd54Y98Xh2UPp-X9b-0OcmOg4I2cwbJ-i8SMip8uK71Tb0iLm2hGxJ5hcUuBv8niKRaf5pxyS1AkGE6Ue8C6RVxQe8OYcv0mdE8WrHw5QKFqh6dE_xFzD6ZXr-abgHC-K7iaAMphpmcLyxKNhCaqweWHbbkeW0Cqt_qVhFkfvVrsNO98ZSt_LehzFkPHi4CYfNNg5PY5Mdo1zyLdkasqIW1i-jlgctwaVenkhUxpvnWg6YU8i9hvwXOYCnWspo3G33Dqaya3IYRD-t42o2XVGI5pNB8N_TvBA956uPl3dRlefri-j-7svLcJ17eKYYWmv8ZZDdd9ucO28D8Oquo1Kj8vDNPK-djvswPvh_-n1ffiiGCjwuiBq542cP3ZdZcxaYBv1aWCgSy8ZBHcXxaXzgD3xH99QXJhFQ5-YBkvy_bBqlT6VcHfWeEGLGlt-IrxfRMrz7UccGGbbdKGS1t-OFTtw8IUmLLVsoYt2u31RefM4xX7MGTpU5ayjLEsas46DX7NDrP1eIG10o64K4RgEjMdHPuqScEc4PrIwGsE8mPlqCx1XzhPTwocwD0jEH_lZnPiEBpHg5f91Wx-ZTF5V8kDLkYaua89BJyjfA-j968Ige-R8MPy2GOCyyq1_lxh00dqYv3s3-A66TPP12KTRd-fQ7WKEtutGKrxudxOWLtwLxkQuGjY55wk-fPSvBPGB1UX2EDx3qnVsfwfrWP_B87_dz38Ak3P-7g==))
-- [Heterogeneous Lookup](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/heterogeneous_lookup_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy1WWtz2zYW_SsY7WwrxdTLjjeNLGurOO5E09Tu2k4znThDQyQkoqZIlgCtaDXub997L8CXRdn9skpm-ADu-9wDgN62lFBKxpFqjb5sW9JvjYZOK-TRMuNL0Rq1vMznLael4iz18Ln_6jZir9hZnGxSuQw0a3sddjg4PHbYxW-z97MpO7u8-vXyanozu7zo4Vya_1F6IlLCZ1nki5TpQLBpwj242BGH_SZSdIQd9gasjRNuW3bsttU5IS2bOGMrvmFRrFmmBKiRii1kKJj45olEMxkxL14loeSRJ9ha6oBMWT3kDvvdKonnmsN8DhIJPC2qMxnXhev4C7RORv3-er3ucXK7F6fLfmgmq_7H2dn5xfV5F1wvxD5FIWSWpeLPTKYQ-HzDeAKeeXwO_oZ8zeKU8WUqYEzH6Pk6lVpGS4epeKHXPBWkx5dKp3Ke6Vrycj8h_uoESB-PIHHTaza7vm2xd9Pr2bVDej7Pbj5cfrphn6dXV9OLm9n5Nbu8gmJdvJ9hqeDpJza9-J39PLt47zABqQNT4luSYhTgqsS0Ct_k8FqImhuL2LilEuHJhfRYjiC2jB9EGkFYLBHpShqsgZM-6QnlSmqu6d1OcGSqfxvdRv-QkRdmvmBjL_PivkIRz13xpOdlweTpDJ_3F1nkoVYeTnbGlPb7OktCURvSQZop3fcFgCLsp3ztpmIhUgE4cj2udC9onv4AvroPwtNx2jwliJV-doLUIuUw2vfiLEIAuPmbF-brlEcKMr-qC1RFJBhPBV_R6_4rg8wfqWMCAULxUkQizpQbxvF9lrjiG4cyC0hrgeMf56kUC_ZerKBIYFILxYJ4jZiFiqL5uipmVCnTfXdYsNGorNhdyQk32L3WIvNr-hsUOmwdSC9gPAzjtSIqqLhQM8rZvdiQCb1JEKhcm0ZZUEU1W6TxipDmxRGSgEi_VyhD8x1SEmeaBfwBgQtmFjJVGmeDh5mnAb-kPp7_AYXNuaNJWRntLALWiTZsHaf3CwoBZdB5XmgAKYXE5kOsIgJOUCJFRMAdOMHBIQWERgRiglFFKGTDassD5g-AZZoNz39mIgWf5Er06plXAByhjG2u8oolXKZjMOug7ckdqU8FsoEgkLK7NtypOHWl7zAv4FEkws4dAx7Ki1JCwQcG9HS4gdhQ9KgrQrHCQlAfKlLepM8hfwE8qwRU52WJgDJtXcqKgJfALzAAAKrGcGeLpMpKfGhAF6ZLRJgrYmoPGg3ySvkGrmJA4jyUesOIWOJUmRx7QLZxgr0ngHpJ-W0LFyBAO6gCAs5xoDDpohSPI8gGei9z0jMQ0-uY2eQox2AdQ53HOjCADmzB_HqQ6KSp8B3l9M5YNSsLhmu9JM5IOHYBOEChLYCvJT2XhGvqZAy5GMMpa4LFCWP9PvvZxmiQi0uBBW4cjVgTSnL9SRrPhVEPlhmyM1KFPxpRDIWd541R2KCu0VYVQbnZBx5mwiUlpwxakesTosc-kJwXQm5McSvTABxzqddSCdpe8JSaCpTBJoMUMD8WKvqeKANciyQ4ZYFHiovOMWvdbXT26ezSfX9-9nF6de6-m918nl2fu2eXv_w6vZq--3jeLo13cufqsEVoEnIsDAmqCJNKoai-lEqLhryDAHgPZrfVI9UITS2ADRAilmClRvBwj_ZVSFw5lA1qvgGSPL0HuaDVtmV9lbFOb7Hahb0xKo34SmBtJzjkunZddRmhQcn_Qi5sp8Vpu9NGFFDvf4dudcw9ipJqxniWk8N3kPsFg0Kb1XM02l3a26ji5KkgsPUfgK7TKiyXQo8HkzaIdwwaPwOZK0IhpR6T3jPpwCTZ6VSBzq5-GTXpH76kXwmQ9wsDw7qBVOgsjZhdcDG8cSWHk7aJ6hUbHg3ZgfHBxP54Gz02Q-0p-ZWgM80g_m-QA_1zGVHP4BJZkClZyY0DBMFuAULS_hIQQZNLYe3F4scP1w4rnq4-XD9F5jyOwyokQSBHXBgAd1-Vz2mgnodoKBb6BYyCzl2Mgmo6gz0rmZaSFhztXUijBx122oh2NNHpUM4Rk2c27ybjeaaNAft7amC438CwMHBCohUDFuhVCwVIYUGABpVRG2BPCaV84HGlRhlRtnJBFnawCpL0mtJQpo-mQ-n1hhah4ndaWfm23aHDusPH_aJE1aVoydwg2hssjL8U2BRg7hHewffE7FX_Oh78E_YgHNYyTmeEwg5OOTVpfbqJ3poXQMIQXK2_t9WIX7HDR6dWmPJnNeTBb4u7vyVBQW4r93ul9vTd9gUzIeyjeeriDgGW7DHUoGklmWyb3m4fH_Ok521RO6eNy-pOGF0QHLYtK5UfDsDsUe5obeC1w35oGDgcHjts2DBwNICBgRkwUGr2rAQPekZP5NvRv3rHC4e9HvYO4XL4pjeEy9FR74cCXgQZZGDlzsVSRhVOWPF70LlzWGwbL_NZO6fP7SAPxLQs1AJ2R3LlGhYhL8eVXWEZrlNpgsmknRf6i820SXmP3Gx37GQzYG7zoa8Vvm1jx8tOXqYKm73swhbtfZFfc1Nw-3iS63nsdGwK8XuC2bm2K4l0alk9qFJKp2zt_9Deu_l4Y89j9kwOyyb3fWm-TpS7U6BTEdLXFWZXx2Bnv7fnKPLcWQIXyTjK6RM0N-3HzWnTrKcYAF8CsypdPWxUVngq3n4IF5t6RDDuzSFRtmjFkG0t6JXDIaCMHLMbZPwQhnahGE-FTHfB_6PXx39b6O3bt9A30DODQW6JvkJBmFjFTd6R-wPChR5jscd71S7C6iHptjtmdaWvUbtTCpSXr0Tkmxf59HxS51k_6tywgHb1n3FlIWvDz7lBqp76QOtwsoEmU1mo4fzDvXvcneHnLNqQJgAV5Iuqw5VvXVUcBLlN6nF7f7JP0OQ7KLJj19UyXXslqxkKTFhGkm5tYOh7u7pHkDBlcAKXcemoTecJOzgoOae67zJnbZAsRIBUds8QOT5PK_GUE8kLD3fH4zF-7TZfIszu2fYpvMbB3V0ZOdAxgkUnw_3TVXVXePhUuOSgRmOH9fkd1p0022nn0f4bxinloG8E97bhzGd8IygXxXTI79NMODntmL3VqXXM1hQTiDvBxiTewvtWfqDBi10lBvAO3rQc-j4jQziLFH_xaEUPnjc8PM6GMBwn2vw5pNUF1afewcHwDevy1AtO1cp9M2DdLmz-dJc2X77wuyFfzelvJKGcV3R6nhfCS3vogRdwDonuW49OPg6MWhuHbm89fqV__wPolNZF))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyNVo1u2zYQfpWbhq12K8tygKyAEwcz2gYwVrRBEwQD6kKhKToiIpEuSXnxDL_77kjJllMDKwLYMe__u-943EZWWCu1stH46zaSeTQexVHJ1GPNHkU0jnidsyiOrK4Np9_D13MFr-H25v3fg2tZind6tTHysXB34tmNYf8TerwPZ-lZOsCPP2L4dD97P5vCu89fbj5_md7NPn-C32F6fT37OJvefbhNYFqW4C0tGGGFWYs8OYT6KLlQVgxmuVBOLqUwY5iuGC_E4CxJSW84V3P1q1S8rHMBl7zmemgdc5JnFVslvC6uXmrkbCidMMxpc9WVuMLU1g1zscao2VpwVEiKUyrie83K0yKLMqG4OC11him71KZKfkirYu7YhFuX52J5dCa1dUaw6uiwlJV01vsbvg59-nOJPYICtbNFXT5l4plVq1IgHEG8MFIs4b2okAGYkxMWaoudB70EVwg4IAjziDzMI-8Npjcz6_vj_dyhKkn9MTCD9qrcgFRrzdkCM1gaXXmH3pip3CvVVuSAKECupXoEvaJmEBmhlE8CzZEHDrTxMZYSrbQCBlY4yu9JbA4p-PZL5aBiUvXWWub9udqiBIOQ77_EBgAm6NNdHE7vWVmL_SmdD4fwoVq5DdhSu1CKEStipHKY7GKzZycCQodSiRJBWZMnmxASVjS_wBa6LtEIcRQl0giNbM2LJo4rmCNMNqDEWhjQnNcGU4GN9t-r2kHOHKMaff6cmiSeVwYEpZghAFmbAoAvbzDy1YW6Xur7rA4WjXaTzae6WlASHtehV4UVk8aC01RBaIbISR0JOR5b-a_IXCeIqitKyaLj8_RVmqYH5-90hdVgRgxnViK6C0at9908T3-DUjMkAqNBIwtWY8yDY5JmQYq-0-T84mQSB--TIORClr19VsOun343N6J-zanbQET_R7oCm9t6w-YGLgTKDEaevvRlPaM9th3QWnw9N0Mp5HUCdCVhxvuJ8uyEfdZxo7Dv7fbHLu-OlXzA7anm7nadAvGiQOxpbsKV1A6PLyRQlVTD1TQeH917l0i8q6b5Hsc9oP2LrlHru9dRTRbiEYexH3ftE6FyOkqP7Y-Dev7uw4YUfzJwM4gvQzfHx8EDMxcI2Es86EbQDf-32zROEfntKB7hV5IksJWx3O32_Q161OGcjccVe0JOthd81q6YXtNur8N1TY163EsvO3S-2mK4rvbKaF4yWWVGuNqozG1W4jIQgUJTj-Iw81dXTRiAr80snmxIU-UETqL2DbKsaUjW8xXKPmxbxwAhDTidwZYifZXf2iD47-6itd31O5M387ERdlz9AUKPOg0Vjgcp0eYOGfa8QtzovYEuGRp3twgjrS5aKEvE9_-53dDMK59iWeP4GjdPyNJDinSAUQxnngo7TxqL3hBOZq3mktE936XRQzfAQ1v8EicS_cEDOc2czmjBIVgPuA2FVa8ciGdpXXxsjgowmZy80B9axMjRT89h13mr2Kn9Xhi53IRdRQhQc7rgYkDHC3_cbogO7Auty-ZyRuMmShZMJoETbWf8U6p3KpsXOTZ5nyRum7hcQu9lQGRwsxY0LtbLS7zib2vO8fn7C1z7iqi-xt8c_UQXsAvuGr7TQsMTfA5z3Gf4sDKHV3Ok1pyPzs7rEYr1yoUndTTAiBP-5s3oLQyY4cXEVtnbFAYDXGwOPxxWI_JByaqFf2eXctHxyTkv8RAfB_RExwPcU-op2sWtHAfwSI70jnbf_N9_4DIiEA==))
+- [Device-ref APIs for individual operations](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzNWXtvGzcS_ypTFe1JsZ4G0gJ6GDWS5iBcLwkStzggDjbULmURXu3ukVzJqqDv3pnhch-yEsu9f84BIu2SnOdvXtS-ZaQxKk1Ma_xp31JRazzqtmKR3OXiTrbGrTCPRKvbMmmuQ3oevLhN4AV8fP_6P703Kpav0myn1d3K3sgHO4byEdphBy6Hl8Me_vdTF97-MX89v4ZX7z68f_fh-mb-7i38CNdv3sx_m1_f_PqxD9dxDHzSgJZG6o2M-hWr31QoEyN780gmVi2V1GO4zkS4kr3L_pD2DW6T2-R7lYRxHkmYhnmYDowVVoXBWmT9MF9dHe-IBO6IBss8CS2aQMRXJ9dtnsWysWRXOjd2EMkNihVsZGhT3V-d2iIfZJgT8SBLYxXuTu9SVmqBNAZ_qizwD6e3GvnfXCah7D9SZy1s80SIwkdy2XinUmO1FOvGy1itlTVMb_DC-feXJfoWCgW1XAbyQazRDGhHt77QSi7htVwjdCzKKw3kBiED6RLsyh8Fo5DB9fu5gWWqQSWR2qgoFzGkGWlJwINY3UtcQp_bwRK3sNuZy_zr-wWSTu5ifxCQOp2FUCSwkIC7keFaRrjuZQlTlGWjBMnH5G9bFUBIydsW2F0mTSXAL0lqJdyslIHCAKCcKlGpOcoEWa6zFCMJ0iTe9WFuaRueRe5WJhGKYVMwq3TLtlmjE5h8IaVILGzFjvZEKe_wzER8l2plV-tSpEHDS84LczaBgXu5M3hcWMiEMUzIZDKkcIkg0zJSITqKTGIdGwqMSlebCS3W8G-RwQ2awXsSN3kLoo2kJvQ1DvxL7uaIWRQjy1HjAr6wXaFFYCPiXAZkVrR_skE51QIVQwGQz3iMIvNig-AfdOYskmjlU1RR5ExGjwm_9zaA3xOhd5VNKiPwxk8q-QwFKOCDV7puEDbhdqXCVQFAA1uFGawOvWOCpOtC3iEgb5AKf0sQw56sxqTLPJwb04LwMRWn_Tl0eKcBhEIaKnb8FqEEErMm8fg6iyRfBywE0bepxfDDVwv0h5dOYKQ58sdnyaTH1gV0R6xcEHjufXiHoXIKsjWgFiZlHk5UXxQKjmlunbh-9esimzwMsdQt8xjZ-u1FRFmJ0UaCTgkyiVhLwlEXyqcC4rU3JUZr70p4YSoNgrs4XYg4CGCTqgiTU4ybEZSOdZuirEBYF6V44s-HWAmhM85UUVSDzBnnsGqMx0b9iSFWIuGMY1VskQPPOIAh9KLhu85tsqdjIqf0hDabIR6wWEXz6KH_ABewiNPw3j28cA-v1br_MKGU2JQ7TPOENJ_BcEJrGKmYHtpEdFoq1YG9k3IwcGAsSsm3MOkOqCW06VW79McnJP25U1JkmpyKCppa2lxj7fpidS6_EAHFNYKIL5U2FhVGBNHjndrIhAN0K0yNXAlxCr4vSxEbR4jO0G4Rk612WDuUcdAGL2sBtH6BPeqNxuNMKL1vKtCtQ4XfHOo6AVxcFJadsEiv6KEWaCdjjO3pSRzcl-KD_HExgzutIvbksVt5I30gr9-ziMDloso5mFg-4oKFYq3C6yhq17HV9ZDoINnDiRr6JtU1x6_EhloMbKk4wfu038XvoZZr7EHZdUojWY3tapZip4IpmM0Hix32AfL_qLLWUubZZQ3bTDTMt8vas0saEd3VCTxZap6ZoU9k3tJlgatYjdR7IrOeTID_Q246I_vMqyjm6DUNzHFf6xMItrclDooururxXF3Fd3qrECHKlhz8cer4sCFtd9wKq7PEyCCFfJYgfseZbVIlPrf9u2o_02umvkcKdYu4FC4zFB7hTbX-hB3kybBshNRZlX9oJhuPHSni3UBDo-_rFnudlwIT4gARuGC72rMKvSsjMXCiw8TTZ-UlhnwgMH2MPIk1tvp6F6Q6khqZxuIBa9Xk-YmM0w5GGBpOJW3CpkdVTrMMQRFJzSgIJ9VbLuPl2yIZ_rrO7A5MnCJUhKb0kdHQnJARMfv4AZomHJqXExnjbOPg36dQ8-nD0FCSxxEFuJExDrJ4CLP4quDDyRCdtINEbigowzCnMQ52KX9SWsK0LCjXsfwhDUXyIdMgSURCeuBFYBvPoDdi7Zxex_tdUitPFLsLad7WM8PA5VqqYpxaFrLe1R11A55JmW5m8HL4j-FwWBF_hTixPFcWE_aJZhf2-2F3eOjCftQd4Ue_34e96qoDw8BN6ONx41pgila5KiRj1u0yAUzqhzzXdm1rnwOw3enWz7tw68Kweb7JlI1bsi3y3nmMC5Qcsy5e15l7w6VrhAG6UmQiVAjLhTCIIpyKBRr5B4hTge2vILnKDFp5hFYDt0rdWv_l5KT3KuoztxhKFZcawaBOpyEbzeh5SGHCBY4noNuWp4ZR4YLIxVpvxM6mD9eaMShraPPA5CsCpwpRnYFrqarrhL3n8GQj7E6W0bJ_HDeHZ9FgQfenoukcOpTv2L6ICiyhNmX87s8VIUY-QgeZThdozymnUHofyaXIYxushFkF_r6NSSPtQ-Wvf0qLjkrSpJduqZHowjq3gtoafapd4fSEJSXdmnIMR5dw245p0PnM33YULO6lpnTo3VfAm-sMV0f8VjTIbqmGpmrE4aYorc0MsujZTUXYBPxyBp8-Q1CUniBo8yLu7EDvChZpGsO-qM5ARRd-gMsOzGhwgZphrlFJ5mwQ4HTNRndQZRNctUyP2uHT-QFtctWYvdojr-dRfHIZCygUUZPLlz9Nmnu45LnlIr1XQXlRP9yDUQfDtHrDhI6m4ul0WtLr1vZeXV21K0edMVs2_k5l1L9H4ig3PpPIM4bpJnOHpL_Drrw0oSLd7vTvpMVWrT4wI4YsTKeYE98270v80TEu0YY6uU_Dz_TKJYokir8ewE_HLXe3tdvdZ8YvHT8ZvbTgNT0eAb6FM0-wexI3UC-ihUQfpMVJacPNjOXREFVF7VhdMoWsdWtVY_9Ey0DEsE_E2Ci7hpr5zyj-FYFa_X9EwhnNKRCg0O0m30rxY3J-pZE3-KcS_gXDd-1exLW4l0H95412rdjwsf1zOR-cBjRuME2EGPWoZHmydeUObuBwml3uHPK-0HKfku0FjCjX8jMT_0KXMiLeCppXdS6rOo89NVYwN_exRsgnSJftpg-eDtLKRM_Zi5Ieue_p0yfqDufsHx3dWgE6I7MUJarmNMwl0-FVu6BVWPJofeTXJ0-yOJTBijOmMzbOlMdJ6qO7YfoOboRGBuUdt6Y7Osoi9fGSLouRZmvir5EKJYbuDqjVbYXYu-JsrqtfP1vJJgxHly_zES6nmXU_jbZ6KMcsvLgY_Qw9ocPVzKyDn4fQ62GRtPif-5WnF4v1gn8vjdWiRjMMwxhfIgbpp1Z8gdBK7luHrl_HjNVYR6-1Dp_5318W0dhz))
+- [Custom data types, key equality operators and hash functions](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/custom_type_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJytVwtv2zYQ_is3DWvlVpLtDFsLxzZgtAtgoGiLJhsG1IVCU5RFRCI1kXKTCf7vO1IPy4-mKTAbMCzy-N3ruzuqchRTikuhnMnnyuGRMxl7TkrEpiQb5kwcWkbE8Rwly4Ka5-GLlYAXcP3x7d_-FU_ZG5k_FHyT6Bt2ryfQPYJLB3Axuhj7-PO7B-__Wr5dLuDNh08fP3xa3Cw_vIdnsLi6Wr5bLm7-uA5gkaZgTyoomGLFlkXBXtU7TplQzF9GTGgec1ZMYJETmjD_IhgZueFKrMTPXNC0jBhMaUnlUGmiOQ0zkge0TObHEhEZxqWgGt0n6fxkj2tWEC2Lgx2dFKXSw4ht0aJwyygKBMk5kVRuOCXp-U1dEKFiWWTBsVlcKl0wktnl4RD-xFj4EYu5YBHcsQfQDzlbCRQqqQaKYDILcT0061BhKIAL_etFqIFc9p_WlwYRIAwTVBGG-KfxIjyGcQdQ7Z4q2-LfD2ACpLrfebDGX4uwuzznxZakJTvrh90540l84In6vid7oKf40pM-8Ca23qjHvanBICEqAcx3StbpiV92s6qt6JSXrS6Z10RzB-5xPilWpn4Gd4P6HwjJ7inLNVRYJbosBNwF5BKMZY9aZ4jD_ilJ-k0Tjcpa4tjOtZTpE2xME-Wd8LHZKxJ17IFRYjVB6wkCBARmMyMd1Nztgo6hgoxw4W4ljwYrYU9aQHafF6B0NJko_i8mEUSZhTnhhYIZvB49H41GDV0wNNdMA8t0_gDK9BHBUmV2SKllYx7Lcv1g7W8l0MDZsV-VP95dnj1ZU6k7OzulWHO2segN1rpmQAS07QZkjEzPS22SNqxrxfrT6bNP4ZptuLAKIjKZZOQO4duuErZgbh3hngyVpbFt04lMGxrO3dHA64vnhaQp4VlY58cab_sqbqEF06OYeKeuzueNfoDPX3qUcq0bfLBn8R62Og41351BxtUd0n4w6EVStowmSJUcvnKdwHg08pABoFKJg6VU6DjohMGGb5moU9YLc0eKAN5LzApKNuCU4LDhKMwVUOwjePhOyK8G7itDVTi8OM6nQiPlrEIExXLAXJjUppJEEBPaZPf16JegS6Yxddb4v59XVb2AMxVNmvbo7RmXDKnn1c5rg_utTwPSUro6JfePYdgoVeeI_hScwzbzZPNTxCdFiGxcY7inY6_fVDEKvWJa2hSoNgd1F0B6S5tzE-n1Q48ENY7t3MzkKWpXrIEm2_tmCeZ4UOfY7RWgd1CNL_fdp8fMTwyNj0psw_X5epDv67leNaHBnnVSsGeK-gfL-XtRfqTYD0pxX82Pf75b68cF3q_k-oI0mRzcsKZmBs1No9XEjDX3XJjfMgxBhtvAY8DE2RwfRBzzKWDNsCxLTPYBFxTJWJ8JLQUa7PaeCETBbY15G8AS9djRettL4Wf-5RYiyZR4jkPhnius2dvOctw1Iy4mqWK3QcurZlu5PRzvgBc9Znn7OASWdq4NnrXzJsEGZdtRTHgKkblnGYKZEYWWYLXWFxXjYncnCJrD_5clDdyia4pt-EnB9ieOxicmLOz2sCO2PDDrMm7n2LG6vgVMRGbhDPuaW8h6AP68vs50ZFwb7tW3yxjcAyMMZW3nxRrTMJ3CyrkuKcX3pZ_gyjLIkMz2QRWs0G3n0lxYDFYDbm4euILvT1RmOb4tFfvXLEdsKR1f_FaOcVvmun4Hc3zUOKMvX45fgU8KmsxUFr4age_jPUf7dh5ELPJTkq3ti1nK1z1MSmmKi1tUhHi4gANR3Dk7r93Hjnqwj3Fydl_s9z99O9MX))
+- [Key histogram](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/count_by_key_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVWYtuG7kV_RVWxbajWA_b22QL2RLW6ySt0G0SxN6igG3MUhzKIjwP7ZBjWyv433suOZyhxnK8TQBbGpL3fc89HG97Wmqtilz3Jlfbnkp6k6NBL-X5bcVvZW_SE1XCe4OeLqpS0Pfxm-ucvWEXX97_d_hRpfK8WG9Kdbsyl_LRTFjzlUWiz44Pj78f4se7Afv0n_n7-Rk7__z1y-evZ5fzz5_YX9jZx4_zn-dnlx8uRuwsTZk9qVkptSzvZTJqVf2shMy1HM4TmRu1VLKcsLM1Fys5PB4d0r7xdX6d_1nlIq0SyU5FJYqxNtwoEWd8PRLVatbdsRgv0kLcuZ9xKZNKyHpjuC3hY2VkyU1RPl_RJhljJVNi_9qyyoVBfHm6s25WZaXNOJH3cCy-lwLCR6t9W0zJc70symz0zIGMm46t0JjI5bNnKjc7z1ShTSl5tvMwVZky2uoYv3FZ_nGJDDNRVLmJF5v4Tm5i-cizdUphcjsWpZJL9l5mKCGYaqRmlUbpsGLJzEoy5yHTCirOvsw1gytM5Ym6V0nFU1asKbJUgCxVdxJLyL0ZL7EFn60OEiOK3KDASCp3Bg0XmyEMagUMmBrJkZXP2UppU9yWPGPFvSwZNmpbTVbg_GX1HJbmt6m3g0GYNUXwnC0kw25KhSTbvGuigGv3ipOdVvx1r607VNXyusfMZi0DA37MCyPZJYxkdTyZcpFJmkDCJrauynWBBmVFnm5GbG5oG85Cu5F5AjNMwfSqeLAxypBVK762kueGPfAN7UkKu8Mr4-ltUSqzyhqTxjtpd0md2xBoGzzGKQgUd81IX7GEASQTCRCiopRaDSpfV4Zp-VslczRT67FZc8rGT9RqF-p3yc5_eX_GbOch5L_LnV3_5mt2iZD5IkIgfbQRT1mS7J0D_5KbOVoUJpN6363sYYXosXueVjKmFFAZoRyMWiAICAv0TCZU1bS4I_CXXMEFK_NzZb4tFDnpyK2Qn3d_i03rvpV6pfIbVhcF--odCZ3EuQIKlFjVBajZgwIwhqXXFUj2L-QtEnAJKfZTjhr2YgEfrhttGiHeCe5KyasstjtIiCkMegOPFvDfH6UKsF7r8GxRGXe4shF7WUaCjgTWGCfMGeGcQe0ZiboEeACaXOTaQhnY5sl5Jildwbc658GTNmlAsTi-TYsFT-OY3Rcq2UGxiAqsTsQAJnzrny8tMvu1vT7vTTRfOxCUWSeG_et8S4crwiMXja92QLEpw-SaTIJHp17voA3b7IROx7FecQw2BKGJUnBwMrlE4C9Q1YTYlIRYuy8nhAeMeX8EgRJLi4I2lITlU3aL3-9VNnpEMTRqT8JTKnns-DsNAOCN6_558ggRB6hVTKTEfquVN9F0SzsVNmWHVhV6BS0XkabTJup9tnVxH489jtOksM3lO-0B8OdHCZXnkTvBK-y50mmBWCod5_KBJN5AX10uIycwRjfENBkiIhqTyZqrcku6r2DKzYAdPfVPnES1hHmNpMY0a9xSlQirBdAdKMBGv-u57wcHteQnJlMgUSjQuolWTenQxoMy-Tuc4ZsoZQb-5Lz2x6zLhEhUWAmfTBydIWdtYX1_TIXllmprtMDcjB0iz7YUreFMSxRJ8nTixVKsltKIVcyTJDryEjIMuHITF2UiS6hI-aNMfKie6oghmQfTsNrs-pOrCngpigyILANw0ZUQ4LHLKk03DbYwxNyhDU1WCbLoKq6WQnjmXOV0Clayuj7AG_LEAdhOHTqeuFuGQTdFYQP1RxdVFj3PnvOViiIoeDZFPTelsTcLrr1fzoJtx1BR5BPxxhHJyaTkD_G6IOpQxoJrE3Uhx-ehKyrI47MQvJ5X5M2mDopRiSqPCI49vCEPn4gLmRU3NirEBYplBNTtH9Sfz6la-_3Z3yk5dUWrXGVVhiL7rVLAN8cmeClWGNPCVKWdyjqLfzhsQRQyLQT5oj5pl6yK3aXaug_Z2mwYlTjaqiT-sabrSU71tdg0VxUifXQzyWUKuufG5IjmoKcKmnhalSY0yrVMYSQOoWxXtR4bAMunckmMtWFVm8L-JgqScMOJUllPLCTLxzUqm0y05NybUGNtTUMp16c4MouGRy4lzt2uBEdpGhm75-0RL8FnbpcgoHsWMpzsDlpaNQ3HmLK3h389PHQQDkH_bBil7dKQKrhAaA9lDV2mgOxRQVFIqnWKpqarCBRZHbUnXJNtUdQY8l3nQN924p6pfd37CAwxAWMftO5kaC9ynW4V2nJAVEbHEthve4OitIYdkLhPC_mI7kIpSG1G1z0fbd_DOxdGm9Q64K7nmwnoI3sOpDD2WlNTcp-tEfvwPNYrrrt24xaxwQ_0v7vANJY099IoRK2M38nYjhe0Vew5s6u-w_7gj24NfBoRCkR9fzZcsVw38itXN6A7dXziyNaF6tPco27ZolMBC_nznlAogrYgxt2C6J-wp6Dkz1IAIEW0hnk7WhoS0Q4kh5A20i-nz-P6rEv-orDLzutpJ_iaCwUwWnAN7MD1kKONvsOc5AlbcpK4pyFoNXarRJpGb1vBc0c2WqMBS0QPNGHnXV485FS1PLnnqJsBe5D2FlwB0ag-oYSnorKs3ZMMb6JruWQyodw19JGcbFRM2YsxD12nu3AlCHtb1rbHYJrXidR2FATxGDUBocPEb4irtbfzbWjSa1w9DOWre52mBpm3zzH66f-SYbF5uw-n_4gcajebD4AAbkSmsKW__aMmpNDDy3hdFgu06qnlcvQ8kUtepSYGbKxi_6LLiobspzaN_5AG-cuLfIiagoQBENNwwsly3yXYjkJwsuJBs187dPvX9o2NR9JaCSDXBqal-XeypHEclEDsaC69D8Snmrp3NPjO6_SRIz5UzxBw_Pbdye4ex5nssv03DTDlIDw8ZEd9VHz7xAoKL6en7drM5ef09LQRPwiOzmazyN9i9wJjew_tIsyIuETUD2DmqwTVBvVwr9qoqehdW5o6jEDuZMCE2ovFK8MJ_IgqpBlOgQlXhzduTO0_7giHF-BePb0owmXUORDD6CjQ20ZjR5Z_HCLtSoo7YqG7sOiO1e8t6F0PLmuiQz6aSMfCCpl2Aw5TiVt8Y9IEwGxnoXSvLikFtQX1-zf7IkaWarkJWCNx0_2WuVONXT7akBuDXLsK2xuZbsAkbrt4uDtnAyrpNNmRuyiKtL2Y1qPXjUkE4Rnc06ZmytItoBPN9uWje4CrkpsveGjQHiBOF-4G-KdrCOmd-MtirZmIJp70Bj26OqpUlu2fO3r5vRBHx2-rIywXa-P-FtIbQv5UHBwc_cCGdK-Y2ssEGw6BBgY_3PvXYcqzhf0DSaoWgUwhRIqHyBL9bQUPMMXyu97TwK8DeXbWEc_e0439_z-baMmG))
+- [Pre-allocated memory](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/preallocated_memory_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJylWI1u2zYQfpWbBmxyaju2u7aDYhvLkgUztv6gSYcNyyDQFBURkUiNpJJ4Rt59R1KSZcfOts5FHZu6--7u493x6HWgmdZcCh1Ev68DngTRuB_kRNxU5IYFUUCrhAT9QMtKUfv9-OhawBFcfjj_dXDBc3Ymy5XiN5m5Yg8mgvYrhLQHk9Hk1QDfXvfh3S-L88UpnL3_-OH9x9Orxft38BWcXlwsfl6cXv1wOYTTPAenqUExzdQdS4YbUz9zyoRmg0XChOEpZyqC05LQjA0mw5GVO74W1-JLLmheJQymtKLyWBtiOI0LUg5plc13JRKCEskxUYqs5nsf5bzgRu8qSlkyhch3LL5Rsir18Ak2KnO5hcmlNoqRwkkeH3kav0uRQihxPc8lJYYlccEKqVYxeyBFmTP02wsuFWcpnONDgTgoqaHSuEUgU9iECffcZBZv0AJCwu6QPPC4jlKHeJVxDbUV0Jm814BvYCTiMiBPQLdgwGTEAAK0ZhwmrlFZlDYmwws29EYoEbBkFjatckilwhXMOrjPmGKwkhXcE2GsZXInOTq8EqTgtDblgb0ZzFNAdVQUcC_VLRc33jkvOqCeHC4wbCbuuJKiwHzRm6i_E9Kw7djxo_Upaam1VspKldI6KUW-GsLCBYu6wIVhIkF8dFc7wjIkBffWwWNeIFZhw7knKyuTSCfRGCP5jVTocTFsc_b4GL4nGuM1q5Lpa1FpG9YvJK8YzKBCgy8nsTlpHvzEVgD4ANdPavVLWxOC5XBnlXw4rCjNCnQuDUJaHccNeyjrR_EtW8W6UQQHORgjoje8K-2QN_IzsCUSRZjmUSSqgilMFV8sUwcwj6KCi7DXuPgW0wgxU35TeYavhdPV_C8Wm445SrCqObo-g_Fo9PVoNGogrpAe5I-73HFZlDMiGP6VCWvYKZVc4t9YY2coENnqWGepjKIcXScqrkWm4369nrCUVLmJM6KzOK0Etf5NkbP5vGVdG6mw2jxg_WpwlxW9ZSauRaZ-sSRcWYy-38l5H8ZP0RRLW8SZ23_MfLZlLIoaoVYbS3JLs-vLpmqtiHMAE-2_vpzLn6Pos8Jk2NAS3APsk7HvG58P5tKE_VmRPDbS7crnYO3Ji8-B2d24eZOcHw633GsR1yTEMZAKe8Im27GseIK9HnuKgZl1yG9jQW5Z3H043RdAu-c-8cbzeehXah1fXP22pubrR1-QHYc6JLtzcPokC5tYo8g3AW-669zQPQh7cxtAo-bQTrZsYcvCwq1EElN8x4BhdAJgS1sRegvYR5ZYznigccMK7UUhtKV-hw0m5f4E6NWU_8hybLfQFKxtthTzDtu7PbPQazxdBO5CqmSxcyTWPm45t1VVHsiWUYjm1t24WpnOwnofG_1tKoYJMSTsPZ5YMMVMpcSWzWbrmua8ftqmHw-mbFfXmV_va9vP6e8vtfVhlT0J-Yy0d9CaibvdYXqwYTxnusO8zefHrYnKD0oLwQ3HTfmLueP3wPa7EziOb3K5xJhjcOMHR1WkXSFh7ea7srVp1bxmWyly0sq40oYlWrq1Mk8mRRsr1w0HTq4-JF0hdNyunQTf89F58EoaHXQxOWWrZ8db3iqGbt275D4O9UrQ8DBROGsbwDQbuGQBe3BpCHEBBnO7fjTpHWTK6v4TV4eoqrVxE1HExqAYJlQSe8qk0nVFeLkOST_g2F-TUYPYMY3txNDasZHMavlF8jB8gBeeGPfF-bNxZeg_hptD3DLRdyBHMOkdovECPQeC_12nWtWImGs7xB5gMrWBP8vjIRad5j9yaKUOMJhLeYt3ibKhcIs3Z_hZ6pwoXthwgELRxpuh_WCZ6xg9cz1fV5TijdPdBFAGM01ILE88GlKQlSkr03M7kkJYo37RgcXRO-z1YO07Q207bcdRDBkvDm7yQcD-4XFkvu6cQ74l26aMfjNDs5gkSThu1OsLmVQJUwidkweW-A14rHPBnmsFseNuvXV2JjeshHH0bxtRt-tMp3Y2HU--neOB7i2dfTp7H599Oj-Nrz7-Flq_zl0cl1jaGd5ybN33Olw765OoqW4ti93y0J28b81O-vBy8j-tvoyeFIMNvC2I1ngn53dNNxmTMWyjPg00DPASVTLqLoqps4A98fU3Ni7MoolPTI0l-XLStEqfSrg7GV7Q4s6WHwjvLStoubrAgeFyVSxlHn61q9iHrS92wpJpiCZ6vd5JY837yTZjzsR5Vc860pC8M-s491t2LGt_VkibvVE3hbDrBMxmOzbaknBHOC4ZmE7hOrj01RY5rpwlglduB3UdWBF_5Isk9wkNLMfL_36sC8LzvUre0Xqksde1x6Af1L8DqM3vSoG4o3Q8eVWN8bEsjf_RKRgg2oy-eDF-AwOiaDbTRfxmBIMBRmgGbqTC6_YgJ8XS_RKV82UHk1Ka4yImmv0RCxeMqsRt8NhvnmP723qO9R88_uH-_Q1cSF30))
+- [Heterogeneous Lookup](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_map/heterogeneous_lookup_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy1WG1z27gR_is76jQn2Xp3fLnIslqf40w8dc-p7fY6E2doiARNnCmQR4B2VI3627tYgC-SKOe-1HcTSQT27dlnFwuuWoorJRKpWpMvq5YIWpNRtxUz-ZizR96atPw8YK1uSyV55pvfg4N7CQdw-_nDv3sfRczPk3SZicdI3_FvegLlT2j7HRgPx8c9_OfHLvzyr8sPl2dwfn3z-frm7O7y-hd4A2cfP15eXZ7dXdz24SyOgSQVZFzx7JkH_crUlfC5VLx3GXCpRSh4NoGzlPkR7437Q7NvcC_v5Z-E9OM84DD1cz8ZKM208L0FS_t-Hs22dwRsEObS1xg-i2c7a0LzjOkk211ROhjoPI35xpKOslzpQcA1E_EgYy9exkOecelzz2dK96Pm7c8Ym_fMfTTVvCVKlK5vqG8RuJZxtqDHgwObnb-GmBmIOAaQPHLJk1x5cZI85anHv7EFOo54mJ129zwTPIQPfIE00BgyVxAlL6ATSHkWJtliUxVYVQpehI7gwSA9mVRQP_RLzXeRUOAsQrChv0FhF14i4UfA4jh5UbBM8roLG0YZPPElmdDLlIOOmAY0FYiQANcQZskCH3PwE4npkDz7QRkZ2t8lJUmuIWLPQj4aM6HIlDa70cPc18AkqU_mvyHukIR7lVXRXkpYMLmElyR7CikEI2OcZ6UGlFKQKx5grFyCQE5n2rggJDrB0CEVgWZzgxcFo8pQyIbTVgTMnpFqtBt__57zDH0SC97fRF4hcbiytpkqMpYykU3RbNfYnj2Q-oynpvgkufTQxm8qyTwRdMGPmJQ87jzAHHFzSamoEIgMcYqXGJsRPerxmC9MIqhMFClv0tclf5E8ixRVF2mRnAcuL1VG0EueLXABCVSP4cElSVWZ-NTALgMXlwarAOZL8LGwEFfCm8kA-O85i4VeAnWEJFMWY59JSFLTBzgklhL3LT9ZpMh2VHXfKnmgDOi8Ek8komG8FwHPLBOIYvolAQeO6lqum1DniY4soSOXsGAzSOOkzfADYfpgrRqMCJnCSywwqVJmqgAdoNDCUPiCfvfLTmnzZA15JoZTaKLFCcBgAH9zMVrmYuYL4iZyAk0sKfSnWTLnVj1aBtM8TasIJhOKobTzujEKG9U12qozqDD7zOKce6TkFLAUmT6h9jjAJufHiI1Nbm0bkmMu9ItQpsgxuxkVFSrzuVUAQcKV_IFaBromBTrliEeKy8phBhUk_Pk_z6-9DxfnV2c3F97Pl3e_Xt5eeOfXf_98dnP289VFuzLeKZzbpK2hJjHH0ZCoamhSSxTll6B0bCgqCIn3jM0DXemTakNNzbEbGIq4Biu0IQ_zfZ6afrcsqWxZ8w2Z5Os9zEWtriw3Txnn9Mpku7Q3NUolW3CT25lZ8jx37HlAbFDiP4iFq7Qka3fahgVU-2-MWx373YiSagCWF83hDWIfAibanpaTye7J2zYqTrYFsVv_huw6rdPykevpcNZG8Y5l46_YzBWxkKA3oPctHAYkt50y0NnVL2ST_tH39CuO8kFpYLRpIOM6zyS4A9eEN61hOGvbqA5gdDSCQ-uDjX19L9fNVNtufhXpbDHw_xvlUP9cSKoZc0SWzZSsFMaRgmi3JCFp_x4RUZNHYe3l4tWn2y6Uv24-3W4zc54kcZ2SKFAwLo6wd99Uv7NIvU7RmIf6OxxFnbscfWNn4tcls0rSkaO9S2njQQdOG9luTHQ6hLnh5LnD3SJeIG0NuL9tA6P9BkalgRMSrRlwRK9bKEmKBwIWqJBtpD0BSnjwb2m20TJkvvBQFidYhSC9JRgq-Gg7pl4v6RAq_05rJ9-qN-pCb7TeL0qtuhKtOjeK9oeh9ZcCw0tM4hPf0ffUzqr_PR7-GWcQhmcZoxG-tGO2nFpYt4folX2ATRiD26jvVT3iAxivuxuJqf6chiL4VfntD0lQkKva971Se-pu9R0zMc7RLPPMhIBH9hRz0HSSzFZNT1frdQF6URYb16hpld0Z0IchhyvLWuZHQzR7VDi6sfC2Cz81LIxHx10YNSwcDXFhaBcslZo9q8hjPKNf5NvRj_3jsAtvR_0xfozf9Uf4cXTU_6mkF1HGdGDlzfmjkOXBsmBPqNGMfWYm94pra7tgltnjJzkN9eXqalgEYTdgHnAyEgvPdhDycFqbCKtQu7UCmM3aRZK_OJQt3H1ysd1xm-2C_Vosfa312rapdtEpUlTrZN93YWXsfRFfC1P4dX1S6Fl3Og4-8xLATq3tGojdDUQP6-2kU5X1P2jubr7auLuYu4_jkcmCQNhXCtVkiq2Ux_Q-A9zJGO3MenuuIa_dI8wBmciidaLmplnc3jTtWWoCYI_YVZWuXzRqpzslbz99y4HesNfM5QiUS1q55MoK62Q8QpaRY244RpzILiZjW8hWFv5_9Pb4Dwu9f_8eawbrZTgsLC2EojyZLC6LatwfkDnkTSzuaq_aZVh903DbHXuy0iuk3S0ly6tHXAb2QbG92NR51Y_NvhBiuQavuBKKjeXX3CBV2z7QGZwuzZu2PNZ492H-k5nMzJsmGkZTpIrpF3WHa6-h6jyICptU4-77yT5Bi3dUouPO1AquvZJ1hCIblpWkry4w43u7Ph8I3DI8wY9p5aiD8wQOD6ueU5-57D0bJUsRbCq794eCn6e1eKqN5IVvJuPpFO5bV_YthJ2cXZ3iY7O4O5GRAx0rWFYyft8-UXeFR9vCVQ9qNDbe3N-B3qzZTruI9i-4TpCjvgl-dwWHsi4HACIstyO-20h0i7Zj56pT55jLqQHQTIGNIN7j81ZxmTEf7pQY4jN80urSuxkR4z2kfJ_dks--Pxof5yNcTlJtX3a3eqj61D88HL2DHsv86FQtvHdD6PVw8NM9GrwCHvRitpjTG_BYzGs6fd-P8aG78OADvIPIp9a6W6xjR91Yx2pvrb_Sf_8DNZcXFw==))
### `static_multimap`
`cuco::static_multimap` is a fixed-size hash table that supports storing equivalent keys. It uses double hashing by default and supports switching to linear probing. See the Doxygen documentation in `static_multimap.cuh` for more detailed information.
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_multimap/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVVgtv2zYQ_is3DUXlVJYfWFbEcQJ4qYcZK5whTlsUdSHQFG0TkUiVpOx6hv_7jqTkyIuBdQlggffid3cfj9wHmmnNpdDB4Ms-4Gkw6EVBRsSqJCsWDAJapiSIAi1LRe26czEXcAF3stgpvlobCGkL-t1-r40_v0Yw_Th5NxnB3f3DX_cPo8fJ_TS2Ds7pPadMaJZCKVKmwKwZjApC8VNpIvjIlEUD_bgLoTWYB5VuHrSuXZSdLCEnOxDSQKkZhuEaljxjwL5TVhjgAqjMi4wTQRlsuVm7rao4Dg58roLIhSFoT9CjwNWyaQnEHKHbv7UxxaDT2W63MXGwY6lWncwb6877yd14Ohu3EfrR7YPIsLyg2LeSK0x8sQNSIDJKFog3I1uQCshKMdQZaZFvFTdcrCLQcmm2RDEXJ-XaKL4ozUnxapyYf9MAy0cEFm40g8lsHsBvo9lkFrk4nyaPf9x_eIRPo4eH0fRxMp7B_QM2a_puYluFq99hNP0Mf06m7yJgWDrcin0vlM0CoXJbVpb6Gs4YO4GxlB6WLhjlS06hphGs5IYpgWlBwVTOPeEQZOriZDznhhgne5Gc26ozF3PxMxc0K1MGQ1pS2dHWhSZ5mRmekyKm5fr21MysValNh8pSmNgqX6hStsFdkg2jRqrzJtwwRVDrw2AKSS05b6-x1Qx5d15rFBEa65TH_wbLJTaQkdyJuTDITi7CjeRpay72WATkui3gE9slZlcw5OMN8sVcP6s2JCuZV9Yqqzx6sLwwu8QuNbOpsMzR-gbaPRel4e9NveBoXBlaU4q9MpYXoE06GGj-NzrCFE0uu6-73W5l1ungoEBLVVKD_Ya6Wf5Q9rrdCG1BZxK1Pod2z9LCfbSjgUNic-g4NFXUGpOOYSqNpyG1h5KjMR4HupZoAk9Cbm3UrR0DWYZF0UwZxOj2xaA6qgJa7uKhySRJYUksHewwuOy-il26SDjM8pRxw7qwUaNyt9i3wrULsBwX0I8q52Px9y_bcDg1ctH251pwOFSF9XQaDE4IPPRBCsLVeWy3YHU6nLYa_UHSYQEJ1MS1eTuzGMYMp5wtE6xtN7YSkzM493RcOY_jVRzBfo_1xBz2vaiHnziOASX9S0sELwa3qJSHZgLHAxH6mtXynDyx5MWRGyKrb8NuK_pxY5-KJWjYqv28bMFWeMJq2ZevkCRVOZOQlHYat2CPo9uUSsB_lXbP4RWEU-hAvxUBP1zDoVHkieMdngDkoNvcHk_pWIt0sUZ2gnl2hqfoKrBMpIj_OeKs2S0lF8yx2dYdbLl9F_q_vL66ujrUzaqbqdeyzFLs6YZBv26pvXsaeM4TrE791u2WGJksOQLzaV83_Wo2hU3D56ROpC63CLpNVq4ZfcJgxPi88B60M8fe1XjB_QjUhZTZ7bNPE6O7LbxC_w98x1i1WQMvPlv4cuf6e8S7RELaCw4cmdzEBFHmiZPjpKxxO-KGL6I3N6wQ4Bxl9aZ8CWEj2g34BKGaPW4sY2QDwyE-BWYlpXiF_wQjRIhPAhQ6e6_FW5djuzx0H7AucX27eh8XFcFk12d3GTfHRR_S0r10cLq4g6IjP2XxoWNIZolbA_EgPNHPbXTwKVdH0V4uKMFHqX3l4btPPb9dA7GhtNe_LHuoloXxD9ugjfFu6Js3vbfQJoqub3SevO1Cu41XmMEfg1uxtJ2RfOFeuxlfNGJSSjMUbvzTFAXYB_EUHKJaj7PhRI9MDA5f3f8_JDbX8g==))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_multimap/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVVoFq20gQ_ZU5Hb3KqSTL5nIlimMwbQKG4pQmlIO6iM1qbS2RdnXalVPX-N9vdley5dZwPQIOmnk782bm7Ug7TzGluBTKS77sPJ55ySjwCiLWDVkzL_FokxEv8JRsamqehxdLARfw8PH93-EdL9g7WW1rvs71I_umEzg8gk8HMI7HoxB__gpg8Xn-fj6Dd_efPt5_mj3O7xfwB8zu7uYf5rPH24cIZkUB9qSCmilWb1gWHVN94JQJxcJ5xoTmK87qBGYVoTkLx1FscMOlWIrfuaBFkzGY0IbKodJEc5qWTaF5SaqINvn0R1hGhlyzmmhZT_sendeN0kMqG6Gj_JwrYxtklW4YxbPnIYr90zBB2XmvrolQK1mX0Y-0uFS6ZqS0Zi40lIQLfyN5NliKHZYLjeJiDc9sm-ptxQDgBhB3fXRtSNEw5-xcxnk4wcpKb1PzqExLBSsAbJhwZKP0zjuoMxzALdBAKcpHs29VDUpnSaL4dzwIC4Rcxq_jOG5hwyHKA5F1Q3HIBLqxwAvXOYziOEAsqEKi19UQjoCIzP5ToPOWialhaNm0UTtOKoKF1MwiKUF1cARzBTSXCIFnIV9M1BeGGVFtHAVVa-Ro82JQFbQBcSaYGApJMlgRM16QKwS-imy5KC2s8lRbk66xQa9zU5xbZccF2I4LGAft4UPzdz-PYX8KstF250aw37eNdXJKkhNBTlyQivD6PLcpGJ_yF4PefFB02EACnXBN3RYWwS3D62baBLmZxovE4jReQBW1h2-jdRTAbof9xBp2o2CE_6IoArSML40QnBnsQ-vc9ws4XAjf9czcziQpyTNL7T3E6aXdZZ2gpqd-PAh-FerKMOL0B90pZ3tia7xdne3LV0jTtpWpTxotgQ9gh1tJN7WA_2rrjsMr8BcwhPEgAL6_hn2vwXOrOVQ_6s8mN1dTWsWiVAzI7CmnTP-UXUuWiQz5HyM-9CdVyydmlWx6DqbVbgLjP19fXV3tu0F1g1S5bIoM57lhMO7GiYz6fM6Lqyt9arOlWqYrjsRc2df9c52S_D7wWNSJ1dYWQNxXZM7oMwYj2tVFamb2jcZ9yLJfovokZTE9nulztO8E51D_g98hVgfr8f3Mar7a2vke-K5QkJnxWzHZbQmiKVNrxy3Z8bbC9X-K3k_YMsAdyrqkfAV-L9oNuAKh3Tt2JWNkDZMJLL2HhlJ84_9m37dLzxgt3nmhERzH5ai7gF2Lu3eoO2OjIpni-myW2_6qGEPWVAWnZrPYi6ICt2FBS00KI9yOiCPhhH4u0d6V3F5F82JBC36eUFlW-DFSH79iPLGhdDS-bEbolpV2nzheiPFu6Js3o7cQkprmN6pM38YQhvj60vijMRXLwoKUT_a7p-BPvZiU0gKNG0yE8dCAcxDP3j7o_LgbTvyoRG__1f79C7pWKuU=))
### `static_multiset`
`cuco::static_multiset` is a fixed-size container that supports storing equivalent keys. It uses double hashing by default and supports switching to linear probing. See the Doxygen documentation in `static_multiset.cuh` for more detailed information.
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_multiset/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVVwtv2zYQ_itXDUPs1s9gRQE3GeYlKWascIo4bVHUhUNTZ5uIJGokZdcL8t93R0q2nMfWJUBi844fv_vuQekusmit0pmNBl_vIhVHg34rSkS2LMQSo0Eki1hErcjqwkj-3n05zeAlnOl8a9Ry5aAhm3DcO_6lBeNPo_PREM4urz5cXg2vR5fjDvt6__dKYmYxhiKL0YBbIQxzIelfaWnBJzRMBI47PWiwwzQqbdOo-dajbHUBqdhCph0UFglGWVioBAG_S8wdqAykTvNEiUwibJRb-aNKHE8HvpQgeu4E-QvakdO3Rd0ThNtR55-Vc_mg291sNh3haXe0WXaT4Gy770dnF-PJRZuo77Z9zBJSFgz-VShDgc-3IHJiJsWc-CZiA9qAWBokm9PMfGOUU9myBVYv3EYY9Dixss6oeeEOxKt4Uvx1B5JPZCTccAKjyTSC34eT0aTlcT6Prv-4_HgNn4dXV8Px9ehiApdXlKzx-YhTRd_ewXD8Bf4cjc9bgCQdHYXfc8NREFXFsmIcNJwgHtBY6EDL5ijVQkmoKgiWeo0mo7AgR5OqUGtEMvY4iUqVE86vPQrOH9WdZtPsJ5XJpIgRTmQhddfyFjlLi8Qpi64ji9Wvh25uZQrrujGuCWq2Rum06bDTI5dFkUk-XyRP2xO9pJQ9Y7SUXKRK6zw8X2nKCYr0YJMP1nrP7stQJL_54l2R92xeJLcz_C5IZqSIgnluFC7gHFMSyBnhkGSyLGtZrg-UoMwzDCWeIWH4YWT3LXhN_mz1y0DlRdWSbKnw1jrU5MLo1KP6zZQi71Rw13J-Y81Z1JTGMmGJukW4UZQp426oRPwpNwapGnGNN74YYUeNGN_ids-HEqsyR52ossZaq7g5ze5onc7jY8h15rY5wikRdG9ZM4BuFy7S3G3BJtqFEAxygWLmQofxZ7Omz9OIF1WGCYmxFkmBtsMKUK2Gb2BXukhoE4mICRUIbbKFXJXnuJVwrAXNGorFgJayMNykNIL4f144iIUTHM6erOQ0cc8AMs8ZGyoeFEm7vw9kXKRzxg2q8AQgJkFL5N6g1MaDgVV_48zVcLMinfkNp_C6d9Tr9faIZzT4aAiA5AmlSKW5sOVIIN-fIdGCEim4FXiHKOjMPTBbZ8FK2L3O67dPktijnwajRJU0dqy6dZxmnRvXbyE5a8DV4EczSZygINCbCvWmTG0ognYfhPUV6eUMSlV6euV5HBDBwy44qfLx66767qoDWuWWXX7uHmfq_r5GnLqYNGXSodV3GbvrtaDfguMWdDotUPflhs94ZHjqMX8_1jmjgHRn8DZwGxpINOBhU7ZfxvP_qCbg8ZGf6DQ13K5hIMybweBgoNXiZMd6Fo79hbnbVpFveMA5Lqnnmq0Aj1nMn3u1bI08aUpVkoRYqQV1mAzCrjh_7LgbvyHGZ7EDlR1smFsiRahNBboIaQ7wzRekqitQdWpowSAgNSLDVBT-L51dVRaZCwXmwQ1rZJlTKpxclXPIcuXzowIl6sG5nWd6hHExnunCUUfO2Ebtsr-u2Pwj_CaUZB72PH1pstH-H6mF8tTc6DnaxhNcDmvjP2C8Es_jlEyvyqHvS-ZAvMNRA18P2M0o4hbMvsEpu9VyWF0i_1KwB0B7l0Pa1XrzmWlWnfMwV49YQvvpA0sJ1AIajWfATp-qh6a_X5_fUvVyswl3QZswbckNTk7oepsUkmrVvoB3BB7vWrUzJUKRj_YeMKHr7unt74RKXsBEp-h8qjY0--gBVGfLOkIIjkgWJgO-amiFXgb4EZueW8z-nSHK1lL2j18XfTLr3IUXiqhNp57KV6_6b6AtjFyd2nT2pgftNl05jv44UhbjdiLSuX_LSNS8himlTGhxHd4LaIFukOw2um9VdprkB3Yq5ej-m__9B3bofi8=))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/static_multiset/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyVVgtvGjkQ_ivTPd0FUt66XCUaqkNtIyFVaZVEdyeVamO8A2vFa1M_SDiU_35jLwtLEu56ikTAnvnm8zcPe5NYtFZoZZPh100ismTYbyWSqYVnC0yGCfcZS1qJ1d7w8Lt7OlVwCtdfPvzVvhAS3-vl2ohF7m7wwQ1h9xMavAmD3uDXNn381oLLPyYfJmN4__nqy-er8c3k8yX8AuOLi8mnyfjm43UHxlJC9LRg0KJZYdbZh_okOCqL7UmGyom5QDOE8ZLxHNuDTi_Ydadqqn4SikufIZxzz3XXOuYETwsvnbDoOtzn7w7NXG68dd0MVxQgXSF32nSC0TOTuVfckVBMvrwv9ULwY5sWv3tUHDtP4wttnUFWHDhJUQhno2X3tNT79zlpDTlZpzMv71J8YMVSIp2o3J4ZgXP4gAVl0hnm0IK3lEHQc3A5whMlYJoEmGkSIWH8ZWKj2BHshuzDblwGZghEyTUItdKczYjG3OgiokZnprJo5C1mMNcGMi3UAvQSiUeoLJDiDuFWUP6MuwVtYpRbg45Ir5BWFDDYUSPGd7je86HECuWgYEI1Vlpkzana0DrFC2HINHXrJcKICLq3QTOAbhc-Fku3Biu1K49gcBnKSjkiOVvvSoyECItCoSQxVkx6tJ2ggMXtL7C59pKcSESUVCDkZD3Pt3FczlzQYg2KzmJAc-4NUYG1jv-X3kHGHAvH2ZPlIU34sDSAgWcaNioedJJ2f3-QS1_MAm6pCjgdmJRaYhZsrMuGQyv-xtTVcJUv0ugwgrPeSa_X2yO-1wWxIhKMGkiQSjMWUhezcNb7GaRmlEgWWiF4ME8x98BhNy13CbvXOXv7Iok9-qjc5ChkY8eqW8dp1rmF-vU8ZA1CNdwLlwNJLJER6G2FertNbVkE7T4wGysyylkqVekZlQ_jgAgedsF5lY93u-rbVAFaW5ddfjbPM_X4WCNOXUyaBtJlq-8ytum1oN-CQQs6nRaIx63Dn3hCZbmIvUIClxkFpJEW3MDd00ACq-F-234KKUcnNQEHJ5AJS0S42zUMlPNmODwYaLVzBsN6FgbNt3W3inwjAs5wQT3XbJXwqLLwvVfL1iSSplTR7I6A1IK6nAzM5iF_wXA3fsszHsUuqexgy7nFCoTaVAC2oDnQCsJEqeoKVJ1atmApIDVigKko_F86u6r0ypUFFsFN0MgGTgVzPN_OIRsq3xE9StSTuJ0jPRJwMUu1d9SRadijdtlfV2H7R_hdU5LDsA_TlyYb-f9ILWyjLo2eoW28wOWwNv4DJipxHGfL9Go79GPJHIh3OGrg6wG7lE7cgvQbjIJZLYfVJfIvBXsAtDc5pF2tN49MsyrO01w9YwntlwNuJRBzaDSOgI1eqodmvF-Pu1S93GzCptSmnLZkBufndL1de061al_BBYFnu1btTIlQEk_7CCjpunvZ_YIJ-QqudYEupuqeZh_cG60WdYTycETSGwXhqqEVejVyumno3WL2j8tErTjvD858n7b10pUvz6RNUUf89ev-G2gzw_ORLdI3PWi36cpx9OFIWczakhWz-ByVYlbD5JxLWqTrN7xkaYFuEHWXPLaqfZrkB_tUysnjt_j3DzgV3SY=))
### `dynamic_map`
@@ -256,19 +251,20 @@ We plan to add many GPU-accelerated, concurrent data structures to `cuCollection
`cuco::hyperloglog` implements the well-established [HyperLogLog++ algorithm](https://static.googleusercontent.com/media/research.google.com/de//pubs/archive/40671.pdf) for approximating the count of distinct items in a multiset/stream.
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/hyperloglog/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyNVm1v4kYQ_isj9wvkwAbaKi2XRCUvvVp3IqfAXXQqFVl2B1jFXrv7Akmj_PfOrjExTVrVoES7M_vMM8_MLH6KDBojC2Wi4e9PkRTRsN-JMqZWjq0wGkbcCRZ1IlM4zf06OZopOIKLonzUcrW20OJtGPQGP3Rg_DW9TEdwcX3z-fpmNE2vx7H3Df6fJEdlUIBTAjXYNcKoZJz-7Swd-IraE4FB3IOWd5hFO9ssar8PKI-Fg5w9giosOIMEIw0sZYaADxxLC1IBL_Iyk0xxhK206xBqhxPowLcdSLGwjPwZnShptWx6ArN76v5ZW1sOk2S73cYs0I4LvUqyytkkn9KLq_HkqkvU98e-qIyUBY1_Oqkp8cUjsJKYcbYgvhnbQqGBrTSSzRae-VZLK9WqA6ZY2i3TGHCENFbLhbMH4tU8Kf-mA8nHFAk3mkA6mUVwPpqkk07AuU2nv11_mcLt6OZmNJ6mVxO4vqFijS9TXypa_Qqj8Tf4mI4vO4AkHYXCh1L7LIiq9LKiqDScIB7QWBYVLVMil0vJoe4gWBUb1IrSghJ1LqteI5Ii4GQyl5bZsPcquRAqmanvpOKZEwgn3PEiWT8SUlas6Btztz6bqaaLXWtnbCJwQyDzDXJb6Ng7vXIxVBmkNon_CcFzZg9PcGOFwOXBnixIdmR5OJwcVUX_JTTjmkzzhcvu5_jASDYknpV5oSUu4RJzSthqZpHSNl4mar87n91w2EjvjirpYaiQHhJGn1NTiyKVpS6WqrUppGjP1BPtE5YXegr_9pxSm1k_StTzRMBXFyi14dDIv3BuQbl8Li3mhjz7Lsvg5AQGP70HSBLofzj3mQJU8g2HBxKfTM8gnGztMfzMen86-wEV-mzhbm-9C31LatrqXBO5rkwrWOIFrijPdqdyjFEJv-g18G8RqDxSVU0p0ISJM5bajGkBnmlosnrKaRB18SDzahO1LvQOqRf3-oNB_-djP1kV2JK5zMKGZQ5935J0mmaiLJQwfnAZfD_4eA7mHi1fgxfSQzFHpiAyGEFqVrWtGc33jJ72AZ9f0kkVXQQsI6hAAUknolpxfNUkXvm9x5MRDZyREMCoilVJidArtP0iZkL8h9ztA1DfZGHaWY47cLbyd-lWUjR_ObPlktoiOJFWpN__DLZbwrtGKyYwaIS_YBl3me8lD85JTKlIKvtYwwf5m01dVaG2innzzGmDVO3RqqMFEF4468dgFk21Owg4pD1v2TP1Z16ecGY2U1d14LfOvs1qf9Q3pnd9hRyosYVpHVrCY_yFygnQ2BNROPq1OWu9GadN0r7l_DLB0IV-3Gu_HZ4aI9sppdE6raBHy2d6WfA_wXQP6pd3ikhtOO8PfnR9MhelrV44oi4BnfJ37_rH0GWar09NPj_uQbdLN5OlP5ZioOhmLF-Et5BMLhqYnPOMNjfVewNtWO3UffTcqe00Kgd2mrro-Y_w-Rvi8QMW))
-- [Device-ref APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/hyperloglog/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJydWQ1v2zgS_Ss8H_Ygp_5IclfswYmN8zbdrrG9pIjdLRb1QqYl2iYiSz6SiuMW-e_3hhRlybGL7jpFHEnD4Xy8eTNUvza00FpmqW70Pn9tyLjRu2g1Ep4uc74UjV4jymPeaDV0lquIrrtn05SdsTfZZqfkcmVYEDXZ5fnlv9r49brFbn8b3YyG7M3d_Ye7--FkdHfboQV20XsZiVSLmOVpLBQzK8GGGx7hq3jSYr8JRdawy845C0hg2iieTRvNK6tll-VszXcszQzLtYAaqdlCJoKJp0hsDJMpi7L1JpE8jQTbSrOyWxV6rDns90JJNjcc8hwrNrhaVCUZN6Xp9FkZs-l1u9vttsOt2Z1MLbuJE9bd96M3b2_Hb9swvVz2MU0QXqbE_3Kp4Ph8x_gGlkV8DnsTvmWZYnypBJ6ZjCzfKmlkumwxnS3Mlith9cRSGyXnuakFz9sJ_6sCCB9PEbjhmI3G0wb7aTgejVtWz6fR5Je7jxP2aXh_P7ydjN6O2d09knV7M6JU4epnNrz9nf06ur1pMYHQYSvxtFHkBUyVFFYRuxiOhaiZscicWXojIrmQEfMwYsvsUagUbrGNUGvpAAcjY6snkWtpuLH3Xjhnt-pO07_LNEryWLDrKI-y7moHTUm2xL9OlK8G07QuEvOuNnE3wq9YLAbVh2alcm26sXjEDuGjiEymOqtjIhppE8BQ51C_zBBtwdf2dvfM5fo_FoOFWiUWoXjiCJeAfe75XEmxYDdiDUeN4kbAXU3hAexm5FWvV3FrVqhqa4kthx9Gel9IE4J8oR5iFYWrbGujl2ZpO9vakMMUocgNZqD9yE5k7MzqjYCbuaCqcnAk_WuRGqoPBCRbswfkUSTYghu2gJy2u0VcxTLliTQ7JrSRa5tNpo3YuPrj6c5ukFlAbTP1kGQ8dmpgOdDhVcl0kxsWc8N95qepETAE7iGxCQcQ78ViAvNbzF2OaMnIIBlhCH_mPAlD9pjJ2FoYh87moFhF8Wj5NeANpQ2KzcS9npZfRGhY2pymX7E363bZRPFUA9dra9tBJAPrmssS0yAQ0aSo8UM5KzZPsujBSZHuXFNqcA_GElasYN_Kp3wtvIu9Xuk7aQntegtvPFkBgrG7FVr1gyuKljV8vOLEN2tgQ-3gXqYIaL5CrXTb7u7zlSlaKZ4MgsXCUNv1iKPby8ZnvoMZzmT9IEy0-vzHfsPJitQnSbYlx0CO8BYgzTaEBGwDfyNHF3NO1BrHjlMWLN7BY7CFrpmMteAOhN-AG4s9ENy1EMZqAdiWqcVmQa70t7aCVCOM55COqDAqon16wthFniTs-rrqW5TlqVHhF6GyQAmJXRVIz4QR1-baSuS4uYGIGQTVGDRtV2LAoVAm2G816B9kFxvZBWEpExRrHchrJidZtgmJ0WNCxRLfN3LdeUIF2dTZi6tyjYyfWP3Tr8j5RaP4CRevmMONvbo62NaB1KuIYIQArchHES5Vlm80gU7qsECelQ6aewy8wW3jknyArX0X1seASesPaqG8DCpZ0huefq1Gv0W11ikCS_jUQfO5YtEoRTdFwL8ctaq2bSdKBFeBdcrlxf7Z0bs0Kp3crojjAwr4NYiCfXWA2ofwH0yiYhG8s8BSC-INYb_c2jSMYyYwPjhJLDxhWdU2lEtA4hVFZ-77FzAN2wpL3ZDC2AD2KMj6gGf5Q41jZ6Rw1vEKqYABN06VZ-VPkHrRIyy1luR-jNid2jq7W15nY8sFs5p7M6tY5dggyWiqc3EZ3733U9nN_fC_II803srYIPNwein8Lnhe2EgjI_HcAkMVhh-XMeCYWJyoyVlKA2Luhw6aTvbmOY2-KJmtrlf9akladDyfgAgy_KlIR6KzYqMj8BM0p9lNbQMpltY4gMJTSlf4pONvVtEqF8xddoryBHeiOlm_z85LoBZEfWCIXmV5EtNkqrIneyvZUY5nab4OCSV61p2VJDQrVW0UOHERTBtvvSYKvCORH2JY_EOS5FOEpdGqUFDrwLOmD2dZsy6daWxzvBZqKY5Qx55bYIQDi2v-VdZZSdTZEgRGoxbJFHssCNjgDp0nFkEUVLuRC2FrH2uy7rk-hFSbdGvfsouRonLnLjenJpNiTPQx8DOKm80KPrPzyMOc1S9bLvzf8fEzjky_f42fgb5_hXeSZbnxk9NfHCNedKK_0IOyFNjlNG4sk2LQ8TWoazRRrxmrO5Q4fTwFTbTJWtUgz3tQHfajoN6PIFsm0DWkevqazT2Hlzpf9p6j1MJsfQXAO5O-xder_QoP0Jjo65UXoCJ2QmiOpU_V3am7nEEtNaum3__5qBl0C1EuGk6V3FxJHSc3Ouqhxkyu0mKQpsLzHL_Caeqwj7IK7-0Nfcl7BUV_m_vYGbC5VySunHPPRWVTPNdcpgFVpoewG9AnJ2HfJ9q52kuWRrrxpSb54sR1PRnYpdZVOl7XDyCedbHUj6qX_76ygb9499NBpRyQhd_zn5fhrz8VAXLH2V6vduSFDXYC0UG5X6WM3omUyq7WA-xLBrRu49ZVNfuTsh1SdGculghns-UEO6Byujg_PZjVDyH1UO4r76CS9tpopOIIlItaAavjOstR6riV1WmWJ1Ge-IH2yDQEzKvMnQznefLACqbKrIJqQuuIjsOKrtCuPIrxqilED3WnMOjBbj-NKUHjWN1RxykVLbf5eo5B5-SRy9LV_l0VwkjjOYqXvZkMi9OiS8FxCLr1VV_qg3kttImLau2tArHEhk70_MT7i4PE-hvvPnwkxdXT_vX19cV5i72-uGzVzBsMBsHePjpelPkv4XCsHv4MGGpO_RksFAu_iYbjtVzZYXA4WwQXjriPjxz7aaZedr2eP4qdft0wcOxLsT4R6oPR5WSkW4fWeRnv9veGsOg3_UN9n8_9kEG94tvh73-rVN1Ly2oDPWHBt7SUXdi_ezDE8dPGOI8iofXfALeXAENZKHtES41EKeJsgzVWAZgrqQ7RRac9d6Nro9WgPo1jkNq_5G-kj1F0cfk6v8Bj95IGDxtt6OtHr15d_MjaXEWrvl6HP56zdhtNyrRprMOEFLcTvp7b_xZI5LyiM4qiBDcf3Tt83DA4zz00nlv-Ofpg7Tli1Xj-w_78Hx3Ycro=))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/hyperloglog/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJyNVQ1v4kYQ_SsjVzpBgg3mepeeQ6JyyeWEerpEd6hXqa7IsjvAKvba3Q-aHMp_76wNxjS0qkGI3XnzZubNrHcTGDRGFsoEye-bQIogiXtBxtTSsSUGScCdYEEvMIXT3K_7J6mCE_h6d_1beCMzvCrKJy2XKzvFR5tAs4QO78JwMPwxpJ-3Pfj86-R6Moar2y93t1_G08ntZ3gF45ubyafJePrhawTjLIPK04BGg3qNItqH-iQ5KoPhRKCyciFRJzAuGV9hOIwGHtdP1Q9S8cwJhBF3vOivnkrUWbGkb8Td6jJVbYhdaWdsX-CaqGdr5LbQkQe9gBj806HiGP2TgufMHnpwY4XAxcGeLIzVyPLKuX9S6_fzgrSDFZlmc5c9zPCR5WWGlGdtnmuJC7jGnDpjNbNowBnqCBQLuPfVJUmrvHtIA0-TBhUljO8mJtqKIpWFnEnVWRdSdFO1oX3ikmoJU_i35wLI7dwjuU8AH0sNVFqSGPkdZxaUy2fSYm4IGTvq3GgEw5_OAfp9iD--95UC1PIlyYHEo-klVJ6dhqN7XuPJ9yMq9NXCfWO9ByGNJTVt7ddm3nWmU1miOS6pzm6vBkaohF8MWvzfEKg9UiFR-L9GahRUGVOCaQE-U2bpNHiZPYKVpS4eZV5votaF3jINokE8HMbvzkCaLdmCuczCmmWOHJUg6TRNclkoQYgCGLwe_vIezANavgIvpKdijkyVyGAEqVn3dpfRrMlo0wR83pczUdJKlhFVlQKSTpRqneOLIfHKN4iNES2esRDAqIt1SymhF2zNImJC_Ifc3QNSP2SeyrAct-RsSbMIf0mKpgoLbLGgsahApBXp9z-DbZdw2hrFPgxb4a9Yxl3mZ8mTcxJTKpLKPu3oK_nbQ113YWcVs7bPRSupHaKzi1aR8MJZfwzSYKrdQcCE9rylydT77J_KJ03Vh13gY77Hs2pc_WB66AvmKjU2N51DS_XQkFnJidDYkSjcPMPLztE4XZL2GHh_giGEOBp0j4enwci2Smm0TisY0PKZbhVe5CW9B_X-8gnUmvN4-MbFZC5KW99MQUhEF_z0ND6DkGm-ujD57GwAYUhvJks_lmKgCDOWz6vrKpPzFifnPKPNNQUiPtqw2qmH4Lm3s9NRObDTqQue_6g-fwORbmIN))
+- [Device-ref APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/hyperloglog/device_ref_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJydWAtv2zgS_itzOuxCTvxIsre3Byc2zttse8b2mqLxPYB6IdMSbRORSR9J5dEg__1mSFGWFLvoblskFTXvxzdDPUeGGyOUNNHw83Mksmh43o1yJtcFW_NoGKVFxqJuZFShU3oenMwlnMDtx-v_9t6KnL9Ruyct1hs74492CNUjxGkHLs4u_tLDH3_twod_T6-nE3hz8-njzafJbHrzAb6Hydu30_fTyeyX2z5M8hwcpwHNDdf3POvvVb0XKZeG96YZl1asBNdDmOxYuuG9i_4Z0Q3m8s9CpnmRcbhKi1QNNk87rnO1xn_9tNiM57JJkrGBsdkgxR8ZX43rL-1GF8YOMn6PepN7nlql-5tDJIb_r-Ay5f22fKGM1Zxt3fHgxIft7ysMGZRiNV8l_JFtdzlH-_z7pRZ8Bdd8ixmxmlluoDCYCVArWJBXw2HNrUUpqmcEqpx8nBoXMidqthEGSvFIVhO4UQ9gNxykkj31IIVcY8RXXJMbYFH6AU1k7MLJTZmEJUereAZWgSD5W0wKMEgxIGoLd1xLnqMKZmGFdMZpS5nOhGS5sE_AjRVbZrHswFi-gwdhN8Dkk1OgkFrDg9J3uWKZF4OW33MdRAm5KyxkzLJ-mfm5tBwNQfcwsTkzBj7x1QzN74J_nBLL1GIykgT9WbI8SeBeicxZmCXe5rjkonh0Aw-shDa2i5Zmw6ERX3hiQXbm8hl1w2AAM82kWSm9dba1Ihk713yWwKRqxzsUNdamc2TLXKV3nopkF4ZSg2doLNWKIxw5esm2PLg4HFa-k5TE8bvyxjcbLMHMHyVO_PiSouUMv90wjUncYm3oJ3RPaSo09MQ54qh7TnvIl9LEiX2OwYIkMY4f4-h1ufgsn9AMb7K54zbdfP5tr3C2IfF5rh7IMexd9BaLVO2oElAN-kvxIOXMcGBZhkhgqPSzJ_RYpGAaJiMvwhSG33KelTowuFvOrZOCxbaWrjY1dqnQrk6NI6QeAVYgdUqNUSMd0RuA8wLx6Oqq7luqCml18oVrFWsuUKveaW6TlBl75SgKPNwhiR3H9Rh0OpdOnUFYs_Fe1XjUyi4qcgxJRROXvL7IGybnSu0S7Glq_RGs8fe12PYfsYNc6tzDZcUjskdo_hnV6ALTNHvEh1PwdeOeLltqfZEGESkawRFWxD1P1loVO0NFJ0xSVp6jjjv7GniDx9YnuVVbvgfohTlUmMTf6oXqMa5lyeyYfK5Hv0u91i8DS_Vp4s5LzaKpFFZgwL8ctKqhtp_mnOnYOeXz4v7bN08yrZx82BDGxxTwKwQKePYFtQ_h9yCwYzF4J7GDFow3Egd2Z9Mky4DjdPOUyHjEsrpt2C4xkdcEnfjf_0CkgQfuoBupwChEjxKsWzjL7hoYuyCBi34QSA2M5cao8xz9EVAvZ4SD1grcDwG7F9tEd4frcOuwYNFwb-EE6wIV5AoBoozL7c17wgj67_WnyT8RPGT2IDKLmUen1zxowfeljRzmEeHcSnM-j8qMYR0TihM0eUtTtcUYOI8QhNDCvXleYmhKcN11Oqq3pKuOlyMlghn-T5mO3KhS0YHyw7EvvVI3QErWBgZQeCrqGp70w2G9WsUK_GO_bE_ETuxOGI3grCrUEqhbhpiNKvIM2G6n1aM7yp8oxwtZbBOqErMYLCoQWlSidhoxcRXPo1-CJAq8B5HvMrT4uzwv5hiWqFuDoG7Ls04IZ9WzPp0ycznecr3mB6Bjjy1ohC8WP_zrqLMR2GdrBDBatYim1LGiwqZdtMhdBVFQnSIfwu4-1mTdS3MJqQ_p7n5klytF7eSmsMc2k3JNDDEIO4rfzUo8c_vI3RKaj10f_m_4E3YcIb-dJ-xA384RnARV2LA5_cE14tUk-gMzSEmsXUbrxjovF53Qg6YBE82ecbITITP-GHdwTDa6BvO8L6r2PIqb8whpqwT6gdRMX6ezx_BK5uvZcxBawPVXjPUOIoz4Zrdf4gscTPTrNBBQE3siHI6VT3XtNF1OUCwNq07Q_3LQDDrCKJcDpw5uvqUOgxuOiAx7zBZalos0NV7A-A3eptpzFGq4tzf0Ne6VEP117IMTrM29IH7pnXspO5viuWVCxtSZoYT9gj47WvYjgp3LPWVlpF9fGpSvblxXs7Fjda7yx51uXkAC6iJrWFUv_nbpAn_-7udWp7TAIuj84SL59ecyQP46Oxw2rrxog9tATFzpq7XROy6p7RozADKBTsrUer665HBTdkuK6S_5GsPZ6XrCPkI5PZwdX8yal5BmKPed1-qkvTRaqRgGyketLKvDMqtV6rCV9W2W5WmRh4X2wDaENa-Vvxkui_wOSqRSTkA9oc2KzpKarMRxHqzxuikED02ncNFDu8M2pjmtY01HPabUpHwotktcdI5euRxcheuU-wBA6zk2L7yZTcrbok_B4RL0_HVfmot5I7S5j2rjqwKhxI5u9OzI94tWYsPBu4__IsH12_7V1dX5WRd-PL_oNswbj8fx3j66XlT5r8rhUD_8nmJoOPV7aqFk_Go1HO7lmoZxe7eIzz1wH1459ttMs-2Gw3AVO_65YezRl2J9JNSt1eVopLtt6wJNcPtbQ1jOm1Fb3uezsGTQrPh6-Edfa1Ws0dYAPWLB16RUUzh8e7CE8fPotkhTbsyfsNxeFxi2hXZXNGkFtiLebZDHCUDkyutLdDlpz_zqGnUjmtN4DdL7D8GRvE_T84sfi3N87T_S4Muoh_JG6enp-U_QYzrdjMw2-ekMej0cUrZHax1uSFkvZ9ul-3Sci2VNZpqmOR7SfQ_l4YHF-9xd9NIN73EONt5jrKKX39zf_wPMOtC7))
### `bloom_filter`
`cuco::bloom_filter` implements a Blocked Bloom Filter for approximate set membership queries.
#### Examples:
-- [Host-bulk APIs (Default fingerprinting policy)](https://github.com/NVIDIA/cuCollections/blob/dev/examples/bloom_filter/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJydVmtvGjkU_StXsx8WmuEVbVUJQiSapLtoK5IF2qpaVsjj8TBWBnvqBwRF-e977ZmBgZBqtVRqwL6Pc889vvZzoJnWXAod9P9-Dngc9HthkBGxsmTFgn5AbUyCMNDSKup-d94tBLyDG5nvFF-lBhq0CZfdy99CmHwd345HcHM_fbifjubj-0nb2Xr7z5wyoVkMVsRMgUkZjHJC8U-5E8JXphwQuGx3oeEMFkG5twiaAx9lJy2syQ6ENGA1wzBcQ8IzBuyJstwAF0DlOs84EZTBlpvUpyrjeDjwvQwiI0PQnqBHjr-SuiUQs4fuPqkxeb_T2W63beJht6VadbLCWHc-j2_uJrO7FkLfu30RGTILiv2wXGHh0Q5IjsgoiRBvRrYgFZCVYrhnpEO-VdxwsQpBy8RsiWI-Tsy1UTyy5oi8CifWXzdA-ohA4kYzGM8WAXwczcaz0Mf5Np7_cf9lDt9G0-loMh_fzeB-is2a3I5dq_DXJxhNvsOf48ltCAypw1TsKVeuCoTKHa0sLjicMXYEI5EFLJ0zyhNOoVIQrOSGKYFlQc7UmhdaQ5Cxj5PxNTfE-LVXxflUnYVYiF-4oJmNGVxRS2UnyqRcL7Hvhqk2ten1sY1JldWmQ6UVpu02X23FbIMplhtGjVTnTdgTo9YBW-YSm7Y7b6Wxuwyl1j7FwCU2hZG1X-bCoOK4aGwkj5sL8YyFgVukWLdxHIOw6-Uj22kntiH0ur92u90B7D-dTucKfmeCKWJYuQ3O_nwkkxduw0Pcd9Btvx-UkcbIrjKe64QrbSAlWeLjuWCy3PD0vpFAvErQKjMPXntoG5Xd0uhx6SvzOPCr22xVmygR8M0tszvynKmDBmaXF0I7tgCcBE5eaLL0JkOXfbB3neVk60553auYDDFLiM0MFA12mjwF5Kt3kuv365q7qnJdl_GeaxW-lKm1ift91KCBqys8kR9t9ojAPO-e47fxJFgOU7lyJK6Knru5WMDsY6yFgNoHw_tcTMRZmbtQZ79_pPMaatewRtU5P1v3LpWiG26rHbEVyrYZeo82ZnDfe80yDbFOK_nSWyHvdZdB3QAdvVj2thd1sRRWYh-mcDjaqgIcYBwafF7M5Tz3Ds6wlDOJ40aFIiwzNX_KWiRldu0scRBidxoF8BASkml2zN1ZR1F3PDoptRhlKX9Zpna107efqziFN1xane1KDeGs35eGjnN3EepU2iyGIh34q80oy1q51HixbBj44YHEzB-mw16dFTyq7i7Ur6gJD4VXjf0vcH2ZJiUG8Bbzt7W7RpjwqE6Gizui3N3W9QOhvWOuZEQyvN7wQomJIahzZamxGCushSmjsKeUR9yga8HrSd2fHqbXXTxjOZbl5oUskGArIkSOrHhfXtVWq8oNhmPTlOiUafcEif3MwnrP0yn2dIqSTvEGnUkmkS7HtgM7LI64X2xU8vIXWuNYbGcaVF8qT6yTQbMJnTJgIb9Cu0Xe5H_kPa2kvvSTvKJ5fkA6UeKLBb9XJPhl17dyPTmsnw48xVAVArr48wVfq-4NiK9CdXjUBmJDae_yve3htsxN8eINWhhoSC8ueh-gRRRNh3q9_NCFVgvvLYP_GczB4lZG1pF_Bmc8qsWklGa4uCkerriA9YrH4CWs9vHmONpH7oKXf_y_fwHeCexw))
+- [Host-bulk APIs (Default fingerprinting policy)](https://github.com/NVIDIA/cuCollections/blob/dev/examples/bloom_filter/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJydVgtr40YQ_iuDCq2dWH6E3h3IccC9aw7DcckloRTqYtarkbVE3lX34YsJ-e-dXUm27DhHqQxGmvd88-1Iz5FBY4SSJkr-eo5EGiWjXlQwuXJshVEScZeyqBcZ5TT3z4OzuYQzuL_99Gd8LQr8qMqtFqvcPuCTTWD3CB3ehYvhxa8x_b3vwdc_Zp9mU_h4c3d7czd9mN18hZ9hen09-zKbPvx-34dpUUDwNKDRoN5g2t-n-iI4SoPxLEVpRSZQJzAtGc8xvugPvd1gLufyJyF54VKES-64GiwLpdaLTBQWdZ-7_OrQxubaGTvgyknb98pXqhQ3lHixQW6VPm2CT8idJQQXpSoE3562MviPQ8mxf1yDUMZqZOsgFtLCmgnZ2SiRdufymRoDL-Q0IItPpQbp1otH3BqgawKj4S_D4XAMu2swGFzCZ5SomcVaDd7-dCRbVm6TfdwzGPbfjetIM8JcW7A5Qia0sZCzIgvxfDBVKwK8bySQrxLEdebxaw_jlvW0DHlchM5CHXTrlXGjLFFDGG6d3YPnTX1pYLclVaWOLQCcEXLlTRbBZOKzj3eu9yX7LoEdeMF3YXNIMWOusFANGJhMjwsK3XvKJUmbc5dNrqs63nOrw5c6tbFpkhAHLVxewjz6zRWPVFjAPWD8dj0ZtYO61B7EVTVz4mFdZkKx5hJaF4UPuVCmRZ27YmeSHPC8VbUfWKeZXHfcdmkY3fGq_hJXRNtuL3j0KYO_H3XrNMx5rpSLYEW4t13GbQNyDGTZ2Z63yVJZyV2YyuFA1QTYl7Ef8GkyqyxIgoM3rOnM0rTTVNGrM3V_iNpSqeLKW9L6oul0qsJ7kLHC4CF2Jx1l2_HgpLRi1K18c6i3rdMX6O4fS02hlTPFtuYQpvvWyPEhFwZMrlyRQpWO7Ij0VjuMS2WEFRuEsDwImIfbu8mojQodVUv7ybyCprdvvBnsfyk3tGlzZoFpBKmsb8DQivdVHS0Xf0RpbeLBgTDBsdRqyQphrOCQMsuI59px6yhWrxWmjoJPuVgKes-wCtejvq9v766GdMZKasvvC1VVQqNYUuWESvAVTW-trvxiODTNmcnR0OKhMfidRf2ehlPu4JQ1nPINOLNCEVwebV_spDriQdhp6BVeaJ1Dsp0YUFtUn1hPg24XBnXAin4Vd6u82f_Ie9xJW_SDvLJ7ekF6Us4jf9-AEMR-brU828uPF55GYoWEIT2-0GcNV-uSPmL0_usnkhvORxfv3IjUqrTVp1EUU6AJPz8ffYCYaZ5PzHrxYQhxTO8tS3-WcmAaF2y9DN9LhVi2YnLOCxJuKBHFIwH1Kx-jl16jpzfHgZ6wi17-Dr9_AWLvS3Y=))
+- [Persisting L2 access](https://github.com/NVIDIA/cuCollections/blob/dev/examples/bloom_filter/persisting_l2_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJzVWI1v2zYW_1cePKyzO1v-iGOnbmPAS9uDgXTJ0my34TLINEVHRChSJ1KJvbb_-x5JSZZjJ7i7DjhMLWKLfPy97w_6U0MzrbmSujH516cGjxqTfrshiLzNyS1rTBo0j0ij3dAqz6h97768kfASPl6-_bXzngt2ptJNxm9jc83WZgLVKzRpCwa9wagNP_4yfzufwdnF1eXF1ex6fvEjvIDZ-_fz8_ns-t3HAGZCgDukIWOaZfcsCrZczjllUrPOPGLS8BVn2QRmKaEx6wyCnqXr3sgb-Q2XVOQRgzc0p6q7FEol4YoLw7KA5vF0jyJihnDRZVmmsiBO0-kuiomzXBukukf-4T2jxpJND5Bo9u-cScrc7g4bbaKIraaP17g0jhI_ISFcNu8Vj1o38hMqA92X1sKA2l_HXANbkyQVDHSsHjTgHzAKaMaIYUDgB6sleC3BxMTiZXcaOJrSr3YeVBYBoRTdzDQQXYCnLNNcGy5vgUs4HwCRUQlfOKFrPw3CMqAqw5dUycgeQGrc6BDNUaMHbmJHc_bz21kBnuXoqYTB7HIe-KVKJQaLy4r1-WDmBDs1Wc4WkCrB6QZSkpGEWY0ScocyL6y7JpO6RxfAEm6sEh2vGsq0rxi1QQIxmhmtoTK4FWpJRCdhico2pdWsfXTgJCv4RwqZSmVKO3icAp4SDD1uNrDcWCszsXoNJE3xIDE2jayjchFVZ0lNoM6O4ZYMZWLWdAW0c2anECuNiS6Mu7A5-NbF4Udmzjlq3rRL7lvdmGdWzo_8D9aGIAhaC-dT58R92wgubTiskNcDQQvUWJ2Z9ZU9tAfdbC123fmztvJjlCopNvAQM-kioVBhZaOQ-6VK7S7aoLRhG9Ap1ak7tgFtMLITiKswZVLltzEIRYmwVncxXqjBopJToQxaM2O5xuoB81VdEpQwySnCkOzWJ4oN-XYZrWgmzKIqRyjuUoURLHMiUC-bUriATi346Joh24iWEe1ToGbfjN1iOJQsrCO0wOzKZcYEsaLfsUwyocGminh82kcu9_XQ7Bq9KKdX17_C5dUFjHq9HoYOoXcPDOvoB7Lu_AT_VFgFjItIeBdx-9mG_uAEPvAfrOZYmXsf0DdpbjCKWaInOywKs2kMJfgMJIragHWM5MKUrzVZ0aGfnb2wkuk64XZth7rg0dk-SNt5-vXpxYOE_imYjIZOY_d8hmFwctKDRBevR8Gwd1y-ljSDYDgc7iy6tcEY1wpQxKiBngSD8agOerTlsWU87o32QYdHW9BXozpovx_0eqUYTtLxaB_0ZLwv6fH4eAtaerzYHASj3qACfRX0Xo0fgx4Hx8PjR6DHwdG4X4G6ZguQa-tNzNnQbFIGpxhM5rXfsm0NfY8Juk4zkHkSIplGkn7vOwzWgqrbhbODbayowq4e7YZZUeqZJEthk9w1SPzvCgy2DKy9BGUhuiyqyKMMR4_axn5KWWqK4iCJONSOFrUWhPAL152CrdYeyyu-85zCfqsKPfWb0lS-JPzvj-ewXmONjMPRsMKdfi0wDiaTSY7OOxqE5mvBTv7-AP3_O8BXq7AiQn91wP0lIDaFpq9tRnbfwOVzWW0ZkdwOuVUJWW4M0yHWghATi95hmtnOpFbNWiJOJnaQc19bdtJ5vFM7XytTfrpHQFuVAEfYs4vQzrHh9dVvbsb6BzN-8mq-8LStVu14QtbhtkSFYhC6xh26xvk0qEdE6JkxGV_mhjW9eV88B9iG4qw9hW3-icnvkZj1Mlu_JyhK85TjNHPS-xaUn5aQO0_yBHSepiqzQ8oTs6sdelgJX066xai2W7Lt2O34FbyLoVeQXNLY0uwMvcVMdCgG0BTIPnTsw1VGqJtt0MbByetdcjB2yjNl-fW-8PZ1IxFFm2rzxpU7uxmaafMw-stnHdx61rv_8aS-L23lu5pOOl8WJLaRHtCw-zhLtv53bbKwsL8eHroI-YuiUATvAnZcJUYlnD6adjtVvjLvpf1-t210xSZbG7y479jbh_JkgqMzI1GoqUpZ6AO3XU_dqXebB_5Us8GXQjt_A59Mdm7p25Zo5xPdLCcQ77DySHlrb9qtYInjumy22u5EwGRkv_drSTSXGOUG8ELgSGz6q9oVwxmj-IoD8pOgrWcFXyolpjahcGKpxG77ClyT5aecZZvt1OPQa_zLufsZzTyLcq8G_Q7FMfv3RK1qNxf7t8pVvC27uzKXMcvwSo4pJoobs-WC-STpJjicKc9cNGsiXTHBiLtosqfq0RP4_2Um9iquGTN5Jl39_nIjG-0GVUnKBR6rfiVryHtK-4PjvI_bKjX-J7RGB8P8lH7_fX8MHZLR-FQn4biH1xQsYqbjUiFiUUeQZOl-VxN8WcOklApcvLfyKYkL2DblXeNLu9zHhNrZx_BpfPnd_fsTdEMSAg==))
### roaring_bitmap
`cuco::experimental::roaring_bitmap` implements a Roaring bitmap following the [Roaring bitmap format specification](https://github.com/RoaringBitmap/RoaringFormatSpec).
#### Examples:
-- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/roaring_bitmap/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy9WA1v2zYT_iv3qsAgN7aVpB_ZnI_NjdPNWF97sN0VQ1MIlETbhGVRI6k4XpD__h5JfSbK2nV75wCxRR7vnjs-dzzqzpFUSsYT6Qw-3jkscgZHXScmySojK-oMnDCLiNN1JM9EqJ-959cJPIdLnu4FW60VuGEHjg-PX8Hk1_FoPITL6eyX6Wy4GE8nfS1qxN-xkCaSRpAlERWg1hSGKQnxK5_pwq9UaBxw3D8EVwtcO_nctdM5NVr2PIMt2UPCFWSSohomYcliCvQ2pKkClkDIt2nMSBJS2DG1NqZyPQYO_JYr4YEiKE9wRYpPy7okEFVC15-1UunA83a7XZ8Y2H0uVl5shaX3bnx5NZlf9RB6uex9EmNgQdDfMybQ8WAPJEVkIQkQb0x2wAWQlaA4p7hGvhNMsWTVBcmXakcENXoiJpVgQaYawStwov91AQwfSTBwwzmM59cOvBnOx_Ou0fNhvPhp-n4BH4az2XCyGF_NYTrDzZqMxnqr8OktDCe_wc_jyagLFEOHpuhtKrQXCJXpsNLIxnBOaQPGkltYMqUhW7IQCgLBit9QkaBbkFKxZZZqCDIyemK2ZYooM_bIOWPKu06uk2csCeMsonAWZiH3BCcCNfoBU1uS9sNsffFIJlMsZmrvKUGYkv11ml481BQRT6rIC_FfRJcXT06yRLVPqn1KfWugIaDWIpPKi-gNOuLf0FBx0V-3icR8hYSI2yezhGHsJInrKupymvlyLxXdNpYvkQ-UNMcYbxnUvElWjSFrydjxnlsi_2ASbI0K_CCLNz69JUgFimG304FgdAkjusVNxGAoilsp9dbnKdXcLSSn1oLcjDnfZKlRDMNfxrIqFuPEZnZuCXaYL5xgmuw4vDjuoSKwygyRkPQUXr-sDYObcqFMniExt0R1YCn4VqMx-j_OLKQ3RvqtEZkjcz-5Os8lJvoK6Z8FfawlXkO2eKrWdDDDUy4ZRm1f0hoLRLgBZv3X7hbOop8orzKBfNdzIRcCI45jMouRpjAhWxrvu9plDKQyQksex3ynU8hs-MCY6MFH66wucjxTIktkP2CJmXRtlDpf45AXxDzwXh2dnJDoO0-DiIgiXquxzmMo_x6ORyCKTc-Z9vplhcPS4x_E8fql12quU5L4BzykKCzqPM7Pgnzrt2SDOZLq4ge90eX7y6k_mn6YvJsOR_5sOpyNJz_6i6v5YjRcDM-nE31IBFhhqSoTBWsj5n4aY85h0cBilCB74Ge6X-BvzOGA89hy0UXUg4HNdyQdJuo3ea74mlN-StQaod-hViAZWlrRhOpc9jd0L-EcPn5yO9C7AFuaBoNGbTsrTIJRAJr5xog-PrA_wHqpjSMCJn2JGP2bYkkXarMZVtoXx7666BSKADwPLrFwoYe_ZxRTzOApjpuKDHfIyvuCEVWeFCr-MfrNroaj_171t9EzPdTTY4UZ40IekDanDPTTQlq74LaIwQajfXiKX2dwdKg_-vfBuXmoxQWMun6aybUfENzhTafUfd8wgoqN0krbGfZr9vfBwebPdL5AHn9W70lN77dfprdNpy2LTxCsLZ6uURrQFUvcTteaoEnkdgrl90Bj3SJ9PRlfv_wLZGytB4aK_w8mYgGquPjItC18n6Olce_ztNRilpa3ZnuzOLa7jc_fFc9fseOfszVs2jo6_Bu2Hogc3h7n2irZVpFXDZEnETObtOwBUKYT91ir-BO4h7ff5gvgANjfzAyzpV-aGXcVR7AHD30iJRXK1f2zNoPnSUQT5S8JCpc1vosdXP4btghIH0pl8cL4FCjyS1vdg7v7wr7-0g_6G5NiiqZMpuhnm5t5E2tG3YdHVTcX4nIwQKoTsbe2MNXd_2ipPuY2R6XocuGlWRFSIeDsDF14S1DM3Ly0HA7o4Yd29JhZh5GIc-y5LyYoZui-dONHquxtVLI_aHmUGm16BDlilFVtu_1tJh_52KnCM8T-L9RVx_TKW-y0sfY0z8AyegVLqsuD6dxTliQ0aiFNsFd4bgfZckmFW6KpGZ9R7LyNV7ixPLeu50yccY8iV1CcogKvisoPiVRn4ZqI5xdugUWQnZ9yI2PmXWuur-sY7hBStGE4Vx3GXFK3hiQvvfl9onQ87-zLCFj6YrWngm2RvyRGBI07SNWvNMddu8NfCvu0tvG2W6ofCy7BhJbYLceRThE8gvTrBqQcS2r71ilpkjdajcarxXsCdg81cyV-23t4fn-oE6BZJnQreFGBsBXC8E5HX3O5ZuoN3lh6-Y2l5hFZ4dr8TmLRa_mHl3FrQj5Zg7oVimK67mVxc9LR04asZfFkAPU60-fiAr-SOS_joMf50n1ktI4jB4b1odYd6NrH1P7u3nIyz_uGGZww2a9boS3RWk0P_YwtI7wSm5a-6OR1F--PxrOywtWbcdCU8iMmEHfrqtPSTZmFoX4j0_yc2za_vU8qlR9gmWu_yBXFutD-zVcp_Kva7GHV1NZ-iXMKitgqjshtFc8tDPL6bSsahonE6ZqYkRzCg0Je29BC4ns4hAEc4eQzfThWxsojo_0u17pf-WUNWWDYiJWDYRkw7yMb975rp2oL8s-18wWXwc7DhY8Oqtw7608SsaWhqtN19PtRrJSiet_rJDdheHT8KjvCaQsMJ50eKjwPDw6OTqBHRLg-l1v_5BB6PSytCv8p3R5EvZhsA_OGOGZBTWcYhjEO3tiXujigubZx7rvFPFbpxjzWK-f-k_n7H7m6k-4=))
+- [Host-bulk APIs](https://github.com/NVIDIA/cuCollections/blob/dev/examples/roaring_bitmap/host_bulk_example.cu) (see [live example in godbolt](https://godbolt.org/clientstate/eJy9WAtPGzkQ_itzi1RtIMmGlEcbHteUlCq6HlSUe0hQrZxdJ7GyWW9tL5BD_Pcb2_uEpdDHXZDIrj3-5uFvxuPcOpJKyXgsncHFrcNCZ7DZdiISz1Iyo87ACdKQOG1H8lQE-t1bv4xhHT59HP3dOWYRPeLJSrDZXJ3TGzWA4hXcoAX9Xn-7g_922nDy53g0HsLR6dnH07Ph-fj0BF7A8Ph4_GE8PH_3qQvDKAKzUoKgkoorGnZLVR9YQGNJO-OQxopNGRUDGCYkmNNOv9vTct5lfBmvsTiI0pDCfpAG3BOcCBbP_AlTS5J0g3R--EAmVSxiauUpQZiS3XmSHN5HCoknVegF-C-k08NHJ1msmifVKqG-VVATUHORSuWF9Ard869ooLjozptEIj5jAYmaJ9OYXVEhSVSFqMpNcaPkSiq6rC2fSiUoqY8x3jCIQxjG2pDVZPR465YTb7QamCOAP0mjhU9vyDKJKIbdTk8Eo1MY0SWyDYOhqIRUIsuAT0HNKdR3Cy4djXLpQMT5Ik0MMAw_jqWhhYEcx7iQScg0wTVFYRKCuubwst9BILBgEkgcAo8p7GxVhsFNuFBkgkunXCyJasFU8KW2xuBfnFmT3hrpYyPyKaHBZ3euVCIHnjdjap5OugFfejXZ_K1c00JaJ1wyjNpKW2MUIH-DBTDrv3Y3dxb9RHmViliauYALgRHXqZFGSFM4IUsardraZQykMkJTHkX8GrWC2fCBUdGBC-vsNZrKUyXSWHYnLDaTro1S63sc8iYRn3jbm7u7JHztaSNCoojXqKz10JT_z44HRuSbnjFtZ6u0w9LjJ9qxs-U1qmsVJH4Tc0XhvMpjQb-kDLfabv2SLDBHEoVVGjqjoz-OTv3R6V8nH06HI__sdHg2PnnvYwk9Hw3PhwdYVxWHCQVJVZEoWBsx95MIcw6LBhajGNkDv9HVOT5jDk84jywXXbR6MLD5jqTDRH2R5YqvOeUnRM3R9FtEBZKiphmNqc5lf0FXEg7g4rPbgs4h2NI0GNRq236uEgwAaOYbJfQmEXhiYL3UytECJn2JNvpX-ZI2VGZTrLQv-746bOVAAJ4HR1i40MMvKcUUM_ZgVtvUKshwi6y8yxlR5kkO8dPod_ZuOPr9XXcZrumhjh7L1RgXsoA0OWVM38ultQtugxgsMNq9Pfzah82e_ujnjQPzUokLGLhuksq5PyG4w4tWgX1XU4LABrRE28cT3D5vbCy-hvkSefwk7m4F99XzcJswbVl8hGBN8XQN6ITOWOy22lYFjUO3lYPfAY0k_REy7mx9Axkb64Gh4n_BRCxAJRcfqLaF7ylaGveepqUWs7S8MdubRpHdbXx_nb9_x44_pWtY17XZ-wFd90R6N_0MrZRtFNmuiTxqMbNJy-4ZynTi9jXEV8zt3bzKFsAGsB_MDLOlz82M25IjRLHAJxIbdOXq_lmrwfNEt-X-lKBwUePb2MFlz7BEg_ShVBQvjE9uxaVTupJ5cHuX69df-kV_Y1KcoiqTKfrd5mbWxJpR9_5R1c6EuBwMkOpErKwuTHX3Fy3VxdzmCIou516aFQEVAvb30YVjgmKhPlS1HA7o4ft69JhZh5GIMtszX0xQzNBd4cZ7qoy9INk_tDhKDZoeQY4YsLJtt89m8oGPrTI8eIfiga46pldeYqeNtad-BhbRy1lSXh5M556wOKZhA2kmK4Xn9iSdTqlwC2sqys8odt7GK9xYnmnXcybOuEehKyhOUZFgaPyASLUfzIlYP3RzWwS59hNuZMy8a9V1dR3DHUKK1hRn0EHEJXUrlmSlN7tPFI5nnX0RAUtfrPZUsCXyl0RoQe0OUvYr9XHX7vBzzd6rbLztlqrHgkswoSV2y1GoUwSPIEUY7gGGsbJvrYImWaNVa7wavCdg91AzV-I3tXcse3-oEqBeJnQreFgaYSuE4Z2OvuZyRdVbvLF0shtLxSMyw7XZncRar-XvX8atCvloDWqXVuTTVS_zm5OOnlZkNYtHA6jXmT4XF_ilzEERBz3Op-4DpVU7MsOwPlS6A_OThFrd3llOZnlfU4MTJvt1K7QkGtX00GtsGuKV2LT0eSevu3h_ND4rKly1GQdNKT9kAu1uXLVXuCnTIKBSQv1zYNv85j6pAN_AMtd8kcuLdY7-4rsAvxXNHlZ1tOZLnJNTxFZxtNxW8UzDIKvftqJhmEiUzIkZyUy4V8grG5pL_Ao9GMAmTq7pw7FUVhwZzXe5xv3KLmvIAsNGrBwMy4COUf3ed-mUbUH2uXSecRls3V_44KDKvLP-xCGbGqo6bQc7zgQrpSh_GXTiqyDY7G-nmzhtDcNJp4OAB8HGxuYudIgI5gdy6e_2oNPB0qrwn9LtQdiJyHJifkuM2KSCGQRBhIP6DEI8HNBcWzh37Xweq3RtHuuVc_fZ_P0LZpjzEQ==))
\ No newline at end of file
diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt
index abe32f929..597f192de 100644
--- a/benchmarks/CMakeLists.txt
+++ b/benchmarks/CMakeLists.txt
@@ -1,17 +1,8 @@
#=============================================================================
-# Copyright (c) 2018-2025, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
#=============================================================================
cmake_minimum_required(VERSION 3.23.1 FATAL_ERROR)
@@ -52,10 +43,10 @@ ConfigureBench(STATIC_SET_BENCH
###################################################################################################
# - static_map benchmarks -------------------------------------------------------------------------
ConfigureBench(STATIC_MAP_BENCH
- static_map/insert_bench.cu
- static_map/find_bench.cu
static_map/contains_bench.cu
+ static_map/find_bench.cu
static_map/erase_bench.cu
+ static_map/insert_bench.cu
static_map/insert_or_apply_bench.cu)
###################################################################################################
diff --git a/benchmarks/benchmark_defaults.hpp b/benchmarks/benchmark_defaults.hpp
index 2fc4439f4..285049f4e 100644
--- a/benchmarks/benchmark_defaults.hpp
+++ b/benchmarks/benchmark_defaults.hpp
@@ -1,21 +1,11 @@
/*
- * Copyright (c) 2023-2024, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#pragma once
+#include
#include
#include
@@ -25,12 +15,17 @@
namespace cuco::benchmark::defaults {
+#if defined(CUCO_HAS_128BIT_ATOMICS)
+using KEY_TYPE_RANGE = nvbench::type_list;
+using VALUE_TYPE_RANGE = nvbench::type_list;
+#else
using KEY_TYPE_RANGE = nvbench::type_list;
using VALUE_TYPE_RANGE = nvbench::type_list;
-using HASH_RANGE = nvbench::type_list,
- cuco::xxhash_32,
- cuco::xxhash_64,
- cuco::murmurhash3_32>; //,
+#endif
+using HASH_RANGE = nvbench::type_list,
+ cuco::xxhash_32,
+ cuco::xxhash_64,
+ cuco::murmurhash3_32>; //,
// cuco::murmurhash3_x86_128,
// cuco::murmurhash3_x64_128>; // TODO handle tuple-like hash value
diff --git a/benchmarks/benchmark_utils.hpp b/benchmarks/benchmark_utils.hpp
index c36c7f018..453aaeb97 100644
--- a/benchmarks/benchmark_utils.hpp
+++ b/benchmarks/benchmark_utils.hpp
@@ -1,28 +1,18 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#pragma once
+#include
#include
+#include
#include
#include
-#include
-#include
+#include
#include
@@ -65,7 +55,9 @@ struct lazy_discard {
__device__ void device_dispatch(index_type index, value_type const& value) const
{
// pick some predicate that is always false, but depends on the runtime value
- if (threadIdx.x > 2025 + *reinterpret_cast(&value)) { *(it + index) = value; }
+ if (threadIdx.x > 2025 + *reinterpret_cast(&value) + static_cast(index)) {
+ *(it + index) = value;
+ }
}
__host__ __device__ void operator()(index_type index, value_type const& value) const
{
@@ -75,13 +67,13 @@ struct lazy_discard {
};
/**
- * @brief An output iterator similar to `thrust::discard_iterator` but prevents the write from being
+ * @brief An output iterator similar to `cuda::discard_iterator` but prevents the write from being
* optimized out by the compiler.
*/
template
auto make_lazy_discard_iterator(OutputIt it)
{
- return thrust::tabulate_output_iterator(lazy_discard{it});
+ return cuda::make_tabulate_output_iterator(lazy_discard{it});
}
} // namespace cuco::benchmark
@@ -93,3 +85,22 @@ NVBENCH_DECLARE_TYPE_STRINGS(cuco::utility::distribution::uniform,
NVBENCH_DECLARE_TYPE_STRINGS(cuco::utility::distribution::gaussian,
"GAUSSIAN",
"distribution::gaussian");
+
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::XXHash_64, "xxhash_64", "cuco::xxhash_64");
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::XXHash_32, "xxhash_32", "cuco::xxhash_32");
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_32,
+ "murmurhash3_32",
+ "cuco::murmurhash3_32");
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_x86_128,
+ "murmurhash3_x86_128",
+ "cuco::murmurhash3_x86_128");
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_x64_128,
+ "murmurhash3_x64_128",
+ "cuco::murmurhash3_x64_128");
+NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::identity_hash,
+ "identity_hash",
+ "cuco::identity_hash");
+
+#if defined(CUCO_HAS_128BIT_ATOMICS)
+NVBENCH_DECLARE_TYPE_STRINGS(__int128_t, "I128", "__int128_t");
+#endif
diff --git a/benchmarks/bloom_filter/add_bench.cu b/benchmarks/bloom_filter/add_bench.cu
index 433b6acde..a89de9806 100644
--- a/benchmarks/bloom_filter/add_bench.cu
+++ b/benchmarks/bloom_filter/add_bench.cu
@@ -1,21 +1,9 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include "defaults.hpp"
-#include "utils.hpp"
#include
#include
@@ -25,142 +13,122 @@
#include
#include
-#include
+#include
+#include
+#include
#include
#include
#include
-using namespace cuco::benchmark; // defaults, dist_from_state, rebind_hasher_t, add_fpr_summary
+using namespace cuco::benchmark; // defaults, dist_from_state, rebind_hasher_t
using namespace cuco::utility; // key_generator, distribution
/**
* @brief A benchmark evaluating `cuco::bloom_filter::add_async` performance
*/
-template
+template
void bloom_filter_add(nvbench::state& state,
- nvbench::type_list, Dist>)
+ nvbench::type_list,
+ nvbench::enum_type,
+ nvbench::enum_type,
+ nvbench::enum_type>)
{
- using size_type = std::uint32_t;
- using policy_type = cuco::default_filter_policy,
- Word,
- static_cast(WordsPerBlock)>;
- using filter_type =
- cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
-
- constexpr auto filter_block_size =
- sizeof(typename filter_type::word_type) * filter_type::words_per_block;
-
- auto const num_keys = state.get_int64("NumInputs");
- auto const filter_size_mb = state.get_int64("FilterSizeMB");
- auto const pattern_bits = WordsPerBlock;
-
- try {
- [[maybe_unused]] auto const policy = policy_type{static_cast(pattern_bits)};
- } catch (std::exception const& e) {
- state.skip(e.what()); // skip invalid configurations
+ auto constexpr words_per_block = BlockBits / cuda::std::numeric_limits::digits;
+ auto constexpr pattern_bits_per_word = PatternBits / words_per_block;
+
+ // Check for a valid configuration
+ if constexpr ((not cuda::std::has_single_bit(static_cast(BlockBits))) or
+ (words_per_block == 0)) {
+ state.skip("Invalid filter block size");
+ } else if constexpr (HorizontalLayout * VerticalLayout != words_per_block) {
+ state.skip("Invalid vectorization layout");
+ } else if constexpr ((pattern_bits_per_word <= 0) or
+ (pattern_bits_per_word > cuda::std::numeric_limits::digits) or
+ (pattern_bits_per_word * words_per_block > 64)) {
+ state.skip("Invalid pattern bits per word");
+ } else {
+ using size_type = std::uint32_t;
+ auto constexpr contains_vertical_layout = words_per_block;
+ auto constexpr contains_horizontal_layout = 1;
+ using policy_type = cuco::bloom_filter_policy,
+ Word,
+ words_per_block,
+ PatternBits,
+ HorizontalLayout,
+ VerticalLayout,
+ contains_horizontal_layout,
+ contains_vertical_layout,
+ false,
+ false,
+ false>;
+ using filter_type =
+ cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
+
+ auto const num_keys = state.get_int64("NumInputs");
+ auto const filter_size_mb = state.get_int64("FilterSizeMB");
+
+ std::size_t const num_sub_filters =
+ (filter_size_mb * 1024 * 1024) /
+ (sizeof(typename filter_type::word_type) * filter_type::words_per_block);
+
+ if (num_sub_filters > policy_type::max_filter_blocks) {
+ // skip invalid configurations
+ state.skip("num_sub_filters exceeds max_filter_blocks");
+ }
+
+ state.add_element_count(num_keys);
+
+ filter_type filter{static_cast(num_sub_filters)};
+
+ thrust::device_vector keys(num_keys);
+ thrust::sequence(thrust::device, keys.begin(), keys.end(), 0);
+
+ state.exec(nvbench::exec_tag::timer, [&](nvbench::launch& launch, auto& timer) {
+ timer.start();
+ filter.add_async(keys.begin(), keys.end(), {launch.get_stream()});
+ timer.stop();
+ filter.clear_async({launch.get_stream()});
+ });
}
-
- std::size_t const num_sub_filters = (filter_size_mb * 1024 * 1024) / filter_block_size;
-
- if (num_sub_filters > std::numeric_limits::max()) {
- state.skip("num_sub_filters too large for size_type"); // skip invalid configurations
- }
-
- thrust::counting_iterator keys(0);
-
- state.add_element_count(num_keys);
-
- filter_type filter{
- static_cast(num_sub_filters), {}, {static_cast(pattern_bits)}};
-
- state.collect_dram_throughput();
- state.collect_l2_hit_rates();
-
- add_fpr_summary(state, filter);
-
- state.exec([&](nvbench::launch& launch) {
- filter.add_async(keys, keys + num_keys, {launch.get_stream()});
- });
-}
-
-/**
- * @brief A benchmark evaluating `cuco::bloom_filter::add_async` performance with
- * `arrow_filter_policy`
- */
-template
-void arrow_bloom_filter_add(nvbench::state& state, nvbench::type_list)
-{
- using size_type = std::uint32_t;
- using policy_type = cuco::arrow_filter_policy;
- using filter_type =
- cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
-
- auto const num_keys = state.get_int64("NumInputs");
- auto const filter_size_mb = state.get_int64("FilterSizeMB");
-
- std::size_t const num_sub_filters =
- (filter_size_mb * 1024 * 1024) /
- (sizeof(typename filter_type::word_type) * filter_type::words_per_block);
-
- if (num_sub_filters > policy_type::max_filter_blocks) {
- state.skip("bloom filter with arrow policy should have <= 4194304 blocks"); // skip invalid
- // configurations
- }
-
- thrust::counting_iterator keys(0);
-
- state.add_element_count(num_keys);
-
- filter_type filter{static_cast(num_sub_filters)};
-
- state.collect_dram_throughput();
- state.collect_l2_hit_rates();
-
- add_fpr_summary(state, filter);
-
- state.exec([&](nvbench::launch& launch) {
- filter.add_async(keys, keys + num_keys, {launch.get_stream()});
- });
}
+// Default benchmark: single layout matching default `cuco::bloom_filter_policy`.
NVBENCH_BENCH_TYPES(bloom_filter_add,
NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list,
- nvbench::type_list,
- nvbench::enum_type_list,
- nvbench::type_list))
+ nvbench::type_list, ///< Word
+ nvbench::enum_type_list<256>, ///< BlockBits
+ nvbench::enum_type_list<8>, ///< PatternBits
+ nvbench::enum_type_list<8>, ///< HorizontalLayout
+ nvbench::enum_type_list<1> ///< VerticalLayout
+ ))
.set_name("bloom_filter_add_unique_size")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
+ .set_type_axes_names(
+ {"Key", "Word", "BlockBits", "PatternBits", "HorizontalLayout", "VerticalLayout"})
.add_int64_axis("NumInputs", {defaults::BF_N})
.add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
-NVBENCH_BENCH_TYPES(bloom_filter_add,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- defaults::HASH_RANGE,
- nvbench::type_list,
- nvbench::enum_type_list,
- nvbench::type_list))
- .set_name("bloom_filter_add_unique_hash")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", {defaults::BF_SIZE_MB});
-
-NVBENCH_BENCH_TYPES(bloom_filter_add,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list,
- nvbench::type_list,
- nvbench::enum_type_list<1, 2, 4, 8>,
- nvbench::type_list))
- .set_name("bloom_filter_add_unique_block_dim")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", {defaults::BF_SIZE_MB});
-
-NVBENCH_BENCH_TYPES(arrow_bloom_filter_add,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list))
- .set_name("arrow_bloom_filter_add_unique_size")
- .set_type_axes_names({"Key", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
+// Exhaustive sweep across block sizes and vectorization layouts. Uncomment for performance
+// tuning / paper-style characterization; not run by default because the matrix is large.
+// NVBENCH_BENCH_TYPES(
+// bloom_filter_add,
+// NVBENCH_TYPE_AXES(nvbench::type_list,
+// nvbench::type_list, ///< Word
+// nvbench::enum_type_list<64, 128, 256, 512, 1024>, ///< BlockBits
+// nvbench::enum_type_list<8, 16>, ///< PatternBits
+// nvbench::enum_type_list<1, 2, 4, 8, 16>, ///<
+// HorizontalLayout nvbench::enum_type_list<1, 2, 4, 8, 16> ///< VerticalLayout
+// ))
+// .set_name("bloom_filter_add_full_sweep_u64")
+// .set_type_axes_names(
+// {"Key", "Word", "BlockBits", "PatternBits", "HorizontalLayout", "VerticalLayout"})
+// .add_int64_axis("NumInputs", {defaults::BF_N})
+// .add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
diff --git a/benchmarks/bloom_filter/contains_bench.cu b/benchmarks/bloom_filter/contains_bench.cu
index e472cf1ff..59d1a85b4 100644
--- a/benchmarks/bloom_filter/contains_bench.cu
+++ b/benchmarks/bloom_filter/contains_bench.cu
@@ -1,21 +1,9 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include "defaults.hpp"
-#include "utils.hpp"
#include
#include
@@ -25,156 +13,144 @@
#include
#include
+#include
#include
-#include
+#include
+#include
#include
#include
-using namespace cuco::benchmark; // defaults, dist_from_state, rebind_hasher_t, add_fpr_summary
+using namespace cuco::benchmark; // defaults, dist_from_state, rebind_hasher_t
using namespace cuco::utility; // key_generator, distribution
/**
* @brief A benchmark evaluating `cuco::bloom_filter::contains_async` performance
*/
-template
-void bloom_filter_contains(
- nvbench::state& state,
- nvbench::type_list, Dist>)
+template
+void bloom_filter_contains(nvbench::state& state,
+ nvbench::type_list,
+ nvbench::enum_type,
+ nvbench::enum_type,
+ nvbench::enum_type>)
{
- using size_type = std::uint32_t;
- using policy_type = cuco::default_filter_policy,
- Word,
- static_cast(WordsPerBlock)>;
- using filter_type =
- cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
-
- constexpr auto filter_block_size =
- sizeof(typename filter_type::word_type) * filter_type::words_per_block;
-
- // if (filter_block_size <= 32) {
- // cudaDeviceSetLimit(cudaLimitMaxL2FetchGranularity, 32); // slightly improves peformance if
- // filter block fits into a 32B sector
- // }
-
- auto const num_keys = state.get_int64("NumInputs");
- auto const filter_size_mb = state.get_int64("FilterSizeMB");
- auto const pattern_bits = WordsPerBlock;
-
- try {
- [[maybe_unused]] auto const policy = policy_type{static_cast(pattern_bits)};
- } catch (std::exception const& e) {
- state.skip(e.what()); // skip invalid configurations
+ auto constexpr words_per_block = BlockBits / cuda::std::numeric_limits::digits;
+ auto constexpr pattern_bits_per_word = PatternBits / words_per_block;
+
+ // Check for a valid configuration
+ if constexpr ((not cuda::std::has_single_bit(static_cast(BlockBits))) or
+ (words_per_block == 0)) {
+ state.skip("Invalid filter block size");
+ } else if constexpr (HorizontalLayout * VerticalLayout > words_per_block) {
+ state.skip("Invalid vectorization layout"); // TODO check if this is correct
+ } else if constexpr ((pattern_bits_per_word <= 0) or
+ (pattern_bits_per_word > cuda::std::numeric_limits::digits) or
+ (pattern_bits_per_word * words_per_block > 64)) {
+ state.skip("Invalid pattern bits per word");
+ } else {
+ using size_type = std::uint32_t;
+ auto constexpr add_vertical_layout = 1;
+ auto constexpr add_horizontal_layout = words_per_block;
+ using policy_type = cuco::bloom_filter_policy,
+ Word,
+ words_per_block,
+ PatternBits,
+ add_horizontal_layout,
+ add_vertical_layout,
+ HorizontalLayout,
+ VerticalLayout,
+ false,
+ false,
+ false>;
+ using filter_type =
+ cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
+
+ auto const num_keys = state.get_int64("NumInputs");
+ auto const filter_size_mb = state.get_int64("FilterSizeMB");
+
+ std::size_t const num_sub_filters =
+ (filter_size_mb * 1024 * 1024) /
+ (sizeof(typename filter_type::word_type) * filter_type::words_per_block);
+
+ if (num_sub_filters > policy_type::max_filter_blocks) {
+ // skip invalid configurations
+ state.skip("num_sub_filters exceeds max_filter_blocks");
+ }
+
+ state.add_element_count(num_keys);
+
+ filter_type filter{static_cast(num_sub_filters)};
+
+ thrust::counting_iterator key_it(0);
+
+ // insert FPR-optimal number of keys
+ auto const num_build_keys = (filter_size_mb * 1024 * 1024 * 8) / (2 * PatternBits);
+ filter.add(key_it, key_it + num_build_keys);
+
+ // FPR summary
+ thrust::device_vector result(num_keys, false);
+ filter.contains(key_it + num_build_keys, key_it + num_build_keys + num_keys, result.begin());
+
+ double const fp = thrust::count(thrust::device, result.begin(), result.end(), true);
+
+ auto& summ_fpr = state.add_summary("FalsePositiveRate");
+ summ_fpr.set_string("hint", "FPR");
+ summ_fpr.set_string("short_name", "FPR");
+ summ_fpr.set_string("description", "False-positive rate of the bloom filter.");
+ summ_fpr.set_float64("value", fp / static_cast(num_keys));
+
+ state.collect_dram_throughput();
+ state.collect_l2_hit_rates();
+
+ thrust::device_vector keys(num_keys);
+ thrust::sequence(thrust::device, keys.begin(), keys.end(), 0);
+
+ state.add_global_memory_reads(num_keys *
+ ((words_per_block * sizeof(Word)) + sizeof(Key)));
+ state.add_global_memory_writes(num_keys * sizeof(bool));
+
+ state.exec([&](nvbench::launch& launch) {
+ filter.contains_async(keys.begin(), keys.end(), result.begin(), {launch.get_stream()});
+ });
}
-
- std::size_t const num_sub_filters = (filter_size_mb * 1024 * 1024) / filter_block_size;
-
- if (num_sub_filters > std::numeric_limits::max()) {
- state.skip("num_sub_filters too large for size_type"); // skip invalid configurations
- }
-
- thrust::counting_iterator keys(0);
- thrust::device_vector result(num_keys, false);
-
- state.add_element_count(num_keys);
-
- filter_type filter{
- static_cast(num_sub_filters), {}, {static_cast(pattern_bits)}};
-
- state.collect_dram_throughput();
- state.collect_l2_hit_rates();
-
- add_fpr_summary(state, filter);
-
- filter.add(keys, keys + num_keys);
-
- state.exec([&](nvbench::launch& launch) {
- filter.contains_async(keys, keys + num_keys, result.begin(), {launch.get_stream()});
- });
-}
-
-/**
- * @brief A benchmark evaluating `cuco::bloom_filter::contains_async` performance with
- * `arrow_filter_policy`
- */
-template
-void arrow_bloom_filter_contains(nvbench::state& state, nvbench::type_list)
-{
- // cudaDeviceSetLimit(cudaLimitMaxL2FetchGranularity, 32); // slightly improves peformance if
- // filter block fits into a 32B sector
- using size_type = std::uint32_t;
- using policy_type = cuco::arrow_filter_policy;
- using filter_type =
- cuco::bloom_filter, cuda::thread_scope_device, policy_type>;
-
- auto const num_keys = state.get_int64("NumInputs");
- auto const filter_size_mb = state.get_int64("FilterSizeMB");
-
- std::size_t const num_sub_filters =
- (filter_size_mb * 1024 * 1024) /
- (sizeof(typename filter_type::word_type) * filter_type::words_per_block);
-
- if (num_sub_filters > policy_type::max_filter_blocks) {
- state.skip("bloom filter with arrow policy should have <= 4194304 blocks"); // skip invalid
- // configurations
- }
-
- thrust::counting_iterator keys(0);
- thrust::device_vector result(num_keys, false);
-
- state.add_element_count(num_keys);
-
- filter_type filter{static_cast(num_sub_filters)};
-
- state.collect_dram_throughput();
- state.collect_l2_hit_rates();
-
- add_fpr_summary(state, filter);
-
- filter.add(keys, keys + num_keys);
-
- state.exec([&](nvbench::launch& launch) {
- filter.contains_async(keys, keys + num_keys, result.begin(), {launch.get_stream()});
- });
}
+// Default benchmark: single layout matching default `cuco::bloom_filter_policy`.
NVBENCH_BENCH_TYPES(bloom_filter_contains,
NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list,
- nvbench::type_list,
- nvbench::enum_type_list,
- nvbench::type_list))
+ nvbench::type_list, ///< Word
+ nvbench::enum_type_list<256>, ///< BlockBits
+ nvbench::enum_type_list<8>, ///< PatternBits
+ nvbench::enum_type_list<1>, ///< HorizontalLayout
+ nvbench::enum_type_list<8> ///< VerticalLayout
+ ))
.set_name("bloom_filter_contains_unique_size")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
+ .set_type_axes_names(
+ {"Key", "Word", "BlockBits", "PatternBits", "HorizontalLayout", "VerticalLayout"})
.add_int64_axis("NumInputs", {defaults::BF_N})
.add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
-NVBENCH_BENCH_TYPES(bloom_filter_contains,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- defaults::HASH_RANGE,
- nvbench::type_list,
- nvbench::enum_type_list,
- nvbench::type_list))
- .set_name("bloom_filter_contains_unique_hash")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", {defaults::BF_SIZE_MB});
-
-NVBENCH_BENCH_TYPES(bloom_filter_contains,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list,
- nvbench::type_list,
- nvbench::enum_type_list<1, 2, 4, 8>,
- nvbench::type_list))
- .set_name("bloom_filter_contains_unique_block_dim")
- .set_type_axes_names({"Key", "Hash", "Word", "WordsPerBlock", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", {defaults::BF_SIZE_MB});
-
-NVBENCH_BENCH_TYPES(arrow_bloom_filter_contains,
- NVBENCH_TYPE_AXES(nvbench::type_list,
- nvbench::type_list))
- .set_name("arrow_bloom_filter_contains_unique_size")
- .set_type_axes_names({"Key", "Distribution"})
- .add_int64_axis("NumInputs", {defaults::BF_N})
- .add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
+// Exhaustive sweep across block sizes and vectorization layouts. Uncomment for performance
+// tuning / paper-style characterization; not run by default because the matrix is large.
+// NVBENCH_BENCH_TYPES(
+// bloom_filter_contains,
+// NVBENCH_TYPE_AXES(nvbench::type_list,
+// nvbench::type_list, ///< Word
+// nvbench::enum_type_list<64, 128, 256, 512, 1024>, ///< BlockBits
+// nvbench::enum_type_list<8, 16>, ///< PatternBits
+// nvbench::enum_type_list<1, 2, 4, 8, 16>, ///<
+// HorizontalLayout nvbench::enum_type_list<1, 2, 4, 8, 16> ///< VerticalLayout
+// ))
+// .set_name("bloom_filter_contains_full_sweep_u64")
+// .set_type_axes_names(
+// {"Key", "Word", "BlockBits", "PatternBits", "HorizontalLayout", "VerticalLayout"})
+// .add_int64_axis("NumInputs", {defaults::BF_N})
+// .add_int64_axis("FilterSizeMB", defaults::BF_SIZE_MB_RANGE_CACHE);
diff --git a/benchmarks/bloom_filter/defaults.hpp b/benchmarks/bloom_filter/defaults.hpp
index f1b192aa3..8b1fd9ab8 100644
--- a/benchmarks/bloom_filter/defaults.hpp
+++ b/benchmarks/bloom_filter/defaults.hpp
@@ -1,41 +1,21 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#pragma once
-#include
-
#include
-#include
-
#include
namespace cuco::benchmark::defaults {
-using BF_KEY = nvbench::int64_t;
-using BF_HASH = cuco::xxhash_64;
-using BF_WORD = nvbench::uint32_t;
+using BF_KEY = nvbench::int64_t;
-static constexpr auto BF_N = 1'000'000'000;
-static constexpr auto BF_SIZE_MB = 2'000;
-static constexpr auto BF_WORDS_PER_BLOCK = 8;
+static constexpr auto BF_N = 1'000'000'000;
auto const BF_SIZE_MB_RANGE_CACHE =
std::vector{1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
-auto const BF_PATTERN_BITS_RANGE = std::vector{1, 2, 4, 6, 8, 16};
} // namespace cuco::benchmark::defaults
diff --git a/benchmarks/bloom_filter/utils.hpp b/benchmarks/bloom_filter/utils.hpp
index cec7e06c3..26d2e6621 100644
--- a/benchmarks/bloom_filter/utils.hpp
+++ b/benchmarks/bloom_filter/utils.hpp
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#pragma once
@@ -27,21 +16,6 @@
#include
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::XXHash_64, "xxhash_64", "cuco::xxhash_64");
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::XXHash_32, "xxhash_32", "cuco::xxhash_32");
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_32,
- "murmurhash3_32",
- "cuco::murmurhash3_32");
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_x86_128,
- "murmurhash3_x86_128",
- "cuco::murmurhash3_x86_128");
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::MurmurHash3_x64_128,
- "murmurhash3_x64_128",
- "cuco::murmurhash3_x64_128");
-NVBENCH_DECLARE_TYPE_STRINGS(cuco::detail::identity_hash,
- "identity_hash",
- "cuco::identity_hash");
-
namespace cuco::benchmark {
template
diff --git a/benchmarks/dynamic_map/contains_bench.cu b/benchmarks/dynamic_map/contains_bench.cu
index 90867ee64..024fabc57 100644
--- a/benchmarks/dynamic_map/contains_bench.cu
+++ b/benchmarks/dynamic_map/contains_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/dynamic_map/erase_bench.cu b/benchmarks/dynamic_map/erase_bench.cu
index 5e0a02547..580fbb804 100644
--- a/benchmarks/dynamic_map/erase_bench.cu
+++ b/benchmarks/dynamic_map/erase_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/dynamic_map/find_bench.cu b/benchmarks/dynamic_map/find_bench.cu
index 2fd87d27c..7f605d9ef 100644
--- a/benchmarks/dynamic_map/find_bench.cu
+++ b/benchmarks/dynamic_map/find_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/dynamic_map/insert_bench.cu b/benchmarks/dynamic_map/insert_bench.cu
index 7c3d24bcf..f356465fc 100644
--- a/benchmarks/dynamic_map/insert_bench.cu
+++ b/benchmarks/dynamic_map/insert_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/dynamic_map/retrieve_all_bench.cu b/benchmarks/dynamic_map/retrieve_all_bench.cu
index 1dd34bbe1..4e1656c30 100644
--- a/benchmarks/dynamic_map/retrieve_all_bench.cu
+++ b/benchmarks/dynamic_map/retrieve_all_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2025-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/hash_function/hash_function_bench.cu b/benchmarks/hash_function/hash_function_bench.cu
index 001e637c0..089600629 100644
--- a/benchmarks/hash_function/hash_function_bench.cu
+++ b/benchmarks/hash_function/hash_function_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/hyperloglog/hyperloglog_bench.cu b/benchmarks/hyperloglog/hyperloglog_bench.cu
index 1ada00396..aeeff3dc8 100644
--- a/benchmarks/hyperloglog/hyperloglog_bench.cu
+++ b/benchmarks/hyperloglog/hyperloglog_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
@@ -24,8 +13,8 @@
#include
#include
+#include
#include
-#include
#include
#include
@@ -40,7 +29,7 @@ template
// Casting is valid since the keys generated are representable in int64_t.
using T = std::int64_t;
- auto cast_iter = thrust::make_transform_iterator(
+ auto cast_iter = cuda::make_transform_iterator(
first, cuda::proclaim_return_type([] __device__(auto i) { return static_cast(i); }));
auto set = cuco::static_set{n, 0.8, cuco::empty_key{-1}};
diff --git a/benchmarks/roaring_bitmap/contains_bench.cu b/benchmarks/roaring_bitmap/contains_bench.cu
index 6d9683f3d..77c9cef31 100644
--- a/benchmarks/roaring_bitmap/contains_bench.cu
+++ b/benchmarks/roaring_bitmap/contains_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_map/contains_bench.cu b/benchmarks/static_map/contains_bench.cu
index 3f9bf43b9..0f1b14b15 100644
--- a/benchmarks/static_map/contains_bench.cu
+++ b/benchmarks/static_map/contains_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_map/erase_bench.cu b/benchmarks/static_map/erase_bench.cu
index 519a5ee53..11c28f0b1 100644
--- a/benchmarks/static_map/erase_bench.cu
+++ b/benchmarks/static_map/erase_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_map/find_bench.cu b/benchmarks/static_map/find_bench.cu
index 95cf5a7fb..3e76c13a7 100644
--- a/benchmarks/static_map/find_bench.cu
+++ b/benchmarks/static_map/find_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_map/insert_bench.cu b/benchmarks/static_map/insert_bench.cu
index 04df7794b..f0afe192a 100644
--- a/benchmarks/static_map/insert_bench.cu
+++ b/benchmarks/static_map/insert_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_map/insert_or_apply_bench.cu b/benchmarks/static_map/insert_or_apply_bench.cu
index a128e7446..e978c9f18 100644
--- a/benchmarks/static_map/insert_or_apply_bench.cu
+++ b/benchmarks/static_map/insert_or_apply_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
@@ -51,7 +40,7 @@ std::enable_if_t<(sizeof(Key) == sizeof(Value)), void> static_map_insert_or_appl
thrust::device_vector pairs(num_keys);
thrust::transform(keys.begin(), keys.end(), pairs.begin(), [] __device__(Key const& key) {
- return pair_type(key, static_cast(key));
+ return pair_type(key, static_cast(key) + 1); // exclude sentinel (0)
});
state.add_element_count(num_keys);
diff --git a/benchmarks/static_multimap/count_bench.cu b/benchmarks/static_multimap/count_bench.cu
index a605ba3c7..44de007de 100644
--- a/benchmarks/static_multimap/count_bench.cu
+++ b/benchmarks/static_multimap/count_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multimap/insert_bench.cu b/benchmarks/static_multimap/insert_bench.cu
index c9b54e51e..11cb38dda 100644
--- a/benchmarks/static_multimap/insert_bench.cu
+++ b/benchmarks/static_multimap/insert_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multimap/query_bench.cu b/benchmarks/static_multimap/query_bench.cu
index 74849b742..3d5be3226 100644
--- a/benchmarks/static_multimap/query_bench.cu
+++ b/benchmarks/static_multimap/query_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multimap/retrieve_bench.cu b/benchmarks/static_multimap/retrieve_bench.cu
index 594533574..f07085db4 100644
--- a/benchmarks/static_multimap/retrieve_bench.cu
+++ b/benchmarks/static_multimap/retrieve_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2021-2026, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multiset/contains_bench.cu b/benchmarks/static_multiset/contains_bench.cu
index 767a3d9d6..e3bf91502 100644
--- a/benchmarks/static_multiset/contains_bench.cu
+++ b/benchmarks/static_multiset/contains_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multiset/count_bench.cu b/benchmarks/static_multiset/count_bench.cu
index d1af6b48e..e5dd77c40 100644
--- a/benchmarks/static_multiset/count_bench.cu
+++ b/benchmarks/static_multiset/count_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multiset/find_bench.cu b/benchmarks/static_multiset/find_bench.cu
index 20cb7ba34..fccfcb579 100644
--- a/benchmarks/static_multiset/find_bench.cu
+++ b/benchmarks/static_multiset/find_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multiset/insert_bench.cu b/benchmarks/static_multiset/insert_bench.cu
index 9bd3ee9c7..76d187412 100644
--- a/benchmarks/static_multiset/insert_bench.cu
+++ b/benchmarks/static_multiset/insert_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_multiset/retrieve_bench.cu b/benchmarks/static_multiset/retrieve_bench.cu
index 427cc13ed..36351e58d 100644
--- a/benchmarks/static_multiset/retrieve_bench.cu
+++ b/benchmarks/static_multiset/retrieve_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
@@ -22,6 +11,7 @@
#include
+#include
#include
#include
@@ -54,7 +44,7 @@ void static_multiset_retrieve(nvbench::state& state, nvbench::type_list output_match(output_size);
- auto output_probe_begin = thrust::discard_iterator{};
+ auto output_probe_begin = cuda::discard_iterator{};
state.exec(nvbench::exec_tag::sync, [&](nvbench::launch& launch) {
set.retrieve(
diff --git a/benchmarks/static_set/contains_bench.cu b/benchmarks/static_set/contains_bench.cu
index 87632740c..fedf5d070 100644
--- a/benchmarks/static_set/contains_bench.cu
+++ b/benchmarks/static_set/contains_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_set/find_bench.cu b/benchmarks/static_set/find_bench.cu
index b59c486b2..e2d2836d2 100644
--- a/benchmarks/static_set/find_bench.cu
+++ b/benchmarks/static_set/find_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_set/insert_bench.cu b/benchmarks/static_set/insert_bench.cu
index 7083a49e3..c66555887 100644
--- a/benchmarks/static_set/insert_bench.cu
+++ b/benchmarks/static_set/insert_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_set/rehash_bench.cu b/benchmarks/static_set/rehash_bench.cu
index 593289ce2..29e1344ff 100644
--- a/benchmarks/static_set/rehash_bench.cu
+++ b/benchmarks/static_set/rehash_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_set/retrieve_all_bench.cu b/benchmarks/static_set/retrieve_all_bench.cu
index 15cf2750d..283a5da7f 100644
--- a/benchmarks/static_set/retrieve_all_bench.cu
+++ b/benchmarks/static_set/retrieve_all_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/benchmarks/static_set/retrieve_bench.cu b/benchmarks/static_set/retrieve_bench.cu
index be6902e6c..37131642c 100644
--- a/benchmarks/static_set/retrieve_bench.cu
+++ b/benchmarks/static_set/retrieve_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
@@ -22,6 +11,7 @@
#include
+#include
#include
#include
@@ -54,7 +44,7 @@ void static_set_retrieve(nvbench::state& state, nvbench::type_list)
auto const output_size = set.count(keys.begin(), keys.end());
thrust::device_vector output_match(output_size);
- auto output_probe_begin = thrust::discard_iterator{};
+ auto output_probe_begin = cuda::discard_iterator{};
state.exec(nvbench::exec_tag::sync, [&](nvbench::launch& launch) {
set.retrieve(
diff --git a/benchmarks/static_set/size_bench.cu b/benchmarks/static_set/size_bench.cu
index f8827954a..72c2ac8b0 100644
--- a/benchmarks/static_set/size_bench.cu
+++ b/benchmarks/static_set/size_bench.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/ci/build.sh b/ci/build.sh
index 50cd33277..6b715cc1b 100755
--- a/ci/build.sh
+++ b/ci/build.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
set -eo pipefail
diff --git a/ci/doxygen_check.sh b/ci/doxygen_check.sh
index 51674764f..5fe82d641 100755
--- a/ci/doxygen_check.sh
+++ b/ci/doxygen_check.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# CI-specific doxygen script that downloads and uses doxygen 1.9.1
diff --git a/ci/matrix.yml b/ci/matrix.yml
index 708e673de..9031ce2f0 100644
--- a/ci/matrix.yml
+++ b/ci/matrix.yml
@@ -1,30 +1,11 @@
-# SPDX-FileCopyrightText: Copyright (c) 2023-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-cuda_12_0: &cuda_12_0 '12.0'
-cuda_12_9: &cuda_12_9 '12.9'
-cuda_13_0: &cuda_13_0 '13.0'
-
-# The GPUs to test on
-# Note: This assumes that the appropriate gpu_build_archs are set to include building for the GPUs listed here
-gpus:
- - 'a100'
- - 'v100'
+cuda_oldest: &cuda_oldest '12.0'
+cuda_newest: &cuda_newest '13.1'
# The version of the devcontainer images to use from https://hub.docker.com/r/rapidsai/devcontainers
-devcontainer_version: '25.12'
+devcontainer_version: '26.04'
# Each environment below will generate a unique build/test job
# See the "compute-matrix" job in the workflow for how this is parsed and used
@@ -43,11 +24,9 @@ devcontainer_version: '25.12'
# Configurations that will run for every PR
pull_request:
nvcc:
- - {cuda: *cuda_12_0, os: 'ubuntu22.04', cpu: 'amd64', compiler: {name: 'gcc', version: '11', exe: 'g++'}, gpu_build_archs: '70', std: [17], jobs: ['build', 'test']}
- - {cuda: *cuda_12_9, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'gcc', version: '13', exe: 'g++'}, gpu_build_archs: '70', std: [17], jobs: ['build', 'test']}
- - {cuda: *cuda_12_9, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'gcc', version: '13', exe: 'g++'}, gpu_build_archs: '80,90', std: [17], jobs: ['build']}
- - {cuda: *cuda_12_0, os: 'ubuntu20.04', cpu: 'amd64', compiler: {name: 'llvm', version: '14', exe: 'clang++'}, gpu_build_archs: '70', std: [17], jobs: ['build']}
- - {cuda: *cuda_12_9, os: 'ubuntu22.04', cpu: 'amd64', compiler: {name: 'llvm', version: '18', exe: 'clang++'}, gpu_build_archs: '90', std: [17], jobs: ['build']}
- - {cuda: *cuda_13_0, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'gcc', version: '13', exe: 'g++'}, gpu_build_archs: '80', std: [17], jobs: ['build']}
- - {cuda: *cuda_13_0, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'gcc', version: '13', exe: 'g++'}, gpu_build_archs: '80,90', std: [17], jobs: ['build']}
- - {cuda: *cuda_13_0, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'llvm', version: '20', exe: 'clang++'}, gpu_build_archs: '90', std: [17], jobs: ['build']}
+ - {cuda: *cuda_oldest, os: 'ubuntu22.04', cpu: 'amd64', compiler: {name: 'gcc', version: '11', exe: 'g++'}, gpu_build_archs: '70,80', std: [17], jobs: ['build', 'test']}
+ - {cuda: *cuda_newest, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'gcc', version: '14', exe: 'g++'}, gpu_build_archs: '90,100', std: [17], jobs: ['build', 'test']}
+ - {cuda: *cuda_newest, os: 'ubuntu24.04', cpu: 'arm64', compiler: {name: 'gcc', version: '14', exe: 'g++'}, gpu_build_archs: '80,90,100', std: [17], jobs: ['build']}
+ - {cuda: *cuda_oldest, os: 'ubuntu20.04', cpu: 'amd64', compiler: {name: 'llvm', version: '14', exe: 'clang++'}, gpu_build_archs: '70', std: [17], jobs: ['build']}
+ - {cuda: *cuda_newest, os: 'ubuntu24.04', cpu: 'amd64', compiler: {name: 'llvm', version: '21', exe: 'clang++'}, gpu_build_archs: '100', std: [17], jobs: ['build']}
+ - {cuda: *cuda_newest, os: 'ubuntu24.04', cpu: 'arm64', compiler: {name: 'llvm', version: '21', exe: 'clang++'}, gpu_build_archs: '100', std: [17], jobs: ['build']}
diff --git a/ci/pre-commit/doxygen.sh b/ci/pre-commit/doxygen.sh
index b23fc729c..498bcaab5 100755
--- a/ci/pre-commit/doxygen.sh
+++ b/ci/pre-commit/doxygen.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2022-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# Skip if doxygen is not installed
if ! [ -x "$(command -v doxygen)" ]; then
diff --git a/ci/pre-commit/example_links.py b/ci/pre-commit/example_links.py
index 1eb5073d6..8f9ed85de 100755
--- a/ci/pre-commit/example_links.py
+++ b/ci/pre-commit/example_links.py
@@ -1,4 +1,6 @@
#!/usr/bin/env python
+# SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
import os
import json
diff --git a/ci/sccache_hit_rate.sh b/ci/sccache_hit_rate.sh
index 8b6d2d3f5..4068cc686 100755
--- a/ci/sccache_hit_rate.sh
+++ b/ci/sccache_hit_rate.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
set -euo pipefail
diff --git a/ci/sccache_stats.sh b/ci/sccache_stats.sh
index a834347cb..031c2c580 100755
--- a/ci/sccache_stats.sh
+++ b/ci/sccache_stats.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# This script prints the sccache hit rate between two calls to sccache --show-stats.
# It should be sourced in your script before and after the operations you want to profile,
diff --git a/ci/test.sh b/ci/test.sh
index cfcce2acd..a3ef414d7 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -1,18 +1,6 @@
#!/bin/bash
-# SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
# Ensure the script is being executed in its containing directory
cd "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )";
diff --git a/ci/update_rapids_version.sh b/ci/update_rapids_version.sh
index 8140246be..a12f8a466 100755
--- a/ci/update_rapids_version.sh
+++ b/ci/update_rapids_version.sh
@@ -1,5 +1,6 @@
#!/bin/bash
-# Copyright (c) 2025, NVIDIA CORPORATION.
+# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
##########################
# RAPIDS Version Updater #
##########################
diff --git a/cmake/header_testing.cmake b/cmake/header_testing.cmake
index 52055eeb6..5a73c09c8 100644
--- a/cmake/header_testing.cmake
+++ b/cmake/header_testing.cmake
@@ -1,17 +1,8 @@
#=============================================================================
-# Copyright (c) 2025, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
#=============================================================================
# For every public header, build a translation unit containing `#include `
diff --git a/cmake/roaring_testdata.cmake b/cmake/roaring_testdata.cmake
index 168519866..88ac008b0 100644
--- a/cmake/roaring_testdata.cmake
+++ b/cmake/roaring_testdata.cmake
@@ -1,15 +1,8 @@
# =============================================================================
-# Copyright (c) 2025, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-# in compliance with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License
-# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-# or implied. See the License for the specific language governing permissions and limitations under
-# the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
# =============================================================================
# Only act if enabled
diff --git a/cmake/thirdparty/get_cccl.cmake b/cmake/thirdparty/get_cccl.cmake
index 6dcfef8a5..0bf7009cf 100644
--- a/cmake/thirdparty/get_cccl.cmake
+++ b/cmake/thirdparty/get_cccl.cmake
@@ -1,15 +1,8 @@
# =============================================================================
-# Copyright (c) 2021-2023, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
-# in compliance with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software distributed under the License
-# is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
-# or implied. See the License for the specific language governing permissions and limitations under
-# the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2021-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
# =============================================================================
# Use CPM to find or clone CCCL
diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 6724a3dc1..a709c1685 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -1,17 +1,8 @@
#=============================================================================
-# Copyright (c) 2018-2025, NVIDIA CORPORATION.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
+# cmake-format: off
+# SPDX-FileCopyrightText: Copyright (c) 2018-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+# SPDX-License-Identifier: Apache-2.0
+# cmake-format: on
#=============================================================================
cmake_minimum_required(VERSION 3.23.1 FATAL_ERROR)
@@ -48,4 +39,5 @@ ConfigureExample(STATIC_MULTIMAP_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/
ConfigureExample(HYPERLOGLOG_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/hyperloglog/host_bulk_example.cu")
ConfigureExample(HYPERLOGLOG_DEVICE_REF_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/hyperloglog/device_ref_example.cu")
ConfigureExample(BLOOM_FILTER_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/bloom_filter/host_bulk_example.cu")
+ConfigureExample(BLOOM_FILTER_PERSISTING_L2_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/bloom_filter/persisting_l2_example.cu")
ConfigureExample(ROARING_BITMAP_HOST_BULK_EXAMPLE "${CMAKE_CURRENT_SOURCE_DIR}/roaring_bitmap/host_bulk_example.cu")
diff --git a/examples/bloom_filter/host_bulk_example.cu b/examples/bloom_filter/host_bulk_example.cu
index f02f6e657..a8c75fdc2 100644
--- a/examples/bloom_filter/host_bulk_example.cu
+++ b/examples/bloom_filter/host_bulk_example.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/examples/bloom_filter/persisting_l2_example.cu b/examples/bloom_filter/persisting_l2_example.cu
new file mode 100644
index 000000000..b3ea7a4a6
--- /dev/null
+++ b/examples/bloom_filter/persisting_l2_example.cu
@@ -0,0 +1,101 @@
+/*
+ * SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+
+int main(void)
+{
+ /**
+ * This example shows how to create a Bloom filter that marks its filter-word accesses as
+ * persisting in L2 and how to reserve/reset the corresponding L2 set-aside with the CUDA
+ * runtime API.
+ *
+ * The `PersistingL2Access=true` policy parameter makes `cuco::bloom_filter` emit per-access L2
+ * persisting cache hints for global-memory filter words. The policy does not reserve cache
+ * capacity by itself; applications should reserve a persisting-L2 set-aside before the
+ * Bloom-filter phase with `cudaDeviceSetLimit(cudaLimitPersistingL2CacheSize, ...)` and reset
+ * persisting lines afterwards with `cudaCtxResetPersistingL2Cache()`.
+ *
+ * Use this only when the filter fits in the set-aside/L2 capacity, or when the key stream has
+ * enough locality that persisted filter lines are reused. If the filter is much larger than L2,
+ * random accesses can continually mark cold lines as persisting, thrash the persisting region,
+ * and slow unrelated kernels until the persisting cache is reset.
+ *
+ * NVIDIA RTX PRO 6000 Blackwell Max-Q Workstation Edition, 128 MiB L2, 200M input items:
+ *
+ * filter size | add, default | add, persisting L2 | contains, default | contains, persisting L2
+ * ----------- | ------------ | ------------------ | ----------------- | ------------------------
+ * 64 MiB | 4.880 ms | 3.405 ms | 2.444 ms | 2.427 ms
+ * 80 MiB | 8.276 ms | 3.380 ms | 4.706 ms | 2.443 ms
+ * 96 MiB | 11.004 ms | 3.476 ms | 4.874 ms | 2.575 ms
+ * 128 MiB | 22.602 ms | 9.097 ms | 5.545 ms | 5.371 ms
+ */
+
+ using key_type = int;
+
+ int constexpr num_keys = 10'000;
+
+ // Create a Bloom filter policy with persisting L2 access enabled. This is the same shape as the
+ // default policy, except the final `PersistingL2Access` parameter is `true`.
+ using policy_type = cuco::bloom_filter_policy,
+ std::uint32_t,
+ 8,
+ 8,
+ 8,
+ 1,
+ 1,
+ 8,
+ false,
+ false,
+ true>; ///< Persisting L2 access enabled.
+ auto constexpr bytes_per_block = sizeof(policy_type::word_type) * policy_type::words_per_block;
+
+ int device = 0;
+ CUCO_CUDA_TRY(cudaGetDevice(&device));
+
+ int max_persisting_l2_cache_size = 0;
+ CUCO_CUDA_TRY(cudaDeviceGetAttribute(
+ &max_persisting_l2_cache_size, cudaDevAttrMaxPersistingL2CacheSize, device));
+
+ // Create a filter that occupies 80% of the maximum supported persisting-L2 set-aside, then
+ // reserve enough persisting L2 for that filter before launching Bloom-filter kernels.
+ auto constexpr l2_set_aside_fraction = 0.8;
+ auto const target_filter_size =
+ static_cast(l2_set_aside_fraction * max_persisting_l2_cache_size);
+ CUCO_CUDA_TRY(cudaDeviceSetLimit(cudaLimitPersistingL2CacheSize, target_filter_size));
+
+ auto const sub_filters = target_filter_size / bytes_per_block;
+
+ // This filter marks global-memory filter-word loads and atomics as persisting-L2 accesses.
+ cuco::bloom_filter, cuda::thread_scope_device, policy_type>
+ filter{sub_filters};
+
+ thrust::device_vector keys(num_keys);
+ thrust::sequence(keys.begin(), keys.end(), 1);
+
+ // Insert all keys into the filter.
+ filter.add(keys.begin(), keys.end());
+
+ thrust::device_vector result(num_keys, false);
+
+ // Query the same keys.
+ filter.contains(keys.begin(), keys.end(), result.begin());
+
+ // Evict persisting lines so unrelated later kernels do not inherit stale cache residency.
+ CUCO_CUDA_TRY(cudaCtxResetPersistingL2Cache());
+
+ // Release the persisting-L2 set-aside.
+ CUCO_CUDA_TRY(cudaDeviceSetLimit(cudaLimitPersistingL2CacheSize, 0));
+
+ return 0;
+}
diff --git a/examples/hyperloglog/device_ref_example.cu b/examples/hyperloglog/device_ref_example.cu
index c149f36f1..d589ec85d 100644
--- a/examples/hyperloglog/device_ref_example.cu
+++ b/examples/hyperloglog/device_ref_example.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/examples/hyperloglog/host_bulk_example.cu b/examples/hyperloglog/host_bulk_example.cu
index 545c72d38..8226adfb7 100644
--- a/examples/hyperloglog/host_bulk_example.cu
+++ b/examples/hyperloglog/host_bulk_example.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2024, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2024-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/examples/roaring_bitmap/host_bulk_example.cu b/examples/roaring_bitmap/host_bulk_example.cu
index dba7be9cc..d64986c61 100644
--- a/examples/roaring_bitmap/host_bulk_example.cu
+++ b/examples/roaring_bitmap/host_bulk_example.cu
@@ -1,17 +1,6 @@
/*
- * Copyright (c) 2025 NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2025-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
diff --git a/examples/static_map/count_by_key_example.cu b/examples/static_map/count_by_key_example.cu
index dcecf4e4e..87cd53025 100644
--- a/examples/static_map/count_by_key_example.cu
+++ b/examples/static_map/count_by_key_example.cu
@@ -1,22 +1,12 @@
/*
- * Copyright (c) 2023-2025, NVIDIA CORPORATION.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
+ * SPDX-FileCopyrightText: Copyright (c) 2023-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
+ * SPDX-License-Identifier: Apache-2.0
*/
#include
#include
+#include
#include
#include
#include
@@ -113,8 +103,8 @@ int main(void)
thrust::device_vector insert_keys(num_keys);
// Create a sequence of keys. Eeach distinct key has key_duplicates many matches.
thrust::transform(
- thrust::make_counting_iterator(0),
- thrust::make_counting_iterator(insert_keys.size()),
+ cuda::make_counting_iterator