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 オン

gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他
こちらはuseExp「オン」なのでオリジナル同様重みテーブルを参照する形で処理している。それでもSIMD化の効果がある程度現れている。
otherのところがオリジナルと比べて速くなっている(というよりほぼかかってる時間ゼロ)のは、毎回メモリ確保していたのをやめたため。
AVXやAVX2の効果が薄いのが残念…。
useExp オフ

gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他
こちらはuseExp「オフ」なので重み計算は浮動小数点でゴリ押し。でもSIMDだとそのほうが速い…。最新の命令を使うにつれ、順調に速くなる。特にAVX/AVX2/FMA3がかなりの威力を発揮している。
otherで時間がかからなくなってるのは、先ほど同様毎フレームメモリ確保せず使いまわすようにしたため。
まあでも、速くなったと言ってもPMD_MTはもともと重いフィルタではないので、効果は限定的かも。
ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(dropbox)からどうぞ。同じものです。
オリジナルはこちらにあるもの。素晴らしいフィルタを公開して下さり、ありがとうございます。
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 オン

gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他
こちらはuseExp「オン」なのでオリジナル同様重みテーブルを参照する形で処理している。それでもSIMD化の効果がある程度現れている。
otherのところがオリジナルと比べて速くなっている(というよりほぼかかってる時間ゼロ)のは、毎回メモリ確保していたのをやめたため。
AVXやAVX2の効果が薄いのが残念…。
useExp オフ

gaussianH … ガウスぼかし(横)
gaussianV … ガウスぼかし(縦)
main … 重みを計算し、ノイズ除去
other … その他
こちらはuseExp「オフ」なので重み計算は浮動小数点でゴリ押し。でもSIMDだとそのほうが速い…。最新の命令を使うにつれ、順調に速くなる。特にAVX/AVX2/FMA3がかなりの威力を発揮している。
otherで時間がかからなくなってるのは、先ほど同様毎フレームメモリ確保せず使いまわすようにしたため。
まあでも、速くなったと言ってもPMD_MTはもともと重いフィルタではないので、効果は限定的かも。
ダウンロード>>
ダウンロード (ミラー) >>
OneDriveの調子がいまいちの時はミラー(dropbox)からどうぞ。同じものです。
スポンサーサイト