ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
blas_connector.h
Go to the documentation of this file.
1#ifndef BLAS_CONNECTOR_H
2#define BLAS_CONNECTOR_H
3
4#include <complex>
6#include "../macros.h"
7
8// These still need to be linked in the header file
9// Because quite a lot of code will directly use the original cblas kernels.
10
11// The following declarations cover only a subset of BLAS routines.
12// If you need a BLAS function that is not included here, feel free to add its declaration as needed.
13extern "C"
14{
15// Level 1 BLAS
16void sscal_(const int *N, const float *alpha, float *X, const int *incX);
17void dscal_(const int *N, const double *alpha, double *X, const int *incX);
18void cscal_(const int *N, const std::complex<float> *alpha, std::complex<float> *X, const int *incX);
19void zscal_(const int *N, const std::complex<double> *alpha, std::complex<double> *X, const int *incX);
20
21void saxpy_(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY);
22void daxpy_(const int *N, const double *alpha, const double *X, const int *incX, double *Y, const int *incY);
23void caxpy_(const int *N, const std::complex<float> *alpha, const std::complex<float> *X, const int *incX, std::complex<float> *Y, const int *incY);
24void zaxpy_(const int *N, const std::complex<double> *alpha, const std::complex<double> *X, const int *incX, std::complex<double> *Y, const int *incY);
25
26void scopy_(const int *n, const float *a, const int *incx, float *b, const int *incy);
27void dcopy_(const int *n, const double *a, const int *incx, double *b, const int *incy);
28void ccopy_(const int *n, const std::complex<float> *a, const int *incx, std::complex<float> *b, const int *incy);
29void zcopy_(const int *n, const std::complex<double> *a, const int *incx, std::complex<double> *b, const int *incy);
30
31// Note: sdot_/ddot_ return by value
32float sdot_(const int *N, const float *X, const int *incX, const float *Y, const int *incY);
33double ddot_(const int *N, const double *X, const int *incX, const double *Y, const int *incY);
34
35float snrm2_(const int *n, const float *X, const int *incX);
36double dnrm2_(const int *n, const double *X, const int *incX);
37float scnrm2_(const int *n, const std::complex<float> *X, const int *incX);
38double dznrm2_(const int *n, const std::complex<double> *X, const int *incX);
39
40// Level 2 BLAS
41
42void sgemv_(const char *transa, const int *m, const int *n,
43 const float *alpha, const float *a, const int *lda,
44 const float *x, const int *incx,
45 const float *beta, float *y, const int *incy);
46
47void dgemv_(const char *transa, const int *m, const int *n,
48 const double *alpha, const double *a, const int *lda,
49 const double *x, const int *incx,
50 const double *beta, double *y, const int *incy);
51
52void cgemv_(const char *trans, const int *m, const int *n,
53 const std::complex<float> *alpha,
54 const std::complex<float> *a, const int *lda,
55 const std::complex<float> *x, const int *incx,
56 const std::complex<float> *beta,
57 std::complex<float> *y, const int *incy);
58
59void zgemv_(const char *trans, const int *m, const int *n,
60 const std::complex<double> *alpha,
61 const std::complex<double> *a, const int *lda,
62 const std::complex<double> *x, const int *incx,
63 const std::complex<double> *beta,
64 std::complex<double> *y, const int *incy);
65
66void dsymv_(const char *uplo, const int *n,
67 const double *alpha, const double *a, const int *lda,
68 const double *x, const int *incx,
69 const double *beta, double *y, const int *incy);
70
71void dger_(const int *m, const int *n,
72 const double *alpha,
73 const double *x, const int *incx,
74 const double *y, const int *incy,
75 double *a, const int *lda);
76
77void zgerc_(const int *m, const int *n,
78 const std::complex<double> *alpha,
79 const std::complex<double> *x, const int *incx,
80 const std::complex<double> *y, const int *incy,
81 std::complex<double> *a, const int *lda);
82
83// Level 3 BLAS
84
85void sgemm_(const char *transa, const char *transb,
86 const int *m, const int *n, const int *k,
87 const float *alpha,
88 const float *a, const int *lda,
89 const float *b, const int *ldb,
90 const float *beta,
91 float *c, const int *ldc);
92
93void dgemm_(const char *transa, const char *transb,
94 const int *m, const int *n, const int *k,
95 const double *alpha,
96 const double *a, const int *lda,
97 const double *b, const int *ldb,
98 const double *beta,
99 double *c, const int *ldc);
100
101void cgemm_(const char *transa, const char *transb,
102 const int *m, const int *n, const int *k,
103 const std::complex<float> *alpha,
104 const std::complex<float> *a, const int *lda,
105 const std::complex<float> *b, const int *ldb,
106 const std::complex<float> *beta,
107 std::complex<float> *c, const int *ldc);
108
109void zgemm_(const char *transa, const char *transb,
110 const int *m, const int *n, const int *k,
111 const std::complex<double> *alpha,
112 const std::complex<double> *a, const int *lda,
113 const std::complex<double> *b, const int *ldb,
114 const std::complex<double> *beta,
115 std::complex<double> *c, const int *ldc);
116
117void ssymm_(const char *side, const char *uplo,
118 const int *m, const int *n,
119 const float *alpha,
120 const float *a, const int *lda,
121 const float *b, const int *ldb,
122 const float *beta,
123 float *c, const int *ldc);
124
125void dsymm_(const char *side, const char *uplo,
126 const int *m, const int *n,
127 const double *alpha,
128 const double *a, const int *lda,
129 const double *b, const int *ldb,
130 const double *beta,
131 double *c, const int *ldc);
132
133void csymm_(const char *side, const char *uplo,
134 const int *m, const int *n,
135 const std::complex<float> *alpha,
136 const std::complex<float> *a, const int *lda,
137 const std::complex<float> *b, const int *ldb,
138 const std::complex<float> *beta,
139 std::complex<float> *c, const int *ldc);
140
141void zsymm_(const char *side, const char *uplo,
142 const int *m, const int *n,
143 const std::complex<double> *alpha,
144 const std::complex<double> *a, const int *lda,
145 const std::complex<double> *b, const int *ldb,
146 const std::complex<double> *beta,
147 std::complex<double> *c, const int *ldc);
148
149void chemm_(const char *side, const char *uplo,
150 const int *m, const int *n,
151 const std::complex<float> *alpha,
152 const std::complex<float> *a, const int *lda,
153 const std::complex<float> *b, const int *ldb,
154 const std::complex<float> *beta,
155 std::complex<float> *c, const int *ldc);
156
157void zhemm_(const char *side, const char *uplo,
158 const int *m, const int *n,
159 const std::complex<double> *alpha,
160 const std::complex<double> *a, const int *lda,
161 const std::complex<double> *b, const int *ldb,
162 const std::complex<double> *beta,
163 std::complex<double> *c, const int *ldc);
164
165void dtrsm_(const char *side, const char *uplo, const char *transa, const char *diag,
166 const int *m, const int *n,
167 const double *alpha,
168 const double *a, const int *lda,
169 double *b, const int *ldb);
170
171void ztrsm_(const char *side, const char *uplo, const char *transa, const char *diag,
172 const int *m, const int *n,
173 const std::complex<double> *alpha,
174 const std::complex<double> *a, const int *lda,
175 std::complex<double> *b, const int *ldb);
176
177// === Hermitian rank-k update ===
178void cherk_(const char* uplo, const char* trans, const int* n, const int* k,
179 const float* alpha,
180 const std::complex<float>* a, const int* lda,
181 const float* beta,
182 std::complex<float>* c, const int* ldc);
183
184void zherk_(const char* uplo, const char* trans, const int* n, const int* k,
185 const double* alpha,
186 const std::complex<double>* a, const int* lda,
187 const double* beta,
188 std::complex<double>* c, const int* ldc);
189
190// === Symmetric rank-k update ===
191void dsyrk_(const char* uplo, const char* trans, const int* n, const int* k,
192 const double* alpha,
193 const double* a, const int* lda,
194 const double* beta,
195 double* c,
196 const int* ldc);
197}
198
199// Class BlasConnector provide the connector to fortran lapack routine.
200// The entire function in this class are static and inline function.
201// Usage example: BlasConnector::functionname(parameter list).
203{
204public:
205
206 // Peize Lin add 2016-08-04
207 // y=a*x+y
208 static
209 void axpy( const int n, const float alpha, const float *X, const int incX, float *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
210
211 static
212 void axpy( const int n, const double alpha, const double *X, const int incX, double *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
213
214 static
215 void axpy( const int n, const std::complex<float> alpha, const std::complex<float> *X, const int incX, std::complex<float> *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
216
217 static
218 void axpy( const int n, const std::complex<double> alpha, const std::complex<double> *X, const int incX, std::complex<double> *Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
219
220
221 // Peize Lin add 2016-08-04
222 // x=a*x
223 static
224 void scal( const int n, const float alpha, float *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
225
226 static
227 void scal( const int n, const double alpha, double *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
228
229 static
230 void scal( const int n, const std::complex<float> alpha, std::complex<float> *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
231
232 static
233 void scal( const int n, const std::complex<double> alpha, std::complex<double> *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
234
235
236 // Peize Lin add 2017-10-27
237 // d=x*y
238 static
239 float dot( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
240
241 static
242 double dot( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
243
244 // d=x*y
245 static
246 float dotu( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
247
248 static
249 double dotu( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
250
251 static
252 std::complex<float> dotu( const int n, const std::complex<float>*const X, const int incX, const std::complex<float>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
253
254 static
255 std::complex<double> dotu( const int n, const std::complex<double>*const X, const int incX, const std::complex<double>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
256
257 // d=x.conj()*y
258 static
259 float dotc( const int n, const float*const X, const int incX, const float*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
260
261 static
262 double dotc( const int n, const double*const X, const int incX, const double*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
263
264 static
265 std::complex<float> dotc( const int n, const std::complex<float>*const X, const int incX, const std::complex<float>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
266
267 static
268 std::complex<double> dotc( const int n, const std::complex<double>*const X, const int incX, const std::complex<double>*const Y, const int incY, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
269
270 // Peize Lin add 2017-10-27, fix bug trans 2019-01-17
271 // C = a * A.? * B.? + b * C
272 // Row Major by default
273 static
274 void gemm(const char transa, const char transb, const int m, const int n, const int k,
275 const float alpha, const float *a, const int lda, const float *b, const int ldb,
276 const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
277
278 static
279 void gemm(const char transa, const char transb, const int m, const int n, const int k,
280 const double alpha, const double *a, const int lda, const double *b, const int ldb,
281 const double beta, double *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
282
283 static
284 void gemm(const char transa, const char transb, const int m, const int n, const int k,
285 const std::complex<float> alpha, const std::complex<float> *a, const int lda, const std::complex<float> *b, const int ldb,
286 const std::complex<float> beta, std::complex<float> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
287
288 static
289 void gemm(const char transa, const char transb, const int m, const int n, const int k,
290 const std::complex<double> alpha, const std::complex<double> *a, const int lda, const std::complex<double> *b, const int ldb,
291 const std::complex<double> beta, std::complex<double> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
292
293 // Col-Major if you need to use it
294
295 static
296 void gemm_cm(const char transa, const char transb, const int m, const int n, const int k,
297 const float alpha, const float *a, const int lda, const float *b, const int ldb,
298 const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
299
300 static
301 void gemm_cm(const char transa, const char transb, const int m, const int n, const int k,
302 const double alpha, const double *a, const int lda, const double *b, const int ldb,
303 const double beta, double *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
304
305 static
306 void gemm_cm(const char transa, const char transb, const int m, const int n, const int k,
307 const std::complex<float> alpha, const std::complex<float> *a, const int lda, const std::complex<float> *b, const int ldb,
308 const std::complex<float> beta, std::complex<float> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
309
310 static
311 void gemm_cm(const char transa, const char transb, const int m, const int n, const int k,
312 const std::complex<double> alpha, const std::complex<double> *a, const int lda, const std::complex<double> *b, const int ldb,
313 const std::complex<double> beta, std::complex<double> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
314
315 // side=='L': C = a * A * B + b * C.
316 // side=='R': C = a * B * A + b * C.
317 // A == A^T
318 // Because you cannot pack symm or hemm into a row-major kernel by exchanging parameters, so only col-major functions are provided.
319 static
320 void symm_cm(const char side, const char uplo, const int m, const int n,
321 const float alpha, const float *a, const int lda, const float *b, const int ldb,
322 const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
323
324 static
325 void symm_cm(const char side, const char uplo, const int m, const int n,
326 const double alpha, const double *a, const int lda, const double *b, const int ldb,
327 const double beta, double *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
328
329 static
330 void symm_cm(const char side, const char uplo, const int m, const int n,
331 const std::complex<float> alpha, const std::complex<float> *a, const int lda, const std::complex<float> *b, const int ldb,
332 const std::complex<float> beta, std::complex<float> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
333
334 static
335 void symm_cm(const char side, const char uplo, const int m, const int n,
336 const std::complex<double> alpha, const std::complex<double> *a, const int lda, const std::complex<double> *b, const int ldb,
337 const std::complex<double> beta, std::complex<double> *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
338
339 // side=='L': C = a * A * B + b * C.
340 // side=='R': C = a * B * A + b * C.
341 // A == A^H
342 static
343 void hemm_cm(const char side, const char uplo, const int m, const int n,
344 const float alpha, const float *a, const int lda, const float *b, const int ldb,
345 const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
346
347 static
348 void hemm_cm(const char side, const char uplo, const int m, const int n,
349 const double alpha, const double *a, const int lda, const double *b, const int ldb,
350 const double beta, double *c, const int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
351
352 static
353 void hemm_cm(char side, char uplo, int m, int n,
354 std::complex<float> alpha, std::complex<float> *a, int lda, std::complex<float> *b, int ldb,
355 std::complex<float> beta, std::complex<float> *c, int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
356
357 static
358 void hemm_cm(char side, char uplo, int m, int n,
359 std::complex<double> alpha, std::complex<double> *a, int lda, std::complex<double> *b, int ldb,
360 std::complex<double> beta, std::complex<double> *c, int ldc, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
361
362 // y = A*x + beta*y
363 static
364 void gemv(const char trans, const int m, const int n,
365 const float alpha, const float* A, const int lda, const float* X, const int incx,
366 const float beta, float* Y, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
367
368 static
369 void gemv(const char trans, const int m, const int n,
370 const double alpha, const double* A, const int lda, const double* X, const int incx,
371 const double beta, double* Y, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
372
373 static
374 void gemv(const char trans, const int m, const int n,
375 const std::complex<float> alpha, const std::complex<float> *A, const int lda, const std::complex<float> *X, const int incx,
376 const std::complex<float> beta, std::complex<float> *Y, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
377
378 static
379 void gemv(const char trans, const int m, const int n,
380 const std::complex<double> alpha, const std::complex<double> *A, const int lda, const std::complex<double> *X, const int incx,
381 const std::complex<double> beta, std::complex<double> *Y, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
382
383 // Peize Lin add 2018-06-12
384 // out = ||x||_2
385 static
386 float nrm2( const int n, const float *X, const int, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice );
387
388 static
389 double nrm2( const int n, const double *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice );
390
391 static
392 double nrm2( const int n, const std::complex<double> *X, const int incX, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice );
393
394
395 // copies a into b
396 static
397 void copy(const int n, const double *a, const int incx, double *b, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
398
399 static
400 void copy(const int n, const float *a, const int incx, float *b, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
401
402 static
403 void copy(const int n, const std::complex<float> *a, const int incx, std::complex<float> *b, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
404
405 static
406 void copy(const int n, const std::complex<double> *a, const int incx, std::complex<double> *b, const int incy, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
407
408 // There is some other operators needed, so implemented manually here
409 template <typename T>
410 static
411 void vector_mul_vector(const int& dim, T* result, const T* vector1, const T* vector2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
412
413 template <typename T>
414 static
415 void vector_div_vector(const int& dim, T* result, const T* vector1, const T* vector2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
416
417 // y = alpha * x + beta * y
418 static
419 void vector_add_vector(const int& dim, float *result, const float *vector1, const float constant1, const float *vector2, const float constant2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
420
421 static
422 void vector_add_vector(const int& dim, double *result, const double *vector1, const double constant1, const double *vector2, const double constant2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
423
424 static
425 void vector_add_vector(const int& dim, std::complex<float> *result, const std::complex<float> *vector1, const float constant1, const std::complex<float> *vector2, const float constant2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
426
427 static
428 void vector_add_vector(const int& dim, std::complex<double> *result, const std::complex<double> *vector1, const double constant1, const std::complex<double> *vector2, const double constant2, base_device::AbacusDevice_t device_type = base_device::AbacusDevice_t::CpuDevice);
429};
430
431#ifdef __CUDA
432
433#include <cuda_runtime.h>
434#include "cublas_v2.h"
435
436// If you want to use cublas, you need these functions to create and destroy the cublas/hipblas handle.
437// You also need to use these functions to translate the transpose parameter into cublas/hipblas datatype.
438
439namespace BlasUtils{
440
441 static cublasHandle_t cublas_handle = nullptr;
442
443 void createGpuBlasHandle(); // Create a cublas/hipblas handle.
444
445 void destoryBLAShandle(); // Destroy the cublas/hipblas handle. Do this when the software is about to end.
446
447 cublasOperation_t judge_trans(bool is_complex, const char& trans, const char* name); // Translate a normal transpose parameter to a cublas/hipblas type.
448
449 cublasSideMode_t judge_side(const char& trans); // Translate a normal side parameter to a cublas/hipblas type.
450
451 cublasFillMode_t judge_fill(const char& trans); // Translate a normal fill parameter to a cublas/hipblas type.
452
453}
454
455#endif
456
457// If GATHER_INFO is defined, the original function is replaced with a "i" suffix,
458// preventing changes on the original code.
459// The real function call is at gather_math_lib_info.cpp
460#ifdef GATHER_INFO
461
462#define zgemm_ zgemm_i
463void zgemm_i(const char *transa,
464 const char *transb,
465 const int *m,
466 const int *n,
467 const int *k,
468 const std::complex<double> *alpha,
469 const std::complex<double> *a,
470 const int *lda,
471 const std::complex<double> *b,
472 const int *ldb,
473 const std::complex<double> *beta,
474 std::complex<double> *c,
475 const int *ldc);
476
477#define zaxpy_ zaxpy_i
478void zaxpy_i(const int *N,
479 const std::complex<double> *alpha,
480 const std::complex<double> *X,
481 const int *incX,
482 std::complex<double> *Y,
483 const int *incY);
484
485/*
486#define zgemv_ zgemv_i
487
488void zgemv_i(const char *trans,
489 const int *m,
490 const int *n,
491 const std::complex<double> *alpha,
492 const std::complex<double> *a,
493 const int *lda,
494 const std::complex<double> *x,
495 const int *incx,
496 const std::complex<double> *beta,
497 std::complex<double> *y,
498 const int *incy);
499*/
500
501#endif // GATHER_INFO
502#endif // BLAS_CONNECTOR_H
double ddot_(const int *N, const double *X, const int *incX, const double *Y, const int *incY)
void ccopy_(const int *n, const std::complex< float > *a, const int *incx, std::complex< float > *b, const int *incy)
void dscal_(const int *N, const double *alpha, double *X, const int *incX)
void dtrsm_(const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const double *alpha, const double *a, const int *lda, double *b, const int *ldb)
void cscal_(const int *N, const std::complex< float > *alpha, std::complex< float > *X, const int *incX)
void zgerc_(const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *x, const int *incx, const std::complex< double > *y, const int *incy, std::complex< double > *a, const int *lda)
void ztrsm_(const char *side, const char *uplo, const char *transa, const char *diag, const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, std::complex< double > *b, const int *ldb)
float scnrm2_(const int *n, const std::complex< float > *X, const int *incX)
void sgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const float *alpha, const float *a, const int *lda, const float *b, const int *ldb, const float *beta, float *c, const int *ldc)
void zhemm_(const char *side, const char *uplo, const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, const std::complex< double > *b, const int *ldb, const std::complex< double > *beta, std::complex< double > *c, const int *ldc)
void scopy_(const int *n, const float *a, const int *incx, float *b, const int *incy)
void sscal_(const int *N, const float *alpha, float *X, const int *incX)
void daxpy_(const int *N, const double *alpha, const double *X, const int *incX, double *Y, const int *incY)
void cherk_(const char *uplo, const char *trans, const int *n, const int *k, const float *alpha, const std::complex< float > *a, const int *lda, const float *beta, std::complex< float > *c, const int *ldc)
void dsymm_(const char *side, const char *uplo, const int *m, const int *n, const double *alpha, const double *a, const int *lda, const double *b, const int *ldb, const double *beta, double *c, const int *ldc)
void csymm_(const char *side, const char *uplo, const int *m, const int *n, const std::complex< float > *alpha, const std::complex< float > *a, const int *lda, const std::complex< float > *b, const int *ldb, const std::complex< float > *beta, std::complex< float > *c, const int *ldc)
void zgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, const std::complex< double > *b, const int *ldb, const std::complex< double > *beta, std::complex< double > *c, const int *ldc)
void dger_(const int *m, const int *n, const double *alpha, const double *x, const int *incx, const double *y, const int *incy, double *a, const int *lda)
void zscal_(const int *N, const std::complex< double > *alpha, std::complex< double > *X, const int *incX)
void zherk_(const char *uplo, const char *trans, const int *n, const int *k, const double *alpha, const std::complex< double > *a, const int *lda, const double *beta, std::complex< double > *c, const int *ldc)
void chemm_(const char *side, const char *uplo, const int *m, const int *n, const std::complex< float > *alpha, const std::complex< float > *a, const int *lda, const std::complex< float > *b, const int *ldb, const std::complex< float > *beta, std::complex< float > *c, const int *ldc)
void zsymm_(const char *side, const char *uplo, const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, const std::complex< double > *b, const int *ldb, const std::complex< double > *beta, std::complex< double > *c, const int *ldc)
void dsyrk_(const char *uplo, const char *trans, const int *n, const int *k, const double *alpha, const double *a, const int *lda, const double *beta, double *c, const int *ldc)
void dgemv_(const char *transa, const int *m, const int *n, const double *alpha, const double *a, const int *lda, const double *x, const int *incx, const double *beta, double *y, const int *incy)
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)
void cgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const std::complex< float > *alpha, const std::complex< float > *a, const int *lda, const std::complex< float > *b, const int *ldb, const std::complex< float > *beta, std::complex< float > *c, const int *ldc)
void sgemv_(const char *transa, const int *m, const int *n, const float *alpha, const float *a, const int *lda, const float *x, const int *incx, const float *beta, float *y, const int *incy)
float sdot_(const int *N, const float *X, const int *incX, const float *Y, const int *incY)
void dgemm_(const char *transa, const char *transb, const int *m, const int *n, const int *k, const double *alpha, const double *a, const int *lda, const double *b, const int *ldb, const double *beta, double *c, const int *ldc)
void dsymv_(const char *uplo, const int *n, const double *alpha, const double *a, const int *lda, const double *x, const int *incx, const double *beta, double *y, const int *incy)
double dznrm2_(const int *n, const std::complex< double > *X, const int *incX)
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)
void ssymm_(const char *side, const char *uplo, const int *m, const int *n, const float *alpha, const float *a, const int *lda, const float *b, const int *ldb, const float *beta, float *c, const int *ldc)
float snrm2_(const int *n, const float *X, const int *incX)
void cgemv_(const char *trans, const int *m, const int *n, const std::complex< float > *alpha, const std::complex< float > *a, const int *lda, const std::complex< float > *x, const int *incx, const std::complex< float > *beta, std::complex< float > *y, const int *incy)
void saxpy_(const int *N, const float *alpha, const float *X, const int *incX, float *Y, const int *incY)
double dnrm2_(const int *n, const double *X, const int *incX)
void zcopy_(const int *n, const std::complex< double > *a, const int *incx, std::complex< double > *b, const int *incy)
void dcopy_(const int *n, const double *a, const int *incx, double *b, const int *incy)
void zgemv_(const char *trans, const int *m, const int *n, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, const std::complex< double > *x, const int *incx, const std::complex< double > *beta, std::complex< double > *y, const int *incy)
Definition blas_connector.h:203
static void vector_add_vector(const int &dim, std::complex< double > *result, const std::complex< double > *vector1, const double constant1, const std::complex< double > *vector2, const double constant2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static void vector_div_vector(const int &dim, T *result, const T *vector1, const T *vector2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static void copy(const int n, const double *a, const int incx, double *b, const int incy, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:335
static void axpy(const int n, const float alpha, const float *X, const int incX, float *Y, const int incY, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:18
static void gemm_cm(const char transa, const char transb, const int m, const int n, const int k, const float alpha, const float *a, const int lda, const float *b, const int ldb, const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_matrix.cpp:190
static void gemv(const char trans, const int m, const int n, const float alpha, const float *A, const int lda, const float *X, const int incx, const float beta, float *Y, const int incy, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_matrix.cpp:501
static void vector_add_vector(const int &dim, double *result, const double *vector1, const double constant1, const double *vector2, const double constant2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static void vector_add_vector(const int &dim, std::complex< float > *result, const std::complex< float > *vector1, const float constant1, const std::complex< float > *vector2, const float constant2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static float nrm2(const int n, const float *X, const int, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:271
static float dotc(const int n, const float *const X, const int incX, const float *const Y, const int incY, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:224
static void gemm(const char transa, const char transb, const int m, const int n, const int k, const float alpha, const float *a, const int lda, const float *b, const int ldb, const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_matrix.cpp:20
static void symm_cm(const char side, const char uplo, const int m, const int n, const float alpha, const float *a, const int lda, const float *b, const int ldb, const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_matrix.cpp:361
static void hemm_cm(const char side, const char uplo, const int m, const int n, const float alpha, const float *a, const int lda, const float *b, const int ldb, const float beta, float *c, const int ldc, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_matrix.cpp:445
static void vector_add_vector(const int &dim, float *result, const float *vector1, const float constant1, const float *vector2, const float constant2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static void vector_mul_vector(const int &dim, T *result, const T *vector1, const T *vector2, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
static void scal(const int n, const float alpha, float *X, const int incX, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:80
static float dotu(const int n, const float *const X, const int incX, const float *const Y, const int incY, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:177
static float dot(const int n, const float *const X, const int incX, const float *const Y, const int incY, base_device::AbacusDevice_t device_type=base_device::AbacusDevice_t::CpuDevice)
Definition blas_connector_vector.cpp:142
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
void zgemm_i(const char *transa, const char *transb, const int *m, const int *n, const int *k, const std::complex< double > *alpha, const std::complex< double > *a, const int *lda, const std::complex< double > *b, const int *ldb, const std::complex< double > *beta, std::complex< double > *c, const int *ldc)
Definition gather_math_lib_info.cpp:16
void zaxpy_i(const int *N, const std::complex< double > *alpha, const std::complex< double > *X, const int *incX, std::complex< double > *Y, const int *incY)
Definition gather_math_lib_info.cpp:36
AbacusDevice_t
Definition types.h:12
@ CpuDevice
Definition types.h:14