2015-08-06 13 views
12

Aus irgendeinem Grund funktioniert cilk_spawn nicht mit x86-Intrinsics. Ich bekomme jedes Mal einen Fehler, wenn ich versuche, die beiden im selben Funktionskörper zu kombinieren. (Beachten Sie, dass cilk_for einwandfrei funktioniert). Wenn ich alle SIMD-Anweisungen entferne, kompiliert es und läuft gut.Warum bekomme ich diesen Kompilierfehler mit GCC 5 und cilk-plus?

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

hier ist 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 

Ich habe gerade bemerkt, dass mit GCC 4,9 aber die Fehlermeldung ist das gleiche mit GCC 5.

+0

Können Sie versuchen, mit gnu99 anstelle von c99 als Sprache? – Jeff

+0

Kein Unterschied gleicher Fehler. – chasep255

+0

Kompatibel mit Intel 15.0.3. Sie sollten einen Fehler bei den GCC-Leuten einreichen. – Jeff

Antwort

1

ich Cilk zwei Funktionen zu raten bin schafft (wrapper über sqrt und your main), um sie bei Bedarf in verschiedenen Threads zu planen. Das Problem ist, dass unter diesen Bedingungen die mm * Funktion nun indirekt aufgerufen wird und daher nicht inline geschaltet werden kann, zumindest nicht ohne zusätzliche Informationen aus Optimierungs-Analasys-Stufen, die Sie ausgeschaltet haben.

Ich habe festgestellt, dass Sie mit -O0 kompilieren. Ich vermute, dass, wenn Sie -O2 kompilieren, es funktionieren könnte, da die zusätzlichen Optimierungsdurchläufe dem Compiler mehr Informationen zur Verfügung stellen, die zum Inline-Verknüpfen dieser Funktionen benötigt werden.

+0

O3 erzeugt den gleichen Fehler. – chasep255

-1

Ich konnte den Code, der mit dem gleichen Fehler fehlgeschlagen ist, kompilieren, indem Sie -msse und -msse2 Flags angeben.

https://www.mail-archive.com/[email protected]/msg00033.html


godbolt link referred to by the following comment, von current SO "best practice" erforderlich.

+1

Dieses Problem passiert mit CILK, selbst wenn '-msse2' aktiviert ist (sogar mit gcc6-snapshot). Das OP verwendet '-march = native'. Dies behebt nicht die Problem mit Cilk, nur für normale Fälle dieser Fehlermeldung (mit intrinsics ohne die richtigen '-m' Optionen zu gcc diese Insns sind ok.) Ich musste den godbolt Link bearbeiten, der das Fortbestehen dieses Problems in Ihrem Beitrag zeigt , weil [SO Kommentare unterbrach] (https://meta.stackoverflow.com/questions/319538/common-online-compiler-blacklisted) –

+0

Schöne Website.Ich wusste nicht, dass so etwas für gcc existiert.Jetzt sehe ich, dass es in der Tat hilft es nicht. –