00001 #ifndef DUNE_COMMON_SIMD_HH
00002 #define DUNE_COMMON_SIMD_HH
00003
00020 #include <dune/common/rangeutilities.hh>
00021 #include <dune/common/conditional.hh>
00022 #if HAVE_VC
00023 #include <Vc/Vc>
00024 #endif
00025
00026 namespace Dune
00027 {
00028
00029 template<typename T>
00030 struct SimdScalarTypeTraits
00031 {
00032 using type = T;
00033 };
00034
00035 template<typename T>
00036 using SimdScalar = typename SimdScalarTypeTraits<T>::type;
00037
00038 #if HAVE_VC
00039
00040
00041
00042 template<typename T, typename A>
00043 struct SimdScalarTypeTraits< Vc::Vector<T,A> >
00044 {
00045 using type = T;
00046 };
00047
00048 template<typename T, std::size_t N, typename V, std::size_t M>
00049 struct SimdScalarTypeTraits< Vc::SimdArray<T,N,V,M> >
00050 {
00051 using type = T;
00052 };
00053 #endif // HAVE_VC
00054
00055 #if HAVE_VC
00056
00057
00058
00059 template<typename T, typename A>
00060 Vc::Vector<T,A> cond(const Vc::Mask<T,A> & b,
00061 const Vc::Vector<T,A> & v1,
00062 const Vc::Vector<T,A> & v2)
00063 {
00064 return std::move(Vc::iif(b, v1, v2));
00065 }
00066
00067 template<typename T, std::size_t N, typename V, std::size_t M>
00068 Vc::SimdArray<T,N,V,M> cond(const typename Vc::SimdArray<T,N,V,M>::mask_type & b,
00069 const Vc::SimdArray<T,N,V,M> & v1,
00070 const Vc::SimdArray<T,N,V,M> & v2)
00071 {
00072 return std::move(Vc::iif(b, v1, v2));
00073 }
00074 #endif // HAVE_VC
00075
00076 #if HAVE_VC
00077
00078
00079
00080
00081
00082 template<typename T, typename A>
00083 T max_value(const Vc::Vector<T,A> & v)
00084 {
00085 return v.max();
00086 }
00087
00088 template<typename T, std::size_t N, typename V, std::size_t M>
00089 double max_value(const Vc::SimdArray<T,N,V,M> & v)
00090 {
00091 return v.max();
00092 }
00093
00094 template<typename T, typename A>
00095 T min_value(const Vc::Vector<T,A> & v)
00096 {
00097 return v.min();
00098 }
00099
00100 template<typename T, std::size_t N, typename V, std::size_t M>
00101 double min_value(const Vc::SimdArray<T,N,V,M> & v)
00102 {
00103 return v.min();
00104 }
00105
00106 template<typename T, typename A>
00107 bool any_true(const Vc::Mask<T,A> & v)
00108 {
00109 return Vc::any_of(v);
00110 }
00111
00112 template<typename T, std::size_t N, typename V, std::size_t M>
00113 bool any_true(const Vc::SimdMaskArray<T,N,V,M> & v)
00114 {
00115 return Vc::any_of(v);
00116 }
00117
00118 template<typename T, typename A>
00119 bool all_true(const Vc::Mask<T,A> & v)
00120 {
00121 return Vc::all_of(v);
00122 }
00123
00124 template<typename T, std::size_t N, typename V, std::size_t M>
00125 bool all_true(const Vc::SimdMaskArray<T,N,V,M> & v)
00126 {
00127 return Vc::all_of(v);
00128 }
00129 #endif // HAVE_VC
00130
00131 }
00132
00133 #endif // DUNE_COMMON_SIMD_HH