changelog>>[NVEncC]・vpp-delogoで自動フェードを有効にするとエラー終了する問題を修正。>>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。4.12で実装したvpp-delogoの自動フェードは、残念ながら遅いという問題があったので、高速化を試みた。やってだいぶ速くなったので、その方法とか。続きを読む続きを閉じるどのくらい遅いの?ざっくり言うと、450fpsぐらい出ていたエンコードが80fpsぐらいしか出なくなっちゃうぐらいには遅い。usというわけで、vpp-delogoを入れたとたん、速度がガタ落ちしてしまう。なんで遅いの?これをなんとか速くするには、遅い原因を探らないといけない。vpp-delogoの処理の大半はGPU上で動くCUDAのコードなので、まず気になるのはGPU使用率なのだけど、これが24.8%と低い。GPUでの演算が重いから遅いということではないらしい。Profilerで確認すると...クリックで拡大うーん。思った通りではあったのだけど、GPUで小刻みに計算が行われ、その合間に計算を何もしていない「隙間」の時間が大量にあることがわかった。この隙間の時間によって、GPU使用率自体は低いのだけど、計算終了まで時間がかかってしまって遅い、という状態になっていると予想できる。逆に、この「隙間」を詰めてやって、GPUが連続的に動くようにしてやれば、大幅な高速化が期待できる。処理のどこが原因?これは答えははっきりしていて、最適なロゴ消しの強さ(フェード値)を求める部分が原因となっていた。そもそも、最適なフェード値を求める方法は、ざっくり言うとこんな感じ。ロゴが消えてるっぽいフェード値が答えで、フェード値を変えてのところがミソで、ありうるフェード値を総当たりでやっているとさすがに遅い。繰り返し...とやっていくことで、評価回数を抑えて高速化する工夫がされていた。これをほぼそのままGPUに載せたのだが、ループ等による反復構造を図にするとこんな感じになっていた。GPU間のやり取りを行っていた。GPU間のやりとりはとてもとても遅いので、その時間が隙間の時間となってしまっている。いうか、計算はすぐ終わるので、計算してる時間より隙間の時間のほうが圧倒的に長い。GPU間のやりとりを減らしてあげる必要がある。そこで、厳密に最もよくロゴが消えるフェード値を探すのはあきらめ、一度複数(今回は17通り)のフェード値について評価結果を得たら、その結果を使って最適なフェード値を推定するようにした。GPU間は1往復で済むようになる。具体的にどう推定するかというと、まず17通りのフェード値でロゴ除去→消え具合の評価を行う。フレームによって、評価結果が変わってくるので、典型的な2パターンを載せてみた。パターンAパターンBこの図では、横軸にフェード値、縦軸がその時のロゴの消え具合で、値が低いほど「よく消えている」。フェード値が低すぎるとロゴが残ってしまい、逆に強すぎるとロゴが反転してしまってまたロゴが見えてくるので、あるフェード値で最も値が低くなる、という感じで、結局最小値を探索する問題になる。図を人間が見れば、最小値のありそうな場所ははっきりわかるのだけど、これをどう計算するかという問題。最小値/最大値の探索は、評価関数f(x)が明確であれば、ニュートン法やら勾配法やらを使えばよいのだけど、今回の場合は反復計算したくないのもあってそういうわけにもいかない。・図の両方のケース(パターンA/パターンB)に対応したい・最小値はプロット点の間になることもあるというわけで、お手軽な方法として、プロット点から近似曲線(2次)を求めて、近似曲線から最小値を得ることとした。ここで、プロット上の最小値を挟んで、左側と右側に分けてそれぞれ近似曲線も求めることで、パターンA/パターンBの両方に対応することができた。パターンAパターンB最小二乗法は3次までは比較的楽なので、近似曲線は簡単に求めることができる。(4次以上になると行列解くコード書くのが面倒)この方法を採用することで、オリジナルと比べて精度はやや落ちるものの、大幅に高速化できた。usエンコード速度は、自動フェードなしの場合とほぼ変わらない速度が出るようになったし、delogo自体の速度も大幅に改善した。いえ、まだなんか隙間があるんですよねー。残りの隙間は何かというと、自動NRを使用した場合に、NR強度を0~4まで変えて、それぞれ自動フェード値を求める必要があるので、5回のループが見えてしまっている、ということになる。クリックで拡大ところが、このNR強度を変えて...という部分は実は同時に行うことも可能だ。CUDAのstreamという機能を使うと、この同時処理が実現できる。隙間が少しづつ埋まってくると、ほかのところも気になってくる。残る隙間についても、CPUで行っていた処理の一部をGPUで行うようにすることで、CPU-GPUのやり取りをなくした。クリックで拡大まだ、隙間は残っているけど、とりあえず十分速くなったので、これでよしとした。それでもちょっと気になったのが、なんか周りのkernelと比べて異常に時間がかかっているkernelがあること。コードを書いた感じでは、このkernelが他と比べて遅い、というのは考えにくかった。調べていって、最終的にkernelコードの逆アセンブリを見ると、定数配列を一度Local変数に展開してから使うようなコードになっていて、これが非常に遅いようだった。定数配列をconstantメモリというものに載せてあげると、Local変数を使わなくなり、大幅に高速化した。usdelogoの処理時間はさらに減り、初めから比べると20倍超速くなった。まとめ・CPU-GPUの転送を減らすことで大きく高速化した。CPU-GPUの転送は、転送量が少なくてもレイテンシが辛いので、遅くなる原因になりやすい。・stream機能を使うと、GPU上で並列処理が可能になる。・kernelの配列は、うまく最適化してくれないときがあるので、気を付ける。Profilerはかなり使いやすい。CPUでもこういうのがあるといいのだけど、難しいのかな...。(そんなお金あったらCPU買ったりfgoに課金したり...)速いCUDAを書くのは難しい...ループ構造をCUDAで実装することそのものは決して難しくないように思う。一般的に言って、今回みたいに、素直にCPUのコードをCUDAに焼き直しただけだとまるで速度が出ないということが結構多い気がする。GPUで遅いなら別にわざわざGPUでやる必要はないので、GPUで動かす以上、速いコードを書かないと...という強迫観念がある。速度を出そうとすると、やれstreamを使えだの、やれsharedメモリを使えだの、まあなかなか面倒だったり難しかったりな話になるので、コードが複雑化して、非常に難しい。GPUの特性を考えれば、もちろん仕方ないことだとは思うし、それでもCUDAはもっと面倒なOpenCLと比べれば全然マシだったりするけど、それでももうちょっとなんとかならないの、と思う。え、そもそも数十usのkernelを連投するのが間違いだって?そんなこと言われてもねえ。4.12で動作しなくなっていた(NVEncCが異常終了する)のを修正。[NVEncC]・vpp-delogoの自動フェード・自動NRを大幅に高速化。高速化の詳細については、こちら。・高ビット深度出力時のvpp-padの動作を修正。>>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。3日目コミケ、お疲れ様です。今日も暑い...、と思いきや雲が多かったおかげでそれほどでもなかったですね。......正直湿度は相当高かったので特に館内の移動とか結構辛かった。...いや、ホント気を抜くとすぐ人の波に流されるし、疲れた。神奈川(の一部)は朝方、猛烈に雨が降っていたので心配だったけど、東京は全然平気でよかった。見えないけど雨の横浜駅(早朝)↓だいたいのものは変えたので良かったのかなと。前回の冬コミと違い、同人が東西に分かれてしまって、東西の行き来がかなり大変だった。東78を同人にして、企業は西12にしてくれればいいのだが...。続きを読む続きを閉じる見かけたものとか。25周年なのか...。]珍しく翡翠亭さんのグッズセットが買えた。無人少女さんは本だけ。4.12[NVEncC]・vpp-delogoに透過性ロゴ(改)の自動フェード・自動NR機能を仮実装。自動フェード・自動NR機能は結構複雑なのでGPUに載せにくいのだけど、これをなんとか動くようにしてみた。合わせてオプションの指定方法を変更(こちら)。logodata.ldp2,select=delogo.auf.ini,auto_fade=true,auto_nr=true,nr_value=3,nr_area=1ただし、純粋に自動フェード・自動NRのみのある程度簡素化した実装になっていて、オリジナルの機能はすべて載せることはできていない。プロファイルやカット編集の切り替わりを考慮する機能や、範囲指定して自動フェードのオンオフ等を切り替える機能、さらにロゴのON/OFF切り替わりシーンに基づいてロゴOFF区間をカットする機能とかは対応していない。オリジナルと完全に同じ処理をしているわけではないので、同じ結果にはならないと思う。あと、まだわりと遅いくて、自動フェードや自動NRを有効にすると、がくんと処理速度が落ちてしまう。現時点ではとりあえず動くものを実装しただけなので、速度の問題のほうは工夫する余地がまだ結構残っていると思っているので、今後頑張ってみたい。いうわけで、まだまだな感じもするけど、ひとまず動きますよ...ということで。コミケ終わったから再調整始めます。>>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。今日も暑かったですね...。今日は西ホールからだったので正面。3周年で大量に石もらったけど、そのあとの鬼のようなピックアップですぐ消滅...なお、fgo内のサバ☆フェスはこんな感じ。今回のサバ☆フェスのシナリオ、いろいろ面白すぎる。ピックアップ3、絶対あるよね...。暑い中参加された方、お疲れ様です...。今年はめちゃくちゃ暑いので覚悟はしてたけど、やっぱり暑かった...。風が少しあっただけましかも。今日はfgoとか艦これとか東方とかがあったけど、fgo本は多すぎて回り切れないのは明らかだったので、わりかしmelonとかとらにお願いしました...。アニメ化、期待しております。changelog>>[NVEncC]・一部の動画ファイルで、音ズレの発生するケースに対処。・BlurayオプションのGOP長の制限を緩和。>>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。3.09[QSVEncC]・進捗状況でtrimを考慮するように。・3.00以降、パイプ出力できない場合があったのを修正。・OpenCLがまともに動作しない環境でのクラッシュを回避。まれによくあることらしい。>>OneDriveの調子がいまいちの時はミラー(GDrive)からどうぞ。QSVEncBenchmark.zipはベンチマーク用です。run_benchmark.batをダブルクリックで実行です。QSVEncCのオプションについてはこちら。0このページのトップへホームこのページのトップへプロフィールAuthor:rigayaアニメとか見たり、エンコードしたり。