Aviutl GPUフィルタ(OpenCL/CUDA統合版) clcufilters
これまでAviutl用のGPUフィルタは、まずCUDAを使用したcufiltersを作り、それからOpenCLを使用したclfiltersを作ってきた。
ひとつのフィルタの中に、複数のGPUフィルタを含んでいて、これらを一括して使える、という点は悪くなかったのだが、いくつか問題点があったので、そうした問題点を改善したclcufiltersというのを作ってみた。
cufiltersの問題点
1. CUDAなのでNVIDIA GPUでしか使用できない
まあCUDAなので仕方ないのだが、Intel/AMDのGPUで使用したいとなるとOpenCLを使うことを考える必要がある。
2. 32bitのCUDAだとCUDAのフル機能が使用できない
だいぶんと前からCUDAは32bitは徐々にフェードアウトしていく感じで、いろいろな機能が64bitのみ対応になってきている。例えば、--vpp-colorspaceは32bit CUDAではnvrtcが対応していないため動かすことができなくて、64bit CUDAが必要になってしまう。
また、32bitでのコンパイル自体、CUDAの次のバージョンで対応されるか怪しくなってきている。古いCUDAを使い続けるのも手だが、それもいつかは限界が来るだろう。
clfiltersの問題点
cufiltersのNVIDIA GPUだけ、という課題を解消すべく作ったのがclfiltersで、OpenCLベースとすることで基本的にはすべてのGPUに対応できた。
ところが、これもいくつか課題があった。
1. NVIDIA GPUでOpenCLだとかゆいところに手が届かない
いくつかのIntel/AMDでは普通にサポートされている拡張機能に対応していなかったりで、これを回避するため結構NVIDIA GPU用にまわりくどい実装が必要になって、実装がややこしいうえに、処理も非効率になってしまったりした。
あとはまあ、CUDAでは細かい制御ができるけど、OpenCLだとそうはいかない、みたいなところもある。
2. 32bitプロセスであるAviutlのメモリ空間を食う
これはNVIDIA GPUに限らないけど、やはりGPUフィルタは使用するフィルタによってはそれなりにメモリを使用することがあり、貴重なAviutlのメモリ空間をかなり使用してしまっていた。ほかの処理で使えるメモリが減るのは、Aviutlが不安定化する原因にもなる。
とにかくAviutlのメモリ空間は貴重なので、エンコーダにしろフィルタにしろ、メモリ量を食うものはなるべく外に出したいという感じになってきている。
clcufiltersの作成
ということで、このあたりを課題を解消したいと思って、clcufiltersを作ってみた。
clcufiltersでは、フィルタ処理を64bitプロセスに分離して、Intel/AMD GPUではOpenCL、NVIDIA GPUではCUDAで処理を行うようにした。
こんな感じで自動的にIntel/AMD GPUはOpenCL、NVIDIA GPUはCUDAが使用される。
実装はかなりややこしくてかなり時間がかかったけど、この仕組みで
1. NVIDIA GPUでCUDAが使えるので細かい最適化が可能になる
2. 64bit対応により32bitと異なりCUDAのフル機能が使えるように
3. Aviutlのメモリ使用量を最小限に
という感じで、これまでのいろんな課題をだいぶ改善できたのではないかと思う。
ただ、プロセス間のやり取りや、追加のメモリコピーがどうしても発生するので、速度面で有利かというとおそらくそうではなく、やや遅いかもしれない。どちらかというと機能面や安定性のほうが期待できそう。
動作環境
Windows 10/11 (x64)
Aviutl 1.00 以降
Intel / NVIDIA / AMD のGPUドライバのインストールされた環境
NVIDIAドライバは452.39以降
なお、32bit OSでは使用できません。
使用方法
ダウンロードしたら、zipファイルの中身をすべてAviutlフォルダにコピーしてください。
いつもの注意事項
無保証です。自己責任で使用してください。
clcufiltersを使用したことによる、いかなる損害・トラブルについても責任を負いません。
その他注意事項
申し訳ないですが、clfiltersとcufiltersは開発終了とさせていただき、clcufiltersを後継としたいと思います。
ダウンロード>>
clcufiltersの詳細
ひとつのフィルタの中に、複数のGPUフィルタを含んでいて、これらを一括して使える、という点は悪くなかったのだが、いくつか問題点があったので、そうした問題点を改善したclcufiltersというのを作ってみた。
cufiltersの問題点
1. CUDAなのでNVIDIA GPUでしか使用できない
まあCUDAなので仕方ないのだが、Intel/AMDのGPUで使用したいとなるとOpenCLを使うことを考える必要がある。
2. 32bitのCUDAだとCUDAのフル機能が使用できない
だいぶんと前からCUDAは32bitは徐々にフェードアウトしていく感じで、いろいろな機能が64bitのみ対応になってきている。例えば、--vpp-colorspaceは32bit CUDAではnvrtcが対応していないため動かすことができなくて、64bit CUDAが必要になってしまう。
また、32bitでのコンパイル自体、CUDAの次のバージョンで対応されるか怪しくなってきている。古いCUDAを使い続けるのも手だが、それもいつかは限界が来るだろう。
clfiltersの問題点
cufiltersのNVIDIA GPUだけ、という課題を解消すべく作ったのがclfiltersで、OpenCLベースとすることで基本的にはすべてのGPUに対応できた。
ところが、これもいくつか課題があった。
1. NVIDIA GPUでOpenCLだとかゆいところに手が届かない
いくつかのIntel/AMDでは普通にサポートされている拡張機能に対応していなかったりで、これを回避するため結構NVIDIA GPU用にまわりくどい実装が必要になって、実装がややこしいうえに、処理も非効率になってしまったりした。
あとはまあ、CUDAでは細かい制御ができるけど、OpenCLだとそうはいかない、みたいなところもある。
2. 32bitプロセスであるAviutlのメモリ空間を食う
これはNVIDIA GPUに限らないけど、やはりGPUフィルタは使用するフィルタによってはそれなりにメモリを使用することがあり、貴重なAviutlのメモリ空間をかなり使用してしまっていた。ほかの処理で使えるメモリが減るのは、Aviutlが不安定化する原因にもなる。
とにかくAviutlのメモリ空間は貴重なので、エンコーダにしろフィルタにしろ、メモリ量を食うものはなるべく外に出したいという感じになってきている。
clcufiltersの作成
ということで、このあたりを課題を解消したいと思って、clcufiltersを作ってみた。
clcufiltersでは、フィルタ処理を64bitプロセスに分離して、Intel/AMD GPUではOpenCL、NVIDIA GPUではCUDAで処理を行うようにした。
こんな感じで自動的にIntel/AMD GPUはOpenCL、NVIDIA GPUはCUDAが使用される。
実装はかなりややこしくてかなり時間がかかったけど、この仕組みで
1. NVIDIA GPUでCUDAが使えるので細かい最適化が可能になる
2. 64bit対応により32bitと異なりCUDAのフル機能が使えるように
3. Aviutlのメモリ使用量を最小限に
という感じで、これまでのいろんな課題をだいぶ改善できたのではないかと思う。
ただ、プロセス間のやり取りや、追加のメモリコピーがどうしても発生するので、速度面で有利かというとおそらくそうではなく、やや遅いかもしれない。どちらかというと機能面や安定性のほうが期待できそう。
動作環境
Windows 10/11 (x64)
Aviutl 1.00 以降
Intel / NVIDIA / AMD のGPUドライバのインストールされた環境
NVIDIAドライバは452.39以降
なお、32bit OSでは使用できません。
使用方法
ダウンロードしたら、zipファイルの中身をすべてAviutlフォルダにコピーしてください。
いつもの注意事項
無保証です。自己責任で使用してください。
clcufiltersを使用したことによる、いかなる損害・トラブルについても責任を負いません。
その他注意事項
申し訳ないですが、clfiltersとcufiltersは開発終了とさせていただき、clcufiltersを後継としたいと思います。
ダウンロード>>
clcufiltersの詳細