2011/04/20

DGDecode on Avisynthの速度

DGDecode - User Manual
Qualitywise: IEEE-1180 Reference > 64-bit Floating Point > Simple MMX (XviD) > Remaining iDCTs.
Speedwise: SSE2/MMX and SSE/MMX (Skal) are usually the fastest. The IEEE-1180 Reference is easily the slowest.

精度と速度の兼ね合いになるというのは当たり前なのですが、とりあえず一番早いやつはどれなんだろうというのを調べてみました。

Athlon64だと32 bit simple mmx (xvid) が一番早かったよ(by UncasMS)、という話もあるのですが、
iDCT and its impact on encoding times [Archive] - Digital Video Forums
それは当時の最新CPUの話で、今はまた別です。

とりあえず手持ちのXeon X3350(≒Core2Quad9450)@3.2GHz + Win7 64bit + DDR2 960MHz 6GBで調べてみました。
方法は5748frameのd2vファイルに対し、

pa_pa_set(ScriptName+".csv",", ")
DGDecode_MPEG2Source(vsource,idct=1~7)
pa_pa("last")
return last

ってなスクリプトを作り、

avs2pipe_gcc.exe video %1 >nul

なバッチファイルで実験した結果
        time[s]     fps
Total,  47.097303   122.0452  - 1: 32-bit MMX
Total,  44.569595   128.9668  - 2: 32-bit SSEMMX
Total,  39.992818   143.7258  - 3: 32-bit SSE2MMX
Total,  54.603527   105.2679  - 4: 64-bit Floating Point
Total, 119.720955    48.0116  - 5: 64-bit IEEE-1180 Reference
Total,  40.995461   140.2106  - 6: 32-bit SSEMMX (Skal)
Total,  45.682227   125.8257  - 7: 32-bit Simple MMX (XviD)

ってな感じに。
やはり、というか当たり前の話というか、SSE2が一番早い、という結果が出ました。


次に精度を調べるため。基準をIEEE-1180のリファレンスに取って、PSNRを求めてみました。

ref=DGDecode_MPEG2Source(vsource,idct=5)
target=DGDecode_MPEG2Source(vsource,idct=3)
compare(ref,target,"","hoge.log")
       Minimum   Average   Maximum
PSNR:   57.2801   66.2722  105.7890   Overall PSNR:   64.8699    - 1: 32-bit MMX
PSNR:   57.2801   66.2722  105.7890   Overall PSNR:   64.8699    - 2: 32-bit SSEMMX
PSNR:   57.2801   66.2722  105.7890   Overall PSNR:   64.8699    - 3: 32-bit SSE2MMX
PSNR:  101.0178  111.6039  111.8096   Overall PSNR:  111.3280    - 4: 64-bit Floating Point
PSNR:   57.0100   66.0122  101.8096   Overall PSNR:   64.4922    - 6: 32-bit SSEMMX (Skal)
PSNR:   64.8524   70.5898  104.8199   Overall PSNR:   69.6416    - 7: 32-bit Simple MMX (XviD)

1-3は演算結果が全く同じようなので、一番早いのを使うのがよいのでしょう。
精度も必要という場合は 64-bit Floating Pointが誤差が1以内だったので良いのではないかと。


また、MPEG-2 VIDEO VFAPI Plug-Inも最近最適化されたという話とDGDecodeより早くなったというベンチマークをPOPさんのところでやっていたのですが、Core2でどうなのかはわからなかったためm2v.vfp v0.75経由で読みだしたときの速度もついでに調べてみました。
POP@4bit » Blog Archive » AviUtlプラグイン「MPEG-2 VIDEO VFAPI Plug-In」が大幅に高速化。ついにDGMPGDecを凌ぐ速度へ!

で、結果は
      time[s]     fps
Total, 141.1712     40.7165   m2v.vfp(浮動小数点)
Total,  61.1951     93.9290   m2v.vfp(整数 32bit LLM)
Total,  54.6766    105.1273   m2v.vfp(整数 32bit AP-922)

となり、これを見る限り、SandyBridgeでは速くてもCore2系ではそうでもないっぽいです。

追加でCore i7 2600K@4.5G+DDR3 1600 9-9-9で7146frameな別の対象でやった結果は↓な感じで
194.465fps -1
208.223fps -2
250.210fps -3
183.132fps -4
135.801fps -5
241.795fps -6
215.911fps -7
Core2と傾向は同じですね。

そして、m2v.vfpも調べてみたのですが、POPさんのところのようにはなりませんでした。
69.548fps 浮動小数点
129.716fps 整数 32bit LLM
141.457fps 整数 32bit AP-922
・・・MTなavisynth.dllだとダメなんですかね?
SetMTmode(2,0)とか入れてみたけど変わらず。m2vのverが0.75だとダメだとか?
謎。

ま、僕はしばらくDGDecodeで行きますか。

2012/01/16追加
m2v.vfpが11月ごろにアップデートされ、速くなったらしいです。
MPEG-2 VIDEO VFAPI Plug-In
2011, 11/18 Ver. 0.7.5a
Intel Composer XE 2011 update.7 (icl ver. 12.1.1.258) でリビルド
(ver. 0.7.5 で遅くなったと報告があり、このバージョンで解消が確認できたため)

ってなわけで再調査。@i7-2600K@4.5GHzで上記とは別のソース。
107.043fps 浮動小数点
216.097fps 整数 32bit LLM
245.187fps 整数 32bit AP-922
をぉ、確かに0.75に比べて劇的に早くなってます。
というわけで上記のテストでm2v.vfpのパフォーマンスが振るわなかったのはverの所為ということで。
で、以前とソースが変わっているのでDGDecode1.5.8(SSE最適化版)でも1パターンだけ試験したところ、idct=3で275.801fps。・・・DGDecode最適化版の方が速いようです。

0 件のコメント:

コメントを投稿