Mac OSX minumum支持sse版本

时间:2017-08-28 10:51:22

标签: c++ macos optimization compiler-optimization sse

可以在osx上启用的最小支持sse标志是什么? 大多数硬件,我现在使用支持sse2。在Windows和Linux上,我有一些代码来测试sse支持。我在某处读到了osx长期以来对sse的支持。但我不知道哪个是可以启用的最低版本。最终的二进制文件将被复制到其他osx平台,因此我不能像GCC一样使用-march = native

如果在所有版本上默认启用它,在构建代码时是否必须传递-msse或-msse2标志?

以下是编译器版本:

Apple LLVM version 6.0 (clang-600.0.56) (based on LLVM 3.5svn)
Target: x86_64-apple-darwin14.1.0
Thread model: posix

这是uname -a

的输出
uname -a
Darwin mme.local 14.1.0 Darwin Kernel Version 14.1.0: Mon Dec 22 23:10:38 PST 2014; root:xnu-2782.10.72~2/RELEASE_X86_64 x86_64

这是sysctl machdep.cpu.features

的输出
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 DTES64 MON DSCPL VMX EST TM2 SSSE3 CX16 TPR PDCM SSE4.1 SSE4.2 POPCNT

1 个答案:

答案 0 :(得分:7)

默认情况下,x86-64启用了SSE2,因为它是x86-64 ISA的必需部分。

由于Apple从未销售任何AMD或Pentium4 CPU,OS X上的x86-64也意味着SSSE3(第一代Core2)。第一批x86 Mac是Core(不是Core2),但它们只是32位。遗憾的是,您不能假设SSE4.1或-mpopcnt

我建议-march=core2 -mtune=haswell 。 (-mtune不会影响兼容性,Haswell调优对于实际的Core2或Nehalem硬件也不应该是坏的。请参阅http://agner.org/optimize/标签wiki中的链接,了解微体系结构的详细信息in(编译器生成的)汇编语言在不同的CPU上都是快速或慢速的。)

(有关不同调整的示例,请参阅How does mtune actually work?,从而在不更改所需的ISA扩展的情况下导致不同的指令选择。)

-march=core2启用core2支持的所有内容,而不仅仅是SSSE3。由于您不关心代码在AMD CPU上运行良好(因为它是OS X),因此您可以调整Intel CPU。还有-mtune=intel更通用,但Haswell应该是合理的。

你可能会错过对Hackintosh系统的支持,其中有人在非Apple硬件上的古老CPU上安装了OS X,但是如果OS X可以在AMD Athlon64 / PhenomII或Intel P4上运行,则IDK。

能够启用像-mpopcnt这样的Nehalem之类的东西会很棒,但Core 2第一代和第二代(Conroe和Penryn)却缺乏这样的东西。甚至SSE4.1也不适用于第一代Core 2。

也可以使用基线和Haswell切片,x86_64x86_64h构建脂肪二进制文件。 Stephen Cannon说(在下面的评论中)“x86_64h切片将在Haswell和后来的μs上自动运行”。 (其他搜索的切片目前不是一种选择,但大多数程序都没什么好处。)

您的x86_64(非Haswell)切片可能应使用-march=core2 -mtune=sandybridge构建。

Haswell推出了AVX2,FMA和BMI2 ,因此-march=haswell对Broadwell / Skylake / Kaby Lake / Coffee Lake非常好。 (对于调整选项以及ISA扩展:gcc -march=haswell禁用-mavx256-split-unaligned-load并存储,而-mavx + tune = default或sandybridge启用它。sucks on Haswell特别是当它创建时当你的数据 几乎总是对齐时,它真的很愚蠢,或者实际上总是如此,但你只是没有告诉编译器它。

Broadwell推出了非常适合的ADOX / ADCX(并行运行两个扩展精度添加依赖链),而Skylake引入了clflushopt并没有广泛用处。

但是,Skylake和大多数Broadwell CPU确实具有可用的事务内存,这对于一些细粒度的多线程情况可能很重要。 (Haswell将会拥有它,但在实现中发现了一个罕见的错误后,它在微代码更新中被禁用。)

AVX512是下一个广泛有用的东西,但Haswell没有,所以也许苹果会在某个时候增加对Cannonlake或Ice Lake切片的支持。

我不建议为Broadwell或Skylake(使用任何调度机制)单独构建,除非您知道可以利用特定的新功能并且它会产生重大影响。

但对于没有AVX2的AVX支持,它可能对Sandybridge有用,特别是对于256位FP数学,但也可以在整数128位向量代码中保存movdqa指令。也适用于SSE4.x和popcnt。使用adc的扩展精度dec/jnz循环中没有部分标记问题。