DML_SCATTER_ND_OPERATOR_DESC-Struktur (directml.h)
Kopiert den gesamten Eingabe-Tensor in die Ausgabe und überschreibt dann ausgewählte Indizes mit entsprechenden Werten aus dem Update-Tensor. Dieser Operator führt den folgenden Pseudocode aus, wobei "..." stellt eine Reihe von Koordinaten dar, wobei das genaue Verhalten durch die Größe der Achse und der Indizes bestimmt wird.
output = input
output[indices[...]] = updates[...]
Wenn sich zwei Ausgabeelementindizes überschneiden (was ungültig ist), gibt es keine Garantie dafür, welcher letzte Schreibvorgang gewinnt.
Syntax
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;
};
Member
InputTensor
Typ: const DML_TENSOR_DESC*
Der Tensor, aus dem gelesen werden soll.
IndicesTensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die Indizes enthält. Der DimensionCount dieses Tensors muss mit InputTensor.DimensionCount übereinstimmen. Die letzte Dimension des IndicesTensor ist tatsächlich die Anzahl der Koordinaten pro Indextupel und darf InputTensor.DimensionCount nicht überschreiten. Beispielsweise bedeutet ein Indizes-Tensor der Größe {1,4,5,2}
mit IndicesDimensionCount = 3 ein 4x5-Array von 2-Wert-Koordinatentupeln, die in InputTensor indiziert werden.
DML_FEATURE_LEVEL_3_0
Ab unterstützt dieser Operator negative Indexwerte, wenn ein signierter integraler Typ mit diesem Tensor verwendet wird. Negative Indizes werden relativ zum Ende der jeweiligen Dimension interpretiert. Ein Index von -1 bezieht sich beispielsweise auf das letzte Element entlang dieser Dimension.
UpdatesTensor
Typ: const DML_TENSOR_DESC*
Ein Tensor, der die neuen Werte enthält, um die vorhandenen Eingabewerte an den entsprechenden Indizes zu ersetzen. Der DimensionCount dieses Tensors muss mit InputTensor.DimensionCount übereinstimmen. Die erwarteten UpdatesTensor.Sizes sind die Verkettung der führenden Segmente IndicesTensor.Sizes und das nachfolgende Segment InputTensor.Sizes , um Folgendes zu ergeben.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
UpdatesTensor.Sizes = [
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
]
Die Dimensionen sind rechtsbündig, wobei führende 1 Werte bei Bedarf vorangestellt werden, um UpdatesTensor.DimensionCount zu erfüllen.
Hier sehen Sie ein Beispiel.
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
Typ: const DML_TENSOR_DESC*
Der Tensor, in den die Ergebnisse geschrieben werden sollen. Die Größen und der Datentyp dieses Tensors müssen mit InputTensor.Sizes übereinstimmen.
InputDimensionCount
Typ: UINT
Die Anzahl der tatsächlichen Eingabedimensionen innerhalb des InputTensor nach dem Ignorieren irrelevanter führender Dimensionen im Bereich [1, InputTensor.DimensionCount). Bei EingabeTensor.Sizes = {1,1,4,6} und InputDimensionCount = 3 sind {1,4,6}beispielsweise die tatsächlichen aussagekräftigen Indizes .
IndicesDimensionCount
Typ: UINT
Die Anzahl der tatsächlichen Indexdimensionen innerhalb des IndizesTensor nach dem Ignorieren irrelevanter führender Dimensionen, die [1, IndicesTensor.DimensionCount] reicht. Bei IndicesTensor.Sizes = {1,1,4,6} und IndicesDimensionCount = 3 sind {1,4,6}beispielsweise die tatsächlichen aussagekräftigen Indizes .
Beispiele
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]
Verfügbarkeit
Dieser Operator wurde in DML_FEATURE_LEVEL_2_1
eingeführt.
Tensoreinschränkungen
- IndicesTensor, InputTensor, OutputTensor und UpdatesTensor müssen über dieselbe DimensionCount verfügen.
- InputTensor, OutputTensor und UpdatesTensor müssen über denselben DataType verfügen.
Tensorunterstützung
DML_FEATURE_LEVEL_4_1 und höher
Tensor | Variante | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 1 bis 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
IndizesTensor | Eingabe | 1 bis 8 | INT64, INT32, UINT64, UINT32 |
UpdatesTensor | Eingabe | 1 bis 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
OutputTensor | Ausgabe | 1 bis 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_3_0 und höher
Tensor | Variante | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 1 bis 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndizesTensor | Eingabe | 1 bis 8 | INT64, INT32, UINT64, UINT32 |
UpdatesTensor | Eingabe | 1 bis 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Ausgabe | 1 bis 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
DML_FEATURE_LEVEL_2_1 und höher
Tensor | Variante | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndizesTensor | Eingabe | 4 | UINT32 |
UpdatesTensor | Eingabe | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Ausgabe | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Windows 10 Build 20348 |
Unterstützte Mindestversion (Server) | Windows 10 Build 20348 |
Kopfzeile | directml.h |