MCDM のアーキテクチャ
Microsoft Compute Driver Model (MCDM) ドライバーは、Windows プラットフォーム上でのハイ パフォーマンス コンピューティング タスクをサポートするように設計されたフレームワークです。 並列処理タスクで GPU、NPU、およびその他のコンピューティング リソースを使用できるドライバーを開発するための標準化されたインターフェイスを提供します。 MCDM ドライバーは、科学シミュレーション、データ分析、機械学習など、集中的なコンピューティング能力を必要とするアプリケーションに不可欠です。
この記事では、MCDM アーキテクチャの概念について説明します。 MCDM ドライバー (コンピューティング専用ドライバー) には、カーネル モード ドライバー (.sys ドライバー) とユーザーモード DLL (ダイナミック リンク ライブラリ) の 2 つがあります。
関連項目:
コマンド キュー
コマンド キューは、作業の送信に使用される DirectCompute コンストラクトです。 ドライバーは、送信された作業を実行に移すために使用するコンテキストを 1 つ以上作成します。 ドライバーは、DDI の呼び出しによって表される作業を DMA バッファーに変換し、実行に向けてコンテキストに送信する役割を担います。
Context
コンテキストは、インスタンス固有の状態を持ったエンジンを対象にドライバーから送信される計算作業のキューです。 計算作業は DMA バッファーとして表され、エンジンへの送信を待機する SW キューに保持されます。
SW キュー
実行に向けてコンテキストに送信された DMA バッファーは、SW キューに保持されます。 SW キューの長さの上限はリソースによってのみ決まります。 コンテキストとそれに対応する SW キューの間には 1 対 1 の関係があります。 スケジューラは、SW キューから DMA バッファーを削除し、適切なエンジンにバッファーを送信する役割を果たします。そのエンジンで、バッファーは独自の HW キューに配置されます。
スケジューラ
スケジューラ は OS によって実装されます。このスケジューリングを制御する権限は、ドライバーにはありません。
スケジューラは、エンジンを対象とする SW キューでエンキューされた作業をスケジュールする役割を担います。 すべての SW キューで限られたエンジン リソースが公平に使用されるように保証するほか、この公平性を徹底し、優先順位の高い作業がタイムリーに完了するよう、必要に応じて作業を中断 (プリエンプション) する役割も担います。
中断された作業を必要に応じて再エンキューするのは、スケジューラの責任です。
エンジン
エンジンは、一連の DMA バッファーで表される作業を完遂するために必要なアクションを実行します。 各 DMA バッファーは、特定のコンテキストとアドレス空間で実行されます。 エンジンは、DMA バッファーの実行が完了したことを通知する必要があります。これらの通知は、DMA バッファーが受信された同じ順序で行われなければなりません。
DMA バッファー内に明示的または暗黙的に指定された依存関係がない場合、エンジンには単独で処理を進める能力が必要です。 複数のエンジンが存在する場合、各エンジンの作業は、他のエンジンで行われる作業に支障をきたすことなく、タイムリーに進行することを前提としてスケジュールされます。
DMA バッファーは特定のアドレス空間で実行されるため、複数のエンジンがサポートされるのは、各エンジンが異なるアドレス空間で DMA バッファーを実行できる場合に限られます。
ドライバーは、自身が表すエンジンがいくつあるか、また、それらのエンジンが、作成するコンテキスト内でどのように使用されるかを決定します。
HW キュー
エンジンには、概念上、HW キューと呼ばれるキューに配置される一連の DMA バッファーが与えられます。 現時点では、このキューに格納される DMA バッファー エントリは 2 つまでです。 エンジンは、送信された順序で DMA バッファーを完了する必要があります。
優先
エンジンはプリエンプション機能を備えている必要があり、部分的に完了した DMA バッファーの実行を中断したり取り消したりできなければなりません。
未処理の作業を中断するよう要求された場合、エンジンは、部分的に完了した DMA バッファーの遂行を最低限支え、まだ開始されていない DMA バッファーについてはすべて取り消す必要があります。
DMA バッファーの完了または中断の指示もやはり、DMA バッファーが送信された順序で行う必要があります。 DMA バッファーが中断された場合、後続の DMA バッファー (現時点では 1 つのみ) もすべて中断されます。
DMA バッファーが部分的に実行された場合、ドライバーは実行を再開できるだけの情報を保存する必要があります。
DMA バッファー
DDI の呼び出しを介して送信された作業は、まずドライバーによって DMA バッファーに変換され、その後、送信されて実行されます。 エンジンは、一連の DMA バッファーで表される作業を完遂するために必要なアクションを実行します。 各 DMA バッファーは、特定のコンテキストとアドレス空間で実行されます。 エンジンは、DMA バッファーの実行が完了したことを通知する必要があります。これらの通知は、DMA バッファーが受信された同じ順序で行われなければなりません。
アドレス空間
アドレス空間は、仮想デバイス アドレスを物理デバイス アドレスにマッピングする目的で使用されます。 使用されるアドレス空間は、ホスト側のプロセスごとに 1 つです。
エンジンはプロセス間で共有されるリソースであるため、アドレス空間の切り替えをサポートする必要があります。DMA バッファーは、さらざまなプロセスから実行されるためです。
アドレス空間を 1 つしかサポートしないデバイスは、その使用を制限する必要があります。 デバイスの使用が許可されるのは、一度に 1 つのプロセスのみです。 あるプロセスがデバイスを使用している間、他のプロセスがデバイスにアクセスしようとしても、それらはすべて失敗します。 単一プロセスのアクセスしかサポートされないデバイスは、単一使用デバイスと呼ばれます。
アドレス空間は、そのルート ページ テーブルへの単一のポインターによって指定されます。 アドレス空間を切り替えるには、別のルート ページ テーブルのアドレスを指定するだけです。
OS でアドレス空間ページ テーブルを管理します。 ページ テーブルに変更を加える場合、OS はドライバーに対して、それらの変更を DMA バッファーに記録するよう要求します。変更が記録された DMA バッファーは、後で適切なタイミングで適切なエンジンに送信されます。