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


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

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

output[batch, ...] = input[batch, indices[batch, ...], ...]

Синтаксис

struct DML_GATHER_ND1_OPERATOR_DESC {
  const DML_TENSOR_DESC *InputTensor;
  const DML_TENSOR_DESC *IndicesTensor;
  const DML_TENSOR_DESC *OutputTensor;
  UINT                  InputDimensionCount;
  UINT                  IndicesDimensionCount;
  UINT                  BatchDimensionCount;
};

Члены

InputTensor

Тип: const DML_TENSOR_DESC*

Тензор для чтения.

IndicesTensor

Тип: const DML_TENSOR_DESC*

Тензор, содержащий индексы. DimensionCount этого тензора должен соответствовать InputTensor.DimensionCount. Последнее измерение элемента IndexsTensor фактически является числом координат на кортеж индекса и не может превышать InputTensor.DimensionCount. Например, тензор индексов размеров{1,4,5,2} с IndexsDimensionCount = 3 означает массив 4x5 из 2-координатных кортежей, которые индексируются в InputTensor.

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

OutputTensor

Тип: const DML_TENSOR_DESC*

Тензор, в который записываются результаты. DimensionCount и DataType этого тензора должны совпадать с InputTensor.DimensionCount. Ожидаемые выходные значения OutputTensor.Sizes представляют собой объединение начальных сегментов IndicesTensor.Sizes и завершающего сегмента InputTensor.Sizes , что приводит к следующему результату.

indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
OutputTensor.Sizes = {
    1...,
    IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
    InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
}

Измерения выравниваются по правому краю, и при необходимости в начале добавляется 1 значение, чтобы удовлетворить требования OutputTensor.DimensionCount.

Пример приведен ниже.

InputTensor.Sizes = {3,4,5,6,7}
InputDimensionCount = 5
IndicesTensor.Sizes = {1,1, 1,2,3}
IndicesDimensionCount = 3 // can be thought of as a {1,2} array of 3-coordinate tuples

// The {1,2} comes from the indices tensor (ignoring last dimension which is the tuple size),
// and the {6,7} comes from input tensor, ignoring the first 3 dimensions
// since the index tuples are 3 elements (from the indices tensor last dimension).
OutputTensor.Sizes = {1, 1,2,6,7}

InputDimensionCount

Тип: UINT

Количество фактических входных измерений в inputTensor после игнорирования любых нерелевантных исходных измерений в диапазоне [1, *InputTensor.DimensionCount*]. Например, при входе InputTensor.Sizes = {1,1,4,6} и InputDimensionCount = 3 фактические значимые индексы являются {1,4,6}.

IndicesDimensionCount

Тип: UINT

Количество фактических измерений индекса в indexsTensor после игнорирования любых нерелевантных ведущих измерений в диапазоне [1, IndexsTensor.DimensionCount]. Например, учитывая ИндексыTensor.Sizes = {1,1,4,6} и ИндексыDimensionCount = 3, фактически значимые индексы являются {1,4,6}.

BatchDimensionCount

Тип: UINT

Количество измерений в каждом тензоре (InputTensor, IndicesTensor, OutputTensor), которые считаются независимыми пакетами в пределах [0, InputTensor.DimensionCount) и [0, IndicesTensor.DimensionCount). Число пакетов может быть 0, что означает один пакет. Например, учитывая ИндексыTensor.Sizes = {1,3,4,5,6,7} и ИндексыDimensionCount = 5 и BatchDimensionCount = 2, существуют пакеты {3,4} и значимые индексы {5,6,7}.

Комментарии

DML_GATHER_ND1_OPERATOR_DESC добавляет BatchDimensionCount и эквивалентен DML_GATHER_ND_OPERATOR_DESC , если BatchDimensionCount = 0.

Примеры

Пример 1. Переназначение 1D

InputDimensionCount: 2
IndicesDimensionCount: 2
BatchDimensionCount: 0

InputTensor: (Sizes:{2,2}, DataType:FLOAT32)
    [[0,1],[2,3]]

IndicesTensor: (Sizes:{2,1}, DataType:UINT32)
    [[1],[0]]

// output[y, x] = input[indices[y], x]
OutputTensor: (Sizes:{2,2}, DataType:FLOAT32)
    [[2,3],[0,1]]

Пример 2. Двухd переназначение с количеством пакетов

InputDimensionCount: 3
IndicesDimensionCount: 3
BatchDimensionCount: 1

// 3 batches.
InputTensor: (Sizes:{1, 3,2,2}, DataType:FLOAT32)
    [
        [[[0,1],[2,3]],   // batch 0
         [[4,5],[6,7]],   // batch 1
         [[8,9],[10,11]]] // batch 2
    ]

// A 3x2 array of 2D tuples indexing into InputTensor.
// e.g. a tuple of <1,0> in batch 1 corresponds to input value 6.
IndicesTensor: (Sizes:{1, 3,2,2}, DataType:UINT32)
    [
        [[[0,0],[1,1]],
         [[1,1],[0,0]],
         [[0,1],[1,0]]]
    ]

// output[batch, x] = input[batch, indices[batch, x, 0], indices[batch, x, 1]]
OutputTensor: (Sizes:{1,1, 3,2}, DataType:FLOAT32)
    [[
        [[0,3],
         [7,4],
         [9,10]]
    ]]

Доступность

Этот оператор появился в DML_FEATURE_LEVEL_3_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

Требования

   
Минимальная версия клиента Сборка Windows 10 20348
Минимальная версия сервера Сборка Windows 10 20348
Верхняя часть directml.h