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

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

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

【问题讨论】:

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


    【解决方案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:一般来说,最新的文档可以在标题本身中找到,尽管它有些不完整。
    猜你喜欢
    • 2012-04-04
    • 2020-01-24
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    相关资源
    最近更新 更多