12template <
class T,
class Abi,
StorageOrder O0,
class Tinit,
class F,
class... Args>
18 iter_elems<T, Abi, O0>([&](
auto... args) { init = fun(init, args...); }, x0, xs...);
22template <
class T,
class Abi,
StorageOrder O0,
class Tinit,
class F,
class R,
class... Args>
24 return reduce_fn(vreduce(init, fun, x0, xs...));
27template <
class T,
class Abi, StorageOrder OA>
30 using norms = linalg::norms<T, simd>;
34template <
class T,
class Abi, StorageOrder OA>
41template <
class T,
class Abi, StorageOrder OA, StorageOrder OB>
44 auto fma = [](
auto accum,
auto ai,
auto bi) {
return ai * bi + accum; };
45 return vreduce<T, Abi>(simd{0}, fma, a, b);
49template <
class T,
class Abi, StorageOrder OA, StorageOrder OB>
55template <
class T,
class Abi, StorageOrder OA>
58 auto fma = [](
auto accum,
auto ai) {
return ai * ai + accum; };
59 return vreduce<T, Abi>(simd{0}, fma, a);
63template <
class T,
class Abi, StorageOrder OA>
69template <
class T,
class Abi, StorageOrder OW, StorageOrder OA>
72 auto wnd = [](
auto accum,
auto wi,
auto ai) {
return wi * (ai * ai) + accum; };
73 return vreduce<T, Abi>(simd{0}, wnd, w, a);
77template <
class T,
class Abi, StorageOrder OW, StorageOrder OA>
83template <
class T,
class Abi, StorageOrder OW, StorageOrder OA, StorageOrder OB>
88 auto wnd = [](
auto accum,
auto wi,
auto ai,
auto bi) {
90 return wi * (ei * ei) + accum;
92 return vreduce<T, Abi>(simd{0}, wnd, w, a, b);
96template <
class T,
class Abi, StorageOrder OW, StorageOrder OA, StorageOrder OB>
99 return reduce(weighted_vnorm_sq_difference<T, Abi>(w, a, b));
113template <simdifiable Vx>
120template <simdifiable Vx>
127template <simdifiable Vx>
133template <simdifiable Vx>
135 return norms_all(std::forward<Vx>(x)).norm_inf();
139template <simdifiable Vx>
145template <simdifiable Vx>
147 return norms_all(std::forward<Vx>(x)).norm_1();
151template <simdifiable Vx>
159template <simdifiable Vx>
166template <simdifiable Vx>
173template <simdifiable Vx>
180template <simdifiable Vx, simdifiable Vy>
189template <simdifiable Vx, simdifiable Vy>
198template <simdifiable Vw, simdifiable Va>
207template <simdifiable Vw, simdifiable Va>
216template <simdifiable Vw, simdifiable Va, simdifiable Vb>
225template <simdifiable Vw, simdifiable Va, simdifiable Vb>
239inline namespace multi {
248template <simdifiable_multi Vx>
252 for (
index_t b = 0; b < x.num_batches(); ++b)
258template <simdifiable_multi Vx>
260 return norms_all(std::forward<Vx>(x)).norm_inf();
264template <simdifiable_multi Vx>
266 return norms_all(std::forward<Vx>(x)).norm_1();
270template <simdifiable_multi Vx>
273 for (
index_t b = 0; b < x.num_batches(); ++b)
279template <simdifiable_multi Vx>
286template <simdifiable_multi Vx, simdifiable_multi Vy>
291 for (
index_t b = 0; b < x.num_batches(); ++b)
297template <simdifiable_multi Vw, simdifiable_multi Vx>
302 for (
index_t b = 0; b < w.num_batches(); ++b)
308template <simdifiable_multi Vw, simdifiable_multi Vx, simdifiable_multi Vy>
314 for (
index_t b = 0; b < w.num_batches(); ++b)
320template <simdifiable_multi Vx>
325 for (
index_t b = 0; b < x.num_batches(); ++b)
331template <simdifiable_multi Vx>
333 return vnorms_all(std::forward<Vx>(x)).norm_inf();
337template <simdifiable_multi Vx>
339 return vnorms_all(std::forward<Vx>(x)).norm_1();
343template <simdifiable_multi Vx>
346 for (
index_t b = 0; b < x.num_batches(); ++b)
352template <simdifiable_multi Vx>
359template <simdifiable_multi Vx, simdifiable_multi Vy>
364 for (
index_t b = 0; b < x.num_batches(); ++b)
370template <simdifiable_multi Vw, simdifiable_multi Vx>
375 for (
index_t b = 0; b < w.num_batches(); ++b)
381template <simdifiable_multi Vw, simdifiable_multi Vx, simdifiable_multi Vy>
387 for (
index_t b = 0; b < w.num_batches(); ++b)
simdified_simd_t< Vx > vnorm_2_squared(Vx &&x)
Compute the lane-wise squared 2-norms of a batch of vectors.
simdified_value_t< Vx > norm_inf(Vx &&x)
Compute the infinity norm of a vector.
simdified_simd_t< Vx > vnorm_1(Vx &&x)
Compute the lane-wise 1-norms of a batch of vectors.
simdified_value_t< Vx > norm_2_squared(Vx &&x)
Compute the squared 2-norm of a vector.
simdified_value_t< Vx > norm_2(Vx &&x)
Compute the 2-norm of a vector.
simdified_simd_t< Vw > weighted_vnorm_sq(Vw &&w, Va &&a)
∑ wᵢ aᵢ² (lane-wise).
simdified_value_t< Vx > norm_2(Vx &&x)
Compute the 2-norm of a vector.
simdified_value_t< Vx > norm_2_squared(Vx &&x)
Compute the squared 2-norm of a vector.
simdified_value_t< Vx > norm_1(Vx &&x)
Compute the 1-norm of a vector.
simdified_simd_t< Vw > weighted_vnorm_sq_diff(Vw &&w, Va &&a, Vb &&b)
∑ wᵢ(aᵢ - bᵢ)² (lane-wise).
simdified_simd_t< Vx > vnorm_1(Vx &&x)
Compute the lane-wise 1-norms of a batch of vectors.
simdified_simd_t< Vx > vnorm_inf(Vx &&x)
Compute the lane-wise infinity norms of a batch of vectors.
simdified_value_t< Vw > weighted_norm_sq(Vw &&w, Vx &&x)
∑ wᵢ xᵢ².
simdified_value_t< Vx > dot(Vx &&x, Vy &&y)
Compute the dot product of two vectors.
simdified_value_t< Vx > norm_1(Vx &&x)
Compute the 1-norm of a vector.
norms< simdified_value_t< Vx > >::result norms_all(Vx &&x)
Compute the norms (max, 1-norm, and 2-norm) of a vector.
simdified_value_t< Vw > weighted_norm_sq_difference(Vw &&w, Vx &&x, Vy &&y)
∑ wᵢ(xᵢ - yᵢ)².
simdified_value_t< Vx > norm_inf(Vx &&x)
Compute the infinity norm of a vector.
simdified_simd_t< Vx > vnorm_inf(Vx &&x)
Compute the lane-wise infinity norms of a batch of vectors.
simdified_simd_t< Vx > vnorm_2(Vx &&x)
Compute the lane-wise 2-norms of a batch of vectors.
simdified_value_t< Vx > dot(Vx &&x, Vy &&y)
Compute the dot product of two vectors.
simdified_value_t< Vw > weighted_norm_sq(Vw &&w, Va &&a)
∑ wᵢ aᵢ².
simdified_simd_t< Vw > weighted_vnorm_sq(Vw &&w, Vx &&x)
∑ wᵢ xᵢ² (lane-wise).
norms< simdified_value_t< Vx >, simdified_simd_t< Vx > >::result_simd vnorms_all(Vx &&x)
Compute the lane-wise norms (max, 1-norm, and 2-norm) of a batch of vectors.
simdified_simd_t< Vw > weighted_vnorm_sq_diff(Vw &&w, Vx &&x, Vy &&y)
∑ wᵢ(xᵢ - yᵢ)² (lane-wise).
simdified_value_t< Vw > weighted_norm_sq_diff(Vw &&w, Va &&a, Vb &&b)
∑ wᵢ(aᵢ - bᵢ)².
norms< simdified_value_t< Vx >, simdified_simd_t< Vx > >::result_simd vnorms_all(Vx &&x)
Compute the lane-wise norms (max, 1-norm, and 2-norm) of a batch of vectors.
simdified_simd_t< Vx > vdot(Vx &&x, Vy &&y)
Compute the lane-wise dot products of two batches of vectors.
simdified_simd_t< Vx > vnorm_2(Vx &&x)
Compute the lane-wise 2-norms of a batch of vectors.
simdified_simd_t< Vx > vnorm_2_squared(Vx &&x)
Compute the lane-wise squared 2-norms of a batch of vectors.
norms< simdified_value_t< Vx > >::result norms_all(Vx &&x)
Compute the norms (max, 1-norm, and 2-norm) of a vector.
simdified_simd_t< Vx > vdot(Vx &&x, Vy &&y)
Compute the lane-wise dot products of two batches of vectors.
#define GUANAQO_TRACE_LINALG(name, gflops)
stdx::simd< Tp, Abi > simd
typename detail::simdified_value< V >::type simdified_value_t
typename detail::simdified_abi< V >::type simdified_abi_t
typename detail::simdified_simd< V >::type simdified_simd_t
constexpr bool simdify_compatible
constexpr auto simdify(simdifiable auto &&a) -> simdified_view_t< decltype(a)>
simd_view_types< std::remove_const_t< T >, Abi >::template view< T, Order > view
Utilities for computing vector norms.
static result_simd zero_simd()
typename norms< T >::result result
Accumulator.