Почему я получаю эту ошибку компиляции с 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:

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.


person chasep255    schedule 06.08.2015    source источник
comment
Можете ли вы попробовать с gnu99 вместо c99 в качестве языка?   -  person Jeff Hammond    schedule 06.08.2015
comment
Без разницы, та же ошибка.   -  person chasep255    schedule 06.08.2015
comment
Он отлично компилируется с Intel 15.0.3. Вы должны сообщить об ошибке людям из GCC.   -  person Jeff Hammond    schedule 07.08.2015
comment
Кажется, я что-то припоминаю о функциях mm*, которые могут работать только параллельно с другими функциями mm*. ICC может лучше определять, какие процессоры разрешают различные одновременные контексты с флагом -march=native.   -  person technosaurus    schedule 10.08.2015
comment
Вы уже нашли решение? У меня такая же проблема с gcc 6.2. Внутренности запрещены :(   -  person iblue    schedule 11.11.2016


Ответы (2)


Я предполагаю, что cilk создает две функции (оболочку над sqrt и вашу основную), чтобы планировать их в разных потоках, если это необходимо/возможно. Проблема в том, что в этих условиях функция mm* теперь вызывается косвенно и, следовательно, не может быть встроена, по крайней мере, без дополнительной информации от этапов анализа оптимизации, которые вы отключили.

Я заметил, что вы компилируете с -O0. Я подозреваю, что если вы скомпилируете -O2, это может сработать, поскольку дополнительные проходы оптимизации предоставят компилятору больше информации, необходимой для встраивания этих функций.

person gby    schedule 09.08.2015

Я смог скомпилировать код, который не работал с той же ошибкой, указав флаги -msse и -msse2.

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


ссылка на Godbolt, на которую ссылается следующий комментарий, требуется текущая "лучшая практика" SO.

person anatoly techtonik    schedule 24.03.2016
comment
Эта проблема возникает с CILK, даже когда -msse2 включен (даже с gcc6-snapshot). ОП использует -march=native. Это не устраняет проблему с Cilk, только для обычных случаев этого сообщения об ошибке (используя встроенные функции без правильных параметров -m, чтобы сообщить gcc, что эти insns в порядке). Мне пришлось отредактировать ссылку Godbolt, которая демонстрирует продолжающееся существование этой проблемы. в свой пост, потому что SO сломал комментарии - person Peter Cordes; 24.03.2016
comment
Хороший сайт. Я не знал, что такая вещь существует для gcc. Теперь я вижу, что это действительно не помогает. - person anatoly techtonik; 25.03.2016