2013-03-05 21 views
5

私は私のARMのCortex-A9にNEONベクトル化を可能にしたいと思いますが、私は、コンパイル時にこの出力を得る:ARM NEONベクトル化失敗

「ベクトル化されません:関連のstmtがサポートされていない:D.14140_82 = D.14143_77 * D.14141_81"

ここでは私のループです:

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

、コンパイル時に使用されるオプション:

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

arm-linux-gnueabi(v4.6)コンパイラを使用しています。

この問題は、float32ベクターでのみ発生することに注意することが重要です。 int32に切り替えると、ベクトル化はとなります。 float32のベクトル化はまだ利用できないかもしれません...

誰かがアイデアを持っていますか?私はcmd行や実装で何かを忘れていますか?

ご協力いただきありがとうございます。

Guix

答えて

8

-mfpu =名前

GCC's ARM options pageから...

選択浮動小数点ハードウェアは、NEON拡張(例えば-mfpu =が含まれている場合`neon ')、浮動小数点演算は、GCCの自動ベクトル化パスによって生成されないことに注意してください。 -funsafe-math-optimizationsも指定されています。これは、NEONハードウェアが浮動小数点演算のIEEE 754規格を完全に実装していないためです(特に、正規化されていない値はゼロとして扱われる)ので、NEON命令を使用すると精度が低下する可能性があります。

あなたが-funsafe-math-optimizationsを指定した場合、それは動作するはずですが、あなたは、高精度でこれを使用しようとしている場合は、上記のノートを再読。

+0

ありがとう、 '-funsafe-math-optimizations'がトリックです! – user2092113

関連する問題