【发布时间】:2017-09-22 15:20:51
【问题描述】:
我的生产代码具有为各种 SIMD 指令集(包括 AVX、AVX2 和 AVX512)实现的内核。可以使用./configure --enable-proc=AVX CXXFLAGS="-mavx" 之类的东西在目标机器上为目标机器编译代码。
这也适用于公开 AVX 内在函数的 Travis CI。我想至少编译 AVX2 和 AVX512 版本,以查看是否所有文件都已签入。但似乎为不同的 ISA 编译并不那么容易。
一个简单的 AVX2 测试程序:
#include <immintrin.h>
int main(int argc, char **argv) {
__m256d a;
__m256d b;
__m256d c;
_mm256_fnmadd_pd(a, b, c);
}
在我的 AVX 机器(Intel Core i5-2520M)上,它无法编译:
$ g++ -Wall -Wpedantic --std=c++11 cpp.cpp -mavx2
In file included from /usr/lib/gcc/x86_64-redhat-linux/6.3.1/include/immintrin.h:79:0,
from cpp.cpp:3:
/usr/lib/gcc/x86_64-redhat-linux/6.3.1/include/fmaintrin.h:143:1: error: inlining failed in call to always_inline '__m256d _mm256_fnmadd_pd(__m256d, __m256d, __m256d)': target specific option mismatch
_mm256_fnmadd_pd (__m256d __A, __m256d __B, __m256d __C)
^~~~~~~~~~~~~~~~
有没有办法编译代码?我不在乎跑步,我只是想要一个烟雾测试。
【问题讨论】:
-
不确定是否应该是这样,但如果我启用
-march=haswell,您的特定示例对我有用。 -
正如函数名称(或英特尔文档)所表明的,您需要
-mfma告诉编译器您要为这样的目标进行编译。或者当然是一些暗示它的-march=标志。
标签: c++ gcc cross-compiling intrinsics