相当于其他编译器中的 gcc/clang 的 March=native?

Posted

技术标签:

【中文标题】相当于其他编译器中的 gcc/clang 的 March=native?【英文标题】:Equivalents to gcc/clang's march=native in other compilers? 【发布时间】:2015-06-12 09:55:40 【问题描述】:

我想知道除 gcc 和 clang 之外是否还有其他编译器提供类似 -march=native 的选项,如果有,该选项是什么。我已经从另一个问题 (Automatically building for best available platform in visual c++ (equivalent to gcc's -march=native)) 中了解到,Microsoft 的编译器没有该选项(除非它在激活 SSE2 指令集的选项中隐含,至少不包括 AVX 和更高版本)。

用例很简单:提供一个 cmake 设置,因此用户可以选择激活和构建,支持他或她的 CPU 支持的所有“内在”。我们目前有针对我们目标的实际内在函数的检测逻辑(例如 x86 上的 SSE4.2 和/或 PCLMUL),但是当必须考虑更多平台和编译器时,该逻辑可能会变得非常复杂。简化它们可能会导致编译器开始使用不受运行时检查保护的预期位置之外的不受支持的指令集。

【问题讨论】:

创建一个cpu dispatcher。 这不是我想要的。已经有运行时检查。当您使用需要激活内在函数(例如 -msse4)的编译器进行构建时可能出现的问题是,它将能够在整个编译单元中使用该指令集,包括在您不期望它的表达式中.我使用启用 SSE4.2 构建的代码并在没有 SSE4.2 的 CPU 上执行时遇到了这个问题:它在 a = b + c 形式的表达式上崩溃,因为编译器已经确定它可以使用 SSE4.2 做得更好。 -march=native 的优势在于它将扩展到适合当前 CPU 的 -mfoo-mno-bar 选项的适当列表。对于 cpu 调度程序方法来说,这是一种双重目的,但它提供的优势是您可以使用单个标志构建完整的项目,并从可以进行的任何优化中受益。 【参考方案1】:

目前,Microsoft Visual C++ 编译器不提供与 ma​​rch=native 等效的标志。在构建代码之前,您必须手动或使用脚本找出适当的标志。

关于英特尔 C++ 编译器,xHost and QxHost 标志的用途基本相同。

【讨论】:

谢谢。这应该涵盖主流编译器,对吧? 在没有原生部分的情况下是否有与 -march= 相同的内容?

以上是关于相当于其他编译器中的 gcc/clang 的 March=native?的主要内容,如果未能解决你的问题,请参考以下文章

GCC ,Clang 与 make,cmake 一览

编译器:gcc, clang, llvm

gcc/clang编译带pthread.h头文件的源码时需要的参数

使用 GCC/CLANG 追踪代码膨胀的工具

如何在 gcc/clang 中的错误和警告之间添加换行符/边框

gcc、clang 和 msvc 的 C++ 自动矢量化要求