S.F. Page

Programming,Music,etc...

音声ファイルから動画ファイルを生成する(47) - AVXとアラインメント

このようなアプリの出来具合で何なのだが、DirectX MathやらイントリンシックやらXbyakとかを使って少しSIMDなコードを作ってみたくなってとちょっとやり始めてみている。まずはXbyakを使ってMFCopyImageのY方向逆転コピー版をまず作ろうかなと着手したところである。

私のCPUはCore i7 2700Kである。なのでAVXは使えるはずだ。AVX2が使えればもっといいけどHaswell以降サポートだからもし入れ替えるとなると今だと10万くらいの出費は覚悟しなくてはならない。おそらくCPUはCore i7 4770K(35K) 、グラボはGTX 750 Ti(20K)、マザーボードはGA-Z87X-UD5H(25K)あたりだろうか。あとメモリもいるな。。そういうわけで買えても価格が下がる半年以上あとでかつ中古かな。。

それはさておき、MFCopyImageのY方向逆転版はID3D11Texture2DをIMFSampleにコピーするときに必要なのである。まあここを高速化できたとしても大した実行速度の差は出ないだろうけれども簡単そうなのでAVXの勉強にはちょうどいいだろうという判断だ。まあこのあとベクトルの演算とか、FFTコードをAVX化とかできればいいなぁと思っているが。実のところ自分がアセンブラを書いたところでどう書けばいいかあまりわかっていないからパフォーマンスアップはあまり望めない気もしている。

実時間に音楽を再生しかつ動的にグラフィックを生成するのではなくて、いったんMP4ファイルに書き出してYoutubeにアップして再生するためのツールを作ろうとしているので、MP4出力時に時間をかければ質の高いグラフィック(プロ並み?)を出力することもできると思う。ただ質を上げるために処理時間がかかりすぎるのもやる気が萎えてくるので、そこそこのパフォーマンスは必要になってくる。まだ質を上げる技術は獲得できていず、いまだにDirectX11の1/10くらいの能力しか使いこなしていないレベルで言うのも憚るのだが、「質も上げつつパフォーマンスも上げることを志向する」ことを目指しているのである。できるかどうかは別にして。

でSSEやAVXをやろうとするとアライメントの問題が出てくる。これが結構面倒くさい。クラスにアトリビュートを指定したり、new時のメモリ確保方法を変更したりしてアラインメントを32バイト境界で揃えないといけないのである。クラスのアライメント指定はさておき、newをオーバーライドしてアラインメント版を実装するのも結構面倒くさそうである。スマポを返すような生成メソッドをつくって配置newとかした方が簡単なのかなと思ってみたりとか。