MT support page

はじめに

Avisynth MT(MT は Multi-Threaded(マルチスレッド)の略)は、次の 2 つのコンポーネントから構成されています:

  1. Avisynth API をスレッドセーフ*1にする修正版 AviSynth。SetMTMode() と GetMTMode() という 2 つの関数も含む。
  2. フレームをより小さな部分に分割し、各スレッドを異なる部分で動作させる MT() フィルタ。

Avisynth MT に関する追加の資料は、以下のリンク先にあります:

リビジョン

  • 0.7 修正版 2.5.7.5 avisynth.dll [1]
  • 修正版 2.5.7.4 avisynth.dll [2]
  • 0.6 修正版 2.5.7.3 avisynth.dll [3]
  • 0.5 修正版 2.56 avisynth.dll [4]
  • 0.41 [5]

MT 使用法

重要: CPU の使用率ではなく、スピードの向上を見ることによって、結果を判定することをつねに忘れないでください。

シンタックス

インストール

  • mt.dll を AviSynth プラグインディレクトリにコピーし、同梱されている avisynth.dll を windows\system32 ディレクトリまたは avisynth.dll のあるところにコピーします。バージョン 2.6 をインストールしているのでないなら、(リネームするなどして)古い avisynth.dll のバックアップを取ることを忘れないでください。
  • 修正版 avisynth 2.5.7.5 は、SetMTMode() と GetMTMode() という 2 つの新しい関数を含んでおり、MT.dll からも必要されます。c:\windows\system32 の avisynth.dll を上書きすることによってインストールしてください(まず古いファイルのバックアップを取ることを忘れないでください)。

MT() と SetMTMode() の違い

MT() と SetMTMode() の違いは、foxyshadis によってこちらの doom9 フォーラムの投稿で説明されています。下の 2 つの画像は、MT() と SetMTMode()がいかに違ったやり方でフレームを処理するのかを表しています。フレームの緑の部分は、スレッド 1 によって、赤の部分はスレッド 2 によって処理されます。

mtexplae9.jpg
setmtexpldo5.jpg

MT() 関連

MT のシンタックス:

MT(clip clip, string filter, int threads, int overlap, bool splitvertical)

すべてのパラメータは名前付きです。

フィルタのパラメータ:

clip clip = last
入力クリップ

filter string = デフォルトなし
マルチスレッドで走らせるフィルタ。このフィルタはフレームの高さや幅を変更してはいけません(色空間は可)。そして 1 つの入力クリップのみ許容されます。これらの制限が守られる限り、どんな内蔵フィルタやユーザー定義関数や外部プラグインフィルタでもかまいません。

threads int = 2
走らせるスレッドの数。これをあなたのコンピュータで同時に走らせることが可能なスレッドの数に設定してください。

overlap int = 0
上下の縁または左右の縁に追加されるピクセルの数。フレームが分割されるところに人工ノイズが現れる場合はこの値を増やしてください。

splitvertical bool = false
true なら、フレームは垂直方向にカットされます(filter は高さを変更することが可能になる)。さもなければ、水平方向にカットされます(filter は幅を変更することが可能)。

MT 使用例

  • 普通の blur:
    MT("blur(1)",2,2)
    
  • ユーザー定義関数(variableblur 使用):
    MT("unsharp(2,0.7)",2,2)
    function unsharpen(clip c,float variance,float k)
    {
        blr = binomialBlur(c,vary=variance,varc=2,Y=3,U=2,V=2)
        return yv12lutxy(blr,c,"y x - " string(k) " * y  ",y=3,u=2,v=2)
    }
    
  • この例は意図した結果を生まないが、トリプルクウォートの使用法を示している:
    MT(""" subtitle("Doh") """,4,0)
    
  • まず高さを変更してから幅を変更する(もしくは、その逆の順番で変更する)ことによって、MT を高さと幅の両方を変更するリサイザと一緒に使用することが可能です:
    mt("spline36resize(100,last.height)")
    mt("spline36resize(last.width,200)",splitvertical=true)    
    
    は、
    spline36resize(100,200)
    
    と同じ結果になります。

SetMTmode() 関連

SetMTmode() のシンタックス:

GetMTMode(bool threads)

threads bool = false
true なら、GetMTMode は使用されるスレッドの数を返します。さもなければ、現在のモード(下記参照)が返されます。

SetMTmode(int mode, int threads)

時間軸の(すなわち、同時に 2 つ以上のフレームが処理される)マルチスレッドを有効にするために、AVS ファイルの 1 行目にこれを置いて下さい。以降のフィルタに対するモードを変更するするには、スクリプトの 1 行目より後で使用してください。

mode int (2, default 1-6)
1 から 6 までの 6 つのモードがあります。

  • モード 1 は、最も高速ですが、ごくわずかなフィルタに関してのみ動作します。
  • モード 2 は、たいていのフィルタで動作しますが、より多くのメモリを使用します。
  • モード 3 は、モード 2 で動作しないフィルタのいくつかで動作しますが、より低速になります。
  • モード 4 は、モード 2 と 3 を組み合わせたものでさらに多くのフィルタで動作しますが、より低速でメモリもより多く使用します。
  • モード 5 は、最も低速(SetMTMode を使用しない場合よりも遅い)ですが、直線的なフレームサービング(すなわち、フレームが 0,1,2,...,ラストのように順番に来る)を要求しないすべてのフィルタで動作するはずです。
  • モード 6 は、モード 5 を修正したもので、若干速くなっているかもしれません。

さらに詳しい技術的な説明は、こちらにあります: MT modes explained - Avisynth(Internet Archive)

threads int = 0
使用するスレッドの数。利用可能なプロセッサの数に設定するには 0 に設定してください。スレッドの数を最初の SetMTMode で指定した以外の数に変更することはできません。

ユーザーによって設定されるモード 0 というものは存在しません。代わりにモード 5 か 6 に設定してください。
[8] または [9] を参照。

使用例

SetMTMode(2,0) # 「thread = 利用可能なプロセッサの数」かつモード 2 を使ってマルチスレッドを有効にする 
LoadPlugin("...\fft3dgpu.dll") # fft3dgpu を読み込む 
Import("limitedsharpen.avs") 
src=AviSource("test.avi") 
SetMTMode(5) # これより下の行のモードを 5 に変更する 
src=src.converttoyuy2().fft3dgpu()# fft3dgpu を機能させるにはモード 5 にする必要がある
SetMTMode(2) # モードを 2 に戻す 
src.LimitedSharpen() # というのは LimitedSharpen はモード 2 でうまく動作するため
Subtitle("Number of threads used: " string(GetMTMode(true))
  \ " Current MT Mode: " string(GetMTMode())) # モードと使用中のスレッドの数を表示する

MT で動作することがわかっているフィルタ

テスト方法

  • やっかいなバグを見つけるために 50000 フレームのビデオを使用。
  • VirtualDubMod または VirtualDub または任意の AVS エディタで行う。
  • かかった時間/パーセンテージ/フレームレート、Avisynth.dll/MT のリビジョン、Avisynth フィルタのリビジョンまたは日付を教えて下さい。
  • テスト結果を Doom9 フォーラム関連スレッド (94996) と/またはここのディスカッションページ*2に投稿してください。

MT() モード

SetMTMode (1) または (2) で動作するすべてのフィルタ/スクリプトは、そのフィルタが入力クリップを 1 つのみ使用し、高さと幅の両方が変更されないなら、MT() モードで動作するはずです。

逆は真ではありません。

スピードは異なるかもしれません。自分でテストしてください。

リビジョン 0.5 以降、MT() は、内部で SetMTMode(5) を呼び出し、あとで古いモードに戻します。そのため、MT() の前に SetMTMode(5) を追加し、あとで古いモードに戻す必要はありません。[10] を参照。

  • tbilateral() [11]
  • limitedsharpen()/limitedsharpenfaster() [12] setmtmode(2) の場合により高速になる [13]
  • fft3dfilter() [14]
  • degrainmedian() は setmtmode(3) のときにより高速。[15] を参照。
  • Lanczos4Resize() は setmtmode(3) のときにより高速。[16] を参照。

SetMTMode() モード

Setmtmode(1)

モード 1 は最も高速ですが、動作するのはごくわずかなフィルタのみです。

こちらの Doom9 フォーラムの投稿を参照。

Setmtmode(2)

モード 2 は殆どのフィルタで動作しますが、より多くのメモリを使用します。

こちらの Doom9 フォーラムの投稿を参照。

  • Removegrain() [17]
  • fft3dfilter() (リビジョン 1.8 以降) [18] を参照。
  • Undot()
  • VagueDenoiser()
  • BlindDeHalo3()

こちらの Doom9 フォーラムの投稿を参照。

  • Convolution3D()
  • PeachSmoother()
  • LeakKernelBob() リビジョン 0.6 と avisynth 2.5.7.3 でのみ。

Setmtmode(3)

モード 3 は、モード 2 で動作しないフィルタのいくつかで動作しますが、より低速です。

Setmtmode(4)

モード 4 は、モード 2 と 3 を組み合わせたもので、さらに多くのフィルタで動作するはずです。しかし、より低速で、メモリの使用量も多くなります。

Setmtmode(5)

モード 5 は最も低速(SetMTMode を使わない場合より遅い)ですが、直線的なフレームサービング(すなわち、フレーム 0,1,2,...,最終というように順番にフレームが来る)を要求しないすべてのフィルタで動作するはずです。

  • Cedocida コーデック。[19] を参照。もしくは Setmtmode(6) を試してください。

Setmtmode(6)

モード 6 は、モード 5 を修正したもので、わずかに速い(が、SetMTMode を使わない場合よりもまだ低速)かもしれません。

MT で動作しないことがわかっているフィルタ

  • fft3dgpu() [20] を参照。
  • pixiedust() [21]

既知の問題は他の事を要求する

既知の問題

  • AVI Import Filter error: (Unknown) (80040154) - 解決策: 不足している dll が問題かもしれません: msvcr71.dll と msvcp71.dll が windows\sytem32 ディレクトリになければなりません。

− 修正済 −

  • Xvid エンコーダスピード(Xvid リビジョン 1.0x のみ)のパフォーマンスに影響を与えていた(2005 年):
  • スピード
    • スピードアップのためには HT(ハイパースレッディング)を切ってください。[22] を参照。
    • プロセッサの負荷をすべての CPU に対してほぼ 100% に維持するには、VirtualDub のエンコード開始後に他のアプリを起動させるべきではありません。 [23]
    • Avisynth 2.6 は 2.5.7 より高速であると報告されていますが、2.6 はプレアルファ版です。自己責任で使用してください。[24] を参照。
  • DVD Rebuilder で AVS スクリプトをカスタマイズするには、RP-OPT を使用してください。[25][26] を参照。
  • シングルクウォートの問題に関しては、トリプルクウォートを使用してください: MT("ffdshow("default")") の代わりに MT(""" ffdshow("default") """) を使ってください。[27] を参照。
  • Writefile() と SetMTMode() の問題に対しては、MT 0.6 と AviSynth 2.5.7.3 以降を使用してください。
  • spline36resize() に対する回避策は、[29] を参照。
  • Masktools は、v2.0a18 より新しいバージョンを使ってください。

註: このページは、MT support page - Avisynth(Internet Archive) の日本語訳です。翻訳時点における原文の最終更新日時は、12:48, 19 March 2008 です。このページに掲載されているテキストおよび画像のライセンスは、オリジナルのそれに準じます。詳しくは AboutLicense を参照。


*1 参考: スレッドセーフ - Wikipedia
*2 元々は、http://avisynth.nl/mediawiki/Talk:MT_support_page にあったが、2014-04-15 現在、ページが消えている。Internet Archive: MT support page - Avisynth

最終更新日時: 2014-03-12 (水) 23:39:55 (3691d)