SIMD Support

Type VecElement{T} is intended for building libraries of SIMD operations. Practical use of it requires using llvmcall. The type is defined as:

struct VecElement{T}
    value::T
end

It has a special compilation rule: a homogeneous tuple of VecElement{T} maps to an LLVM vector type when T is a primitive bits type.

At -O3, the compiler might automatically vectorize operations on such tuples. For example, the following program, when compiled with julia -O3 generates two SIMD addition instructions (addps) on x86 systems:

const m128 = NTuple{4,VecElement{Float32}}

function add(a::m128, b::m128)
    (VecElement(a[1].value+b[1].value),
     VecElement(a[2].value+b[2].value),
     VecElement(a[3].value+b[3].value),
     VecElement(a[4].value+b[4].value))
end

triple(c::m128) = add(add(c,c),c)

code_native(triple,(m128,))

However, since the automatic vectorization cannot be relied upon, future use will mostly be via libraries that use llvmcall.

Core.VecElement — Type
VecElement{T}

A wrapper type that holds a single value of type T. When used in the context of an NTuple{N, VecElement{T}} where {T, N} object, it provides a hint to the runtime system to align that struct to be more amenable to vectorization optimization opportunities. In ccall, such an NTuple in the type signature will also use the vector register ABI, rather than the usual struct ABI.

source