AVXを触ってみた

はるか昔、SIMDでライブラリを書きまくっていたころがあった。当時はまだ組み込み関数もなく(いやあったかも知れないけど)インラインアセンブラでゴリゴリ書いていた。やがて環境が32bitから64bitに移行して、苦労して書いたアセンブラがすべて動かなくなった。それ以来嫌になって書かなくなった。

最近、あるプログラムを書いていて高速化が限界に達して久しぶりにSIMDに手を出そうと思った。そしたらSSEでなく新しくAVXという技術が出来ていたことに気がついた。どうやら256bit幅の計算が出来るらしい。doubleなら4つ、floatなら8つ計算できるということらしい。しかも組み込み関数どころかクラスライブラリまであるではないか。これは開発しやすい。知らない間に便利になったものだ。

早速触ることにし、dvec.hをインクルードしてF32vec8を使おうとしたら・・・あれ?存在しない?F32vec4はあるのに。ちょっと調べてみたらVisualStudio2010ではdvec.hが古いらしい。intelから最新のを入れればいいらしいけど面倒くさい。とりあえずVisualStudio2012環境のあるPCに移動した。2012だと特に何も入れなくとも問題なくビルドできた。早速動かしてみたら落ちた。何でかなと思ったらCPUがAVXをサポートしていなかったorz なのでビルドしたexeをi7のPCに実行したら何とか動きました。無事AVXデビューできました(^^)

とりあえず簡単な手順書
1. クラスライブラリを使うため、dvec.hをインクルードする
2. プロジェクトのプロパティページから[構成プロパティ]->[C/C++]->[コード生成]->[拡張命令セットを有効にする]->[Advanced Vector Extensions(/arch:AVX)]に切り替える。もしくはコマンドラインに /arch:AVX を加える