29 #include <tbb/concurrent_unordered_map.h> 32 #include <unordered_map> 40 template <
typename Key,
typename Hash,
typename Eq>
45 const std::vector<int64_t>& value_dsizes,
49 void Reserve(int64_t capacity)
override;
51 void Insert(
const void* input_keys,
52 const std::vector<const void*>& input_values_soa,
55 int64_t
count)
override;
57 void Find(
const void* input_keys,
60 int64_t count)
override;
62 void Erase(
const void* input_keys,
64 int64_t count)
override;
68 void Clear()
override;
70 int64_t
Size()
const override;
75 std::shared_ptr<tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>
80 void Allocate(int64_t capacity)
override;
84 std::shared_ptr<tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>
90 template <
typename Key,
typename Hash,
typename Eq>
92 int64_t init_capacity,
94 const std::vector<int64_t>& value_dsizes,
100 template <
typename Key,
typename Hash,
typename Eq>
103 template <
typename Key,
typename Hash,
typename Eq>
105 return impl_->size();
108 template <
typename Key,
typename Hash,
typename Eq>
113 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
115 #pragma omp parallel for num_threads(utility::EstimateMaxThreads()) 116 for (int64_t i = 0; i <
count; ++i) {
117 const Key& key = input_keys_templated[i];
119 auto iter =
impl_->find(key);
120 bool flag = (iter !=
impl_->end());
121 output_masks[i] = flag;
122 output_buf_indices[i] = flag ? iter->second : 0;
126 template <
typename Key,
typename Hash,
typename Eq>
130 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
132 for (int64_t i = 0; i <
count; ++i) {
133 const Key& key = input_keys_templated[i];
135 auto iter =
impl_->find(key);
136 bool flag = (iter !=
impl_->end());
137 output_masks[i] = flag;
140 impl_->unsafe_erase(iter);
145 template <
typename Key,
typename Hash,
typename Eq>
150 for (
auto iter =
impl_->begin(); iter !=
impl_->end(); ++iter, ++i) {
151 output_buf_indices[i] =
static_cast<int64_t
>(iter->second);
157 template <
typename Key,
typename Hash,
typename Eq>
163 template <
typename Key,
typename Hash,
typename Eq>
168 template <
typename Key,
typename Hash,
typename Eq>
170 return impl_->unsafe_bucket_count();
173 template <
typename Key,
typename Hash,
typename Eq>
175 int64_t bucket_count =
impl_->unsafe_bucket_count();
176 std::vector<int64_t> ret;
177 for (int64_t i = 0; i < bucket_count; ++i) {
178 ret.push_back(
impl_->unsafe_bucket_size(i));
183 template <
typename Key,
typename Hash,
typename Eq>
185 return impl_->load_factor();
188 template <
typename Key,
typename Hash,
typename Eq>
190 const void* input_keys,
191 const std::vector<const void*>& input_values_soa,
195 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
197 size_t n_values = input_values_soa.size();
199 #pragma omp parallel for num_threads(utility::EstimateMaxThreads()) 200 for (int64_t i = 0; i <
count; ++i) {
201 output_buf_indices[i] = 0;
202 output_masks[i] =
false;
204 const Key& key = input_keys_templated[i];
207 auto res =
impl_->insert({key, 0});
215 *
static_cast<Key*
>(key_ptr) = key;
218 for (
size_t j = 0; j < n_values; ++j) {
219 uint8_t* dst_value =
static_cast<uint8_t*
>(
222 const uint8_t* src_value =
223 static_cast<const uint8_t*
>(input_values_soa[j]) +
229 res.first->second = buf_index;
232 output_buf_indices[i] = buf_index;
233 output_masks[i] =
true;
238 template <
typename Key,
typename Hash,
typename Eq>
242 this->
buffer_ = std::make_shared<HashBackendBuffer>(
247 std::make_shared<CPUHashBackendBufferAccessor>(*this->
buffer_);
249 impl_ = std::make_shared<
250 tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>(
251 capacity, Hash(), Eq());
std::shared_ptr< HashBackendBuffer > buffer_
Definition: DeviceHashBackend.h:121
std::shared_ptr< tbb::concurrent_unordered_map< Key, buf_index_t, Hash, Eq > > GetImpl() const
Definition: TBBHashBackend.h:76
int64_t GetBucketCount() const override
Get the number of buckets of the hash map.
Definition: TBBHashBackend.h:169
std::vector< int64_t > value_dsizes_
Definition: DeviceHashBackend.h:117
std::vector< int64_t > BucketSizes() const override
Get the number of entries per bucket.
Definition: TBBHashBackend.h:174
TBBHashBackend(int64_t init_capacity, int64_t key_dsize, const std::vector< int64_t > &value_dsizes, const Device &device)
Definition: TBBHashBackend.h:91
void Clear() override
Clear stored map without reallocating memory.
Definition: TBBHashBackend.h:158
void Free() override
Definition: TBBHashBackend.h:81
Device device_
Definition: DeviceHashBackend.h:119
std::shared_ptr< CPUHashBackendBufferAccessor > buffer_accessor_
Definition: TBBHashBackend.h:87
uint32_t buf_index_t
Definition: HashBackendBuffer.h:63
FN_SPECIFIERS MiniVec< float, N > ceil(const MiniVec< float, N > &a)
Definition: MiniVec.h:108
int64_t key_dsize_
Definition: DeviceHashBackend.h:116
void Find(const void *input_keys, buf_index_t *output_buf_indices, bool *output_masks, int64_t count) override
Parallel find a contiguous array of keys.
Definition: TBBHashBackend.h:109
int64_t capacity_
Definition: DeviceHashBackend.h:114
float LoadFactor() const override
Get the current load factor, defined as size / bucket count.
Definition: TBBHashBackend.h:184
std::shared_ptr< tbb::concurrent_unordered_map< Key, buf_index_t, Hash, Eq > > impl_
Definition: TBBHashBackend.h:81
Definition: TBBHashBackend.h:41
void Allocate(int64_t capacity) override
Definition: TBBHashBackend.h:239
~TBBHashBackend()
Definition: TBBHashBackend.h:101
void Reserve(int64_t capacity) override
Definition: TBBHashBackend.h:164
int64_t GetActiveIndices(buf_index_t *output_indices) override
Parallel collect all iterators in the hash table.
Definition: TBBHashBackend.h:146
Definition: PinholeCameraIntrinsic.cpp:35
int64_t Size() const override
Get the size (number of valid entries) of the hash map.
Definition: TBBHashBackend.h:104
void Insert(const void *input_keys, const std::vector< const void *> &input_values_soa, buf_index_t *output_buf_indices, bool *output_masks, int64_t count) override
Parallel insert contiguous arrays of keys and values.
Definition: TBBHashBackend.h:189
Definition: DeviceHashBackend.h:39
void Erase(const void *input_keys, bool *output_masks, int64_t count) override
Parallel erase a contiguous array of keys.
Definition: TBBHashBackend.h:127