directml.h) (DML_SLICE1_OPERATOR_DESC 结构
提取单个子区域 (输入张量 ) 的“切片”。
输入窗口描述切片中要考虑的输入张量边界。 窗口是使用每个维度的三个值定义的。
- 偏移量标记维度中窗口的开头。
- 大小标记维度中窗口的范围。 维度 中窗口的末尾 为
offset + size - 1
。 - 步幅指示如何遍历维度中的元素。
- 步幅的大小指示在窗口中复制时要前进的元素数。
- 如果步幅为正数,则从维度中窗口 的开头 开始复制元素。
- 如果步幅为负数,则从维度的窗口 末尾 开始复制元素。
以下伪代码演示了如何使用输入窗口复制元素。 请注意如何以正步幅从头到尾复制维度中的元素,以及如何以负步幅从一端复制到一开始。
CopyStart = InputWindowOffsets
for dimension i in [0, DimensionCount - 1]:
if InputWindowStrides[i] < 0:
CopyStart[i] += InputWindowSizes[i] - 1 // start at the end of the window in this dimension
OutputTensor[OutputCoordinates] = InputTensor[CopyStart + InputWindowStrides * OutputCoordinates]
输入窗口在任何维度中都不得为空,并且该窗口不得超出输入张量的尺寸, (不允许) 边界外读取。 窗口的大小和步幅有效地限制了可能从输入张量的每个维度 i
复制的元素数。
MaxCopiedElements[i] = 1 + (InputWindowSize[i] - 1) / InputWindowStrides[i]
复制窗口中的所有可访问元素不需要输出张量。 切片只要 有效 1 <= OutputSizes[i] <= MaxCopiedElements[i]
。
语法
struct DML_SLICE1_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *OutputTensor;
UINT DimensionCount;
const UINT *InputWindowOffsets;
const UINT *InputWindowSizes;
const INT *InputWindowStrides;
};
成员
InputTensor
类型: const DML_TENSOR_DESC*
要从中提取切片的张量。
OutputTensor
类型: const DML_TENSOR_DESC*
要向其写入切片数据结果的张量。
DimensionCount
类型: UINT
维度数。 此字段确定 InputWindowOffsets、 InputWindowSizes 和 InputWindowStrides 数组的大小。 此值必须与输入和输出张量的 DimensionCount 匹配。 此值必须介于 1 和 8 之间,包括从 DML_FEATURE_LEVEL_3_0
开始;早期功能级别需要值 4 或 5。
InputWindowOffsets
类型:_Field_size_ (DimensionCount) const UINT*
一个数组,其中包含每个维度中输入窗口) 元素中的起始 (。 数组中的值必须满足约束 InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowSizes
类型:_Field_size_ (DimensionCount) const UINT*
一个数组,其中包含每个维度中输入窗口) 元素中的范围 (。 数组中的值必须满足约束 InputWindowOffsets[i] + InputWindowSizes[i] <= InputTensor.Sizes[i]
InputWindowStrides
类型:_Field_size_ (DimensionCount) const UINT*
一个数组,其中包含切片沿输入张量的每个维度(以 元素为单位)的步幅。 步幅的大小指示在输入窗口中复制时要前进的元素数。 步幅的符号确定从窗口开头开始复制元素 (正步幅) 还是窗口末尾 (负步幅) 。 步幅不能为 0。
示例
以下示例使用此相同的输入张量。
InputTensor: (Sizes:{1, 1, 4, 4}, DataType:FLOAT32)
[[[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 9, 10, 11, 12],
[13, 14, 15, 16]]]]
示例 1。 具有正步幅的跨距切片
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, 2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[ 2, 4],
[10, 12]]]]
复制的元素的计算方式如下。
Output[0,0,0,0] = {0,0,0,1} + {1,1,2,2} * {0,0,0,0} = Input[{0,0,0,1}] = 2
Output[0,0,0,1] = {0,0,0,1} + {1,1,2,2} * {0,0,0,1} = Input[{0,0,0,3}] = 4
Output[0,0,1,0] = {0,0,0,1} + {1,1,2,2} * {0,0,1,0} = Input[{0,0,2,1}] = 10
Output[0,0,1,1] = {0,0,0,1} + {1,1,2,2} * {0,0,1,1} = Input[{0,0,2,3}] = 12
示例 2。 具有负步幅的跨距切片
InputWindowOffsets = {0, 0, 0, 1}
InputWindowSizes = {1, 1, 4, 3}
InputWindowStrides = {1, 1, -2, 2}
OutputTensor: (Sizes:{1, 1, 2, 2}, DataType:FLOAT32)
[[[[14, 16],
[ 6, 8]]]]
回想一下,具有负窗口步幅的维度在输入窗口的末尾开始复制该维度;这是通过将 添加到 InputWindowSize[i] - 1
窗口偏移量来完成的。 具有正步幅的维度仅从 InputWindowOffset[i]
开始。
- 0 轴 (
+1
窗口步幅) 开始复制 。InputWindowOffsets[0] = 0
- 1 轴 (
+1
窗口步幅) 开始复制。InputWindowOffsets[1] = 0
- 轴 2 (
-2
窗口步幅) 开始复制 。InputWindowOffsets[2] + InputWindowSizes[0] - 1 = 0 + 4 - 1 = 3
- 3 轴 (
+2
窗口步幅) 开始复制 。InputWindowOffsets[3] = 1
复制的元素的计算方式如下。
Output[0,0,0,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,0} = Input[{0,0,3,1}] = 14
Output[0,0,0,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,0,1} = Input[{0,0,3,3}] = 16
Output[0,0,1,0] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,0} = Input[{0,0,1,1}] = 6
Output[0,0,1,1] = {0,0,3,1} + {1,1,-2,2} * {0,0,1,1} = Input[{0,0,1,3}] = 8
注解
此运算符类似于 DML_SLICE_OPERATOR_DESC,但它在两个重要方面有所不同。
- 切片步幅可以为负数,这允许沿维度反转值。
- 输入窗口大小不一定与输出张量大小相同。
可用性
此运算符是在 中 DML_FEATURE_LEVEL_2_1
引入的。
张量约束
InputTensor 和 OutputTensor 必须具有相同的 DataType 和 DimensionCount。
张量支持
DML_FEATURE_LEVEL_4_1 及更高版本
张 | 种类 | 支持的维度计数 | 支持的数据类型 |
---|---|---|---|
InputTensor | 输入 | 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 |
OutputTensor | 输出 | 1 到 8 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
DML_FEATURE_LEVEL_2_1 及更高版本
张 | 种类 | 支持的维度计数 | 支持的数据类型 |
---|---|---|---|
InputTensor | 输入 | 4 到 5 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
OutputTensor | 输出 | 4 到 5 | FLOAT32、FLOAT16、INT32、INT16、INT8、UINT32、UINT16、UINT8 |
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows 10内部版本 20348 |
最低受支持的服务器 | Windows 10内部版本 20348 |
标头 | directml.h |