DML_SCATTER_ND_OPERATOR_DESC struttura (directml.h)

Copia l'intero tensore di input nell'output, quindi sovrascrive gli indici selezionati con valori corrispondenti dal tensore aggiornamenti. Questo operatore esegue lo pseudocode seguente, dove "..." rappresenta una serie di coordinate, con il comportamento esatto determinato dalle dimensioni dell'asse e degli indici.

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

Se due indici degli elementi di output si sovrappongono (che non è valido), non esiste alcuna garanzia dell'ultima vittoria di scrittura.

Sintassi

struct DML_SCATTER_ND_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *UpdatesTensor;
  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. 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 deve superare InputTensor.DimensionCount. Ad esempio, un indice tensore di dimensioni {1,4,5,2} con IndicesDimensionCount = 3 significa una matrice 4x5 di tupla coordinata a 2 valori 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.

UpdatesTensor

Tipo: const DML_TENSOR_DESC*

Tensor contenente i nuovi valori per sostituire i valori di input esistenti negli indici corrispondenti. DimensionCount di questo tensore deve corrispondere a InputTensor.DimensionCount. Gli aggiornamenti previstiTensor.Sizes sono la concatenazione dei segmenti principali indicesTensor.Sizes e InputTensor.Sizes finali per restituire quanto segue.

indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
UpdatesTensor.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 UpdatesTensor.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).
UpdatesTensor.Sizes = [1, 1,2,6,7]

OutputTensor

Tipo: const DML_TENSOR_DESC*

Tensor in cui scrivere i risultati. Le dimensioni e il tipo di dati di questo tensore devono corrispondere a InputTensor.Sizes.

InputDimensionCount

Tipo: UINT

Numero di dimensioni di input effettive all'interno di InputTensor dopo aver ignorato eventuali elementi iniziali irrilevanti, compresi [1, InputTensor.DimensionCount). Ad esempio, dato InputTensor.Sizes = e InputDimensionCount = {1,1,4,6} 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 qualsiasi elemento iniziale irrilevante, compreso tra [1, IndicesTensor.DimensionCount). Ad esempio, dato IndicesTensor.Sizes = e IndicesDimensionCount = {1,1,4,6} 3, gli indici significativi effettivi sono {1,4,6}.

Esempio

InputTensor: (Sizes:{8}, DataType:FLOAT32)
    [1, 2, 3, 4, 5, 6, 7, 8]

IndicesTensor: (Sizes:{4,1}, DataType:FLOAT32)
    [[4], [3], [1], [7]]

UpdatesTensor: (Sizes:{4}, DataType:FLOAT32)
    [9, 10, 11, 12]

// output = input
// output[indices[x, 0]] = updates[x]
OutputTensor: (Sizes:{8}, DataType:FLOAT32)
    [1, 11, 3, 10, 9, 6, 7, 12]

Disponibilità

Questo operatore è stato introdotto in DML_FEATURE_LEVEL_2_1.

Vincoli tensor

  • IndicisTensor, InputTensor, OutputTensor e UpdatesTensor devono avere lo stesso DimensionCount.
  • InputTensor, OutputTensor e UpdatesTensor 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
UpdatesTensor Input da 1 a 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8
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
UpdatesTensor Input da 1 a 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
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
UpdatesTensor Input 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8
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