Защо получавам тази грешка при компилиране с 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). OP използва -march=native. Това не решава проблема с Cilk, само за нормални случаи на това съобщение за грешка (използвайки intrinsics без правилните -m опции, за да кажа на gcc, че тези insns са ок.) Трябваше да редактирам връзката godbolt, която демонстрира продължаващото съществуване на този проблем в публикацията ви, тъй като ТАК невали коментарите - person Peter Cordes; 24.03.2016
comment
Хубав уебсайт. Не знаех, че съществува такова нещо за gcc. Сега виждам, че наистина не помага. - person anatoly techtonik; 25.03.2016