batmat develop
Batched linear algebra routines
Loading...
Searching...
No Matches
symv.hpp
Go to the documentation of this file.
1#pragma once
2
7#include <batmat/loop.hpp>
9#include <guanaqo/trace.hpp>
10
11namespace batmat::linalg {
12
13namespace detail {
14template <class T, class Abi, micro_kernels::symv::KernelConfig Conf = {}, StorageOrder OA>
15 requires(Conf.struc_A == MatrixStructure::LowerTriangular ||
18 view<T, Abi> D) {
19 static_assert(Conf.struc_A == MatrixStructure::LowerTriangular); // TODO
20 GUANAQO_TRACE_LINALG("symv", A.rows() * A.cols() * B.cols() * A.depth());
21 // Check dimensions
22 const index_t M = D.rows();
23 BATMAT_ASSERT(!C || C->rows() == D.rows());
24 BATMAT_ASSERT(!C || C->cols() == D.cols());
25 BATMAT_ASSERT(A.rows() == M);
26 BATMAT_ASSERT(A.cols() == M);
27 BATMAT_ASSERT(B.cols() == D.cols());
28 BATMAT_ASSERT(B.cols() == 1);
29
30 // Degenerate case
31 if (M == 0) [[unlikely]]
32 return;
34}
35
36} // namespace detail
37
38/// @addtogroup topic-linalg
39/// @{
40
41/// @name Symmetric matrix-vector multiplication of batches of matrices
42/// @{
43
44/// d = A b where A is symmetric
45template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD>
47void symv(Structured<VA, SA> A, VB &&B, VD &&D) {
48 static constexpr micro_kernels::symv::KernelConfig conf{.negate = false, .struc_A = SA};
49 std::optional<decltype(simdify(D).as_const())> null;
51 simdify(A.value).as_const(), simdify(B).as_const(), null, simdify(D));
52}
53
54/// d = -A b where A is symmetric
55template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD>
57void symv_neg(Structured<VA, SA> A, VB &&B, VD &&D) {
58 static constexpr micro_kernels::symv::KernelConfig conf{.negate = true, .struc_A = SA};
59 std::optional<decltype(simdify(D).as_const())> null;
61 simdify(A.value).as_const(), simdify(B).as_const(), null, simdify(D));
62}
63
64/// d = c + A b where A is symmetric
65template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD>
67void symv_add(Structured<VA, SA> A, VB &&B, VC &&C, VD &&D) {
68 static constexpr micro_kernels::symv::KernelConfig conf{.negate = false, .struc_A = SA};
70 simdify(A.value).as_const(), simdify(B).as_const(), simdify(C).as_const(), simdify(D));
71}
72/// d = d + A b where A is symmetric
73template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD>
75void symv_add(Structured<VA, SA> A, VB &&B, VD &&D) {
76 symv_add(A.ref(), B, D, D);
77}
78
79/// d = c - A b where A is symmetric
80template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD>
82void symv_sub(Structured<VA, SA> A, VB &&B, VC &&C, VD &&D) {
83 static constexpr micro_kernels::symv::KernelConfig conf{.negate = true, .struc_A = SA};
85 simdify(A.value).as_const(), simdify(B).as_const(), simdify(C).as_const(), simdify(D));
86}
87/// d = d - A b where A is symmetric
88template <MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD>
90void symv_sub(Structured<VA, SA> A, VB &&B, VD &&D) {
91 symv_sub(A.ref(), B, D, D);
92}
93
94/// @}
95
96/// @}
97
98} // namespace batmat::linalg
#define BATMAT_ASSERT(x)
Definition assume.hpp:14
void symv_sub(Structured< VA, SA > A, VB &&B, VC &&C, VD &&D)
d = c - A b where A is symmetric
Definition symv.hpp:82
void symv_add(Structured< VA, SA > A, VB &&B, VC &&C, VD &&D)
d = c + A b where A is symmetric
Definition symv.hpp:67
void symv_neg(Structured< VA, SA > A, VB &&B, VD &&D)
d = -A b where A is symmetric
Definition symv.hpp:57
void symv(Structured< VA, SA > A, VB &&B, VD &&D)
d = A b where A is symmetric
Definition symv.hpp:47
#define GUANAQO_TRACE_LINALG(name, gflops)
void symv(view< const T, Abi, OA > A, view< const T, Abi > B, std::optional< view< const T, Abi > > C, view< T, Abi > D)
Definition symv.hpp:17
void symv_copy_register(view< const T, Abi, OA > A, view< const T, Abi > B, std::optional< view< const T, Abi > > C, view< T, Abi > D) noexcept
Generalized matrix multiplication d = c ± A⁽ᵀ⁾ b. Using register blocking.
Definition symv.tpp:72
typename detail::simdified_abi< V >::type simdified_abi_t
Definition simdify.hpp:204
constexpr bool simdify_compatible
Definition simdify.hpp:207
constexpr auto simdify(simdifiable auto &&a) -> simdified_view_t< decltype(a)>
Definition simdify.hpp:214
simd_view_types< std::remove_const_t< T >, Abi >::template view< T, Order > view
Definition uview.hpp:70
Aligned allocation for matrix storage.
Light-weight wrapper class used for overload resolution of triangular and symmetric matrices.