Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do I get this compile error with GCC 5 and cilk-plus?

For some reason cilk_spawn does not work with x86 intrinsics. I get an error every time I try to combine the two in the body of the same function. (Note that cilk_for works fine). If I remove all of the SIMD instructions it compiles and runs fine.

#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;
}

here is gcc ouput:

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

I just noticed that that was with GCC 4.9 but the error message is the same with GCC 5.

like image 714
chasep255 Avatar asked Aug 06 '15 03:08

chasep255


1 Answers

I am guessing cilk creates two functions (wrapper over sqrt and your main) in order to schedule them in different threads, if needed/possible. The issue is that under these conditions the mm* function are now called indirectly and therefore cannot be inlined, at least not without additional information from optimization analasys stages which you have turned off.

I noticed that you compile with -O0. I suspect that if you compile -O2 it might work since the additional optimization passes will provide the compiler with more information that is needed to inline these functions.

like image 68
gby Avatar answered Oct 09 '22 01:10

gby