gcc:-march = native和-march = <specific arch>之间的差异

问题描述

为了比较各种-march设置将启用哪些标志,我在比较以下命令的输出,如this SO answer中所述:@H_404_3@

$ gcc -Q -march=native         --help=target
$ gcc -Q -march=skylake-avx512 --help=target

请注意,为避免疑问,使用-march=native检测到的输出skylake-avx512。@H_404_3@

$ gcc -Q -march=native --help=target | grep march
  -march=                           skylake-avx512

两个-march变体输出的大多数标志都完全匹配。@H_404_3@

但是,有一些区别:@H_404_3@

$ diff <(gcc -Q -march=native --help=target) <(gcc -Q -march=skylake-avx512 --help=target)
12c12
<   -mabm                               [enabled]
>   -mabm                               [disabled]
119c119
<   -mpku                               [disabled]
>   -mpku                               [enabled]
136c136
<   -mrtm                               [enabled]
>   -mrtm                               [disabled]
138c138
<   -msgx                               [disabled]
>   -msgx                               [enabled]

正是这些差异促使我提出这个问题。@H_404_3@

-march=native如何选择要启用和禁用的指令集?@H_404_3@

我有以下猜想:@H_404_3@

  • -march=native将使用cpuID指令来计算支持的指令集等,以便检测处理器变体
  • -march=foobar将使用处理器foobar支持的指令集的硬编码列表。

如果这是正确的,那么我可以看到两种可能的解决方法:@H_404_3@

选项1: @H_404_3@

-march=native可能无法使其100%正确,而当发布新处理器时,支持的指令集表将更新,并且更有可能是正确的。@H_404_3@

因此,我们希望-march=foobar是“更正确”的标志。@H_404_3@

选项2: @H_404_3@

-march=native将使用cpuID指令来计算支持的指令集-因此可以保证是正确的,而-march=foobar将使用可能不正确的指令集的硬编码列表。@H_404_3@

因此,我们希望-march=native是“更正确”的标志。@H_404_3@

如果选项2 是正确的,则可以推测使用-march=foobar可能会导致启用了不受支持的指令集-如果程序发出这些指令会导致崩溃。 @H_404_3@

到目前为止,我找不到上述任何一项或任何一项正确的答案。@H_404_3@

如果我要针对特定​​的拱门,请确保启用了所有(且仅)受支持的指令集,并且无法使用-march=native,这样做的最佳方法是什么?@H_404_3@

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)