forked from tsai/mathnet-numerics
6 changed files with 684 additions and 6 deletions
@ -0,0 +1,93 @@ |
|||||
|
#include "cublas_v2.h" |
||||
|
#include "wrapper_common.h" |
||||
|
|
||||
|
#if GCC |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
DLLEXPORT void s_axpy(const cublasHandle_t handle, const int n, const float alpha, const float x[], float y[]){ |
||||
|
cublasSaxpy(handle, n, &alpha, x, 1, y, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void d_axpy(const cublasHandle_t handle, const int n, const double alpha, const double x[], double y[]){ |
||||
|
cublasDaxpy(handle, n, &alpha, x, 1, y, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void c_axpy(const cublasHandle_t handle, const int n, const cuComplex alpha, const cuComplex x[], cuComplex y[]){ |
||||
|
cublasCaxpy(handle, n, &alpha, x, 1, y, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void z_axpy(const cublasHandle_t handle, const int n, const cuDoubleComplex alpha, const cuDoubleComplex x[], cuDoubleComplex y[]){ |
||||
|
cublasZaxpy(handle, n, &alpha, x, 1, y, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void s_scale(const cublasHandle_t handle, const int n, const float alpha, float x[]){ |
||||
|
cublasSscal(handle, n, &alpha, x, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void d_scale(const cublasHandle_t handle, const int n, const double alpha, double x[]){ |
||||
|
cublasDscal(handle, n, &alpha, x, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void c_scale(const cublasHandle_t handle, const int n, const cuComplex alpha, cuComplex x[]){ |
||||
|
cublasCscal(handle, n, &alpha, x, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void z_scale(const cublasHandle_t handle, const int n, const cuDoubleComplex alpha, cuDoubleComplex x[]){ |
||||
|
cublasZscal(handle, n, &alpha, x, 1); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT float s_dot_product(const cublasHandle_t handle, const int n, const float x[], const float y[]){ |
||||
|
float ret; |
||||
|
cublasSdot(handle, n, x, 1, y, 1, &ret); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT double d_dot_product(const cublasHandle_t handle, const int n, const double x[], const double y[]){ |
||||
|
double ret; |
||||
|
cublasDdot(handle, n, x, 1, y, 1, &ret); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT cuComplex c_dot_product(const cublasHandle_t handle, const int n, const cuComplex x[], const cuComplex y[]){ |
||||
|
cuComplex ret; |
||||
|
cublasCdotu(handle, n, x, 1, y, 1, &ret); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT cuDoubleComplex z_dot_product(const cublasHandle_t handle, const int n, const cuDoubleComplex x[], const cuDoubleComplex y[]){ |
||||
|
cuDoubleComplex ret; |
||||
|
cublasZdotu(handle, n, x, 1, y, 1, &ret); |
||||
|
return ret; |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void s_matrix_multiply(const cublasHandle_t handle, cublasOperation_t transA, cublasOperation_t transB, const int m, const int n, const int k, const float alpha, const float x[], const float y[], const float beta, float c[]){ |
||||
|
int lda = transA == CUBLAS_OP_N ? m : k; |
||||
|
int ldb = transB == CUBLAS_OP_N ? k : n; |
||||
|
|
||||
|
cublasSgemm(handle, transA, transB, m, n, k, &alpha, x, lda, y, ldb, &beta, c, m); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void d_matrix_multiply(const cublasHandle_t handle, cublasOperation_t transA, cublasOperation_t transB, const int m, const int n, const int k, const double alpha, const double x[], const double y[], const double beta, double c[]){ |
||||
|
int lda = transA == CUBLAS_OP_N ? m : k; |
||||
|
int ldb = transB == CUBLAS_OP_N ? k : n; |
||||
|
|
||||
|
cublasDgemm(handle, transA, transB, m, n, k, &alpha, x, lda, y, ldb, &beta, c, m); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void c_matrix_multiply(const cublasHandle_t handle, cublasOperation_t transA, cublasOperation_t transB, const int m, const int n, const int k, const cuComplex alpha, const cuComplex x[], const cuComplex y[], const cuComplex beta, cuComplex c[]){ |
||||
|
int lda = transA == CUBLAS_OP_N ? m : k; |
||||
|
int ldb = transB == CUBLAS_OP_N ? k : n; |
||||
|
|
||||
|
cublasCgemm(handle, transA, transB, m, n, k, &alpha, x, lda, y, ldb, &beta, c, m); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT void z_matrix_multiply(const cublasHandle_t handle, cublasOperation_t transA, cublasOperation_t transB, const int m, const int n, const int k, const cuDoubleComplex alpha, const cuDoubleComplex x[], const cuDoubleComplex y[], const cuDoubleComplex beta, cuDoubleComplex c[]){ |
||||
|
int lda = transA == CUBLAS_OP_N ? m : k; |
||||
|
int ldb = transB == CUBLAS_OP_N ? k : n; |
||||
|
|
||||
|
cublasZgemm(handle, transA, transB, m, n, k, &alpha, x, lda, y, ldb, &beta, c, m); |
||||
|
} |
||||
|
|
||||
|
#if GCC |
||||
|
} |
||||
|
#endif |
||||
@ -0,0 +1,521 @@ |
|||||
|
#include "lapack_common.h" |
||||
|
#include "wrapper_common.h" |
||||
|
#include "cublas.h" |
||||
|
#include "cusolverDn.h" |
||||
|
#include <algorithm> |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int lu_factor(int m, T a[], int ipiv[], |
||||
|
int(*getrf) (CBLAS_ORDER, const int, const int, K*, const int, int*)) |
||||
|
{ |
||||
|
int info = getrf(CblasColMajor, m, m, a, m, ipiv); |
||||
|
shift_ipiv_down(m, ipiv); |
||||
|
return info; |
||||
|
}; |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int lu_inverse(int n, T a[], |
||||
|
int(*getrf) (CBLAS_ORDER, const int, const int, K*, const int, int*), |
||||
|
int(*getri) (CBLAS_ORDER, const int, K*, const int, const int*)) |
||||
|
{ |
||||
|
int* ipiv = new int[n]; |
||||
|
int info = getrf(CblasColMajor, n, n, a, n, ipiv); |
||||
|
|
||||
|
if (info != 0){ |
||||
|
delete[] ipiv; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
info = getri(CblasColMajor, n, a, n, ipiv); |
||||
|
delete[] ipiv; |
||||
|
return info; |
||||
|
}; |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int lu_inverse_factored(int n, T a[], int ipiv[], |
||||
|
int(*getri) (CBLAS_ORDER, const int, K*, const int, const int*)) |
||||
|
{ |
||||
|
shift_ipiv_up(n, ipiv); |
||||
|
int info = getri(CblasColMajor, n, a, n, ipiv); |
||||
|
shift_ipiv_down(n, ipiv); |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int lu_solve_factored(int n, int nrhs, T a[], int ipiv[], T b[], |
||||
|
int(*getrs) (CBLAS_ORDER, CBLAS_TRANSPOSE, const int, const int, const K*, const int, const int*, K*, const int)) |
||||
|
{ |
||||
|
shift_ipiv_up(n, ipiv); |
||||
|
int info = getrs(CblasColMajor, CblasNoTrans, n, nrhs, a, n, ipiv, b, n); |
||||
|
shift_ipiv_down(n, ipiv); |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int lu_solve(int n, int nrhs, T a[], T b[], |
||||
|
int(*getrf) (CBLAS_ORDER, const int, const int, K*, const int, int*), |
||||
|
int(*getrs) (CBLAS_ORDER, CBLAS_TRANSPOSE, const int, const int, const K*, const int, const int*, K*, const int)) |
||||
|
{ |
||||
|
T* clone = Clone(n, n, a); |
||||
|
int* ipiv = new int[n]; |
||||
|
int info = getrf(CblasColMajor, n, n, clone, n, ipiv); |
||||
|
|
||||
|
if (info != 0){ |
||||
|
delete[] ipiv; |
||||
|
delete[] clone; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
info = getrs(CblasColMajor, CblasNoTrans, n, nrhs, clone, n, ipiv, b, n); |
||||
|
delete[] ipiv; |
||||
|
delete[] clone; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int cholesky_factor(int n, T* a, int(*potrf) (CBLAS_ORDER, CBLAS_UPLO, const int, K*, const int)) |
||||
|
{ |
||||
|
int info = potrf(CblasColMajor, CblasLower, n, a, n); |
||||
|
T zero = T(); |
||||
|
for (int i = 0; i < n; ++i) |
||||
|
{ |
||||
|
int index = i * n; |
||||
|
for (int j = 0; j < n && i > j; ++j) |
||||
|
{ |
||||
|
a[index + j] = zero; |
||||
|
} |
||||
|
} |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int cholesky_solve(int n, int nrhs, T a[], T b[], |
||||
|
int(*potrf) (CBLAS_ORDER, CBLAS_UPLO, const int, K*, const int), |
||||
|
int(*potrs) (CBLAS_ORDER, CBLAS_UPLO, const int, const int, const K*, const int, K*, const int)) |
||||
|
{ |
||||
|
T* clone = Clone(n, n, a); |
||||
|
int info = potrf(CblasColMajor, CblasLower, n, clone, n); |
||||
|
|
||||
|
if (info != 0){ |
||||
|
delete[] clone; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
info = potrs(CblasColMajor, CblasLower, n, nrhs, clone, n, b, n); |
||||
|
delete[] clone; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int cholesky_solve_factored(int n, int nrhs, T a[], T b[], |
||||
|
int(*potrs) (CBLAS_ORDER, CBLAS_UPLO, const int, const int, const K*, const int, K*, const int)) |
||||
|
{ |
||||
|
return potrs(CblasColMajor, CblasLower, n, nrhs, a, n, b, n); |
||||
|
} |
||||
|
|
||||
|
template<typename T, typename K> |
||||
|
inline int qr_factor(int m, int n, T r[], T tau[], T q[], T work[], int len, |
||||
|
int(*geqrf) (const int, const int, K*, const int, T*), |
||||
|
int(*orgqr) (const int, const int, const int, K*, const int, const K*)) |
||||
|
{ |
||||
|
int info = geqrf(m, n, r, m, tau); |
||||
|
|
||||
|
for (int i = 0; i < m; ++i) |
||||
|
{ |
||||
|
for (int j = 0; j < m && j < n; ++j) |
||||
|
{ |
||||
|
if (i > j) |
||||
|
{ |
||||
|
q[j * m + i] = r[j * m + i]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
//compute the q elements explicitly
|
||||
|
if (m <= n) |
||||
|
{ |
||||
|
info = orgqr(m, m, m, q, m, tau); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
info = orgqr(m, m, n, q, m, tau); |
||||
|
} |
||||
|
|
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T> |
||||
|
inline int qr_thin_factor(int m, int n, T q[], T tau[], T r[], T work[], int len, |
||||
|
void(*geqrf) (const int*, const int*, T*, const int*, T*, T*, const int*, int*), |
||||
|
void(*orgqr) (const int*, const int*, const int*, T*, const int*, const T*, T*, const int*, int*)) |
||||
|
{ |
||||
|
int info = 0; |
||||
|
geqrf(&m, &n, q, &m, tau, work, &len, &info); |
||||
|
|
||||
|
for (int i = 0; i < n; ++i) |
||||
|
{ |
||||
|
for (int j = 0; j < n; ++j) |
||||
|
{ |
||||
|
if (i <= j) { |
||||
|
r[j * n + i] = q[j * m + i]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
orgqr(&m, &n, &n, q, &m, tau, work, &len, &info); |
||||
|
|
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T> |
||||
|
inline int qr_solve(int m, int n, int bn, T a[], T b[], T x[], T work[], int len, |
||||
|
void(*gels) (const char*, const int*, const int*, const int*, T*, |
||||
|
const int*, T* b, const int*, T*, const int*, int*)) |
||||
|
{ |
||||
|
T* clone_a = new T[m*n]; |
||||
|
std::memcpy(clone_a, a, m*n*sizeof(T)); |
||||
|
|
||||
|
T* clone_b = new T[m*bn]; |
||||
|
std::memcpy(clone_b, b, m*bn*sizeof(T)); |
||||
|
|
||||
|
char N = 'N'; |
||||
|
int info = 0; |
||||
|
gels(&N, &m, &n, &bn, clone_a, &m, clone_b, &m, work, &len, &info); |
||||
|
copyBtoX(n, n, bn, clone_b, x); |
||||
|
|
||||
|
delete[] clone_a; |
||||
|
delete[] clone_b; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T> |
||||
|
inline int qr_solve_factored(int m, int n, int bn, T r[], T b[], T tau[], T x[], T work[], int len, |
||||
|
void(*ormqr) (const char*, const char*, const int*, const int*, const int*, |
||||
|
const T*, const int*, const T*, T*, const int*, T*, const int*, int* info), |
||||
|
void(*trsm) (const CBLAS_ORDER, const CBLAS_SIDE, const CBLAS_UPLO, const CBLAS_TRANSPOSE, const CBLAS_DIAG, |
||||
|
const int, const int, const T, const T*, const int, T*, const int)) |
||||
|
{ |
||||
|
T* clone_b = new T[m*bn]; |
||||
|
std::memcpy(clone_b, b, m*bn*sizeof(T)); |
||||
|
|
||||
|
char side = 'L'; |
||||
|
char tran = 'T'; |
||||
|
int info = 0; |
||||
|
ormqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); |
||||
|
trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, 1.0, r, m, clone_b, m); |
||||
|
copyBtoX(n, n, bn, clone_b, x); |
||||
|
|
||||
|
delete[] clone_b; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T> |
||||
|
inline int complex_qr_solve_factored(int m, int n, int bn, T r[], T b[], T tau[], T x[], T work[], int len, |
||||
|
void(*unmqr) (const char*, const char*, const int*, const int*, const int*, |
||||
|
const T*, const int*, const T*, T*, const int*, T*, const int*, int* info), |
||||
|
void(*trsm) (const CBLAS_ORDER, const CBLAS_SIDE, const CBLAS_UPLO, const CBLAS_TRANSPOSE, const CBLAS_DIAG, |
||||
|
const int, const int, const void*, const void*, const int, void*, const int ldb)) |
||||
|
{ |
||||
|
T* clone_b = new T[m*bn]; |
||||
|
std::memcpy(clone_b, b, m*bn*sizeof(T)); |
||||
|
|
||||
|
char side = 'L'; |
||||
|
char tran = 'C'; |
||||
|
int info = 0; |
||||
|
unmqr(&side, &tran, &m, &bn, &n, r, &m, tau, clone_b, &m, work, &len, &info); |
||||
|
|
||||
|
T one = { 1.0f, 0.0f }; |
||||
|
trsm(CblasColMajor, CblasLeft, CblasUpper, CblasNoTrans, CblasNonUnit, n, bn, &one, r, m, clone_b, m); |
||||
|
copyBtoX(n, n, bn, clone_b, x); |
||||
|
|
||||
|
delete[] clone_b; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
template<typename T> |
||||
|
inline int svd_factor(bool compute_vectors, int m, int n, T a[], T s[], T u[], T v[], T work[], int len, |
||||
|
void(*gesvd) (const char*, const char*, const int*, const int*, T*, const int*, |
||||
|
T*, T*, const int*, T*, const int*, T*, const int*, int*)) |
||||
|
{ |
||||
|
int info = 0; |
||||
|
char job = compute_vectors ? 'A' : 'N'; |
||||
|
gesvd(&job, &job, &m, &n, a, &m, s, u, &m, v, &n, work, &len, &info); |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
template<typename T, typename R> |
||||
|
inline int complex_svd_factor(bool compute_vectors, int m, int n, T a[], T s[], T u[], T v[], T work[], int len, |
||||
|
void(*gesvd) (const char*, const char*, const int*, const int*, T*, const int*, |
||||
|
R*, T*, const int*, T*, const int*, T*, const int*, R*, int*)) |
||||
|
{ |
||||
|
int info = 0; |
||||
|
int dim_s = std::min(m, n); |
||||
|
R* rwork = new R[5 * dim_s]; |
||||
|
R* s_local = new R[dim_s]; |
||||
|
char job = compute_vectors ? 'A' : 'N'; |
||||
|
gesvd(&job, &job, &m, &n, a, &m, s_local, u, &m, v, &n, work, &len, rwork, &info); |
||||
|
|
||||
|
for (int index = 0; index < dim_s; ++index){ |
||||
|
T value = { s_local[index], 0.0f }; |
||||
|
s[index] = value; |
||||
|
} |
||||
|
|
||||
|
delete[] rwork; |
||||
|
delete[] s_local; |
||||
|
return info; |
||||
|
} |
||||
|
|
||||
|
extern "C" { |
||||
|
DLLEXPORT int s_lu_factor(int m, float a[], int ipiv[]) { |
||||
|
return lu_factor<float, float>(m, a, ipiv, cusolverDnSgetrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_lu_factor(int m, double a[], int ipiv[]) { |
||||
|
return lu_factor<double, double>(m, a, ipiv, cusolverDnDgetrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_lu_factor(int m, cuComplex a[], int ipiv[]) { |
||||
|
return lu_factor<cuComplex, void>(m, a, ipiv, cusolverDnCgetrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_lu_factor(int m, cuDoubleComplex a[], int ipiv[]) { |
||||
|
return lu_factor(m, a, ipiv, cusolverDnZgetrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_lu_inverse(int n, float a[]) |
||||
|
{ |
||||
|
return lu_inverse<float, float>(n, a, cusolverDnSgetrf, cusolverDnSgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_lu_inverse(int n, double a[]) |
||||
|
{ |
||||
|
return lu_inverse<double, double>(n, a, cusolverDnDgetrf, cusolverDnDgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_lu_inverse(int n, cuComplex a[]) |
||||
|
{ |
||||
|
return lu_inverse<cuComplex, void>(n, a, cusolverDnCgetrf, cusolverDnCgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_lu_inverse(int n, cuDoubleComplex a[]) |
||||
|
{ |
||||
|
return lu_inverse<cuDoubleComplex, void>(n, a, cusolverDnZgetrf, cusolverDnZgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_lu_inverse_factored(int n, float a[], int ipiv[], float work[], int lwork) |
||||
|
{ |
||||
|
return lu_inverse_factored<float, float>(n, a, ipiv, cusolverDnSgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_lu_inverse_factored(int n, double a[], int ipiv[], double work[], int lwork) |
||||
|
{ |
||||
|
return lu_inverse_factored<double, double>(n, a, ipiv, cusolverDnDgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_lu_inverse_factored(int n, cuComplex a[], int ipiv[], cuComplex work[], int lwork) |
||||
|
{ |
||||
|
return lu_inverse_factored<cuComplex, void>(n, a, ipiv, cusolverDnCgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_lu_inverse_factored(int n, cuDoubleComplex a[], int ipiv[], cuDoubleComplex work[], int lwork) |
||||
|
{ |
||||
|
return lu_inverse_factored<cuDoubleComplex, void>(n, a, ipiv, cusolverDnZgetri); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_lu_solve_factored(int n, int nrhs, float a[], int ipiv[], float b[]) |
||||
|
{ |
||||
|
return lu_solve_factored<float, float>(n, nrhs, a, ipiv, b, cusolverDnSgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_lu_solve_factored(int n, int nrhs, double a[], int ipiv[], double b[]) |
||||
|
{ |
||||
|
return lu_solve_factored<double, double>(n, nrhs, a, ipiv, b, cusolverDnDgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_lu_solve_factored(int n, int nrhs, cuComplex a[], int ipiv[], cuComplex b[]) |
||||
|
{ |
||||
|
return lu_solve_factored<cuComplex, void>(n, nrhs, a, ipiv, b, cusolverDnCgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_lu_solve_factored(int n, int nrhs, cuDoubleComplex a[], int ipiv[], cuDoubleComplex b[]) |
||||
|
{ |
||||
|
return lu_solve_factored<cuDoubleComplex, void>(n, nrhs, a, ipiv, b, cusolverDnZgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_lu_solve(int n, int nrhs, float a[], float b[]) |
||||
|
{ |
||||
|
return lu_solve<float, float>(n, nrhs, a, b, cusolverDnSgetrf, cusolverDnSgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_lu_solve(int n, int nrhs, double a[], double b[]) |
||||
|
{ |
||||
|
return lu_solve<double, double>(n, nrhs, a, b, cusolverDnDgetrf, cusolverDnDgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_lu_solve(int n, int nrhs, cuComplex a[], cuComplex b[]) |
||||
|
{ |
||||
|
return lu_solve<cuComplex, void>(n, nrhs, a, b, cusolverDnCgetrf, cusolverDnCgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_lu_solve(int n, int nrhs, cuDoubleComplex a[], cuDoubleComplex b[]) |
||||
|
{ |
||||
|
return lu_solve<cuDoubleComplex, void>(n, nrhs, a, b, cusolverDnZgetrf, cusolverDnZgetrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_cholesky_factor(int n, float a[]){ |
||||
|
return cholesky_factor<float, float>(n, a, cusolverDnSpotrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_cholesky_factor(int n, double* a){ |
||||
|
return cholesky_factor<double, double>(n, a, cusolverDnDpotrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_cholesky_factor(int n, cuComplex a[]){ |
||||
|
return cholesky_factor<cuComplex, void>(n, a, cusolverDnCpotrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_cholesky_factor(int n, cuDoubleComplex a[]){ |
||||
|
return cholesky_factor<cuDoubleComplex, void>(n, a, cusolverDnZpotrf); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_cholesky_solve(int n, int nrhs, float a[], float b[]) |
||||
|
{ |
||||
|
return cholesky_solve<float, float>(n, nrhs, a, b, cusolverDnSpotrf, cusolverDnSpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_cholesky_solve(int n, int nrhs, double a[], double b[]) |
||||
|
{ |
||||
|
return cholesky_solve<double, double>(n, nrhs, a, b, cusolverDnDpotrf, cusolverDnDpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_cholesky_solve(int n, int nrhs, cuComplex a[], cuComplex b[]) |
||||
|
{ |
||||
|
return cholesky_solve<cuComplex, void>(n, nrhs, a, b, cusolverDnCpotrf, cusolverDnCpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_cholesky_solve(int n, int nrhs, cuDoubleComplex a[], cuDoubleComplex b[]) |
||||
|
{ |
||||
|
return cholesky_solve<cuDoubleComplex, void>(n, nrhs, a, b, cusolverDnZpotrf, cusolverDnZpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_cholesky_solve_factored(int n, int nrhs, float a[], float b[]) |
||||
|
{ |
||||
|
return cholesky_solve_factored<float, float>(n, nrhs, a, b, cusolverDnSpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_cholesky_solve_factored(int n, int nrhs, double a[], double b[]) |
||||
|
{ |
||||
|
return cholesky_solve_factored<double, double>(n, nrhs, a, b, cusolverDnDpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_cholesky_solve_factored(int n, int nrhs, cuComplex a[], cuComplex b[]) |
||||
|
{ |
||||
|
return cholesky_solve_factored<cuComplex, void>(n, nrhs, a, b, cusolverDnCpotrs); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_cholesky_solve_factored(int n, int nrhs, cuDoubleComplex a[], cuDoubleComplex b[]) |
||||
|
{ |
||||
|
return cholesky_solve_factored<cuDoubleComplex, void>(n, nrhs, a, b, cusolverDnZpotrs); |
||||
|
} |
||||
|
|
||||
|
/*DLLEXPORT int s_qr_factor(int m, int n, float r[], float tau[], float q[], float work[], int len)
|
||||
|
{ |
||||
|
return qr_factor<float, float>(m, n, r, tau, q, work, len, cusolverDnSgeqrf, cusolverDnSorgqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_qr_thin_factor(int m, int n, float q[], float tau[], float r[], float work[], int len) |
||||
|
{ |
||||
|
return qr_thin_factor<float>(m, n, q, tau, r, work, len, cusolverDnSgeqrf, cusolverDnSorgqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_qr_factor(int m, int n, double r[], double tau[], double q[], double work[], int len) |
||||
|
{ |
||||
|
return qr_factor<double>(m, n, r, tau, q, work, len, cusolverDnDgeqrf, cusolverDnDorgqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_qr_thin_factor(int m, int n, double q[], double tau[], double r[], double work[], int len) |
||||
|
{ |
||||
|
return qr_thin_factor<double>(m, n, q, tau, r, work, len, cusolverDnDgeqrf, cusolverDnDorgqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_qr_factor(int m, int n, cuComplex r[], cuComplex tau[], cuComplex q[], cuComplex work[], int len) |
||||
|
{ |
||||
|
return qr_factor<cuComplex>(m, n, r, tau, q, work, len, cusolverDnCgeqrf, cusolverDnCungqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_qr_thin_factor(int m, int n, cuComplex q[], cuComplex tau[], cuComplex r[], cuComplex work[], int len) |
||||
|
{ |
||||
|
return qr_thin_factor<cuComplex>(m, n, q, tau, r, work, len, cusolverDnCgeqrf, cusolverDnCungqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_qr_factor(int m, int n, cuDoubleComplex r[], cuDoubleComplex tau[], cuDoubleComplex q[]) |
||||
|
{ |
||||
|
return qr_factor<cuDoubleComplex>(m, n, r, tau, q, work, len, cusolverDnZgeqrf, cusolverDnZungqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_qr_thin_factor(int m, int n, cuDoubleComplex q[], cuDoubleComplex tau[], cuDoubleComplex r[]) |
||||
|
{ |
||||
|
return qr_thin_factor<cuDoubleComplex>(m, n, q, tau, r, work, len, cusolverDnZgeqrf, cusolverDnZungqr); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_qr_solve(int m, int n, int bn, float a[], float b[], float x[], float work[], int len) |
||||
|
{ |
||||
|
return qr_solve<float>(m, n, bn, a, b, x, work, len, sgels); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_qr_solve(int m, int n, int bn, double a[], double b[], double x[], double work[], int len) |
||||
|
{ |
||||
|
return qr_solve<double>(m, n, bn, a, b, x, work, len, dgels); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_qr_solve(int m, int n, int bn, cuComplex a[], cuComplex b[], cuComplex x[], cuComplex work[], int len) |
||||
|
{ |
||||
|
return qr_solve<cuComplex>(m, n, bn, a, b, x, work, len, cgels); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_qr_solve(int m, int n, int bn, cuDoubleComplex a[], cuDoubleComplex b[], cuDoubleComplex x[], cuDoubleComplex work[], int len) |
||||
|
{ |
||||
|
return qr_solve<cuDoubleComplex>(m, n, bn, a, b, x, work, len, zgels); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_qr_solve_factored(int m, int n, int bn, float r[], float b[], float tau[], float x[], float work[], int len) |
||||
|
{ |
||||
|
return qr_solve_factored<float>(m, n, bn, r, b, tau, x, work, len, sormqr, cblas_strsm); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_qr_solve_factored(int m, int n, int bn, double r[], double b[], double tau[], double x[], double work[], int len) |
||||
|
{ |
||||
|
return qr_solve_factored<double>(m, n, bn, r, b, tau, x, work, len, dormqr, cblas_dtrsm); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_qr_solve_factored(int m, int n, int bn, cuComplex r[], cuComplex b[], cuComplex tau[], cuComplex x[], cuComplex work[], int len) |
||||
|
{ |
||||
|
return complex_qr_solve_factored<cuComplex>(m, n, bn, r, b, tau, x, work, len, cunmqr, cblas_ctrsm); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_qr_solve_factored(int m, int n, int bn, cuDoubleComplex r[], cuDoubleComplex b[], cuDoubleComplex tau[], cuDoubleComplex x[], cuDoubleComplex work[], int len) |
||||
|
{ |
||||
|
return complex_qr_solve_factored<cuDoubleComplex>(m, n, bn, r, b, tau, x, work, len, zunmqr, cblas_ztrsm); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int s_svd_factor(bool compute_vectors, int m, int n, float a[], float s[], float u[], float v[], float work[], int len) |
||||
|
{ |
||||
|
return svd_factor<float>(compute_vectors, m, n, a, s, u, v, work, len, sgesvd); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int d_svd_factor(bool compute_vectors, int m, int n, double a[], double s[], double u[], double v[], double work[], int len) |
||||
|
{ |
||||
|
return svd_factor<double>(compute_vectors, m, n, a, s, u, v, work, len, dgesvd); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int c_svd_factor(bool compute_vectors, int m, int n, cuComplex a[], cuComplex s[], cuComplex u[], cuComplex v[], cuComplex work[], int len) |
||||
|
{ |
||||
|
return complex_svd_factor<cuComplex, float>(compute_vectors, m, n, a, s, u, v, work, len, cgesvd); |
||||
|
} |
||||
|
|
||||
|
DLLEXPORT int z_svd_factor(bool compute_vectors, int m, int n, cuDoubleComplex a[], cuDoubleComplex s[], cuDoubleComplex u[], cuDoubleComplex v[], cuDoubleComplex work[], int len) |
||||
|
{ |
||||
|
return complex_svd_factor<cuDoubleComplex, double>(compute_vectors, m, n, a, s, u, v, work, len, zgesvd); |
||||
|
}*/ |
||||
|
} |
||||
Loading…
Reference in new issue