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最適化版の方が速いようです。