SIMD 支持

VecElement{T}类型是为了构建SIMD运算符的库。实际使用中 要求使用 llvmcall。类型按下文定义:

  1. struct VecElement{T}
  2. value::T
  3. end

它有特别的编译规则:当T是初始位类型并且元组长度在集合{2-6,8-10,16}中,VecElement{T}的同态元组会映射到LLVMvector中。

-O3处,编译器可能自动为这样的元组向量化运算符。例如 接下来的程序,当用julia -O3编译,在x86系统中会生成两个SIMD附加指令(addps):

  1. const m128 = NTuple{4,VecElement{Float32}}
  2. function add(a::m128, b::m128)
  3. (VecElement(a[1].value+b[1].value),
  4. VecElement(a[2].value+b[2].value),
  5. VecElement(a[3].value+b[3].value),
  6. VecElement(a[4].value+b[4].value))
  7. end
  8. triple(c::m128) = add(add(c,c),c)
  9. code_native(triple,(m128,))

然而,因为无法依靠自动向量化,未来将大量通过使用llvmcall的库来使用。

原文: https://juliacn.github.io/JuliaZH.jl/latest/base/simd-types/