SSブログ

SIMD関係 [C++]

http://hillbig.cocolog-nifty.com/do/2007/12/ssewavelet_9ab8.html
SSEとかWaveletとか

MMXなどのアセンブラが必要な部分をマクロでラップしてるヘッダがついてるらしい。
VC2005には存在を確認。
VC2003やVC6は未確認。VC6ではProcessorPack入れれば入るらしいとのこと。

MMX -> mmintrin.h
SSE -> xmmintrin.h
SSE2 -> emmintrin.h
SSE3 -> pmmintrin.h
3DNow! -> mm3dnow.h

で、このままだとアセンブラわかってないと使いにくい。

http://download.intel.com/jp/developer/jpdoc/fvecfcs_j.pdf
http://www.ec.hokudai.ac.jp/documents/Intel/intel_ccl_80/c_ug/index.htm

ベクトルをクラス化して、C++お得意の演算子のオーバーロードをして
使いやすくしたものがついてるらしい

MMX -> Ivecクラス
SSE -> Fvecクラス
SSE2 -> Dvecクラス

それぞれ

#include <ivec.h>

などを追加すればOK

どっちにしろ、どういうデータを並列で処理したいか、というのは当然プログラマーが決める部分なので、はじめから並列化を念頭に組んでたプログラムでもない限りは、それなりの手間はかかる。
(complex型使って書いていたDFTをfvec32で無理やり書き直したところ倍近く遅くなってしまった。)

http://forums.microsoft.com/MSDN-JA/ShowPost.aspx?PostID=258824&SiteID=7
また、こんな不具合もあるようなので、要注意。

またSIMDを使ってまで高速化したい場合は、そもそもが別のところで気にしたほうがいいことが多い。
ネタはすべてへるみさんのところから。

・アライメントに気をつける(特にdoubleのアライメントがうまくいってない場合はえらい遅くなる)
・VC2005を使っている場合、floatとdoubleの区別がついていてdoubleが遅いので、オプションに気をつける
・VC2005で文字列を使っている場合、C++のisspaceはlocaleの関係でむちゃくちゃ遅くなっているので、ASCIIに限って使うのであれば、C版もしくは自分で実装したほうが早い

2005で速度がでないなーってときは2003やVC6でコンパイルして比較する癖は必要ですね・・・

んで、Xvidを高速化する余地はあるのかとちょっと調べて見たが
はじめからあらゆるアーキテクチャに最適化されたコードで書かれているので、コンパイラで変わる様な要素はほとんど無かった。

ベンチマークテストがあったので、動かして見たところ、Athlon64X2な環境では
・3DNOWを使うと遅くなるので使わないほうがよい
・SSE2対応が一番早い
・SMP対応はしてるんだかしてないんだかわからない

という結果が出てしまい、それだったら、最初からSSE2が早いIntel系のほうがいいんじゃないか という結論になってしまった。Xvidの内部的にはH.263をベースに動いているようで、計算を計算機がやりやすいようにしたH.264ではないのが、リアルタイムでキャプチャーできたかどうかの違いのように思えてきた。


nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。