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