SIMD サポート

VecElement{T} は SIMD 演算のライブラリを作成するために存在します。この型を実際に使うときは llvmcall が必要です。VecElement{T} の型は次のように定義されます:

struct VecElement{T}
    value::T
end

この型は特別なコンパイル規則を持ちます: T がプリミティブなビット型のとき、VecElement{T} だけから構成されるタプルは LLVM の vector 型に対応します。

-O3 のとき、コンパイラはそういったタプルを自動的にベクトル化する可能性があります。例えば次のプログラムを julia -O3 でコンパイルすると、x86 システムでは二つの SIMD 加算命令が生成されます:

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 を使うライブラリを通して SIMD 命令を利用することになるでしょう。

広告