Compartilhar via


estrutura DML_GATHER_ND_OPERATOR_DESC (directml.h)

Coleta elementos do tensor de entrada, usando o tensor de índices para remapear índices para subblocos inteiros da entrada. Esse operador executa o pseudocódigo a seguir, em que "..." representa uma série de coordenadas, com o comportamento exato dependente da contagem de dimensões de entrada e índices.

output[...] = input[indices[...]]

Sintaxe

struct DML_GATHER_ND_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  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*

O 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 pode exceder InputTensor.DimensionCount. Por exemplo, um tensor de índices de Tamanhos{1,4,5,2} com IndicesDimensionCount = 3 significa uma matriz 4x5 de tuplas de duas coordenadas que indexam em InputTensor.

DML_FEATURE_LEVEL_3_0A 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.

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 IndicesTensor.Sizes e InputTensor.Sizes à direita para produzir:

indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
OutputTensor.Sizes = {
    1...,
    IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
    InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
}

As dimensões de saída são alinhadas à direita, com 1 valores à esquerda anexados, se necessário, para atender a OutputTensor.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).
OutputTensor.Sizes = {1, 1,2,6,7}

InputDimensionCount

Tipo: UINT

O número de dimensões de entrada reais no InputTensor depois de ignorar as irrelevantes à esquerda, variando [1, *InputTensor.DimensionCount*]. Por exemplo, dado 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

Exemplo 1. Remapeamento 1D

InputDimensionCount: 2
IndicesDimensionCount: 2

InputTensor: (Sizes:{2,2}, DataType:FLOAT32)
    [[0,1],[2,3]]

IndicesTensor: (Sizes:{2,1}, DataType:UINT32)
    [[1],[0]]

// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{2,2}, DataType:FLOAT32)
    [[2,3],[0,1]]

Exemplo 2. Remapeamento 2D

InputDimensionCount: 3
IndicesDimensionCount: 2

InputTensor: (Sizes:{1, 2,2,2}, DataType:FLOAT32)
    [ [[[0,1],[2,3]],[[4,5],[6,7]]] ]

IndicesTensor: (Sizes:{1,1, 2,2}, DataType:UINT32)
    [[ [[0,1],[1,0]] ]]

// output[y, x] = input[indices[y, 0], indices[y, 1], x]
OutputTensor: (Sizes:{1,1, 2,2}, DataType:FLOAT32)
    [[ [[2,3],[4,5]] ]]

Comentários

Uma versão mais recente desse operador, DML_OPERATOR_GATHER_ND1, foi introduzida no DML_FEATURE_LEVEL_3_0.

Disponibilidade

Esse operador foi introduzido no DML_FEATURE_LEVEL_2_1.

Restrições do Tensor

  • IndicesTensor, InputTensor e OutputTensor devem ter o mesmo 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

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