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_0
A 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 |