Moje pytanie dzisiaj nie powinno być zbyt skomplikowane, ale po prostu nie mogę znaleźć przyczyny/rozwiązania. Jako małe, powtarzalny przykład rozważmy następujący zabawka kod CProces wstępny C nie zatrzymuje się natychmiast po #error
#define _state_ 0
#if _state_ == 1
int foo(void) {return 1;}
#else
/* check GCC flags first
note that -mfma will automatically turn on -mavx, as shown by [gcc -mfma -dM -E - < /dev/null | egrep "SSE|AVX|FMA"]
so it is sufficient to check for -mfma only */
#ifndef __FMA__
#error "Please turn on GCC flag: -mfma"
#endif
#include <immintrin.h> /* All OK, compile C code */
void foo (double *A, double *B) {
__m256d A1_vec = _mm256_load_pd(A);
__m256d B_vec = _mm256_broadcast_sd(B);
__m256d C1_vec = A1_vec * B_vec;
}
#endif
zamierzam skompilować ten plik test.c
przez
gcc -fpic -O2 -c test.c
Uwaga Nie włącza się flaga GCC -mfma
, więc #error
będzie być wyzwalane. Co by się spodziewać, że kompilacja będzie natychmiast zatrzymać po GCC widzi ten #error
, ale to, co mam z GCC 5.3:
test.c:14:2: error: #error "Please turn on GCC flag: -mfma"
#error "Please turn on GCC flag: -mfma"
^
test.c: In function ‘foo’:
test.c:22:11: warning: AVX vector return without AVX enabled changes the ABI [-Wpsabi]
__m256d A1_vec = _mm256_load_pd(A);
^
GCC robi przystanki, ale dlaczego to również podnieść linię po #error
? Jakieś wyjaśnienie? Dzięki.
Dla osób, które chcą spróbować, istnieje pewne wymaganie sprzętowe. Potrzebne są zestawy instrukcji x86-64 z AVX
iFMA
.
Starsze wersje gcc na pewno przerwały kompilację na '# error', więc nie jest jasne, czy jest to funkcja, czy regresja. –
Mówię, że IDK czy deweloperzy gcc zrobili to celowo z jakiegoś powodu, czy też jest to błąd kompilatora –
Powszechnie uważa się, że bardziej przydatne dla kompilatora jest zgłaszanie ** wszystkich ** błędów, a nie tylko pierwszego, dzięki czemu można naprawić wszystkie problemy przed ponowną kompilacją. – Barmar