基于 Sandy Bridge 的 Pentium 的正确架构特定选项 (-m) 是啥?
Posted
技术标签:
【中文标题】基于 Sandy Bridge 的 Pentium 的正确架构特定选项 (-m) 是啥?【英文标题】:What is the proper architecture-specific options (-m) for Sandy Bridge based Pentium?基于 Sandy Bridge 的 Pentium 的正确架构特定选项 (-m) 是什么? 【发布时间】:2013-03-22 17:50:34 【问题描述】:我正在尝试弄清楚如何正确设置-march
选项,以查看在我的装有 gcc 4.7.2 的 PC 上启用和禁用选项之间的性能差异有多大。
在尝试编译之前,我尝试找到最适合我的 PC 的 -march
选项。我的 PC 有 Pentium G850,其架构是 Sandy Bridge。所以我参考了the gcc 4.7.2 manual,发现-march=corei7-avx
似乎是最好的。
但是,我记得基于 Sandy Bridge 的 Pentium 缺乏 AVX 和 AES-NI 指令集支持,即true for Pentium G850。所以-march=corei7-avx
不是一个合适的选择。
我想出了一些可能的选择:
-march=corei7-avx -mno-avx -mno-aes
-march=corei7 -mtune=corei7-avx
-march=native
考虑到我掌握的信息,第一个选项看起来很合理,但我担心可能缺少 AVX 和 AES-NI 以外的功能。第二个选项看起来很安全,但由于-march=corei7
,它可能会错过 Sandy Bridge 上的一些小功能。第三个选项会解决我所有的问题,但我听说这个选项有时会错误检测 CPU 的功能,所以我想知道如何手动执行此操作。
我用谷歌搜索并搜索了 *** 和 SuperUser,但找不到任何明确的解决方案...
应该设置哪些选项?
【问题讨论】:
【参考方案1】:如何通过 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
【讨论】:
【参考方案2】:我建议使用-march=corei7-avx -mtune=corei7-avx -mno-avx -mno-aes
。指定-mtune
很重要,因为这个选项告诉 gcc 它应该使用哪个 CPU 模型来调度生成的代码中的指令。
【讨论】:
您的答案看起来与我的第一个选项相同,因为-march=cpu-type
暗示-mtune=cpu-type
(请参阅the gcc manual 的-march=cpu-type
部分)。我的第一个选择和你的有区别吗?另外,除了 AVX 和 AES-NI 之外,还有没有什么可担心的功能缺失?
可能低端的 Sandy Bridges 也缺少 PCLMULQDQ 指令,但编译器无论如何也不会自动生成。
真的吗?如果编译器检测到某些代码使用该指令更快,我认为使用此类指令的代码...我错了吗?
大多数指令都是这种情况,但是 PCLMULQDQ 太特殊了,编译器不知道哪里有好处。
当然可以,但它并不完全安全,不是吗? PCLMULQDQ 适用于使用密码学的程序,这在现代程序中很常见。【参考方案3】:
我有一个基于 Sandy Bridge 的 Intel(R) Celeron(R) CPU G530。
在gentoo的CFLAGS中使用-march=native
,然后编译media-video/ffmpeg-1.2.6(Gentoo当前稳定版本),用mplayer播放视频时出现问题(非法指令)。正如你所说,-mtune=native
有时会误检测 CPU 的特性。
然后我换成-march=corei7-avx -mtune=corei7-avx -mno-avx -mno-aes
,重新编译ffmpeg-1.2.6和mplayer,到现在一切正常。
【讨论】:
以上是关于基于 Sandy Bridge 的 Pentium 的正确架构特定选项 (-m) 是啥?的主要内容,如果未能解决你的问题,请参考以下文章
程序(提供的来源)在 Ivy Bridge Xeon 上运行的时间是旧款移动 Sandy Bridge 的两倍
为啥 TZCNT 适用于我的 Sandy Bridge 处理器?
将渲染设备从 Sandy Bridge GPU 更改为主 GPU
centos系统查看cpu,为啥是显示 Intel Xeon E312xx (Sandy Bridge)
intel corporatation 82915G/GV/GL/P/PL/GL Grantsdale host bridge/DRAM Control