Open3D (C++ API)  0.16.0
LapackWrapper.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// The MIT License (MIT)
5//
6// Copyright (c) 2018-2021 www.open3d.org
7//
8// Permission is hereby granted, free of charge, to any person obtaining a copy
9// of this software and associated documentation files (the "Software"), to deal
10// in the Software without restriction, including without limitation the rights
11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12// copies of the Software, and to permit persons to whom the Software is
13// furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included in
16// all copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24// IN THE SOFTWARE.
25// ----------------------------------------------------------------------------
26
27#pragma once
28
32
33namespace open3d {
34namespace core {
35template <typename scalar_t>
39 scalar_t* A_data,
41 OPEN3D_CPU_LINALG_INT* ipiv_data) {
42 utility::LogError("Unsupported data type.");
43 return -1;
44}
45
46template <typename scalar_t>
49 scalar_t* A_data,
51 OPEN3D_CPU_LINALG_INT* ipiv_data) {
52 utility::LogError("Unsupported data type.");
53 return -1;
54}
55
56template <typename scalar_t>
60 scalar_t* A_data,
62 OPEN3D_CPU_LINALG_INT* ipiv_data,
63 scalar_t* B_data,
65 utility::LogError("Unsupported data type.");
66 return -1;
67}
68
69template <typename scalar_t>
70inline OPEN3D_CPU_LINALG_INT gels_cpu(int matrix_layout,
71 char trans,
75 scalar_t* A_data,
77 scalar_t* B_data,
79 utility::LogError("Unsupported data type.");
80 return -1;
81}
82
83template <typename scalar_t>
84inline OPEN3D_CPU_LINALG_INT gesvd_cpu(int matrix_layout,
85 char jobu,
86 char jobvt,
89 scalar_t* A_data,
91 scalar_t* S_data,
92 scalar_t* U_data,
94 scalar_t* VT_data,
96 scalar_t* superb) {
97 utility::LogError("Unsupported data type.");
98 return -1;
99}
100
101template <>
103 int layout,
106 float* A_data,
108 OPEN3D_CPU_LINALG_INT* ipiv_data) {
109 return LAPACKE_sgetrf(layout, m, n, A_data, lda, ipiv_data);
110}
111
112template <>
114 int layout,
117 double* A_data,
119 OPEN3D_CPU_LINALG_INT* ipiv_data) {
120 return LAPACKE_dgetrf(layout, m, n, A_data, lda, ipiv_data);
121}
122
123template <>
125 int layout,
127 float* A_data,
129 OPEN3D_CPU_LINALG_INT* ipiv_data) {
130 return LAPACKE_sgetri(layout, n, A_data, lda, ipiv_data);
131}
132
133template <>
135 int layout,
137 double* A_data,
139 OPEN3D_CPU_LINALG_INT* ipiv_data) {
140 return LAPACKE_dgetri(layout, n, A_data, lda, ipiv_data);
141}
142
143template <>
147 float* A_data,
149 OPEN3D_CPU_LINALG_INT* ipiv_data,
150 float* B_data,
152 return LAPACKE_sgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
153}
154
155template <>
159 double* A_data,
161 OPEN3D_CPU_LINALG_INT* ipiv_data,
162 double* B_data,
164 return LAPACKE_dgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
165}
166
167template <>
169 char trans,
173 float* A_data,
175 float* B_data,
177 return LAPACKE_sgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
178}
179
180template <>
182 char trans,
186 double* A_data,
188 double* B_data,
190 return LAPACKE_dgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
191}
192
193template <>
195 char jobu,
196 char jobvt,
199 float* A_data,
201 float* S_data,
202 float* U_data,
204 float* VT_data,
206 float* superb) {
207 return LAPACKE_sgesvd(layout, jobu, jobvt, m, n, A_data, lda, S_data,
208 U_data, ldu, VT_data, ldvt, superb);
209}
210
211template <>
213 char jobu,
214 char jobvt,
217 double* A_data,
219 double* S_data,
220 double* U_data,
222 double* VT_data,
224 double* superb) {
225 return LAPACKE_dgesvd(layout, jobu, jobvt, m, n, A_data, lda, S_data,
226 U_data, ldu, VT_data, ldvt, superb);
227}
228
229#ifdef BUILD_CUDA_MODULE
230template <typename scalar_t>
231inline cusolverStatus_t getrf_cuda_buffersize(
232 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
233 utility::LogError("Unsupported data type.");
234 return CUSOLVER_STATUS_INTERNAL_ERROR;
235}
236
237template <typename scalar_t>
238inline cusolverStatus_t getrf_cuda(cusolverDnHandle_t handle,
239 int m,
240 int n,
241 scalar_t* A_data,
242 int lda,
243 scalar_t* workspace,
244 int* ipiv_data,
245 int* dinfo) {
246 utility::LogError("Unsupported data type.");
247 return CUSOLVER_STATUS_INTERNAL_ERROR;
248}
249
250template <typename scalar_t>
251inline cusolverStatus_t getrs_cuda(cusolverDnHandle_t handle,
252 cublasOperation_t trans,
253 int n,
254 int nrhs,
255 const scalar_t* A_data,
256 int lda,
257 const int* ipiv_data,
258 scalar_t* B_data,
259 int ldb,
260 int* dinfo) {
261 utility::LogError("Unsupported data type.");
262 return CUSOLVER_STATUS_INTERNAL_ERROR;
263}
264
265template <typename scalar_t>
266inline cusolverStatus_t geqrf_cuda_buffersize(
267 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
268 utility::LogError("Unsupported data type.");
269 return CUSOLVER_STATUS_INTERNAL_ERROR;
270}
271
272template <typename scalar_t>
273inline cusolverStatus_t geqrf_cuda(cusolverDnHandle_t handle,
274 int m,
275 int n,
276 scalar_t* A,
277 int lda,
278 scalar_t* tau,
279 scalar_t* workspace,
280 int len,
281 int* dinfo) {
282 utility::LogError("Unsupported data type.");
283 return CUSOLVER_STATUS_INTERNAL_ERROR;
284}
285
286template <typename scalar_t>
287inline cusolverStatus_t ormqr_cuda_buffersize(cusolverDnHandle_t handle,
288 cublasSideMode_t side,
289 cublasOperation_t trans,
290 int m,
291 int n,
292 int k,
293 int lda,
294 int ldc,
295 int* len) {
296 utility::LogError("Unsupported data type.");
297 return CUSOLVER_STATUS_INTERNAL_ERROR;
298}
299
300template <typename scalar_t>
301inline cusolverStatus_t ormqr_cuda(cusolverDnHandle_t handle,
302 cublasSideMode_t side,
303 cublasOperation_t trans,
304 int m,
305 int n,
306 int k,
307 const scalar_t* A,
308 int lda,
309 const scalar_t* tau,
310 scalar_t* C,
311 int ldc,
312 scalar_t* workspace,
313 int len,
314 int* dinfo) {
315 utility::LogError("Unsupported data type.");
316 return CUSOLVER_STATUS_INTERNAL_ERROR;
317}
318
319template <typename scalar_t>
320inline cusolverStatus_t gesvd_cuda_buffersize(cusolverDnHandle_t handle,
321 int m,
322 int n,
323 int* len) {
324 utility::LogError("Unsupported data type.");
325 return CUSOLVER_STATUS_INTERNAL_ERROR;
326}
327
328template <typename scalar_t>
329inline cusolverStatus_t gesvd_cuda(cusolverDnHandle_t handle,
330 char jobu,
331 char jobvt,
332 int m,
333 int n,
334 scalar_t* A,
335 int lda,
336 scalar_t* S,
337 scalar_t* U,
338 int ldu,
339 scalar_t* VT,
340 int ldvt,
341 scalar_t* workspace,
342 int len,
343 scalar_t* rwork,
344 int* dinfo) {
345 utility::LogError("Unsupported data type.");
346 return CUSOLVER_STATUS_INTERNAL_ERROR;
347}
348
349template <>
350inline cusolverStatus_t getrf_cuda_buffersize<float>(
351 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
352 return cusolverDnSgetrf_bufferSize(handle, m, n, NULL, lda, len);
353}
354
355template <>
356inline cusolverStatus_t getrf_cuda_buffersize<double>(
357 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
358 return cusolverDnDgetrf_bufferSize(handle, m, n, NULL, lda, len);
359}
360
361template <>
362inline cusolverStatus_t getrf_cuda<float>(cusolverDnHandle_t handle,
363 int m,
364 int n,
365 float* A_data,
366 int lda,
367 float* workspace,
368 int* ipiv_data,
369 int* dinfo) {
370 return cusolverDnSgetrf(handle, m, n, A_data, lda, workspace, ipiv_data,
371 dinfo);
372}
373
374template <>
375inline cusolverStatus_t getrf_cuda<double>(cusolverDnHandle_t handle,
376 int m,
377 int n,
378 double* A_data,
379 int lda,
380 double* workspace,
381 int* ipiv_data,
382 int* dinfo) {
383 return cusolverDnDgetrf(handle, m, n, A_data, lda, workspace, ipiv_data,
384 dinfo);
385}
386
387template <>
388inline cusolverStatus_t getrs_cuda<float>(cusolverDnHandle_t handle,
389 cublasOperation_t trans,
390 int n,
391 int nrhs,
392 const float* A_data,
393 int lda,
394 const int* ipiv_data,
395 float* B_data,
396 int ldb,
397 int* dinfo) {
398 return cusolverDnSgetrs(handle, trans, n, nrhs, A_data, lda, ipiv_data,
399 B_data, ldb, dinfo);
400}
401
402template <>
403inline cusolverStatus_t getrs_cuda<double>(cusolverDnHandle_t handle,
404 cublasOperation_t trans,
405 int n,
406 int nrhs,
407 const double* A_data,
408 int lda,
409 const int* ipiv_data,
410 double* B_data,
411 int ldb,
412 int* dinfo) {
413 return cusolverDnDgetrs(handle, trans, n, nrhs, A_data, lda, ipiv_data,
414 B_data, ldb, dinfo);
415}
416
417template <>
418inline cusolverStatus_t geqrf_cuda_buffersize<float>(
419 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
420 return cusolverDnSgeqrf_bufferSize(handle, m, n, NULL, lda, len);
421}
422
423template <>
424inline cusolverStatus_t geqrf_cuda_buffersize<double>(
425 cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
426 return cusolverDnDgeqrf_bufferSize(handle, m, n, NULL, lda, len);
427}
428
429template <>
430inline cusolverStatus_t geqrf_cuda<float>(cusolverDnHandle_t handle,
431 int m,
432 int n,
433 float* A,
434 int lda,
435 float* tau,
436 float* workspace,
437 int len,
438 int* dinfo) {
439 return cusolverDnSgeqrf(handle, m, n, A, lda, tau, workspace, len, dinfo);
440}
441
442template <>
443inline cusolverStatus_t geqrf_cuda<double>(cusolverDnHandle_t handle,
444 int m,
445 int n,
446 double* A,
447 int lda,
448 double* tau,
449 double* workspace,
450 int len,
451 int* dinfo) {
452 return cusolverDnDgeqrf(handle, m, n, A, lda, tau, workspace, len, dinfo);
453}
454
455template <>
456inline cusolverStatus_t ormqr_cuda_buffersize<float>(cusolverDnHandle_t handle,
457 cublasSideMode_t side,
458 cublasOperation_t trans,
459 int m,
460 int n,
461 int k,
462 int lda,
463 int ldc,
464 int* len) {
465 return cusolverDnSormqr_bufferSize(handle, side, trans, m, n, k, NULL, lda,
466 NULL, NULL, ldc, len);
467}
468
469template <>
470inline cusolverStatus_t ormqr_cuda_buffersize<double>(cusolverDnHandle_t handle,
471 cublasSideMode_t side,
472 cublasOperation_t trans,
473 int m,
474 int n,
475 int k,
476 int lda,
477 int ldc,
478 int* len) {
479 return cusolverDnDormqr_bufferSize(handle, side, trans, m, n, k, NULL, lda,
480 NULL, NULL, ldc, len);
481}
482
483template <>
484inline cusolverStatus_t ormqr_cuda<float>(cusolverDnHandle_t handle,
485 cublasSideMode_t side,
486 cublasOperation_t trans,
487 int m,
488 int n,
489 int k,
490 const float* A,
491 int lda,
492 const float* tau,
493 float* C,
494 int ldc,
495 float* workspace,
496 int len,
497 int* dinfo) {
498 return cusolverDnSormqr(handle, side, trans, m, n, k, A, lda, tau, C, ldc,
499 workspace, len, dinfo);
500}
501
502template <>
503inline cusolverStatus_t ormqr_cuda<double>(cusolverDnHandle_t handle,
504 cublasSideMode_t side,
505 cublasOperation_t trans,
506 int m,
507 int n,
508 int k,
509 const double* A,
510 int lda,
511 const double* tau,
512 double* C,
513 int ldc,
514 double* workspace,
515 int len,
516 int* dinfo) {
517 return cusolverDnDormqr(handle, side, trans, m, n, k, A, lda, tau, C, ldc,
518 workspace, len, dinfo);
519}
520
521template <>
522inline cusolverStatus_t gesvd_cuda_buffersize<float>(cusolverDnHandle_t handle,
523 int m,
524 int n,
525 int* len) {
526 return cusolverDnSgesvd_bufferSize(handle, m, n, len);
527}
528
529template <>
530inline cusolverStatus_t gesvd_cuda_buffersize<double>(cusolverDnHandle_t handle,
531 int m,
532 int n,
533 int* len) {
534 return cusolverDnDgesvd_bufferSize(handle, m, n, len);
535}
536
537template <>
538inline cusolverStatus_t gesvd_cuda<float>(cusolverDnHandle_t handle,
539 char jobu,
540 char jobvt,
541 int m,
542 int n,
543 float* A,
544 int lda,
545 float* S,
546 float* U,
547 int ldu,
548 float* VT,
549 int ldvt,
550 float* workspace,
551 int len,
552 float* rwork,
553 int* dinfo) {
554 return cusolverDnSgesvd(handle, jobu, jobvt, m, n, A, lda, S, U, ldu, VT,
555 ldvt, workspace, len, rwork, dinfo);
556}
557
558template <>
559inline cusolverStatus_t gesvd_cuda<double>(cusolverDnHandle_t handle,
560 char jobu,
561 char jobvt,
562 int m,
563 int n,
564 double* A,
565 int lda,
566 double* S,
567 double* U,
568 int ldu,
569 double* VT,
570 int ldvt,
571 double* workspace,
572 int len,
573 double* rwork,
574 int* dinfo) {
575 return cusolverDnDgesvd(handle, jobu, jobvt, m, n, A, lda, S, U, ldu, VT,
576 ldvt, workspace, len, rwork, dinfo);
577}
578
579#endif
580} // namespace core
581} // namespace open3d
#define OPEN3D_CPU_LINALG_INT
Definition: LinalgHeadersCPU.h:42
#define LogError(...)
Definition: Logging.h:67
OPEN3D_CPU_LINALG_INT gesvd_cpu< double >(int layout, char jobu, char jobvt, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, double *A_data, OPEN3D_CPU_LINALG_INT lda, double *S_data, double *U_data, OPEN3D_CPU_LINALG_INT ldu, double *VT_data, OPEN3D_CPU_LINALG_INT ldvt, double *superb)
Definition: LapackWrapper.h:212
OPEN3D_CPU_LINALG_INT gels_cpu< float >(int layout, char trans, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT nrhs, float *A_data, OPEN3D_CPU_LINALG_INT lda, float *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:168
OPEN3D_CPU_LINALG_INT gesv_cpu< double >(int layout, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT m, double *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data, double *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:156
OPEN3D_CPU_LINALG_INT getri_cpu(int layout, OPEN3D_CPU_LINALG_INT n, scalar_t *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:47
OPEN3D_CPU_LINALG_INT getrf_cpu< double >(int layout, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, double *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:113
OPEN3D_CPU_LINALG_INT gels_cpu< double >(int layout, char trans, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT nrhs, double *A_data, OPEN3D_CPU_LINALG_INT lda, double *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:181
OPEN3D_CPU_LINALG_INT gels_cpu(int matrix_layout, char trans, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT nrhs, scalar_t *A_data, OPEN3D_CPU_LINALG_INT lda, scalar_t *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:70
OPEN3D_CPU_LINALG_INT getri_cpu< float >(int layout, OPEN3D_CPU_LINALG_INT n, float *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:124
OPEN3D_CPU_LINALG_INT getrf_cpu(int layout, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, scalar_t *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:36
OPEN3D_CPU_LINALG_INT gesvd_cpu< float >(int layout, char jobu, char jobvt, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, float *A_data, OPEN3D_CPU_LINALG_INT lda, float *S_data, float *U_data, OPEN3D_CPU_LINALG_INT ldu, float *VT_data, OPEN3D_CPU_LINALG_INT ldvt, float *superb)
Definition: LapackWrapper.h:194
OPEN3D_CPU_LINALG_INT gesvd_cpu(int matrix_layout, char jobu, char jobvt, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, scalar_t *A_data, OPEN3D_CPU_LINALG_INT lda, scalar_t *S_data, scalar_t *U_data, OPEN3D_CPU_LINALG_INT ldu, scalar_t *VT_data, OPEN3D_CPU_LINALG_INT ldvt, scalar_t *superb)
Definition: LapackWrapper.h:84
OPEN3D_CPU_LINALG_INT getri_cpu< double >(int layout, OPEN3D_CPU_LINALG_INT n, double *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:134
OPEN3D_CPU_LINALG_INT gesv_cpu< float >(int layout, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT m, float *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data, float *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:144
OPEN3D_CPU_LINALG_INT gesv_cpu(int layout, OPEN3D_CPU_LINALG_INT n, OPEN3D_CPU_LINALG_INT m, scalar_t *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data, scalar_t *B_data, OPEN3D_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:57
OPEN3D_CPU_LINALG_INT getrf_cpu< float >(int layout, OPEN3D_CPU_LINALG_INT m, OPEN3D_CPU_LINALG_INT n, float *A_data, OPEN3D_CPU_LINALG_INT lda, OPEN3D_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:102
Definition: PinholeCameraIntrinsic.cpp:35