2006/6~2007/11までのログです
フィルタリングにGPUを利用する場合は、データ転送コストが重要になってきます。
つまり、CPUで全部処理した場合の時間が、GPUとCPU間の転送時間より相当長くなければ意味がありません。
というわけで、今回は一般フィルタの処理時間を計測するプラグインを用意してみました。
また、計測の単位を秒にあわせるため、gpu_ccも、秒単位での時間表示に変更しました。
これらを組み合わせて比較することで、GPU化すると速くなりそうなフィルタの目星を付けることができるかもしれません。
というわけで、秒単位での参考データです。
環境:P4-3.4EG,XPsp2,RadeonHD2600Pro(AGP),720x480
表の意味:: フォーマット:(Put,Proc,Get)(単位はミリ秒)
F32:(8.49, 1.23, 33.6)
F16:(6.78, 0.717, 20.0)
U16:(4.31, 0.863, 16.9)
S16:(4.32, 0.704, 16.9)
U10:(4.31, 0.957, 9.29)
ちなみに、データ量は720x480x(16,8,4)byteと計算できるので、バンド幅を計算すると、
to_GPU:630MB/s, to_CPU:150MB/s
ぐらいになります。
前回のGeForce7300GS(PCIe)では
to_GPU:1.8GB/s, to_CPU:600MB/s
なのでかなり差があります。
実際、(この例での)PCIeぐらいの速度があると、画像サイズによっては
GPU版の色調補正フィルタが速いこともあるようです。
それにしてもAGPは遅すぎるような気がします。
念のため、CCCで4xと8xを切り替えてみましたが変化なし???。
ってことは、4x相当でしか動作してないってことでしょうか?
4xでの理論値は、上り1GB/s,下り266MB/sなので、その6割なら辻褄が合いそうです。
今更ながら、GPUフィルタでの処理時間計測の方法に問題があったことに気付いて修正しました。
正式版ではこの機能自体を削除していましたが、今回のバージョン(1.4)では、この修正を行った上で、
測定機能を復活させたものを同梱しています。
以前、測定に協力していただいた方々には申し訳ありません。
(修正前のものでは、ほとんどの処理時間がGet時の時間として計測されてしまいます)
以下に、修正した測定方法での結果を示しておきます。
なお、画像サイズは720x480で、整数フォーマットのみで測定しています。
環境1:P4-3.4EG,XPsp2,RadeonHD2600Pro(AGP)
表の意味:: フォーマット:(Put,Proc,Get)(単位はクロック)
U16:(1.47e7, 2.92e6, 5.76e7)
S16:(1.44e7, 2.38e6, 5.75e7)
U10:(1.46e7, 2.92e6, 3.68e7)
環境2:C2D-2.13G,Vista,GeForce7300GS(PCIe)
U16:(3.03e6, 1.02e7, 8.95e6)
残りは対応せず
上下方向の転送時間、GPUでの処理時間もそれらしい値になっています。
(以前のものを参考にされた方はすみません)
話は変わって、上を読んで分かるとおりRadeonHD2600ProのAGP版を導入してみました。
7.10でもいまだに、Catalystでは対応してないといわれてドライバが入らない
(ファイルを書き換えれば入りますが)
など問題はありますが、安定はしています。
HD解像度でのベクターデインタレが可能だったり、DX9での対応フォーマットが多いなど、
地味におもしろい点が多いです。
(このあたりはGPUフィルタの改造に関連しています
次の3項目を更新しました。
1.Deinterlace Checker
EVRに対応してみました。
レンダラとダミーのソースフィルタを直結するようにしました。
(変なフィルタが間に入って、強制終了することがありました)
2.GPU色調補正フィルタ
16bit整数モードを追加しました。(R300,NV40以降)
ただし、Geforce系では問題があるようです。
3.インタレスレ その2 過去ログ
最後のあたりを補完しました。
ところで、あまり関係ないですが、今まで使っていたRadeonX1300(AGP)が
急にお亡くなりになられました。
まだ1年ちょっと(過去ログ参照)だったのですが、これもいい機会なので
2600pro(AGP)にでもしてみようかと思います。
(AGP版にはあまり良い噂を聞かないのが心配ですが)
とりあえず、今はオンボード(865G)を使っています。
上の1,2は865Gで気付いた不具合対策なども反映されています。
Vistaから使えるEVRですが、DirectShowから使う場合について少し調べてみました。
(EVRはXPでも.Net3.0を入れると、一応DLLが入りますが、登録しても使えません)
これまでのDShowでは、YUVからRGBに変換する場合のマトリクスや、伸張するかどうか、などを
明示的に設定する仕組みが標準では存在しませんでした。
EVRでは、このあたりをどうにかできるという噂を聞いたので、調査してみました。
まず、EVR自体とピンが提供するインターフェースを見てみましたが、
それらしきものはありませんでした。
そこで、ふと、VIDEOINFOHEADER2の解説を見てみると、変更点がありました。
(おそらく Windows SDK for Vista 以降)
予約領域の一部を DXVA_ExtendedFormat とみなすようにしたようです。
さて、実際にこの設定が反映されるかを試してみました。
Vista+GF7300GS(v162.22)では、EVR使用時のみ効果があり、かつ変換マトリクス指定だけが
反映されているようです。
VMR7/VMR9(YUVミキシングモード含む)およびXPではまったく無視されるようです。
どいうわけで、DXVA2フィルタと同じく、Vistaでしかまともに使えないという感じです。
あと、この実験の過程でedvdec.axに上記のパラメータの追加機能を付けてみました。(v0.9.9)
デフォルト値は適当なので、いろいろ試してみてください。
EVRはXPで使えないとか書きましたが、再度試したところ使えました。
evrprop.dllも利用可能です。
ですが、XP(sp2)+RadeonX1300ではDXVA2フィルタと同じく、
マトリクス指定等は無視されています。
GPUでのデインタレースを利用したフィルタが作れないものかと考えていましたが、
DXVA2.0を使えば何とかなりそうだったので作ってみました。
はじめは、DXVA2はVistaのみでしか使えないと思っていたので、気が進まなかったのですが、
DXVACheckerの登場や、WindowsSDK内のサンプル(DXVA2_VideoProc)がXPでも動作することがわかり、作ってみることにしました。
その結果できたのがこのフィルタですが、残念ながらあまり実用的ではありません。
以前のGPUフィルタでも問題だった、処理結果のコピーがやはり重く、これがネックになっています。
また、XPでは一応動作するものの、一度RGBに変換する必要があったり、YC伸張設定が無視される、
などの問題があり、一応動く、という程度のものです。
ドキュメント等もあまり無いため、かなり試行錯誤しましたが、それでもまだ動作が怪しいです。
設定によっては、強制終了したり、エラーが表示されますが、いろいろ試してみてください。
なお、テストした環境は以下の組み合わせのみです。
・XP+RadeonX1300(AGP)
・Vista+Geforce7300GS(PCIe)
DXVA2 Video Processing Device についてもう少し調査してみました。
さらに下位のレイヤーでの詳細を知るため、Windows Driver Kitのドキュメントを参照しました。
1.サンプルの並べ方
デインタレース時の参照データの並べ方ですが、WDKのドキュメント内の"Input Buffer Order"
に従うようです(dstは除く)。
基本的に、参照フレームを時間的に古い順に与えるようです。
つまり、dxva_ires.aufでは"サンプル順を逆にする"をチェックするのが正しいです。
GF7300の場合は、どのモードでも参照フレームは現フレームしか必要としないので
影響がなかったようです。
2.XPではYUV内で処理できないのか?
SP2以降ではVMRにYUV Mixing modeが追加されていて、ドライバ側にも対応する機能があるので、
理論上出来そうなのですが、手元のXP環境ではYUV出力出来ません。
DXVA2のエミュレーションレイヤーで対応していないだけなのかもしれません。
3.YUVサーフェスの高速コピー
WDDM(Vista)のドライバ側の機能では出来そうなのですが、
D3D9(Exも)のインターフェースからではコピーできないみたいです。
(検証不足です)
遅くなりましたが、インタレスレその2の過去ログをあげておきました。
(ただし不完全です)
3月頭にぎりぎり購入できていたのですが、ほとんど使っていません。
活用するとすれば、PCをどうにかしてからになるでしょうか。
あとフィルタですが、久々にDShowのフィルタを作ってみました。
ネタとしては結構良さげだったのですが、音声周りはかなり苦労(というか資料が無い)しました。
適当な上に汚いソースがそれを物語ってます。
入力プラグインのv2.xはv3.xと大きく違っていることに今更気付いて対応しました(v0.9.6)
よく考えるとQ-tableが可変になったわけで、ヘッダも扱うように変更になっています。
ということで、v2.xへの対応をしてみましたが、v2.xでの録画ファイル自体は入手できなかったため、
テストはできていません。
また、この変更により、入力プラグインを読み込むディレクトリは、デフォルトのインストール先のみとしました。
バグフィックスと機能追加を行ったものをアップしました(v0.9.5)
また、念のためダイナミックリンク版も用意してみました。(手元の環境では違いはないようですが)
こちらを利用する場合は、対応するライブラリがインストールされている必要があるので注意してください。
(msvcr80.dll v8.0.50727.762)
最近携帯を変えてみました。
N703iμという機種なのですが、早速?動画再生機能を検証してみました。
ファイルフォーマット的には、mp4形式(3GPでなくてもOK)に対応しているということですが、
映像についてはMPEG4 SPまでの対応みたいです。(AVCはだめみたい)
テストファイル自体は、変換君ではなくAviUtl+neroAacEnc+MP4Boxで作ってみました。
音声については、AAC-LC,SBR,PSまでいけるようですが、なぜかPS部は再生してくれないようで、
モノラルなままでした(neroのせい?)
動画については、Xvidで320x240,30fps,1Mbpsぐらいは問題なく再生できます。
あと、動画についてはVFRも問題ないようです。
余談ですが、MP4BoxはAVIでの120fpsVFRなファイルは扱えません。
多分普通はtc2mp4を使うのでしょうが、なぜか手元ではエラーがでて使えませんでした。
(PCに入れてあるperlがおかしくなっているからでしょうか?)
というわけで、MP4Box側を適当に改造して、直接インポートできるようにしてみました。
(ただしSP,ASPだけです。事情によりパッチという形ですが、上のリンクにおいてあります。
この携帯には関係ないですが、B-VOPにも対応しています。)
もっと関係ないですが、この携帯はSD Audio対応で、SD-Jukebox V6がついてきます。
このSD-Jukebox V6ではiTunesで作成したAACファイルをインポートできますが、
neroAacEncで作成したファイルはインポートできません。
どうやらいくつかチェックポイントがあるみたいなので、ファイルを書き換えてインポート
できるようにするプログラムも作ってみました。
これも上のパッチと同じzipファイルに入れてあります。
ついでに書いておくと、この携帯のSD-Audioプレーヤとしての使い勝手はもう一歩という感じです。
レスポンスや連続再生などの点で、まだ携帯のおまけ機能から脱し切れていません。
ただ、電池持ちは比較的よいです。
ということで、やっと完成しました。
exaviの改造にはいろいろと問題があったので、
こういう形がよいだろうとは思っていましたが、なかなか面倒で・・。
ファイルの日付を見る限り一年以上放置してましたが、
yv12_srv.auoからいろいろと持ってきて、何とか完成しました。
あと、いつものことですが、テストはかなり適当なので、
バグがたくさん残っていると思います。
注意してください。
出力プラグイン側でウインドウを作成するような場合(ステータスなど)、
表示ができない問題があったので修正しました。(v0.5)
出力 別スレッド化プラグインを更新しました(ver0.4)
報告いただいた、中断した場合に起きる問題に対策をしたつもりです。
実のところ、手元の環境では、中断時に発生する問題(停止しない・異常終了)を再現できませんでした。
ただ、中断のチェックが通常の出力プラグインの場合と異なっていたのは確かなので、
普通と同じような動作になるように修正しました。
ということで、やっぱり中断時におかしくなってしまう可能性があるかもしれません。
もし問題が残っていたら、発生した状況を詳しく教えてください。
(必ず問題が発生するパターン、発生確率が高いパターンが分かれば対応しやすいです。
とは言え、手元で再現できないとデバッガ利用等々のため解決は難しいです)
修正の過程で実際の効果を少し調べてみたので書いておきます
環境:XPsp2,P4-2.8E(HT)
auo_mt(0.4)+exavi(0.3.11)+aviutl(0.99)+xvid(1.2?)
900フレームの720x480(Huffyuv)ファイルのエンコード時間を測定
フィルタはノイズ除去+時間軸ノイズ除去を利用(あとの細かい部分は割愛)
auo_mt無効-フィルタなし:79sec
auo_mt無効-フィルタあり:100sec
auo_mt有効-フィルタなし:66sec
auo_mt有効-フィルタあり:73sec
HTTシステムでの測定なのであまり参考にはなりませんが、最大3割程度の高速化です。
(ただ「auo_mt有効-フィルタなし」でのCPU利用率が6割程度だったりします。
またHT自体の改善効果がもともと最大3割ということだったような気がします。)
これはこれは良いものを見つけました。
色々試したところ、
まるも氏の拡張 AVI 出力で出力フレームレートを指定しても、次に設定ウィンドウを開いたときに必ず960になっている。
出力を中断すると、いつまでたっても中断しないときと、強制終了するときがある。
以上。
報告ありがとうございます。
ご指摘の問題ですが、
・exaviでのフレームレート指定がおかしい
手元の環境(aviutl_v0.99 + exavi_v0.3.11)でとりあえず調べてみましたが、
そういった問題は確認できませんでした。
考えられる原因ですが、
(a)他の出力プラグインを(auo_mtで)選択した
一度他のプラグインを選択し出力すると、以前のプラグイン設定は初期化されます。
(ただしバッチ出力の場合は別に保存されるので問題なし)
(b)設定フレームレートが60から960の間でない
オリジナルのexavi.auoは出力FPSが60-960しか設定できなかったと思います。
(あじさんのexaviplus.auoでは1-960が指定可能です)
といったものが思い浮かびましたが、ひょっとしたら私が何か見落としてるのかもしれません。
・出力を中断した場合の挙動がおかしい
この問題については、いろいろと思い当たる点があるので、調査してみます。
ということで、少し時間をいただきたいと思います。
条件どれかひとつ満たす(OR)で指定時間経過後に終了のみONで使用時、
残り時間を指定を1:00:00にしても2m40s位で終了してしまいます
CPUはアスロン64 X2 3800+で
Aviutlは0.99です
また指定日時に終了では正常動作します。
よろしくお願いします
細かい話ですが、残り時間表示の計算方法に問題があり、
残り時間が表示されない場合がありました。
この点を修正したものを再び上げておきました。
小出しの修正になってしまいすみません。
修正したつもりでしたが、何かおかしい気がします。
もう少し調べてみます。
報告いただいた不具合を修正したものをupしました。
原因は、3600x10000000を32bitで計算したために
結果があふれてしまうという単純(ありがち?)なものでした。
wait.auoは確か、一番最初に公開したプラグインだった気がしますが、
自分ではまったく使ってなかったので気がつきませんでした。
報告ありがとうございました。
正常に動作するようになりました。
ありがとうございました。
実験していただいたお二方には、私の趣味に付き合っていただき、本当にありがとうございました。
このテストのポイントは、ひと手間かけてデータ量を半分にしてメモリ帯域を稼ぐのか(F16)、
そのままやり取りするのか(F32)、どちらがよいのかを見極める、
というところにありました。
結論としては、目的に応じて使い分けるのが良さそうです。(公式版では切り替えられるようにしておきました)
CPUtoGPUは32Fが有利で、逆は16Fに分がありそうです。
GPUでは解析っぽいことをやらせて、結果は小さいデータ(単一の値や、整数ビットマップ)
を受け取る、といった方法なら、AGPでもそこそこ使えるような気がします。
(SM4.0でPIXEL_YCを直接渡せるようにするのがたぶんベストですが)
と、少し考察してみましたが、実際どんなフィルタを作るのかはまったく未定です。
(そもそも最近ほとんどエンコードしてないので。)
GPUを利用したAviUtl用フィルタを作ってみました。
実際の利用にはいろいろと問題があるのですが(Readmeを読んでみてください)、
それなりに動くようです。
普通に考えると無茶なアルゴリズムや処理内容でも、それなりにいけそうな感じです。
定格に戻すのが面倒ですのでOCのまま載せます
OS:Windows2kSP4
CPU:ath64 3800+x2 (2.5GHz)
MEM:2G (DDR416)
GPU:radeon x1800GTO2(PCI-E,MEM512M)
size:640x480(F32)
cycles(CPU:2499MHz)
Put :4.472243e+006
Proc :8.554229e+006
Get :2.431110e+007
size:640x480(F16)
cycles(CPU:2499MHz)
Put :1.510831e+007
Proc :4.714495e+006
Get :1.942347e+007
何かの足しになれば。
テストしていただいて、ありがとうございました。
AGPの場合、32FでのGet/Putが一桁以上も差があるのに比べて、
PCI-eではそこまでひどいことにはなっていませんね。
ただ、やっぱりGPUtoCPUは遅いみたいです。(私が用意した測定コードに問題があるのかもしれませんが・・)
環境
OS:WindowsXP SP2
CPU:Pentium4 2.4CGHz
MEM:1GB(DDR400 Dual)
GPU:Radeon9600(128MB,AGP8x)
size:640x480(F32)
cycles(CPU:3000MHz)
Put :1.496823e+007
Proc :1.398844e+007
Get :3.311682e+008
size:640x480(F16)
cycles(CPU:3000MHz)
Put :3.335242e+007
Proc :9.091972e+006
Get :1.857207e+008
こんなのでいいのかな
わざわざ、ありがとうございました。
やっぱりAGPということで、傾向は似たような感じですね。
F16でのGetの短縮効果を見ると、帯域の狭さがネックになっているのがよく分かります。
サブマシンでの結果です
環境
OS:Windows2000 SP4
CPU:PentiumIII 866MHz
MEM:512MB(SDR133)
GPU:GeforceFX5700(128MB,AGP4x)
その1(FP32)
size:640x480(F32)
cycles(CPU:873MHz)
Put :1.228818e+007
Proc :1.588672e+007
Get :7.431881e+007
その2(FP16)
size:640x480(F16)
cycles(CPU:873MHz)
Put :3.642531e+007
Proc :8.562097e+006
Get :5.964055e+007
一部バグがあったので、ファイルを入れ替えました。
gpu0.aufの処理時間について、手元の環境での結果を書いておきます。
環境
OS:WindowsXP SP2
CPU:Pentium4 2.8EGHz
MEM:1GByte(DDR400 dual channel)
GPU:RadeonX1300(256MB,AGP8x)
その1
size:640x480(F32)
cycles(CPU:2793MHz)
Put :8.983710e+006
Proc :1.114946e+007
Get :1.216163e+008
その2
size:640x480(F16)
cycles(CPU:2793MHz)
Put :1.953958e+007
Proc :6.667946e+006
Get :7.518854e+007
やっぱり、AGPの帯域では(AGP8x CPU- GPU:2GB/s,GPU- CPU:266MB/s)
あまりメリットが無い気がします。
AGPの上り(GPU to CPU)帯域について、今ひとつはっきりした資料が無かったので探してみました。
少し古めですが、ATIのPCI-Eに関するページにそれらしいものがありました。
http://www.ati.com/technology/pciexpress/index.html
処理時間について(その1)と同じ環境で、リファレンスラスタライザ(ソフトウェア処理)
を利用した場合です。
その1
size:640x480(F32)
cycles(CPU:2793MHz)
Put :1.943436e+007
Proc:8.771163e+009
Get :1.880463e+007
その2
size:640x480(F16)
cycles(CPU:2793MHz)
Put :2.557278e+007
Proc:8.764301e+009
Get :1.918932e+007
当然ながら、処理本体は異常に時間がかかります。
一方、データのやり取りはそれなりの時間で済んでいるようです。
基本的な動作や、変換係数などに変更はありませんが、
かねてから気になっていた点について変更してみました。
(1)YV12を優先
デコーダによってはYUY2出力のほうがYV12より優先されることがあり、
無駄な処理を行ってしまう可能性がありましたが、
これを避けられるようにしてみました(少しやっつけ)
(2)出力バッファ数を増やした
あまり効果は無いみたいです。
その他、一部デフォルト値を変更しました。
詳細についてはreadme.txtをご覧ください。
時間が無いにもかかわらず、6.6にしてみました。
6.5でおかしかった(?)ビデオモードが
直っているみたいです。
ただ、相変わらずアスペクト比が変です。。
(横に伸びすぎて、左右が切れたみたいになってます)
ゲストブックはカスタマイズできないので、
この掲示板システムに変更してみました。
JavaScript必須みたいですが、ご了承ください。
旧ゲストブックは近いうちに廃止します。
管理ページから訪問数は分かるので、これまでは必要ないと思っていましたが、
どうやら過去の訪問数は2年分しか保存されないみたいです。
というわけで、カウンタを追加してみました。
時間があったらもう少し掲示板を改造してみたいと思います。
(Konquerorでエラーが起きて読めないとか・・)