Compartir a través de


estructura DML_GATHER_OPERATOR_DESC (directml.h)

Recopila elementos del tensor de entrada a lo largo del eje, usando IndexsTensor para reasignar índices. Este operador realiza el pseudocódigo siguiente, donde "..." representa una serie de coordenadas, con el comportamiento exacto determinado por el eje y el recuento de dimensiones de índices:

output[...] = input[..., indices[...], ...]

Sintaxis

struct DML_GATHER_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  Axis;
  UINT                  IndexDimensions;
};

Miembros

InputTensor

Tipo: const DML_TENSOR_DESC*

Tensor del que se va a leer.

IndicesTensor

Tipo: const DML_TENSOR_DESC*

Tensor que contiene los índices. DimensionCount de este tensor debe coincidir con InputTensor.DimensionCount.

DML_FEATURE_LEVEL_3_0A partir de , este operador admite valores de índice negativos cuando se usa un tipo entero firmado con este tensor. Los índices negativos se interpretan como relativos al final de la dimensión del eje. Por ejemplo, un índice de -1 hace referencia al último elemento a lo largo de esa dimensión.

Los índices no válidos producirán salidas incorrectas, pero no se producirá ningún error y todas las lecturas se restringirán de forma segura dentro de la memoria del tensor de entrada.

OutputTensor

Tipo: const DML_TENSOR_DESC*

Tensor en el que se van a escribir los resultados. DimensionCount y DataType de este tensor deben coincidir con InputTensor.DimensionCount. OutputTensor.Sizes esperados son la concatenación de los segmentos iniciales y finales InputTensor.Sizes divididos en el eje actual con los índicesTensor.Sizes insertados entre.

OutputTensor.Sizes = {
    InputTensor.Sizes[0..Axis],
    IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
    InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}

Las dimensiones están alineadas a la derecha de modo que los 1 valores iniciales de los tamaños de entrada se recortan, lo que de otro modo desbordaría la salida DimensionCount.

El número de dimensiones relevantes de este tensor depende de IndexDimensions y del rango original de InputTensor. El rango original es el número de dimensiones antes de cualquier relleno con los iniciales. El número de dimensiones relevantes en la salida se puede calcular mediante el rango original de InputTensor + IndexDimensions - 1. Este valor debe ser menor o igual que DimensionCount de OutputTensor.

Axis

Tipo: UINT

Dimensión del eje de InputTensor en la que se va a recopilar, que abarca [0, *InputTensor.DimensionCount*).

IndexDimensions

Tipo: UINT

Número de dimensiones de índice reales dentro IndicesTensor de después de omitir las iniciales irrelevantes, que van desde [0, IndicesTensor.DimensionCount). Por ejemplo, dado IndicesTensor.Sizes = { 1, 1, 4, 6 } y IndexDimensions = 3, los índices significativos reales son { 1, 4, 6 }.

Ejemplos

Ejemplo 1. Reasignación 1D

Axis: 0
IndexDimensions: 1

InputTensor: (Sizes:{4}, DataType:FLOAT32)
    [11,12,13,14]

IndicesTensor: (Sizes:{5}, DataType:UINT32)
    [3,1,3,0,2]

// output[x] = input[indices[x]]
OutputTensor: (Sizes:{5}, DataType:FLOAT32)
    [14,12,14,11,13]

Ejemplo 2. Salida 2D, índices 1D, Eje 0, concatenar filas

Axis: 0
IndexDimensions: 1

InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[1,2], // row 0
     [3,4], // row 1
     [5,6]] // row 2

IndicesTensor: (Sizes:{1, 4}, DataType:UINT32)
    [[0,
      1,
      1,
      2]]

// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{4,2}, DataType:FLOAT32)
    [[1,2], // input row 0
     [3,4], // input row 1
     [3,4], // input row 1
     [5,6]] // input row 2

Ejemplo 3. 2D, Eje 1, intercambiar columnas

Axis: 1
IndexDimensions: 2

InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[1,2],
     [3,4],
     [5,6]]

IndicesTensor: (Sizes:{1, 2}, DataType:UINT32)
    [[1,0]]

// output[y, x] = input[y, indices[x]]
OutputTensor: (Sizes:{3,2}, DataType:FLOAT32)
    [[2,1],
     [4,3],
     [6,5]]

Ejemplo 4. 2D, Eje 1, índices anidados

Axis: 2
IndexDimensions: 2

InputTensor: (Sizes:{1, 3,3}, DataType:FLOAT32)
    [ [[1,2,3],
       [4,5,6],
       [7,8,9]] ]

IndicesTensor: (Sizes:{1, 1,2}, DataType:UINT32)
    [ [[0,2]] ]

// output[z, y, x] = input[z, indices[y, x]]
OutputTensor: (Sizes:{3,1,2}, DataType:FLOAT32)
    [[[1,3]],
     [[4,6]],
     [[7,9]]]

Ejemplo 5. 2D, Eje 0, índices anidados

Axis: 1
IndexDimensions: 2

InputTensor: (Sizes:{1, 3,2}, DataType:FLOAT32)
    [ [[1,2],
       [3,4],
       [5,6]] ]

IndicesTensor: (Sizes:{1, 2,2}, DataType:UINT32)
    [ [[0,1],
       [1,2]] ]

// output[z, y, x] = input[indices[z, y], x]
OutputTensor: (Sizes:{2,2,2}, DataType:FLOAT32)
    [[[1,2], [3,4]],
     [[3,4], [5,6]]]

Disponibilidad

Este operador se introdujo en DML_FEATURE_LEVEL_1_0.

Restricciones tensor

  • IndicesTensor, InputTensor y OutputTensor deben tener el mismo DimensionCount.
  • InputTensor y OutputTensor deben tener el mismo tipo de datos.

Compatibilidad con Tensor

DML_FEATURE_LEVEL_4_1 y versiones posteriores

Tensor Clase Recuentos de dimensiones admitidos Tipos de datos admitidos
InputTensor Entrada De 1 a 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8
IndexsTensor Entrada De 1 a 8 INT64, INT32, UINT64, UINT32
OutputTensor Resultados De 1 a 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_3_0 y versiones posteriores

Tensor Clase Recuentos de dimensiones admitidos Tipos de datos admitidos
InputTensor Entrada De 1 a 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndexsTensor Entrada De 1 a 8 INT64, INT32, UINT64, UINT32
OutputTensor Resultados De 1 a 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_2_1 y versiones posteriores

Tensor Clase Recuentos de dimensiones admitidos Tipos de datos admitidos
InputTensor Entrada 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndexsTensor Entrada 4 UINT32
OutputTensor Resultados 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_1_0 y versiones posteriores

Tensor Clase Recuentos de dimensiones admitidos Tipos de datos admitidos
InputTensor Entrada 4 FLOAT32, FLOAT16
IndexsTensor Entrada 4 UINT32
OutputTensor Resultados 4 FLOAT32, FLOAT16

Requisitos

   
Encabezado directml.h