基于 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)

什么是Bridge模式和PPPoE模式?

intel corporatation 82915G/GV/GL/P/PL/GL Grantsdale host bridge/DRAM Control