Julia: 考虑添加一个 `VecTuple{N,T}` 来保存 N 个 `VecElements{T}`

创建于 2017-03-14  ·  3评论  ·  资料来源: JuliaLang/julia

我知道 SIMD.jl 的存在。 但是,我相信 Julia base 本身应该以更简单的方式支持 SIMD 向量的基本代码生成,并在包装​​元组中隐藏一些细节,而不是简单地隐藏在底层类型中。

因此,我的建议是定义某种类型VecTuple{N,T} ,它本质上等同于当前的NTuple{N, VecElement{T}} 。 不同之处在于VecElement属性将在需要时隐式应用,但绑定到元组而不是元素。 这样,访问元组的各个元素就不需要经过额外的转换T <-> VecElement{T} 。 当前访问NTuple{N, VecElement{T}}的单个元素需要x[i].value而不是简单的x[i]

此外,对总类型大小和对齐的要求,或者根本允许哪些基本类型(位大小 8 到 64),将与专用元组相关联。 另见#20961。

我不建议将 SIMD 向量上的所有可能操作添加到 Julia base。 肯定有太多(考虑洗牌、移调或反转)。 暂时这仍然可以全部留给专门的包,只是改变最基本的 LLVM 代码生成属性与元组的链接方式。

VecTuple当然只是这个问题上任何方便名称的占位符。)

simd speculative types and dispatch

最有用的评论

关于如何进行的一个想法是创建一个新的包,描述您认为应该进入 base 的内容。 称之为SIMDBase 。 然后我们可以将SIMD重新定位到该包,这将 - 如果您的假设是正确的 - 简化SIMD 。 一旦人们同意SIMDBase提供的功能,它就可以移到 Base 中。

例如,我不介意某些低级 LLVM 调用扭曲是否可以在其他地方处理。

所有3条评论

提醒其他人,我们没有 VecTuple,因为 Tuple 没有被定义为一种抽象向量,所以谈论向量化元组是术语的部分冲突。

关于如何进行的一个想法是创建一个新的包,描述您认为应该进入 base 的内容。 称之为SIMDBase 。 然后我们可以将SIMD重新定位到该包,这将 - 如果您的假设是正确的 - 简化SIMD 。 一旦人们同意SIMDBase提供的功能,它就可以移到 Base 中。

例如,我不介意某些低级 LLVM 调用扭曲是否可以在其他地方处理。

作为参考,此处还详细讨论了 SIMD 内在类型:#2299

我会尝试提出一些可行的概念......可能需要一点时间。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

StefanKarpinski picture StefanKarpinski  ·  141评论

shelakel picture shelakel  ·  232评论

StefanKarpinski picture StefanKarpinski  ·  249评论

JeffBezanson picture JeffBezanson  ·  145评论

mbauman picture mbauman  ·  276评论