SIMD 支持

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

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

它有特别的编译规则:当 T 是初始位类型,并且元组长度属于集合 {2-6,8-10,16} 时,VecElement{T} 的同态元组会映射为一个 LLVM vector 类型。

使用 -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 的库来提供 SIMD 支持。