共用方式為


DML_GATHER_ND_OPERATOR_DESC結構 (directml.h)

從輸入張量收集元素,使用索引張量將索引重新對應至輸入的整個子區塊。 此運算符會執行下列虛擬程序代碼,其中 “...”表示一系列座標,其確切行為取決於輸入和索引維度計數。

output[...] = input[indices[...]]

語法

struct DML_GATHER_ND_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  InputDimensionCount;
  UINT                  IndicesDimensionCount;
};

成員

InputTensor

類型: const DML_TENSOR_DESC*

要從中讀取的張量。

IndicesTensor

類型: const DML_TENSOR_DESC*

包含索引的張量。 此張量的 DimensionCount 必須符合 InputTensor.DimensionCountIndexesTensor 的最後一個維度實際上是每個索引元組的座標數目,而且不能超過 InputTensor.DimensionCount。 例如,IndexesDimensionCount = 3 的{1,4,5,2}索引張量表示索引為 InputTensor 之 2 座標 Tuple 的 4x5 陣列。

DML_FEATURE_LEVEL_3_0開始,當搭配這個張量使用帶正負號整數型別時,這個運算元支援負數索引值。 負數索引會解譯為相對於個別維度結尾。 例如,-1 的索引會參考該維度的最後一個專案。

OutputTensor

類型: const DML_TENSOR_DESC*

要寫入結果的張量。 此 Tensor 的 DimensionCountDataType 必須符合 InputTensor.DimensionCount。 預期的 OutputTensor.SizesIndexesTensor.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]
}

輸出維度會靠右對齊,並視需要預先加上前置 1 個值來滿足 OutputTensor.DimensionCount

以下為範例。

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,IndicesTensor.DimensionCount] 之後,IndexesTensor 內的實際索引維度數目。 例如,假設 IndexesTensor.Sizes = {1,1,4,6}IndicesDimensionCount = 3,實際的有意義索引為 {1,4,6}

範例

範例 1. 1D 重新對應

InputDimensionCount: 2
IndicesDimensionCount: 2

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: 2

InputTensor: (Sizes:{1, 2,2,2}, DataType:FLOAT32)
    [ [[[0,1],[2,3]],[[4,5],[6,7]]] ]

IndicesTensor: (Sizes:{1,1, 2,2}, DataType:UINT32)
    [[ [[0,1],[1,0]] ]]

// output[y, x] = input[indices[y, 0], indices[y, 1], x]
OutputTensor: (Sizes:{1,1, 2,2}, DataType:FLOAT32)
    [[ [[2,3],[4,5]] ]]

備註

這個運算子 DML_OPERATOR_GATHER_ND1的較新版本是在 中 DML_FEATURE_LEVEL_3_0引進。

可用性

這個運算子是在 中 DML_FEATURE_LEVEL_2_1引進。

Tensor 條件約束

  • IndicesTensorInputTensorOutputTensor 必須具有相同的 DimensionCount
  • InputTensorOutputTensor 必須具有相同 的 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

規格需求

需求
最低支援的用戶端 Windows 10 組建 20348
最低支援的伺服器 Windows 10 組建 20348
標頭 directml.h