我正在尝试弄清楚如何设置-march
正确地查看在使用 gcc 4.7.2 的 PC 上启用和禁用选项之间会出现多少性能差异。
在尝试编译之前,我试图找到最好的-march
我的电脑的选项。我的电脑有Pentium G850,其架构是Sandy Bridge。所以我提到gcc 4.7.2 手册 http://gcc.gnu.org/onlinedocs/gcc-4.7.2/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options并发现-march=corei7-avx
似乎是最好的。
不过,我记得基于 Sandy Bridge 的 Pentium 缺乏 AVX 和 AES-NI 指令集支持,这是适用于奔腾 G850 http://ark.intel.com/products/53491/intel-pentium-processor-g850-3m-cache-2_90-ghz. So -march=corei7-avx
不是一个合适的选择。
我提出了一些可能的选择:
-march=corei7-avx -mno-avx -mno-aes
-march=corei7 -mtune=corei7-avx
-march=native
考虑到我所掌握的信息,第一个选项看起来很合理,但我担心除了 AVX 和 AES-NI 之外,可能还会缺少其他功能。第二个选项看起来很安全,但它可能会错过 Sandy Bridge 上的一些小功能,因为-march=corei7
。第三个选项将解决我所有的问题,但我听说这个选项有时会错误检测 CPU 的功能,所以我想知道如何手动执行此操作。
我用谷歌搜索了 StackOverflow 和 SuperUser,但找不到任何明确的解决方案......
应该设置哪些选项?
通过 GCC 进行检测怎么样,对于我 (gcc-5.3.0) 在 i5-2450M CPU (Lenovo e520) 上,显示如下:
gcc -march=native -E -v - </dev/null 2>&1 | grep cc1
/usr/libexec/gcc/x86_64-pc-linux-gnu/5.3.0/cc1 -E -quiet -v - -march=sandybridge
-mmmx -mno-3dnow -msse -msse2 -msse3 -mssse3 -mno-sse4a -mcx16
-msahf -mno-movbe -maes -mno-sha -mpclmul -mpopcnt -mno-abm -mno-lwp
-mno-fma -mno-fma4 -mno-xop -mno-bmi -mno-bmi2 -mno-tbm -mavx
-mno-avx2 -msse4.2 -msse4.1 -mno-lzcnt -mno-rtm -mno-hle -mno-rdrnd
-mno-f16c -mno-fsgsbase -mno-rdseed -mno-prfchw -mno-adx -mfxsr
-mxsave -mxsaveopt -mno-avx512f -mno-avx512er -mno-avx512cd
-mno-vx512pf -mno-prefetchwt1 -mno-clflushopt -mno-xsavec -mno-xsaves
-mno-avx512dq -mno-avx512bw -mno-avx512vl -mno-avx512ifma
-mno-avx512vbmi -mno-clwb -mno-pcommit -mno-mwaitx --param
l1-cache-size=32 --param l1-cache-line-size=64 --param
l2-cache-size=3072 -mtune=sandybridge -fstack-protector-strong
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)