次の方法で共有


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*

インデックスを含むテンソル。 このテン ソルの DimensionCount、InputTensor.DimensionCount と一致する必要があります。 IndexsTensor の最後のディメンションは、実際にはインデックス タプルあたりの座標数であり、InputTensor.DimensionCount を超えることはできません。 たとえば、IndexsDimensionCount = 3 のサイズ{1,4,5,2}のインデックス テンソルは、InputTensor にインデックスを付ける 2 座標タプルの 4x5 配列を意味します。

以降では、このテンソルで DML_FEATURE_LEVEL_3_0符号付き整数型を使用する場合、この演算子は負のインデックス値をサポートします。 負のインデックスは、それぞれのディメンションの末尾を基準として解釈されます。 たとえば、-1 のインデックスは、そのディメンションに沿った最後の要素を参照します。

OutputTensor

型: const DML_TENSOR_DESC*

結果を書き込むテンソル。 このテン ソルの DimensionCountDataType、InputTensor.DimensionCount と一致する必要があります。 想定される OutputTensor.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, IndexsTensor.DimensionCount ] の範囲の、無関係な先行ディメンションを無視した後の IndexsTensor 内の実際のインデックス ディメンションの数。 たとえば、 IndexsTensor.Sizes = {1,1,4,6}IndexsDimensionCount = 3 の場合、実際の意味のあるインデックスは です {1,4,6}

BatchDimensionCount

型: UINT

独立したバッチと見なされる各テンソル (InputTensor、IndicesTensorOutputTensor) 内のディメンションの数 。[0,InputTensor.DimensionCount] と [0, IndicesTensor.DimensionCount] の両方の範囲内です。 バッチ数は 0 にすることができ、1 つのバッチを意味します。 たとえば、 IndexsTensor.Sizes = {1,3,4,5,6,7}IndexsDimensionCount = 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導入されました。

テンソル制約

  • インデックスTensorInputTensorおよび OutputTensor は、同じ DimensionCount を持つ必要があります。
  • InputTensorOutputTensorDataType は同じである必要があります。

Tensor のサポート

DML_FEATURE_LEVEL_4_1以上

テンソル 種類 サポートされているディメンション数 サポートされるデータ型
InputTensor 入力 1 から 8 FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8
インデックスTensor 入力 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
インデックスTensor 入力 1 から 8 INT64、INT32、UINT64、UINT32
OutputTensor 出力 1 から 8 FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8

要件

   
サポートされている最小のクライアント Windows 10 ビルド 20348
サポートされている最小のサーバー Windows 10 ビルド 20348
Header directml.h