2013-03-05 12 views
5

vorrei abilitare NEON vettorializzazione sul mio braccio Cortex-A9, ma ottengo questo output in fase di compilazione:ARM NEON fallimento vettorializzazione

"non vettorializzare: rilevante stmt non supportato: D.14140_82 = D.14143_77 * D.14141_81"

Ecco il mio ciclo:

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]; 
    } 
} 

E le opzioni utilizzate in fase di compilazione:

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

Sto usando compilatore arm-linux-gnueabi (v4.6).

È importante notare che il problema viene visualizzato solo con i vettori float32. Se cambio int32, quindi la vettorizzazione viene eseguita. Forse la vettorizzazione per float32 non è ancora disponibile ...

Qualcuno ha un'idea? Dimentico qualcosa nella linea cmd o nella mia implementazione?

Grazie in anticipo per il vostro aiuto.

Guix

risposta

8

Da GCC's ARM options page

-mfpu = nome

...

Se l'hardware in virgola mobile selezionata include l'estensione NEON (es -mfpu = `neon '), si noti che le operazioni a virgola mobile non vengono generate dal pass di auto-vettorizzazione di GCC a meno che -funsafe-math-optimization è anche specificato. Questo perché l'hardware NEON non implementa completamente lo standard IEEE 754 per l'aritmetica floating-point (in particolare i valori denormali vengono considerati zero), quindi l'uso delle istruzioni NEON può portare a una perdita di precisione.

Se si specifica -funsafe-math-optimizations dovrebbe funzionare, ma rileggere la nota di cui sopra, se avete intenzione di utilizzare questo con alta precisione.

+0

Grazie, '-funsafe-math-optimizations' fa il trucco! – user2092113