Condividi tramite


struttura DML_GATHER_ND_OPERATOR_DESC (directml.h)

Raccoglie gli elementi dal tensore di input, usando il tensore di indici per modificare il mapping degli indici a interi sottoblocchi dell'input. Questo operatore esegue lo pseudocodice seguente, dove "..." rappresenta una serie di coordinate, con il comportamento esatto dipendente dal conteggio delle dimensioni di input e indici.

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

Sintassi

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;
};

Members

InputTensor

Tipo: const DML_TENSOR_DESC*

Tensore da cui leggere.

IndicesTensor

Tipo: const DML_TENSOR_DESC*

Tensore contenente gli indici. Il Valore DimensionCount di questo tensore deve corrispondere a InputTensor.DimensionCount. L'ultima dimensione di IndicesTensor è in realtà il numero di coordinate per ogni tupla di indice e non può superare InputTensor.DimensionCount. Ad esempio, un tensore di indici di Sizes{1,4,5,2} con IndicesDimensionCount = 3 indica una matrice 4x5 di tuple a 2 coordinate che indicizzano in InputTensor.

DML_FEATURE_LEVEL_3_0A partire da , questo operatore supporta i valori di indice negativi quando si usa un tipo integrale con segno 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*

Tensore in cui scrivere i risultati. DimensionCount e DataType di questo tensore devono corrispondere a InputTensor.DimensionCount. L'outputtensor.Sizes previsto è la concatenazione dei segmenti iniziali di IndicesTensor.Sizes e Del segmento finale InputTensor.Sizes da restituire:

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 di output sono allineate a destra, con i valori iniziali 1 anteporti se necessario per soddisfare fino a 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 di indice effettive all'interno di 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}.

Esempi

Esempio 1. 1D remapping

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

Esempio 2. Rimmapping 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]] ]]

Commenti

Una versione più recente di questo operatore, DML_OPERATOR_GATHER_ND1, è stata introdotta in DML_FEATURE_LEVEL_3_0.

Disponibilità

Questo operatore è stato introdotto in DML_FEATURE_LEVEL_2_1.

Vincoli tensor

  • IndicesTensor, 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 supportati 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 supportati 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

DML_FEATURE_LEVEL_2_1 e versioni successive

Tensore Tipo Conteggi delle dimensioni supportati Tipi di dati supportati
InputTensor Input 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
IndicesTensor Input 4 UINT32
OutputTensor Output 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

Requisiti

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