directml.h) (DML_SCATTER_OPERATOR_DESC 结构
将整个输入张量复制到输出,然后使用更新张量中的相应值覆盖所选索引。 此运算符执行以下伪代码。
output = input
output[index[i, j, k, ...], j, k, ...] = updates[i, j, k, ...] // if axis == 0
output[i, index[i, j, k, ...], k, ...] = updates[i, j, k, ...] // if axis == 1
output[i, j, index[i, j, k, ...], ...] = updates[i, j, k, ...] // if axis == 2
...
如果两个输出元素索引重叠 (这) 无效,则无法保证最后一次写入中胜出。
DML_SCATTER_OPERATOR_DESC 是 DML_GATHER_OPERATOR_DESC的反函数。
语法
struct DML_SCATTER_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *UpdatesTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT Axis;
};
成员
InputTensor
类型: const DML_TENSOR_DESC*
要从中读取的张量。
IndicesTensor
类型: const DML_TENSOR_DESC*
包含输出张量中的索引的张量。 对于除轴以外的每个维度,Size 必须与 InputTensor.Sizes 匹配。
从 DML_FEATURE_LEVEL_3_0
开始,将此张量一起使用带符号整数类型时,此运算符支持负索引值。 负索引被解释为相对于轴维度的末尾。 例如,索引为 -1 表示沿该维度的最后一个元素。
UpdatesTensor
类型: const DML_TENSOR_DESC*
包含新值的张量,用于替换相应索引处的现有输入值。 此张量 的大小 必须与 IndicesTensor.Sizes 匹配。 DataType 必须与 InputTensor.DataType 匹配。
OutputTensor
类型: const DML_TENSOR_DESC*
将结果写入到的张量。 此张量 的大小 和 数据类型 必须与 InputTensor 匹配。
Axis
类型: UINT
在 OutputTensor 中用于索引的轴维度,范围为 [0, OutputTensor.DimensionCount)
。
示例
示例 1。 1D 散点图
Axis: 0
InputTensor: (Sizes:{5}, DataType:FLOAT32)
[0,1,2,3,4]
IndicesTensor: (Sizes:{4}, DataType:UINT32)
[3,1,3,0]
UpdatesTensor: (Sizes:{4}, DataType:FLOAT32)
[5,6,7,8]
// output = input
// output[indices[x]] = updates[x]
OutputTensor: (Sizes:{5}, DataType:FLOAT32)
[8,6,2,7,4]
示例 2。 2D 散点图
Axis: 0
InputTensor: (Sizes:{2,3}, DataType:FLOAT32)
[[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0],
[0.0, 0.0, 0.0]]
IndicesTensor: (Sizes:{2,3}, DataType:UINT32)
[[1, 0, 2],
[0, 2, 1]]
UpdatesTensor: (Sizes:{2,3}, DataType:FLOAT32)
[[10, 11, 12],
[20, 21, 22]]
// output = input
// output[indices[y, x], x] = updates[y, x]
OutputTensor: (Sizes:{3,3}, DataType:FLOAT32)
[[20, 11, 0],
[10, 0, 22],
[ 0, 21, 12]]
备注
DML_SCATTER_OPERATOR_DESC 已更正确地别名为名称 DML_SCATTER_ELEMENTS_OPERATOR_DESC 作为 DML_GATHER_ELEMENTS_OPERATOR_DESC的对应名称。 这是因为 DML_SCATTER_OPERATOR_DESC 与 DML_GATHER_OPERATOR_DESC并不真正对称。
可用性
此运算符是在 中 DML_FEATURE_LEVEL_1_0
引入的。
张量约束
- IndexesTensor、 InputTensor、 OutputTensor 和 UpdatesTensor 必须具有相同的 DimensionCount。
- InputTensor、 OutputTensor 和 UpdatesTensor 必须具有相同 的数据类型。
张量支持
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 |
UpdatesTensor | 输入 | 1 到 8 | FLOAT64、FLOAT32、FLOAT16、INT64、INT32、INT16、INT8、UINT64、UINT32、UINT16、UINT8 |
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 |
UpdatesTensor | 输入 | 1 到 8 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
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 |
UpdatesTensor | 输入 | 4 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
OutputTensor | 输出 | 4 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
DML_FEATURE_LEVEL_1_0 及更高版本
张 | 种类 | 支持的维度计数 | 支持的数据类型 |
---|---|---|---|
InputTensor | 输入 | 4 | FLOAT32、FLOAT16 |
IndicesTensor | 输入 | 4 | UINT32 |
UpdatesTensor | 输入 | 4 | FLOAT32、FLOAT16 |
OutputTensor | 输出 | 4 | FLOAT32、FLOAT16 |
要求
最低受支持的客户端 | Windows 10,版本 2004 (10.0;内部版本 19041) |
最低受支持的服务器 | Windows Server 版本 2004 (10.0;内部版本 19041) |
标头 | directml.h |