次の方法で共有


DML_GATHER_OPERATOR_DESC構造体 (directml.h)

入力テンソルから Axis に沿って要素を収集します。インデックスを再マップするには 、インデックスのインデックスを再 マッピングします。 この演算子は、次の擬似コード ("...") を実行します。は一連の座標を表し、軸とインデックスのディメンション数によって正確な動作が決定されます。

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*

インデックスを含むテンソル。 このテン ソルの DimensionCountInputTensor.DimensionCount と一致する必要があります。

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

無効なインデックスでは正しくない出力が生成されますが、エラーは発生せず、すべての読み取りは入力テンソルのメモリ内で安全にクランプされます。

OutputTensor

型: const DML_TENSOR_DESC*

結果を書き込むテンソル。 このテン ソルの DimensionCountDataType、InputTensor.DimensionCount と一致する必要があります。 想定される OutputTensor.Sizes は、現在ので分割された InputTensor.Sizes の先頭と末尾のセグメントを連結し、その間に挿入されたインデックスTensor.Sizes です

OutputTensor.Sizes = {
    InputTensor.Sizes[0..Axis],
    IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndexDimensions) .. IndicesTensor.DimensionCount],
    InputTensor.Sizes[(Axis+1) .. InputTensor.DimensionCount]
}

入力サイズの先頭の 1 つの値がトリミングされ、それ以外の場合は出力 DimensionCount がオーバーフローするように 、ディメンションが右揃えになります。

このテンソルの関連ディメンションの数は、IndexDimensionsInputTensor元のランクによって異なります。 元のランクは、先頭に 1 つを含むパディングの前のディメンションの数です。 出力内の関連するディメンションの数は、InputTensor + IndexDimensions - 1 の元のランクによって計算できます。 この値は、OutputTensorDimensionCount 以下である必要があります。

Axis

型: UINT

収集する InputTensor の軸の寸法 。範囲 [0, *InputTensor.DimensionCount*)は です。

IndexDimensions

型: UINT

[0, IndicesTensor.DimensionCount) の範囲の無関係な先行ディメンションを無視した後の 内IndicesTensorの実際のインデックス ディメンションの数。 たとえば、 と = 3 を指定IndicesTensor.Sizes = { 1, 1, 4, 6 }すると、実際に意味のあるインデックスは になります{ 1, 4, 6 }IndexDimensions

例 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導入されました。

テンソル制約

  • IndicesTensorInputTensorおよび OutputTensor には、同じ 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

DML_FEATURE_LEVEL_1_0以上

テンソル 種類 サポートされているディメンション数 サポートされるデータ型
InputTensor 入力 4 FLOAT32、FLOAT16
IndicesTensor 入力 4 UINT32
OutputTensor 出力 4 FLOAT32、FLOAT16

要件

   
Header directml.h