Gcc 我的3月/9月可用选项是什么?
有没有办法让gcc输出可用的-march=arch选项?我得到了构建错误(尝试了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
-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:
为机器类型cpu类型生成指令。与-march=cpu类型
仅为指定的-mtune=cpu类型
调整生成的代码不同,cpu类型
允许GCC生成可能不会在指定处理器以外的所有处理器上运行的代码。指定-march=cpu类型
意味着-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的来源?