Open3D (C++ API)  0.13.0
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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 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 
31 #include "open3d/utility/Console.h"
32 
33 namespace open3d {
34 namespace core {
35 template <typename scalar_t>
36 inline OPEN3D_CPU_LINALG_INT getrf_cpu(int layout,
39  scalar_t* A_data,
41  OPEN3D_CPU_LINALG_INT* ipiv_data) {
42  utility::LogError("Unsupported data type.");
43  return -1;
44 }
45 
46 template <typename scalar_t>
47 inline OPEN3D_CPU_LINALG_INT getri_cpu(int layout,
49  scalar_t* A_data,
51  OPEN3D_CPU_LINALG_INT* ipiv_data) {
52  utility::LogError("Unsupported data type.");
53  return -1;
54 }
55 
56 template <typename scalar_t>
57 inline OPEN3D_CPU_LINALG_INT gesv_cpu(int layout,
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 
69 template <typename scalar_t>
70 inline 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 
83 template <typename scalar_t>
84 inline 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 
101 template <>
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 
112 template <>
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 
123 template <>
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 
133 template <>
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 
143 template <>
147  float* A_data,
149  OPEN3D_CPU_LINALG_INT* ipiv_data,
150  float* B_data,
151  OPEN3D_CPU_LINALG_INT ldb) {
152  return LAPACKE_sgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
153 }
154 
155 template <>
159  double* A_data,
161  OPEN3D_CPU_LINALG_INT* ipiv_data,
162  double* B_data,
163  OPEN3D_CPU_LINALG_INT ldb) {
164  return LAPACKE_dgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
165 }
166 
167 template <>
169  char trans,
173  float* A_data,
175  float* B_data,
176  OPEN3D_CPU_LINALG_INT ldb) {
177  return LAPACKE_sgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
178 }
179 
180 template <>
182  char trans,
186  double* A_data,
188  double* B_data,
189  OPEN3D_CPU_LINALG_INT ldb) {
190  return LAPACKE_dgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
191 }
192 
193 template <>
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 
211 template <>
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
230 template <typename scalar_t>
231 inline 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 
237 template <typename scalar_t>
238 inline 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 
250 template <typename scalar_t>
251 inline 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 
265 template <typename scalar_t>
266 inline 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 
272 template <typename scalar_t>
273 inline 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 
286 template <typename scalar_t>
287 inline 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 
300 template <typename scalar_t>
301 inline 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 
319 template <typename scalar_t>
320 inline 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 
328 template <typename scalar_t>
329 inline 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 
349 template <>
350 inline 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 
355 template <>
356 inline 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 
361 template <>
362 inline 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 
374 template <>
375 inline 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 
387 template <>
388 inline 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 
402 template <>
403 inline 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 
417 template <>
418 inline 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 
423 template <>
424 inline 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 
429 template <>
430 inline 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 
442 template <>
443 inline 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 
455 template <>
456 inline 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 
469 template <>
470 inline 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 
483 template <>
484 inline 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 
502 template <>
503 inline 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 
521 template <>
522 inline 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 
529 template <>
530 inline 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 
537 template <>
538 inline 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 
558 template <>
559 inline 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
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
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 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 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 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 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 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 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
#define LogError(...)
Definition: Console.h:79
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
Definition: PinholeCameraIntrinsic.cpp:35
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
#define OPEN3D_CPU_LINALG_INT
Definition: LinalgHeadersCPU.h:45
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 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 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 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 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