ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
LapackWrapper.h
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #pragma once
9 
10 #include <Logging.h>
11 
14 
15 namespace cloudViewer {
16 namespace core {
17 template <typename scalar_t>
19  int layout,
22  scalar_t* A_data,
24  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
25  utility::LogError("Unsupported data type.");
26  return -1;
27 }
28 
29 template <typename scalar_t>
31  int layout,
33  scalar_t* A_data,
35  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
36  utility::LogError("Unsupported data type.");
37  return -1;
38 }
39 
40 template <typename scalar_t>
42  int layout,
45  scalar_t* A_data,
47  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data,
48  scalar_t* B_data,
50  utility::LogError("Unsupported data type.");
51  return -1;
52 }
53 
54 template <typename scalar_t>
55 inline CLOUDVIEWER_CPU_LINALG_INT gels_cpu(int matrix_layout,
56  char trans,
60  scalar_t* A_data,
62  scalar_t* B_data,
64  utility::LogError("Unsupported data type.");
65  return -1;
66 }
67 
68 template <typename scalar_t>
69 inline CLOUDVIEWER_CPU_LINALG_INT gesvd_cpu(int matrix_layout,
70  char jobu,
71  char jobvt,
74  scalar_t* A_data,
76  scalar_t* S_data,
77  scalar_t* U_data,
79  scalar_t* VT_data,
81  scalar_t* superb) {
82  utility::LogError("Unsupported data type.");
83  return -1;
84 }
85 
86 template <>
88  int layout,
91  float* A_data,
93  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
94  return LAPACKE_sgetrf(layout, m, n, A_data, lda, ipiv_data);
95 }
96 
97 template <>
99  int layout,
102  double* A_data,
104  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
105  return LAPACKE_dgetrf(layout, m, n, A_data, lda, ipiv_data);
106 }
107 
108 template <>
110  int layout,
112  float* A_data,
114  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
115  return LAPACKE_sgetri(layout, n, A_data, lda, ipiv_data);
116 }
117 
118 template <>
120  int layout,
122  double* A_data,
124  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data) {
125  return LAPACKE_dgetri(layout, n, A_data, lda, ipiv_data);
126 }
127 
128 template <>
130  int layout,
133  float* A_data,
135  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data,
136  float* B_data,
138  return LAPACKE_sgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
139 }
140 
141 template <>
143  int layout,
146  double* A_data,
148  CLOUDVIEWER_CPU_LINALG_INT* ipiv_data,
149  double* B_data,
151  return LAPACKE_dgesv(layout, n, m, A_data, lda, ipiv_data, B_data, ldb);
152 }
153 
154 template <>
156  int layout,
157  char trans,
161  float* A_data,
163  float* B_data,
165  return LAPACKE_sgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
166 }
167 
168 template <>
170  int layout,
171  char trans,
175  double* A_data,
177  double* B_data,
179  return LAPACKE_dgels(layout, trans, m, n, nrhs, A_data, lda, B_data, ldb);
180 }
181 
182 template <>
184  int layout,
185  char jobu,
186  char jobvt,
189  float* A_data,
191  float* S_data,
192  float* U_data,
194  float* VT_data,
196  float* superb) {
197  return LAPACKE_sgesvd(layout, jobu, jobvt, m, n, A_data, lda, S_data,
198  U_data, ldu, VT_data, ldvt, superb);
199 }
200 
201 template <>
203  int layout,
204  char jobu,
205  char jobvt,
208  double* A_data,
210  double* S_data,
211  double* U_data,
213  double* VT_data,
215  double* superb) {
216  return LAPACKE_dgesvd(layout, jobu, jobvt, m, n, A_data, lda, S_data,
217  U_data, ldu, VT_data, ldvt, superb);
218 }
219 
220 #ifdef BUILD_CUDA_MODULE
221 template <typename scalar_t>
222 inline cusolverStatus_t getrf_cuda_buffersize(
223  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
224  utility::LogError("Unsupported data type.");
225  return CUSOLVER_STATUS_INTERNAL_ERROR;
226 }
227 
228 template <typename scalar_t>
229 inline cusolverStatus_t getrf_cuda(cusolverDnHandle_t handle,
230  int m,
231  int n,
232  scalar_t* A_data,
233  int lda,
234  scalar_t* workspace,
235  int* ipiv_data,
236  int* dinfo) {
237  utility::LogError("Unsupported data type.");
238  return CUSOLVER_STATUS_INTERNAL_ERROR;
239 }
240 
241 template <typename scalar_t>
242 inline cusolverStatus_t getrs_cuda(cusolverDnHandle_t handle,
243  cublasOperation_t trans,
244  int n,
245  int nrhs,
246  const scalar_t* A_data,
247  int lda,
248  const int* ipiv_data,
249  scalar_t* B_data,
250  int ldb,
251  int* dinfo) {
252  utility::LogError("Unsupported data type.");
253  return CUSOLVER_STATUS_INTERNAL_ERROR;
254 }
255 
256 template <typename scalar_t>
257 inline cusolverStatus_t geqrf_cuda_buffersize(
258  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
259  utility::LogError("Unsupported data type.");
260  return CUSOLVER_STATUS_INTERNAL_ERROR;
261 }
262 
263 template <typename scalar_t>
264 inline cusolverStatus_t geqrf_cuda(cusolverDnHandle_t handle,
265  int m,
266  int n,
267  scalar_t* A,
268  int lda,
269  scalar_t* tau,
270  scalar_t* workspace,
271  int len,
272  int* dinfo) {
273  utility::LogError("Unsupported data type.");
274  return CUSOLVER_STATUS_INTERNAL_ERROR;
275 }
276 
277 template <typename scalar_t>
278 inline cusolverStatus_t ormqr_cuda_buffersize(cusolverDnHandle_t handle,
279  cublasSideMode_t side,
280  cublasOperation_t trans,
281  int m,
282  int n,
283  int k,
284  int lda,
285  int ldc,
286  int* len) {
287  utility::LogError("Unsupported data type.");
288  return CUSOLVER_STATUS_INTERNAL_ERROR;
289 }
290 
291 template <typename scalar_t>
292 inline cusolverStatus_t ormqr_cuda(cusolverDnHandle_t handle,
293  cublasSideMode_t side,
294  cublasOperation_t trans,
295  int m,
296  int n,
297  int k,
298  const scalar_t* A,
299  int lda,
300  const scalar_t* tau,
301  scalar_t* C,
302  int ldc,
303  scalar_t* workspace,
304  int len,
305  int* dinfo) {
306  utility::LogError("Unsupported data type.");
307  return CUSOLVER_STATUS_INTERNAL_ERROR;
308 }
309 
310 template <typename scalar_t>
311 inline cusolverStatus_t gesvd_cuda_buffersize(cusolverDnHandle_t handle,
312  int m,
313  int n,
314  int* len) {
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(cusolverDnHandle_t handle,
321  char jobu,
322  char jobvt,
323  int m,
324  int n,
325  scalar_t* A,
326  int lda,
327  scalar_t* S,
328  scalar_t* U,
329  int ldu,
330  scalar_t* VT,
331  int ldvt,
332  scalar_t* workspace,
333  int len,
334  scalar_t* rwork,
335  int* dinfo) {
336  utility::LogError("Unsupported data type.");
337  return CUSOLVER_STATUS_INTERNAL_ERROR;
338 }
339 
340 template <>
341 inline cusolverStatus_t getrf_cuda_buffersize<float>(
342  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
343  return cusolverDnSgetrf_bufferSize(handle, m, n, NULL, lda, len);
344 }
345 
346 template <>
347 inline cusolverStatus_t getrf_cuda_buffersize<double>(
348  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
349  return cusolverDnDgetrf_bufferSize(handle, m, n, NULL, lda, len);
350 }
351 
352 template <>
353 inline cusolverStatus_t getrf_cuda<float>(cusolverDnHandle_t handle,
354  int m,
355  int n,
356  float* A_data,
357  int lda,
358  float* workspace,
359  int* ipiv_data,
360  int* dinfo) {
361  return cusolverDnSgetrf(handle, m, n, A_data, lda, workspace, ipiv_data,
362  dinfo);
363 }
364 
365 template <>
366 inline cusolverStatus_t getrf_cuda<double>(cusolverDnHandle_t handle,
367  int m,
368  int n,
369  double* A_data,
370  int lda,
371  double* workspace,
372  int* ipiv_data,
373  int* dinfo) {
374  return cusolverDnDgetrf(handle, m, n, A_data, lda, workspace, ipiv_data,
375  dinfo);
376 }
377 
378 template <>
379 inline cusolverStatus_t getrs_cuda<float>(cusolverDnHandle_t handle,
380  cublasOperation_t trans,
381  int n,
382  int nrhs,
383  const float* A_data,
384  int lda,
385  const int* ipiv_data,
386  float* B_data,
387  int ldb,
388  int* dinfo) {
389  return cusolverDnSgetrs(handle, trans, n, nrhs, A_data, lda, ipiv_data,
390  B_data, ldb, dinfo);
391 }
392 
393 template <>
394 inline cusolverStatus_t getrs_cuda<double>(cusolverDnHandle_t handle,
395  cublasOperation_t trans,
396  int n,
397  int nrhs,
398  const double* A_data,
399  int lda,
400  const int* ipiv_data,
401  double* B_data,
402  int ldb,
403  int* dinfo) {
404  return cusolverDnDgetrs(handle, trans, n, nrhs, A_data, lda, ipiv_data,
405  B_data, ldb, dinfo);
406 }
407 
408 template <>
409 inline cusolverStatus_t geqrf_cuda_buffersize<float>(
410  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
411  return cusolverDnSgeqrf_bufferSize(handle, m, n, NULL, lda, len);
412 }
413 
414 template <>
415 inline cusolverStatus_t geqrf_cuda_buffersize<double>(
416  cusolverDnHandle_t handle, int m, int n, int lda, int* len) {
417  return cusolverDnDgeqrf_bufferSize(handle, m, n, NULL, lda, len);
418 }
419 
420 template <>
421 inline cusolverStatus_t geqrf_cuda<float>(cusolverDnHandle_t handle,
422  int m,
423  int n,
424  float* A,
425  int lda,
426  float* tau,
427  float* workspace,
428  int len,
429  int* dinfo) {
430  return cusolverDnSgeqrf(handle, m, n, A, lda, tau, workspace, len, dinfo);
431 }
432 
433 template <>
434 inline cusolverStatus_t geqrf_cuda<double>(cusolverDnHandle_t handle,
435  int m,
436  int n,
437  double* A,
438  int lda,
439  double* tau,
440  double* workspace,
441  int len,
442  int* dinfo) {
443  return cusolverDnDgeqrf(handle, m, n, A, lda, tau, workspace, len, dinfo);
444 }
445 
446 template <>
447 inline cusolverStatus_t ormqr_cuda_buffersize<float>(cusolverDnHandle_t handle,
448  cublasSideMode_t side,
449  cublasOperation_t trans,
450  int m,
451  int n,
452  int k,
453  int lda,
454  int ldc,
455  int* len) {
456  return cusolverDnSormqr_bufferSize(handle, side, trans, m, n, k, NULL, lda,
457  NULL, NULL, ldc, len);
458 }
459 
460 template <>
461 inline cusolverStatus_t ormqr_cuda_buffersize<double>(cusolverDnHandle_t handle,
462  cublasSideMode_t side,
463  cublasOperation_t trans,
464  int m,
465  int n,
466  int k,
467  int lda,
468  int ldc,
469  int* len) {
470  return cusolverDnDormqr_bufferSize(handle, side, trans, m, n, k, NULL, lda,
471  NULL, NULL, ldc, len);
472 }
473 
474 template <>
475 inline cusolverStatus_t ormqr_cuda<float>(cusolverDnHandle_t handle,
476  cublasSideMode_t side,
477  cublasOperation_t trans,
478  int m,
479  int n,
480  int k,
481  const float* A,
482  int lda,
483  const float* tau,
484  float* C,
485  int ldc,
486  float* workspace,
487  int len,
488  int* dinfo) {
489  return cusolverDnSormqr(handle, side, trans, m, n, k, A, lda, tau, C, ldc,
490  workspace, len, dinfo);
491 }
492 
493 template <>
494 inline cusolverStatus_t ormqr_cuda<double>(cusolverDnHandle_t handle,
495  cublasSideMode_t side,
496  cublasOperation_t trans,
497  int m,
498  int n,
499  int k,
500  const double* A,
501  int lda,
502  const double* tau,
503  double* C,
504  int ldc,
505  double* workspace,
506  int len,
507  int* dinfo) {
508  return cusolverDnDormqr(handle, side, trans, m, n, k, A, lda, tau, C, ldc,
509  workspace, len, dinfo);
510 }
511 
512 template <>
513 inline cusolverStatus_t gesvd_cuda_buffersize<float>(cusolverDnHandle_t handle,
514  int m,
515  int n,
516  int* len) {
517  return cusolverDnSgesvd_bufferSize(handle, m, n, len);
518 }
519 
520 template <>
521 inline cusolverStatus_t gesvd_cuda_buffersize<double>(cusolverDnHandle_t handle,
522  int m,
523  int n,
524  int* len) {
525  return cusolverDnDgesvd_bufferSize(handle, m, n, len);
526 }
527 
528 template <>
529 inline cusolverStatus_t gesvd_cuda<float>(cusolverDnHandle_t handle,
530  char jobu,
531  char jobvt,
532  int m,
533  int n,
534  float* A,
535  int lda,
536  float* S,
537  float* U,
538  int ldu,
539  float* VT,
540  int ldvt,
541  float* workspace,
542  int len,
543  float* rwork,
544  int* dinfo) {
545  return cusolverDnSgesvd(handle, jobu, jobvt, m, n, A, lda, S, U, ldu, VT,
546  ldvt, workspace, len, rwork, dinfo);
547 }
548 
549 template <>
550 inline cusolverStatus_t gesvd_cuda<double>(cusolverDnHandle_t handle,
551  char jobu,
552  char jobvt,
553  int m,
554  int n,
555  double* A,
556  int lda,
557  double* S,
558  double* U,
559  int ldu,
560  double* VT,
561  int ldvt,
562  double* workspace,
563  int len,
564  double* rwork,
565  int* dinfo) {
566  return cusolverDnDgesvd(handle, jobu, jobvt, m, n, A, lda, S, U, ldu, VT,
567  ldvt, workspace, len, rwork, dinfo);
568 }
569 
570 #endif
571 } // namespace core
572 } // namespace cloudViewer
#define CLOUDVIEWER_CPU_LINALG_INT
#define NULL
#define LogError(...)
Definition: Logging.h:60
CLOUDVIEWER_CPU_LINALG_INT getrf_cpu< float >(int layout, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, float *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:87
CLOUDVIEWER_CPU_LINALG_INT gels_cpu< float >(int layout, char trans, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT nrhs, float *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, float *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
CLOUDVIEWER_CPU_LINALG_INT gesv_cpu< double >(int layout, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT m, double *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data, double *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
CLOUDVIEWER_CPU_LINALG_INT gesvd_cpu< float >(int layout, char jobu, char jobvt, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, float *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, float *S_data, float *U_data, CLOUDVIEWER_CPU_LINALG_INT ldu, float *VT_data, CLOUDVIEWER_CPU_LINALG_INT ldvt, float *superb)
CLOUDVIEWER_CPU_LINALG_INT gels_cpu(int matrix_layout, char trans, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT nrhs, scalar_t *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, scalar_t *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:55
CLOUDVIEWER_CPU_LINALG_INT getri_cpu< double >(int layout, CLOUDVIEWER_CPU_LINALG_INT n, double *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
CLOUDVIEWER_CPU_LINALG_INT getri_cpu(int layout, CLOUDVIEWER_CPU_LINALG_INT n, scalar_t *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:30
CLOUDVIEWER_CPU_LINALG_INT gesvd_cpu(int matrix_layout, char jobu, char jobvt, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, scalar_t *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, scalar_t *S_data, scalar_t *U_data, CLOUDVIEWER_CPU_LINALG_INT ldu, scalar_t *VT_data, CLOUDVIEWER_CPU_LINALG_INT ldvt, scalar_t *superb)
Definition: LapackWrapper.h:69
CLOUDVIEWER_CPU_LINALG_INT gels_cpu< double >(int layout, char trans, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT nrhs, double *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, double *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
CLOUDVIEWER_CPU_LINALG_INT gesv_cpu< float >(int layout, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT m, float *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data, float *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
CLOUDVIEWER_CPU_LINALG_INT getrf_cpu< double >(int layout, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, double *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:98
CLOUDVIEWER_CPU_LINALG_INT getrf_cpu(int layout, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, scalar_t *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
Definition: LapackWrapper.h:18
CLOUDVIEWER_CPU_LINALG_INT gesvd_cpu< double >(int layout, char jobu, char jobvt, CLOUDVIEWER_CPU_LINALG_INT m, CLOUDVIEWER_CPU_LINALG_INT n, double *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, double *S_data, double *U_data, CLOUDVIEWER_CPU_LINALG_INT ldu, double *VT_data, CLOUDVIEWER_CPU_LINALG_INT ldvt, double *superb)
CLOUDVIEWER_CPU_LINALG_INT gesv_cpu(int layout, CLOUDVIEWER_CPU_LINALG_INT n, CLOUDVIEWER_CPU_LINALG_INT m, scalar_t *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data, scalar_t *B_data, CLOUDVIEWER_CPU_LINALG_INT ldb)
Definition: LapackWrapper.h:41
CLOUDVIEWER_CPU_LINALG_INT getri_cpu< float >(int layout, CLOUDVIEWER_CPU_LINALG_INT n, float *A_data, CLOUDVIEWER_CPU_LINALG_INT lda, CLOUDVIEWER_CPU_LINALG_INT *ipiv_data)
Generic file read and write utility for python interface.