Compartilhar via


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_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 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