DML_GATHER_ND1_OPERATOR_DESC-Struktur (directml.h)
Sammelt Elemente aus dem Eingabe tensor, wobei der Indizes-Tensor verwendet wird, um Indizes ganzen Teilblöcken der Eingabe neu zuzuordnen. Dieser Operator führt den folgenden Pseudocode aus, wobei "..." stellt eine Reihe von Koordinaten dar, wobei das genaue Verhalten von der Anzahl der Batch-, Eingabe- und Indizesdimensionen abhängt.
output[batch, ...] = input[batch, indices[batch, ...], ...]
Syntax
struct DML_GATHER_ND1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT InputDimensionCount;
UINT IndicesDimensionCount;
UINT BatchDimensionCount;
};
Member
InputTensor
Typ: const DML_TENSOR_DESC*
Der Tensor, aus dem gelesen werden soll.
IndicesTensor
Typ: const DML_TENSOR_DESC*
Der Tensor, der die Indizes enthält. Die 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 Indices tensor von Sizes{1,4,5,2}
mit IndicesDimensionCount = 3 ein 4x5-Array von Tupeln mit 2 Koordinaten, das in InputTensor indiziert wird.
DML_FEATURE_LEVEL_3_0
Ab unterstützt dieser Operator negative Indexwerte, wenn ein integraler Vorzeichentyp mit diesem Tensor verwendet wird. Negative Indizes werden als relativ zum Ende der jeweiligen Dimension interpretiert. Beispielsweise bezieht sich ein Index von -1 auf das letzte Element entlang dieser Dimension.
OutputTensor
Typ: const DML_TENSOR_DESC*
Der Tensor, in den die Ergebnisse geschrieben werden sollen. DimensionCount und DataType dieses Tensors müssen mit InputTensor.DimensionCount übereinstimmen. Die erwarteten OutputTensor.Sizes sind die Verkettung der führenden Segmente "IndicesTensor.Sizes " und das nachfolgende Segment "InputTensor.Sizes ", was Folgendes ergibt.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
OutputTensor.Sizes = {
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
}
Die Dimensionen sind rechtsbündig ausgerichtet, wobei führende 1 Werte bei Bedarf vorangestellt werden, um OutputTensor.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).
OutputTensor.Sizes = {1, 1,2,6,7}
InputDimensionCount
Typ: UINT
Die Anzahl der tatsächlichen Eingabedimensionen innerhalb des InputTensor nach dem Ignorieren irrelevanter führender Dimensionen im Bereich [1, *InputTensor.DimensionCount*]
von . Bei EingabeTensor.Sizes = {1,1,4,6}
und InputDimensionCount
= 3 sind {1,4,6}
die tatsächlichen aussagekräftigen Indizes beispielsweise .
IndicesDimensionCount
Typ: UINT
Die Anzahl der tatsächlichen Indexdimensionen innerhalb des IndicesTensor nach dem Ignorieren irrelevanter führender Dimensionen im Bereich [1, IndicesTensor.DimensionCount]. Bei IndicesTensor.Sizes = {1,1,4,6}
und IndicesDimensionCount = 3 sind {1,4,6}
die tatsächlichen aussagekräftigen Indizes beispielsweise .
BatchDimensionCount
Typ: UINT
Die Anzahl der Dimensionen in jedem Tensor (InputTensor, IndicesTensor, OutputTensor), die als unabhängige Batches betrachtet werden, und reicht innerhalb von [0, InputTensor.DimensionCount) und [0, IndicesTensor.DimensionCount). Die Batchanzahl kann 0 sein, was einen einzelnen Batch impliziert. Beispielsweise gibt es bei IndicesTensor.Sizes = {1,3,4,5,6,7}
und IndicesDimensionCount = 5 und BatchDimensionCount
= 2 Batches {3,4}
und aussagekräftige Indizes {5,6,7}
.
Hinweise
DML_GATHER_ND1_OPERATOR_DESC fügt BatchDimensionCount hinzu und entspricht DML_GATHER_ND_OPERATOR_DESC , wenn BatchDimensionCount = 0 ist.
Beispiele
Beispiel 1: 1D-Neuzuordnung
InputDimensionCount: 2
IndicesDimensionCount: 2
BatchDimensionCount: 0
InputTensor: (Sizes:{2,2}, DataType:FLOAT32)
[[0,1],[2,3]]
IndicesTensor: (Sizes:{2,1}, DataType:UINT32)
[[1],[0]]
// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{2,2}, DataType:FLOAT32)
[[2,3],[0,1]]
Beispiel 2: 2D-Neuzuordnung mit Batchanzahl
InputDimensionCount: 3
IndicesDimensionCount: 3
BatchDimensionCount: 1
// 3 batches.
InputTensor: (Sizes:{1, 3,2,2}, DataType:FLOAT32)
[
[[[0,1],[2,3]], // batch 0
[[4,5],[6,7]], // batch 1
[[8,9],[10,11]]] // batch 2
]
// A 3x2 array of 2D tuples indexing into InputTensor.
// e.g. a tuple of <1,0> in batch 1 corresponds to input value 6.
IndicesTensor: (Sizes:{1, 3,2,2}, DataType:UINT32)
[
[[[0,0],[1,1]],
[[1,1],[0,0]],
[[0,1],[1,0]]]
]
// output[batch, x] = input[batch, indices[batch, x, 0], indices[batch, x, 1]]
OutputTensor: (Sizes:{1,1, 3,2}, DataType:FLOAT32)
[[
[[0,3],
[7,4],
[9,10]]
]]
Verfügbarkeit
Dieser Operator wurde in DML_FEATURE_LEVEL_3_0
eingeführt.
Tensoreinschränkungen
- IndicesTensor, InputTensor und OutputTensor müssen dieselbe DimensionCount aufweisen.
- InputTensor und OutputTensor müssen denselben Datentyp aufweisen.
Tensorunterstützung
DML_FEATURE_LEVEL_4_1 und höher
Tensor | Typ | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 1 bis 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
IndicesTensor | Eingabe | 1 bis 8 | INT64, INT32, UINT64, UINT32 |
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 | Typ | Unterstützte Dimensionsanzahl | Unterstützte Datentypen |
---|---|---|---|
InputTensor | Eingabe | 1 bis 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
IndicesTensor | Eingabe | 1 bis 8 | INT64, INT32, UINT64, UINT32 |
OutputTensor | Ausgabe | 1 bis 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Anforderungen
Unterstützte Mindestversion (Client) | Windows 10 Build 20348 |
Unterstützte Mindestversion (Server) | Windows 10 Build 20348 |
Kopfzeile | directml.h |