1 /* ************************************************************************
2  * Copyright 2013 Advanced Micro Devices, Inc.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  * ************************************************************************/
16 
17 
18 #ifndef BLAS_CBLAS_H_
19 #define BLAS_CBLAS_H_
20 
21 /* Under Windows math.h defines "complex" to mean "_complex". */
22 #include <math.h>
23 #undef complex
24 
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28 
29 /* A complex datatype for use by the C interfaces to ACML routines */
30 #ifndef _ACML_COMPLEX
31 #define _ACML_COMPLEX
32 typedef struct
33 {
34     float real, imag;
35 } complex;
36 typedef struct
37 {
38     double real, imag;
39 } doublecomplex;
40 #endif /* !defined(_ACML_COMPLEX) */
41 
42 /* Basic complex arithmetic routines for C */
43 complex compose_complex(float x, float y);
44 float complex_real(complex z);
45 float complex_imag(complex z);
46 
47 doublecomplex compose_doublecomplex(double x, double y);
48 double doublecomplex_real(doublecomplex z);
49 double doublecomplex_imag(doublecomplex z);
50 
51 /* BLAS-2 functions */
52 void sgemv(char transa, int m, int n, float alpha, float *a, int lda, float *x, int incx, float beta, float *y, int incy);
53 void dgemv(char transa, int m, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy);
54 void cgemv(char transa, int m, int n, complex *alpha, complex *a, int lda, complex *x, int incx, complex *beta, complex *y, int incy);
55 void zgemv(char transa, int m, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *x, int incx, doublecomplex *beta, doublecomplex *y, int incy);
56 
57 void ssymv(char uplo, int n, float alpha, float *a, int lda, float *x, int incx, float beta, float *y, int incy);
58 void dsymv(char uplo, int n, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy);
59 
60 void strmv(char uplo, char transa, char diag, int n, float *a, int lda, float *x, int incx);
61 void dtrmv(char uplo, char transa, char diag, int n, double *a, int lda, double *x, int incx);
62 void ctrmv(char uplo, char transa, char diag, int n, complex *a, int lda, complex *x, int incx);
63 void ztrmv(char uplo, char transa, char diag, int n, doublecomplex *a, int lda, doublecomplex *x, int incx);
64 
65 void strsv(char uplo, char transa, char diag, int n, float *a, int lda, float *x, int incx);
66 void dtrsv(char uplo, char transa, char diag, int n, double *a, int lda, double *x, int incx);
67 void ctrsv(char uplo, char transa, char diag, int n, complex *a, int lda, complex *x, int incx);
68 void ztrsv(char uplo, char transa, char diag, int n, doublecomplex *a, int lda, doublecomplex *x, int incx);
69 
70 void sger(int m, int n, float alpha, float *x, int incx, float *y, int incy, float *a, int lda);
71 void dger(int m, int n, double alpha, double *x, int incx, double *y, int incy, double *a, int lda);
72 
73 void cgeru(int m, int n, complex *alpha, complex *x, int incx, complex *y, int incy, complex *a, int lda);
74 void zgeru(int m, int n, doublecomplex *alpha, doublecomplex *x, int incx, doublecomplex *y, int incy, doublecomplex *a, int lda);
75 
76 void cgerc(int m, int n, complex *alpha, complex *x, int incx, complex *y, int incy, complex *a, int lda);
77 void zgerc(int m, int n, doublecomplex *alpha, doublecomplex *x, int incx, doublecomplex *y, int incy, doublecomplex *a, int lda);
78 
79 void ssyr(char uplo, int n, float alpha, float *x, int incx, float *a, int lda);
80 void dsyr(char uplo, int n, double alpha, double *x, int incx, double *a, int lda);
81 void ssyr2(char uplo, int n, float alpha, float *x, int incx, float *y, int incy, float *a, int lda);
82 void dsyr2(char uplo, int n, double alpha, double *x, int incx, double *y, int incy, double *a, int lda);
83 
84 void cher(char uplo, int n, float alpha, complex *x, int incx, complex *a, int lda);
85 void zher(char uplo, int n, double alpha, doublecomplex *x, int incx, doublecomplex *a, int lda);
86 void cher2(char uplo, int n, complex *alpha, complex *x, int incx, complex *y, int incy, complex *a, int lda);
87 void zher2(char uplo, int n, doublecomplex *alpha, doublecomplex *x, int incx, doublecomplex *y, int incy, doublecomplex *a, int lda);
88 
89 void chemv(char uplo, int n, complex *alpha, complex *a, int lda, complex *x, int incx, complex *beta, complex *y, int incy);
90 void zhemv(char uplo, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *x, int incx, doublecomplex *beta, doublecomplex *y, int incy);
91 
92 void stpmv(char uplo, char transa, char diag, int n, float *ap, float *x, int incx);
93 void dtpmv(char uplo, char transa, char diag, int n, double *ap, double *x, int incx);
94 void ctpmv(char uplo, char transa, char diag, int n, complex *ap, complex *x, int incx);
95 void ztpmv(char uplo, char transa, char diag, int n, doublecomplex *ap, doublecomplex *x, int incx);
96 
97 void stpsv(char uplo, char transa, char diag, int n, float *ap, float *x, int incx);
98 void dtpsv(char uplo, char transa, char diag, int n, double *ap, double *x, int incx);
99 void ctpsv(char uplo, char transa, char diag, int n, complex *ap, complex *x, int incx);
100 void ztpsv(char uplo, char transa, char diag, int n, doublecomplex *ap, doublecomplex *x, int incx);
101 
102 void sspr(char uplo, int n, float alpha, float *x, int incx, float *ap );
103 void dspr(char uplo, int n, double alpha, double *x, int incx, double *ap );
104 
105 void sspmv(char uplo, int n, float alpha, float *ap, float *x, int incx, float beta, float *y, int incy);
106 void dspmv(char uplo, int n, double alpha, double *ap, double *x, int incx, double beta, double *y, int incy);
107 void chpmv(char uplo, int n, complex *alpha, complex *ap, complex *x, int incx, complex *beta, complex *y, int incy);
108 void zhpmv(char uplo, int n, doublecomplex *alpha, doublecomplex *ap, doublecomplex *x, int incx, doublecomplex *beta, doublecomplex *y, int incy);
109 
110 void chpr(char uplo, int n, float alpha, complex *x, int incx, complex *ap );
111 void zhpr(char uplo, int n, double alpha, doublecomplex *x, int incx, doublecomplex *ap );
112 
113 void sspr2(char uplo, int n, float alpha, float *x, int incx, float *y, int incy, float *a );
114 void dspr2(char uplo, int n, double alpha, double *x, int incx, double *y, int incy, double *a );
115 void chpr2(char uplo, int n, complex *alpha, complex *x, int incx, complex *y, int incy, complex *a );
116 void zhpr2(char uplo, int n, doublecomplex *alpha, doublecomplex *x, int incx, doublecomplex *y, int incy, doublecomplex *a );
117 
118 void sgbmv(char trans, int m, int n, int kl, int ku, float alpha, float *a, int inca, float *x, int incx, float beta, float *y, int incy );
119 void dgbmv(char trans, int m, int n, int kl, int ku, double alpha, double *a, int inca, double *x, int incx, double beta, double *y, int incy );
120 void cgbmv(char trans, int m, int n, int kl, int ku, complex *alpha, complex *a, int inca, complex *x, int incx, complex *beta, complex *y, int incy );
121 void zgbmv(char trans, int m, int n, int kl, int ku, doublecomplex *alpha, doublecomplex *a, int inca, doublecomplex *x, int incx, doublecomplex *beta, doublecomplex *y, int incy );
122 
123 void stbmv(char uplo, char trans, char diag, int n, int k, float *a, int lda, float *x, int incx );
124 void dtbmv(char uplo, char trans, char diag, int n, int k, double *a, int lda, double *x, int incx );
125 void ctbmv(char uplo, char trans, char diag, int n, int k, complex *a, int lda, complex *x, int incx );
126 void ztbmv(char uplo, char trans, char diag, int n, int k, doublecomplex *a, int lda, doublecomplex *x, int incx );
127 
128 void ssbmv(char uplo, int n, int k, float alpha, float *a, int lda, float *x, int incx, float beta, float *y, int incy );
129 void dsbmv(char uplo, int n, int k, double alpha, double *a, int lda, double *x, int incx, double beta, double *y, int incy );
130 void chbmv(char uplo, int n, int k, complex *alpha, complex *a, int lda, complex *x, int incx, complex *beta, complex *y, int incy );
131 void zhbmv(char uplo, int n, int k, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *x, int incx, doublecomplex *beta, doublecomplex *y, int incy );
132 
133 void stbsv(char uplo, char trans, char diag, int n, int k, float *a, int lda, float *x, int incx );
134 void dtbsv(char uplo, char trans, char diag, int n, int k, double *a, int lda, double *x, int incx );
135 void ctbsv(char uplo, char trans, char diag, int n, int k, complex *a, int lda, complex *x, int incx );
136 void ztbsv(char uplo, char trans, char diag, int n, int k, doublecomplex *a, int lda, doublecomplex *x, int incx );
137 
138 /* BLAS-3 functions */
139 void sgemm(char transa, char transb, int m, int n, int k, float alpha, float *a, int lda, float *b, int ldb, float beta, float *c, int ldc);
140 void dgemm(char transa, char transb, int m, int n, int k, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc);
141 void cgemm(char transa, char transb, int m, int n, int k, complex *alpha, complex *a, int lda, complex *b, int ldb, complex *beta, complex *c, int ldc);
142 void zgemm(char transa, char transb, int m, int n, int k, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb, doublecomplex *beta, doublecomplex *c, int ldc);
143 
144 void strmm(char side, char uplo, char transa, char diag, int m, int n, float alpha, float *a, int lda, float *b, int ldb);
145 void dtrmm(char side, char uplo, char transa, char diag, int m, int n, double alpha, double *a, int lda, double *b, int ldb);
146 void ctrmm(char side, char uplo, char transa, char diag, int m, int n, complex *alpha, complex *a, int lda, complex *b, int ldb);
147 void ztrmm(char side, char uplo, char transa, char diag, int m, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb);
148 
149 void strsm(char side, char uplo, char transa, char diag, int m, int n, float alpha, float *a, int lda, float *b, int ldb);
150 void dtrsm(char side, char uplo, char transa, char diag, int m, int n, double alpha, double *a, int lda, double *b, int ldb);
151 void ctrsm(char side, char uplo, char transa, char diag, int m, int n, complex *alpha, complex *a, int lda, complex *b, int ldb);
152 void ztrsm(char side, char uplo, char transa, char diag, int m, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb);
153 
154 void ssyr2k(char uplo, char transa, int n, int k, float alpha, float *a, int lda, float *b, int ldb, float beta, float *c, int ldc);
155 void dsyr2k(char uplo, char transa, int n, int k, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc);
156 void csyr2k(char uplo, char transa, int n, int k, complex *alpha, complex *a, int lda, complex *b, int ldb, complex *beta, complex *c, int ldc);
157 void zsyr2k(char uplo, char transa, int n, int k, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb, doublecomplex *beta, doublecomplex *c, int ldc);
158 
159 void ssyrk(char uplo, char transa, int n, int k, float alpha, float *a, int lda, float beta, float *c, int ldc);
160 void dsyrk(char uplo, char transa, int n, int k, double alpha, double *a, int lda, double beta, double *c, int ldc);
161 void csyrk(char uplo, char transa, int n, int k, complex *alpha, complex *a, int lda, complex *beta, complex *c, int ldc);
162 void zsyrk(char uplo, char transa, int n, int k, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *beta, doublecomplex *c, int ldc);
163 
164 void ssymm(char side, char uplo, int m, int n, float alpha, float *a, int lda, float *b, int ldb, float beta, float *c, int ldc);
165 void dsymm(char side, char uplo, int m, int n, double alpha, double *a, int lda, double *b, int ldb, double beta, double *c, int ldc);
166 void csymm(char side, char uplo, int m, int n, complex *alpha, complex *a, int lda, complex *b, int ldb, complex *beta, complex *c, int ldc);
167 void zsymm(char side, char uplo, int m, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb, doublecomplex *beta, doublecomplex *c, int ldc);
168 
169 void chemm(char side, char uplo, int m, int n, complex *alpha, complex *a, int lda, complex *b, int ldb, complex *beta, complex *c, int ldc);
170 void zhemm(char side, char uplo, int m, int n, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb, doublecomplex *beta, doublecomplex *c, int ldc);
171 
172 void cherk(char uplo, char transa, int n, int k, float alpha, complex *a, int lda, float beta, complex *c, int ldc);
173 void zherk(char uplo, char transa, int n, int k, double alpha, doublecomplex *a, int lda, double beta, doublecomplex *c, int ldc);
174 
175 void cher2k(char uplo, char transa, int n, int k, complex *alpha, complex *a, int lda, complex *b, int ldb, float beta, complex *c, int ldc);
176 void zher2k(char uplo, char transa, int n, int k, doublecomplex *alpha, doublecomplex *a, int lda, doublecomplex *b, int ldb, double beta, doublecomplex *c, int ldc);
177 
178 void sscal( int n, float alpha, float *x, int incx);
179 void dscal( int n, double alpha, double *x, int incx);
180 void cscal( int n, complex* alpha, complex *x, int incx);
181 void zscal( int n, doublecomplex* alpha, doublecomplex *x, int incx);
182 
183 void csscal( int n, float alpha, complex *x, int incx);
184 void zdscal( int n, double alpha, doublecomplex *x, int incx);
185 
186 void sswap( int n, float *x, int incx, float *y, int incy);
187 void dswap( int n, double *x, int incx, double *y, int incy);
188 void cswap( int n, complex *x, int incx, complex *y, int incy);
189 void zswap( int n, doublecomplex *x, int incx, doublecomplex *y, int incy);
190 
191 void scopy( int n, float *x, int incx, float *y, int incy);
192 void dcopy( int n, double *x, int incx, double *y, int incy);
193 void ccopy( int n, complex *x, int incx, complex *y, int incy);
194 void zcopy( int n, doublecomplex *x, int incx, doublecomplex *y, int incy);
195 
196 float sdot( int n, float *x, int incx, float *y, int incy);
197 double ddot( int n, double *x, int incx, double *y, int incy);
198 complex cdotu( int n, complex *x, int incx, complex *y, int incy);
199 doublecomplex zdotu( int n, doublecomplex *x, int incx, doublecomplex *y, int incy);
200 complex cdotc( int n, complex *x, int incx, complex *y, int incy);
201 doublecomplex zdotc( int n, doublecomplex *x, int incx, doublecomplex *y, int incy);
202 
203 void saxpy( int n, float alpha, float *x, int incx, float *y, int incy);
204 void daxpy( int n, double aplha, double *x, int incx, double *y, int incy);
205 void caxpy( int n, complex *alpha, complex *x, int incx, complex *y, int incy);
206 void zaxpy( int n, doublecomplex *alpha, doublecomplex *x, int incx, doublecomplex *y, int incy);
207 
208 void srotg(float *A, float *B, float *C, float *S);
209 void drotg(double *A, double *B, double *C, double *S);
210 void crotg(complex *A, complex *B, float *C, complex *S);
211 void zrotg(doublecomplex *A, doublecomplex *B, double *C, doublecomplex *S);
212 
213 void srotmg(float *D1, float *D2, float *X1, const float *Y1, float *PARAM);
214 void drotmg(double *D1, double *D2, double *X1, const double *Y1, double *PARAM);
215 
216 void srotm(int N, float *X, int incx, float *Y, int incy, float* PARAM);
217 void drotm(int N, double *X, int incx, double *Y, int incy, double* PARAM);
218 
219 void srot(int N, float *X, int incx, float *Y, int incy, float C, float S);
220 void drot(int N, double *X, int incx, double *Y, int incy, double C, double S);
221 void csrot(int N, complex *X, int incx, complex *Y, int incy, float C, float S);
222 void zdrot(int N, doublecomplex *X, int incx, doublecomplex *Y, int incy, double C, double S);
223 
224 float sasum(int n, float *x, int incx);
225 double dasum(int n, double *x, int incx);
226 float scasum(int n, complex *x, int incx);
227 double dzasum(int n, doublecomplex *x, int incx);
228 
229 float snrm2( int n, float *x, int incx);
230 double dnrm2( int n, double *x, int incx);
231 float scnrm2( int n, complex *x, int incx);
232 double dznrm2( int n, doublecomplex *x, int incx);
233 
234 int isamax(int n, float *x, int incx);
235 int idamax(int n, double *x, int incx);
236 int icamax(int n, complex *x, int incx);
237 int izamax(int n, doublecomplex *x, int incx);
238 
239 #ifdef __cplusplus
240 }
241 #endif
242 
243 #endif  /* BLAS_CBLAS_H_ */
244