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


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

Собирает элементы из входного тензора вдоль оси, используя ИндексыTensor для повторного сопоставления индексов. Этот оператор выполняет следующий псевдокод, где "..." представляет последовательность координат, при этом точное поведение определяется числом измерений оси и индексов:

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. Исходный ранг — это количество измерений до любого заполнения с начальными. Число соответствующих измерений в выходных данных можно вычислить по исходному рангуInputTensor + IndexDimensions — 1. Это значение должно быть меньше или равно dimensionCountэлемента OutputTensor.

Axis

Тип: UINT

Измерение оси объекта InputTensor для сбора в диапазоне [0, *InputTensor.DimensionCount*)от .

IndexDimensions

Тип: UINT

Число фактических измерений индекса в после IndicesTensor игнорирования любых нерелевантных измерений в начале в диапазоне [0, IndicesTensor.DimensionCount). Например, при значении IndicesTensor.Sizes = { 1, 1, 4, 6 } и IndexDimensions = 3 фактические значимые индексы — .{ 1, 4, 6 }

Примеры

Пример 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. Объемные выходные данные, 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.

Поддержка тензоров

DML_FEATURE_LEVEL_4_1 и выше

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

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

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

Тензор Kind Поддерживаемые счетчики измерений Поддерживаемые типы данных
InputTensor Входные данные 4 FLOAT32, FLOAT16
IndicesTensor Входные данные 4 UINT32
OutputTensor Выходные данные 4 FLOAT32, FLOAT16

Требования

   
Верхняя часть directml.h