@@ -135,18 +135,20 @@ LinearSolver::Summary CgnrSolver::SolveImpl(
135135 double * x) {
136136 EventLogger event_logger (" CgnrSolver::Solve" );
137137 if (!preconditioner_) {
138+ Preconditioner::Options preconditioner_options;
139+ preconditioner_options.type = options_.preconditioner_type ;
140+ preconditioner_options.subset_preconditioner_start_row_block =
141+ options_.subset_preconditioner_start_row_block ;
142+ preconditioner_options.sparse_linear_algebra_library_type =
143+ options_.sparse_linear_algebra_library_type ;
144+ preconditioner_options.ordering_type = options_.ordering_type ;
145+ preconditioner_options.num_threads = options_.num_threads ;
146+ preconditioner_options.context = options_.context ;
147+
138148 if (options_.preconditioner_type == JACOBI) {
139- preconditioner_ = std::make_unique<BlockSparseJacobiPreconditioner>(*A);
149+ preconditioner_ = std::make_unique<BlockSparseJacobiPreconditioner>(
150+ preconditioner_options, *A);
140151 } else if (options_.preconditioner_type == SUBSET) {
141- Preconditioner::Options preconditioner_options;
142- preconditioner_options.type = SUBSET;
143- preconditioner_options.subset_preconditioner_start_row_block =
144- options_.subset_preconditioner_start_row_block ;
145- preconditioner_options.sparse_linear_algebra_library_type =
146- options_.sparse_linear_algebra_library_type ;
147- preconditioner_options.ordering_type = options_.ordering_type ;
148- preconditioner_options.num_threads = options_.num_threads ;
149- preconditioner_options.context = options_.context ;
150152 preconditioner_ =
151153 std::make_unique<SubsetPreconditioner>(preconditioner_options, *A);
152154 } else {
@@ -238,9 +240,11 @@ class CERES_NO_EXPORT CudaIdentityPreconditioner final
238240class CERES_NO_EXPORT CudaJacobiPreconditioner final
239241 : public CudaPreconditioner {
240242 public:
241- explicit CudaJacobiPreconditioner (ContextImpl* context ,
243+ explicit CudaJacobiPreconditioner (Preconditioner::Options options ,
242244 const CompressedRowSparseMatrix& A)
243- : cpu_preconditioner_(A), m_(context, cpu_preconditioner_.matrix()) {}
245+ : options_(std::move(options)),
246+ cpu_preconditioner_(options_, A),
247+ m_(options_->context, cpu_preconditioner_.matrix()) {}
244248 ~CudaJacobiPreconditioner () = default ;
245249
246250 void Update (const CompressedRowSparseMatrix& A, const double * D) final {
@@ -253,6 +257,7 @@ class CERES_NO_EXPORT CudaJacobiPreconditioner final
253257 }
254258
255259 private:
260+ Preconditioner::Options options_;
256261 BlockCRSJacobiPreconditioner cpu_preconditioner_;
257262 CudaSparseMatrix m_;
258263};
@@ -297,9 +302,20 @@ void CudaCgnrSolver::CpuToGpuTransfer(const CompressedRowSparseMatrix& A,
297302 Atb_ = std::make_unique<CudaVector>(options_.context , A.num_cols ());
298303 Ax_ = std::make_unique<CudaVector>(options_.context , A.num_rows ());
299304 D_ = std::make_unique<CudaVector>(options_.context , A.num_cols ());
305+
306+ Preconditioner::Options preconditioner_options;
307+ preconditioner_options.type = options_.preconditioner_type ;
308+ preconditioner_options.subset_preconditioner_start_row_block =
309+ options_.subset_preconditioner_start_row_block ;
310+ preconditioner_options.sparse_linear_algebra_library_type =
311+ options_.sparse_linear_algebra_library_type ;
312+ preconditioner_options.ordering_type = options_.ordering_type ;
313+ preconditioner_options.num_threads = options_.num_threads ;
314+ preconditioner_options.context = options_.context ;
315+
300316 if (options_.preconditioner_type == JACOBI) {
301317 preconditioner_ =
302- std::make_unique<CudaJacobiPreconditioner>(options_. context , A);
318+ std::make_unique<CudaJacobiPreconditioner>(preconditioner_options , A);
303319 } else {
304320 preconditioner_ = std::make_unique<CudaIdentityPreconditioner>();
305321 }
0 commit comments