DML_GATHER_OPERATOR_DESC結構 (directml.h)
使用 IndicesTensor 從座標軸上的輸入張量收集元素,以重新對應索引。 此運算符會執行下列虛擬程序代碼,其中 “...”代表一系列座標,其確切行為取決於座標軸和索引維度計數:
output[...] = input[..., indices[...], ...]
語法
struct DML_GATHER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
UINT IndexDimensions;
};
成員
InputTensor
類型: const DML_TENSOR_DESC*
要從中讀取的張量。
IndicesTensor
類型: const DML_TENSOR_DESC*
包含索引的張量。 此張量的 DimensionCount 必須符合 InputTensor.DimensionCount。
從 DML_FEATURE_LEVEL_3_0
開始,當搭配這個張量使用帶正負號整數型別時,這個運算元支援負數索引值。 負數索引會解譯為相對於座標軸維度結尾。 例如,-1 的索引會參考該維度的最後一個專案。
無效的索引會產生不正確的輸出,但不會發生失敗,而且所有讀取都會安全地固定在輸入張量記憶體中。
OutputTensor
類型: const DML_TENSOR_DESC*
要寫入結果的張量。 此 Tensor 的 DimensionCount 和 DataType 必須符合 InputTensor.DimensionCount。 預期的 OutputTensor.Sizes 是 InputTensor.Sizes 的串連,其開頭和尾端區段會分割在目前 軸 上,並在兩者之間插入 IndicesTensor.Sizes 。
OutputTensor.Sizes = {
InputTensor.Sizes[0..Axis],
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}
維度靠右對齊,因此會裁剪輸入大小中的任何前置 1 個值,否則會溢位輸出 DimensionCount。
這個張量中的相關維度數目取決於 IndexDimensions 和 InputTensor的原始排名。 原始排名是任何以前置間距填補之前的維度數目。 輸出中相關維度的數目可以透過 InputTensor + IndexDimensions - 1 的原始排名來計算。 此值必須小於或等於 OutputTensor 的 DimensionCount。
Axis
類型: UINT
要收集的 InputTensor 軸維度,範圍為 [0, *InputTensor.DimensionCount*)
。
IndexDimensions
類型: UINT
忽略任何不相關的前置索引維度之後的實際索引維度 IndicesTensor
數目,範圍為 [0, IndicesTensor.DimensionCount
) 。 例如,假設 IndicesTensor.Sizes
= { 1, 1, 4, 6 }
和 IndexDimensions
= 3,實際的有意義索引為 。{ 1, 4, 6 }
範例
範例 1. 1D 重新對應
Axis: 0
IndexDimensions: 1
InputTensor: (Sizes:{4}, DataType:FLOAT32)
[11,12,13,14]
IndicesTensor: (Sizes:{5}, DataType:UINT32)
[3,1,3,0,2]
// output[x] = input[indices[x]]
OutputTensor: (Sizes:{5}, DataType:FLOAT32)
[14,12,14,11,13]
範例 2. 2D 輸出、1D 索引、軸 0、串連數據列
Axis: 0
IndexDimensions: 1
InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
[[1,2], // row 0
[3,4], // row 1
[5,6]] // row 2
IndicesTensor: (Sizes:{1, 4}, DataType:UINT32)
[[0,
1,
1,
2]]
// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{4,2}, DataType:FLOAT32)
[[1,2], // input row 0
[3,4], // input row 1
[3,4], // input row 1
[5,6]] // input row 2
範例 3. 2D,軸 1,交換數據行
Axis: 1
IndexDimensions: 2
InputTensor: (Sizes:{3,2}, DataType:FLOAT32)
[[1,2],
[3,4],
[5,6]]
IndicesTensor: (Sizes:{1, 2}, DataType:UINT32)
[[1,0]]
// output[y, x] = input[y, indices[x]]
OutputTensor: (Sizes:{3,2}, DataType:FLOAT32)
[[2,1],
[4,3],
[6,5]]
範例 4. 2D、軸 1、巢狀索引
Axis: 2
IndexDimensions: 2
InputTensor: (Sizes:{1, 3,3}, DataType:FLOAT32)
[ [[1,2,3],
[4,5,6],
[7,8,9]] ]
IndicesTensor: (Sizes:{1, 1,2}, DataType:UINT32)
[ [[0,2]] ]
// output[z, y, x] = input[z, indices[y, x]]
OutputTensor: (Sizes:{3,1,2}, DataType:FLOAT32)
[[[1,3]],
[[4,6]],
[[7,9]]]
範例 5. 2D、軸 0、巢狀索引
Axis: 1
IndexDimensions: 2
InputTensor: (Sizes:{1, 3,2}, DataType:FLOAT32)
[ [[1,2],
[3,4],
[5,6]] ]
IndicesTensor: (Sizes:{1, 2,2}, DataType:UINT32)
[ [[0,1],
[1,2]] ]
// output[z, y, x] = input[indices[z, y], x]
OutputTensor: (Sizes:{2,2,2}, DataType:FLOAT32)
[[[1,2], [3,4]],
[[3,4], [5,6]]]
可用性
這個運算子是在 中 DML_FEATURE_LEVEL_1_0
引進。
Tensor 條件約束
IndicesTensor
、 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 |
DML_FEATURE_LEVEL_2_1和更新版本
張 | 種類 | 支援的維度計數 | 支援的資料類型 |
---|---|---|---|
InputTensor | 輸入 | 4 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
IndicesTensor | 輸入 | 4 | UINT32 |
OutputTensor | 輸出 | 4 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
DML_FEATURE_LEVEL_1_0和更新版本
張 | 種類 | 支援的維度計數 | 支援的資料類型 |
---|---|---|---|
InputTensor | 輸入 | 4 | FLOAT32、FLOAT16 |
IndicesTensor | 輸入 | 4 | UINT32 |
OutputTensor | 輸出 | 4 | FLOAT32、FLOAT16 |
規格需求
標頭 | directml.h |