DML_SCATTER_ND_OPERATOR_DESC structure (directml.h)
Copie l’intégralité du tenseur d’entrée dans la sortie, puis remplace les index sélectionnés par les valeurs correspondantes du tenseur des mises à jour. Cet opérateur exécute le pseudocode suivant, où « ... » représente une série de coordonnées, avec le comportement exact déterminé par la taille de l’axe et des index.
output = input
output[indices[...]] = updates[...]
Si deux index d’éléments de sortie se chevauchent (ce qui n’est pas valide), il n’y a aucune garantie que la dernière écriture gagne.
Syntaxe
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;
};
Membres
InputTensor
Type : const DML_TENSOR_DESC*
Tenseur à partir duquel lire.
IndicesTensor
Type : const DML_TENSOR_DESC*
Tenseur contenant les index. Le DimensionCount de ce tenseur doit correspondre à InputTensor.DimensionCount. La dernière dimension de IndexsTensor est en fait le nombre de coordonnées par tuple d’index, et elle ne doit pas dépasser InputTensor.DimensionCount. Par exemple, un tenseur d’index de taille {1,4,5,2}
avec IndicesDimensionCount = 3 signifie un tableau 4x5 de tuples de coordonnées à 2 valeurs qui s’indexent dans InputTensor.
DML_FEATURE_LEVEL_3_0
À compter de , cet opérateur prend en charge les valeurs d’index négatives lors de l’utilisation d’un type intégral signé avec ce tenseur. Les indices négatifs sont interprétés comme étant relatifs à la fin de la dimension respective. Par exemple, un index de -1 fait référence au dernier élément le long de cette dimension.
UpdatesTensor
Type : const DML_TENSOR_DESC*
Tenseur contenant les nouvelles valeurs pour remplacer les valeurs d’entrée existantes aux index correspondants. Le DimensionCount de ce tenseur doit correspondre à InputTensor.DimensionCount. La valeur UpdatesTensor.Sizes attendue est la concaténation des segments de tête IndicesTensor.Sizes et du segment de fin InputTensor.Sizes pour produire les éléments suivants.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
UpdatesTensor.Sizes = [
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
]
Les dimensions sont alignées à droite, avec 1 valeur de début ajoutée si nécessaire pour satisfaire UpdatesTensor.DimensionCount.
Voici un exemple.
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
Type : const DML_TENSOR_DESC*
Tenseur dans lequel écrire les résultats. Les tailles et le type de données de ce tenseur doivent correspondre à InputTensor.Sizes.
InputDimensionCount
Type : UINT
Nombre de dimensions d’entrée réelles dans le inputTensor après avoir ignoré toutes les dimensions d’entrée non pertinentes, allant de [1, InputTensor.DimensionCount). Par exemple, étant donné InputTensor.Sizes = {1,1,4,6} et InputDimensionCount = 3, les indices significatifs réels sont {1,4,6}.
IndicesDimensionCount
Type : UINT
Nombre de dimensions d’index réelles dans IndexsTensor après avoir ignoré toutes les dimensions d’index non pertinentes, allant de [1, IndicesTensor.DimensionCount). Par exemple, étant donné IndexsTensor.Sizes = {1,1,4,6} et IndexsDimensionCount = 3, les index significatifs réels sont {1,4,6}.
Exemples
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é
Cet opérateur a été introduit dans DML_FEATURE_LEVEL_2_1
.
Contraintes tensoriels
- IndexsTensor, InputTensor, OutputTensor et UpdatesTensor doivent avoir le même DimensionCount.
- InputTensor, OutputTensor et UpdatesTensor doivent avoir le même DataType.
Prise en charge des tenseurs
DML_FEATURE_LEVEL_4_1 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 1 à 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
IndexTensor | Entrée | 1 à 8 | INT64, INT32, UINT64, UINT32 |
UpdatesTensor | Entrée | 1 à 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 1 à 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_3_0 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 1 à 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndexTensor | Entrée | 1 à 8 | INT64, INT32, UINT64, UINT32 |
UpdatesTensor | Entrée | 1 à 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 1 à 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 et versions ultérieures
Tenseur | Genre | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensor | Entrée | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndexTensor | Entrée | 4 | UINT32 |
UpdatesTensor | Entrée | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Sortie | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Configuration requise
Condition requise | Valeur |
---|---|
Client minimal pris en charge | Windows 10 Build 20348 |
Serveur minimal pris en charge | Windows 10 Build 20348 |
En-tête | directml.h |