2015-08-06 10 views
12

Per qualche motivo cilk_spawn non funziona con gli intrinsechi x86. Ottengo un errore ogni volta che provo a combinare i due nel corpo della stessa funzione. (Nota che cilk_for funziona bene). Se rimuovo tutte le istruzioni SIMD, esso viene compilato e funziona correttamente.Perché ottengo questo errore di compilazione con GCC 5 e 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; 
} 

qui è ouput 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 

Ho appena notato che quello era con GCC 4.9, ma il messaggio di errore è lo stesso con GCC 5.

+0

Puoi provare con gnu99 invece di c99 come lingua? – Jeff

+0

Nessuna differenza, lo stesso errore. – chasep255

+0

Compilano bene con Intel 15.0.3. Dovresti presentare un bug con la gente di GCC. – Jeff

risposta

1

sto indovinando Cilk crea due funzioni (wrapper su sqrt e il principale) per programmarli in thread diversi, se necessario/possibile. Il problema è che in queste condizioni la funzione mm * viene ora chiamata indirettamente e pertanto non può essere inline, almeno non senza ulteriori informazioni dagli stadi di analisi dell'ottimizzazione che sono stati disattivati.

Ho notato che si compila con -O0. Ho il sospetto che se si compila -O2 potrebbe funzionare poiché i passaggi di ottimizzazione aggiuntivi forniranno al compilatore più informazioni necessarie per integrare tali funzioni.

+0

O3 produce lo stesso errore – chasep255

-1

Sono stato in grado di compilare il codice che non funzionava con lo stesso errore specificando le flag -msse e -msse2.

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


godbolt link referred to by the following comment, richiesto dalla current SO "best practice".

+1

Questo problema si verifica con CILK anche quando '-msse2' è abilitato (anche con gcc6-snapshot). L'OP usa' -march = native'. Questo non risolve il problema problema con Cilk, solo per i casi normali di quel messaggio di errore (usando intrinseca senza le giuste opzioni '-m' per dire a gcc che gli insns sono ok.) Ho dovuto modificare il link Godbolt che dimostra l'esistenza continua di questo problema nel tuo post , perché [SO ha rotto i commenti] (https://meta.stackoverflow.com/questions/319538/common-online-compiler-blacklisted) –

+0

Bel sito Web. Non sapevo che esistesse una cosa simile per gcc. Ora vedo che anzi non aiuta. –

Problemi correlati