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_0
A 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 |