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

Enlaza un conjunto de recursos como tensores de entrada.

Si se enlaza para un operador compilado, el número de enlaces debe coincidir exactamente con el número de entradas del operador, incluidos los tensores opcionales. Esto se puede determinar a partir de la descripción del operador que se usa para crear el operador. Si se proporcionan demasiados o demasiados enlaces, se producirá la eliminación de dispositivos. Para tensores opcionales, puede usar DML_BINDING_TYPE_NONE para especificar "sin enlace". De lo contrario, el tipo de enlace debe coincidir con el tipo tensor cuando se creó el operador.

En el caso de los inicializadores de operador, se espera que los enlaces de entrada sean de tipo DML_BINDING_TYPE_BUFFER_ARRAY con un enlace de entrada por operador que se inicialice, proporcionado en el orden en que especificó los operadores durante la creación o restablecimiento del inicializador. Cada matriz de búfer debe tener un tamaño igual al número de entradas de su operador correspondiente para inicializar. Los tensores de entrada que tenían la marca DML_TENSOR_FLAG_OWNED_BY_DML establecida deben enlazarse durante la inicialización; de lo contrario, no debe enlazarse nada para ese tensor. Si no hay nada que enlazar como entrada para la inicialización de un operador (es decir, no hay tensores con la marca DML_TENSOR_FLAG_OWNED_BY_DML establecida), puede proporcionar nullptr o un DML_BUFFER_ARRAY_BINDING vacío para indicar "sin enlace".

Para desenlace todos los recursos de entrada, proporcione un rangeCount de 0 y un valor de nullptr para los enlaces.

Si un tensor de entrada tiene establecida la marca de DML_TENSOR_FLAG_OWNED_BY_DML , solo se puede enlazar al ejecutar un inicializador de operador. De lo contrario, si no se establece la marca de DML_TENSOR_FLAG_OWNED_BY_DML , lo contrario es true: el tensor de entrada no debe enlazarse al ejecutar el inicializador, pero debe estar enlazado al ejecutar el propio operador.

Todos los búferes que se enlazan como entrada deben tener el tipo de montón D3D12_HEAP_TYPE_DEFAULT, excepto cuando se establece la marca de DML_TENSOR_FLAG_OWNED_BY_DML . Si el DML_TENSOR_FLAG_OWNED_BY_DML se establece para un tensor que se enlaza como entrada para un inicializador, el tipo de montón del búfer puede ser D3D12_HEAP_TYPE_DEFAULT o D3D12_HEAP_TYPE_UPLOAD.

Se permiten varios enlaces hacer referencia al mismo ID3D12Resource en algunos casos; Sin embargo, debe tener cuidado cuando un operador lee y escribe simultáneamente en la misma región de un recurso. Existe un riesgo potencial de enlace cuando: un par de enlaces hacen referencia al mismo ID3D12Resource, y al menos uno de los enlaces está implicado en la escritura y las regiones del búfer se intersecan (superponen por al menos un byte). Los peligros de enlace se validan mediante las siguientes reglas, a partir de DirectML 1.7.0:

  • Al enlazar para la inicialización, un enlace de entrada nunca puede hacer referencia al mismo recurso que el enlace de salida: las entradas se copian en el recurso de salida (el recurso persistente futuro para su ejecución) y la copia podría requerir una transición de estado de recurso.
  • Cuando se enlaza para su ejecución, un enlace de entrada puede hacer referencia al mismo recurso que un enlace de salida; Sin embargo, los intervalos de enlace respectivos solo pueden intersecr si las regiones son idénticas y el operador admite la ejecución en contexto.
  • Si está presente, un enlace persistente no debe intersecrse con ningún enlace de salida o enlace temporal.
  • Si está presente, un enlace temporal no debe intersecr ningún enlace de entrada, enlace de salida o enlace persistente.

Las reglas anteriores suponen que dos recursos no alias la misma región de un montón, por lo que se requiere precaución adicional al usar recursos reservados o colocados.

Sintaxis

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

Parámetros

bindingCount

Tipo: UINT

Este parámetro determina el tamaño de la matriz de enlaces (si se proporciona).

[in, optional] bindings

Tipo: const DML_BINDING_DESC*

Puntero opcional a una matriz constante de DML_BINDING_DESC que contiene descripciones de los recursos de tensor que se van a enlazar.

Valor devuelto

Ninguno

Observaciones

Ejemplos de peligro de enlace

En los ejemplos siguientes, los rectángulos representan un recurso de búfer al que hace referencia al menos un enlace en una tabla de enlace. Cada fila indica el intervalo de bytes potencialmente leídos (R) o escritos (W) por el enlace con nombre. En todos los ejemplos se supone que los recursos no comparten la misma memoria física.

Ejemplo 1

En este ejemplo se muestra un enlace de entrada y salida que hace referencia a recursos diferentes. Un par de enlaces que hacen referencia a diferentes recursos nunca es un peligro, por lo que siempre es un enlace válido.

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

Ejemplo 2

En este ejemplo se muestra un enlace de entrada y salida que hace referencia a regiones diferentes del mismo recurso. Un par de enlaces con regiones no superpuestas del mismo recurso no es un peligro cuando se enlaza para su ejecución. Se trata de un enlace válido cuando se enlaza para su ejecución, pero no es válido cuando se enlaza para la inicialización.

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

Ejemplo 3

En este ejemplo se muestran dos enlaces de entrada que se superponen a intervalos. Un par de enlaces de solo lectura (enlaces de entrada y enlaces persistentes) nunca puede ser un peligro, independientemente de cualquier intersección de la región del búfer, por lo que siempre es un enlace válido.

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

Ejemplo 4

En este ejemplo se muestra un enlace de entrada y salida con regiones idénticas. Este enlace es válido si y solo si el operador que se enlaza admite la ejecución local y el enlace es para su ejecución.

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

Ejemplo 5

El siguiente enlace nunca es válido, independientemente de la compatibilidad con la ejecución local del operador, ya que implica un par de enlaces con regiones superpuestas que no son idénticas.

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

Requisitos

Requisitos

   
Plataforma de destino Windows
Encabezado directml.h
Library DirectML.lib
Archivo DLL DirectML.dll

Consulte también

Enlaces en DirectML

IDMLBindingTable