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