SIMD 支援

類型 VecElement{T} 用於建置 SIMD 作業的函式庫。實際使用時需要使用 llvmcall。此類型定義為

struct VecElement{T}
    value::T
end

它有一個特殊的編譯規則:當 T 是原始位元類型時,一個同質的 VecElement{T} 元組會對應到一個 LLVM vector 類型。

-O3 時,編譯器可能會自動向量化此類元組上的作業。例如,當使用 julia -O3 編譯以下程式時,它會在 x86 系統上產生兩個 SIMD 加法指令 (addps)

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 的函式庫。