由于某种原因,cilk_spawn不能与x86内部函数一起使用。每当我尝试将两者组合在同一函数的主体中时,我都会收到错误。 (注意cilk_for工作正常)。如果我删除所有SIMD指令,它会编译并运行正常。
#include <stdio.h>
#include <x86intrin.h>
#include <math.h>
#include <cilk/cilk.h>
int main()
{
int w = cilk_spawn sqrt(10);
__m128i x = _mm_set_epi64x(1, 1);
x = _mm_add_epi64(x, x);
cilk_sync;
printf("%d\n", w);
return 0;
}
这是gcc输出:
gcc-4.9 -std=c99 -march=native -fcilkplus -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o "main.o" "../main.c"
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/xmmintrin.h:1258:0,
from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:31,
from ../main.c:2:
../main.c: In function ‘main’:
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:581:1: error: inlining failed in call to always_inline ‘_mm_set_epi64x’: function not inlinable
_mm_set_epi64x (long long __q1, long long __q0)
^
../main.c:9:10: error: called from here
__m128i x = _mm_set_epi64x(1, 1);
^
In file included from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/xmmintrin.h:1258:0,
from /usr/lib/gcc/x86_64-linux-gnu/4.9/include/x86intrin.h:31,
from ../main.c:2:
/usr/lib/gcc/x86_64-linux-gnu/4.9/include/emmintrin.h:1025:1: error: inlining failed in call to always_inline ‘_mm_add_epi64’: function not inlinable
_mm_add_epi64 (__m128i __A, __m128i __B)
^
subdir.mk:18: recipe for target 'main.o' failed
../main.c:10:4: error: called from here
x = _mm_add_epi64(x, x);
^
make: *** [main.o] Error 1
我刚注意到那是GCC 4.9,但错误信息与GCC 5相同。
答案 0 :(得分:1)
我猜cilk创建了两个函数(在sqrt和你的main上包装),以便在需要/可能的情况下在不同的线程中安排它们。问题是在这些条件下, mm *函数现在被间接调用,因此无法内联,至少在没有关闭优化analasys阶段的其他信息的情况下也不会内联。
我注意到你用-O0编译。我怀疑如果编译-O2它可能会起作用,因为额外的优化过程将为编译器提供内联这些函数所需的更多信息。
答案 1 :(得分:-1)
通过指定-msse
和-msse2
标志,我能够编译失败并出现相同错误的代码。
https://www.mail-archive.com/blfs-dev@lists.linuxfromscratch.org/msg00033.html
godbolt link referred to by the following comment要求