为什么 -march=native 很少使用?

2024-05-08

对于大多数 C/C++ 编译器,有一个可传递给编译器的标志,-march=native,它告诉编译器调整为主机 CPU 的微架构和 ISA 扩展生成的代码。即使它的名称不同,基于 LLVM 的编译器通常也有一个等效的选项,例如rustc or swiftc.

根据我自己的经验,这个标志可以为数字密集型代码提供巨大的加速,并且它sounds就像您为自己的机器编译的代码不会有任何妥协一样。也就是说,我认为我没有见过任何默认启用它的构建系统或静态编译器:

  • 显然,任何需要您传递它的命令行编译器可执行文件默认情况下都不使用它。

  • 我想不出有任何 IDE 默认启用此功能。

  • 我想不出我使用过的任何常见构建系统(cmake, automake, cargo, spm等),默认情况下启用它,即使对于优化的构建也是如此。

我可以想到几个原因,但没有一个是真正令人满意的:

  • Using -march=native不适用于将分发到其他计算机的二进制文件。也就是说,我发现自己为自己的机器编译源代码的频率比为其他机器编译源代码的频率要高得多,这并不能解释它在调试版本中缺乏使用的原因,因为在调试版本中没有分发的意图。

  • 至少在 Intel x86 CPU 上,我的理解是,很少使用 AVX 指令可能会降低性能或电源效率,因为 AVX 单元在不使用时会断电,需要加电才能使用,而且很多 Intel CPU降频以运行 AVX 指令。尽管如此,它只是解释了为什么 AVX 不会被启用,而不是为什么代码不会针对特定微架构处理常规指令进行调整。

  • 由于大多数 x86 CPU 使用带有寄存器重命名的奇特的无序超标量管道,因此针对特定微架构调整代码可能并不是特别重要。即便如此,如果could帮忙,为什么不使用它?


保守的

如果您仔细查看列表中最古老的编译器 gcc 的默认值,您会发现它们非常保守:

  • 默认情况下,在 x86 上,仅激活 SSE 2;连SSE 4都没有。
  • 中的标志集-Wall and -Wextra多年来没有改变;有新的有用警告,它们没有添加到-Wall or -Wextra.

为什么?因为它会破坏东西!

整个开发链都依赖于这些方便的默认设置,任何更改都会带来破坏它们或生成无法在目标上运行的二进制文件的风险。

用户越多,威胁就越大,因此 gcc 的开发人员非常非常保守,以避免全球范围内的破坏。下一批编译器的开发人员追随前辈的脚步:事实证明它是有效的。

Note: rustc将默认为静态链接,并声称您可以复制二进制文件并将其放在另一台机器上;明显地-march=native那里将会成为一个障碍。

大众友好

事实上,这可能并不重要。其实你自己也认识到了:

根据我自己的经验,这个标志可以为数字密集型代码提供巨大的加速

大多数代码充满了虚拟调用和分支(通常是面向对象代码),并且根本不是数字密集型的。因此,对于大多数代码来说,SSE 2 通常就足够了。

无论如何,性能真正重要的少数代码库将需要在代码和编译器级别上投入大量时间进行性能调整。如果矢量化很重要,它不会由编译器随意决定:开发人员将使用内置的内在函数并自己编写矢量化代码,因为它比安装监控工具来确保自动矢量化确实发生要便宜。

此外,即使对于数字密集型代码,主机和目标机也可能略有不同。编译受益于大量内核,即使在较低频率下也是如此,而执行受益于高频率和可能更少的内核,除非工作可以轻松并行化。

结论

未激活-march=native默认使用户更容易上手;因为即使是追求绩效的人也可能不太关心它,这意味着失去的比得到的更多。


在另一种历史中,默认情况是-march=native从一开始就;用户将用于指定目标架构,我们不会进行此讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 -march=native 很少使用? 的相关文章

随机推荐

  • 将变量从 PHP 传递到 JavaScript 的有效方法[重复]

    这个问题在这里已经有答案了 有时我必须将一些变量从 PHP 传递到 JS 脚本 现在我是这样做的 var js variable 但这非常丑陋 我无法在 js 文件中隐藏我的 JS 脚本 因为它必须由 PHP 解析 处理这个问题的最佳解决方
  • 基于 Windows 8 ARM 的平板电脑上的 VB6

    随着 Windows 8 将支持 VB6 我的问题是 Microsoft 是否在任何地方表示 是或否 VB6 应用程序将在基于 ARM 的平板电脑上运行 如果没有 是否有任何 ARM 模拟器 以便我们可以在 Windows 8 ARM 平板
  • SnowFlake 和 Power BI“此值不支持本机查询”

    快速注意 我已经查看了这些线程 但它们没有解决我的问题 过时的信息 请参阅下面的文档 通过PowerBI访问Snowflake查询结果 https stackoverflow com questions 65483722 access sn
  • Windows 下 iOS 开发的替代方案 [重复]

    这个问题在这里已经有答案了 可能的重复 如何使用 Windows 开发机为 iPhone 进行开发 https stackoverflow com questions 22358 how can i develop for iphone u
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 多行 x 刻度标签

    我正在尝试制作类似于此 Excel 示例的图 我想知道 x 刻度标签上是否有第二层 例如 5 年统计摘要 我知道我可以使用制作多行刻度标签 n但我希望能够独立地转换这两个级别 这很接近 fig plt figure figsize 8 4
  • 如何在Python中从stdin中逐行读取

    每个人都知道如何在 C 中计算 STDIN 中的字符 但是 当我尝试在 python3 中执行此操作时 我发现这是一个难题 计数器 py import sys chrCounter 0 for line in sys stdin readl
  • 更改列的顺序

    我正在处理一个包含 gt 40 列的大型数据框 我希望能够移动列 而不必指定所有列名称 例如 a lt c 1 5 b lt c 4 3 2 1 1 Percent lt c 40 30 20 10 10 Labels lt c Cat D
  • 将新更新从原始 GitHub 存储库提取到分叉的 GitHub 存储库

    我在 GitHub 上分叉了某人的存储库 并希望使用原始存储库中的提交和更新来更新我的版本 这些是在我分叉我的副本后制作的 如何提取在源中所做的更改并将它们合并到我的存储库中 您必须将原始存储库 您分叉的存储库 添加为远程存储库 来自有关分
  • vuejs2复制剪贴板问题

    我正在尝试使用https alligator io vuejs vue clipboard copy https alligator io vuejs vue clipboard copy 对于 Vue js 中的复制剪贴板功能 它对于字符
  • 在Python中:检查文件修改时间是否早于特定日期时间

    我用 C 编写了以下代码来检查文件是否已过期 DateTime lastTimeModified file getLastTimeModified if lastTimeModified HasValue File does not exi
  • Ruby 元编程,RSpec 的“应该”如何工作?

    我正在阅读 RSpec 并试图弄清楚 RSpec 的 应该 是如何实现的 有人可以帮忙解释一下这个函数的元性质是如何工作的吗 代码位于此处 http github com dchelimsky rspec blob master lib s
  • WCF - IsOneway 的行为不像 Oneway 操作

    我已在服务的某些方法上定义了 OneWay 属性 但它们的行为并不像 Oneway 调用 我的客户等待呼叫完成并从服务返回 我假设单向操作是非阻塞操作 并且客户端不关心被调用函数会发生什么 它只是调用并忘记它 这是对的吗 问题 调用 Ope
  • 类型 '' 未映射

    我已经尝试修复这个错误有一段时间了 每当我的应用程序尝试创建数据上下文的实例时 我都会收到此错误 下面是代码 using System using System Collections Generic using System Linq u
  • 如何在 MySQL 查询编辑器中对列重新排序?

    我想移动专栏OtherSupport below Amount2 是否有捷径可寻 ALTER TABLE myTable MODIFY OtherSupport VARCHAR 50 AFTER Amount2
  • jquery 验证数组输入的添加规则[重复]

    这个问题在这里已经有答案了 我想将复选框值存储在数组中 但是 我无法使用验证规则 因为名称是selectList 代替selectList 我尝试了 id 但似乎规则只绑定到名称 html
  • 为什么CreateUserWizard Control会自动添加ASPNETDB.MDF数据库?

    我只想使用 CreateUserWizard Control 从用户收集信息并将其插入到我的自定义数据库中 我不想使用 Asp Net Membership 当我将此设置添加到 web config 时
  • 仅在满足条件时添加到字典

    我在用urllib urlencode构建 Web POST 参数 但是有一些值我只想在除None为他们而存在 apple green orange orange params urllib urlencode apple apple or
  • 对聚合物发布的属性感到困惑

    我已经深入研究了聚合物的ajax核心元素 如下代码工作正常
  • 为什么 -march=native 很少使用?

    对于大多数 C C 编译器 有一个可传递给编译器的标志 march native 它告诉编译器调整为主机 CPU 的微架构和 ISA 扩展生成的代码 即使它的名称不同 基于 LLVM 的编译器通常也有一个等效的选项 例如rustc or s