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

Posted

技术标签:

【中文标题】旧款 Mac Mini 和新款 Macbook 之间的数值差异【英文标题】:Numerical differences between older Mac Mini and newer Macbook 【发布时间】:2015-01-31 17:46:05 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢您的回复。你知道加速框架是否: 1. 有关闭线程的方法吗? 2. 是否在运行时使用特定于 CPU 的指令/优化?由于这是一个测试套件,我需要结果是可重现的。我没有浪费性能的问题。我想我只需要说明运行测试的特定平台/架构。 有谁知道 Mac OS X 的 clang 编译器是否会自动进行 cpu 特定的优化? 您可以通过将 VECLIB_MAXIMUM_THREADS 环境变量设置为 1 来禁用加速 BLAS 和 LAPACK 的线程。Accelerate 会在运行时调度到特定于 cpu 的实现。 Clang 将定位您通过标志告诉它定位的架构,但这不会影响加速,这是一个共享库。 是否有关于 Accelerate 的好文档,尤其是关于 cpu 优化的文档?我在网上找到的一个引用线程标志的是旧操作系统。 @Juan:一般来说,最新的文档可以在标题本身中找到,尽管它有些不完整。

以上是关于旧款 Mac Mini 和新款 Macbook 之间的数值差异的主要内容,如果未能解决你的问题,请参考以下文章

新款Macbook 安装任意来源软件教程 mac软件下载资源推荐

新款MacBook Pro发布在即?电池信息已经曝光

旧款Mac开启随航(sideCar)功能

旧款Mac开启随航(sideCar)功能

苹果电脑(Mac mini或Macbook或iMac)恢复出厂设置

macOS系统10.15.4推送更新!修复新款Macbook Air和扩展坞等问题