PCI Expressのマルチチャネル DMA インテル® FPGA IPユーザー ガイド

ID 683821
日付 4/20/2022
Public
ドキュメント目次

8.1.3. 適用

アプリケーションの起動時に、ドライバーが提供する API を使用して、MCDMA 機能を読み出し、アプリケーション・コンテキストを作成し、BAR レジスターを開き、PCI Express 機能を初期化します。終了時に、アプリケーション・コンテキストをクリアし、すべてのチャネルを停止します。

複数のチャネルによるマルチスレッド

入力パラメーターに基づいて、アプリケーションはposix スレッド API を使用して複数のスレッドを開始し、キューをスレッドに関連付けて、一度に 1 つずつ個別に DMA トランザクションを送信します。この一環として、ドライバーはそのチャネルのテール レジスターを更新します。 IDアップデート、ハードウェアがチャネルをピックアップし、DMA 操作を開始します。

各スレッドは、次のタスクを実行します。
  1. BDF (バス デバイス関数) に基づいてデバイス・コンテキストを取得します。
  2. 利用可能なチャネルを取得します。
  3. DMA 対応メモリーを取得します。
  4. DMA動作を開始します。
  5. チャネルを解放します。

複数のスレッドが一度にチャネルを取得して解放しようとする可能性があるため、ユーザー空間ドライバー (libmqdma) は、チャネル管理の実行中に同期の問題を処理します。

スレッドのスケジューリング

POSIX ライブラリーがスレッド管理に使用されているため、Linux スケジューラがスレッドのスケジューリングを処理します。スレッドのスケジューリングを処理するカスタム・スケジューラはありません。

perfq_app は、DMA 操作のために単一のスレッドで複数のキューをスケジュールします。
  1. ユーザー (-c<num> )からチャネル数を読み出します。
  2. ユーザー (-a<num> ) からスレッド数を読み出します。
  3. DMA が 1 つのスレッドから実行する必要があるキューの数を計算します。
  4. TID が更新されるたびに、perfq_app はキューをスワップアウトし、別のキューにスワップして DMA 操作を実行します。