31 cusolverDnHandle_t cusolver_handle =
33 cublasHandle_t cublas_handle =
37 int len_geqrf, len_ormqr, len;
38 Blob dinfo(
sizeof(
int), device);
40 OPEN3D_CUSOLVER_CHECK(geqrf_cuda_buffersize<scalar_t>(
41 cusolver_handle, m, n, m, &len_geqrf),
42 "geqrf_buffersize failed in LeastSquaresCUDA");
43 OPEN3D_CUSOLVER_CHECK(ormqr_cuda_buffersize<scalar_t>(
44 cusolver_handle, CUBLAS_SIDE_LEFT,
45 CUBLAS_OP_T, m, k, n, m, m, &len_ormqr),
46 "ormqr_buffersize failed in LeastSquaresCUDA");
47 len =
std::max(len_geqrf, len_ormqr);
49 Blob workspace(len *
sizeof(scalar_t), device);
50 Blob tau(n *
sizeof(scalar_t), device);
53 OPEN3D_CUSOLVER_CHECK_WITH_DINFO(
55 cusolver_handle, m, n,
static_cast<scalar_t*
>(A_data),
57 static_cast<scalar_t*
>(workspace.
GetDataPtr()), len,
59 "geqrf failed in LeastSquaresCUDA",
60 static_cast<int*
>(dinfo.
GetDataPtr()), device);
63 OPEN3D_CUSOLVER_CHECK_WITH_DINFO(
65 cusolver_handle, CUBLAS_SIDE_LEFT, CUBLAS_OP_T, m, k, n,
66 static_cast<scalar_t*
>(A_data), m,
68 static_cast<scalar_t*
>(B_data), m,
69 static_cast<scalar_t*
>(workspace.
GetDataPtr()), len,
71 "ormqr failed in LeastSquaresCUDA",
72 static_cast<int*
>(dinfo.
GetDataPtr()), device);
75 scalar_t alpha = 1.0f;
77 trsm_cuda<scalar_t>(cublas_handle, CUBLAS_SIDE_LEFT,
78 CUBLAS_FILL_MODE_UPPER, CUBLAS_OP_N,
79 CUBLAS_DIAG_NON_UNIT, n, k, &alpha,
80 static_cast<scalar_t*
>(A_data), m,
81 static_cast<scalar_t*
>(B_data), m),
82 "trsm failed in LeastSquaresCUDA");
#define DISPATCH_LINALG_DTYPE_TO_TEMPLATE(DTYPE,...)
ccGuiPythonInstance * GetInstance() noexcept
void LeastSquaresCUDA(void *A_data, void *B_data, int64_t m, int64_t n, int64_t k, Dtype dtype, const Device &device)
Generic file read and write utility for python interface.