faster icon indicating copy to clipboard operation
faster copied to clipboard

how to accomplish `zip_mut_with` in faster?

Open jonathanstrong opened this issue 6 years ago • 2 comments

hey,

I have spent a few minutes trying unsuccessfully to write a simd version of code that uses ndarray's zip_mut_with - is there currently a way of combining a simd_iter_mut and simd_iter with zip?

Essentially, I'd like to modify the elements of an array in place with an operation that uses the values in another array of the same shape.

I tried this:

let mut xs = ndarray::Array::from_elem((64,), 0.0f32);
let ys = ndarray::Array::from_elem((64,), 1.0f32);
(xs.as_slice_mut().unwrap().simd_iter_mut(f32s(0.0)),
 ys.as_slice().unwrap().simd_iter(f32s(0.0)))
    .zip()
    .simd_for_each(|(x, y)| {
        *x += *y; // or whatever, not sure if this is correct for the closure
    });

and got this error:

error[E0599]: no method named `simd_for_each` found for type `faster::Zip<(faster::SIMDIter<&mut [f32]>, faster::SIMDIter<&[f32]>)>` in the current scope
   --> src/mlp/m3r.rs:298:26
    |
298 |                         .simd_for_each(|(z, b)| {
    |                          ^^^^^^^^^^^^^
...

Any recommendations for how to proceed? First time using the library, apologies if this is an obvious question.

jonathanstrong avatar May 09 '18 22:05 jonathanstrong

I couldn't work this out either, FWIW. Wasted a lot of time thinking that for_each would do the job, before discovering that it creates a copy that is discarded, rather than mutating the vector in-place.

jesskfullwood avatar May 15 '18 17:05 jesskfullwood

Mutable iterators are still a work in progress. For now, try using simd_do_each or the immutable/functional iterators.

AdamNiederer avatar May 15 '18 19:05 AdamNiederer