Macos 为什么OSX不支持AVX2,而Ubuntu支持?

Macos 为什么OSX不支持AVX2,而Ubuntu支持?,macos,ubuntu,avx2,Macos,Ubuntu,Avx2,我有一台MacBook Pro 2017,带有2.9 GHz Intel Core i7-7820HQ,运行macOS Mojave 10.14.6。当我离开时,我看不到AVX2 $sysctl-a | grep cpu.feat machdep.cpu.feature_位:9221960262849657855 machdep.cpu.features:FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36

我有一台MacBook Pro 2017,带有2.9 GHz Intel Core i7-7820HQ,运行macOS Mojave 10.14.6。当我离开时,我看不到AVX2

$sysctl-a | grep cpu.feat
machdep.cpu.feature_位:9221960262849657855
machdep.cpu.features:FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX SMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 APIC MOVBE POPCCNT PCID XSAVE OSXSAVE OSXSAVE SEGLIM64 TSCR AVX1.0 RDRAND F16C
然而,如果我运行一个ubuntu Docker容器并请求CPU信息,我看到AVX2是受支持的

$docker run-it--rm ubuntu
$grep flags/proc/cpuinfo
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse2 ss ht pbe syscall nx pdpe1gb lm常量(tsc rep)tsc pni pclmulqdq dtes64 ds(cpl ssse3 sdbg fma cx16 RDPR pcid sse4)sse4)sse4(sse4)sse4(sse4)ss(sse2)移动端口)aes AVE XSAVX f16c和虚拟机监控程序fsgsbase bmi1 hle avx2 bmi2 erms rtm xsaveopt arat
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse2 ss ht pbe syscall nx pdpe1gb lm常量(tsc rep)tsc pni pclmulqdq dtes64 ds(cpl ssse3 sdbg fma cx16 RDPR pcid sse4)sse4)sse4(sse4)sse4(sse4)ss(sse2)移动端口)aes AVE XSAVX f16c和虚拟机监控程序fsgsbase bmi1 hle avx2 bmi2 erms rtm xsaveopt arat
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse2 ss ht pbe syscall nx pdpe1gb lm常量(tsc rep)tsc pni pclmulqdq dtes64 ds(cpl ssse3 sdbg fma cx16 RDPR pcid sse4)sse4)sse4(sse4)sse4(sse4)ss(sse2)移动端口)aes AVE XSAVX f16c和虚拟机监控程序fsgsbase bmi1 hle avx2 bmi2 erms rtm xsaveopt arat
标志:fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse2 ss ht pbe syscall nx pdpe1gb lm常量(tsc rep)tsc pni pclmulqdq dtes64 ds(cpl ssse3 sdbg fma cx16 RDPR pcid sse4)sse4)sse4(sse4)sse4(sse4)ss(sse2)移动端口)aes AVE XSAVX f16c和虚拟机监控程序fsgsbase bmi1 hle avx2 bmi2 erms rtm xsaveopt arat
根据英特尔公司的说法,这是一个错误


为什么OS X不报告我的CPU支持AVX2,而它显然支持AVX2?

结果是AVX2出现在一个单独的CPU特性“列表”(machdep.CPU.leaf7_特性)中。请参见

您也可以使用以下方法检测它: sysctl-a | grep hw.optional.avx2_0


主要的cpu功能在hw.optional组下。

MacOS Mojave有多老?它是否在任何CPU上识别AVX2?AVX2没有引入AVX1之外的任何新体系结构状态,因此操作系统本身实际上不需要了解它,用户空间进程就可以使用它和FMA(只要操作系统支持AVX)。所以,也许MacOS变得懒惰,直到AVX512或其他什么时候才停止更新
machdep.cpu.features
。无论如何,是的,您的CPU支持AVX2,就像Haswell或更新版本的所有i3/i5/i7 CPU一样。(我没有Mac电脑,也不知道为什么它的工具不用费心报告CPU功能。)@PeterCordes这是最新的MacOS。然而,我也不记得以前有任何版本报告过AVX2。当我使用这些信息来确定要在我的应用程序(在CMake中)中启用哪些指令集时,如果他们懒得报告,那会很烦人。你知道你可以使用gcc、icc或
clang-O3-march=native
,对吗?这将启用CPU支持的所有
-mavx-maxv2-mfma-mbmi2-mbmi-mpopcnt
等选项,并为CPU设置调整选项,而不是
tune=generic
。它定义了与使用手动选项相同的CPP宏(
\uuuu AVX2\uuuu
)。顺便说一句,如果你重新关注如何在MacOS上检测CMake中的CPU功能,那么你的问题会更多。例如,如果你在一个单独的文件中有AVX2函数,而不是在你编译的文件中只包含
#ifdef
。可能值得再问一个问题,但是如果不使用我描述的方法,编译器如何确定CPU支持哪些指令?使用
cpuid
x86指令。x86上很好地支持运行时CPU检测,包括一个CPUID位,表示操作系统已承诺在上下文交换机上保存/恢复YMM寄存器的高半部,从而可以在没有任何系统调用的情况下,纯粹在用户空间中进行CPU检测。另一种方法是运行指令并捕获SIGILL;在没有CPUID等效项的非x86上可能很有用。