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
.