Zero-Copy in DekTec Matrix API® 2.0

CPUおよびメモリ帯域幅を節約し、4K処理性能を大幅に向上

DekTecの Matrix API® 2.0 は、同社のPCIeカードを介してSDIストリームを受信・送信する、ソフトウェアベースの映像処理ソリューションを容易に開発するための使いやすいAPIです。

新しい Zero-Copy(ゼロコピー)機能 により、カードとPC間での映像データ転送時に発生するオーバーヘッドを低減し、可能な限り高効率なデータ処理を実現します。

本記事では、Zero-Copy機能の内部動作について詳しく説明します。

SDIアプリケーション向けMatrix API

Matrix APIは、ソフトウェア上でオーディオおよびビデオのリアルタイム処理を可能にするC++クラス群です。

ビデオエンコーダやデコーダなど、ソフトウェアベースでありながらリアルタイム動作および低遅延が要求される、PCベースのプロフェッショナル向けA/V(オーディオ・ビジュアル)アプリケーションで広く利用されています。

特に、DekTecのSDI PCIeカードを介してインターフェースを構成する場合、Matrix APIはSDIレイヤーの複雑な処理を完全に隠蔽し、アプリケーション開発を大幅に容易にします。

一方で、UHDのエンコードやマルチチャンネル映像処理をすべてソフトウェアで実現するなど、性能限界に挑戦する用途では、システムレベルで解決すべきいくつかの課題があります。

  • まず第一に、映像ストリームの処理には大量のCPUサイクルが必要となるため、CPUコアを効率的に活用する最適化されたコードを作成することが不可欠です。このため、Matrix APIではピクセル変換処理においてSSE/AVX命令を広範囲に利用しています。これにより、Matrix APIによるCPU負荷を大幅に低減し、ユーザーアプリケーション側で利用可能なCPU処理能力を最大限確保できます。
  • 第二に、あまり目立たないものの、メモリ帯域幅も限られたリソースです。映像フレームをホストメモリ内で移動させる場合、特に4K映像を処理する際には、必要となる帯域幅が急速に増大します。例えば、1フレームのUHD映像データは約20MBであり、60fps(毎秒60フレーム)で処理すると、データ量は約10Gbpsになります。さらに、コピー処理ではデータの読み込みと書き込みの両方が発生するため、必要となる総メモリ帯域幅は実に20Gbpsにも達します。

 

実際の運用環境では、メモリ帯域幅がCPU処理能力よりも大きなボトルネックになる場合があります。

メモリ帯域幅の使用量を削減するため、最新バージョンのMatrix APIには Zero-Copy(ゼロコピー) と呼ばれる新機能が搭載されています。

本記事の以降では、このZero-Copy機能がどのように動作するのかについて説明します。

Matrix APIの内部動作

以下の図は、DTA-2174Bを例として、Matrix APIを使用した場合の標準的なSDIデータ処理フローを示しています。

左から右への処理フロー:

  • DTA-2174BはSDIフレームを受信し、DTA-2174B本体に搭載された高性能DMAエンジンを使用して、ホストメモリ上の循環DMAバッファへデータを書き込みます。
  • Matrix API内のプロセスは、DekTecカードからの割り込み信号を待機します。この割り込みは、SDIフレームの一部(通常は1/4フレーム分)がDMAバッファ内で利用可能になったことを通知するものです。
  • この割り込みを受信すると、Matrix APIはDMAバッファからSDIフレームの解析処理を開始し、映像データ、エンベデッドオーディオ、およびアンシラリデータパケットを抽出します。映像データについては、ネイティブ形式である10bit UYVY映像フォーマットから、ユーザーが設定したピクセルフォーマットへの変換を、SSE/AVX命令を使用して実行します。
  • すべてのSDIデータの解析および変換が完了し、Frame構造体に変換されると、ユーザーが提供したコールバック関数が実行され、フレーム処理を開始できます。

 

注記:
SDI出力側(例:デコーダアプリケーションでの出力処理)におけるMatrix APIのフローも基本的には同様ですが、データ処理の方向は逆になります。

利便性に伴うコスト

前述した処理フローでは、ユーザーアプリケーションは、以降の処理に最も適したピクセルフォーマットで映像データを読み込みます(出力処理の場合は書き込みます)。

この利便性の一方で、デメリットもあります。
ピクセル変換処理では、ピクセルの変換を行いながら、DMAバッファから中間ビデオバッファへ映像データを実質的にコピーしています。

Matrix APIにおけるこの「コピー」処理により、メモリとの間で追加のデータ転送が発生し、使用するメモリ帯域幅が増加します。

ビデオエンコーダやデコーダのように、すでに大きなメモリ帯域幅を必要とするアプリケーションでは、避けることのできるコピー処理を削減することが非常に重要です。

そこで登場するのが Zero-Copy(ゼロコピー) です。

Zero-Copyによる解決

Zero-Copy機能は、ドライバのDMAバッファからビデオバッファへのコピー処理(出力の場合は逆方向のコピー処理)を排除します。

これは、ユーザーアプリケーションがDMAバッファ内の映像データへ直接アクセスできるようにすることで実現しています。
これによりコピー処理を回避できますが、その一方で、映像データはユーザーアプリケーション側ではネイティブ形式である10bit UYVYフォーマットでのみ利用可能になります。

高性能なエンコーダ実装では、Matrix APIにエンコード前のピクセルフォーマット変換を任せるよりも、ピクセル変換処理とエンコード処理そのものを直接組み合わせる方が、より効率的です。

以下の図では、エンコーダ用途のアプリケーションにおけるデータフローを再度示していますが、今回は映像処理にZero-Copyを使用した場合のフローとなっています。

基本的な考え方は、映像データをDMAバッファからフレームバッファへ転送するのではなく、Frame構造体に対して、DMAバッファ内に存在する個々の映像ラインへのポインタのリストを渡すというものです。

この方式により、ユーザーのコールバック関数はポインタを順番に参照しながら、DMAバッファから映像ラインデータを直接読み込み、その映像データをピクセル処理パイプラインへ渡すことができます。

 

注記:
SDI出力を行うアプリケーションの場合、Zero-Copyの考え方は同じですが、処理方向は逆になります。

つまり、アプリケーションはラインポインタによって指定されたDMAバッファ内の位置へ、映像データを直接書き込みます。

まとめ

Matrix APIを使用して4K UHD映像を読み込みまたは書き込みする場合、新しいZero-Copy機能により、約20Gbit/sのメモリ帯域幅を削減できます。

これは、一般的なPCで利用可能な総メモリ帯域幅の中でも大きな割合を占める量であり、その分の帯域幅を他の処理用途に有効活用できます。

その結果、特にマルチコアシステムでは、システム全体の動作がよりスムーズになります

お問い合わせ/Contact us