较旧的 Mac Mini 和较新的 Macbook 之间的数值差异

Numerical differences between older Mac Mini and newer Macbook

我有一个项目,我在 Mac Mini (Core2 Duo) 和 2014 Macbook quadcore i7 上编译。两者都是 运行 Yosemite 的最新版本。该应用程序是单线程的,我正在使用完全相同版本的 cmake 和 clang (xcode) 编译器编译工具和库。由于细微的数字差异,我遇到了测试失败的问题。

我想知道不一致是否来自自动执行处理器特定优化的 clang 编译器(我在 cmake 中没有 select)?处理器之间可能存在差异吗?框架是否使用特定于处理器的优化?我正在使用 Accelerate 框架中的 BLAS/Lapack 例程。它们是从 SuperLU 稀疏矩阵分解包中调用的。

一般来说,您不应期望 BLAS 或 LAPACK 的结果可以跨机器按位重现。实现者调整许多因素以获得最佳性能,所有这些因素都会导致舍入的微小差异:

  • 你的两台机器有不同数量的处理器,这将导致为了线程目的而不同地划分工作(即使你的应用程序是单线程的,BLAS 也可能在内部使用多线程)。
  • 你的两台机器处理超线程的方式完全不同,这也可能导致 BLAS 使用不同数量的线程。
  • 两台机器的缓存和 TLB 层次结构不同,这意味着不同的块大小最适合数据重用。
  • 新机器上的 SIMD 向量大小是旧机器上的两倍,这将再次影响算法的分组方式。
  • 最后,较新的机器支持FMA(并且必须使用FMA才能在其上获得最佳性能); 导致四舍五入的微小差异。

这些因素中的任何一个都足以导致微小的差异;合在一起,应该预期结果不会按位相同。没关系,只要两个结果都满足计算的误差范围。

要使结果完全相同,就需要严格限制较新机器的性能,这会导致您昂贵的硬件被浪费掉。