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