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


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

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

output[...] = input[indices[...]]

Синтаксис

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

Члены

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}.

Примеры

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

InputDimensionCount: 2
IndicesDimensionCount: 2

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: 2

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

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

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

Комментарии

В появилась DML_FEATURE_LEVEL_3_0более новая версия этого оператора DML_OPERATOR_GATHER_ND1, .

Доступность

Этот оператор появился в DML_FEATURE_LEVEL_2_1.

Ограничения тензоров

  • Аргументы 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

Требования

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