草庐IT

c++ - 可以在 macOS 上启用的最低支持 SSE 标志是什么?

coder 2024-02-09 原文

最近我使用的大多数硬件都支持 SSE2。在 Windows 和 Linux 上,我有一些代码来测试 SSE 支持。我在某处看到macOS很早就支持SSE了,但我不知道最低版本可以启用。最终的二进制文件将被复制到其他 macOS 平台,因此我不能像使用 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

最佳答案

SSE2 默认为 x86-64 启用,因为它是 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 上快或慢。)。

(请参阅 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。

如果能够启用一些 Nehalem 的东西就好了,比如 -mpopcnt,但是 Core 2 第一代和第二代(Conroe 和 Penryn)缺少那个。甚至 SSE4.1 在第一代 Core 2 上也不可用。


还可以构建具有基线和 Haswell 切片的胖二进制文件x86_64x86_64h。 Stephen Canon 说(在下面的评论中)“x86_64h 片将在 Haswell 和后来的 µarches 上自动运行”。 (其他 uarches 的切片目前不是一个选项,但大多数程序不会得到什么好处。)

您的 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 尤其是当它造成 shuffle-port 瓶颈时。当你的数据几乎总是对齐时,它真的很愚蠢,或者真的总是但你只是没有'不要告诉编译器。

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

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

AVX512 是下一个广泛使用但 Haswell 没有的重要产品,因此苹果可能会在某个时候增加对 Cannonlake 或 Ice Lake slice 的支持。

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

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

关于c++ - 可以在 macOS 上启用的最低支持 SSE 标志是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45917280/

有关c++ - 可以在 macOS 上启用的最低支持 SSE 标志是什么?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  3. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  4. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  6. ruby - 为什么 4.1%2 使用 Ruby 返回 0.0999999999999996?但是 4.2%2==0.2 - 2

    为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返

  7. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  9. ruby - ruby 中的 TOPLEVEL_BINDING 是什么? - 2

    它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput

  10. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

随机推荐