3#include <batmat/config.hpp>
6#if BATMAT_WITH_GSI_HPC_SIMD
13template <
class Tp,
class Abi>
14using simd = std::datapar::basic_simd<Tp, Abi>;
15template <
class Tp, std::
size_t Np>
17template <
class Tp, std::
size_t Np>
24 std::span<
typename V::value_type, V::size()> sp{
const_cast<V::value_type *
>(p), V::size()};
25 return std::datapar::unchecked_load<V>(sp);
30 std::span<
typename V::value_type, V::size()> sp{
const_cast<V::value_type *
>(p), V::size()};
31 return std::datapar::unchecked_load<V>(sp, std::datapar::flag_aligned);
36 std::datapar::unchecked_store(v, p, V::size());
41 std::span<
typename V::value_type, V::size()> sp{p, V::size()};
42 std::datapar::unchecked_store(v, sp, std::datapar::flag_aligned);
47 std::span<
typename V::value_type, V::size()> sp{p, V::size()};
48 if constexpr (V::size() == 1) {
50 std::datapar::unchecked_store(v, sp, std::datapar::flag_aligned);
52 std::datapar::unchecked_store(v, sp, m, std::datapar::flag_aligned);
56#if defined(__x86_64__) || defined(_M_X64)
59 return std::__detail::__to_x86_intrin(v);
61#define BATMAT_HAVE_SIMD_TO_INTRIN 1
64template <
class Tp,
class Abi>
66template <
class Tp,
class Abi>
67using simd_align = std::datapar::alignment<simd<Tp, Abi>>;
68template <
class T,
class V>
73 using value_type = V::value_type;
76 m = std::max(v[i], m);
81 using value_type = V::value_type;
84 m = std::min(v[i], m);
92#include <experimental/simd>
96namespace stdx = std::experimental;
98template <
class Tp,
class Abi>
99using simd = stdx::simd<Tp, Abi>;
100template <
class Tp, std::
size_t Np>
102template <
class Tp, std::
size_t Np>
107 return V{p, stdx::element_aligned};
112 return V{p, stdx::vector_aligned};
117 v.copy_to(p, stdx::element_aligned);
122 v.copy_to(p, stdx::vector_aligned);
127 where(m, v).copy_to(p, stdx::vector_aligned);
132 return static_cast<stdx::__intrinsic_type_t<V, v.size()
>>(v);
134#define BATMAT_HAVE_SIMD_TO_INTRIN 1
136template <
class Tp,
class Abi>
138template <
class Tp,
class Abi>
140template <
class T,
class V>
157 const typename V::value_type data[]{values...};
V unaligned_load(const typename V::value_type *p)
void aligned_store(V v, typename V::value_type *p)
stdx::memory_alignment< simd< Tp, Abi > > simd_align
stdx::simd_size< Tp, Abi > simd_size
deduced_abi< Tp, 1 > scalar_abi
stdx::rebind_simd_t< T, V > rebind_simd_t
V aligned_load(const typename V::value_type *p)
stdx::simd_abi::deduce_t< Tp, Np > deduced_abi
void unaligned_store(V v, typename V::value_type *p)
simd< Tp, deduced_abi< Tp, Np > > deduced_simd
void masked_aligned_store(V v, typename V::mask_type m, typename V::value_type *p)
constexpr V from_values(auto... values)
stdx::simd< Tp, Abi > simd
#define BATMAT_FULLY_UNROLLED_FOR(...)