guanaqo 1.0.0-alpha.24
Utilities for scientific software
Loading...
Searching...
No Matches
hl-blas-interface.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file
4/// This file provides simple overloaded wrappers around standard BLAS functions.
5/// @ingroup linalg_blas_hl
6
7#include <guanaqo/assume.hpp>
11#include <guanaqo/mat-view.hpp>
12#include <guanaqo/trace.hpp>
13
14#if GUANAQO_WITH_HL_BLAS_TRACING
15#define GUANAQO_TRACE_HL_BLAS(...) GUANAQO_TRACE(__VA_ARGS__)
16#else
17#define GUANAQO_TRACE_HL_BLAS(...) GUANAQO_NOOP()
18#endif
19
20namespace guanaqo::blas {
21
22/// @addtogroup linalg_blas_hl
23/// @{
24
25template <class I>
26using UnitStride = std::integral_constant<I, 1>;
27
28template <class T, class I>
29void xgemv_N(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
30 std::type_identity_t<MatrixView<const T, I>> x, T beta,
32 GUANAQO_ASSUME(A.rows == y.rows);
33 GUANAQO_ASSUME(A.cols == x.rows);
34 GUANAQO_ASSUME(x.cols == 1);
35 GUANAQO_ASSUME(y.cols == 1);
36 GUANAQO_TRACE_HL_BLAS("gemv", 0, A.rows * A.cols);
37 xgemv<T, I>(CblasColMajor, CblasNoTrans, A.rows, A.cols, alpha, A.data,
38 A.outer_stride, x.data, I{1}, beta, y.data, I{1});
39}
40
41template <class T, class I>
42void xgemv_T(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
43 std::type_identity_t<MatrixView<const T, I>> x, T beta,
45 GUANAQO_ASSUME(A.cols == y.rows);
46 GUANAQO_ASSUME(A.rows == x.rows);
47 GUANAQO_ASSUME(x.cols == 1);
48 GUANAQO_ASSUME(y.cols == 1);
49 GUANAQO_TRACE_HL_BLAS("gemv", 0, A.rows * A.cols);
50 xgemv<T, I>(CblasColMajor, CblasTrans, A.rows, A.cols, alpha, A.data,
51 A.outer_stride, x.data, I{1}, beta, y.data, I{1});
52}
53
54template <class T, class I>
55void xgemv_N(T alpha, std::type_identity_t<MatrixViewRM<const T, I>> A,
56 std::type_identity_t<MatrixView<const T, I>> x, T beta,
58 GUANAQO_ASSUME(A.rows == y.rows);
59 GUANAQO_ASSUME(A.cols == x.rows);
60 GUANAQO_ASSUME(x.cols == 1);
61 GUANAQO_ASSUME(y.cols == 1);
62 GUANAQO_TRACE_HL_BLAS("gemv", 0, A.rows * A.cols);
63 xgemv<T, I>(CblasRowMajor, CblasNoTrans, A.rows, A.cols, alpha, A.data,
64 A.outer_stride, x.data, I{1}, beta, y.data, I{1});
65}
66
67template <class T, class I>
68void xgemv_T(T alpha, std::type_identity_t<MatrixViewRM<const T, I>> A,
69 std::type_identity_t<MatrixView<const T, I>> x, T beta,
71 GUANAQO_ASSUME(A.cols == y.rows);
72 GUANAQO_ASSUME(A.rows == x.rows);
73 GUANAQO_ASSUME(x.cols == 1);
74 GUANAQO_ASSUME(y.cols == 1);
75 GUANAQO_TRACE_HL_BLAS("gemv", 0, A.rows * A.cols);
76 xgemv<T, I>(CblasRowMajor, CblasTrans, A.rows, A.cols, alpha, A.data,
77 A.outer_stride, x.data, I{1}, beta, y.data, I{1});
78}
79
80template <class T, class I, StorageOrder O>
81void xgemm_NN(T alpha,
82 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> A,
83 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> B,
84 T beta, MatrixView<T, I, UnitStride<I>, O> C) {
85 GUANAQO_ASSUME(A.rows == C.rows);
86 GUANAQO_ASSUME(A.cols == B.rows);
87 GUANAQO_ASSUME(B.cols == C.cols);
88 GUANAQO_TRACE_HL_BLAS("gemm", 0, C.rows * C.cols * A.cols);
89 xgemm<T, I>(O == StorageOrder::RowMajor ? CblasRowMajor : CblasColMajor,
90 CblasNoTrans, CblasNoTrans, C.rows, C.cols, A.cols, alpha,
91 A.data, A.outer_stride, B.data, B.outer_stride, beta, C.data,
92 C.outer_stride);
93}
94
95template <class T, class I, StorageOrder O>
96void xgemm_TN(T alpha,
97 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> A,
98 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> B,
99 T beta, MatrixView<T, I, UnitStride<I>, O> C) {
100 GUANAQO_ASSUME(A.cols == C.rows);
101 GUANAQO_ASSUME(A.rows == B.rows);
102 GUANAQO_ASSUME(B.cols == C.cols);
103 GUANAQO_TRACE_HL_BLAS("gemm", 0, C.rows * C.cols * A.rows);
104 xgemm<T, I>(O == StorageOrder::RowMajor ? CblasRowMajor : CblasColMajor,
105 CblasTrans, CblasNoTrans, C.rows, C.cols, A.rows, alpha, A.data,
106 A.outer_stride, B.data, B.outer_stride, beta, C.data,
107 C.outer_stride);
108}
109
110template <class T, class I, StorageOrder O>
111void xgemm_TT(T alpha,
112 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> A,
113 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> B,
114 T beta, MatrixView<T, I, UnitStride<I>, O> C) {
115 GUANAQO_ASSUME(A.cols == C.rows);
116 GUANAQO_ASSUME(A.rows == B.cols);
117 GUANAQO_ASSUME(B.rows == C.cols);
118 GUANAQO_TRACE_HL_BLAS("gemm", 0, C.rows * C.cols * A.rows);
119 xgemm<T, I>(O == StorageOrder::RowMajor ? CblasRowMajor : CblasColMajor,
120 CblasTrans, CblasTrans, C.rows, C.cols, A.rows, alpha, A.data,
121 A.outer_stride, B.data, B.outer_stride, beta, C.data,
122 C.outer_stride);
123}
124
125template <class T, class I, StorageOrder O>
126void xgemm_NT(T alpha,
127 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> A,
128 std::type_identity_t<MatrixView<const T, I, UnitStride<I>, O>> B,
129 T beta, MatrixView<T, I, UnitStride<I>, O> C) {
130 GUANAQO_ASSUME(A.rows == C.rows);
131 GUANAQO_ASSUME(A.cols == B.cols);
132 GUANAQO_ASSUME(B.rows == C.cols);
133 GUANAQO_TRACE_HL_BLAS("gemm", 0, C.rows * C.cols * A.cols);
134 xgemm<T, I>(O == StorageOrder::RowMajor ? CblasRowMajor : CblasColMajor,
135 CblasNoTrans, CblasTrans, C.rows, C.cols, A.cols, alpha, A.data,
136 A.outer_stride, B.data, B.outer_stride, beta, C.data,
137 C.outer_stride);
138}
139
140template <class T, class I>
141void xgemmt_LNN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
142 std::type_identity_t<MatrixView<const T, I>> B, T beta,
144 GUANAQO_ASSUME(A.rows == C.rows);
145 GUANAQO_ASSUME(A.cols == B.rows);
146 GUANAQO_ASSUME(B.cols == C.cols);
147 GUANAQO_ASSUME(C.rows == C.cols);
148 GUANAQO_TRACE_HL_BLAS("gemmt", 0, C.rows * (C.rows + 1) * A.cols / 2);
149 xgemmt<T, I>(CblasColMajor, CblasLower, CblasNoTrans, CblasNoTrans, C.rows,
150 A.cols, alpha, A.data, A.outer_stride, B.data, B.outer_stride,
151 beta, C.data, C.outer_stride);
152}
153
154template <class T, class I>
155void xgemmt_LTN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
156 std::type_identity_t<MatrixView<const T, I>> B, T beta,
158 GUANAQO_ASSUME(A.cols == C.rows);
159 GUANAQO_ASSUME(A.rows == B.rows);
160 GUANAQO_ASSUME(B.cols == C.cols);
161 GUANAQO_ASSUME(C.rows == C.cols);
162 GUANAQO_TRACE_HL_BLAS("gemmt", 0, C.rows * (C.rows + 1) * A.rows / 2);
163 xgemmt<T, I>(CblasColMajor, CblasLower, CblasTrans, CblasNoTrans, C.rows,
164 A.rows, alpha, A.data, A.outer_stride, B.data, B.outer_stride,
165 beta, C.data, C.outer_stride);
166}
167
168template <class T, class I>
169void xgemmt_LTT(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
170 std::type_identity_t<MatrixView<const T, I>> B, T beta,
172 GUANAQO_ASSUME(A.cols == C.rows);
173 GUANAQO_ASSUME(A.rows == B.cols);
174 GUANAQO_ASSUME(B.rows == C.cols);
175 GUANAQO_ASSUME(C.rows == C.cols);
176 GUANAQO_TRACE_HL_BLAS("gemmt", 0, C.rows * (C.rows + 1) * A.rows / 2);
177 xgemmt<T, I>(CblasColMajor, CblasLower, CblasTrans, CblasTrans, C.rows,
178 A.rows, alpha, A.data, A.outer_stride, B.data, B.outer_stride,
179 beta, C.data, C.outer_stride);
180}
181
182template <class T, class I>
183void xgemmt_LNT(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
184 std::type_identity_t<MatrixView<const T, I>> B, T beta,
186 GUANAQO_ASSUME(A.rows == C.rows);
187 GUANAQO_ASSUME(A.cols == B.cols);
188 GUANAQO_ASSUME(B.rows == C.cols);
189 GUANAQO_ASSUME(C.rows == C.cols);
190 GUANAQO_TRACE_HL_BLAS("gemmt", 0, C.rows * (C.rows + 1) * A.cols / 2);
191 xgemmt<T, I>(CblasColMajor, CblasLower, CblasNoTrans, CblasTrans, C.rows,
192 A.cols, alpha, A.data, A.outer_stride, B.data, B.outer_stride,
193 beta, C.data, C.outer_stride);
194}
195
196template <class T, class I, StorageOrder O>
197void xsymv_L(T alpha, MatrixView<const T, I, UnitStride<I>, O> A,
198 std::type_identity_t<MatrixView<const T, I>> x, T beta,
200 GUANAQO_ASSUME(A.cols == A.rows);
201 GUANAQO_ASSUME(A.rows == y.rows);
202 GUANAQO_ASSUME(A.cols == x.rows);
203 GUANAQO_TRACE_HL_BLAS("symv", 0, A.rows * (A.cols + 1));
204 xsymv<T, I>(O == StorageOrder::RowMajor ? CblasRowMajor : CblasColMajor,
205 CblasLower, A.rows, alpha, A.data, A.outer_stride, x.data, I{1},
206 beta, y.data, I{1});
207}
208
209template <class T, class I>
210void xtrmv_LNN(std::type_identity_t<MatrixView<const T, I>> A,
212 GUANAQO_ASSUME(A.rows == A.cols);
213 GUANAQO_ASSUME(A.cols == x.rows);
214 GUANAQO_ASSUME(x.cols == 1);
215 GUANAQO_TRACE_HL_BLAS("trmv", 0, A.rows * (A.rows + 1) / 2);
216 xtrmv<T, I>(CblasColMajor, CblasLower, CblasNoTrans, CblasNonUnit, A.rows,
217 A.data, A.outer_stride, x.data, I{1});
218}
219
220template <class T, class I>
221void xtrmv_LTN(std::type_identity_t<MatrixView<const T, I>> A,
223 GUANAQO_ASSUME(A.rows == A.cols);
224 GUANAQO_ASSUME(A.cols == x.rows);
225 GUANAQO_ASSUME(x.cols == 1);
226 GUANAQO_TRACE_HL_BLAS("trmv", 0, A.rows * (A.rows + 1) / 2);
227 xtrmv<T, I>(CblasColMajor, CblasLower, CblasTrans, CblasNonUnit, A.rows,
228 A.data, A.outer_stride, x.data, I{1});
229}
230
231template <class T, class I>
232void xtrsv_LNN(std::type_identity_t<MatrixView<const T, I>> A,
234 GUANAQO_ASSUME(A.rows == A.cols);
235 GUANAQO_ASSUME(A.cols == x.rows);
236 GUANAQO_ASSUME(x.cols == 1);
237 GUANAQO_TRACE_HL_BLAS("trsv", 0, A.rows * (A.rows + 1) / 2);
238 xtrsv<T, I>(CblasColMajor, CblasLower, CblasNoTrans, CblasNonUnit, A.rows,
239 A.data, A.outer_stride, x.data, I{1});
240}
241
242template <class T, class I>
243void xtrsv_LTN(std::type_identity_t<MatrixView<const T, I>> A,
245 GUANAQO_ASSUME(A.rows == A.cols);
246 GUANAQO_ASSUME(A.cols == x.rows);
247 GUANAQO_ASSUME(x.cols == 1);
248 GUANAQO_TRACE_HL_BLAS("trsv", 0, A.rows * (A.rows + 1) / 2);
249 xtrsv<T, I>(CblasColMajor, CblasLower, CblasTrans, CblasNonUnit, A.rows,
250 A.data, A.outer_stride, x.data, I{1});
251}
252
253template <class T, class I>
254void xtrmm_LLNN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
256 GUANAQO_ASSUME(A.rows == A.cols);
257 GUANAQO_ASSUME(A.cols == B.rows);
258 GUANAQO_TRACE_HL_BLAS("trmm", 0, A.rows * (A.rows + 1) * B.cols / 2);
259 xtrmm<T, I>(CblasColMajor, CblasLeft, CblasLower, CblasNoTrans,
260 CblasNonUnit, B.rows, B.cols, alpha, A.data, A.outer_stride,
261 B.data, B.outer_stride);
262}
263
264template <class T, class I>
265void xtrmm_LLTN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
267 GUANAQO_ASSUME(A.rows == A.cols);
268 GUANAQO_ASSUME(A.cols == B.rows);
269 GUANAQO_TRACE_HL_BLAS("trmm", 0, A.rows * (A.rows + 1) * B.cols / 2);
270 xtrmm<T, I>(CblasColMajor, CblasLeft, CblasLower, CblasTrans, CblasNonUnit,
271 B.rows, B.cols, alpha, A.data, A.outer_stride, B.data,
272 B.outer_stride);
273}
274
275template <class T, class I>
276void xtrmm_RLNN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
278 GUANAQO_ASSUME(A.rows == A.cols);
279 GUANAQO_ASSUME(A.rows == B.cols);
280 GUANAQO_TRACE_HL_BLAS("trmm", 0, A.rows * (A.rows + 1) * B.rows / 2);
281 xtrmm<T, I>(CblasColMajor, CblasRight, CblasLower, CblasNoTrans,
282 CblasNonUnit, B.rows, B.cols, alpha, A.data, A.outer_stride,
283 B.data, B.outer_stride);
284}
285
286template <class T, class I>
287void xtrmm_RLTN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
289 GUANAQO_ASSUME(A.rows == A.cols);
290 GUANAQO_ASSUME(A.rows == B.cols);
291 GUANAQO_TRACE_HL_BLAS("trmm", 0, A.rows * (A.rows + 1) * B.rows / 2);
292 xtrmm<T, I>(CblasColMajor, CblasRight, CblasLower, CblasTrans, CblasNonUnit,
293 B.rows, B.cols, alpha, A.data, A.outer_stride, B.data,
294 B.outer_stride);
295}
296
297template <class T, class I>
298void xsyrk_LN(T alpha, std::type_identity_t<MatrixView<const T, I>> A, T beta,
300 GUANAQO_ASSUME(C.rows == C.cols);
301 GUANAQO_ASSUME(A.rows == C.rows);
302 GUANAQO_TRACE_HL_BLAS("syrk", 0, C.rows * (C.rows + 1) * A.cols / 2);
303 xsyrk<T, I>(CblasColMajor, CblasLower, CblasNoTrans, C.rows, A.cols, alpha,
304 A.data, A.outer_stride, beta, C.data, C.outer_stride);
305}
306
307template <class T, class I>
308void xsyrk_LT(T alpha, std::type_identity_t<MatrixView<const T, I>> A, T beta,
310 GUANAQO_ASSUME(C.rows == C.cols);
311 GUANAQO_ASSUME(A.cols == C.rows);
312 GUANAQO_TRACE_HL_BLAS("syrk", 0, C.rows * (C.rows + 1) * A.rows / 2);
313 xsyrk<T, I>(CblasColMajor, CblasLower, CblasTrans, C.rows, A.rows, alpha,
314 A.data, A.outer_stride, beta, C.data, C.outer_stride);
315}
316
317template <class T, class I>
318void xtrsm_LLNN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
320 GUANAQO_ASSUME(A.rows == A.cols);
321 GUANAQO_ASSUME(A.cols == B.rows);
322 GUANAQO_TRACE_HL_BLAS("trsm", 0,
323 A.rows * (A.rows + 1) * B.cols / 2 + A.rows);
324 xtrsm<T, I>(CblasColMajor, CblasLeft, CblasLower, CblasNoTrans,
325 CblasNonUnit, B.rows, B.cols, alpha, A.data, A.outer_stride,
326 B.data, B.outer_stride);
327}
328
329template <class T, class I>
330void xtrsm_LLTN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
332 GUANAQO_ASSUME(A.rows == A.cols);
333 GUANAQO_ASSUME(A.rows == B.rows);
334 GUANAQO_TRACE_HL_BLAS("trsm", 0,
335 A.rows * (A.rows + 1) * B.cols / 2 + A.rows);
336 xtrsm<T, I>(CblasColMajor, CblasLeft, CblasLower, CblasTrans, CblasNonUnit,
337 B.rows, B.cols, alpha, A.data, A.outer_stride, B.data,
338 B.outer_stride);
339}
340
341template <class T, class I>
342void xtrsm_RLNN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
344 GUANAQO_ASSUME(A.rows == A.cols);
345 GUANAQO_ASSUME(A.cols == B.cols);
346 GUANAQO_TRACE_HL_BLAS("trsm", 0,
347 A.rows * (A.rows + 1) * B.rows / 2 + A.rows);
348 xtrsm<T, I>(CblasColMajor, CblasRight, CblasLower, CblasNoTrans,
349 CblasNonUnit, B.rows, B.cols, alpha, A.data, A.outer_stride,
350 B.data, B.outer_stride);
351}
352
353template <class T, class I>
354void xtrsm_RLTN(T alpha, std::type_identity_t<MatrixView<const T, I>> A,
356 GUANAQO_ASSUME(A.rows == A.cols);
357 GUANAQO_ASSUME(A.cols == B.cols);
358 GUANAQO_TRACE_HL_BLAS("trsm", 0,
359 A.rows * (A.rows + 1) * B.rows / 2 + A.rows);
360 xtrsm<T, I>(CblasColMajor, CblasRight, CblasLower, CblasTrans, CblasNonUnit,
361 B.rows, B.cols, alpha, A.data, A.outer_stride, B.data,
362 B.outer_stride);
363}
364
365// TODO
366template <class T, class I>
367void xsytrf_rk(const char *uplo, const I *n, T *a, const I *lda, T *e, I *ipiv,
368 T *work, const I *lwork, I *info);
369
370// TODO
371template <class T, class I>
372void xtrtrs(const char *uplo, const char *trans, const char *diag, const I *n,
373 const I *nrhs, const T *A, const I *ldA, T *B, const I *ldB,
374 I *info);
375
376/// @throw lapack_error
377template <class T, class I>
379 GUANAQO_ASSUME(A.rows == A.cols);
380 GUANAQO_TRACE_HL_BLAS("potrf", 0,
381 (A.rows - 1) * A.rows * (A.rows + 1) / 6 +
382 (A.rows - 1) * A.rows / 2 + 2 * A.rows);
383 I info = 0;
384 xpotrf<T, I>("L", A.rows, A.data, A.outer_stride, &info);
385 lapack_throw_on_err("xpotrf_L", info);
386}
387
388/// @throw lapack_error
389template <class T, class I>
391 GUANAQO_ASSUME(A.rows == A.cols);
392 GUANAQO_TRACE_HL_BLAS("trtri", 0,
393 (A.rows - 2) * (A.rows - 1) * A.rows / 6 +
394 (A.rows - 1) * (A.rows + 2) / 2 + A.rows);
395 I info = 0;
396 xlauum<T, I>("L", A.rows, A.data, A.outer_stride, &info);
397 lapack_throw_on_err("xlauum_L", info);
398}
399
400/// @throw lapack_error
401template <class T, class I>
403 GUANAQO_ASSUME(A.rows == A.cols);
404 GUANAQO_TRACE_HL_BLAS("trtri", 0,
405 (A.rows - 2) * (A.rows - 1) * A.rows / 6 +
406 (A.rows - 1) * A.rows / 2 + A.rows);
407 I info = 0;
408 xtrtri<T, I>("L", "N", A.rows, A.data, A.outer_stride, &info);
409 lapack_throw_on_err("xtrtri_LN", info);
410}
411
412/// @}
413
414} // namespace guanaqo::blas
Assertion and assumption macros with debug/release semantics.
This file provides simple overloaded wrappers around standard BLAS functions.
std::integral_constant< I, 1 > UnitStride
void xgemm_NN(T alpha, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > A, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > B, T beta, MatrixView< T, I, UnitStride< I >, O > C)
void xgemmt_LNN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > B, T beta, MatrixView< T, I > C)
void xtrsm_LLNN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xgemm_TT(T alpha, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > A, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > B, T beta, MatrixView< T, I, UnitStride< I >, O > C)
void xtrsm_RLNN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xgemmt_LTT(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > B, T beta, MatrixView< T, I > C)
void xtrmv_LNN(std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > x)
void xtrsv_LNN(std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > x)
void xtrmm_LLTN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xtrsv_LTN(std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > x)
void xtrtri_LN(MatrixView< T, I > A)
void xpotrf_L(MatrixView< T, I > A)
void xgemmt_LNT(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > B, T beta, MatrixView< T, I > C)
void xtrsm_LLTN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xsyrk_LN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, T beta, MatrixView< T, I > C)
void xtrmm_LLNN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xgemm_NT(T alpha, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > A, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > B, T beta, MatrixView< T, I, UnitStride< I >, O > C)
void xgemm_TN(T alpha, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > A, std::type_identity_t< MatrixView< const T, I, UnitStride< I >, O > > B, T beta, MatrixView< T, I, UnitStride< I >, O > C)
void xsymv_L(T alpha, MatrixView< const T, I, UnitStride< I >, O > A, std::type_identity_t< MatrixView< const T, I > > x, T beta, MatrixView< T, I > y)
void xsyrk_LT(T alpha, std::type_identity_t< MatrixView< const T, I > > A, T beta, MatrixView< T, I > C)
void xgemv_N(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > x, T beta, MatrixView< T, I > y)
void xtrsm_RLTN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xgemmt_LTN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > B, T beta, MatrixView< T, I > C)
void xtrmm_RLNN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xtrmv_LTN(std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > x)
void xgemv_T(T alpha, std::type_identity_t< MatrixView< const T, I > > A, std::type_identity_t< MatrixView< const T, I > > x, T beta, MatrixView< T, I > y)
void xtrmm_RLTN(T alpha, std::type_identity_t< MatrixView< const T, I > > A, MatrixView< T, I > B)
void xlauum_L(MatrixView< T, I > A)
void xlauum(const char *uplo, I n, T *a, I lda, I *info)
void xtrsm(CBLAS_LAYOUT Layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, I M, I N, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, T *B, I ldb)
void xtrmm(CBLAS_LAYOUT Layout, CBLAS_SIDE Side, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, I M, I N, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, T *B, I ldb)
void xpotrf(const char *uplo, I n, T *a, I lda, I *info)
void xsymv(CBLAS_LAYOUT Layout, CBLAS_UPLO uplo, I N, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, std::type_identity_t< const T * > X, I incX, std::type_identity_t< T > beta, T *Y, I incY)
void xtrmv(CBLAS_LAYOUT Layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, I N, std::type_identity_t< const T * > A, I lda, T *X, I incX)
void xtrtrs(const char *uplo, const char *trans, const char *diag, const I *n, const I *nrhs, std::type_identity_t< const T * > A, const I *ldA, T *B, const I *ldB, I *info)
void lapack_throw_on_err(Name &&name, index_t info)
Definition lapack.hpp:35
void xtrsv(CBLAS_LAYOUT Layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE TransA, CBLAS_DIAG Diag, I N, std::type_identity_t< const T * > A, I lda, T *X, I incX)
void xgemmt(CBLAS_LAYOUT Layout, CBLAS_UPLO uplo, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, I N, I K, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, std::type_identity_t< const T * > B, I ldb, std::type_identity_t< T > beta, T *C, I ldc)
void xsyrk(CBLAS_LAYOUT Layout, CBLAS_UPLO Uplo, CBLAS_TRANSPOSE Trans, I N, I K, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, std::type_identity_t< T > beta, T *C, I ldc)
void xsytrf_rk(const char *uplo, const I *n, T *a, const I *lda, T *e, I *ipiv, T *work, const I *lwork, I *info)
void xgemm(CBLAS_LAYOUT Layout, CBLAS_TRANSPOSE TransA, CBLAS_TRANSPOSE TransB, I M, I N, I K, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, std::type_identity_t< const T * > B, I ldb, std::type_identity_t< T > beta, T *C, I ldc)
void xgemv(CBLAS_LAYOUT Layout, CBLAS_TRANSPOSE TransA, I M, I N, std::type_identity_t< T > alpha, std::type_identity_t< const T * > A, I lda, std::type_identity_t< const T * > X, I incX, std::type_identity_t< T > beta, T *Y, I incY)
void xtrtri(const char *uplo, const char *diag, I n, T *a, I lda, I *info)
MatrixView< T, I, S, StorageOrder::RowMajor > MatrixViewRM
Convenience alias for a row-major MatrixView.
Definition mat-view.hpp:429
@ RowMajor
Row-major storage order (C-style, layout right, unit column stride).
Definition mat-view.hpp:24
#define GUANAQO_ASSUME(x)
Invokes undefined behavior if the expression x does not evaluate to true.
Definition assume.hpp:69
#define GUANAQO_TRACE_HL_BLAS(...)
LAPACK error handling.
Non-owning matrix view.
A lightweight view of a 2D matrix.
Definition mat-view.hpp:68
index_type outer_stride
Definition mat-view.hpp:80
value_type * data
Definition mat-view.hpp:76
Tracing logger and macros (ITT, Perfetto, or fallback).