Arm 手臂SVE从左到右vs.树缩减

Arm 手臂SVE从左到右vs.树缩减,arm,intrinsics,sve,Arm,Intrinsics,Sve,我目前正在移植一些应用程序,以使用ARM SVE特性和ARM C语言SVE扩展中定义的内在函数 在检查文档后,我遇到了两个函数,它们使用归约法对浮点向量的元素求和。即使用从左到右和基于树的约简 float64_t svadda[_f64](svbool_t pg, float64_t initial, svfloat64_t op); float64_t svaddv[_f64](svbool_t pg, svfloat64_t op); 文件: 这些函数(ADDV)对浮点向量的所有活动元素

我目前正在移植一些应用程序,以使用ARM SVE特性和ARM C语言SVE扩展中定义的内在函数

在检查文档后,我遇到了两个函数,它们使用归约法对浮点向量的元素求和。即使用从左到右和基于树的约简

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产生的结果不同。”


为什么基于树的约简不同于从左到右的约简?它们的意思是因为舍入错误还是我遗漏了什么?

是的,浮点数学由于舍入临时变量而不是很有关联性,所以它关系到操作的顺序


您可能需要严格按照从左到右的顺序来执行正确的操作顺序,否则通常您需要通过提取另一个向量的上半部分,然后垂直添加到第一个向量来进行计算。然后重复此缩小操作,直到缩小到单个元素。

就像这是一组有趣的背景阅读一样这一次,我写了一篇博客,讨论了ASTC纹理压缩器的问题:还要注意,从左到右的顺序比减半的顺序慢,因为它是一个较长的串行计算链。@solidpixel:事实上,严格串行通常只对再现性有利,而不是“更精确”"; 使用统一的数字大小通常不太准确。一棵树是这个向量->标量缩减的完全两两求和;SIMD在阵列上使用多个累加器对和/点积进行矢量化是阵列部分()朝该方向迈出的一步。越小的累加器意味着你要加的东西的大小差异越小,比如假设你的数字不是正负交替的