スタッフのブログです。個以上あるコメントは受け付けない設定になってます。4.4.0を使用しています。新しいgccの場合はこちら。ときにはarm_neon.hに定義されているintrinsicsを使ってNEONのSIMD命令を生成させました。この方法だとNEONの命令について詳細を知っていなければなりませんし、なによりもそのプログラムがNEONに依存したものになってしまいます。今回はコンパイラの最適化の機能を使ってNEONのSIMD命令を生成させるコツを紹介します。以前にSIMD演算のサンプルとしてこんなプログラムを書きました。z[3];}これだと実際にはNEONのSIMD命令は生成されませんが、これをちょっと書き直すとNEONのSIMD命令が生成されるようになります。ポイントは配列をループで使うこと。属性がついていること。そのポインタが他の変数と重なっていないことをコンパイラに知らせるためのものです。これらを修正したのが以下のプログラムです。いうファイルに格納します。4.4.0を使っています。コンパイルオプションは以下のものをつけます。生成されたコードは以下のとおり。.-vmla2NEONのSIMD命令が生成されましたが、積和命令でなく、乗算と加算に分かれました。このプログラムでは直前にメモリからロードしているので、そのロードの遅延を考慮するとこの方が速いのかもしれません。3つのオペランドのアライメントをチェックしていて3つとも16バイト境界にあるときのみNEON命令を使うようになっています。このサイトを参考にさせていただきました。17:22NetWalkerはgccがプリインストールされてて、セルフビルドが出来て幸せ。i.MX51はNEONを積んでて浮動点小数演算を加速したりできるらしいので、KMCさんのブログにある方法*1でベクトル演算命令を吐くかどうか試してみた。