25#if ALPAKA_HAS_STD_SIMD
31 template<
typename T_Type, u
int32_t T_w
idth>
33 :
protected alpakaStdSimd::
34 rebind_simd_t<T_Type, alpakaStdSimd::simd_mask<T_Type, alpakaStdSimd::simd_abi::fixed_size<T_width>>>
36 using BaseType = alpakaStdSimd::
37 rebind_simd_t<T_Type, alpakaStdSimd::simd_mask<T_Type, alpakaStdSimd::simd_abi::fixed_size<T_width>>>;
39 using value_type =
typename BaseType::value_type;
40 using reference =
typename BaseType::reference;
42 using BaseType::operator[];
44 constexpr StdSimdMask() =
default;
45 constexpr StdSimdMask(StdSimdMask
const&) =
default;
46 constexpr StdSimdMask(StdSimdMask&&) =
default;
47 constexpr StdSimdMask& operator=(StdSimdMask&& rhs) =
default;
49 constexpr StdSimdMask& operator=(StdSimdMask
const& rhs) =
default;
51 constexpr StdSimdMask& operator=(T_Type
const value)
53 this->asNativeType() = value;
58 template<
typename... T_Args>
59 requires(
sizeof...(T_Args) == T_width && (std::same_as<T_Args, T_Type> && ...))
60 constexpr StdSimdMask(T_Args const&... args) : BaseType{}
62 std::array<T_Type, T_width>
const initArgs{
ALPAKA_FORWARD(args)...};
63 for(uint32_t i = 0u; i < T_width; ++i)
64 this->asNativeType()[i] =
static_cast<bool>(initArgs[i]);
67 template<
typename... T_Args>
68 requires(
sizeof...(T_Args) == T_width && (std::same_as<T_Args, bool> && ...))
69 constexpr StdSimdMask(T_Args... args) : BaseType{}
71 std::array<bool, T_width>
const initArgs{args...};
72 for(uint32_t i = 0u; i < T_width; ++i)
73 this->asNativeType()[i] = initArgs[i];
76 constexpr StdSimdMask(BaseType
const& nativeSimd) : BaseType{nativeSimd}
86 constexpr auto& asNativeType()
88 return static_cast<BaseType&
>(*this);
91 constexpr auto const& asNativeType()
const
93 return static_cast<BaseType const&
>(*this);
98 static constexpr auto fill(
bool value)
100 return StdSimdMask{BaseType(value)};
103 constexpr void copyFrom(T_Type
const* data, alpaka::concepts::Alignment
auto alignment)
105 if constexpr((alignment.template get<T_Type>() % alpakaStdSimd::memory_alignment_v<BaseType>) == 0u)
106 this->asNativeType().copy_from(data, alpakaStdSimd::vector_aligned);
108 this->asNativeType().copy_from(data, alpakaStdSimd::element_aligned);
111 constexpr void copyTo(
auto* data, alpaka::concepts::Alignment
auto alignment)
const
113 if constexpr((alignment.template get<T_Type>() % alpakaStdSimd::memory_alignment_v<BaseType>) == 0u)
114 this->asNativeType().copy_to(data, alpakaStdSimd::vector_aligned);
116 this->asNativeType().copy_to(data, alpakaStdSimd::element_aligned);
121# define ALPAKA_VECTOR_ASSIGN_OP(op) \
122 template<typename T_OtherStorage> \
123 constexpr StdSimdMask& operator op(StdSimdMask const& rhs) \
125 this->asNativeType() op rhs.asNativeType(); \
128 constexpr StdSimdMask& operator op(T_Type const value) \
130 this->asNativeType() op value; \
138# undef ALPAKA_VECTOR_ASSIGN_OP
141# define ALPAKA_VECTOR_BINARY_CMP_OP(returnSimdType, argSimdType, typenameOrConcept, op) \
142 template<typenameOrConcept T_Type, uint32_t T_width> \
143 constexpr auto operator op(const argSimdType<T_Type, T_width>& lhs, const argSimdType<T_Type, T_width>& rhs) \
145 return returnSimdType<T_Type, T_width>{lhs.asNativeType() op rhs.asNativeType()}; \
147 template<typenameOrConcept T_Type, uint32_t T_width> \
148 constexpr auto operator op(const argSimdType<T_Type, T_width>& lhs, T_Type rhs) \
150 return returnSimdType<T_Type, T_width>{lhs.asNativeType() op rhs}; \
152 template<typenameOrConcept T_Type, uint32_t T_width> \
153 constexpr auto operator op(T_Type lhs, const argSimdType<T_Type, T_width>& rhs) \
155 return returnSimdType<T_Type, T_width>{lhs op rhs.asNativeType()}; \
170# undef ALPAKA_VECTOR_BINARY_CMP_OP
176 template<
typename T_Type, u
int32_t T_w
idth>
178 std::has_single_bit(T_width) && std::has_single_bit(
sizeof(T_Type))
179 && alpakaStdSimd::fixed_size_simd_mask<T_Type, T_width>::size() > 0u)
182 using type = internal::StdSimdMask<T_Type, T_width>;
#define ALPAKA_VECTOR_BINARY_CMP_OP(typenameOrConcept, op)
binary operators
#define ALPAKA_VECTOR_ASSIGN_OP(op)
assign operator
#define ALPAKA_FORWARD(instance)
Perfectly forward an instance as argument.
void fill(auto &internalQueue, auto executor, alpaka::concepts::IMdSpan< T_Value > auto &&dest, T_Value elementValue)
alpaka internal implementations.
Get the storage type for a SIMD mask pack.
internal::EmuSimdMask< T_Type, T_width > type