ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – Mac OSX minumum支持sse版本

2019-07-27 06:06:46  阅读:226  来源: 互联网

标签:c macos optimization sse compiler-optimization x86


在osx上可以启用的最小支持sse标志是什么?
大多数硬件,我现在使用支持sse2.在WindowsLinux上,我有一些代码来测试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/标签wiki中有关微架构详细信息的链接,了解(编译器生成的)汇编语言中的内容是快速的还是在不同的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 disables -mavx256-split-unaligned-load and store,而-mavx tune = default或sandybridge启用它.尤其是当它创建shuffle-port瓶颈时.sucks on Haswell.当你的数据几乎总是对齐时,它真的很蠢,或者实际上总是如此,但你只是没有告诉编译器它.

Broadwell推出了非常适合的ADOX / ADCX(并行运行两个扩展精度添加依赖链),而Skylake引入了clflushopt,这种方法并不广泛.

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

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

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

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

标签:c,macos,optimization,sse,compiler-optimization,x86
来源: https://codeday.me/bug/20190727/1551283.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有