Gcc 我的3月/9月可用选项是什么?

Gcc 我的3月/9月可用选项是什么?,gcc,command-line,x86,compiler-flags,micro-architecture,Gcc,Command Line,X86,Compiler Flags,Micro Architecture,有没有办法让gcc输出可用的-march=arch选项?我得到了构建错误(尝试了-march=x86_64),我不知道我的选项是什么 我使用的编译器是围绕gcc的专有包装器,它似乎不喜欢-march=skylake。标志应该是相同的,所以我假设我发送给gcc转储架构的任何选项对于这个包装器都是相同的 我设法用一个伪参数使gcc出错,它转储了一个列表,但现在我正在使用包装器,我看不到这一点 如何让gcc告诉我它支持什么?使用gcc--target help -march=CPU[,+EXTENSI

有没有办法让gcc输出可用的-march=arch选项?我得到了构建错误(尝试了
-march=x86_64
),我不知道我的选项是什么

我使用的编译器是围绕gcc的专有包装器,它似乎不喜欢
-march=skylake
。标志应该是相同的,所以我假设我发送给gcc转储架构的任何选项对于这个包装器都是相同的

我设法用一个伪参数使gcc出错,它转储了一个列表,但现在我正在使用包装器,我看不到这一点

如何让gcc告诉我它支持什么?

使用
gcc--target help

-march=CPU[,+EXTENSION...]
                      generate code for CPU and EXTENSION, CPU is one of:
                       generic32, generic64, i386, i486, i586, i686,
                       pentium, pentiumpro, pentiumii, pentiumiii, pentium4,
                       prescott, nocona, core, core2, corei7, l1om, k1om,
                       iamcu, k6, k6_2, athlon, opteron, k8, amdfam10,
                       bdver1, bdver2, bdver3, bdver4, znver1, znver2,
                       btver1, btver2
...
它通常不是像
x86
x86-64
这样的通用体系结构,而是特定的微体系结构。但是对于具有64位扩展的通用x86 CPU,有
x86-64
(而不是
x86\u 64
)。每个体系结构的完整列表可在上找到。对于x86:

  • -march=cpu类型

    为机器类型cpu类型生成指令。与
    -mtune=cpu类型
    仅为指定的
    cpu类型
    调整生成的代码不同,
    -march=cpu类型
    允许GCC生成可能不会在指定处理器以外的所有处理器上运行的代码。指定
    -march=cpu类型
    意味着
    -mtune=cpu类型


-march
的基线版本为
-march=x86-64
时,基线/默认调谐选项为
-mtune=generic
。这样做的目的是在任何地方都不可怕,避免性能陷阱,即使是以额外指令或代码大小为代价


-march=native
将为运行编译器的机器选择正确的arch和tune设置,或者如果编译器无法识别其运行的CPU的特定型号,则选择
tune=generic

(例如,Skylake上的旧gcc仍将启用
-mavx2-mpopcnt-mbmi2
等,但将设置
-mtune=generic
,而不是更接近合适的设置。)

使用
gcc--target help
似乎是正确的想法,但给出的列表不完整

现代gcc版本的一个解决方法就是将一个伪值传递给
-march

$ gcc --target-help -march=foo
cc1: error: bad value (‘foo’) for ‘-march=’ switch
cc1: note: valid arguments to ‘-march=’ switch are: nocona core2 nehalem corei7 westmere sandybridge corei7-avx ivybridge core-avx-i haswell core-avx2 broadwell skylake skylake-avx512 cannonlake icelake-client icelake-server bonnell atom silvermont slm knl knm x86-64 eden-x2 nano nano-1000 nano-2000 nano-3000 nano-x2 eden-x4 nano-x4 k8 k8-sse3 opteron opteron-sse3 athlon64 athlon64-sse3 athlon-fx amdfam10 barcelona bdver1 bdver2 bdver3 bdver4 znver1 btver1 btver2 native
...

请注意,与我在问题中提到的“目标帮助”

的输出相比,有更多的选项,包装器没有传递这些选项-它实际上跳到了“cc”,这只是抛出了一个错误。这是一个交叉编译,因此本机无法运行(不过我并不真正关心优化,因为它只是一个基准测试),这与
-march=skylake
不同,仅此而已。它是二进制文件还是脚本文件?你可以使用
字符串
搜索那些看起来很有前途的东西。它是一个二进制文件——当它变得更重要时,我会费力地浏览它。我在同一个CPU上的不同操作系统上做了两个基准测试,因此目前优化并不重要,只是dhrystone makefile建议进行优化,如
-O2
至少对基准测试至关重要,最好是
-O3-fprofile use-march=native
(使用
-fprofile generate
运行后)。如果您的意思是特定于目标的调优并不重要,那么当然。我认为这实际上不起作用-它似乎显示了一个不完整的列表,并显示在“汇编程序选项”标题下,而您通常会查找编译器接受的选项。例如,桑迪布里奇、哈斯韦尔、天湖等在你的名单上的什么地方?在我的系统上,
g++8
给出了一个类似的不完整列表。@BeeOnRope:哦,不,显然GCC并没有从它用来检查
arch=
选项和打印帮助的同一列表中动态构造这个字符串。这是不幸的,可能被认为是一个错误,它们不同步,或者是一个设计错误,它们完全是分开的。@PeterCordes-它也出现在“汇编程序选项”下,所以汇编程序可能会接受一个较小的拱门列表?不知道否则是的,它看起来像一个虫子。@BeeOnRope:哦,是的,气体本身需要
-march
选项。我不确定GCC前端是否会将
-march
转换为
as
,至少对于
.c
源代码来说是这样。也许是asm的来源?