Habréの2012年には、ビデオカードのJPEGでの高速圧縮に関する私の記事が既にありました。 それ以来、かなりの時間が経ちました。このトピックで得られた結果について、一般的な用語で概説したいと思います。 多くの人が、CUDAの実際の問題を解決する際に、最新のNVIDIAグラフィックスカードでどの程度のパフォーマンスが得られるかを知りたいと思っています。
圧縮アルゴリズムの動作時間について説明するとき、データのロードとアンロードを考慮せずにビデオカードの動作時間を測定した結果を示します。 このアプローチは、複雑なコンピューティングシステムを編成する場合、すべての計算がビデオカードで行われ、一般的な処理スキームのほとんどの段階で、初期データと最終データがビデオカードのメモリにある場合に有効です。 コンピューティングと同時にデータをビデオカードにコピーしたり、ビデオカードからデータをコピーしたりする方法もあるため、ビデオカードでのアルゴリズムの実行時間の観点からパフォーマンスを議論することは正当化されます。 すべての測定は、NVIDIA Visual Profilerを使用して行われます。 JPEGアルゴリズムは、基本バージョン(ベースラインJPEG)で実装されています。つまり、標準の量子化テーブルとハフマンテーブルを備えた、算術コーディングとプログレッシブモードを使用しない、チャネルあたり8ビットです。
CUDA上のJPEGのコーディング速度は前回の出版以来大幅に向上し、NVIDIA GeForce GTX 1080ビデオカードでは0.74ミリ秒で、4サンプリングで24ビット4K画像(3840 x 2160)を10倍(90%品質)圧縮できます: 2:0、これは30 GB / sのオーダーのエンコードパフォーマンスに対応します。 8K形式以上の画像の場合、同様のパラメーターを使用した圧縮速度は、ほぼ1.5倍になります。
一方で、これはNVIDIAのメリットであり、高速なグラフィックカードを生成します。 一方、これはCUDAでのJPEGアルゴリズムの並列化と最適化の結果です。 PCI-Express x16(Gen3)を介したRAMからこのビデオカードへの非圧縮4Kイメージの転送時間は2.17 msです。 興味深い結果が得られます。JPEG圧縮は、非圧縮データをPCI-Express x16を介してコピーする速度と比較して、2.5倍速くなりました。 デコード速度はエンコード速度よりもはるかに遅れており、同様の4K画像を2.6 msでデコードできます。 近い将来、エンコーダとデコーダの間のこのギャップを埋めることを望んでいます。
このような高いパフォーマンスは、大きな配列またはデータストリームを処理する必要がある場合に必要です。 グラフィックエディターでJPEGで単一の画像を保存する場合、バーストモードは非常に必要ですが、この速度は必要ありません。 3DおよびVR視覚化のアプリケーションの開発者は、初期データをジープの形式で保存し、ビデオカードにコピーして、すでにOpenGLを介してモニターまたはメガネにすばやくデコードして出力するのが便利であるため、主に高速コーディングとデコードに関心があります。 したがって、高解像度、たとえば12メガピクセルの画像では100〜120 fpsの高フレームレートを実現できます。 高速デコードの重要な条件は、必要な数の再起動マーカーがジープ内に存在することです。これにより、デコード中に高度な並列化を実現できます。 これらの再起動マーカーがないと、JPEGデコード速度は1桁以上低下します。 エンコーダはデフォルトでこれらのマーカーを配置しますが、 jpegtranなどのユーティリティを使用してオフラインで追加することもできます。その後、ビデオカードのジープをすばやくデコードできます。
最新のビデオカメラを使用するために、CUDAに12ビットJPEGエンコーダーを実装しました。これも非常に高性能です。 1.2ミリ秒でGeForce GTX 1080グラフィックカードで90%の品質と4:2:0サンプリングで12ビット4K画像を圧縮します。 ほとんどのビデオカメラ(主に工業用および高速カメラで動作します)の場合、12ビットの範囲が基本的なニーズをカバーし、高い圧縮性能により、非常に高いフレームレートでも多くのタスクをリアルタイムで解決できます。
JPEGコーデックに加えて、デモ、リサイズ、ノイズリダクションなどのアルゴリズムもCUDAに実装しましたが、実際には、これはビデオカードのRAWデータを処理するための高速並列アルゴリズムのセットです。 これらのソリューションは、ビデオカメラからの画像の予備処理のほぼ完全なサイクルを提供し、モバイルTegra K1およびTegra X1を含むすべてのNVIDIAビデオカードで動作します。 近い将来、この機能に基づいて、BlackMagic Designムービーカメラからの一連のDNG形式の画像をリアルタイムで処理するためのアプリケーションをCUDAでリリースします。
JPEGコーデック、デモ、サイズ変更、ノイズリダクション、JPEG2000エンコーダーの詳細なベンチマークについては、 こちらをご覧ください 。