【发布时间】:2014-06-04 15:37:26
【问题描述】:
我有一个 C 程序,它只能在我正在编译代码的 Ivy Bridge CPU 上运行,在 gcc 4.8 上,我尝试使用 -march=native 进行编译以利用 CPU 的所有特定指令。
我也想在 32 位模式下编译它以进行一些研究比较
我以这种方式为 x64 编译了程序(注意我在 Linux x64 上)
gcc -march=native -s -O2 mycode.c
反汇编代码,可以看到使用了AVX指令集
对于 32 位 x86,这种方式
gcc -m32 -march=native -s -O2 mycode.c
如果我尝试反汇编代码,我看不到任何 AVX 指令,并且指令集是 Pentium Pro,80x87。像 fld / fadd / fstp 用于 FP 数学。添加-mavx 没有帮助,结果相同。
我该如何解决这个问题?
【问题讨论】:
-
-mavx并没有告诉编译器它必须使用 AVX 指令,只是它可以这样做,如果它想要......但也许它决定使用它们会不会产生更好的代码 -
@JonathanWakely 我知道,但似乎很奇怪,为 x64 编译的同一程序利用了 AVX,而在 x86 中更喜欢完全避免使用这些。 (此外,在没有新指令集的情况下,在 x86 中生成的代码要长得多。)
-
gcc 可能“认为”32 位操作系统(和 64 位操作系统 32 位仿真)不支持 256 位 YMM 状态。 -mavx 应该启用优化。
-
人们不再关心 32 位是很常见的。 “如果你想要性能,升级到64位。然后我们可以谈谈。”甚至英特尔也展示了这一点,因为 AVX512 在 32 位上将坚持 8 个寄存器,但在 64 位上将获得 32 个寄存器。
标签: c linux gcc compiler-optimization avx