5

ARM cortex-a9 で 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 のベクトル化がまだ利用できない可能性があります…</p>

誰にもアイデアはありますか?コマンドラインまたは実装で何かを忘れていますか?

よろしくお願いします。

ギクス

4

1 に答える 1

9

GCC の ARM オプション ページから

-mfpu=名前

...

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

指定すれば動作-funsafe-math-optimizationsするはずですが、これを高精度で使用する場合は、上記の注意を読み直してください。

于 2013-03-05T14:20:05.033 に答える