16#ifndef Simd_template_included
17#define Simd_template_included
26#include <Kokkos_SIMD.hpp>
39template<
typename _TYPE_>
45 using simd_type = Kokkos::Experimental::native_simd<_TYPE_>;
57 return int(simd_type::size());
68 assert(idx>=0 && idx<
size());
78 assert(idx>=0 && idx<
size());
90 for(
int ivec = 0; ivec <
size(); ivec++)
108using RightSimdArrayView = Kokkos::View<Simd_double*,Kokkos::LayoutRight>;
109using RightSimdTabView = Kokkos::View<Simd_double**,Kokkos::LayoutRight>;
112using tag_type = Kokkos::Experimental::element_aligned_tag;
120inline int aligned(
const void *ptr,
int size)
123 return ((uintptr_t)ptr & (uintptr_t)(size-1)) == 0;
131template<
typename _TYPE_>
136 v.
data_.copy_from(data,tag_type());
148template<
typename _TYPE_>
152 x.
data_.copy_to(data, tag_type());
161template<
typename _TYPE_>
166 v.
data_.copy_from(data+1,tag_type());
176template<
typename _TYPE_>
181 v.
data_.copy_from(data-1,tag_type());
191template<
typename _TYPE_>
195 left.
data_.copy_from(data-1, tag_type());
196 center.
data_.copy_from(data, tag_type());
206template<
typename _TYPE_>
207inline void SimdGetCenterRight(
const _TYPE_ *data,
212 center.
data_.copy_from(data, tag_type());
213 right.
data_.copy_from(data+1, tag_type());
223template<
typename _TYPE_>
224inline void SimdGetLeftCenterRight(
const _TYPE_ *data,
230 left.
data_.copy_from(data-1, tag_type());
231 center.
data_.copy_from(data, tag_type());
232 right.
data_.copy_from(data+1, tag_type());
243template<
typename _TYPE_>
244inline void SimdGetLeftleftLeftCenterRight(
const _TYPE_ *data,
251 leftleft.
data_.copy_from(data-2, tag_type());
252 left.
data_.copy_from(data-1, tag_type());
253 center.
data_.copy_from(data, tag_type());
254 right.
data_.copy_from(data+1, tag_type());
266template<
typename _TYPE_>
268template<
typename _TYPE_>
270template<
typename _TYPE_>
275template<
typename _TYPE_>
277template<
typename _TYPE_>
279template<
typename _TYPE_>
286template<
typename _TYPE_>
288template<
typename _TYPE_>
290template<
typename _TYPE_>
293template<
typename _TYPE_>
295template<
typename _TYPE_>
297template<
typename _TYPE_>
300template<
typename _TYPE_>
304 return Kokkos::abs(a.
data_);
306 return std::abs(a.
data_);
310template<
typename _TYPE_>
314 return Kokkos::exp(a.
data_);
316 return std::exp(a.
data_);
320template<
typename _TYPE_>
324 return Kokkos::sqrt(a.
data_);
326 return std::sqrt(a.
data_);
331template<
typename _TYPE_>
342template<
typename _TYPE_>
353template<
typename _TYPE_>
360template<
typename _TYPE_>
375template<
typename _TYPE_>
383 where(x1.
data_ < x2.
data_, res.data_) = value_if_x1_lower_than_x2.
data_;
This class provides a generic access to simd operations on x86, x86 AMD and ARM architectures.
void operator+=(Simd_template a)
void operator-=(Simd_template a)
_TYPE_ & operator[](int idx)
void operator*=(Simd_template a)
_TYPE_ operator[](int idx) const