Поддержка 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
.