Multicore optimization idea: running consecutive filters in different threads - Doom9’s Forum
- 並列処理プラグイン。詳しくは、下記の「PipeLine とは?」を参照。
- QuaddiMM 氏作。
- 作者の実験によると、53% の速度向上が得られたそうです。CPU コアの数や、使用される PipeLine の数、ロードバランシングによって、さらなる向上も期待できるとのこと。
注意
- このプラグインは、まだ開発初期段階のようです。
- 実際に作者もテスト中にランダムクラッシュを経験したことがあるそうですので、通常のエンコードなどには使用しない方がよいと思われます。
PipeLine とは?
- MT プラグインとは異なるアプローチで並列処理を試みるプラグイン。
- MT ではフレームを分割するが、このプラグインでは前のフィルタからフレームを取得するために追加のスレッドを使用する。
- 以下のように動作する(Multicore optimization idea: running consecutive filters in different threads - Doom9’s Forum より):
- このフィルタは、フィルタチェインの前のフィルタからフレーム取得を行うワーカースレッドを実行する。
- 毎回、「GetFrame」が呼び出される。リクエストがワーカースレッドに送られ、フレームをリクエストしつつ、それが利用可能になるのを待つ。
- avs_pipeline.cpp の説明:
- 前のフィルタからフレームを取得するのに追加のスレッドを使用する。すべての前のフィルタを独立したスレッドで実行することは、複数の CPU コア間で作業を分割することを可能にする。
- ワーカースレッドは実際に必要になる前にフレームをリクエストする(つまり次のフィルタにまだリクエストされていないフレームを取得する)。こうして、パイプラインのように動作する。
- パイプラインのすべてのセグメントが同じように速くないようなケースでは小さなバッファがある。
- 複数のインスタンスを利用可能だが、ノンリニアなシークでパフォーマンスの低下を引き起こすおそれがある。
例
avs_pipeline.cpp より:
FilterA
PipeLine
FilterB
これを実行した場合を時間の流れでみると、以下のようになる:
--------+------------------------------------------->
Time
FilterA | gen(0)<-+ gen(1)<-+ gen(2)<-+ gen(3) ...
| | | |
--------+---------|---------|---------|------------>
FilterB | +-get(0) +-get(1) +-get(2)
| gen(0)<-+ gen(1)<-+ gen(2)<-+
--------+-------------------|---------|---------|------>
Output | req(0) req(0) +-get(0) +-get(1) .+-....
| req(1) req(2)
--------+----------------------------------------->
- req はフレームのリクエスト、gen はフレームの生成を表しているものと思われます。
- gen(\*) は 2 つ同時に行われる。
シンタックス
PipeLine(clip, int buffer_size)
パラメータ
- clip: ビデオクリップ。
- buffer_size: バッファサイズ。デフォルト: 8。
関連リンク
- Doom9's Forum 関連スレッド
追記
- AviSynth Wiki - その他のプラグイン に追加しました。