Menu

#490 MMX/SSE命令によるアルファブレンド

None
closed
nobody
None
5
2013-08-10
2013-05-03
novice123
No

MakeColor2()関数をMMX/SSE命令で記述しました。
MakeColor2()関数を呼び出したときの平均クロック数(RDTSC命令使用)は
・既存...50~51ぐらい
・MMX/SSE...26~27ぐらい
となり多少は改善できているようです(サンプリング数は10000回)。
USE_SSEを定義するとMMX/SSEで記述した処理が有効になります。

1 Attachments

Discussion

  • aroka

    aroka - 2013-05-05
    (a - b) * alpha /256 + b
    

    として、mm4 を使わないようにしてもよいのではないでしょうか

     
  • novice123

    novice123 - 2013-05-05

    ご指摘の通り、mm4を使用しなくても計算できました。
    ・MMX/SSE...21~22ぐらい

     
  • aroka

    aroka - 2013-05-05

    ぱらぱらとすみません
    64bit版では有効にならないようにしたほうがよいと思います
    movdを引数の順序に集めて、SSE処理との間を空けたほうが効果がでたと思いました(試せていません)
    pxor mm0, mm0; // mm0 = 0

        movd mm1, a;
        movd mm3, b;
        movd mm2, alpha;
    
        punpcklbw mm1, mm0; // a:a:a:a
        punpcklbw mm3, mm0; // b:b:b:b
    
        pshufw mm2, mm2, 0; // alpha:alpha:alpha:alpha
    
     
  • novice123

    novice123 - 2013-05-06

    64bit版の件については、USE_SSEを定義しなければ影響はないので、
    64bit版でSSE処理を追加したときに考えたいと思います。

    また、引数の順番とmovdの移動は試してみましたが、違いが分かりませんでした。

     
  • aroka

    aroka - 2013-05-06

    64bit版の処理、承知しました。
    同じレジスタへのアクセスを空けるのはPenIIとかの古ーい話だったかもしれません。ごめんなさい。

     
  • novice123

    novice123 - 2013-05-07
    • status: open --> closed
     
  • novice123

    novice123 - 2013-05-07

    CPUアーキテクチャの違いで変わりそうですが、、昔のCPUが手元にないので
    arokaさん案を反映したパッチを適用することにしました。

    rev2974でコミットしました。

     
  • novice123

    novice123 - 2013-08-09

    64bit版に対応するため、Intrinsicsで記述しました。
    MMXレジスタ -> SSEレジスタに変更しました。
    ifdefは、USE_SSE -> USE_SSE2に変更しました。

     
  • novice123

    novice123 - 2013-08-10

    MinGWでもコンパイルできるようにしました(-msse2 -DUSE_SSE2)。

     
  • novice123

    novice123 - 2013-08-10

    [r3303]でcommitしました。

     

    Related

    Commit: [r3303]


Log in to post a comment.

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.