DML_JOIN_OPERATOR_DESC structure (directml.h)
Concatène un tableau de tenseurs d’entrée le long d’un axe spécifié.
Les tenseurs d’entrée ne peuvent être joints que si leurs tailles sont identiques dans toutes les dimensions, à l’exception de l’axe de jointure, qui peut contenir une taille autre que zéro. Les tailles de sortie sont égales aux tailles d’entrée, à l’exception de l’axe de jointure, qui est la somme de la taille de l’axe de jointure de toutes les entrées. Ces contraintes sont illustrées dans le pseudocode ci-dessous.
joinSize = 0;
for (i = 0; i < InputCount; i++) {
assert(inputTensors[i]->DimensionCount == outputTensor->DimensionCount);
for (dim = 0; dim < outputTensor->DimensionCount; dim++) {
if (dim == Axis) { joinSize += inputTensors[i]->Sizes[dim]; }
else { assert(inputTensors[i]->Sizes[dim] == outputTensor->Sizes[dim]); }
}
}
assert(joinSize == outputTensor->Sizes[Axis]);
La jointure d’un tenseur d’entrée unique produit simplement une copie du tenseur d’entrée.
Cet opérateur est l’inverse de DML_SPLIT_OPERATOR_DESC.
Syntaxe
struct DML_JOIN_OPERATOR_DESC {
UINT InputCount;
const DML_TENSOR_DESC *InputTensors;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
};
Membres
InputCount
Type : UINT
Ce champ détermine la taille du tableau InputTensors . Cette valeur doit être supérieure à 0.
InputTensors
Type : _Field_size_(InputCount) const DML_TENSOR_DESC*
Tableau contenant les descriptions des tenseurs à joindre dans un tenseur de sortie unique. Tous les tenseurs d’entrée de ce tableau doivent avoir les mêmes tailles, à l’exception de l’axe de jointure, qui peut avoir une valeur différente de zéro.
OutputTensor
Type : const DML_TENSOR_DESC*
Tenseur dans lequel écrire les tenseurs d’entrée joints. Les tailles de sortie doivent avoir les mêmes tailles que tous les tenseurs d’entrée, à l’exception de l’axe de jointure, qui doit être égale à la somme de la taille de l’axe de jointure de toutes les entrées.
Axis
Type : UINT
Index de la dimension des tenseurs d’entrée à joindre. Tous les tenseurs d’entrée et de sortie doivent avoir des tailles identiques dans toutes les dimensions à l’exception de cet axe. Cette valeur doit être dans la plage [0, OutputTensor.DimensionCount - 1]
.
Exemples
Exemple 1. Jointure de tenseurs avec un seul axe possible
Dans cet exemple, les tenseurs peuvent uniquement être joints le long de la quatrième dimension (axe 3). La jonction d’un autre axe n’est pas possible, car la taille des tenseurs dans la quatrième dimension ne correspond pas.
InputCount: 2
Axis: 3
InputTensors[0]: (Sizes:{1, 1, 2, 3}, DataType:FLOAT32)
[[[[ 1, 2, 3],
[ 4, 5, 6]]]]
InputTensors[1]: (Sizes:{1, 1, 2, 4}, DataType:FLOAT32)
[[[[ 7, 8, 9, 10],
[11, 12, 13, 14]]]]
OutputTensor: (Sizes:{1, 1, 2, 7}, DataType:FLOAT32)
[[[[ 1, 2, 3, 7, 8, 9, 10],
[ 4, 5, 6, 11, 12, 13, 14]]]]
Exemple 2. Jointure de tenseurs avec plusieurs axes possibles :
Les exemples suivants utilisent les mêmes tenseurs d’entrée. Étant donné que toutes les entrées ont la même taille dans toutes les dimensions, elles peuvent être jointes le long de n’importe quelle dimension.
InputCount: 3
InputTensors[0]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4]]]]
InputTensors[1]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[5, 6],
[7, 8]]]]
InputTensors[2]: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[9, 10],
[11, 12]]]]
Jonction de l’axe 1 :
Axis: 1
OutputTensor: (Sizes:{1, 3, 2, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4]],
[[5, 6],
[7, 8]],
[[9, 10],
[11, 12]]]]
Jonction de l’axe 2 :
Axis: 2
OutputTensor: (Sizes:{1, 1, 6, 2}, DataType:FLOAT32)
[[[[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
[11, 12]]]]
Jonction de l’axe 3 :
Axis: 3
OutputTensor: (Sizes:{1, 1, 2, 6}, DataType:FLOAT32)
[[[[1, 2, 5, 6, 9, 10],
[3, 4, 7, 8, 11, 12]]]]
Disponibilité
Cet opérateur a été introduit dans DML_FEATURE_LEVEL_1_0
.
Contraintes tensoriels
InputTensors et OutputTensor doivent avoir les mêmes DataType et DimensionCount.
Prise en charge des tenseurs
DML_FEATURE_LEVEL_4_1 et versions ultérieures
Tenseur | Type | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|
InputTensors | Tableau d’entrées | 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 |
---|---|---|---|
InputTensors | Tableau d’entrées | 4 à 5 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Output | 4 à 5 | 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 |
---|---|---|---|
InputTensors | Tableau d’entrées | 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 |
---|---|---|---|
InputTensors | Tableau d’entrées | 4 | FLOAT32, FLOAT16, INT32, INT16, UINT32, UINT16 |
OutputTensor | Output | 4 | FLOAT32, FLOAT16, INT32, INT16, UINT32, UINT16 |
Spécifications
En-tête | directml.h |