SIMD Support

Тип VecElement{T} предназначен для создания библиотек SIMD-операций. Практическое использование этого типа требует использования llvmcall. Тип определяется как:

struct VecElement{T}
    value::T
end

У него есть специальное правило компиляции: однородный кортеж VecElement{T} отображается в тип vector LLVM, когда T является примитивным типом битов.

При -O3 компилятор может автоматически векторизовать операции над такими кортежами. Например, следующая программа, скомпилированная с помощью julia -O3, генерирует две инструкции SIMD сложения (addps) на системах x86:

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,))

Однако, поскольку на автоматическую векторизацию нельзя полагаться, в будущем использование будет в основном через библиотеки, которые используют llvmcall.