If you want to use the SIMD package, then you need to manually vectorized
the code. That is, all (most of) the local variables you're using will have
a SIMD `Vec` type. For convenience, your input and output arrays will
likely still hold scalar values, and the `vload` and vstore` functions
access scalar arrays, reading/writing SIMD vectors. The function you quote
above (from the SIMD examples) does just this.

What vector length `N` is best depends on the particular machine. Usually,
you would look at the CPU instruction set and choose the largest SIMD
vector size that the CPU supports, but sometimes twice that size or half
that size might also work well. Note that using a larger SIMD vector size
roughly corresponds to loop unrolling, which might be beneficial if the
compiler isn't clever enough to do this automatically.

There's additional complication if the array size is not a multiple of the
vector size. In this case, extending the array via dummy elements if often
the easiest way to go.

Note that SIMD vectorization is purely a performance improvement. It does
not make sense to make such changes without measuring performance before
and after. Given the low-level nature if the changes, looking at the
generated assembler code via `@code_native` is usually also insightful.

I'll be happy to help if you have a specific problem on which you're
working.

-erik


On Thu, Oct 13, 2016 at 9:51 AM, Florian Oswald <florian.osw...@gmail.com>
wrote:

> ok thanks! and so I should define my SIMD-able function like
>
> function vadd!{N,T}(xs::Vector{T}, ys::Vector{T}, ::Type{Vec{N,T}})
>     @assert length(ys) == length(xs)
>     @assert length(xs) % N == 0
>     @inbounds for i in 1:N:length(xs)
>         xv = vload(Vec{N,T}, xs, i)
>         yv = vload(Vec{N,T}, ys, i)
>         xv += yv
>         vstore(xv, xs, i)
>     endend
>
> i.e. using vload() and vstore() methods?
>
>
> On Thursday, 13 October 2016 15:29:50 UTC+2, Valentin Churavy wrote:
>>
>> If you want explicit simd the best way right now is the great SIMD.jl
>> package https://github.com/eschnett/SIMD.jl  it is builds on top of
>> VecElement.
>>
>> In many cases we can perform automatic vectorisation, but you have to
>> start Julia with -O3
>>
>> On Thursday, 13 October 2016 22:15:00 UTC+9, Florian Oswald wrote:
>>>
>>> i see on the docs http://docs.julialang.org/en/release-0.5/stdlib/simd-
>>> types/?highlight=SIMD that there is a vecElement that is build for SIMD
>>> support. I don't understand if as a user I should construct vecElement
>>> arrays and hope for some SIMD optimization? thanks.
>>>
>>>


-- 
Erik Schnetter <schnet...@gmail.com>
http://www.perimeterinstitute.ca/personal/eschnetter/

Reply via email to