我在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'
我将不胜感激,虽然对本说明不熟悉,但在尝试查找更多信息后,我真的无法找到优化版本的C代码。这就是为什么我决定问一个问题。
答案 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
选项。)