为什么 -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 很少使用? 的相关文章

  • 如何在 GCC C++ 中编写多行内联汇编代码?

    这看起来不太友好 asm command 1 command 2 command 3 我真的必须在每一行加上双引号吗 另外 由于多行字符串文字在 GCC 中不起作用 我也无法欺骗它 我总是在互联网上找到一些例子 该人手动插入制表符和换行符而
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • clang C++11 调用

    虽然这里有一些关于 clang 的 C 11 支持的问题 但我似乎无法得到clang 吃掉我的 C 11 代码 clang version clang version 2 9 tags RELEASE 29 final Target x86
  • C 编译器无法在 Mac OS Mountain Lion 上创建可执行文件

    我几乎浏览了每一页 但所有提示都不能解决问题 我正在运行 Mountain Lion 我有 Xcode 所有最新的开发工具 最新的 GCC 等等 我正在尝试设置 rbenv 和 ruby build 一切似乎都正常 但是当我去安装 ruby
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • long double(GCC 特定)和 __float128

    我正在寻找有关的详细信息long double and float128在 GCC x86 中 更多是出于好奇而不是因为实际问题 可能很少有人需要这些 我只是有史以来第一次 truly需要一个double 但我想知道你的工具箱里有什么以及它
  • 从c调用汇编函数

    我试图从 c 调用汇编函数 但我不断收到错误 text globl integrate type integrate function integrate push ebp mov esp ebp mov 0 edi start loop
  • 原生C有通用符号吗?

    在GCC10中 gcc默认为fno common 这意味着 所有暂定定义的符号都不通用 我认为gcc符合C规范 但本地C程序中似乎没有通用符号 通用符号仅适用于扩展语法吗 原生C有通用符号吗 阅读C11标准n1570 https web c
  • GCC:如何在 MCU 上完全禁用堆使用?

    我有一个在基于 ARM Cortex M 的 MCU 上运行并用 C 和 C 编写的应用程序 我用gcc and g 编译它并希望完全禁用任何堆使用 在 MCU 启动文件中 堆大小已设置为 0 除此之外 我还想禁止代码中意外使用堆 换句话说
  • 如何最好地以编程方式将 `__attribute__ ((unused))` 应用于这些自动生成的对象?

    In my makefile我有以下目标 它将文本 HTML 资源 编译 为unsigned char数组使用xxd i http linuxcommand org man pages xxd1 html 我将结果包装在匿名命名空间和标头保
  • 如何使 gcc 为 -fpatchable-function-entry 发出多字节 NOP?

    gcc确实有能力使用多字节用于对齐循环和函数的 NOP 然而当我尝试 fpatchable function entry option https gcc gnu org onlinedocs gcc Instrumentation Opt
  • _MM_TRANSPOSE4_PS 在 GCC 中导致编译器错误?

    我第一次在 GCC 而不是 MSVC 中编译我的数学库 并经历了所有的小错误 我遇到了一个根本没有意义的错误 Line 284 error lvalue required as left operand of assignment 284号
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720
  • python gcc编译错误

    我知道 gcc 上有很多线程 特别是 command gcc failed with exit status 1 我已经查看了所有线程 但仍然无法解决此问题 我只会使用 gcc 或 mingw32 来执行与 python 相关的任务 例如使
  • 具有重复符号的 C++ 插件库上的段错误

    我有一个跨平台 C 应用程序 它分为多个共享库 并从插件共享库加载附加功能 插件库应该是自包含的并自行运行 无需了解或依赖于调用应用程序 其中一个插件包含从主应用程序复制的代码 因此包含与引擎中的符号名称重复的符号名称 是的 我知道这通常是
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • LTO、去虚拟化和虚拟表

    比较 C 中的虚拟函数和 C 中的虚拟表 一般来说 编译器 对于足够大的项目 在去虚拟化方面做得同样好吗 天真地说 C 中的虚拟函数似乎有更多的语义 因此可能更容易去虚拟化 Update Mooing Duck 提到了内联去虚拟化函数 快速
  • C中sizeof的内部机制?

    我使用 sizeof 来获取 C 中结构的大小 但得到的结果是意外的 struct sdshdr int len int free char buf int main printf struct len d n sizeof struct
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2

随机推荐

  • 将变量从 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