29 #include <tbb/concurrent_unordered_map.h> 32 #include <unordered_map> 39 template <
typename Key,
typename Hash>
48 void Rehash(int64_t buckets)
override;
50 void Insert(
const void* input_keys,
51 const void* input_values,
54 int64_t
count)
override;
56 void Activate(
const void* input_keys,
59 int64_t count)
override;
61 void Find(
const void* input_keys,
64 int64_t count)
override;
66 void Erase(
const void* input_keys,
68 int64_t count)
override;
72 void Clear()
override;
74 int64_t
Size()
const override;
79 std::shared_ptr<tbb::concurrent_unordered_map<Key, addr_t, Hash>>
GetImpl()
85 std::shared_ptr<tbb::concurrent_unordered_map<Key, addr_t, Hash>>
impl_;
90 const void* input_values,
98 template <
typename Key,
typename Hash>
103 :
DeviceHashmap(init_capacity, dsize_key, dsize_value, device) {
107 template <
typename Key,
typename Hash>
110 template <
typename Key,
typename Hash>
112 return impl_->size();
115 template <
typename Key,
typename Hash>
117 const void* input_values,
124 float avg_capacity_per_bucket =
127 int64_t expected_buckets =
std::max(
129 int64_t(
std::ceil(new_size / avg_capacity_per_bucket)));
133 InsertImpl(input_keys, input_values, output_addrs, output_masks, count);
136 template <
typename Key,
typename Hash>
141 Insert(input_keys,
nullptr, output_addrs, output_masks, count);
144 template <
typename Key,
typename Hash>
149 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
151 #pragma omp parallel for 152 for (int64_t i = 0; i <
count; ++i) {
153 const Key& key = input_keys_templated[i];
155 auto iter =
impl_->find(key);
156 bool flag = (iter !=
impl_->end());
157 output_masks[i] = flag;
158 output_addrs[i] = flag ? iter->second : 0;
162 template <
typename Key,
typename Hash>
166 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
168 for (int64_t i = 0; i <
count; ++i) {
169 const Key& key = input_keys_templated[i];
171 auto iter =
impl_->find(key);
172 bool flag = (iter !=
impl_->end());
173 output_masks[i] = flag;
176 impl_->unsafe_erase(iter);
181 template <
typename Key,
typename Hash>
185 for (
auto iter =
impl_->begin(); iter !=
impl_->end(); ++iter, ++i) {
186 output_indices[i] =
static_cast<int64_t
>(iter->second);
192 template <
typename Key,
typename Hash>
198 template <
typename Key,
typename Hash>
200 int64_t iterator_count =
Size();
205 if (iterator_count > 0) {
214 float avg_capacity_per_bucket =
216 int64_t new_capacity =
217 int64_t(
std::ceil(buckets * avg_capacity_per_bucket));
221 if (iterator_count > 0) {
226 static_cast<addr_t*
>(output_addrs.GetDataPtr()),
227 output_masks.GetDataPtr<
bool>(), iterator_count);
230 impl_->rehash(buckets);
233 template <
typename Key,
typename Hash>
235 return impl_->unsafe_bucket_count();
238 template <
typename Key,
typename Hash>
240 int64_t bucket_count =
impl_->unsafe_bucket_count();
241 std::vector<int64_t> ret;
242 for (int64_t i = 0; i < bucket_count; ++i) {
243 ret.push_back(
impl_->unsafe_bucket_size(i));
248 template <
typename Key,
typename Hash>
250 return impl_->load_factor();
253 template <
typename Key,
typename Hash>
255 const void* input_values,
259 const Key* input_keys_templated =
static_cast<const Key*
>(input_keys);
261 #pragma omp parallel for 262 for (int64_t i = 0; i <
count; ++i) {
264 output_masks[i] =
false;
266 const Key& key = input_keys_templated[i];
269 auto res =
impl_->insert({key, 0});
274 auto dst_kv_iter =
buffer_ctx_->ExtractIterator(dst_kv_addr);
277 *
static_cast<Key*
>(dst_kv_iter.first) = key;
280 uint8_t* dst_value =
static_cast<uint8_t*
>(dst_kv_iter.second);
281 if (input_values !=
nullptr) {
282 const uint8_t* src_value =
283 static_cast<const uint8_t*
>(input_values) +
291 res.first->second = dst_kv_addr;
294 output_addrs[i] = dst_kv_addr;
295 output_masks[i] =
true;
300 template <
typename Key,
typename Hash>
308 buffer_ctx_ = std::make_shared<CPUHashmapBufferAccessor>(
312 buffer_ctx_->Reset();
314 impl_ = std::make_shared<tbb::concurrent_unordered_map<Key, addr_t, Hash>>(
float LoadFactor() const override
Definition: TBBHashmap.h:249
void Clear() override
Clear stored map without reallocating memory.
Definition: TBBHashmap.h:193
std::vector< int64_t > BucketSizes() const override
Definition: TBBHashmap.h:239
void Find(const void *input_keys, addr_t *output_addrs, bool *output_masks, int64_t count) override
Parallel find a contiguous array of keys.
Definition: TBBHashmap.h:145
void Erase(const void *input_keys, bool *output_masks, int64_t count) override
Parallel erase a contiguous array of keys.
Definition: TBBHashmap.h:163
std::shared_ptr< tbb::concurrent_unordered_map< Key, addr_t, Hash > > GetImpl() const
Definition: TBBHashmap.h:79
void Allocate(int64_t capacity)
Definition: TBBHashmap.h:301
FN_SPECIFIERS MiniVec< float, N > ceil(const MiniVec< float, N > &a)
Definition: MiniVec.h:108
int64_t Size() const override
Definition: TBBHashmap.h:111
std::shared_ptr< CPUHashmapBufferAccessor > buffer_ctx_
Definition: TBBHashmap.h:87
void Activate(const void *input_keys, addr_t *output_addrs, bool *output_masks, int64_t count) override
Definition: TBBHashmap.h:137
Definition: DeviceHashmap.h:39
void Rehash(int64_t buckets) override
Definition: TBBHashmap.h:199
int64_t GetBucketCount() const override
Definition: TBBHashmap.h:234
static const Dtype Int32
Definition: Dtype.h:46
Tensor IndexGet(const std::vector< Tensor > &index_tensors) const
Advanced indexing getter.
Definition: Tensor.cpp:704
~TBBHashmap()
Definition: TBBHashmap.h:108
Tensor To(Dtype dtype, bool copy=false) const
Definition: Tensor.cpp:540
Device device_
Definition: DeviceHashmap.h:113
int count
Definition: FilePCD.cpp:61
void InsertImpl(const void *input_keys, const void *input_values, addr_t *output_addrs, bool *output_masks, int64_t count)
Definition: TBBHashmap.h:254
void Insert(const void *input_keys, const void *input_values, addr_t *output_addrs, bool *output_masks, int64_t count) override
Parallel insert contiguous arrays of keys and values.
Definition: TBBHashmap.h:116
std::shared_ptr< tbb::concurrent_unordered_map< Key, addr_t, Hash > > impl_
Definition: TBBHashmap.h:85
static const Dtype Int64
Definition: Dtype.h:47
Definition: PinholeCameraIntrinsic.cpp:35
TBBHashmap(int64_t init_capacity, int64_t dsize_key, int64_t dsize_value, const Device &device)
Definition: TBBHashmap.h:99
const char const char value recording_handle imu_sample recording_handle uint8_t size_t data_size k4a_record_configuration_t config target_format k4a_capture_t capture_handle k4a_imu_sample_t imu_sample playback_handle k4a_logging_message_cb_t void min_level device_handle k4a_imu_sample_t timeout_in_ms capture_handle capture_handle capture_handle image_handle float
Definition: K4aPlugin.cpp:465
int64_t capacity_
Definition: DeviceHashmap.h:109
Tensor & GetKeyBuffer()
Definition: DeviceHashmap.h:101
uint32_t addr_t
Definition: HashmapBuffer.h:58
int64_t dsize_key_
Definition: DeviceHashmap.h:110
T * GetDataPtr()
Definition: Tensor.h:1005
Definition: TBBHashmap.h:40
static const Dtype Bool
Definition: Dtype.h:52
int64_t GetActiveIndices(addr_t *output_indices) override
Parallel collect all iterators in the hash table.
Definition: TBBHashmap.h:182
int64_t dsize_value_
Definition: DeviceHashmap.h:111
Tensor & GetValueBuffer()
Definition: DeviceHashmap.h:102
std::shared_ptr< HashmapBuffer > buffer_
Definition: DeviceHashmap.h:115
#define max(x, y)
Definition: SVD3x3CPU.h:38