gtsam_points
Loading...
Searching...
No Matches
point_cloud_gpu.hpp
1// SPDX-License-Identifier: MIT
2// Copyright (c) 2021 Kenji Koide (k.koide@aist.go.jp)
3
4#pragma once
5
6#include <atomic>
7#include <vector>
8#include <Eigen/Core>
9
10#include <gtsam_points/types/point_cloud.hpp>
11#include <gtsam_points/types/point_cloud_cpu.hpp>
12#include <gtsam_points/types/offloadable.hpp>
13
14// forward declaration
15struct CUstream_st;
16
17namespace gtsam_points {
18
23public:
24 using Ptr = std::shared_ptr<PointCloudGPU>;
25 using ConstPtr = std::shared_ptr<const PointCloudGPU>;
26
29
30 template <typename T, int D>
31 PointCloudGPU(const Eigen::Matrix<T, D, 1>* points, int num_points);
32
33 template <typename T, int D, typename Alloc>
34 PointCloudGPU(const std::vector<Eigen::Matrix<T, D, 1>, Alloc>& points) : PointCloudGPU(points.data(), points.size()) {}
35
36 // Forbid shallow copy
37 PointCloudGPU(const PointCloudGPU& points) = delete;
38 PointCloudGPU& operator=(PointCloudGPU const&) = delete;
39
40 // Deep copy
41 static PointCloudGPU::Ptr clone(const PointCloud& frame, CUstream_st* stream = 0);
42
43 // add_*_gpu() only adds attributes to GPU storage
44 template <typename T>
45 void add_times(const T* times, int num_points, CUstream_st* stream = 0) {
46 PointCloudCPU::add_times<T>(times, num_points);
47 add_times_gpu(times, num_points, stream);
48 }
49 template <typename T>
50 void add_times(const std::vector<T>& times, CUstream_st* stream = 0) {
51 add_times(times.data(), times.size(), stream);
52 }
53
54 template <typename T>
55 void add_times_gpu(const T* times, int num_points, CUstream_st* stream = 0);
56 template <typename T>
57 void add_times_gpu(const std::vector<T>& times, CUstream_st* stream = 0) {
58 add_times_gpu(times.data(), times.size(), stream);
59 }
60
61 template <typename T, int D>
62 void add_points(const Eigen::Matrix<T, D, 1>* points, int num_points, CUstream_st* stream = 0) {
63 PointCloudCPU::add_points<T, D>(points, num_points);
64 add_points_gpu(points, num_points, stream);
65 }
66 template <typename T, int D, typename Alloc>
67 void add_points(const std::vector<Eigen::Matrix<T, D, 1>, Alloc>& points, CUstream_st* stream = 0) {
68 add_points(points.data(), points.size(), stream);
69 }
70
71 template <typename T, int D>
72 void add_points_gpu(const Eigen::Matrix<T, D, 1>* points, int num_points, CUstream_st* stream = 0);
73 template <typename T, int D, typename Alloc>
74 void add_points_gpu(const std::vector<Eigen::Matrix<T, D, 1>, Alloc>& points, CUstream_st* stream = 0) {
75 add_points_gpu(points.data(), points.size(), stream);
76 }
77
78 template <typename T, int D>
79 void add_normals(const Eigen::Matrix<T, D, 1>* normals, int num_points, CUstream_st* stream = 0) {
80 PointCloudCPU::add_normals<T, D>(normals, num_points);
81 add_normals_gpu<T, D>(normals, num_points, stream);
82 }
83 template <typename T, int D, typename Alloc>
84 void add_normals(const std::vector<Eigen::Matrix<T, D, 1>, Alloc>& normals, CUstream_st* stream = 0) {
85 add_normals(normals.data(), normals.size(), stream);
86 }
87
88 template <typename T, int D>
89 void add_normals_gpu(const Eigen::Matrix<T, D, 1>* normals, int num_points, CUstream_st* stream = 0);
90 template <typename T, int D, typename Alloc>
91 void add_normals_gpu(const std::vector<Eigen::Matrix<T, D, 1>, Alloc>& normals, CUstream_st* stream = 0) {
92 add_normals_gpu(normals.data(), normals.size(), stream);
93 }
94
95 template <typename T, int D>
96 void add_covs(const Eigen::Matrix<T, D, D>* covs, int num_points, CUstream_st* stream = 0) {
97 PointCloudCPU::add_covs<T, D>(covs, num_points);
98 add_covs_gpu<T, D>(covs, num_points, stream);
99 }
100 template <typename T, int D, typename Alloc>
101 void add_covs(const std::vector<Eigen::Matrix<T, D, D>, Alloc>& covs, CUstream_st* stream = 0) {
102 add_covs(covs.data(), covs.size(), stream);
103 }
104
105 template <typename T, int D>
106 void add_covs_gpu(const Eigen::Matrix<T, D, D>* covs, int num_points, CUstream_st* stream = 0);
107 template <typename T, int D, typename Alloc>
108 void add_covs_gpu(const std::vector<Eigen::Matrix<T, D, D>, Alloc>& covs, CUstream_st* stream = 0) {
109 add_covs_gpu(covs.data(), covs.size(), stream);
110 }
111
112 template <typename T>
113 void add_intensities(const T* intensities, int num_points, CUstream_st* stream = 0) {
114 PointCloudCPU::add_intensities<T>(intensities, num_points);
115 add_intensities_gpu(intensities, num_points, stream);
116 }
117 template <typename T>
118 void add_intensities(const std::vector<T>& intensities, CUstream_st* stream = 0) {
119 add_intensities(intensities.data(), intensities.size(), stream);
120 }
121
122 template <typename T>
123 void add_intensities_gpu(const T* intensities, int num_points, CUstream_st* stream = 0);
124 template <typename T>
125 void add_intensities_gpu(const std::vector<T>& intensities, CUstream_st* stream = 0) {
126 add_intensities_gpu(intensities.data(), intensities.size(), stream);
127 }
128
129 void download_points(CUstream_st* stream = 0);
130
131 // GPU memory offloading
132 size_t memory_usage_gpu() const override;
133 bool loaded_on_gpu() const override;
134 bool offload_gpu(CUstream_st* stream = 0) override;
135 bool reload_gpu(CUstream_st* stream = 0) override;
136};
137
138// Device to host data transfer
139std::vector<Eigen::Vector3f> download_points_gpu(const gtsam_points::PointCloud& frame, CUstream_st* stream = nullptr);
140std::vector<Eigen::Matrix3f> download_covs_gpu(const gtsam_points::PointCloud& frame, CUstream_st* stream = nullptr);
141std::vector<Eigen::Vector3f> download_normals_gpu(const gtsam_points::PointCloud& frame, CUstream_st* stream = nullptr);
142std::vector<float> download_intensities_gpu(const gtsam_points::PointCloud& frame, CUstream_st* stream = nullptr);
143std::vector<float> download_times_gpu(const gtsam_points::PointCloud& frame, CUstream_st* stream = nullptr);
144
145} // namespace gtsam_points
An interface class for offloading data from GPU to CPU.
Definition offloadable.hpp:19
Point cloud frame on CPU memory.
Definition point_cloud_cpu.hpp:19
Point cloud frame on GPU memory.
Definition point_cloud_gpu.hpp:22
bool reload_gpu(CUstream_st *stream=0) override
Reload data from CPU to GPU.
bool offload_gpu(CUstream_st *stream=0) override
Offload data from GPU to CPU.
size_t memory_usage_gpu() const override
Memory usage in bytes on the GPU.
bool loaded_on_gpu() const override
Check if the data is loaded on the GPU.
Standard point cloud class that holds only pointers to point attributes.
Definition point_cloud.hpp:19
Eigen::Vector4d * normals
Point normals (nx, ny, nz, 0)
Definition point_cloud.hpp:107
size_t num_points
Number of points.
Definition point_cloud.hpp:103
double * times
Per-point timestamp w.r.t. the first point (should be sorted)
Definition point_cloud.hpp:105
Eigen::Matrix4d * covs
Point covariances cov(3, 3) = 0.
Definition point_cloud.hpp:108
double * intensities
Point intensities.
Definition point_cloud.hpp:109
Eigen::Vector4d * points
Point coordinates (x, y, z, 1)
Definition point_cloud.hpp:106