This entry was posted on 水曜日, 7月 23rd, 2008 at 13:04:35 and is filed under Scandinavia. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.


sse導入
最近は1エントリ書くのに1週間ぐらいかかります。
もう少しゆったりと仕事したいですわ
全関数の引数をconst参照に変更したところ
20%ほどパフォーマンスがあがった。うん、scandinaviaにも導入してみるかな
で、次の課題であるsseをベクトルクラスに導入してみる。
今までのクラスは以下のような構造
class VECT{
public:
float x,y,z;
};
SSE演算は16bitの4配列を同時に計算するので、
class VECT{
public:
float v[4];
};
こんな感じに変更。もちろんVECT.xみたいな処理をしている部分は
VECT.v[0]に変更しなければならないわけです
なるほど、こういうときにgetter/setterという思想が生きてくる訳か。一つ勉強になった
けど面倒くさいな、
で、Radium Softwareさんを参考にベクトルクラスのオペレータオーバーライドを
以下のように変更
inline VECT operator+(const VECT &a){
VECT ret;
asm (" movups %1, %%xmm0 \n"
" movups %2, %%xmm1 \n"
" addps %%xmm1, %%xmm0 \n"
" movups %%xmm0, %0 \n"
: "=m"(res) : "m"(*this), "m"(a)
: "xmm0", "xmm1");
return ret;
}
これでいつもの球200個をレンダリング
normal : 1.3450s sse : 1.31201s
全然変わらないじゃん。OTL
2%くらいか?
結局単なる演算に使うのはあんまり意味がないんじゃないかな、と
Template Expressionのように複数演算を一発で処理する場合に有効なのか
あとマトリクス演算をはさむような場合の方がよいのかも
まぁ次はマルチスレッドやります
Leave a Reply
