Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
blasproto.hpp
Go to the documentation of this file.
1
31
32#ifndef BLASCHAR
33#error "BLASCHAR must be defined before including blasproto.hpp"
34#endif
35
36#ifndef BLASTYPE
37#error "BLASTYPE must be defined before including blasproto.hpp"
38#endif
39
40#ifndef BLASCOMPLEX
41#error "BLASCOMPLEX must be defined before including blasproto.hpp"
42#endif
43
44// Concatenation helpers
47#define UNI20_INTERNAL_CONCAT2(x, y) x##y
50#define UNI20_INTERNAL_CONCAT(x, y) UNI20_INTERNAL_CONCAT2(x, y)
51
52// Form full Fortran symbol name
55#define UNI20_INTERNAL_BLAS_FN(NAME) UNI20_INTERNAL_CONCAT(UNI20_INTERNAL_CONCAT(BLASCHAR, NAME), _)
56
59
60namespace uni20::blas
61{
62namespace detail
63{
64
65extern "C"
66{
67
68 // Level 3
69 void UNI20_INTERNAL_BLAS_FN(gemm)(char const* transa, char const* transb, blas_int const* m, blas_int const* n,
70 blas_int const* k, BLASTYPE const* alpha, BLASTYPE const* A, blas_int const* lda,
71 BLASTYPE const* B, blas_int const* ldb, BLASTYPE const* beta, BLASTYPE* C,
72 blas_int const* ldc);
73
74 // Level 2
75 void UNI20_INTERNAL_BLAS_FN(gemv)(char const* trans, blas_int const* m, blas_int const* n, BLASTYPE const* alpha,
76 BLASTYPE const* A, blas_int const* lda, BLASTYPE const* x, blas_int const* incx,
77 BLASTYPE const* beta, BLASTYPE* y, blas_int const* incy);
78
79#if BLASCOMPLEX
80
81#ifndef BLASREALTYPE
82#error "BLASREALTYPE must be defined before including blasproto.hpp for BLASCOMPLEX functions"
83#endif
84
85 void UNI20_INTERNAL_BLAS_FN(geru)(blas_int const* m, blas_int const* n, BLASTYPE const* alpha, BLASTYPE const* x,
86 blas_int const* incx, BLASTYPE const* y, blas_int const* incy, BLASTYPE* A,
87 blas_int const* lda);
88
89 void UNI20_INTERNAL_BLAS_FN(gerc)(blas_int const* m, blas_int const* n, BLASTYPE const* alpha, BLASTYPE const* x,
90 blas_int const* incx, BLASTYPE const* y, blas_int const* incy, BLASTYPE* A,
91 blas_int const* lda);
92
93 void UNI20_INTERNAL_BLAS_FN(herk)(char const* uplo, char const* trans, blas_int const* n, blas_int const* k,
94 BLASREALTYPE const* alpha, BLASTYPE const* A, blas_int const* lda,
95 BLASREALTYPE const* beta, BLASTYPE* C, blas_int const* ldc);
96
97 void UNI20_INTERNAL_BLAS_FN(her2k)(char const* uplo, char const* trans, blas_int const* n, blas_int const* k,
98 BLASTYPE const* alpha, BLASTYPE const* A, blas_int const* lda, BLASTYPE const* B,
99 blas_int const* ldb, BLASREALTYPE const* beta, BLASTYPE* C, blas_int const* ldc);
100
101#else
102
103 void UNI20_INTERNAL_BLAS_FN(ger)(blas_int const* m, blas_int const* n, BLASTYPE const* alpha, BLASTYPE const* x,
104 blas_int const* incx, BLASTYPE const* y, blas_int const* incy, BLASTYPE* A,
105 blas_int const* lda);
106
107 void UNI20_INTERNAL_BLAS_FN(syrk)(char const* uplo, char const* trans, blas_int const* n, blas_int const* k,
108 BLASTYPE const* alpha, BLASTYPE const* A, blas_int const* lda, BLASTYPE const* beta,
109 BLASTYPE* C, blas_int const* ldc);
110
111 void UNI20_INTERNAL_BLAS_FN(syr2k)(char const* uplo, char const* trans, blas_int const* n, blas_int const* k,
112 BLASTYPE const* alpha, BLASTYPE const* A, blas_int const* lda, BLASTYPE const* B,
113 blas_int const* ldb, BLASTYPE const* beta, BLASTYPE* C, blas_int const* ldc);
114#endif
115
116} // extern "C"
117} // namespace detail
118
119// ----------- Wrappers -------------
120
121inline void gemm(char transa, char transb, blas_int m, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const* A,
122 blas_int lda, BLASTYPE const* B, blas_int ldb, BLASTYPE beta, BLASTYPE* C, blas_int ldc)
123{
124 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(gemm), transa, transb, m, n, k, alpha, A, lda, B, ldb, beta, C,
125 ldc);
126 detail::UNI20_INTERNAL_BLAS_FN(gemm)(&transa, &transb, &m, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc);
127}
128
129inline void gemv(char trans, blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const* A, blas_int lda, BLASTYPE const* x,
130 blas_int incx, BLASTYPE beta, BLASTYPE* y, blas_int incy)
131{
132 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(gemv), trans, m, n, alpha, A, lda, x, incx, beta, y, incy);
133 detail::UNI20_INTERNAL_BLAS_FN(gemv)(&trans, &m, &n, &alpha, A, &lda, x, &incx, &beta, y, &incy);
134}
135
136#if BLASCOMPLEX
137
138inline void geru(blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const* x, blas_int incx, BLASTYPE const* y,
139 blas_int incy, BLASTYPE* A, blas_int lda)
140{
141 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(geru), m, n, alpha, x, incx, y, incy, A, lda);
142 detail::UNI20_INTERNAL_BLAS_FN(geru)(&m, &n, &alpha, x, &incx, y, &incy, A, &lda);
143}
144
145inline void gerc(blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const* x, blas_int incx, BLASTYPE const* y,
146 blas_int incy, BLASTYPE* A, blas_int lda)
147{
148 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(gerc), m, n, alpha, x, incx, y, incy, A, lda);
149 detail::UNI20_INTERNAL_BLAS_FN(gerc)(&m, &n, &alpha, x, &incx, y, &incy, A, &lda);
150}
151
152inline void herk(char uplo, char trans, blas_int n, blas_int k, BLASREALTYPE alpha, BLASTYPE const* A, blas_int lda,
153 BLASREALTYPE beta, BLASTYPE* C, blas_int ldc)
154{
155 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(herk), uplo, trans, n, k, alpha, A, lda, beta, C, ldc);
156 detail::UNI20_INTERNAL_BLAS_FN(herk)(&uplo, &trans, &n, &k, &alpha, A, &lda, &beta, C, &ldc);
157}
158
159inline void her2k(char uplo, char trans, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const* A, blas_int lda,
160 BLASTYPE const* B, blas_int ldb, BLASREALTYPE beta, BLASTYPE* C, blas_int ldc)
161{
162 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(her2k), uplo, trans, n, k, alpha, A, lda, B, ldb, beta, C, ldc);
163 detail::UNI20_INTERNAL_BLAS_FN(her2k)(&uplo, &trans, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc);
164}
165
166#else
167
168inline void ger(blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const* x, blas_int incx, BLASTYPE const* y,
169 blas_int incy, BLASTYPE* A, blas_int lda)
170{
171 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(ger), m, n, alpha, x, incx, y, incy, A, lda);
172 detail::UNI20_INTERNAL_BLAS_FN(ger)(&m, &n, &alpha, x, &incx, y, &incy, A, &lda);
173}
174
175inline void syrk(char uplo, char trans, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const* A, blas_int lda,
176 BLASTYPE beta, BLASTYPE* C, blas_int ldc)
177{
178 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(syrk), uplo, trans, n, k, alpha, A, lda, beta, C, ldc);
179 detail::UNI20_INTERNAL_BLAS_FN(syrk)(&uplo, &trans, &n, &k, &alpha, A, &lda, &beta, C, &ldc);
180}
181
182inline void syr2k(char uplo, char trans, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const* A, blas_int lda,
183 BLASTYPE const* B, blas_int ldb, BLASTYPE beta, BLASTYPE* C, blas_int ldc)
184{
185 UNI20_EXTERNAL_API_CALL(BLAS, UNI20_INTERNAL_BLAS_FN(syr2k), uplo, trans, n, k, alpha, A, lda, B, ldb, beta, C, ldc);
186 detail::UNI20_INTERNAL_BLAS_FN(syr2k)(&uplo, &trans, &n, &k, &alpha, A, &lda, B, &ldb, &beta, C, &ldc);
187}
188#endif
189
190} // namespace uni20::blas
191
192// Clean up internal macros
193#undef UNI20_INTERNAL_CONCAT
194#undef UNI20_INTERNAL_CONCAT2
195#undef UNI20_INTERNAL_BLAS_FN
196
#define UNI20_EXTERNAL_API_CALL(module, func,...)
Emits a trace log entry for an outgoing backend API call.
Definition backend.hpp:90
#define BLASTYPE
Internal macro mapping the BLAS prefix to the associated Uni20 scalar type.
Definition reference_blas.hpp:24
#define UNI20_INTERNAL_BLAS_FN(NAME)
Builds the mangled Fortran symbol name for the current BLAS instantiation.
Definition blasproto.hpp:55
#define BLASREALTYPE
Internal macro naming the real-valued companion type for complex single-precision instantiations.
Definition reference_blas.hpp:55
Definition blas_int.hpp:18
void gemv(char trans, blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const *A, blas_int lda, BLASTYPE const *x, blas_int incx, BLASTYPE beta, BLASTYPE *y, blas_int incy)
Definition blasproto.hpp:129
void syr2k(char uplo, char trans, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const *A, blas_int lda, BLASTYPE const *B, blas_int ldb, BLASTYPE beta, BLASTYPE *C, blas_int ldc)
Definition blasproto.hpp:182
void ger(blas_int m, blas_int n, BLASTYPE alpha, BLASTYPE const *x, blas_int incx, BLASTYPE const *y, blas_int incy, BLASTYPE *A, blas_int lda)
Definition blasproto.hpp:168
void gemm(char transa, char transb, blas_int m, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const *A, blas_int lda, BLASTYPE const *B, blas_int ldb, BLASTYPE beta, BLASTYPE *C, blas_int ldc)
Definition blasproto.hpp:121
void syrk(char uplo, char trans, blas_int n, blas_int k, BLASTYPE alpha, BLASTYPE const *A, blas_int lda, BLASTYPE beta, BLASTYPE *C, blas_int ldc)
Definition blasproto.hpp:175
mpreal beta(mpreal const &a, mpreal const &x)
Real Beta function; positive rational/integer pairs retain exact values.
Definition mpreal_special.hpp:164