Condividi tramite


Metodo IDMLBindingTable::BindInputs (directml.h)

Associa un set di risorse come tensori di input.

Se l'associazione per un operatore compilato, il numero di associazioni deve corrispondere esattamente al numero di input dell'operatore, inclusi i tensori facoltativi. Questa operazione può essere determinata dalla descrizione dell'operatore usata per creare l'operatore. Se vengono fornite troppe associazioni o troppo poche, la rimozione del dispositivo si verificherà. Per i tensori facoltativi, è possibile usare DML_BINDING_TYPE_NONE per specificare "nessun binding". In caso contrario, il tipo di associazione deve corrispondere al tipo tensore quando è stato creato l'operatore.

Per gli inizializzatori dell'operatore, le associazioni di input devono essere di tipo DML_BINDING_TYPE_BUFFER_ARRAY con un'associazione di input per operatore per inizializzare, fornita nell'ordine specificato dagli operatori durante la creazione o la reimpostazione dell'inizializzatore. Ogni matrice di buffer deve avere una dimensione uguale al numero di input del relativo operatore corrispondente per inizializzare. I tensori di input che avevano il set di flag DML_TENSOR_FLAG_OWNED_BY_DML devono essere associati durante l'inizializzazione. In caso contrario, non dovrebbe essere associato nulla per tale tensore. Se non c'è nulla da associare come input per l'inizializzazione di un operatore ,ovvero non sono presenti tensori con il set di flag di DML_TENSOR_FLAG_OWNED_BY_DML , è possibile specificare nullptr o un DML_BUFFER_ARRAY_BINDING vuoto per indicare 'nessun binding'.

Per annullare l'associazione di tutte le risorse di input, specificare un rangeCount pari a 0 e un valore di nullptr per le associazioni.

Se un tensore di input ha il flag di DML_TENSOR_FLAG_OWNED_BY_DML impostato, può essere associato solo quando si esegue un inizializzatore operatore. In caso contrario, se il flag di DML_TENSOR_FLAG_OWNED_BY_DML non è impostato, l'opposto è true, il tensore di input non deve essere associato durante l'esecuzione dell'inizializzatore, ma deve essere associato durante l'esecuzione dell'operatore stesso.

Tutti i buffer associati come input devono avere un tipo heap D3D12_HEAP_TYPE_DEFAULT, tranne quando viene impostato il flag di DML_TENSOR_FLAG_OWNED_BY_DML . Se la DML_TENSOR_FLAG_OWNED_BY_DML è impostata per un tensore associato come input per un inizializzatore, il tipo heap del buffer può essere D3D12_HEAP_TYPE_DEFAULT o D3D12_HEAP_TYPE_UPLOAD.

In alcuni casi sono consentite più associazioni per fare riferimento allo stesso ID3D12Resource ; tuttavia, è consigliabile prestare attenzione quando un operatore legge e scrive contemporaneamente nella stessa area di una risorsa. Esiste un potenziale rischio di associazione quando: una coppia di associazioni fa riferimento allo stesso ID3D12Resource e almeno uno dei binding è coinvolto nella scrittura e le aree del buffer si intersecano (sovrapponendo almeno un byte). I rischi di associazione vengono convalidati usando le regole seguenti, a partire da DirectML 1.7.0:

  • Quando l'associazione per l'inizializzazione, un'associazione di input non può mai fare riferimento alla stessa risorsa dell'associazione di output, ovvero gli input vengono copiati nella risorsa di output (la risorsa persistente futura per l'esecuzione) e la copia potrebbe richiedere una transizione dello stato della risorsa.
  • Quando l'associazione per l'esecuzione, un'associazione di input può fare riferimento alla stessa risorsa di un'associazione di output; tuttavia, i rispettivi intervalli di associazione possono intersecarsi solo se le aree sono identiche e l'operatore supporta l'esecuzione sul posto.
  • Se presente, un'associazione persistente non deve intersecarsi con un'associazione di output o un'associazione temporanea.
  • Se presente, un'associazione temporanea non deve intersecare alcuna associazione di input, associazione di output o associazione persistente.

Le regole precedenti presuppongono che due risorse non aliasno la stessa area di un heap, quindi è necessaria cautela aggiuntiva quando si usano risorse inserite o riservate.

Sintassi

void BindInputs(
                 UINT                   bindingCount,
  [in, optional] const DML_BINDING_DESC *bindings
);

Parametri

bindingCount

Tipo: UINT

Questo parametro determina le dimensioni della matrice di associazioni (se specificato).

[in, optional] bindings

Tipo: const DML_BINDING_DESC*

Puntatore facoltativo a una matrice costante di DML_BINDING_DESC contenente descrizioni delle risorse tensore da associare.

Valore restituito

nessuno

Osservazioni

Esempi di rischio di associazione

Negli esempi seguenti i rettangoli rappresentano una risorsa buffer a cui fa riferimento almeno un'associazione in una tabella di associazione. Ogni riga indica l'intervallo di byte potenzialmente letti (R) o scritti (W) dall'associazione denominata. Tutti gli esempi presuppongono che le risorse non condividono la stessa memoria fisica.

Esempio 1

Questo esempio mostra un'associazione di input e output che fa riferimento a risorse diverse. Una coppia di associazioni che fanno riferimento a risorse diverse non è mai un rischio, quindi questa è sempre un'associazione valida.

          Resource A          Resource B
          +---------------+   +---------------+
Input  0: |RRRRRRRRRRRRRRR|   |               |
Output 0: |               |   |WWWWWWWWWWWWWWW|
          +---------------+   +---------------+

Esempio 2

Questo esempio mostra un'associazione di input e output che fa riferimento a aree diverse della stessa risorsa. Una coppia di associazioni con aree non sovrapposte della stessa risorsa non è un rischio quando l'associazione per l'esecuzione. Si tratta di un'associazione valida quando l'associazione per l'esecuzione, ma non è valida quando l'associazione per l'inizializzazione.

          Resource A      
          +---------------+
Input  0: |RRRRRRR        |
Output 0: |       WWWWWWWW|
          +---------------+

Esempio 3

In questo esempio vengono visualizzate due associazioni di input che si sovrappongono agli intervalli. Una coppia di associazioni di sola lettura (associazioni di input e associazioni persistenti) non può mai essere un rischio, indipendentemente da qualsiasi intersezione tra aree buffer, quindi è sempre un'associazione valida.

          Resource A          Resource B
          +---------------+   +---------------+
Input  0: |RRRRRRRRR      |   |               |
Input  1: |      RRRRRRRRR|   |               |
Output 0: |               |   |WWWWWWWWWWWWWWW|
          +---------------+   +---------------+

Esempio 4

Questo esempio mostra un'associazione di input e output con aree identiche. Questa associazione è valida se e solo se l'operatore associato supporta l'esecuzione sul posto e l'associazione è per l'esecuzione.

          Resource A      
          +---------------+
Input  0: |RRRRRRRRRRRRRRR|
Output 0: |WWWWWWWWWWWWWWW|
          +---------------+

Esempio 5

L'associazione seguente non è mai valida, indipendentemente dal supporto di esecuzione sul posto dell'operatore, perché implica una coppia di associazioni con aree sovrapposte che non sono identiche.

          Resource A      
          +---------------+
Input  0: |RRRRRRRRRRRRR  |
Output 0: |    WWWWWWWWWWW|
          +---------------+

Requisiti

Requisiti

   
Piattaforma di destinazione Windows
Intestazione directml.h
Libreria DirectML.lib
DLL DirectML.dll

Vedi anche

Binding in DirectML

IDMLBindingTable