Compartilhar via


Método IDMLBindingTable::BindInputs (directml.h)

Associa um conjunto de recursos como tensores de entrada.

Se estiver associando para um operador compilado, o número de associações deverá corresponder exatamente ao número de entradas do operador, incluindo tensores opcionais. Isso pode ser determinado na descrição do operador usada para criar o operador. Se forem fornecidas muitas ou poucas associações, ocorrerá a remoção do dispositivo. Para tensores opcionais, você pode usar DML_BINDING_TYPE_NONE para especificar "nenhuma associação". Caso contrário, o tipo de associação deve corresponder ao tipo tensor quando o operador foi criado.

Para inicializadores de operador, espera-se que as associações de entrada sejam do tipo DML_BINDING_TYPE_BUFFER_ARRAY com uma associação de entrada por operador a ser inicializada, fornecida na ordem em que você especificou os operadores durante a criação ou redefinição do inicializador. Cada matriz de buffers deve ter um tamanho igual ao número de entradas de seu operador correspondente a ser inicializado. Tensores de entrada que tinham o sinalizador DML_TENSOR_FLAG_OWNED_BY_DML definido devem ser associados durante a inicialização; caso contrário, nada deve ser associado a esse tensor. Se não houver nada a ser associado como entrada para inicialização de um operador (ou seja, não há tensores com o sinalizador DML_TENSOR_FLAG_OWNED_BY_DML definido), você poderá fornecer nullptr ou um DML_BUFFER_ARRAY_BINDING vazio para indicar "nenhuma associação".

Para desassociar todos os recursos de entrada, forneça um rangeCount de 0 e um valor de nullptr para associações.

Se um tensor de entrada tiver o sinalizador DML_TENSOR_FLAG_OWNED_BY_DML definido, ele só poderá ser associado ao executar um inicializador de operador. Caso contrário, se o sinalizador DML_TENSOR_FLAG_OWNED_BY_DML não estiver definido, o oposto será verdadeiro— o tensor de entrada não deverá ser associado ao executar o inicializador, mas deverá ser associado ao executar o próprio operador.

Todos os buffers associados como entrada devem ter o tipo de heap D3D12_HEAP_TYPE_DEFAULT, exceto quando o sinalizador DML_TENSOR_FLAG_OWNED_BY_DML está definido. Se o DML_TENSOR_FLAG_OWNED_BY_DML estiver definido para um tensor que está sendo associado como entrada para um inicializador, o tipo de heap do buffer poderá ser D3D12_HEAP_TYPE_DEFAULT ou D3D12_HEAP_TYPE_UPLOAD.

Várias associações têm permissão para fazer referência à mesma ID3D12Resource em alguns casos; no entanto, você deve ter cuidado quando um operador lê e grava simultaneamente na mesma região de um recurso. Existe um possível risco de associação quando: um par de associações faz referência à mesma ID3D12Resource e pelo menos uma das associações está envolvida na gravação e as regiões de buffer se cruzam (sobrepõem-se por pelo menos um byte). Os riscos de associação são validados usando as seguintes regras, a partir do DirectML 1.7.0:

  • Ao associar para inicialização, uma associação de entrada nunca pode referenciar o mesmo recurso que a associação de saída — as entradas são copiadas para o recurso de saída (o recurso persistente futuro para execução) e a cópia pode exigir uma transição de estado de recurso.
  • Ao associar para execução, uma associação de entrada pode referenciar o mesmo recurso que uma associação de saída; no entanto, os respectivos intervalos de associação só poderão se cruzar se as regiões forem idênticas e o operador der suporte à execução in-loco.
  • Se presente, uma associação persistente não deve se cruzar com nenhuma associação de saída ou associação temporária.
  • Se presente, uma associação temporária não deve interseccionar nenhuma associação de entrada, associação de saída ou associação persistente.

As regras acima pressupõem que dois recursos não alias a mesma região de um heap, portanto, é necessário cuidado extra ao usar recursos colocados ou reservados.

Sintaxe

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

Parâmetros

bindingCount

Tipo: UINT

Esse parâmetro determina o tamanho da matriz de associações (se fornecido).

[in, optional] bindings

Tipo: const DML_BINDING_DESC*

Um ponteiro opcional para uma matriz constante de DML_BINDING_DESC que contém descrições dos recursos tensores a serem associados.

Valor retornado

Nenhum

Comentários

Exemplos de risco de associação

Nos exemplos abaixo, os retângulos representam um recurso de buffer referenciado por pelo menos uma associação em uma tabela de associação. Cada linha indica o intervalo de bytes que podem ser lidos (R) ou gravados (W) pela associação nomeada. Todos os exemplos pressupõem que os recursos não compartilham a mesma memória física.

Exemplo 1

Este exemplo mostra uma associação de entrada e saída referenciando recursos diferentes. Um par de associações que fazem referência a recursos diferentes nunca é um risco, portanto, essa é sempre uma associação válida.

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

Exemplo 2

Este exemplo mostra uma associação de entrada e saída referenciando diferentes regiões do mesmo recurso. Um par de associações com regiões não sobrepostas do mesmo recurso não é um risco ao associar para execução. Essa é uma associação válida ao associar para execução, mas é inválida ao associar para inicialização.

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

Exemplo 3

Este exemplo mostra duas associações de entradas que se sobrepõem a intervalos. Um par de associações somente leitura (associações de entrada e associações persistentes) nunca pode ser um risco, independentemente de qualquer interseção de região de buffer, portanto, essa é sempre uma associação válida.

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

Exemplo 4

Este exemplo mostra uma associação de entrada e saída com regiões idênticas. Essa associação será válida se e somente se o operador associado der suporte à execução in-loco e a associação for para execução.

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

Exemplo 5

A associação a seguir nunca é válida, independentemente do suporte de execução in-loco do operador, pois envolve um par de associações com regiões sobrepostas que não são idênticas.

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

Requisitos

Requisitos

   
Plataforma de Destino Windows
Cabeçalho directml.h
Biblioteca DirectML.lib
DLL DirectML.dll

Confira também

Associação no DirectML

IDMLBindingTable