Partager via


structure DML_SCATTER_OPERATOR_DESC (directml.h)

Copie l’ensemble du tenseur d’entrée dans la sortie, puis remplace les index sélectionnés par les valeurs correspondantes du tenseur de mises à jour. Cet opérateur effectue le pseudocode suivant.

output = input
output[index[i, j, k, ...], j, k, ...] = updates[i, j, k, ...] // if axis == 0
output[i, index[i, j, k, ...], k, ...] = updates[i, j, k, ...] // if axis == 1
output[i, j, index[i, j, k, ...], ...] = updates[i, j, k, ...] // if axis == 2
...

Si deux index d’éléments de sortie se chevauchent (ce qui n’est pas valide), il n’y a aucune garantie quant à la dernière écriture qui gagne.

DML_SCATTER_OPERATOR_DESC est l’inverse de DML_GATHER_OPERATOR_DESC.

Syntaxe

struct DML_SCATTER_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *UpdatesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  Axis;
};

Membres

InputTensor

Type : const DML_TENSOR_DESC*

Tenseur à partir duquel lire.

IndicesTensor

Type : const DML_TENSOR_DESC*

Tenseur contenant les index dans le tenseur de sortie. Les tailles doivent correspondre à InputTensor.Sizes pour chaque dimension à l’exception d’Axis.

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 index négatifs sont interprétés comme étant relatifs à la fin de la dimension d’axe. 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. Les tailles de ce tenseur doivent correspondre à IndexTensor.Sizes. Le DataType doit correspondre à InputTensor.DataType.

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.

Axis

Type : UINT

Dimension d’axe à utiliser pour l’indexation dans OutputTensor, allant de [0, OutputTensor.DimensionCount).

Exemples

Exemple 1. Nuage de points 1D

Axis: 0

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

IndicesTensor: (Sizes:{4}, DataType:UINT32)
    [3,1,3,0]

UpdatesTensor: (Sizes:{4}, DataType:FLOAT32)
    [5,6,7,8]

// output = input
// output[indices[x]] = updates[x]
OutputTensor: (Sizes:{5}, DataType:FLOAT32)
    [8,6,2,7,4]

Exemple 2. Nuage de points 2D

Axis: 0

InputTensor: (Sizes:{2,3}, DataType:FLOAT32)
    [[0.0, 0.0, 0.0],
     [0.0, 0.0, 0.0],
     [0.0, 0.0, 0.0]]

IndicesTensor: (Sizes:{2,3}, DataType:UINT32)
    [[1, 0, 2],
     [0, 2, 1]]

UpdatesTensor: (Sizes:{2,3}, DataType:FLOAT32)
    [[10, 11, 12],
     [20, 21, 22]]

// output = input
// output[indices[y, x], x] = updates[y, x]
OutputTensor: (Sizes:{3,3}, DataType:FLOAT32)
    [[20, 11,  0],
     [10,  0, 22],
     [ 0, 21, 12]]

Notes

DML_SCATTER_OPERATOR_DESC a été correctement associé au nom DML_SCATTER_ELEMENTS_OPERATOR_DESC comme équivalent approprié pour DML_GATHER_ELEMENTS_OPERATOR_DESC. En effet , DML_SCATTER_OPERATOR_DESC n’était pas vraiment symétrique à DML_GATHER_OPERATOR_DESC.

Disponibilité

Cet opérateur a été introduit dans DML_FEATURE_LEVEL_1_0.

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 de Tensor

DML_FEATURE_LEVEL_4_1 et versions ultérieures

Tenseur Type 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 Output 1 à 8 FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_3_0 et versions ultérieures

Tenseur Type 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 Output 1 à 8 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_2_1 et versions ultérieures

Tenseur Type 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 Output 4 FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8

DML_FEATURE_LEVEL_1_0 et versions ultérieures

Tenseur Type Nombre de dimensions pris en charge Types de données pris en charge
InputTensor Entrée 4 FLOAT32, FLOAT16
IndexTensor Entrée 4 UINT32
UpdatesTensor Entrée 4 FLOAT32, FLOAT16
OutputTensor Output 4 FLOAT32, FLOAT16

Spécifications

   
Client minimal pris en charge Windows 10, version 2004 (10.0; Build 19041)
Serveur minimal pris en charge Windows Server, version 2004 (10.0 ; Build 19041)
En-tête directml.h