4

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

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

在此处输入图像描述

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

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

在此处输入图像描述

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

4

2 回答 2

2

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

为了提高效率,一些 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,他们在编译这些库时是否特别注意确保浮点确定性结果。

于 2012-08-24T10:36:36.573 回答
1

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

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

根据这个链接

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

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

于 2012-08-24T02:33:11.003 回答