ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
CreateCUDAHashBackend.cu
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "cloudViewer/core/hashmap/CUDA/SlabHashBackend.h"
9 #include "cloudViewer/core/hashmap/CUDA/StdGPUHashBackend.h"
10 #include "cloudViewer/core/hashmap/Dispatch.h"
11 #include "cloudViewer/core/hashmap/HashMap.h"
12 
13 namespace cloudViewer {
14 namespace core {
15 
16 /// Non-templated factory.
17 std::shared_ptr<DeviceHashBackend> CreateCUDAHashBackend(
18  int64_t init_capacity,
19  const Dtype& key_dtype,
20  const SizeVector& key_element_shape,
21  const std::vector<Dtype>& value_dtypes,
22  const std::vector<SizeVector>& value_element_shapes,
23  const Device& device,
24  const HashBackendType& backend) {
25  if (backend != HashBackendType::Default &&
26  backend != HashBackendType::Slab &&
27  backend != HashBackendType::StdGPU) {
28  utility::LogError("Unsupported backend for CUDA hashmap.");
29  }
30 
31  int64_t dim = key_element_shape.NumElements();
32 
33  int64_t key_dsize = dim * key_dtype.ByteSize();
34 
35  // TODO: size check
36  std::vector<int64_t> value_dsizes;
37  for (size_t i = 0; i < value_dtypes.size(); ++i) {
38  int64_t dsize_value = value_element_shapes[i].NumElements() *
39  value_dtypes[i].ByteSize();
40  value_dsizes.push_back(dsize_value);
41  }
42 
43  std::shared_ptr<DeviceHashBackend> device_hashmap_ptr;
44  if (backend == HashBackendType::Default ||
45  backend == HashBackendType::StdGPU) {
46  DISPATCH_DTYPE_AND_DIM_TO_TEMPLATE(key_dtype, dim, [&] {
47  device_hashmap_ptr =
48  std::make_shared<StdGPUHashBackend<key_t, hash_t, eq_t>>(
49  init_capacity, key_dsize, value_dsizes, device);
50  });
51  } else { // if (backend == HashBackendType::Slab) {
52  DISPATCH_DTYPE_AND_DIM_TO_TEMPLATE(key_dtype, dim, [&] {
53  device_hashmap_ptr =
54  std::make_shared<SlabHashBackend<key_t, hash_t, eq_t>>(
55  init_capacity, key_dsize, value_dsizes, device);
56  });
57  }
58  return device_hashmap_ptr;
59 }
60 
61 } // namespace core
62 } // namespace cloudViewer