Поделиться через


структура DML_SLICE1_OPERATOR_DESC (directml.h)

Извлекает один регион ("срез") входного тензора.

Окно ввода описывает границы входного тензора, который следует учитывать в срезе. Окно определяется с помощью трех значений для каждого измерения.

  • Смещение помечает начало окна в измерении.
  • Размер помечает экстент окна в измерении. Конец окна в измерении — 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 и выше

Тензор Kind Поддерживаемые счетчики измерений Поддерживаемые типы данных
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 и выше

Тензор Kind Поддерживаемые счетчики измерений Поддерживаемые типы данных
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 и выше

Тензор Kind Поддерживаемые счетчики измерений Поддерживаемые типы данных
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