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
を使用するライブラリを介して行われるでしょう。