如何解决gcc:-march = native和-march = <specific arch>之间的差异
为了比较各种-march
设置将启用哪些标志,我在比较以下命令的输出,如this SO answer中所述:
$ gcc -Q -march=native --help=target
$ gcc -Q -march=skylake-avx512 --help=target
请注意,为避免疑问,使用-march=native
的检测到的拱输出为skylake-avx512
。
$ gcc -Q -march=native --help=target | grep march
-march= skylake-avx512
但是,有一些区别:
$ 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]
正是这些差异促使我提出这个问题。
-march=native
如何选择要启用和禁用的指令集?
我有以下猜想:
如果这是正确的,那么我可以看到两种可能的解决方法:
选项1:
-march=native
可能无法使其100%正确,而当发布新处理器时,支持的指令集表将更新,并且更有可能是正确的。
因此,我们希望-march=foobar
是“更正确”的标志。
选项2:
-march=native
将使用cpuID指令来计算支持的指令集-因此可以保证是正确的,而-march=foobar
将使用可能不正确的指令集的硬编码列表。
因此,我们希望-march=native
是“更正确”的标志。
如果选项2 是正确的,则可以推测使用-march=foobar
可能会导致启用了不受支持的指令集-如果程序发出这些指令会导致崩溃。
到目前为止,我找不到上述任何一项或任何一项正确的答案。
如果我要针对特定的拱门,请确保启用了所有(且仅)受支持的指令集,并且无法使用-march=native
,这样做的最佳方法是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。