MakeColor2()関数をMMX/SSE命令で記述しました。 MakeColor2()関数を呼び出したときの平均クロック数(RDTSC命令使用)は ・既存...50~51ぐらい ・MMX/SSE...26~27ぐらい となり多少は改善できているようです(サンプリング数は10000回)。 USE_SSEを定義するとMMX/SSEで記述した処理が有効になります。
(a - b) * alpha /256 + b
として、mm4 を使わないようにしてもよいのではないでしょうか
ご指摘の通り、mm4を使用しなくても計算できました。 ・MMX/SSE...21~22ぐらい
ぱらぱらとすみません 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
64bit版の件については、USE_SSEを定義しなければ影響はないので、 64bit版でSSE処理を追加したときに考えたいと思います。
また、引数の順番とmovdの移動は試してみましたが、違いが分かりませんでした。
64bit版の処理、承知しました。 同じレジスタへのアクセスを空けるのはPenIIとかの古ーい話だったかもしれません。ごめんなさい。
CPUアーキテクチャの違いで変わりそうですが、、昔のCPUが手元にないので arokaさん案を反映したパッチを適用することにしました。
rev2974でコミットしました。
64bit版に対応するため、Intrinsicsで記述しました。 MMXレジスタ -> SSEレジスタに変更しました。 ifdefは、USE_SSE -> USE_SSE2に変更しました。
MinGWでもコンパイルできるようにしました(-msse2 -DUSE_SSE2)。
[r3303]でcommitしました。
Commit: [r3303]
Log in to post a comment.
として、mm4 を使わないようにしてもよいのではないでしょうか
ご指摘の通り、mm4を使用しなくても計算できました。
・MMX/SSE...21~22ぐらい
ぱらぱらとすみません
64bit版では有効にならないようにしたほうがよいと思います
movdを引数の順序に集めて、SSE処理との間を空けたほうが効果がでたと思いました(試せていません)
pxor mm0, mm0; // mm0 = 0
64bit版の件については、USE_SSEを定義しなければ影響はないので、
64bit版でSSE処理を追加したときに考えたいと思います。
また、引数の順番とmovdの移動は試してみましたが、違いが分かりませんでした。
64bit版の処理、承知しました。
同じレジスタへのアクセスを空けるのはPenIIとかの古ーい話だったかもしれません。ごめんなさい。
CPUアーキテクチャの違いで変わりそうですが、、昔のCPUが手元にないので
arokaさん案を反映したパッチを適用することにしました。
rev2974でコミットしました。
64bit版に対応するため、Intrinsicsで記述しました。
MMXレジスタ -> SSEレジスタに変更しました。
ifdefは、USE_SSE -> USE_SSE2に変更しました。
MinGWでもコンパイルできるようにしました(-msse2 -DUSE_SSE2)。
[r3303]でcommitしました。
Related
Commit: [r3303]