可以在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
答案 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/和x86标签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_64
和x86_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
并没有广泛用处。
AVX512是下一个广泛有用的东西,但Haswell没有,所以也许苹果会在某个时候增加对Cannonlake或Ice Lake切片的支持。
我不建议为Broadwell或Skylake(使用任何调度机制)单独构建,除非您知道可以利用特定的新功能并且它会产生重大影响。
但对于没有AVX2的AVX支持,它可能对Sandybridge有用,特别是对于256位FP数学,但也可以在整数128位向量代码中保存movdqa
指令。也适用于SSE4.x和popcnt。使用adc
的扩展精度dec/jnz
循环中没有部分标记问题。