estrutura DML_GATHER_OPERATOR_DESC (directml.h)
Coleta elementos do tensor de entrada ao longo do Eixo, usando IndicesTensor para remapear índices. Esse operador executa o pseudocódigo a seguir, em que "..." representa uma série de coordenadas, com o comportamento exato determinado pela contagem de dimensões de eixo e índices:
output[...] = input[..., indices[...], ...]
Sintaxe
struct DML_GATHER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
UINT IndexDimensions;
};
Membros
InputTensor
Tipo: const DML_TENSOR_DESC*
O tensor do qual ler.
IndicesTensor
Tipo: const DML_TENSOR_DESC*
Um tensor que contém os índices. O DimensionCount deste tensor deve corresponder a InputTensor.DimensionCount.
DML_FEATURE_LEVEL_3_0
A partir do , esse operador dá suporte a valores de índice negativos ao usar um tipo integral assinado com esse tensor. Índices negativos são interpretados como sendo relativos ao final da dimensão do eixo. Por exemplo, um índice de -1 refere-se ao último elemento nessa dimensão.
Índices inválidos produzirão saídas incorretas, mas nenhuma falha ocorrerá e todas as leituras serão fixadas com segurança na memória do tensor de entrada.
OutputTensor
Tipo: const DML_TENSOR_DESC*
O tensor no qual gravar os resultados. O DimensionCount e o DataType deste tensor devem corresponder a InputTensor.DimensionCount. Os OutputTensor.Sizes esperados são a concatenação dos segmentos à esquerda e à direita InputTensor.Sizes divididos no Eixo atual com IndicesTensor.Sizes inseridos entre eles.
OutputTensor.Sizes = {
InputTensor.Sizes[0..Axis],
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}
As dimensões são alinhadas à direita de modo que quaisquer valores 1 à esquerda dos tamanhos de entrada sejam cortados, o que de outra forma estouraria a saída DimensionCount.
O número de dimensões relevantes neste tensor depende de IndexDimensions e da classificação original de InputTensor. A classificação original é o número de dimensões antes de qualquer preenchimento com as principais. O número de dimensões relevantes na saída pode ser calculado pela classificação original de InputTensor + IndexDimensions - 1. Esse valor deve ser menor ou igual ao DimensionCount de OutputTensor.
Axis
Tipo: UINT
A dimensão do eixo de InputTensor a ser coletada, variando [0, *InputTensor.DimensionCount*)
.
IndexDimensions
Tipo: UINT
O número de dimensões de índice reais dentro do IndicesTensor
após ignorar quaisquer irrelevantes à esquerda, variando [0, IndicesTensor.DimensionCount
). Por exemplo, dado IndicesTensor.Sizes
= { 1, 1, 4, 6 }
e IndexDimensions
= 3, os índices significativos reais são { 1, 4, 6 }
.
Exemplos
Exemplo 1. Remapeamento 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]
Exemplo 2. Saída 2D, índices 1D, Eixo 0, concatenar linhas
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
Exemplo 3. 2D, Eixo 1, trocar colunas
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]]
Exemplo 4. Índices aninhados 2D, Eixo 1
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]]]
Exemplo 5. Índices aninhados 2D, Eixo 0
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]]]
Disponibilidade
Esse operador foi introduzido em DML_FEATURE_LEVEL_1_0
.
Restrições do Tensor
IndicesTensor
, InputTensor e OutputTensor devem ter a mesma DimensionCount.- InputTensor e OutputTensor devem ter o mesmo DataType.
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 |
IndicesTensor | Entrada | 1 a 8 | INT64, INT32, UINT64, UINT32 |
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 |
IndicesTensor | Entrada | 1 a 8 | INT64, INT32, UINT64, UINT32 |
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 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndicesTensor | Entrada | 4 | UINT32 |
OutputTensor | Saída | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_1_0 e superior
Tensor | Tipo | Contagens de dimensões com suporte | Tipos de dados com suporte |
---|---|---|---|
InputTensor | Entrada | 4 | FLOAT32, FLOAT16 |
IndicesTensor | Entrada | 4 | UINT32 |
OutputTensor | Saída | 4 | FLOAT32, FLOAT16 |
Requisitos
Cabeçalho | directml.h |