Почему я получаю эту ошибку компиляции с помощью GCC 5 и cilk-plus?
По какой-то причине 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 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
Я только заметил, что это было с GCC 4.9, но сообщение об ошибке совпадает с GCC 5.
Ответы
Ответ 1
Я предполагаю, что cilk создает две функции (обертка поверх sqrt и ваш основной), чтобы запланировать их в разных потоках, если это необходимо/возможно. Проблема заключается в том, что в этих условиях функция mm * теперь называется косвенно и поэтому не может быть встроена, по крайней мере, не без дополнительной информации об этапах оптимизации analasys, которые вы отключили.
Я заметил, что вы компилируете с -O0. Я подозреваю, что если вы скомпилируете -O2, это может сработать, поскольку дополнительные проходы оптимизации предоставят компилятору больше информации, необходимой для встраивания этих функций.
Ответ 2
Мне удалось скомпилировать код с ошибкой с той же ошибкой, указав флаги -msse
и -msse2
.
https://www.mail-archive.com/[email protected]/msg00033.html
ссылка godbolt, на которую ссылается следующий комментарий, требуемый текущей SO "лучшей практикой" .