2013-03-05 21 views
5

Ich mag NEON Vektorisierung auf meinem ARM Cortex-A9 ermöglichen, aber ich habe diese Ausgabe bei der Kompilierung:ARM NEON Vektorisierung Ausfall

„nicht vektorisiert: relevant Anw nicht unterstützt: D.14140_82 = D.14143_77 * D.14141_81"

Hier ist meine Schleife:

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

Und die bei der Kompilierung verwendeten Optionen:

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

Ich benutze arm-linux-gnueabi (v4.6) Compiler.

Es ist wichtig zu beachten, dass das Problem nur mit float32 Vektoren auftritt. Wenn ich int32 umschalte, dann ist die Vektorisierung erfolgt. Vielleicht ist die Vektorisierung für float32 noch nicht verfügbar ...

Hat jemand eine Idee? Vergesse ich etwas in der CMD-Zeile oder in meiner Implementierung?

Vielen Dank im Voraus für Ihre Hilfe.

Guix

Antwort

8

Von GCC's ARM options page

-mfpu = name

...

Wenn die ausgewählte Floating-Point-Hardware, um die NEON-Erweiterung enthält (zB -mfpu = "neon"), beachten Sie, dass Fließkommaoperationen nicht durch den automatischen Vektorisierungsdurchlauf von GCC generiert werden, es sei denn -funssafe-math-optimizations wird ebenfalls angegeben. Dies liegt daran, dass die NEON-Hardware den IEEE-754-Standard für Fließkommaarithmetik nicht vollständig implementiert (insbesondere werden die Denormalwerte als Null behandelt), so dass die Verwendung von NEON-Anweisungen zu einem Genauigkeitsverlust führen kann.

Wenn Sie -funsafe-math-optimizations angeben sollte es funktionieren, aber die Notiz über nachzulesen, wenn Sie diese mit hoher Präzision verwenden werden.

+0

Danke, 'funssafe-math-optimizations' macht den Trick! – user2092113