gtsam_points
Loading...
Searching...
No Matches
nonlinear_factor_set_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 <memory>
7#include <vector>
8
9#include <gtsam/nonlinear/NonlinearFactorGraph.h>
10#include <gtsam_points/factors/nonlinear_factor_gpu.hpp>
11#include <gtsam_points/optimizers/linearization_hook.hpp>
12
13struct CUstream_st;
14
15namespace gtsam_points {
16
20class NonlinearFactorSetGPU : public NonlinearFactorSet {
21public:
24
29 int size() const override { return factors.size(); }
30
34 void clear() override { factors.clear(); }
35
39 void clear_counts() override;
40
45 int linearization_count() const override { return num_linearizations; }
46
51 int evaluation_count() const override { return num_evaluations; }
52
58 bool add(gtsam::NonlinearFactor::shared_ptr factor) override;
59
64 void add(const gtsam::NonlinearFactorGraph& factors) override;
65
70 void linearize(const gtsam::Values& linearization_point) override;
71
76 void error(const gtsam::Values& values) override;
77
83 std::vector<gtsam::GaussianFactor::shared_ptr> calc_linear_factors(const gtsam::Values& linearization_point) override;
84
85private:
87 struct DeviceBuffer {
88 DeviceBuffer();
89 ~DeviceBuffer();
90
91 DeviceBuffer(const DeviceBuffer&) = delete;
92 DeviceBuffer& operator=(const DeviceBuffer&) = delete;
93
94 void resize(size_t size, CUstream_st* stream);
95 unsigned char* data() { return buffer; }
96 const unsigned char* data() const { return buffer; }
97
98 size_t size;
99 unsigned char* buffer;
100 };
101
102private:
103 CUstream_st* stream;
104
105 int num_linearizations;
106 int num_evaluations;
107
108 std::vector<NonlinearFactorGPU::shared_ptr> factors;
109
110 std::vector<unsigned char, Eigen::aligned_allocator<unsigned char>> linearization_input_buffer_cpu;
111 std::vector<unsigned char, Eigen::aligned_allocator<unsigned char>> linearization_output_buffer_cpu;
112 std::unique_ptr<DeviceBuffer> linearization_input_buffer_gpu;
113 std::unique_ptr<DeviceBuffer> linearization_output_buffer_gpu;
114
115 std::vector<unsigned char, Eigen::aligned_allocator<unsigned char>> evaluation_input_buffer_cpu;
116 std::vector<unsigned char, Eigen::aligned_allocator<unsigned char>> evaluation_output_buffer_cpu;
117 std::unique_ptr<DeviceBuffer> evaluation_input_buffer_gpu;
118 std::unique_ptr<DeviceBuffer> evaluation_output_buffer_gpu;
119};
120
121} // namespace gtsam_points
This class holds a set of GPU-based NonlinearFactors and manages their linearization and cost evaluat...
Definition nonlinear_factor_set_gpu.hpp:20
bool add(gtsam::NonlinearFactor::shared_ptr factor) override
Add a factor to the GPU factor set if it is a GPU-based one.
void clear() override
Remove all factors.
Definition nonlinear_factor_set_gpu.hpp:34
std::vector< gtsam::GaussianFactor::shared_ptr > calc_linear_factors(const gtsam::Values &linearization_point) override
Calculate linearized factors.
int size() const override
Number of GPU factors in this set.
Definition nonlinear_factor_set_gpu.hpp:29
void error(const gtsam::Values &values) override
Compute all GPU-based cost evaluation tasks.
void add(const gtsam::NonlinearFactorGraph &factors) override
Add all GPU-based factors in a factor graph to the GPU factor set.
int evaluation_count() const override
Number of issued cost evaluation tasks.
Definition nonlinear_factor_set_gpu.hpp:51
void linearize(const gtsam::Values &linearization_point) override
Compute all GPU-based linearization tasks.
int linearization_count() const override
Number of issued linearization tasks.
Definition nonlinear_factor_set_gpu.hpp:45
void clear_counts() override
Reset linearization and cost evaluation counts.