MCDM のアーキテクチャ

この記事では、Microsoft Compute Driver Model (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 バッファーは、後で適切なタイミングで適切なエンジンに送信されます。