如何使用_mm_clflushopt函数编译程序?错误:内联失败

时间:2019-01-28 19:52:12

标签: c gcc compilation intrinsics

我在Google上搜索了很多,但无法成功使用_mm_clflushopt函数来编译C程序。 _mm_clflush工作正常,但我也希望能够尝试优化版本。我签入了cpu标志,其中包括clflushopt。我同时使用emmintrin.h和immintrin.h这两个库,但是在编译时我仍然收到“对_mm_clflushopt的未定义引用”错误。我在Linux终端上运行gcc -o progproc.c。 使用x86intrin.h库在编译期间给我这个错误:

error: inlining failed in call to always_inline '_mm_clflushopt'

enter image description here

我将不胜感激,虽然对本说明不熟悉,但在尝试查找更多信息后,我真的无法找到优化版本的C代码。这就是为什么我决定问一个问题。

1 个答案:

答案 0 :(得分:1)

GCC仅允许您使用目标CPU支持的内部函数。 GCC永远不会自行发出clflushopt,但对于AVX2之类的扩展程序,此规则更有意义,如果您允许,gcc会知道如何使用AVX2自动矢量化。而且,即使您的源代码使用内在函数,您也必须先启用AVX2指令的使用,GCC才能允许其自身发出它们。

使用gcc -O3 -march=native启用正在编译的CPU上存在的所有扩展。-march仍在不启用优化的情况下工作,但我将其放在供将来打算复制/粘贴加粗部分的读者使用。)

例如,

-march=skylake-march=znver1(Zen)可为特定的目标CPU进行编译,而与要编译的主机无关。参见https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html

仅CLFLUSHOPT的特定选项是-mclflushopt ,但是使用-march=skylake也会设置-mtune=skylake,这也是您想要的。并启用AVX2和更早版本,FMA(是与AVX2分开的)以及BMI1 / BMI2,popcnt,RDRAND,RDSEED和许多其他功能。 (使用-march=skylake -fverbose-asm -S进行编译,并查看文件顶部的asm注释,以查看所有已启用/未启用的-m选项。)