Open k2w4t4h opened 4 years ago
一応何かしらの処理はしてるみたいなんですが、なんかやたらスレッドが遊んでて、それは単に分割できる仕事がそんなに無いからなのか、それとも何か他に原因があるのか、明日見てみます
@k2w4t4h
CDEFとLoop Restorationフィルタだけはメインスレッドで実行されるので、これをまず無効にしてさらに画像のサイズを大きくして(3082x2048)みました:
サンプル画像に入ってる中では一番解像度が大きいhato.pngでやります。
cavif -i ../avif-sample-images/hato.png -o hato.1x1.avif --disable-cdef --disable-loop-restoration --tile-rows 0 --tile-columns 0 --crf 18 --show-result
cavif -i ../avif-sample-images/hato.png -o hato.2x2.avif --disable-cdef --disable-loop-restoration --tile-rows 1 --tile-columns 1 --crf 18 --show-result
davif -i ../cavif/hato.1x1.avif -o hato.1x1.png --threads 1
[2020/02/09 12:57:37 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 12:57:37 INFO ] Decoded in 257 [ms]
davif -i ../cavif/hato.1x1.avif -o hato.1x1.png --threads 4
[2020/02/09 12:58:11 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 12:58:11 INFO ] Decoded in 229 [ms]
--threads 1
だと全部メインスレッドでしか行わないのだが、複数個にすると一応デコードとその後の後フィルタ処理(CDEFとLoop Restorationは無効にしているのだが、7.14. Loop filter process
だけは切れないので残る)が並列で行われるようになるのですこーし速くなるっぽい。
davif -i ../cavif/hato.2x2.avif -o hato.2x2.png --threads 1
[2020/02/09 12:56:42 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 12:56:42 INFO ] Decoded in 245 [ms]
davif -i ../cavif/hato.2x2.avif -o hato.2x2.png --threads 4
[2020/02/09 12:57:04 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 12:57:04 INFO ] Decoded in 95 [ms]
2.5倍速ぐらいにはなったのでとりえあず「並列実行されてます!」と言い張ってもよいのではないだろうか。
分割の仕方についてなんですが、特定のy座標の処理が全部終わるまで全スレッドを待ってからフィルタを掛ける処理が入っていたので、たぶん横に4分割するよりは縦に4分割するほうが速そうに見える
間違ってはなさそうだけど、言い切るには10回ぐらい測定して検定でもしないと何とも言えないやつだ…
davif -i ../cavif/hato.1x4.avif -o hato.1x4.png --threads 4
[2020/02/09 13:17:05 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 13:17:06 INFO ] Decoded in 96 [ms]
davif -i ../cavif/hato.4x1.avif -o hato.4x1.png --threads 4
[2020/02/09 13:18:43 DEBUG] dav1d ver: 0.5.2-75-g8974c15
[2020/02/09 13:18:43 INFO ] Decoded in 85 [ms]
規格を読む限りCDEFも別スレッドでタイルごとに動かせるような気がしてならないので「なんでしないの?」って聞いてみるのはありかもしれない
聞いた
Why loopfilter + cdef + restoration are not applied in separated tile-threads? (#331) · Issues · VideoLAN / dav1d · GitLab https://code.videolan.org/videolan/dav1d/issues/331
https://github.com/link-u/cavif/issues/8 でファイルの分割はできるようになり、 https://github.com/link-u/davif/commit/dff371cda1dd5fbfa8779a80194338a5300cb577 でマルチスレッドにも対応したんですが、速くなりませんなぁ。
1x1
2x2 (
--tile-rows 1 --tile-columns 1
)なんか同じスレッドに仕事投げ続けてないかとか調べてみます。