estrutura DML_SLICE1_OPERATOR_DESC (directml.h)
Extrai uma única sub-região (uma "fatia") de um tensor de entrada.
A janela de entrada descreve os limites do tensor de entrada a ser considerado na fatia. A janela é definida usando três valores para cada dimensão.
- O deslocamento marca o início da janela em uma dimensão.
- O tamanho marca a extensão da janela em uma dimensão. O final da janela em uma dimensão é
offset + size - 1
. - O passo indica como percorrer os elementos em uma dimensão.
- A magnitude do passo indica quantos elementos avançar ao copiar dentro da janela.
- Se um passo for positivo, os elementos serão copiados começando no início da janela na dimensão.
- Se um passo for negativo, os elementos serão copiados começando no final da janela na dimensão.
O pseudocódigo a seguir ilustra como os elementos são copiados usando a janela de entrada. Observe como os elementos em uma dimensão são copiados do início ao fim com um passo positivo e copiados de ponta a ponta com um passo 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]
A janela de entrada não deve estar vazia em nenhuma dimensão e a janela não deve se estender além das dimensões do tensor de entrada (leituras fora dos limites não são permitidas). O tamanho e os passos da janela limitam efetivamente o número de elementos que podem ser copiados de cada dimensão i
do tensor de entrada.
MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]
O tensor de saída não é necessário para copiar todos os elementos acessíveis dentro da janela. A fatia é válida desde 1 <= OutputSizes[i] <= MaxCopiedElements[i]
que .
Sintaxe
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;
};
Membros
InputTensor
Tipo: const DML_TENSOR_DESC*
O tensor do qual extrair fatias.
OutputTensor
Tipo: const DML_TENSOR_DESC*
O tensor no qual gravar os resultados dos dados fatiados.
DimensionCount
Tipo: UINT
O número de dimensões. Esse campo determina o tamanho das matrizes InputWindowOffsets, InputWindowSizes e InputWindowStrides . Esse valor deve corresponder ao DimensionCount dos tensores de entrada e saída. Esse valor deve estar entre 1 e 8, inclusive, a partir de DML_FEATURE_LEVEL_3_0
; os níveis de recursos anteriores exigem um valor de 4 ou 5.
InputWindowOffsets
Tipo: _Field_size_(DimensionCount) const UINT*
Uma matriz que contém o início (em elementos) da janela de entrada em cada dimensão. Os valores na matriz devem atender à restrição InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowSizes
Tipo: _Field_size_(DimensionCount) const UINT*
Uma matriz que contém a extensão (em elementos) da janela de entrada em cada dimensão. Os valores na matriz devem atender à restrição InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowStrides
Tipo: _Field_size_(DimensionCount) const UINT*
Uma matriz que contém o passo da fatia ao longo de cada dimensão do tensor de entrada, em elementos . A magnitude do passo indica quantos elementos avançar ao copiar dentro da janela de entrada. O sinal do passo determina se os elementos são copiados começando no início da janela (avanço positivo) ou no final da janela (passo negativo). Os passos podem não ser 0.
Exemplos
Os exemplos a seguir usam esse mesmo 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]]]]
Exemplo 1. Fatia estridente com avanços 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]]]]
Os elementos copiados são calculados da seguinte maneira.
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
Exemplo 2. Fatia estridente com avanços 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]]]]
Lembre-se de que dimensões com avanços negativos da janela começam a ser copiadas no final da janela de entrada para essa dimensão; isso é feito adicionando InputWindowSize[i] - 1
ao deslocamento da janela. Dimensões com um passo positivo simplesmente começam em InputWindowOffset[i]
.
- O eixo 0 (
+1
passo da janela) começa a copiar emInputWindowOffsets[0] = 0
. - O Eixo 1 ( passo
+1
da janela) começa a copiar emInputWindowOffsets[1] = 0
. - O eixo 2 (
-2
passo da janela) começa a copiar emInputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3
. - O Eixo 3 ( passo
+2
da janela) começa a copiar emInputWindowOffsets[3] = 1
.
Os elementos copiados são calculados da seguinte maneira.
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
Comentários
Esse operador é semelhante a DML_SLICE_OPERATOR_DESC, mas é diferente de duas maneiras importantes.
- Os passos de fatia podem ser negativos, o que permite reverter valores ao longo das dimensões.
- Os tamanhos da janela de entrada não são necessariamente os mesmos que os tamanhos de tensor de saída.
Disponibilidade
Esse operador foi introduzido no DML_FEATURE_LEVEL_2_1
.
Restrições do Tensor
InputTensor e OutputTensor devem ter os mesmos DataType e DimensionCount.
Suporte ao Tensor
DML_FEATURE_LEVEL_4_1 e superior
Tensor | Tipo | Contagens de dimensões com suporte | Tipos de dados com suporte |
---|---|---|---|
InputTensor | Entrada | 1 a 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
OutputTensor | Saída | 1 a 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_3_0 e superior
Tensor | Tipo | Contagens de dimensões com suporte | Tipos de dados com suporte |
---|---|---|---|
InputTensor | Entrada | 1 a 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Saída | 1 a 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 e superior
Tensor | Tipo | Contagens de dimensões com suporte | Tipos de dados com suporte |
---|---|---|---|
InputTensor | Entrada | 4 a 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Saída | 4 a 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows 10 Build 20348 |
Servidor mínimo com suporte | Windows 10 Build 20348 |
Cabeçalho | directml.h |