Advanced Vector Extensionsで速くなる演算とは?

いよいよIntelのSandy Bridgeがリリース目前と言うことでこのモデルから搭載される拡張命令「AVX」に興味がわいて調べたときのこと。

公表されている情報ではSSE系の処理を行っているXMMレジスタ(128bit)をYMMレジスタ(256bit)に拡張して扱うことで

256bitの単位で処理ができるというものです。が、疑問に思っていたことがいくつかあって、それを調べていくと・・・

AVXで整数SIMD命令は「一つも」ない

つまり、「整数演算領域ではAVXを使ってもほとんど高速にはならない(というか命令がない)」ということです。

整数でのPacked演算は上位128bitは「変更無し(SSE2状態)」もしくは「0クリア(AVX状態)」となります。悲しいです。

命令の仕様書をざっと読んだ限りではYMMレジスタ全体へのビットシフト系の命令もないようです。

あるのは主に

  • 256bitコピー命令 (レジスタ/メモリ、シャッフル命令など)
  • 64bit浮動小数x4への演算
  • 32bit浮動小数x8への演算
  • 浮動小数への積和演算といった複雑な処理

のように「レジスタコピー命令の拡張」「Packed浮動小数に対する演算の拡張」のようです。

ちなみに、一応論理演算命令であれば何とか256bit単位でできる命令があるようなのでまだましですね。

ADVゲームなんかで高速化するのはかなり無理があるかと

結局浮動小数の演算器の強化なので未だにARGBを各8bitで処理するようなゲーム系では実装の意味がほとんどありません。

まさか今の段階で2D描画処理が「32bit浮動小数ARGB」とかで組んでいるシステムがあるとも思えませんし。

せいぜいメモリコピーのさらなる高速化くらいですね。メモリコピーの速度が128bitと256bitで「1命令での速度が同じ」ならですよ。

3Dゲームや自前の動画デコードで浮動小数を使っているならそれなりの高速化が期待できるとは思いますが。

今の自分のプログラムだとせいぜい浮動小数DCT演算部の改良くらいかな・・・

浮動小数DCT部はSSEでの演算なのでx8になると行単位の演算速度は大幅に向上できるはずです。列方向はx4のPacked演算なのでAVXで記述できないのが残念です。

ただ、32bit浮動小数x8となることで8×8の領域において変な方法での演算ができるようになったりするような気もするのでそれはそれで早くなるのかも知れません。

Direct3Dなんかのエミュレーション描画処理なら十分なメリットがありそうですし、科学技術系でもメリットはあるとは思います。

今のところ実装する予定は無し

SSE2の時は無理矢理CPUを買って動作実験をしたものです。MMX,SSE=>SSE2の拡張はとんでもないほどゲームの高速化に影響があったのですがね・・・。

いよいよ普通の2Dゲームでも内部3D動作というのが一般的になっていくのでしょうかね・・・。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

この記事のトラックバック用URL