-
Notifications
You must be signed in to change notification settings - Fork 108
make murmurhash3_x64_128 compatible with existing cuco data structures #501
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 2 commits
2001837
56efe03
3ae1afe
c203168
8feddca
6657e23
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -16,6 +16,8 @@ | |
|
|
||
| #pragma once | ||
|
|
||
| #include <cuco/detail/__config> | ||
|
|
||
| #include <cstdint> | ||
|
|
||
| namespace cuco { | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -17,6 +17,7 @@ | |
|
|
||
| #include <cuco/detail/bitwise_compare.cuh> | ||
|
|
||
| #include <cuda/std/array> | ||
|
srinivasyadav18 marked this conversation as resolved.
|
||
| #include <cuda/std/bit> | ||
| #include <cuda/std/cmath> | ||
| #include <cuda/std/type_traits> | ||
|
|
@@ -81,6 +82,16 @@ struct slot_is_filled { | |
| } | ||
| }; | ||
|
|
||
| template <typename SizeType, typename HashType> | ||
| __host__ __device__ constexpr SizeType to_positive(HashType hash) | ||
| { | ||
| if constexpr (cuda::std::is_signed_v<SizeType>) { | ||
| return cuda::std::abs(static_cast<SizeType>(hash)); | ||
| } else { | ||
| return static_cast<SizeType>(hash); | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * @brief Converts a given hash value into a valid (positive) size type. | ||
| * | ||
|
|
@@ -92,12 +103,33 @@ struct slot_is_filled { | |
| template <typename SizeType, typename HashType> | ||
| __host__ __device__ constexpr SizeType sanitize_hash(HashType hash) noexcept | ||
| { | ||
| if constexpr (cuda::std::is_signed_v<SizeType>) { | ||
| return cuda::std::abs(static_cast<SizeType>(hash)); | ||
| if constexpr (cuda::std::is_same_v<HashType, cuda::std::array<std::uint64_t, 2>>) { | ||
| #if !defined(CUCO_HAS_INT128) | ||
| static_assert(false, | ||
| "CUCO_HAS_INT128 undefined. Need unsigned __int128 type when sanitizing " | ||
| "cuda::std::array<std::uint64_t, 2>"); | ||
| #endif | ||
| unsigned __int128 ret{}; | ||
| memcpy(&ret, &hash, sizeof(unsigned __int128)); | ||
| return to_positive<SizeType>(static_cast<SizeType>(ret)); | ||
| } else { | ||
| return static_cast<SizeType>(hash); | ||
| return to_positive<SizeType>(hash); | ||
| } | ||
| } | ||
|
|
||
| /** | ||
| * @brief Converts a given hash value and cg_rank, into a valid (positive) size type. | ||
| * | ||
| * @tparam SizeType The target type | ||
| * @tparam HashType The input type | ||
| * | ||
| * @return Converted hash value | ||
| */ | ||
| template <typename SizeType, typename HashType> | ||
| __host__ __device__ constexpr SizeType sanitize_hash(HashType hash, std::uint32_t cg_rank) noexcept | ||
|
srinivasyadav18 marked this conversation as resolved.
Outdated
|
||
| { | ||
| return sanitize_hash<SizeType>(sanitize_hash<SizeType>(hash) + cg_rank); | ||
|
Collaborator
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. There exists a scenario where this approach fails and it's the reason CI in my initial draft PR failed.
In this scenario, if we compute To solve this we need check if
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for the detailed explanation! |
||
| } | ||
|
|
||
| } // namespace detail | ||
| } // namespace cuco | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,72 @@ | ||
| /* | ||
| * 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. | ||
| */ | ||
|
|
||
| #include <test_utils.hpp> | ||
|
|
||
| #include <cuco/hash_functions.cuh> | ||
| #include <cuco/static_map.cuh> | ||
|
|
||
| #include <thrust/device_vector.h> | ||
| #include <thrust/functional.h> | ||
| #include <thrust/iterator/counting_iterator.h> | ||
| #include <thrust/iterator/transform_iterator.h> | ||
|
|
||
| #include <catch2/catch_template_test_macros.hpp> | ||
|
|
||
| using size_type = std::size_t; | ||
|
|
||
| template <typename Key, typename Hash> | ||
| void test_hash_function() | ||
| { | ||
| using Value = int64_t; | ||
|
|
||
| constexpr size_type num_keys{400}; | ||
|
|
||
| auto map = cuco::static_map<Key, | ||
| Value, | ||
| cuco::extent<size_type>, | ||
| cuda::thread_scope_device, | ||
| thrust::equal_to<Key>, | ||
| cuco::linear_probing<1, Hash>, | ||
| cuco::cuda_allocator<std::byte>, | ||
| cuco::storage<2>>{ | ||
| num_keys, cuco::empty_key<Key>{-1}, cuco::empty_value<Value>{-1}}; | ||
|
|
||
| auto keys_begin = thrust::counting_iterator<Key>(1); | ||
|
|
||
| auto pairs_begin = thrust::make_transform_iterator( | ||
| keys_begin, cuda::proclaim_return_type<cuco::pair<Key, Value>>([] __device__(auto i) { | ||
| return cuco::pair<Key, Value>(i, i); | ||
| })); | ||
|
|
||
| thrust::device_vector<bool> d_keys_exist(num_keys); | ||
|
|
||
| map.insert(pairs_begin, pairs_begin + num_keys); | ||
|
|
||
| REQUIRE(map.size() == num_keys); | ||
|
|
||
| map.contains(keys_begin, keys_begin + num_keys, d_keys_exist.begin()); | ||
|
|
||
| REQUIRE(cuco::test::all_of(d_keys_exist.begin(), d_keys_exist.end(), thrust::identity{})); | ||
| } | ||
|
|
||
| TEMPLATE_TEST_CASE_SIG("static_map hash tests", "", ((typename Key)), (int32_t), (int64_t)) | ||
| { | ||
| test_hash_function<Key, cuco::murmurhash3_32<Key>>(); | ||
| test_hash_function<Key, cuco::murmurhash3_x64_128<Key>>(); | ||
| test_hash_function<Key, cuco::xxhash_32<Key>>(); | ||
| test_hash_function<Key, cuco::xxhash_64<Key>>(); | ||
| } |
Uh oh!
There was an error while loading. Please reload this page.