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*
インデックスを含むテンソル。 このテン ソルの DimensionCount は InputTensor.DimensionCount と一致する必要があります。
以降では、このテンソルで DML_FEATURE_LEVEL_3_0
符号付き整数型を使用する場合、この演算子は負のインデックス値をサポートします。 負のインデックスは、軸ディメンションの終点を基準として解釈されます。 たとえば、-1 のインデックスは、そのディメンションに沿った最後の要素を参照します。
無効なインデックスでは正しくない出力が生成されますが、エラーは発生せず、すべての読み取りは入力テンソルのメモリ内で安全にクランプされます。
OutputTensor
型: const DML_TENSOR_DESC*
結果を書き込むテンソル。 このテン ソルの DimensionCount と DataType は 、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 がオーバーフローするように 、ディメンションが右揃えになります。
このテンソルの関連ディメンションの数は、IndexDimensions と InputTensor の元のランクによって異なります。 元のランクは、先頭に 1 つを含むパディングの前のディメンションの数です。 出力内の関連するディメンションの数は、InputTensor + IndexDimensions - 1 の元のランクによって計算できます。 この値は、OutputTensor の DimensionCount 以下である必要があります。
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
導入されました。
テンソル制約
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 |
要件
Header | directml.h |