自動フィールドシフト 高速化版 +18
去年(2015年)は自動フィールドシフトを高速化できず、まことに遺憾であった。
でも、やっぱり執念深く高速化しようとは思っているわけで、やっとネタを思いついて、実装してみた。ところが、演算量が少し減るぐらいの話だったので、計っても全く分からない程度という情けない結果に終わった。
やはり演算量なんぞよりメモリアクセスを減らさないと速くならないようだ。全く残念だ。
なので、メインはプリセットボタンの追加、コンパイルオプションの修正など。
更新内容
・「デフォルト」ボタンを追加した。
設定をデフォルトに戻す。実はなかった。
・「24fps固定 (HD)」ボタンを追加した。
これがベストではないと思うけど参考程度に追加。とりあえずそんなに誤爆はしない…と思う。もともとの「24fps固定」はこのフィルタが作られた当時主流だったSD向けで、あまりHDには向いていないような気がしている。
・AVX2使用時に128bit境界またぎを減らしてわずかに高速化。
AVX2命令では、256bit演算とか言いつつ、ただの128bit演算×2をする命令がほとんどになっている。特にshuffle系とかvpalignr命令の「これじゃない感」はなかなか。まあこれを生かして上側128bitだけ電源を落として省電力化とかいう小細工をやっているようだが…。
で、128bit境界をまたぐためにはやや遅めの命令を使わないといけない。なのでこれが減るよう工夫した。
・afsvf.aufで、一部関数が遅くなっていた可能性があるのを修正。
AVX/AVX2命令を含む関数は、/arch:AVXオプションをつけてコンパイルしないと遅くなることがある。プロジェクト全体に/arch:AVXをつけると、プラグイン全体がAVX非搭載のCPUでは動かなくなってしまうため、AVX/AVX2を使う関数は専用のファイルにまとめて、そのファイルだけ/arch:AVXをつけてコンパイルするようにしている。
これをafsvf.aufのほうで、ある一つのファイル("afs_filter_avx2.cpp")で忘れてしまっていた。
今回、AVX/AVX2を使う関数のあるファイルに、以下のようにして、コンパイル時に、/arch:AVXをつけたかどうかチェックするようにした。念のため、のつもりだったのだが、見事にひっかかったので気づくことができた。
・その他、無駄な計算を減らしてわずかに高速化。
一部の演算にMMX命令とかを使ってみた。
自動フィールドシフトは遅いとか遅いとか、よく聞くので、さらに速くしたいものである。
ところが、いまは完全にメモリの速度に律速されていて、これを打破する方法が思いつかない(というかやりつくした)ため、このままいくとまた今年も速くなりそうにない。やはりYUY2フィルタモードとか、あるいは輝度だけ解析するモードとか、ともかく大きくSIMDコードを追加することになる更新をしないといけないかもしれない。
ダウンロード>> (skydrive) (dropbox)
でも、やっぱり執念深く高速化しようとは思っているわけで、やっとネタを思いついて、実装してみた。ところが、演算量が少し減るぐらいの話だったので、計っても全く分からない程度という情けない結果に終わった。
やはり演算量なんぞよりメモリアクセスを減らさないと速くならないようだ。全く残念だ。
なので、メインはプリセットボタンの追加、コンパイルオプションの修正など。
更新内容
・「デフォルト」ボタンを追加した。
設定をデフォルトに戻す。実はなかった。
・「24fps固定 (HD)」ボタンを追加した。
これがベストではないと思うけど参考程度に追加。とりあえずそんなに誤爆はしない…と思う。もともとの「24fps固定」はこのフィルタが作られた当時主流だったSD向けで、あまりHDには向いていないような気がしている。
・AVX2使用時に128bit境界またぎを減らしてわずかに高速化。
AVX2命令では、256bit演算とか言いつつ、ただの128bit演算×2をする命令がほとんどになっている。特にshuffle系とかvpalignr命令の「これじゃない感」はなかなか。まあこれを生かして上側128bitだけ電源を落として省電力化とかいう小細工をやっているようだが…。
で、128bit境界をまたぐためにはやや遅めの命令を使わないといけない。なのでこれが減るよう工夫した。
・afsvf.aufで、一部関数が遅くなっていた可能性があるのを修正。
AVX/AVX2命令を含む関数は、/arch:AVXオプションをつけてコンパイルしないと遅くなることがある。プロジェクト全体に/arch:AVXをつけると、プラグイン全体がAVX非搭載のCPUでは動かなくなってしまうため、AVX/AVX2を使う関数は専用のファイルにまとめて、そのファイルだけ/arch:AVXをつけてコンパイルするようにしている。
これをafsvf.aufのほうで、ある一つのファイル("afs_filter_avx2.cpp")で忘れてしまっていた。
今回、AVX/AVX2を使う関数のあるファイルに、以下のようにして、コンパイル時に、/arch:AVXをつけたかどうかチェックするようにした。念のため、のつもりだったのだが、見事にひっかかったので気づくことができた。
#if _MSC_VER >= 1800 && !defined(__AVX__) && !defined(_DEBUG)
static_assert(false, "do not forget to set /arch:AVX or /arch:AVX2 for this file.");
#endif
・その他、無駄な計算を減らしてわずかに高速化。
一部の演算にMMX命令とかを使ってみた。
自動フィールドシフトは遅いとか遅いとか、よく聞くので、さらに速くしたいものである。
ところが、いまは完全にメモリの速度に律速されていて、これを打破する方法が思いつかない(というかやりつくした)ため、このままいくとまた今年も速くなりそうにない。やはりYUY2フィルタモードとか、あるいは輝度だけ解析するモードとか、ともかく大きくSIMDコードを追加することになる更新をしないといけないかもしれない。
ダウンロード>> (skydrive) (dropbox)
スポンサーサイト