Condividi tramite


DML_GATHER_ND1_OPERATOR_DESC struttura (directml.h)

Raccoglie gli elementi dal tensore di input usando il tensore indici per eseguire il mapping degli indici a interi blocchi secondari dell'input. Questo operatore esegue lo pseudocode seguente, dove "..." rappresenta una serie di coordinate, con il comportamento esatto dipendente dal numero di dimensioni batch, input e indici.

output[batch, ...] = input[batch, indices[batch, ...], ...]

Sintassi

struct DML_GATHER_ND1_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  InputDimensionCount;
  UINT                  IndicesDimensionCount;
  UINT                  BatchDimensionCount;
};

Members

InputTensor

Tipo: const DML_TENSOR_DESC*

Tensore da cui leggere.

IndicesTensor

Tipo: const DML_TENSOR_DESC*

Tensore contenente gli indici. DimensionCount di questo tensore deve corrispondere a InputTensor.DimensionCount. L'ultima dimensione dell'indicesTensor è effettivamente il numero di coordinate per tupla dell'indice e non può superare InputTensor.DimensionCount. Ad esempio, un tensore di indici di Dimensioni{1,4,5,2} con IndicesDimensionCount = 3 significa una matrice 4x5 di tupla a 2 coordinate che indicizza in InputTensor.

A partire da DML_FEATURE_LEVEL_3_0, questo operatore supporta valori di indice negativi quando si usa un tipo integrale firmato con questo tensore. Gli indici negativi vengono interpretati come relativi alla fine della rispettiva dimensione. Ad esempio, un indice di -1 fa riferimento all'ultimo elemento lungo tale dimensione.

OutputTensor

Tipo: const DML_TENSOR_DESC*

Tensor in cui scrivere i risultati. DimensionCount e DataType di questo tensore devono corrispondere a InputTensor.DimensionCount. L'output previstoTensor.Sizes è la concatenazione dei segmenti principali indicesTensor.Sizes e del segmento finale InputTensor.Sizes , che restituisce quanto segue.

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

Le dimensioni sono allineate a destra, con valori iniziali 1 prependati se necessario per soddisfare OutputTensor.DimensionCount.

Ecco un esempio.

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

Numero di dimensioni di input effettive all'interno di InputTensor dopo aver ignorato quelli iniziali irrilevanti, che vanno da [1, *InputTensor.DimensionCount*]. Ad esempio, dato InputTensor.Sizes = {1,1,4,6} e InputDimensionCount = 3, gli indici significativi effettivi sono {1,4,6}.

IndicesDimensionCount

Tipo: UINT

Numero di dimensioni effettive dell'indice all'interno dell'IndicesTensor dopo aver ignorato quelli iniziali irrilevanti, compresi [1, IndicesTensor.DimensionCount]. Ad esempio, dato IndicesTensor.Sizes = {1,1,4,6} e IndicesDimensionCount = 3, gli indici significativi effettivi sono {1,4,6}.

BatchDimensionCount

Tipo: UINT

Numero di dimensioni all'interno di ogni tensore (InputTensor, IndicesTensor, OutputTensor) considerati batch indipendenti, che vanno all'interno di [0, InputTensor.DimensionCount) e [0, IndicesTensor.DimensionCount). Il numero di batch può essere 0, implicando un singolo batch. Ad esempio, dato IndicesTensor.Sizes = {1,3,4,5,6,7} e IndicesDimensionCount = 5 e = 2, sono presenti batch {3,4} e BatchDimensionCount indici {5,6,7}significativi.

Commenti

DML_GATHER_ND1_OPERATOR_DESC aggiunge BatchDimensionCount ed è equivalente a DML_GATHER_ND_OPERATOR_DESC quando BatchDimensionCount = 0.

Esempi

Esempio 1. 1D remapping

InputDimensionCount: 2
IndicesDimensionCount: 2
BatchDimensionCount: 0

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

Esempio 2. 2D remapping con conteggio batch

InputDimensionCount: 3
IndicesDimensionCount: 3
BatchDimensionCount: 1

// 3 batches.
InputTensor: (Sizes:{1, 3,2,2}, DataType:FLOAT32)
    [
        [[[0,1],[2,3]],   // batch 0
         [[4,5],[6,7]],   // batch 1
         [[8,9],[10,11]]] // batch 2
    ]

// A 3x2 array of 2D tuples indexing into InputTensor.
// e.g. a tuple of <1,0> in batch 1 corresponds to input value 6.
IndicesTensor: (Sizes:{1, 3,2,2}, DataType:UINT32)
    [
        [[[0,0],[1,1]],
         [[1,1],[0,0]],
         [[0,1],[1,0]]]
    ]

// output[batch, x] = input[batch, indices[batch, x, 0], indices[batch, x, 1]]
OutputTensor: (Sizes:{1,1, 3,2}, DataType:FLOAT32)
    [[
        [[0,3],
         [7,4],
         [9,10]]
    ]]

Disponibilità

Questo operatore è stato introdotto in DML_FEATURE_LEVEL_3_0.

Vincoli tensor

  • IndicisTensor, InputTensor e OutputTensor devono avere lo stesso DimensionCount.
  • InputTensor e OutputTensor devono avere lo stesso Tipo di dati.

Supporto di Tensor

DML_FEATURE_LEVEL_4_1 e versioni successive

Tensore Tipo Conteggi delle dimensioni supportate Tipi di dati supportati
InputTensor Input da 1 a 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8
IndicesTensor Input da 1 a 8 INT64, INT32, UINT64, UINT32
OutputTensor Output da 1 a 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_3_0 e versioni successive

Tensore Tipo Conteggi delle dimensioni supportate Tipi di dati supportati
InputTensor Input da 1 a 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndicesTensor Input da 1 a 8 INT64, INT32, UINT64, UINT32
OutputTensor Output da 1 a 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

Requisiti

   
Client minimo supportato Windows 10 Build 20348
Server minimo supportato Windows 10 Build 20348
Intestazione directml.h