我有一个很长的浮点正数列表(std::向量
for (auto v : vec) { sum += v; }
我想我可能有一些数值稳定性问题,因为接近向量
sum
的末尾将比v
大得多。最简单的解决方案是以相反的顺序遍历向量。我的问题是:这是否与正向情况一样有效?我会丢失更多缓存?
还有其他智能解决方案吗?
最简单的解决方案是以相反的顺序遍历向量。我的问题是:这和正向情况一样有效吗?我会有更多的缓存丢失?
是的,它很高效。您硬件中的分支预测和智能缓存策略已针对顺序访问进行了调整。您可以安全地积累您的向量:
#include <numeric>
auto const sum = std::accumulate(crbegin(v), crend(v), 0.f);
我想我会有一些数值稳定性问题
因此,请进行测试。现在你有一个假设的问题,也就是说,没有问题。
如果你测试,假设变成了一个实际的问题,那么你应该担心实际修复它。
也就是说,浮点精度可能会引起问题,但您可以先确认它是否真的对您的数据有影响,然后再将其优先于其他所有内容。
...我会有更多的缓存丢失?
1000个浮点数是4Kb,它可以放在现代大众市场系统的缓存中(如果你想使用另一个平台,请告诉我们它是什么)。
唯一的风险是预取器在向后迭代时不会帮助您,但当然您的向量可能已经在缓存中。在您在完整程序的上下文中分析之前,您无法真正确定这一点,因此在您拥有完整程序之前不必担心它。
还有其他智能解决方案吗?
不要担心可能会成为问题的事情,直到它们真正成为问题。最多值得注意的是可能存在的问题,并对代码进行结构化,以便以后可以用经过仔细优化的解决方案替换最简单的解决方案,而无需重新编写其他所有内容。
我对您的用例进行了基准测试,结果(见附加图像)指向了向前或向后循环不会产生任何性能差异的方向。
您可能还想在硬件编译器上进行测量。
使用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