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