ARM SVE 从左到右与树减少
Posted
技术标签:
【中文标题】ARM SVE 从左到右与树减少【英文标题】:ARM SVE Left-to-right vs. tree reduction 【发布时间】:2019-01-18 09:02:53 【问题描述】:我目前正在移植一些应用程序以使用 ARM SVE 功能和 SVE 的 ARM C 语言扩展中定义的内在函数。
在检查文档后,我发现了两个函数来使用归约来总结浮点向量的元素。那是使用从左到右和基于树的归约。
float64_t svadda[_f64](svbool_t pg, float64_t initial, svfloat64_t op);
float64_t svaddv[_f64](svbool_t pg, svfloat64_t op);
文档:
这些函数 (ADDV) 对浮点向量的所有活动元素求和。他们使用基于树的缩减而不是从左到右的缩减,因此结果可能与 ADDA 产生的结果不同。”
为什么基于树的归约不同于从左到右的归约?他们的意思是因为舍入错误还是我遗漏了什么?
【问题讨论】:
【参考方案1】:是的,由于四舍五入的临时性,浮点数学的关联性不太好,所以执行操作的顺序很重要。
您可能需要严格的从左到右的顺序来准确地实现正确的操作顺序,否则通常您会通过将高半部分提取到另一个向量然后垂直添加到第一个向量来进行 hsum。然后重复这个缩小,直到你只剩下一个元素。
【讨论】:
就像这是一组有趣的背景阅读,我写了一篇关于使用 ASTC 纹理压缩器解决这个问题的博客:solidpixel.github.io/2021/02/25/invariant-tail.html 另请注意,从左到右的顺序会比减半的速度慢,因为它是一个较长的串行计算链。 @solidpixel:确实,严格序列通常只对再现性有好处,而不是“更准确”;具有统一的数字大小通常不太准确。对于此向量->标量缩减,树是完全成对求和; SIMD 在一个数组上使用多个累加器对一个和/点积进行矢量化是数组部分朝这个方向迈出的一步 (Simd matmul program gives different numerical results)。更小的累加器意味着你添加的东西的幅度差异更小,假设你的数字不是交替的正/负例如以上是关于ARM SVE 从左到右与树减少的主要内容,如果未能解决你的问题,请参考以下文章