10#include <tbb/concurrent_unordered_map.h>
11#include <tbb/parallel_for.h>
14#include <unordered_map>
22template <
typename Key,
typename Hash,
typename Eq>
27 const std::vector<int64_t>& value_dsizes,
31 void Reserve(int64_t capacity)
override;
33 void Insert(
const void* input_keys,
34 const std::vector<const void*>& input_values_soa,
37 int64_t
count)
override;
39 void Find(
const void* input_keys,
42 int64_t
count)
override;
44 void Erase(
const void* input_keys,
46 int64_t
count)
override;
50 void Clear()
override;
52 int64_t
Size()
const override;
57 std::shared_ptr<tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>
62 void Allocate(int64_t capacity)
override;
66 std::shared_ptr<tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>
72template <
typename Key,
typename Hash,
typename Eq>
74 int64_t init_capacity,
76 const std::vector<int64_t>& value_dsizes,
82template <
typename Key,
typename Hash,
typename Eq>
85template <
typename Key,
typename Hash,
typename Eq>
90template <
typename Key,
typename Hash,
typename Eq>
95 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
98 tbb::blocked_range<int64_t>(0,
count, 64),
99 [=, &impl = impl_](
const tbb::blocked_range<int64_t>& range) {
100 for (int64_t i = range.begin(); i < range.end(); ++i) {
101 const Key& key = input_keys_templated[i];
103 auto iter = impl->find(key);
104 bool flag = (iter != impl->end());
105 output_masks[i] = flag;
106 output_buf_indices[i] = flag ? iter->second : 0;
111template <
typename Key,
typename Hash,
typename Eq>
115 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
117 for (int64_t i = 0; i <
count; ++i) {
118 const Key& key = input_keys_templated[i];
120 auto iter = impl_->find(key);
121 bool flag = (iter != impl_->end());
122 output_masks[i] = flag;
124 buffer_accessor_->DeviceFree(iter->second);
125 impl_->unsafe_erase(iter);
130template <
typename Key,
typename Hash,
typename Eq>
133 int64_t
count = impl_->size();
135 for (
auto iter = impl_->begin(); iter != impl_->end(); ++iter, ++i) {
136 output_buf_indices[i] =
static_cast<int64_t
>(iter->second);
142template <
typename Key,
typename Hash,
typename Eq>
145 this->buffer_->ResetHeap();
148template <
typename Key,
typename Hash,
typename Eq>
150 impl_->rehash(std::ceil(capacity / impl_->max_load_factor()));
153template <
typename Key,
typename Hash,
typename Eq>
155 return impl_->unsafe_bucket_count();
158template <
typename Key,
typename Hash,
typename Eq>
160 int64_t bucket_count = impl_->unsafe_bucket_count();
161 std::vector<int64_t> ret;
162 for (int64_t i = 0; i < bucket_count; ++i) {
163 ret.push_back(impl_->unsafe_bucket_size(i));
168template <
typename Key,
typename Hash,
typename Eq>
170 return impl_->load_factor();
173template <
typename Key,
typename Hash,
typename Eq>
175 const void* input_keys,
176 const std::vector<const void*>& input_values_soa,
180 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
182 size_t n_values = input_values_soa.size();
185 tbb::blocked_range<int64_t>(0,
count, 64),
186 [&](
const tbb::blocked_range<int64_t>& range) {
187 for (int64_t i = range.begin(); i < range.end(); ++i) {
188 output_buf_indices[i] = 0;
189 output_masks[i] =
false;
191 const Key& key = input_keys_templated[i];
194 auto res = impl_->insert({key, 0});
199 buffer_accessor_->DeviceAllocate();
200 void* key_ptr = buffer_accessor_->GetKeyPtr(buf_index);
203 *
static_cast<Key*
>(key_ptr) = key;
206 for (
size_t j = 0; j < n_values; ++j) {
207 uint8_t* dst_value =
static_cast<uint8_t*
>(
208 buffer_accessor_->GetValuePtr(buf_index,
211 const uint8_t* src_value =
212 static_cast<const uint8_t*
>(
213 input_values_soa[j]) +
214 this->value_dsizes_[j] * i;
215 std::memcpy(dst_value, src_value,
216 this->value_dsizes_[j]);
220 res.first->second = buf_index;
223 output_buf_indices[i] = buf_index;
224 output_masks[i] =
true;
230template <
typename Key,
typename Hash,
typename Eq>
232 this->capacity_ = capacity;
234 this->buffer_ = std::make_shared<HashBackendBuffer>(
235 this->capacity_, this->key_dsize_, this->value_dsizes_,
239 std::make_shared<CPUHashBackendBufferAccessor>(*this->buffer_);
241 impl_ = std::make_shared<
242 tbb::concurrent_unordered_map<Key, buf_index_t, Hash, Eq>>(
243 capacity, Hash(), Eq());
Definition DeviceHashBackend.h:20
Definition TBBHashBackend.h:23
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:174
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:91
void Erase(const void *input_keys, bool *output_masks, int64_t count) override
Parallel erase a contiguous array of keys.
Definition TBBHashBackend.h:112
TBBHashBackend(int64_t init_capacity, int64_t key_dsize, const std::vector< int64_t > &value_dsizes, const Device &device)
Definition TBBHashBackend.h:73
std::shared_ptr< CPUHashBackendBufferAccessor > buffer_accessor_
Definition TBBHashBackend.h:69
std::vector< int64_t > BucketSizes() const override
Get the number of entries per bucket.
Definition TBBHashBackend.h:159
void Reserve(int64_t capacity) override
Definition TBBHashBackend.h:149
~TBBHashBackend()
Definition TBBHashBackend.h:83
std::shared_ptr< tbb::concurrent_unordered_map< Key, buf_index_t, Hash, Eq > > GetImpl() const
Definition TBBHashBackend.h:58
int64_t GetActiveIndices(buf_index_t *output_indices) override
Parallel collect all iterators in the hash table.
Definition TBBHashBackend.h:131
void Clear() override
Clear stored map without reallocating memory.
Definition TBBHashBackend.h:143
std::shared_ptr< tbb::concurrent_unordered_map< Key, buf_index_t, Hash, Eq > > impl_
Definition TBBHashBackend.h:67
int64_t GetBucketCount() const override
Get the number of buckets of the hash map.
Definition TBBHashBackend.h:154
void Free() override
Definition TBBHashBackend.h:63
void Allocate(int64_t capacity) override
Definition TBBHashBackend.h:231
int64_t Size() const override
Get the size (number of valid entries) of the hash map.
Definition TBBHashBackend.h:86
float LoadFactor() const override
Get the current load factor, defined as size / bucket count.
Definition TBBHashBackend.h:169
uint32_t buf_index_t
Definition HashBackendBuffer.h:49
Definition PinholeCameraIntrinsic.cpp:16