IDMLBindingTable::BindInputs メソッド (directml.h)
一連のリソースを入力テンソルとしてバインドします。
コンパイル済み演算子のバインドの場合、バインディングの数は、省略可能なテンソルを含め、演算子の入力数と正確に一致する必要があります。 これは、演算子の作成に使用される演算子の説明から決定できます。 バインドが多すぎるか少なすぎる場合は、デバイスの削除が発生します。 省略可能なテンソルの場合は、 DML_BINDING_TYPE_NONE を使用して 'バインドなし' を指定できます。 それ以外の場合、バインディングの種類は、演算子の作成時にテンソル型と一致する必要があります。
演算子初期化子の場合、入力バインディングは 、 初期化子の作成またはリセット中に演算子を指定した順序で指定された、初期化する演算子ごとに 1 つの入力バインディングを使用してDML_BINDING_TYPE_BUFFER_ARRAY型であることが想定されます。 各バッファー配列のサイズは、初期化する対応する演算子の入力数と等しい必要があります。 DML_TENSOR_FLAG_OWNED_BY_DML フラグが設定されている入力テンソルは、初期化中にバインドする必要があります。それ以外の場合は、そのテンソルに何もバインドしないでください。 演算子の初期化の入力としてバインドする必要がない場合 (つまり、DML_TENSOR_FLAG_OWNED_BY_DML フラグが設定されたテンソルはありません)、空のDML_BUFFER_ARRAY_BINDINGを指定nullptr
して 'バインドなし' を示すことができます。
すべての入力リソースのバインドを解除するには、 rangeCount に 0 を指定し、バインドの値を に nullptr
指定 します。
入力テンソルに DML_TENSOR_FLAG_OWNED_BY_DML フラグが設定されている場合は、演算子初期化子の実行時にのみバインドできます。 それ以外の場合、 DML_TENSOR_FLAG_OWNED_BY_DML フラグが設定されていない場合、その逆は true です。初期化子の実行時に入力テンソルをバインドすることはできませんが、演算子自体の実行時にはバインドする必要があります。
入力としてバインドされているすべてのバッファーには、 DML_TENSOR_FLAG_OWNED_BY_DML フラグが設定されている場合を除き、ヒープの種類 がD3D12_HEAP_TYPE_DEFAULT されている必要があります。 初期化子の入力としてバインドされているテンソルに対して DML_TENSOR_FLAG_OWNED_BY_DML が設定されている場合、バッファーのヒープ型は D3D12_HEAP_TYPE_DEFAULT または D3D12_HEAP_TYPE_UPLOADのいずれかになります。
場合によっては、複数のバインディングで同じ ID3D12Resource を 参照できます。ただし、オペレーターがリソースの同じリージョンに対して同時に読み取りと書き込みを行う場合は、注意する必要があります。 バインディングのペアが同じ ID3D12Resource を参照し、少なくとも 1 つのバインディングが書き込みに関与し、バッファー領域が交差する (少なくとも 1 バイトで重複する) 場合、バインディングの危険性が生じる可能性があります。 バインドの危険性は、DirectML 1.7.0 の時点で次の規則を使用して検証されます。
- 初期化用にバインドする場合、入力バインディングで出力バインディングと同じリソースを参照することはできません。入力は出力リソース (実行のための将来の永続的なリソース) にコピーされ、コピーにはリソース状態の遷移が必要になる場合があります。
- 実行用にバインドする場合、入力バインディングは出力バインディングと同じリソースを参照できます。ただし、それぞれのバインド範囲が交差できるのは、リージョン が同じ で、演算子がインプレース実行をサポートしている場合のみです。
- 存在する場合、永続バインディングは出力バインディングまたは一時バインディングと交差してはなりません。
- 一時バインディングが存在する場合は、入力バインディング、出力バインディング、または永続バインディングと交差してはなりません。
上記の規則では、2 つのリソースがヒープの同じリージョンに別名を付けないと想定しているため、配置されたリソースまたは予約済みリソースを使用する場合は注意が必要です。
構文
void BindInputs(
UINT bindingCount,
[in, optional] const DML_BINDING_DESC *bindings
);
パラメーター
bindingCount
型: UINT
このパラメーターは、 バインディング 配列のサイズを決定します (指定されている場合)。
[in, optional] bindings
型: const DML_BINDING_DESC*
バインドするテンソル リソースの説明を含む DML_BINDING_DESC の定数配列への省略可能なポインター。
戻り値
なし
解説
バインディングの危険性の例
次の例では、四角形は、バインド テーブル内の少なくとも 1 つのバインドによって参照されるバッファー リソースを表しています。 各行は、名前付きバインディングによって読み取り (R) または書き込み (W) される可能性があるバイト範囲を示します。 すべての例では、リソースが同じ物理メモリを共有していないことを前提としています。
例 1
この例では、さまざまなリソースを参照する入出力バインディングを示します。 異なるリソースを参照するバインドのペアが危険になることは決してないので、これは常に有効なバインディングです。
Resource A Resource B
+---------------+ +---------------+
Input 0: |RRRRRRRRRRRRRRR| | |
Output 0: | | |WWWWWWWWWWWWWWW|
+---------------+ +---------------+
例 2
この例では、同じリソースのさまざまな領域を参照する入出力バインディングを示します。 同じリソースの重複しない領域を持つバインドのペアは、実行のためのバインド時に危険ではありません。 これは、実行用にバインドする場合は有効なバインディングですが、初期化用にバインドする場合は無効です。
Resource A
+---------------+
Input 0: |RRRRRRR |
Output 0: | WWWWWWWW|
+---------------+
例 3
この例では、範囲と重複する 2 つの入力バインディングを示します。 読み取り専用バインディング (入力バインディングと永続的バインディング) のペアは、バッファー領域の交差に関係なく危険になることは決してないので、これは常に有効なバインディングです。
Resource A Resource B
+---------------+ +---------------+
Input 0: |RRRRRRRRR | | |
Input 1: | RRRRRRRRR| | |
Output 0: | | |WWWWWWWWWWWWWWW|
+---------------+ +---------------+
例 4
この例では、同じリージョンを持つ入出力バインディングを示します。 このバインディングは、バインドされている演算子がインプレース実行をサポートし、バインドが実行用である場合にのみ有効です。
Resource A
+---------------+
Input 0: |RRRRRRRRRRRRRRR|
Output 0: |WWWWWWWWWWWWWWW|
+---------------+
例 5
次のバインドは、演算子のインプレース実行のサポートに関係なく、有効ではありません。これは、重複するリージョンが同一ではないバインドのペアが含まれるためです。
Resource A
+---------------+
Input 0: |RRRRRRRRRRRRR |
Output 0: | WWWWWWWWWWW|
+---------------+
必要条件
必要条件
対象プラットフォーム | Windows |
ヘッダー | directml.h |
Library | DirectML.lib |
[DLL] | DirectML.dll |