DML_GATHER_ND1_OPERATOR_DESC 結構 (directml.h)
從輸入張量收集元素,使用索引張量將索引重新對應至輸入的整個子區塊。 此運算子會執行下列虛擬程式碼,其中 「...」表示一系列座標,其確切行為取決於批次、輸入和索引維度計數。
output[batch, ...] = input[batch, indices[batch, ...], ...]
語法
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;
};
成員
InputTensor
類型:const DML_TENSOR_DESC*
要從中讀取的張量。
IndicesTensor
類型:const DML_TENSOR_DESC*
包含索引的張量。 這個 Tensor 的 DimensionCount 必須符合 InputTensor.DimensionCount。 IndexesTensor的最後一個維度實際上是每個索引元組的座標數目,而且不能超過InputTensor.DimensionCount。 例如,IndexesDimensionCount = 3 的索引{1,4,5,2}
量表示索引為 2 座標元組的 4x5 陣列,該陣列會索引到InputTensor。
DML_FEATURE_LEVEL_3_0
從 開始,當搭配這個張量使用帶正負號整數型別時,這個運算子支援負數索引值。 負數索引會解譯為相對於個別維度結尾。 例如,-1 的索引是指該維度的最後一個專案。
OutputTensor
類型:const DML_TENSOR_DESC*
要寫入結果的張量。 這個 Tensor 的 DimensionCount 和 DataType 必須符合 InputTensor.DimensionCount。 預期的 OutputTensor.Sizes 是 IndexesTensor.Sizes 前置區段和 InputTensor.Sizes 結尾區段的串連,這會產生下列結果。
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
OutputTensor.Sizes = {
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
}
如果需要滿足 OutputTensor.DimensionCount,維度會靠右對齊,前面加上前置 1 個值。
以下為範例。
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
類型: UINT
忽略任何不相關的前置輸入維度,範圍 [1, *InputTensor.DimensionCount*]
為 之後,InputTensor內的實際輸入維度數目。 例如,假設InputTensor.Sizes = {1,1,4,6}
和 InputDimensionCount
= 3,實際的有意義索引為 {1,4,6}
。
IndicesDimensionCount
類型: UINT
忽略任何不相關的前置索引維度,範圍為 [1,IndexesTensor.DimensionCount] 之後,在 IndexesTensor內的實際索引維度數目。 例如,假設IndexesTensor.Sizes = {1,1,4,6}
和IndexesDimensionCount = 3,實際的有意義索引為 {1,4,6}
。
BatchDimensionCount
類型: UINT
每個張量內的維度數目 (InputTensor、 IndexesTensor、 OutputTensor) 視為獨立批次,範圍介於 [0、 InputTensor.DimensionCount) 和 [0、 IndexesTensor.DimensionCount) 內。 批次計數可以是 0,表示單一批次。 例如,假設IndexesTensor.Sizes = {1,3,4,5,6,7}
和IndexesDimensionCount = 5 和 BatchDimensionCount
= 2,會有批次 {3,4}
和有意義的索引 {5,6,7}
。
備註
DML_GATHER_ND1_OPERATOR_DESC新增BatchDimensionCount,而且相當於BatchDimensionCount = 0 時DML_GATHER_ND_OPERATOR_DESC。
範例
範例 1. 1D 重新對應
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]]
範例 2. 2D 重新對應批次計數
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]]
]]
可用性
這個運算子是在 中 DML_FEATURE_LEVEL_3_0
引進的。
Tensor 條件約束
- IndexesTensor、 InputTensor和 OutputTensor 必須具有相同的 DimensionCount。
- InputTensor 和 OutputTensor 必須具有相同 的 DataType。
Tensor 支援
DML_FEATURE_LEVEL_4_1和更新版本
張 | 種類 | 支援的維度計數 | 支援的資料類型 |
---|---|---|---|
InputTensor | 輸入 | 1 到 8 | FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8 |
IndicesTensor | 輸入 | 1 到 8 | INT64、INT32、UINT64、UINT32 |
OutputTensor | 輸出 | 1 到 8 | FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8 |
DML_FEATURE_LEVEL_3_0和更新版本
張 | 種類 | 支援的維度計數 | 支援的資料類型 |
---|---|---|---|
InputTensor | 輸入 | 1 到 8 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
IndicesTensor | 輸入 | 1 到 8 | INT64、INT32、UINT64、UINT32 |
OutputTensor | 輸出 | 1 到 8 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
需求
最低支援的用戶端 | Windows 10組建 20348 |
最低支援的伺服器 | Windows 10組建 20348 |
標頭 | directml.h |