カテゴリー

アーカイブ






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