【问题标题】:Different results for the same algorithm in matlabmatlab中相同算法的不同结果
【发布时间】:2012-08-19 14:33:26
【问题描述】:

我正在做一项线性代数作业,以比较 QR 分解算法 Gram-Schmidt 和 Householder 的性能和稳定性。

我在计算下表时产生了疑问:

其中矩阵 Q 和 R 是将 Gram-Schmidt 和houseler 应用于希尔伯特矩阵 A 的 QR 分解的结果矩阵,I 是维度 N 的单位矩阵;和 || * ||是 Frobenius 范数。

当我在不同的计算机上进行计算时,在某些情况下我会得到不同的结果,可能是因为这个?上表对应的是在 32 位计算机中执行的计算,下一个表是在 64 位计算机中执行的:

matlab 中的这些结果涉及进行计算的计算机体系结构?

【问题讨论】:

  • 我今天至少花了一个小时试图弄清楚为什么我在两个不同的盒子上得到不同的结果。结果我在一个盒子上得到了两个测试输入反转。
  • Hot Licks,如果您的结果与 Melkhiah66 不同,请出示。
  • 您要求的是浮点确定性...如果您想了解实现它的难度,这里有一个来自 Glenn Fiedler gafferongames.com/networking-for-game-programmers/… 的好博客

标签: matlab matrix linear-algebra


【解决方案1】:

如果你找到答案,我真的很感兴趣!
不幸的是,很多事情都会改变数值结果...

为了提高效率,一些 LAPACK 算法迭代子矩阵块。为了获得最佳效率,块的大小必须以某种方式适应 CPU L1/L2/L3 缓存的大小...

块的大小由 LAPACK 例程 ILAENV 控制,参见http://www.netlib.org/lapack/lug/node120.html

当然,如果块大小不同,结果会在数值上有所不同...可能是Matlab提供的lapack/BLAS DLL在两台机器上使用不同调优的ILAENV版本编译,或者ILAENV已被替换使用考虑到缓存大小的定制优化版本,您可以自己检查制作一个调用 ILAENV 的小型 C 程序并将其链接到 Matlab 提供的 DLL...

对于底层的 BLAS,情况更糟:如果使用优化版本,某些融合的 mul-add FPU 指令可能会在示例可用时使用,并且它们不一定在所有 FPU 上都可用。 AFAIK,Matlab 使用 ATLAS http://math-atlas.sourceforge.net/,你必须询问图书馆是如何产生的......你必须跟踪基本代数运算结果的差异(如矩阵 * 向量或矩阵 * 矩阵...... )。

更新:即使 ILAENV 相同,QR 也使用基本旋转,因此它显然依赖于 sin/cos 实现。不幸的是,没有标准准确地说明 sin 和 cos 应该如何按位表现,它们可能与舍入的精确结果相差几个 ulp,并且从一个库到另一个库会有所不同,并且会在不同的架构/编译器上给出不同的结果(在 x87 FPU 中硬连线)。因此,除非您提供您自己版本的这些函数(或在 ADA 中工作)并使用特制的编译器选项编译它们,并且可能精细控制 FPU 模式,否则几乎没有机会在不同架构上找到完全相同的结果......您将还必须询问 Matlab,他们在编译这些库时是否特别注意确保浮点确定性结果。

【讨论】:

    【解决方案2】:

    这取决于 matlab 的实现。在相同架构上重新运行时,您会得到相同的结果吗?如果是,这个问题可能是由精度引起的。有时,它是由 CPU 的不同 FPU(floatingpoint process uint)引起的。您可以尝试更多具有不同 CPU 的 32 位/64 位。

    最好的答案应该是您的 matlab 提供商的回复。如果您有有效的许可证,只需打电话给他们。

    据此link

    差异的一个原因是,如果使用 x87 指令进行计算,它会保持 80 位精度。根据编译器的优化,它的数字可能会在一些操作中保持在 80 位,然后被截断回 64 位。这可能会导致变化。请参阅http://gcc.gnu.org/wiki/x87note 了解更多信息。

    gcc 手册页说在 x86-64 平台上默认使用 sse(而不是 387)。您应该能够使用类似的东西将其强制为 32 位 -mfpmath=sse -msse -msse2

    【讨论】:

    • 我希望 Matlab 始终使用相同的精度。一个 CPU 是 32 位,另一个 CPU 是 64 位这一事实不应该改变算术的方式——IEEE 浮点数在所有情况下都应该是相同的,整数算术应该以相同的精度进行。
    • @HotLicks 同意,但不幸的是,这可能是一厢情愿的情况 :) 如果您尝试编译 ATLAS 和 LAPACK 以便它们在多个架构上按位相同,您就会明白这有多难,以及为什么不能责怪 Mathworks……他们使用的库不能满足这样的要求。当然,他们可以重写他们使用的每个库,甚至可以模拟浮点运算!那将是一个新产品,称之为 slowlab(但它的编写速度也会很慢,所以不要指望在未来 10 年内发布)。
    猜你喜欢
    • 2021-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2013-04-09
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多