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
endIt 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.