estructura DML_SLICE1_OPERATOR_DESC (directml.h)
Extrae una sola subregión (un "segmento") de un tensor de entrada.
La ventana de entrada describe los límites del tensor de entrada que se deben tener en cuenta en el segmento. La ventana se define con tres valores para cada dimensión.
- El desplazamiento marca el principio de la ventana en una dimensión.
- El tamaño marca la extensión de la ventana en una dimensión. El final de la ventana de una dimensión es
offset + size - 1
. - El paso indica cómo recorrer los elementos de una dimensión.
- La magnitud del paso indica cuántos elementos se van a avanzar al copiar dentro de la ventana.
- Si un paso es positivo, los elementos se copian a partir del principio de la ventana en la dimensión.
- Si un paso es negativo, los elementos se copian a partir del final de la ventana en la dimensión.
El siguiente pseudocódigo ilustra cómo se copian los elementos mediante la ventana de entrada. Tenga en cuenta cómo se copian los elementos de una dimensión de principio a fin con un paso positivo y se copian de un extremo a otro con un paso negativo.
CopyStart = InputWindowOffsets
for dimension i in [0, DimensionCount - 1]:
if InputWindowStrides[i] < 0:
CopyStart[i] += InputWindowSizes[i] - 1 // start at the end of the window in this dimension
OutputTensor[OutputCoordinates] = InputTensor[CopyStart + InputWindowStrides * OutputCoordinates]
La ventana de entrada no debe estar vacía en ninguna dimensión y la ventana no debe extenderse más allá de las dimensiones del tensor de entrada (no se permiten lecturas fuera de límite). El tamaño y los pasos de la ventana limitan eficazmente el número de elementos que se pueden copiar de cada dimensión i
del tensor de entrada.
MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]
El tensor de salida no es necesario para copiar todos los elementos accesibles dentro de la ventana. El segmento es válido siempre que 1 <= OutputSizes[i] <= MaxCopiedElements[i]
.
Sintaxis
struct DML_SLICE1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT DimensionCount;
const UINT *InputWindowOffsets;
const UINT *InputWindowSizes;
const INT *InputWindowStrides;
};
Miembros
InputTensor
Tipo: const DML_TENSOR_DESC*
Tensor del que se van a extraer segmentos.
OutputTensor
Tipo: const DML_TENSOR_DESC*
Tensor en el que se van a escribir los resultados de los datos segmentados.
DimensionCount
Tipo: UINT
Número de dimensiones. Este campo determina el tamaño de las matrices InputWindowOffsets, InputWindowSizes y InputWindowStrides . Este valor debe coincidir con dimensionCount de los tensores de entrada y salida. Este valor debe estar comprendido entre 1 y 8, inclusive, a partir de ; los niveles de DML_FEATURE_LEVEL_3_0
características anteriores requieren un valor de 4 o 5.
InputWindowOffsets
Tipo: _Field_size_(DimensionCount) const UINT*
Matriz que contiene el principio (en elementos) de la ventana de entrada en cada dimensión. Los valores de la matriz deben satisfacer la restricción InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowSizes
Tipo: _Field_size_(DimensionCount) const UINT*
Matriz que contiene la extensión (en elementos) de la ventana de entrada en cada dimensión. Los valores de la matriz deben satisfacer la restricción InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowStrides
Tipo: _Field_size_(DimensionCount) const UINT*
Matriz que contiene el paso del segmento a lo largo de cada dimensión del tensor de entrada, en los elementos . La magnitud del paso indica cuántos elementos se van a avanzar al copiar dentro de la ventana de entrada. El signo del paso determina si los elementos se copian a partir del principio de la ventana (paso positivo) o el final de la ventana (paso negativo). Es posible que los pasos no sean 0.
Ejemplos
En los ejemplos siguientes se usa este mismo tensor de entrada.
InputTensor: (Sizes:{1, 1, 4, 4}, DataType:FLOAT32)
[[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]]
Ejemplo 1. Segmento estridado con pasos positivos
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, 2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[ 2, 4],
[10, 12]]]]
Los elementos copiados se calculan de la siguiente manera.
Output[0,0,0,0] = {0,0,0,1} + {1,1,2,2} * {0,0,0,0} = Input[{0,0,0,1}] = 2
Output[0,0,0,1] = {0,0,0,1} + {1,1,2,2} * {0,0,0,1} = Input[{0,0,0,3}] = 4
Output[0,0,1,0] = {0,0,0,1} + {1,1,2,2} * {0,0,1,0} = Input[{0,0,2,1}] = 10
Output[0,0,1,1] = {0,0,0,1} + {1,1,2,2} * {0,0,1,1} = Input[{0,0,2,3}] = 12
Ejemplo 2. Segmento estridado con pasos negativos
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, -2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[14, 16],
[ 6, 8]]]]
Recuerde que las dimensiones con pasos de ventana negativos comienzan a copiarse al final de la ventana de entrada para esa dimensión; esto se hace agregando InputWindowSize[i] - 1
al desplazamiento de la ventana. Las dimensiones con un paso positivo simplemente comienzan en InputWindowOffset[i]
.
- El eje 0 (
+1
paso de ventana) comienza a copiar enInputWindowOffsets[0] = 0
. - El eje 1 (
+1
paso de ventana) comienza a copiar enInputWindowOffsets[1] = 0
. - El eje 2 (
-2
paso de ventana) comienza a copiar enInputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3
. - El eje 3 (
+2
paso de ventana) comienza a copiar enInputWindowOffsets[3] = 1
.
Los elementos copiados se calculan de la siguiente manera.
Output[0,0,0,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,0} = Input[{0,0,3,1}] = 14
Output[0,0,0,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,1} = Input[{0,0,3,3}] = 16
Output[0,0,1,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,0} = Input[{0,0,1,1}] = 6
Output[0,0,1,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,1} = Input[{0,0,1,3}] = 8
Comentarios
Este operador es similar a DML_SLICE_OPERATOR_DESC, pero difiere de dos maneras importantes.
- Los pasos de segmento pueden ser negativos, lo que permite revertir los valores a lo largo de las dimensiones.
- Los tamaños de ventana de entrada no son necesariamente los mismos que los tamaños de tensor de salida.
Disponibilidad
Este operador se introdujo en DML_FEATURE_LEVEL_2_1
.
Restricciones tensor
InputTensor y OutputTensor deben tener el mismo DataType y DimensionCount.
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 |
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 |
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 | De 4 a 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Resultados | De 4 a 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | compilación 20348 de Windows 10 |
Servidor mínimo compatible | compilación 20348 de Windows 10 |
Encabezado | directml.h |