Mac OSX minumum支持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
对于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中的链接以了解微架构的详细信息,编译器生成的)汇编语言在不同的CPU上快或慢)。
-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。
也可以使用基线和Haswell slice , x86_64
和x86_64h
构建一个胖二进制文件 。 Stephen Cannon说(在下面的评论中)“x86_64h slice将在Haswell和后来的μarches上自动运行”。 (其他人的切片目前不是一种选择,但大多数程序没有什么好处。)
您的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
和store,而-mavx
+ tune = default或sandybridge启用它。它吸引Haswell,特别是当它创建shuffle-port当你的数据几乎总是对齐的时候,或者真的一直都是如此,但是你没有告诉编译器这个问题。
Broadwell推出了相当适合的ADOX / ADCX(并行运行两个扩展精度增加依赖链),Skylake推出了并不广泛使用的clflushopt
。
尽管如此,Skylake和大多数Broadwell CPU都具有可用的事务内存,这对于一些细粒度的多线程情况可能很重要。 (Haswell打算拥有它,但是在执行过程中发现了一个罕见的错误后,它在微代码更新中被禁用。)
AVX512是下一个广泛使用的大事,但Haswell没有,所以也许Apple会在某个时候增加对Cannonlake或Ice Lake片的支持。
我不会建议为Broadwell或Skylake(使用任何调度机制)单独构建,除非您知道您可以利用特定的新功能并使其具有显着差异。
但对于Sandybridge而言,对于不支持AVX2的AVX支持,尤其是对于256位FP数学,可能会非常有用,但也可以用整数128位向量代码保存movdqa
指令。 也适用于SSE4.x和popcnt。 在使用dec/jnz
的扩展精度adc
循环中不存在部分标志问题。
上一篇: Mac OSX minumum support sse version
下一篇: c++