【问题标题】:What is the minimum version of OS X for use with AVX/AVX2?与 AVX/AVX2 一起使用的 OS X 最低版本是多少?
【发布时间】:2016-11-14 03:02:37
【问题描述】:

我有一个为 SSE、SSE2、SSE3、SSE4.1、SSE4.2、AVX 和 AVX2 编译多次的图像绘制例程。 我的程序通过检查 CPUID 标志来动态调度这些二进制变体之一。

在 Windows 上,如果操作系统不支持它们,我会检查 Windows 的版本并禁用 AVX/AVX2 调度。 (例如,只有 Windows 7 SP1 或更高版本支持 AVX/AVX2。)

我想在 Mac OS X 上做同样的事情,但我不确定哪个版本的 OS X 支持 AVX/AVX2。

请注意,我想知道的是用于 AVX/AVX2 的 OS X 的最低版本。不是支持 AVX/AVX2 的机器型号。

【问题讨论】:

标签: macos sse avx avx2


【解决方案1】:

为了检测指令集特性,我参考了两个源文件:

  1. 神秘的cpu_x86.cpp
  2. Agner Fog 的instrset_detect.cpp

如果您的操作系统支持 AVX 和其他功能,这两个文件都会告诉您如何通过 AVX2 以及 XOP、FMA3、FMA4 检测 SSE。

我已经习惯了 Agner 的代码(MSVC、GCC、Clang、ICC 的一个源文件)所以让我们先看一下。

以下是来自instrset_detect.cpp 的用于检测 AVX 的相关代码片段:

iset = 0;                                              // default value
int abcd[4] = {0,0,0,0};                               // cpuid results
cpuid(abcd, 0);                                        // call cpuid function 0
//....
iset = 6;                                              // 6: SSE4.2 supported
if ((abcd[2] & (1 << 27)) == 0) return iset;           // no OSXSAVE
if ((xgetbv(0) & 6) != 6)       return iset;           // AVX not enabled in O.S.
if ((abcd[2] & (1 << 28)) == 0) return iset;           // no AVX
iset = 7;                                              // 7: AVX supported

xgetbv 定义为

// Define interface to xgetbv instruction
static inline int64_t xgetbv (int ctr) {    
#if (defined (_MSC_FULL_VER) && _MSC_FULL_VER >= 160040000) || (defined (__INTEL_COMPILER) && __INTEL_COMPILER >= 1200) // Microsoft or Intel compiler supporting _xgetbv intrinsic

    return _xgetbv(ctr);                                   // intrinsic function for XGETBV

#elif defined(__GNUC__)                                    // use inline assembly, Gnu/AT&T syntax

   uint32_t a, d;
   __asm("xgetbv" : "=a"(a),"=d"(d) : "c"(ctr) : );
   return a | (uint64_t(d) << 32);

#else  // #elif defined (_WIN32)                           // other compiler. try inline assembly with masm/intel/MS syntax

  //see the source file
}

我没有包含 cpuid 函数(请参阅源代码),并且我从 xgetbv 中删除了非 GCC 内联程序集以缩短答案。

这是来自 Mysticial 的 cpu_x86.cpp 的用于检测 AVX 的 detect_OS_AVX()

bool cpu_x86::detect_OS_AVX(){
    //  Copied from: http://stackoverflow.com/a/22521619/922184

    bool avxSupported = false;

    int cpuInfo[4];
    cpuid(cpuInfo, 1);

    bool osUsesXSAVE_XRSTORE = (cpuInfo[2] & (1 << 27)) != 0;
    bool cpuAVXSuport = (cpuInfo[2] & (1 << 28)) != 0;

    if (osUsesXSAVE_XRSTORE && cpuAVXSuport)
    {
        uint64_t xcrFeatureMask = xgetbv(_XCR_XFEATURE_ENABLED_MASK);
        avxSupported = (xcrFeatureMask & 0x6) == 0x6;
    }

    return avxSupported;
}

Mystical 显然是从 this answer 想出了这个解决方案。

请注意,两个源文件的功能基本相同:检查 OSXSAVE 位 27,检查 CPUID 中的 AVX 位 28,检查来自 xgetbv 的结果。

【讨论】:

  • 非常感谢您的友好解释。我非常了解。现在我知道我有一个坏主意。正确的方法是“Step1:获取 OSXSAVE 位以检查 OS 是否允许 XGETBV 指令。Step2:获取 AVX/AVX2 位。Step3:发出 XGETBV 并检查 OS 是否保存 YMM 寄存器。”但是,我想我的问题的答案是“Mac OS X 10.6.7”:-)
  • @TABATA,您想要计算机答案还是人工答案?从字面上看,计算机的答案会导致崩溃。由于计算机的回答,最近有几辆特斯拉汽车坠毁了。我不认为 SO 的限制性过滤器会导致更高的人通过图灵测试...
  • 当然可以。我已经按照你告诉我的方式实施了。再次感谢。我应该简单地询问检查 AVX 功能的步骤,而不是操作系统版本。下次我会尝试写一个简单的问题。
  • @TABATA:您可以编辑您的问题以消除查看操作系统版本的错误想法,并询问如何检测程序中是否可以使用 AVX / AVX2。既然您知道答案不是特定于操作系统的,您可以根据需要进一步整理问题。但是,在其中提及 Windows 和 OS X 可能并没有什么坏处,因为将来搜索的人可能与您有相同的想法,并且正在寻找 Windows 方式或 OS X 方式。
【解决方案2】:

对于 AVX,答案非常简单:

您至少需要 OS X 10.6.7

请注意,只有 build 10J3250 和 10J4138 支持它。

对于 10.8.4 版本 12E3067 或 12E4022 的 AVX2

【讨论】:

  • 这正是我想知道的。非常感谢,Antzi!
  • @TABATA,削减操作系统版本我认为这不是正确的方法。有一些方法可以询问操作系统是否支持跨平台的 AVX。依靠操作系统版本削减并不是理想的解决方案。
  • @Zboson 是的。我只是为了测试而这样做,但我的许多用户都是为了日常使用而这样做的。 AVX 对 Haswell 处理器征收重税,以至于即使在库存设置下也会过热 (100C+)。投入大量超频,这是灾难的根源。尝试谷歌搜索“Haswell AVX 超频”。情况如此糟糕,以至于许多超频者只是通过 bcdedit 禁用 AVX。那些确实开始报告特定应用程序崩溃的人。 (即那些在 cpuid 中看到 AVX 位后尝试使用 AVX,但没有检查 xsave 位的人。)
  • @Zboson 作为我的 cmets 的更新。 Kaby Lake 允许您设置一个“AVX 偏移”,在运行 AVX 时会降低 CPU 乘数。 Haswell-EP 和 Broadwell-EP 中已经存在此功能。现在您可以使用合适的(可超频)主板/BIOS 来控制 Kaby Lake。
  • @Zboson 是的。几乎每一个 Kaby Lake 超频指南都涵盖了它。只需查看edgeup.asus.com/2017/01/31/kaby-lake-overclocking-guide 并向下滚动到“AVX 偏移”部分。
猜你喜欢
  • 2010-12-08
  • 1970-01-01
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多