VecCore 0.8.1
C++ Library for Portable SIMD Vectorization
Loading...
Searching...
No Matches
VcSimdArray.h
Go to the documentation of this file.
1#ifndef VECCORE_BACKEND_VC_SIMDARRAY_H
2#define VECCORE_BACKEND_VC_SIMDARRAY_H
3
4namespace vecCore {
5
6template <typename T, size_t N>
7struct TypeTraits<Vc::SimdMaskArray<T, N>> {
8 using ScalarType = bool;
9 using IndexType = size_t;
10 static constexpr size_t Size = N;
11};
12
13template <typename T, size_t N>
14struct TypeTraits<Vc::SimdArray<T, N>> {
15 using ScalarType = T;
16 using MaskType = typename Vc::SimdArray<T, N>::MaskType;
17 using IndexType = typename Vc::SimdArray<T, N>::IndexType;
18 static constexpr size_t Size = N;
19};
20
21namespace backend {
22
23template <size_t N = 16>
25public:
26 using Real_v = Vc::SimdArray<Real_s, N>;
27 using Float_v = Vc::SimdArray<float, N>;
28 using Double_v = Vc::SimdArray<double, N>;
29
30 using Int_v = Vc::SimdArray<int, N>;
31 using Int16_v = Vc::SimdArray<int16_t, N>;
32 using Int32_v = Vc::SimdArray<int32_t, N>;
33 using Int64_v = Vc::SimdArray<int64_t, N>;
34
35 using UInt_v = Vc::SimdArray<unsigned int, N>;
36 using UInt16_v = Vc::SimdArray<uint16_t, N>;
37 using UInt32_v = Vc::SimdArray<uint32_t, N>;
38 using UInt64_v = Vc::SimdArray<uint64_t, N>;
39};
40
41} // namespace backend
42
43template <typename T, size_t N>
45bool MaskEmpty(const Vc::SimdMaskArray<T, N> &mask)
46{
47 return mask.isEmpty();
48}
49
50template <typename T, size_t N>
52bool MaskFull(const Vc::SimdMaskArray<T, N> &mask)
53{
54 return mask.isFull();
55}
56
57template <typename T, size_t N>
58struct IndexingImplementation<Vc::SimdMaskArray<T, N>> {
59 using M = Vc::SimdMaskArray<T, N>;
60 static inline bool Get(const M &mask, size_t i) { return mask[i]; }
61
62 static inline void Set(M &mask, size_t i, const bool val) { mask[i] = val; }
63};
64
65template <typename T, size_t N>
66struct LoadStoreImplementation<Vc::SimdArray<T, N>> {
67 using V = Vc::SimdArray<T, N>;
68
69 template <typename S = Scalar<V>>
70 static inline void Load(V &v, S const *ptr)
71 {
72 v.load(ptr);
73 }
74
75 template <typename S = Scalar<V>>
76 static inline void Store(V const &v, S *ptr)
77 {
78 v.store(ptr);
79 }
80};
81
82template <typename T, size_t N>
83struct LoadStoreImplementation<Vc::SimdMaskArray<T, N>> {
84 using M = Vc::SimdMaskArray<T, N>;
85
86 template <typename S = Scalar<T>>
87 static inline void Load(M &mask, bool const *ptr)
88 {
89 mask.load(ptr);
90 }
91
92 template <typename S = Scalar<T>>
93 static inline void Store(M const &mask, S *ptr)
94 {
95 mask.store(ptr);
96 }
97};
98
99template <typename T, size_t N>
100struct MaskingImplementation<Vc::SimdArray<T, N>> {
101 using V = Vc::SimdArray<T, N>;
102 using M = Vc::SimdMaskArray<T, N>;
103
104 static inline void Assign(V &dst, M const &mask, V const &src) { dst(mask) = src; }
105
106 static inline void Blend(V &dst, M const &mask, V const &src1, V const &src2)
107 {
108 dst = src2;
109 dst(mask) = src1;
110 }
111};
112
113inline namespace math {
114
115template <typename T, size_t N>
117Vc::SimdArray<T, N> CopySign(const Vc::SimdArray<T, N> &x, const Vc::SimdArray<T, N> &y)
118{
119 return Vc::copysign(x, y);
120}
121
122#define VC_MATH_UNARY_FUNCTION(F, f) \
123template <typename T, size_t N> \
124VECCORE_FORCE_INLINE \
125Vc::SimdArray<T, N> F(const Vc::SimdArray<T, N> &x) \
126{ return Vc::f(x); } \
127
130VC_MATH_UNARY_FUNCTION(Log2, log2)
131VC_MATH_UNARY_FUNCTION(Log10, log10)
132VC_MATH_UNARY_FUNCTION(Sqrt, sqrt)
134
137VC_MATH_UNARY_FUNCTION(ASin, asin)
138VC_MATH_UNARY_FUNCTION(ATan, atan)
139
140// VC_MATH_UNARY_FUNCTION(Floor, floor) // broken
141// VC_MATH_UNARY_FUNCTION(Ceil, ceil) // broken
142// VC_MATH_UNARY_FUNCTION(Trunc, trunc) // broken
143
144#undef VC_MATH_UNARY_FUNCTION
145
146template <typename T, size_t N>
148Vc::SimdArray<T, N> Tan(const Vc::SimdArray<T, N> &x)
149{
150 Vc::SimdArray<T, N> s, c;
151 Vc::sincos(x, &s, &c);
152 return s / c;
153}
154
155template <typename T, size_t N>
157Vc::SimdMaskArray<T, N> IsInf(const Vc::SimdArray<T, N> &x)
158{
159 return Vc::isinf(x);
160}
161
162}
163
164} // namespace vecCore
165
166#endif
#define VECCORE_FORCE_INLINE
Definition: Common.h:32
#define VC_MATH_UNARY_FUNCTION(F, f)
Definition: VcSimdArray.h:122
Vc::SimdArray< uint64_t, N > UInt64_v
Definition: VcSimdArray.h:38
Vc::SimdArray< Real_s, N > Real_v
Definition: VcSimdArray.h:26
Vc::SimdArray< double, N > Double_v
Definition: VcSimdArray.h:28
Vc::SimdArray< int32_t, N > Int32_v
Definition: VcSimdArray.h:32
Vc::SimdArray< unsigned int, N > UInt_v
Definition: VcSimdArray.h:35
Vc::SimdArray< int, N > Int_v
Definition: VcSimdArray.h:30
Vc::SimdArray< uint16_t, N > UInt16_v
Definition: VcSimdArray.h:36
Vc::SimdArray< uint32_t, N > UInt32_v
Definition: VcSimdArray.h:37
Vc::SimdArray< int64_t, N > Int64_v
Definition: VcSimdArray.h:33
Vc::SimdArray< float, N > Float_v
Definition: VcSimdArray.h:27
Vc::SimdArray< int16_t, N > Int16_v
Definition: VcSimdArray.h:31
VECCORE_FORCE_INLINE UME::SIMD::SIMDVecMask< N > IsInf(const UME::SIMD::SIMDVec_f< T, N > &x)
VECCORE_FORCE_INLINE VECCORE_ATT_HOST_DEVICE T Rsqrt(const T &x)
Definition: VecMath.h:222
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > CopySign(const Vc::SimdArray< T, N > &x, const Vc::SimdArray< T, N > &y)
Definition: VcSimdArray.h:117
VECCORE_FORCE_INLINE Vc::SimdArray< T, N > Tan(const Vc::SimdArray< T, N > &x)
Definition: VcSimdArray.h:148
VECCORE_ATT_HOST_DEVICE bool MaskEmpty(const M &mask)
VECCORE_ATT_HOST_DEVICE bool MaskFull(const M &mask)
static void Set(M &mask, size_t i, const bool val)
Definition: VcSimdArray.h:62
static void Blend(V &dst, M const &mask, V const &src1, V const &src2)
Definition: VcSimdArray.h:106
static void Assign(V &dst, M const &mask, V const &src)
Definition: VcSimdArray.h:104
typename Vc::SimdArray< T, N >::MaskType MaskType
Definition: VcSimdArray.h:16
typename Vc::SimdArray< T, N >::IndexType IndexType
Definition: VcSimdArray.h:17
static constexpr size_t Size
Definition: Scalar.h:14