【发布时间】:2019-02-12 16:11:41
【问题描述】:
我正在尝试在一些文件上实现和编码,其中一些包含 SIMD 调用。我已经在服务器上编译了这段代码,运行与我的机器基本相同的操作系统,但我无法编译它。
这是错误:
make
g++ main.cpp -march=native -o main -fopenmp
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
from tensor.hpp:9,
from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h: In function ‘_ZN6TensorIdE8add_avx2ERKS0_._omp_fn.5’:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:447:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_add_pd(__m256d, __mmask8, __m256d, __m256d)’: target specific option mismatch
_mm256_mask_add_pd (__m256d __W, __mmask8 __U, __m256d __A,
^~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
from tensor.hpp:9,
from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:610:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_loadu_pd(__m256d, __mmask8, const void*)’: target specific option mismatch
_mm256_mask_loadu_pd (__m256d __W, __mmask8 __U, void const *__P)
^~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/lib/gcc/x86_64-linux-gnu/7/include/immintrin.h:53:0,
from tensor.hpp:9,
from main.cpp:4:
/usr/lib/gcc/x86_64-linux-gnu/7/include/avx512vlintrin.h:610:1: error: inlining failed in call to always_inline ‘__m256d _mm256_mask_loadu_pd(__m256d, __mmask8, const void*)’: target specific option mismatch
_mm256_mask_loadu_pd (__m256d __W, __mmask8 __U, void const *__P)
^~~~~~~~~~~~~~~~~~~~
In file included from main.cpp:4:0:
tensor.hpp:228:33: note: called from here
res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Makefile:7: recipe for target 'main' failed
make: *** [main] Error 1
谷歌搜索问题并没有真正帮助,因为所有答案都指出了事情,我已经这样做/尝试过。
有人可以提供一些背景说明为什么它不起作用。
编辑:
int main(){
#ifdef __AVX512F___
auto tt = createTensor();
auto tt2 = createTensor();
auto res = tt.addAVX512(tt2);
#endif
}
//This is in tensor.hpp
#ifdef __AVX512F__
Tensor<T> Tensor::addAVX512(_param_){
res = _mm256_mask_add_pd(tmp, 0xFF, _mm256_mask_loadu_pd(tmp, 0xFF, &elements[i]), _mm256_mask_loadu_pd(tmp, 0xFF, &a.elements[i]));
}
#endif
这是发生的事情的要点......我已将所有 SIMDcall 包含在 #ifdefs 等中。
【问题讨论】:
-
@bruno 这个问题是关于
cmake的。 -
这也是关于 C,而不是 C++。
-
@Barmar:这是关于在使用 SSE4.1 内部函数编译代码时省略
-msse4.1。或者在这种情况下,在编译 AVX 内部函数时忽略-mavx或-march=haswell。 -
@bruno 不,我已经找到了,但它没有帮助
-
@bruno:如果 OP 没有使用
-march=native,inlining failed in call to always_inline '__m256d _mm256_broadcast_sd(const double*)' 将完全重复:-mavx是这些内在函数的相关选项。但是对于这种情况,它只会让 OP 制作一个他们无法运行的二进制文件。要么他们的服务器太旧了,要么它使用了无法为客人启用 AVX 的糟糕虚拟化,或者它运行在 Pentium / Celeron CPU 上(甚至 Skylake Pentium 也禁用了 AVX,大概是为了他们可以销售具有高 128 位缺陷的芯片FMA u