DML_GATHER_OPERATOR_DESC struttura (directml.h)
Raccoglie gli elementi dal tensore di input lungo l'asse, usando IndicesTensor per eseguire il mapping degli indici. Questo operatore esegue lo pseudocode seguente, dove "..." rappresenta una serie di coordinate, con il comportamento esatto determinato dal conteggio delle dimensioni dell'asse e degli indici:
output[...] = input[..., indices[...], ...]
Sintassi
struct DML_GATHER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
UINT IndexDimensions;
};
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.
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 dimensione dell'asse. Ad esempio, un indice di -1 fa riferimento all'ultimo elemento lungo tale dimensione.
Gli indici non validi restituiranno output non corretti, ma non si verificherà alcun errore e tutte le letture verranno bloccate in modo sicuro all'interno della memoria del tensore di input.
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 iniziali e finali di InputTensor.Sizes suddivisi nell'asse corrente con indicesTensor.Sizes inseriti tra.
OutputTensor.Sizes = {
InputTensor.Sizes[0..Axis],
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}
Le dimensioni sono allineate a destra in modo che tutti i valori iniziali 1 dalle dimensioni di input vengano ritagliati che altrimenti sovraflowno il DimensionCount di output.
Il numero di dimensioni rilevanti in questo tensore dipende da IndexDimensions e dalla classificazione originale di InputTensor. Il rango originale è il numero di dimensioni precedenti a qualsiasi riempimento con quelli iniziali. Il numero di dimensioni rilevanti nell'output può essere calcolato dal rango originale di InputTensor + IndexDimensions - 1. Questo valore deve essere minore o uguale a DimensionCount of OutputTensor.
Axis
Tipo: UINT
Dimensione dell'asse di InputTensor su cui raccogliere, a intervalli [0, *InputTensor.DimensionCount*)
.
IndexDimensions
Tipo: UINT
Numero di dimensioni di indice effettive all'interno IndicesTensor
di dopo aver ignorato quelli iniziali irrilevanti, che vanno da [0, IndicesTensor.DimensionCount
). Ad esempio, dato IndicesTensor.Sizes
= { 1, 1, 4, 6 }
e IndexDimensions
= 3, gli indici significativi effettivi sono { 1, 4, 6 }
.
Esempi
Esempio 1. 1D remapping
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]
Esempio 2. Output 2D, indici 1D, Asse 0, righe concatenate
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
Esempio 3. 2D, Asse 1, scambiare colonne
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]]
Esempio 4. 2D, Asse 1, indici annidati
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]]]
Esempio 5. 2D, Asse 0, indici annidati
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]]]
Disponibilità
Questo operatore è stato introdotto in DML_FEATURE_LEVEL_1_0
.
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 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 |
DML_FEATURE_LEVEL_2_1 e versioni successive
Tensore | Tipo | Conteggi delle dimensioni supportate | 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 |
DML_FEATURE_LEVEL_1_0 e versioni successive
Tensore | Tipo | Conteggi delle dimensioni supportati | Tipi di dati supportati |
---|---|---|---|
InputTensor | Input | 4 | FLOAT32, FLOAT16 |
IndicesTensor | Input | 4 | UINT32 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16 |
Requisiti
Intestazione | directml.h |