gpt4 book ai didi

c++ - 如何确定要为体系结构启用或禁用的功能标志

转载 作者:太空宇宙 更新时间:2023-11-04 09:20:56 24 4
gpt4 key购买 nike

我有两个虚拟机;它们都运行在相同的Intel Xeon E5-2699v4(Broadwell EP)平台上。但是,一个虚拟机(生产机)驻留在一个禁用了这些功能的主机上,而另一个虚拟机(构建机)则全部启用这些功能。我们也有其他主机运行在Intel Xeon E5-2699v3平台(Haswell EP)上,但这些主机将在稍后处理。通过观察来自本地计算机的单行bash命令的结果,我可以确定禁用了哪些功能:

sort <(sshi vm1 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") <(sshi vm2 "cat /proc/cpuinfo | grep flags | head -n 1 | sed -r 's/\s+/\t/g' | cut -f 3- | sed -r 's/\t/\n/g' | sort | uniq") | uniq -u

…其中 sshi是bash别名,用于确定连接时要使用的密钥文件, vm1是启用了所有功能的计算机的主机名, vm2是未启用所有功能的计算机的主机名。我认为这个单行命令可以与一个循环配对,以生成编译器的功能启用标志。。。
for feature in $(...); do echo "-mno-${feature}"; done

…生成这样的列表:
-mno-abm
-mno-avx
-mno-avx2
-mno-bmi1
-mno-bmi2
-mno-eagerfpu
-mno-fma
-mno-hle
-mno-invpcid
-mno-movbe
-mno-pcid
-mno-pse36
-mno-rtm
-mno-tsc_adjust
-mno-xsave
-mno-xsaveopt

获取此列表并通过CMake将其传递给编译器:
LIST(APPEND COMMON_FLAGS /* paste flags here, along with other things such as -Wall -pedantic -Werror=etc */)
SET_PROPERTY(TARGET my_target PROPERTY COMPILE_OPTIONS ${COMMON_FLAGS})

…在使用由package g++ (GCC) 5.3.1 20160406 (Red Hat 5.3.1-6)on devtoolset-4提供的 Oracle Linux Server 7.3时出现编译错误:
c++: error: unrecognized command line option ‘-mno-bmi1’
c++: error: unrecognized command line option ‘-mno-eagerfpu’
c++: error: unrecognized command line option ‘-mno-invpcid’
c++: error: unrecognized command line option ‘-mno-pcid’
c++: error: unrecognized command line option ‘-mno-pse36’
c++: error: unrecognized command line option ‘-mno-tsc_adjust’

第一个错误可以通过简单地将其更改为 -mno-bmi而不是 -mno-bmi1来解决
我确实从 GCC mailing list archivegcc -march=native -Q --help=target找到了这个有趣的小道消息。使用这个搜索特性并不能显示所有丢失的特性标志,所以这对我来说似乎是一个死胡同。
所以我的问题是:
为什么功能集不能直接转换为功能标志
对于编译器?如果这是一个“新”功能,我肯定会理解的
编译器根本不理解或支持。。。但是
-mno-bmi1改成 -mno-bmi对我来说意味着
只是对功能集的命名有分歧。
是否有更好的方法从
已启用所有功能的计算机
某些功能被禁用?
是否有描述功能名称的映射
由内核通过 /proc/cpuinfo(或其他地方)报告
编译器使用的名称?

最佳答案

为什么功能集不能直接转换为编译器的功能标志?如果这是一个编译器根本不理解或不支持的“新”特性,我当然会理解。。。但是,将-mno-bmi1改为-mno-bmi对我来说意味着在命名功能集方面存在分歧。
我从来没看过关于这个的讨论,所以我不能发表评论。也许您可以在gcc帮助列表或内核邮件列表中询问。
我知道,由于Clang和Solaris的原因,我花了相当多的时间在将/proc/cpuinfo标志映射到编译器标志上(还有FreeBSD,您必须检查/var/run/dmesg.boot)。另请参见Crypto++ ARM logicCrypto++ x86 logicCrypto++ Solaris logic
是否有更好的方法从启用了所有功能的计算机编译完全优化的生成,以针对禁用了某些功能的计算机?
对于x86上的GCC(如i686和x86_64)和GCC>=5.0,可以使用多个函数。参见GCC手册中的7.8 Function Multiversioning
所有的赌注都是对海湾合作委员会的手臂,所有的赌注都是对叮当。而且它在带有SunCC编译器的Solaris上也不工作。
在实践中发生的事情是为特性设置“步骤”,然后使用运行时CPU特性检测来选择实现(这就是GCC多功能所做的)。对于x86,步骤通常如下:
直C/C++
SSE2号
SSE3+SSSE3
SSE4.1+SSE4.2标准
AVX或AVX2
AVX/AVX2将分别包括BMI和BMI2。Microsoft编译器只使用SSE2和AVX以及AVX2。
仍然有通配符,如AES、CLMUL、RDRAND、RDSEED、SHA等,但大多数库不需要担心它们。关注点通常仅限于加密库。
我还注意到GCC在__MOVBE__时没有定义-march=native,并且机器是有能力的。另请参见gcc帮助邮件列表中的__MOVBE__ not defined when movbe feature is available?
对于ARM,通常是:
直C/C++
霓虹
与x86一样,加密库所使用的通配符包括PMULL、PMULL2、AES、SHA1、SHA2。
是否有一个映射描述了内核通过/proc/cpuinfo(或其他地方)报告的功能名称以及编译器使用的名称?
我不知道。您可以在Unix和Linux堆栈交换上的What do the flags in /proc/cpuinfo mean?中查找CPU特性,然后从GCC的x86 OptionsARM Options中找出arch选项。
就像我说的,我花了相当多的时间来测试Crypto++,所以你可以从以下文件中截取它:
Crypto++ ARM logic
Crypto++ x86 logic
Crypto++ Solaris logic
如果您想看一个使用GCC多功能的例子,那么请查看Jack Lloyd's Botan
快速评论:
由Oracle Linux服务器7.3上的devtoolset-4包提供:

c++: error: unrecognized command line option ‘-mno-bmi1’
c++: error: unrecognized command line option ‘-mno-eagerfpu’

我猜 c++不是GCC(或者更准确地说, g++),或者它是一个旧的GCC 4.x编译器。
另一个快速评论。。。如果您只想将Intel Xeon E5-2699v4(Broadwell EP)与Intel Xeon E5-2699v3平台(Haswell EP)交叉,请使用以下方法:
CXXFLAGS="-march=x86_64 -msse2 -msse3 -msss3 -msse4_1 -msse4_2 -mavx -mbmi"

从低处开始一直到天花板。你不必去想从GCC的 -march=native中减去什么。你不必担心Clang对 -march=native有什么不同的行为。
关于 -march=native行为的叮当错误报告:
Bug 1616723: Clang 3.4 only advertises SSE2
Bug 1616729: Clang 3.5 only advertises SSE2
Bug 1616731: Clang 3.6 only advertises SSE2

关于c++ - 如何确定要为体系结构启用或禁用的功能标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42010971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com