PMD_MT 高速化版

要望があったので、Aviutlのフィルタ、PMD_MTの高速化を試みた。

オリジナルはこちらにあるもの。素晴らしいフィルタを公開して下さり、ありがとうございます。

PMD_MT 高速化版



その名の通りPMD_MTの高速化版です。

もともとのCによるコードに対し
SSE2
SSSE3
SSE4.1
128bit-AVX
256bit-AVX
256bit-AVX2
256bit-FMA3
などにより高速化しました。(イントリンシックを使用)

自動的に使用可能な上位の関数が使用されるようになっています。

マルチスレッドにも対応しています。(オリジナル版からマルチスレッドには対応しています)

AVX/AVX2/FMA3命令を使用するには、CPUの対応のほか、OSがWin7 SP1以降であることが必要です。

オリジナルを作成されたエモリ氏、およびその改良版を作成された方に深く感謝いたします。



いつもの注意事項



このプラグインは無保証です。
プラグインを使用した結果について、作者は一切責任を負いません。




動作環境



Windows Vista, 7, 8, 8.1 (x86/x64)
Aviutl 0.99k 以降 推奨



高速化の詳細



SIMD演算によって高速化するはなし。

修正PMD「オン」の場合、処理は以下のように進む。

ガウスぼかし(縦・横)
 ↓
ガウスぼかしの結果を元に、ピクセルごとに重みを付けてノイズ除去を行う

この重みは、隣接するピクセルとの輝度差から計算される。ただ、この重み計算が厄介で、通常は整数演算と比べると相対的に「遅い」浮動小数点による計算になる。

オリジナルのPMD_MTでは、この重み計算を途中まであらかじめ行って、テーブルとして保存しておき、適宜この重みテーブルを参照して処理していた。こうすると浮動小数点演算は最初にテーブルを作成する時のみで済むようになり、全体として高速化できていた。

ところが、高速化にあたって導入したいSIMD演算はテーブル参照とはあまり相性が良くない。そこで今回のSIMD化による高速化では、「useExp」オプションがオフの時には、テーブル参照をやめて、愚直に浮動小数点演算によって行うようにした。テーブル参照をして演算量を減らすよりも、SIMDの馬力を活かしてひたすら計算したほうが速いみたい。(というより、AVXを使うと浮動小数点演算を一度に8演算、FMA3を使えば一度に16演算できるので、どちらかというとFMA3でゴリ押しできることを前提に作ってる…)

このように「useExp」オプションがオフの場合には若干計算方法がオリジナルと変わっているため、高速化版はオリジナルのPMD_MTとはごくわずかに処理結果が異なる(効果はほぼ同じ)。「useExp」オプションがオンの場合には相変わらずテーブル参照を使っているので、あまり速くない。

ほかにも毎フレームメモリを確保して破棄していたのをやめ、一度確保したメモリを使いまわすことでちょっと高速化した。(メモリの確保はとにかく遅いため、毎フレームメモリを確保→開放したりすると重くなる)



高速化結果



環境
Core i7 4770K (4C/8T, Core 4.4GHz / Uncore 4.2GHz)
DDR3-2600, 2ch, 16GB, 10-12-12-31
Z87 Extreme4

Aviutl 1.00

対象: 1280x720p, 2048フレーム

以下、1フレームあたりのPMD_MT単体の処理速度(2048フレームの平均)

PMD_MTは「修正PMD」「useExp」の2つのオプションがあるので、2x2=4通りあるのだけど、ここでは修正PMDはオンとして、useExpを「オフ」「オン」両方でのかかった時間を測った。



useExp オン

pmd_mt_useExp

gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他

こちらはuseExp「オン」なのでオリジナル同様重みテーブルを参照する形で処理している。それでもSIMD化の効果がある程度現れている。

otherのところがオリジナルと比べて速くなっている(というよりほぼかかってる時間ゼロ)のは、毎回メモリ確保していたのをやめたため。

AVXやAVX2の効果が薄いのが残念…。



useExp オフ
pmd_mt_noExp
gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他

こちらはuseExp「オフ」なので重み計算は浮動小数点でゴリ押し。でもSIMDだとそのほうが速い…。最新の命令を使うにつれ、順調に速くなる。特にAVX/AVX2/FMA3がかなりの威力を発揮している。

otherで時間がかからなくなってるのは、先ほど同様毎フレームメモリ確保せず使いまわすようにしたため。



まあでも、速くなったと言ってもPMD_MTはもともと重いフィルタではないので、効果は限定的かも。



ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(dropbox)からどうぞ。同じものです。





スポンサーサイト



コメントの投稿

非公開コメント

No title

要望対応、有難う御座いましたm(__)m
有難く使わせて頂きます!

No title

機能追加の要望ではなく質問です。

AMDのようなAVX2非対応だけどFMA3/4に対応してるCPUでは、AVX + FMAという組み合わせで動くんですか?

 ♦♦♦

機能追加の要望ではなく質問です(大事な事なので二度書きました)。

No title

AMDだとAVX + FMA3/4なのですね…

すみませんが、すっかり失念していたためAVX + FMAという組み合わせはありません…AVXのみのものが動くことになります。

(useExpオフでAVX2のみというのも存在せず、AVX2+FMA3のみとなっています、上のグラフにある組み合わせしかないのです…)

No title

存在感が薄いのは弱小メーカーの弱みですね。
ありがとうございました。
プロフィール

rigaya

Author:rigaya
アニメとか見たり、エンコードしたり。
連絡先: rigaya34589@live.jp
github twitter

最新記事
最新コメント
カテゴリ
月別アーカイブ
カウンター
検索フォーム
いろいろ
公開中のAviutlプラグインとかのダウンロード

○Aviutl 出力プラグイン
x264guiEx 3.xx
- x264を使用したH264出力
- x264guiExの導入紹介動画>
- x264guiExの導入
- x264guiExのエラーと対処方法>
- x264.exeはこちら>

x265guiEx
- x265を使用したH.265/HEVC出力
- x265guiExの導入>
- x265.exeはこちら>

QSVEnc + QSVEncC
- QuickSyncVideoによるHWエンコード
- QSVEnc 導入/使用方法>
- QSVEncCオプション一覧>

NVEnc + NVEncC
- NVIDIAのNVEncによるHWエンコード
- NVEnc 導入/使用方法>
- NVEncCオプション一覧>

VCEEnc + VCEEncC
- AMDのVCE/VCNによるHWエンコード
- VCEEnc 導入/使用方法>
- VCEEncCオプション一覧>

svtAV1guiEx
- SVT-AV1によるAV1出力
- svtAV1guiExの導入>
- SVT-AV1単体はこちら>

VVenCguiEx
- VVenCによるVVC出力
- VVenCguiExの導入>

ffmpegOut
- ffmpegを使用した出力
- ffmpegOutの導入>


○Aviutl フィルタプラグイン
自動フィールドシフト (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: aji様

clfilters 
- OpenCLベースの複数のGPUフィルタ集
- 対応フィルタの一覧等はこちら

エッジレベル調整MT (ミラー)
- エッジレベル調整の並列化/高速化
- SSE2~AVX512対応
- オリジナル: まじぽか太郎様

バンディング低減MT (ミラー)
- SSE2~AVX512による高速化版
- オリジナル: まじぽか太郎様

PMD_MT
- SSE2~AVX512による高速化版
- オリジナル: スレ48≫989氏

透過性ロゴ (ミラー)
- SSE2~FMA3によるSIMD版
- オリジナル: MakKi氏

AviutlColor (ミラー)
- BT.2020nc向け色変換プラグイン
- BT.709/BT.601向けも同梱

○その他
Amatsukaze改造版
- AmatsukazeのAV1対応版

x264afs (ミラー)
- x264のafs対応版

aui_indexer (ミラー使い方>)
- lsmashinput.aui/m2v.auiの
 インデックス事前・一括生成

auc_export (ミラー使い方>)
- Aviutl Controlの
 エクスポートプラグイン版
 エクスポートをコマンドから

aup_reseter (ミラー)
- aupプロジェクトファイルの
 終了フラグを一括リセット

CheckBitrate (ミラー, 使い方, ソース)
- ビットレート分布の分析(HEVC対応)

チャプター変換 (使い方>)
- nero/appleチャプター形式変換

エッジレベル調整 (avisynth)
- Avisynth用エッジレベル調整

メモリ・キャッシュ速度測定
- スレッド数を変えて測定
- これまでの測定結果はこちら

○ビルドしたものとか
L-SMASH (ミラー)
x264 (ミラー)
x265 (ミラー)
SVT-AV1 (ミラー)

○その他
サンプル動画
その他

○読みもの (ミラー)
Aviutl/x264guiExの色変換
動画関連ダウンロードリンク集
簡易インストーラの概要

○更新停止・公開終了
改造版x264gui
x264guiEx 0.xx
RSSリンクの表示
リンク
QRコード
QR