-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgpuProblem.h
More file actions
155 lines (123 loc) · 5.16 KB
/
Copy pathgpuProblem.h
File metadata and controls
155 lines (123 loc) · 5.16 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#pragma once
#include <memory>
#include <vector>
#include "solver/util/cudautil.h"
#include "solver/problem.h"
#include "solver/gpu/gpuResidualFunction.h"
#include "solver/gpu/cuda/cu_residual.h"
#include "solver/gpu/cuda/cu_solver.h"
namespace telef::solver {
class GPUProblem : public Problem {
public:
using Ptr = std::shared_ptr<GPUProblem>;
using ConstPtr = std::shared_ptr<const GPUProblem>;
GPUProblem() : Problem() {
}
virtual ~GPUProblem() {
SOLVER_CUDA_FREE(workingError);
SOLVER_CUDA_FREE(lambda);
SOLVER_CUDA_FREE(failFactor);
SOLVER_CUDA_FREE(predictedGain);
SOLVER_CUDA_FREE(parameters2norm);
SOLVER_CUDA_FREE(deltaParams);
SOLVER_CUDA_FREE(dampeningFactors);
SOLVER_CUDA_FREE(gradients);
SOLVER_CUDA_FREE(hessian);
SOLVER_CUDA_FREE(hessianLowTri);
SOLVER_CUDA_FREE(scaleBuffer);
SOLVER_CUDA_FREE(trustRadius);
SOLVER_CUDA_FREE(auxBuffer);
}
void setCublasHandle(cublasHandle_t cublasHandle_){
cublasHandle = cublasHandle_;
}
virtual float* getWorkingError() {
return workingError;
}
virtual float* getLambda() {
return lambda;
}
virtual float* getFailFactor(){
return failFactor;
}
virtual float* getPredictedGain() {
return predictedGain;
}
virtual float* getParams2Norm() {
return parameters2norm;
}
// Global combined Matricies
virtual float* getDeltaParameters() {
return deltaParams;
}
virtual float* getDampeningFactors() {
return dampeningFactors;
}
virtual float* getGradient() {
return gradients;
}
virtual float* getHessian() {
return hessian;
}
virtual float* getHessianLowTri() {
return hessianLowTri;
}
virtual float* getScaleBuffer() override { return scaleBuffer; }
virtual float* getTrustRadius() override { return trustRadius; }
virtual float* getAuxBuffer() override { return auxBuffer; }
/**
* compute and allocate size for global matrices
* Call befor running solver or when the Problem space has been modified, i.e. add more ResidualBlocks
*/
virtual void onInitialize() {
// Allocate cuda space
SOLVER_CUDA_ALLOC_AND_ZERO(&workingError, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(&lambda, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(&failFactor, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(&predictedGain, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(¶meters2norm, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(&deltaParams, static_cast<size_t>(nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&gradients, static_cast<size_t>(nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&dampeningFactors, static_cast<size_t>(nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&hessian, static_cast<size_t>(nEffectiveParams * nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&hessianLowTri, static_cast<size_t>(nEffectiveParams * nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&scaleBuffer, static_cast<size_t>(nEffectiveParams));
SOLVER_CUDA_ALLOC_AND_ZERO(&trustRadius, static_cast<size_t>(1));
SOLVER_CUDA_ALLOC_AND_ZERO(&auxBuffer, static_cast<size_t>(nEffectiveParams));
}
void calcGradients(float *gradients, float *jacobians, float *residuals, int nRes, int nParams) {
calc_gradients(cublasHandle, gradients, jacobians, residuals, nRes, nParams);
}
virtual void
calcHessianBlock(float *hessianBlock, const int nEffectiveParams,
const float *jacobianA, const int nParamsA,
const float *jacobianB, const int nParamsB,
const int nResiduals) {
cudaMatMul_ATxB(cublasHandle, hessianBlock, nEffectiveParams,
jacobianA, nResiduals, nParamsA,
jacobianB, nResiduals, nParamsB,
1.0f, 1.0f);
}
virtual ResidualFunction::Ptr createResidualFunction(CostFunction::Ptr costFunc_) {
auto localParams = costFunc_->getParameterBlockLocalParameterizations();
auto resBlock = std::make_shared<GPUResidualBlock>(costFunc_->numResiduals(), costFunc_->getParameterSizes(), localParams);
return std::make_shared<GPUResidualFunction>(costFunc_, resBlock);
}
protected:
cublasHandle_t cublasHandle;
private:
float* workingError;
float* lambda;
float* failFactor;
float* predictedGain;
float* parameters2norm;
float* deltaParams;
float* dampeningFactors;
float* gradients;
float* hessian;
float* hessianLowTri;
float* scaleBuffer;
float* trustRadius;
float* auxBuffer;
};
}