1#ifndef VECCORE_BACKEND_IMPLEMENTATION_H
2#define VECCORE_BACKEND_IMPLEMENTATION_H
17 using V =
typename std::decay<T>::type;
26 return VectorSize<T>();
43 return addr +
sizeof(v);
55 return addr +
sizeof(v);
99 *(
Begin(v) + i) = val;
123 template <
typename S = Scalar<T>>
126 static void Load(T &v, S
const *ptr)
128 for (
size_t i = 0; i < VectorSize<T>(); ++i)
132 template <
typename S = Scalar<T>>
135 static void Store(T
const &v, S *ptr)
137 for (
size_t i = 0; i < VectorSize<T>(); ++i)
138 ptr[i] =
static_cast<S
>(
Get(v, i));
172 template <
typename S = Scalar<T>>
177 for (
size_t i = 0; i < VectorSize<T>(); ++i)
178 Set(v, i, ptr[
Get(idx, i)]);
181 template <
typename S = Scalar<T>>
186 for (
size_t i = 0; i < VectorSize<T>(); ++i)
187 ptr[
Get(idx, i)] =
Get(v, i);
191template <
typename T,
typename S>
201template <
typename T,
typename S>
215 for (
size_t i = 0; i < VectorSize<M>(); i++)
216 if (!
Get(mask, i))
return false;
224 for (
size_t i = 0; i < VectorSize<M>(); i++)
225 if (
Get(mask, i))
return false;
231template <
typename T,
bool>
237 for (
size_t i = 0; i < VectorSize<T>(); i++)
238 if (
Get(mask, i))
Set(dst, i,
Get(src, i));
243 static void Blend(T &dst,
Mask<T> const &mask, T
const &src1, T
const &src2)
245 for (
size_t i = 0; i < VectorSize<T>(); i++)
246 Set(dst, i,
Get(mask, i) ?
Get(src1, i) :
Get(src2, i));
261 static void Blend(T &dst,
Mask<T> const &mask, T
const &src1, T
const &src2) { dst = mask ? src1 : src2; }
275 static void Blend(T &dst,
Mask<T> const &mask, T
const &src1, T
const &src2)
303#ifdef VECCORE_CUDA_DEVICE_COMPILATION
325 for (
size_t i = 0; i < VectorSize<T>(); ++i)
336 for (
size_t i = 0; i < VectorSize<T>(); ++i)
337 if (
Get(v, i) < result)
348 for (
size_t i = 0; i < VectorSize<T>(); ++i)
349 if (
Get(v, i) > result)
354template<
typename Vout,
typename Vin>
358 static_assert(VectorSize<Vin>() == VectorSize<Vout>(),
359 "Cannot convert SIMD vectors of different sizes");
360 for (
size_t i = 0; i < VectorSize<Vin>(); ++i)
#define VECCORE_ATT_HOST_DEVICE
#define VECCORE_FORCE_INLINE
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Max(const T &a, const T &b)
VECCORE_ATT_HOST_DEVICE bool MaskEmpty(const M &mask)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void MaskedAssign(T &dst, const Mask< T > &mask, const T &src)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > Get(const T &v, size_t i)
typename TypeTraits< T >::ScalarType Scalar
typename TypeTraits< T >::MaskType Mask
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Blend(const Mask< T > &mask, const T &src1, const T &src2)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void Set(T &v, size_t i, Scalar< T > const val)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > ReduceMax(const T &v)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void Scatter(T const &v, S *ptr, Index< T > const &idx)
VECCORE_ATT_HOST_DEVICE bool MaskFull(const M &mask)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE constexpr size_t VectorSize()
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > * End(T &v)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void Load(T &v, Scalar< T > const *ptr)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE constexpr bool EarlyReturnAllowed()
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > * Begin(T &v)
typename TypeTraits< T >::IndexType Index
Vout Convert(const Vin &v)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Gather(S const *ptr, Index< T > const &idx)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE constexpr bool EarlyReturnMaxLength(T &, size_t n)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > ReduceMin(const T &v)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE void Store(T const &v, Scalar< T > *ptr)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE Scalar< T > ReduceAdd(const T &v)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Scatter(T const &v, S *ptr, Index< T > const &idx)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Gather(T &v, S const *ptr, Index< T > const &idx)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Blend(T &dst, Mask< T > const &mask, T const &src1, T const &src2)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Assign(T &dst, Mask< T > const &mask, T const &src)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Assign(T &dst, Mask< T > const &mask, T const &src)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Blend(T &dst, Mask< T > const &mask, T const &src1, T const &src2)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Set(T &v, size_t i, Scalar< T > const val)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE Scalar< T > Get(const T &v, size_t i)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE Scalar< T > const * End(const T &v)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE Scalar< T > * End(T &v)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE Scalar< T > * Begin(T &v)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE Scalar< T > const * Begin(const T &v)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Load(T &v, S const *ptr)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Store(T const &v, S *ptr)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Blend(T &dst, Mask< T > const &mask, T const &src1, T const &src2)
VECCORE_FORCE_INLINE static VECCORE_ATT_HOST_DEVICE void Assign(T &dst, Mask< T > const &mask, T const &src)