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

维度数。 此字段确定 InputWindowOffsetsInputWindowSizesInputWindowStrides 数组的大小。 此值必须与输入和输出张量的 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引入的。

张量约束

InputTensorOutputTensor 必须具有相同的 DataTypeDimensionCount

张量支持

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