|
1 | 1 | #include "blas_connector.h" |
2 | 2 |
|
| 3 | +extern "C" |
| 4 | +{ |
| 5 | + // level 1: std::vector-std::vector operations, O(n) data and O(n) work. |
| 6 | + |
| 7 | + // Peize Lin add ?scal 2016-08-04, to compute x=a*x |
| 8 | + void sscal_(const int *N, const float *alpha, float *X, const int *incX); |
| 9 | + void dscal_(const int *N, const double *alpha, double *X, const int *incX); |
| 10 | + void cscal_(const int *N, const std::complex<float> *alpha, std::complex<float> *X, const int *incX); |
| 11 | + void zscal_(const int *N, const std::complex<double> *alpha, std::complex<double> *X, const int *incX); |
| 12 | + |
| 13 | + // Peize Lin add ?axpy 2016-08-04, to compute y=a*x+y |
| 14 | + void saxpy_(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY); |
| 15 | + void daxpy_(const int *N, const double *alpha, const double *X, const int *incX, double *Y, const int *incY); |
| 16 | + void caxpy_(const int *N, const std::complex<float> *alpha, const std::complex<float> *X, const int *incX, std::complex<float> *Y, const int *incY); |
| 17 | + void zaxpy_(const int *N, const std::complex<double> *alpha, const std::complex<double> *X, const int *incX, std::complex<double> *Y, const int *incY); |
| 18 | + |
| 19 | + void dcopy_(long const *n, const double *a, int const *incx, double *b, int const *incy); |
| 20 | + void zcopy_(long const *n, const std::complex<double> *a, int const *incx, std::complex<double> *b, int const *incy); |
| 21 | + |
| 22 | + //reason for passing results as argument instead of returning it: |
| 23 | + //see https://www.numbercrunch.de/blog/2014/07/lost-in-translation/ |
| 24 | + // void zdotc_(std::complex<double> *result, const int *n, const std::complex<double> *zx, |
| 25 | + // const int *incx, const std::complex<double> *zy, const int *incy); |
| 26 | + // Peize Lin add ?dot 2017-10-27, to compute d=x*y |
| 27 | + float sdot_(const int *N, const float *X, const int *incX, const float *Y, const int *incY); |
| 28 | + double ddot_(const int *N, const double *X, const int *incX, const double *Y, const int *incY); |
| 29 | + |
| 30 | + // Peize Lin add ?nrm2 2018-06-12, to compute out = ||x||_2 = \sqrt{ \sum_i x_i**2 } |
| 31 | + float snrm2_( const int *n, const float *X, const int *incX ); |
| 32 | + double dnrm2_( const int *n, const double *X, const int *incX ); |
| 33 | + double dznrm2_( const int *n, const std::complex<double> *X, const int *incX ); |
| 34 | + |
| 35 | + // level 2: matrix-std::vector operations, O(n^2) data and O(n^2) work. |
| 36 | + void dgemv_(const char*const transa, const int*const m, const int*const n, |
| 37 | + const double*const alpha, const double*const a, const int*const lda, const double*const x, const int*const incx, |
| 38 | + const double*const beta, double*const y, const int*const incy); |
| 39 | + |
| 40 | + void cgemv_(const char *trans, const int *m, const int *n, const std::complex<float> *alpha, |
| 41 | + const std::complex<float> *a, const int *lda, const std::complex<float> *x, const int *incx, |
| 42 | + const std::complex<float> *beta, std::complex<float> *y, const int *incy); |
| 43 | + |
| 44 | + void zgemv_(const char *trans, const int *m, const int *n, const std::complex<double> *alpha, |
| 45 | + const std::complex<double> *a, const int *lda, const std::complex<double> *x, const int *incx, |
| 46 | + const std::complex<double> *beta, std::complex<double> *y, const int *incy); |
| 47 | + |
| 48 | + void dsymv_(const char *uplo, const int *n, |
| 49 | + const double *alpha, const double *a, const int *lda, |
| 50 | + const double *x, const int *incx, |
| 51 | + const double *beta, double *y, const int *incy); |
| 52 | + |
| 53 | + // A := alpha x * y.T + A |
| 54 | + void dger_(const int* m, |
| 55 | + const int* n, |
| 56 | + const double* alpha, |
| 57 | + const double* x, |
| 58 | + const int* incx, |
| 59 | + const double* y, |
| 60 | + const int* incy, |
| 61 | + double* a, |
| 62 | + const int* lda); |
| 63 | + void zgerc_(const int* m, |
| 64 | + const int* n, |
| 65 | + const std::complex<double>* alpha, |
| 66 | + const std::complex<double>* x, |
| 67 | + const int* incx, |
| 68 | + const std::complex<double>* y, |
| 69 | + const int* incy, |
| 70 | + std::complex<double>* a, |
| 71 | + const int* lda); |
| 72 | + |
| 73 | + // level 3: matrix-matrix operations, O(n^2) data and O(n^3) work. |
| 74 | + |
| 75 | + // Peize Lin add ?gemm 2017-10-27, to compute C = a * A.? * B.? + b * C |
| 76 | + // A is general |
| 77 | + void sgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, |
| 78 | + const float *alpha, const float *a, const int *lda, const float *b, const int *ldb, |
| 79 | + const float *beta, float *c, const int *ldc); |
| 80 | + void dgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, |
| 81 | + const double *alpha, const double *a, const int *lda, const double *b, const int *ldb, |
| 82 | + const double *beta, double *c, const int *ldc); |
| 83 | + void cgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, |
| 84 | + const std::complex<float> *alpha, const std::complex<float> *a, const int *lda, const std::complex<float> *b, const int *ldb, |
| 85 | + const std::complex<float> *beta, std::complex<float> *c, const int *ldc); |
| 86 | + void zgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, |
| 87 | + const std::complex<double> *alpha, const std::complex<double> *a, const int *lda, const std::complex<double> *b, const int *ldb, |
| 88 | + const std::complex<double> *beta, std::complex<double> *c, const int *ldc); |
| 89 | + |
| 90 | + //a is symmetric |
| 91 | + void dsymm_(const char *side, const char *uplo, const int *m, const int *n, |
| 92 | + const double *alpha, const double *a, const int *lda, const double *b, const int *ldb, |
| 93 | + const double *beta, double *c, const int *ldc); |
| 94 | + //a is hermitian |
| 95 | + void zhemm_(char *side, char *uplo, int *m, int *n,std::complex<double> *alpha, |
| 96 | + std::complex<double> *a, int *lda, std::complex<double> *b, int *ldb, std::complex<double> *beta, std::complex<double> *c, int *ldc); |
| 97 | + |
| 98 | + //solving triangular matrix with multiple right hand sides |
| 99 | + void dtrsm_(char *side, char* uplo, char *transa, char *diag, int *m, int *n, |
| 100 | + double* alpha, double* a, int *lda, double*b, int *ldb); |
| 101 | + void ztrsm_(char *side, char* uplo, char *transa, char *diag, int *m, int *n, |
| 102 | + std::complex<double>* alpha, std::complex<double>* a, int *lda, std::complex<double>*b, int *ldb); |
| 103 | + |
| 104 | +} |
| 105 | + |
3 | 106 | void BlasConnector::axpy( const int n, const float alpha, const float *X, const int incX, float *Y, const int incY) |
4 | 107 | { |
5 | 108 | saxpy_(&n, &alpha, X, &incX, Y, &incY); |
|
0 commit comments