hirax.net::Tech-logs::2010-12-24

2010-12-24[n年前へ]

gccでNEONのSIMD命令を生成させる方法 

 「gccでNEONのSIMD命令を生成させる方法

AndroidのSDKのgoldfishのCPUをcortex-A8に置き換えてNEONのSIMD命令を試す(その2) のときにはarm_neon.hに定義されているintrinsicsを使ってNEONのSIMD命令を生成させました。この方法だとNEONの命令について詳細を知っていなければなりませんし、なによりもそのプログラムがNEONに依存したものになってしまいます。

今回はコンパイラの最適化の機能を使ってNEONのSIMD命令を生成させるコツを紹介します。

ポイントは
* 配列をループで使うこと。
* その配列のポインタに __restrict の属性がついていること。( ex. void vmla2(float* __restrict a) )

コンパイルオプションは以下のものをつけます。
arm-eabi-gcc -O2 -march=armv7-a -ftree-vectorize -mhard-float -mfloat-abi=softfp -mfpu=neon -mvectorize-with-neon-quad