SIMD Support

タイプ VecElement{T} は、SIMD 操作のライブラリを構築するために意図されています。その実用には llvmcall の使用が必要です。このタイプは次のように定義されています:

struct VecElement{T}
    value::T
end

それには特別なコンパイルルールがあります:VecElement{T}の均質なタプルは、Tがプリミティブビット型であるときにLLVMのvector型にマップされます。

-O3で、コンパイラはそのようなタプルに対する操作を自動的にベクトル化する可能性があります。例えば、次のプログラムは、julia -O3でコンパイルすると、x86システム上で2つの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 を使用するライブラリを介して行われるでしょう。