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}}
3. function add(a::m128, b::m128)
4. (VecElement(a[1].value+b[1].value),
5. VecElement(a[2].value+b[2].value),
6. VecElement(a[3].value+b[3].value),
7. VecElement(a[4].value+b[4].value))
8. end
10. triple(c::m128) = add(add(c,c),c)
12. code_native(triple,(m128,))
然而,因为无法依靠自动向量化,未来将大量通过使用llvmcall的库来使用。
原文: <https://juliacn.github.io/JuliaZH.jl/latest/base/simd-types/>
