структура 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 |