Dune Core Modules (2.7.1)

defaults.hh
Go to the documentation of this file.
1 #ifndef DUNE_COMMON_SIMD_DEFAULTS_HH
2 #define DUNE_COMMON_SIMD_DEFAULTS_HH
3 
15 #include <algorithm>
16 #include <cstddef>
17 #include <type_traits>
18 
20 #include <dune/common/simd/base.hh>
22 #include <dune/common/typelist.hh>
24 
25 namespace Dune {
26  namespace Simd {
27  namespace Overloads {
28 
45  template<class V>
46  decltype(auto) lane(ADLTag<0>, std::size_t l, V v) = delete;
47 
49  template<class V>
50  constexpr V implCast(ADLTag<0>, MetaType<V>, const V &u)
51  {
52  return u;
53  }
54 
56  template<class V, class U>
57  constexpr V implCast(ADLTag<0>, MetaType<V>, const U &u)
58  {
59  V result(Simd::Scalar<V>(0));
60  for(auto l : range(Simd::lanes(u)))
61  Simd::lane(l, result) = Simd::lane(l, u);
62  return result;
63  }
64 
66  template<class V, class S>
68  {
69  return V(Simd::Scalar<V>(s));
70  }
71 
73  template<class V>
75  const V &ifTrue, const V &ifFalse) = delete;
76 
78  template<class V>
79  auto max(ADLTag<0>, const V &v1, const V &v2)
80  {
81  using std::max;
82  return max(v1, v2);
83  }
84 
86  template<class V>
87  auto min(ADLTag<0>, const V &v1, const V &v2)
88  {
89  using std::min;
90  return min(v1, v2);
91  }
92 
94  template<class Mask>
95  bool anyTrue(ADLTag<0>, const Mask &mask) = delete;
96 
98 
101  template<class Mask>
102  bool allTrue(ADLTag<0>, const Mask &mask)
103  {
104  return !Dune::Simd::anyTrue(!mask);
105  }
106 
108 
111  template<class Mask>
112  bool anyFalse(ADLTag<0>, const Mask &mask)
113  {
114  return Dune::Simd::anyTrue(!mask);
115  }
116 
118 
121  template<class Mask>
122  bool allFalse(ADLTag<0>, const Mask &mask)
123  {
124  return !Dune::Simd::anyTrue(mask);
125  }
126 
128  template<class V>
129  auto max(ADLTag<0>, const V &v)
130  {
131  Scalar<V> m = Simd::lane(0, v);
132  for(std::size_t l = 1; l < Simd::lanes(v); ++l)
133  if(m < Simd::lane(l, v))
134  m = Simd::lane(l, v);
135  return m;
136  }
137 
139  template<class V>
140  auto min(ADLTag<0>, const V &v)
141  {
142  Scalar<V> m = Simd::lane(0, v);
143  for(std::size_t l = 1; l < Simd::lanes(v); ++l)
144  if(Simd::lane(l, v) < m)
145  m = Simd::lane(l, v);
146  return m;
147  }
148 
150  template<class V>
151  Mask<V> mask(ADLTag<0, std::is_same<V, Mask<V> >::value>,
152  const V &v)
153  {
154  return v;
155  }
156 
158  template<class V>
159  auto mask(ADLTag<0, !std::is_same<V, Mask<V> >::value>,
160  const V &v)
161  {
162  using Copy = AutonomousValue<V>; // just in case we are handed a proxy
163  return v != Copy(Scalar<Copy>(0));
164  }
165 
167  template<class V1, class V2>
168  auto maskOr(ADLTag<0>, const V1 &v1, const V2 &v2)
169  {
170  return Simd::mask(v1) || Simd::mask(v2);
171  }
172 
174  template<class V1, class V2>
175  auto maskAnd(ADLTag<0>, const V1 &v1, const V2 &v2)
176  {
177  return Simd::mask(v1) && Simd::mask(v2);
178  }
179 
182  } // namespace Overloads
183  } // namespace Simd
184 } // namespace Dune
185 
186 #endif // DUNE_COMMON_SIMD_DEFAULTS_HH
Basic definitions for SIMD Implementations.
User interface of the SIMD abstraction.
typename AutonomousValueType< T >::type AutonomousValue
Type free of internal references that T can be converted to.
Definition: typetraits.hh:639
constexpr V implCast(ADLTag< 0 >, MetaType< V >, const V &u)
implements Simd::implCast<V>(V)
Definition: defaults.hh:50
auto min(ADLTag< 0 >, const V &v)
implements Simd::minValue()
Definition: defaults.hh:140
bool allFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::allFalse()
Definition: defaults.hh:122
bool allTrue(ADLTag< 0 >, const Mask &mask)
implements Simd::allTrue()
Definition: defaults.hh:102
auto max(ADLTag< 0 >, const V &v)
implements Simd::maxValue()
Definition: defaults.hh:129
Mask< V > mask(ADLTag< 0, std::is_same< V, Mask< V > >::value >, const V &v)
implements Simd::mask()
Definition: defaults.hh:151
auto maskAnd(ADLTag< 0 >, const V1 &v1, const V2 &v2)
implements Simd::maskAnd()
Definition: defaults.hh:175
auto maskOr(ADLTag< 0 >, const V1 &v1, const V2 &v2)
implements Simd::maskOr()
Definition: defaults.hh:168
bool anyFalse(ADLTag< 0 >, const Mask &mask)
implements Simd::anyFalse()
Definition: defaults.hh:112
auto min(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::min()
Definition: defaults.hh:87
auto broadcast(ADLTag< 0 >, MetaType< V >, S s)
implements Simd::broadcast<V>()
Definition: defaults.hh:67
auto max(ADLTag< 0 >, const V &v1, const V &v2)
implements binary Simd::max()
Definition: defaults.hh:79
bool anyTrue(const Mask &mask)
Whether any entry is true
Definition: interface.hh:427
auto mask(const V &v)
Convert to mask, analogue of bool(s) for scalars.
Definition: interface.hh:487
constexpr std::size_t lanes()
Number of lanes in a SIMD type.
Definition: interface.hh:303
decltype(auto) lane(std::size_t l, V &&v)
Extract an element of a SIMD type.
Definition: interface.hh:322
Rebind< bool, V > Mask
Mask type type of some SIMD type.
Definition: interface.hh:287
typename Overloads::ScalarType< std::decay_t< V > >::type Scalar
Element type of some SIMD type.
Definition: interface.hh:233
Dune namespace.
Definition: alignedallocator.hh:14
const T1 cond(bool b, const T1 &v1, const T2 &v2)
conditional evaluate
Definition: conditional.hh:26
Utilities for reduction like operations on ranges.
A type that refers to another type.
Definition: typelist.hh:33
Tag used to force late-binding lookup in Dune::Simd::Overloads.
Definition: base.hh:180
Traits for type conversions and type information.
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden  |  generated with Hugo v0.80.0 (May 8, 22:30, 2024)