SSIM を使って画像を評価していく前に、CalQ 自身の性能を評価してみます。
CalQ の計算精度
SSIM のホームページでは、アインシュタインの6枚の画像に対して SSIM 値を表示しています。
ここでは、CalQ を使って SSIM 値を求め、それらの値と比べてみます。
| 画像 | SSIM ホームページ | CalQ |
| | CPU版 | GPU版(本ソフト) |
| | | AMD | NVIDIA |
| Original | 1 | 1.00000 | 1.00000 | 1.00000 |
| Meanshift | 0.988 | 0.98836 | 0.98835 | 0.98859 |
| Contrast | 0.913 | 0.91327 | 0.91326 | 0.91640 |
| Impulse | 0.840 | 0.83956 | 0.83956 | 0.83945 |
| Blur | 0.694 | 0.69399 | 0.69399 | 0.69296 |
| Jpg | 0.662 | 0.66236 | 0.66236 | 0.66135 |
GPU版に先立ってCPU版(倍精度)を作ったのですが、この小数第4位を四捨五入すると、
SSIMのホームページの結果とまったく同じ値になります。
次に、GPU版です。ベンダーによって計算結果が異なっているのがわかります。
この結果を見ると、AMD の GPU が、CPU版に近い値を出していることがわかります。
動作確認に使用した GPU
CalQ は、作者にとって初めて公開する GPU ソフトになります。
ということで、データの収集とノウハウの蓄積もかねていろいろテストしていきます。
以下はテストに使用した GPU の一覧です。
ビデオカード
| 名前 | Radeon HD5770 | GeForce 9800GT | GeForce GTS450 |
| 画像 |  |
 |
 |
| コア数 | 800 | 112 | 192 |
| コアクロック | 850MHz | 600MHz | 783MHz |
| FurMark 0X | 4516 | 2795 | 3962 |
| FurMark 4X | 2332 | 2319 | 3036 |
| ゆめりあ | 96998 | 69345 | 61903 |
| 備考 | AMDの2世代前 GPU | 2008年頃のGPU 上位グ | 現行 Fermi 下位グレード |
| 製品名 | msi R5770 Hawk | 玄人志向 GF9800GT-E512HD/GE | 玄人志向 GF-GTS450-E1GH |
GPU統合CPU, オンボードグラフィックス
| 名前 | Core i5 2500K | HD4290 | HD3200 |
| 画像 |  |
 |
 |
| コア数 | 12 | 40 | 40 |
| コアクロック | 1100MHz | 700MHz | 500MHz |
| FurMark 0X | 549 | 337 | 193 |
| FurMark 4X | 36 | 232 | 100 |
| ゆめりあ | 28500(*) | 26375(*) | 5787 13522(*) |
| 備考 | HDG3000 SandyBridge | AMD 890GX オンボ | AMD 780G オンボ |
| 製品名 | Intel CORE i5 2500K | GIGABYTE GA-890GPA-UD3H REV2 | GIGABYTE GA-MA78GM-S2H |
GPU プログラミングでは、同じコードでも「ベンダーによって動作が異なる!」ということがよくあります。
コンパイラが GPU ドライバに内包されているので、「NVIDIA では、ちゃんと動くのに AMD ではコンパイル
すらできない!!」なんてこともあります。
だからといって、AMD, NVIDIA, Intel とそれぞれの GPU でテストするとなると、それなりに出て行くものは出て行きます。
上記GPU は、ゆめりあ順でソートしています。FurMark と ゆめりあは、ベンチマークソフトです。
短時間で測定できるので好んで使っています。DirectX ランタイムも要求しません。
いずれも数値が大きいほど性能が高いことを意味します。
P.S. ベンチ結果には、CPU性能やメモリも影響してきます。上の値はあくまで参考です。
ベンチマークソフトの入手先
FurMark
oZone3D.Net (英語)
(上記ベンチは、FurMark 1.8.5 を使用。1.9 系と1.8 系は異なります。)
ゆめりあベンチ
ゆめりあ.こむ (ナムコ)
ゆめりあ|ベンチマークソフト - Wiki
ゆめりあパッチ
え?日記
ベンチ設定
FurMark: Fullscreen 1024x768 Time-based 60000 ms で、AAの設定を変えて2回計測しています。
(Run Mode を Benchmarking にすればベンチをとれます。)
ゆめりあ: 1024x768 最高、但し(*) 付きはパッチを当てずに計測した値です。
CalQ の処理速度
CalQ を使って SSIM を計測したときにかかった時間をまとめてみました。
| CPU | GPU (ビデオカード) |
| Core i5 2500K | Phenom II 910e | HD5770 |
9800GT | GTS450 |
| 256x256 | 220.2 | 478.2 | 6.35 | 26.11 | 34.85 |
| 512x512 | 922.2 | 2234.2 | 22.90 | 86.64 | 125.47 |
| 720x480 | 481.0 | 1099.6 | 32.88 | 111.13 | 175.28 |
| 1920x1080 | 4273.0 | 10469.0 | 196.50 | 9〜31 [秒] | 888.83 |
(単位 ms,
青: GPU で最速、
緑: CPU で最速、
赤: 最も遅い)
HD5770 や、9800GT は2世代前のGPUですけど、それでも CPU に比べて十分に速いようです。
現行の GTS450 は、下位グレードということもあって両 GPU に速度で負けていることもわかります。
気になることは、大きな画像を扱ったときの 9800GT の挙動です。処理を終えるまでの時間が安定していません。
しかも、極端に遅くなります。
他にも、GTS450 の処理速度のバラつきが気になります。
表では、512x512 を求めるのに 125.47 ms と記しましたが、実はコンスタントに 70〜80 ms で算出することがあります。
条件はまったく同じです。
720x480 でもコンスタントに 95 ms あたりで算出することがあります。
また、1920x1080 では、速いときと遅いときで 450 ms ほど差があり何か不安定さを感じます。
補足) CPU版で、720x480 サイズのほうが、512x512 より速いという奇妙な逆転現象が起きています。
これは、Convolution を FFT で行っているためです。512と720 が 1024 配列で、480 が 512 配列で
FFT されるため 720x480 のほうが高速になります。
補足の補足) SSIM を求める工程で、画像に対してガウシアンブラーを行う必要があります。
そのときに、画像とガウシアンカーネルを掛け合わせるのですけど、この処理のことを Convolution
と言います。
Convolution は、半径が大きくなるととても計算コストが高くなります。
ただ、周波数領域では、この掛け合わせを掛け算1回で済ますことができるため
高速化できるのです。
そういった理由で、CPU 版は周波数領域で Convolution を行っています。
※ GPU 版は時間領域で Convolution しています。あと周波数領域での Convolution が
速いといっても、往復のコスト(FFT, IFFT)はそれなりにかかります。何でもかんでも FFT すればよいという
ものでもありません。
| CPU | GPU (オンボード) |
| Athron 5050e | Acer1410 の CPU | HD4290 | HD3200 |
| 256x256 | 605.4 | 1223.0 | 55.50 | 132.25 |
| 512x512 | 2769.3 | 5488.0 | 219.61 | 479.37 |
| 720x480 | 1337.8 | 2608.0 | 287.16 | 594.36 |
| 1920x1080 | 15511.3 | 25563.3 | 1614.30 | 2479.49 |
(単位 ms)
こちらの表は、オンボードグラフィックスや、少し遅めの CPU のデータを載せています。
CPU で計算させたとき、小さな画像なら1秒以内で処理を終わらせることができますが、
画像が大きくなると秒単位の処理時間が必要になります。
例えば、Phenom II で、512x512 の画像を処理すると 2.2 秒かかります。
このことからも、SSIM は計算コストの高い処理だとわかります。
ん。と、ここまで頑張って数値を並べてきたのですけど…、「CPU に対して何倍速い!」といったわかりやすい結論は出しません。
本当はそういった方向へもっていきたかったのですけど
実装アルゴリズムが違うのでミスリードしてしまう可能性があるからです。
それでも、HD5770 は、256x256 サイズの画像を 6.35 ms。fullHD サイズで 196 ms です。
静止画が相手なら十分な速さだと思います。
ちなみに、HD5770 は、1.34 TFlops。先月発表された HD7970 は、3.79 TFlops とのことなので、
もしかすると、「まだ、HD5770 なんて使ってるんだ。」などと言われてしまう日も来るかもしれません。
また、Core i5 2500K の CPU 性能より、AMD のオンボードグラフィックスのほうが速いというのも注目です。
あと、とても言いにくいのですが… Core i5 を含む SandyBridge 製品は、GPU を積んでいるものの、CalQ で使用している命令(API)
に対応していないため、SSIM の計算ができません。IvyBridge なら動くかもしれませんが、まだ発表されていない製品なので約束できません。
(→ 将来、Intel から提供されるドライバを入れれば動作するようになるかもしれません。)
補足)処理時間の計測は、7回計って最大値と最小値を除いた残りの5つの平均を求めました。
以上、CalQ の計算精度と処理速度について紹介しました。