返回介绍

SIMD 支持

发布于 2019-07-03 15:53:58 字数 871 浏览 1005 评论 0 收藏 0

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

struct VecElement{T}
    value::T
end

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

使用 -O3 参数时,编译器 可能 自动为这样的元组向量化运算符。 例如接下来的程序,使用 julia -O3 编译,在x86系统中会生成两个 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 的库来提供 SIMD 支持。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文