SSEを使用するプログラム作成に今、ハマってます。というかちゃんと勉強を始めてみたところなのですが、意外とシンプルなアルゴリズムでもSSE2などを使ったからといって必ずしも早くなるとは限らないというのを体験しました。
やってみたのは、32bitのARGBの色並びをRGBAに並び替えるというものです。
普通にCPUでやると、 色を左8ビットシフト、アルファを右24ビットシフトを合成すれば並び替えは終了します。
この操作をよく見てみると実は、同じ色を並べてシフトするだけで実は並び替えが完了するということに気付き、せっかくなのでコレをSSE2でやってみた次第です。
AARRGGBB AARRGGBB –> RRGGBBAA RRGGBB00 (左に8ビットシフト. 左のブロックが並び替えが終わっている)
また初期のものをそのままSSE2で書いてみたものも用意して、これらを速度比較してみました。
最近のi7のCPUでは差が見えないだろうと思ったので、Pentium E6500 で実験してみました。
1024×1024画像で | |
標準 | 2.79 ms |
SSE2(1) | 3.29 ms |
SSE2(2) | 2.84 ms |
意外と標準状態のものが高速でした。
画像データがアライメントされていない状態でやっているためにSSE2にとっては不利だったかもしれません。
(速度を最速目指すと言うよりは、来たデータに対して最速を目指すというルールのため)
ちょっとコードがふくれてもSSE2にしたほうが高速だったりするケースもあるようですし、まだまだ勘所がわからないなと思います。
追記
32bit整数のビットシフトで扱わずに、バイト単位での入れ替え操作を記述している場合は、一番動作が遅かったです。
コメント