структура DML_SCATTER_ND_OPERATOR_DESC (directml.h)
Копирует весь входной тензор в выходные данные, а затем перезаписывает выбранные индексы соответствующими значениями из тензора обновлений. Этот оператор выполняет следующий псевдокод, где "..." представляет последовательность координат, точное поведение определяется осью и размером индексов.
output = input
output[indices[...]] = updates[...]
Если два индекса выходных элементов перекрываются (что недопустимо), нет никакой гарантии, какая последняя запись победит.
Синтаксис
struct DML_SCATTER_ND_OPERATOR_DESC {
const DML_TENSOR_DESC *InputTensor;
const DML_TENSOR_DESC *IndicesTensor;
const DML_TENSOR_DESC *UpdatesTensor;
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 двухзначных кортежей координат, которые индексируются в InputTensor.
Начиная с DML_FEATURE_LEVEL_3_0
, этот оператор поддерживает отрицательные значения индекса при использовании целочисленного типа со знаком с этим тензором. Отрицательные индексы интерпретируются как относительные к концу соответствующего измерения. Например, индекс -1 относится к последнему элементу в этом измерении.
UpdatesTensor
Тип: const DML_TENSOR_DESC*
Тензор, содержащий новые значения для замены существующих входных значений в соответствующих индексах. DimensionCount этого тензора должен соответствовать InputTensor.DimensionCount. Ожидаемые значения UpdatesTensor.Sizes представляют собой объединение начальных сегментов IndicesTensor.Sizes и завершающего сегмента InputTensor.Sizes для получения следующих результатов.
indexTupleSize = IndicesTensor.Sizes[IndicesTensor.DimensionCount - 1]
UpdatesTensor.Sizes = [
1...,
IndicesTensor.Sizes[(IndicesTensor.DimensionCount - IndicesDimensionCount) .. (IndicesTensor.DimensionCount - 1)],
InputTensor.Sizes[(InputTensor.DimensionCount - indexTupleSize) .. InputTensor.DimensionCount]
]
Измерения выравниваются по правому краю, а в начале добавляется 1 значение, если это необходимо для соответствия UpdatesTensor.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).
UpdatesTensor.Sizes = [1, 1,2,6,7]
OutputTensor
Тип: const DML_TENSOR_DESC*
Тензор для записи результатов. Значения Sizes и DataType этого тензора должны совпадать с InputTensor.Sizes.
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} и IndicesDimensionCount = 3, фактические значимые индексы являются {1,4,6}.
Примеры
InputTensor: (Sizes:{8}, DataType:FLOAT32)
[1, 2, 3, 4, 5, 6, 7, 8]
IndicesTensor: (Sizes:{4,1}, DataType:FLOAT32)
[[4], [3], [1], [7]]
UpdatesTensor: (Sizes:{4}, DataType:FLOAT32)
[9, 10, 11, 12]
// output = input
// output[indices[x, 0]] = updates[x]
OutputTensor: (Sizes:{8}, DataType:FLOAT32)
[1, 11, 3, 10, 9, 6, 7, 12]
Доступность
Этот оператор появился в DML_FEATURE_LEVEL_2_1
.
Ограничения тензоров
- ИндексыTensor, InputTensor, OutputTensor и UpdatesTensor должны иметь один и тот же DimensionCount.
- InputTensor, OutputTensor и UpdatesTensor должны иметь один и тот же тип 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 |
UpdatesTensor | Входные данные | От 1 до 8 | FLOAT64, FLOAT32, FLOAT16, INT64, INT32, INT16, INT8, UINT64, UINT32, UINT16, UINT8 |
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 |
UpdatesTensor | Входные данные | От 1 до 8 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
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 |
UpdatesTensor | Входные данные | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
OutputTensor | Выходные данные | 4 | FLOAT32, FLOAT16, INT32, INT16, INT8, UINT32, UINT16, UINT8 |
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | сборка Windows 10 20348 |
Минимальная версия сервера | сборка Windows 10 20348 |
Верхняя часть | directml.h |