2013-03-05 27 views
5

Chciałbym włączyć NEON wektoryzacji na mój ARM Cortex-A9, ale mam to wyjście na kompilacji:ARM NEON awaria wektoryzacja

„nie wektorowy: istotne stmt nie obsługiwane: D.14140_82 = D.14143_77 * D.14141_81"

Oto moja pętla:

void my_mul(float32_t * __restrict data1, float32_t * __restrict data2, float32_t * __restrict out){  
    for(int i=0; i<SIZE*4; i+=1){ 
     out[i] = data1[i]*data2[i]; 
    } 
} 

i opcje używane przy kompilacji:

-march=armv7-a -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp -ftree-vectorize -mvectorize-with-neon-quad -ftree-vectorizer-verbose=2 

Używam kompilatora arm-linux-gnueabi (v4.6).

Należy zauważyć, że problem występuje tylko w przypadku wektorów float32. Jeśli przełączę się w int32, to wektoryzacja jest wykonywana. Może wektoryzacja dla float32 nie jest jeszcze dostępna ...

Czy ktoś ma pomysł? Czy zapomnę coś w linii cmd lub w mojej implementacji?

Z góry dziękuję za pomoc.

Guix

Odpowiedz

8

Od GCC's ARM options page

-mfpu = nazwa

...

Jeśli wybrany sprzętu zmiennoprzecinkową obejmuje rozszerzenie NEON (np -mfpu = `neon '), zauważ, że operacje zmiennoprzecinkowe nie są generowane przez auto-wektoryzację GCC, chyba że Określono również optymalizacje pod względem bezpieczeństwa -funsafe. Dzieje się tak, ponieważ sprzęt NEON nie w pełni implementuje standard IEEE 754 dla arytmetyki zmiennoprzecinkowej (w szczególności wartości denormalne są traktowane jako zero), więc użycie instrukcji NEON może prowadzić do utraty precyzji.

Jeśli podasz -funsafe-math-optimizations powinno działać, ale ponownie przeczytał notatkę wyżej, jeśli masz zamiar używać tego z dużą precyzją.

+0

Dziękuję, '-funsafe-matematyczne-optymalizacje' robi lewę! – user2092113

Powiązane problemy