Skip to content

Commit 0f40c17

Browse files
committed
Add new Algorithms using explicit batch type
1 parent e845404 commit 0f40c17

File tree

3 files changed

+427
-93
lines changed

3 files changed

+427
-93
lines changed

Diff for: README.md

+40
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,46 @@ void mean(const vector_type& a, const vector_type& b, vector_type& res)
151151
}
152152
```
153153
154+
Algorithms like `xsimd::reduce` and `xsimd::transform` are available also in the batch explicit modality:
155+
156+
```cpp
157+
template <class C, class T = typename std::decay<decltype(*C().begin())>::type>
158+
T nansum(const C& v)
159+
{
160+
return xsimd::reduce_batch(v.begin(), v.end(), 0.0,
161+
[](auto x, auto y) {
162+
return (std::isnan(x) ? 0.0 : x) + (std::isnan(y) ? 0.0 : y);
163+
},
164+
[](auto x, auto y) {
165+
static decltype(x) zero(0.0);
166+
auto xnan = xsimd::isnan(x);
167+
auto ynan = xsimd::isnan(y);
168+
auto xs = xsimd::select(xnan, zero, x);
169+
auto ys = xsimd::select(ynan, zero, y);
170+
return xs + ys;
171+
});
172+
}
173+
```
174+
175+
To switch from `std::count_if` to `xsimd::count_if`:
176+
177+
```cpp
178+
// v is an aligned vector of int type
179+
auto count_expected = std::count_if(v.begin(), v.end(),
180+
[](auto x) {
181+
return x >= 50 && x <= 70 ? 1 : 0;
182+
});
183+
auto count = xsimd::count_if(v.begin(), v.end(),
184+
[](auto x) {
185+
return x >= 50 && x <= 70 ? 1 : 0;
186+
},
187+
[](auto b) {
188+
static decltype(b) zero(0);
189+
static decltype(b) one(1);
190+
return xsimd::hadd(xsimd::select(b >= 50 && b <= 70, one, zero));
191+
});
192+
assert(count_expected == count);
193+
```
154194
155195
## Building and Running the Tests
156196

0 commit comments

Comments
 (0)