estrutura DML_SCATTER_ND_OPERATOR_DESC (directml.h)
Copia todo o tensor de entrada para a saída e, em seguida, substitui os índices selecionados com valores correspondentes do tensor de atualizações. Esse operador executa o pseudocódigo a seguir, em que "..." representa uma série de coordenadas, com o comportamento exato determinado pelo eixo e pelo tamanho dos índices.
output = input
output[indices[...]] = updates[...]
Se dois índices de elemento de saída se sobrepõem (o que é inválido), não há nenhuma garantia de qual última gravação vencerá.
Sintaxe
struct DML_SCATTER_ND_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *UpdatesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT InputDimensionCount;
UINT IndicesDimensionCount;
};
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. A última dimensão do IndicesTensor é, na verdade, o número de coordenadas por tupla de índice e não deve exceder InputTensor.DimensionCount. Por exemplo, um tensor de tamanho {1,4,5,2}
de índices com IndicesDimensionCount = 3 significa uma matriz 4x5 de tuplas de coordenadas de 2 valores que indexam em InputTensor.
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 respectiva dimensão. Por exemplo, um índice de -1 refere-se ao último elemento nessa dimensão.
UpdatesTensor
Tipo: const DML_TENSOR_DESC*
Um tensor que contém os novos valores para substituir os valores de entrada existentes nos índices correspondentes. O DimensionCount deste tensor deve corresponder a InputTensor.DimensionCount. Os UpdatesTensor.Sizes esperados são a concatenação dos segmentos líderes IndicesTensor.Sizes e InputTensor.Sizes à direita para produzir o seguinte.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
UpdatesTensor.Sizes = [
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
]
As dimensões são alinhadas à direita, com 1 valores à esquerda, se necessário, para satisfazer UpdatesTensor.DimensionCount.
Veja um exemplo.
InputTensor.Sizes = [3,4,5,6,7]
InputDimensionCount = 5
IndicesTensor.Sizes = [1,1, 1,2,3]
IndicesDimensionCount = 3 // can be thought of as a [1,2] array of 3-coordinate tuples
// The [1,2] comes from the indices tensor (ignoring last dimension, which is the tuple size),
// and the [6,7] comes from input tensor, ignoring the first 3 dimensions
// since the index tuples are 3 elements (from the indices tensor last dimension).
UpdatesTensor.Sizes = [1, 1,2,6,7]
OutputTensor
Tipo: const DML_TENSOR_DESC*
O tensor no qual gravar os resultados. Os Tamanhos e o DataType deste tensor devem corresponder a InputTensor.Sizes.
InputDimensionCount
Tipo: UINT
O número de dimensões de entrada reais no InputTensor depois de ignorar quaisquer irrelevantes à esquerda, variando [1, InputTensor.DimensionCount). Por exemplo, considerando InputTensor.Sizes = {1,1,4,6} e InputDimensionCount = 3, os índices significativos reais são {1,4,6}.
IndicesDimensionCount
Tipo: UINT
O número de dimensões de índice reais no IndicesTensor depois de ignorar quaisquer irrelevantes à esquerda, variando [1, IndicesTensor.DimensionCount). Por exemplo, considerando IndicesTensor.Sizes = {1,1,4,6} e IndicesDimensionCount = 3, os índices significativos reais são {1,4,6}.
Exemplos
InputTensor: (Sizes:{8}, DataType:FLOAT32)
[1, 2, 3, 4, 5, 6, 7, 8]
IndicesTensor: (Sizes:{4,1}, DataType:FLOAT32)
[[4], [3], [1], [7]]
UpdatesTensor: (Sizes:{4}, DataType:FLOAT32)
[9, 10, 11, 12]
// output = input
// output[indices[x, 0]] = updates[x]
OutputTensor: (Sizes:{8}, DataType:FLOAT32)
[1, 11, 3, 10, 9, 6, 7, 12]
Disponibilidade
Esse operador foi introduzido em DML_FEATURE_LEVEL_2_1
.
Restrições do Tensor
- IndicesTensor, InputTensor, OutputTensor e UpdatesTensor devem ter a mesma DimensionCount.
- InputTensor, OutputTensor e UpdatesTensor 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 |
UpdatesTensor | 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 |
IndicesTensor | Entrada | 1 a 8 | INT64, INT32, UINT64, UINT32 |
UpdatesTensor | 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 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndicesTensor | Entrada | 4 | UINT32 |
UpdatesTensor | Entrada | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Saída | 4 | 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 |