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

时间:2015-01-31 17:46:05

标签: macos clang osx-yosemite floating-accuracy accelerate-framework

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

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

1 个答案:

答案 0 :(得分:2)

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

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

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

使结果相同将需要严格限制新机器的性能,这将导致您的闪亮昂贵的硬件浪费。