Por alguna razón, cilk_spawn no funciona con intrínsecos x86. Recibo un error cada vez que intento combinar los dos en el cuerpo de la misma función. (Tenga en cuenta que cilk_for funciona bien). Si elimino todas las instrucciones SIMD, compila y funciona bien.
#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; }aquí está la salida de 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 1Acabo de notar que eso fue con GCC 4.9 pero el mensaje de error es el mismo con GCC 5.
Supongo que cilk crea dos funciones (envoltura sobre sqrt y su principal) para programarlas en diferentes subprocesos, si es necesario/posible. El problema es que, en estas condiciones, la función mm * ahora se llama indirectamente y, por lo tanto, no se puede insertar, al menos no sin información adicional de las etapas de análisis de optimización que ha desactivado.
Noté que compilas con -O0. Sospecho que si compila -O2, podría funcionar, ya que los pases de optimización adicionales proporcionarán al compilador más información necesaria para alinear estas funciones.
Pude compilar el código que fallaba con el mismo error especificando los indicadores -msse y -msse2 .
https://www.mail-archive.com/blfs-dev@lists.linuxfromscratch.org/msg00033.html
Enlace de Godbolt al que se hace referencia en el siguiente comentario , requerido por las "mejores prácticas" actuales de SO .