Документация Engee

Поддержка SIMD

Тип VecElement{T} предназначен для создания библиотек SIMD-операций. Для его практического применения необходимо использовать llvmcall. Тип определяется следующим образом.

struct VecElement{T}
    value::T
end

Он имеет специальное правило компиляции: однородный кортеж VecElement{T} сопоставляется с типом LLVM vector, если 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.