当前位置: 首页 > 知识库问答 >
问题:

有序数的有效稳定和

宗政法
2023-03-14

我有一个很长的浮点正数列表(std::向量

for (auto v : vec) { sum += v; }

我想我可能有一些数值稳定性问题,因为接近向量sum的末尾将比v大得多。最简单的解决方案是以相反的顺序遍历向量。我的问题是:这是否与正向情况一样有效?我会丢失更多缓存?

还有其他智能解决方案吗?


共有3个答案

邹俊友
2023-03-14

最简单的解决方案是以相反的顺序遍历向量。我的问题是:这和正向情况一样有效吗?我会有更多的缓存丢失?

是的,它很高效。您硬件中的分支预测和智能缓存策略已针对顺序访问进行了调整。您可以安全地积累您的向量:

#include <numeric>

auto const sum = std::accumulate(crbegin(v), crend(v), 0.f);
连乐
2023-03-14

我想我会有一些数值稳定性问题

因此,请进行测试。现在你有一个假设的问题,也就是说,没有问题。

如果你测试,假设变成了一个实际的问题,那么你应该担心实际修复它。

也就是说,浮点精度可能会引起问题,但您可以先确认它是否真的对您的数据有影响,然后再将其优先于其他所有内容。

...我会有更多的缓存丢失?

1000个浮点数是4Kb,它可以放在现代大众市场系统的缓存中(如果你想使用另一个平台,请告诉我们它是什么)。

唯一的风险是预取器在向后迭代时不会帮助您,但当然您的向量可能已经在缓存中。在您在完整程序的上下文中分析之前,您无法真正确定这一点,因此在您拥有完整程序之前不必担心它。

还有其他智能解决方案吗?

不要担心可能会成为问题的事情,直到它们真正成为问题。最多值得注意的是可能存在的问题,并对代码进行结构化,以便以后可以用经过仔细优化的解决方案替换最简单的解决方案,而无需重新编写其他所有内容。

王彭薄
2023-03-14

我对您的用例进行了基准测试,结果(见附加图像)指向了向前或向后循环不会产生任何性能差异的方向。

您可能还想在硬件编译器上进行测量。

使用STL执行求和,速度与手动循环数据一样快,但更具表现力。

使用以下方法进行反向累积:

std::accumulate(rbegin(data), rend(data), 0.0f);

而对于远期累积:

std::accumulate(begin(data), end(data), 0.0f);
 类似资料:
  • 本文向大家介绍Java版基数排序[稳定]相关面试题,主要包含被问及Java版基数排序[稳定]时的应答技巧和注意事项,需要的朋友参考一下 原理:分配加收集 复杂度: O(d(n+r)) r为基数d为位数 空间复杂度O(n+r)

  • 问题内容: 下面有没有一种数值稳定的方法来计算softmax函数?我得到的价值在神经网络代码中变成Nans。 问题答案: softmax exp( x )/ sum(exp( x ))实际上在数字上表现良好。它只有正数项,因此我们不必担心重要性下降,并且分母至少与分子一样大,因此可以保证结果介于0到1之间。 唯一可能发生的事故是指数溢出或溢出。 x 的单个元素的上溢或所有元素的下溢将使输出或多或少

  • 根据这个帖子,我们可以通过下面的代码得到一个数的所有约数。 例如,数字的除数是。 在搜索了一些相关的帖子后,我没有找到任何好的解决方案。有什么有效的方法来实现这一点吗? 我的解决方案: 通过这个解求出给定数的所有素因子 得到这些基本因子的所有可能组合 然而,这似乎不是一个好办法。

  • 相信您已经掌握了很多种排序算法,比如冒泡排序、插入排序、希尔排序、选择排序等。这些排序算法中,有些是 "稳定" 的,有些是 "不稳定" 的。 给定的待排序序列中,经常会包含相同的元素,例如: 3 1 2 4 2 此序列中包含两个元素 2,为了区分它们,我们分别称它们为 "红 2" 和 "绿 2"。 评价一个排序算法是否稳定,是指该算法完成排序的同时,是否会改变序列中相同元素的相对位置。例如,上面序

  • 有没有一种数值稳定的方法来计算下面的softmax函数?我得到的值在神经网络代码中变成了Nans。

  • 我正在处理不同年表之间的动态日期格式转换,例如将(民国年表中的)110/02转换为(ISO年表中的)2021或相反。日期和模式都是在运行时给出的。 时间顺序转换要求时间为完整日期,否则抛出异常: DateTimeException:无法应用覆盖年表“Maguo”,因为正在格式化的时间对象包含日期字段但不代表整个日期 基于LocalDate(使用IsoChronology)的操作也失败: DateT