|
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 | | - |
106 | 3 | void BlasConnector::axpy( const int n, const float alpha, const float *X, const int incX, float *Y, const int incY) |
107 | 4 | { |
108 | 5 | saxpy_(&n, &alpha, X, &incX, Y, &incY); |
|
0 commit comments