структура DML_RANDOM_GENERATOR_OPERATOR_DESC (directml.h)
Заполняет выходной тензор детерминированными псевдослучайными, равномерно распределенными битами. При необходимости этот оператор также может выводить обновленное состояние внутреннего генератора, которое можно использовать во время последующих выполнений оператора.
Этот оператор является детерминированным и ведет себя так, как если бы он был чистой функцией, то есть его выполнение не создает побочных эффектов и не использует глобальное состояние. Псевдослучайные выходные данные, создаваемые этим оператором, зависят исключительно от значений , предоставленных в InputStateTensor.
Генераторы, реализованные этим оператором, не являются криптографически безопасными; Поэтому этот оператор не следует использовать для шифрования, создания ключей или других приложений, которым требуется криптографически безопасное создание случайных чисел.
Синтаксис
struct DML_RANDOM_GENERATOR_OPERATOR_DESC {
const DML_TENSOR_DESC *InputStateTensor;
const DML_TENSOR_DESC *OutputTensor;
const DML_TENSOR_DESC *OutputStateTensor;
DML_RANDOM_GENERATOR_TYPE Type;
};
Члены
InputStateTensor
Тип: const DML_TENSOR_DESC*
Входной тензор, содержащий внутреннее состояние генератора. Размер и формат этого входного тензора зависит от DML_RANDOM_GENERATOR_TYPE.
Для DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10 этот тензор должен иметь тип UINT32 и иметь размеры {1,1,1,6}
. Первые четыре 32-разрядных значения содержат монотонно увеличивающееся 128-разрядное значение счетчика. Последние два 32-разрядных значения содержат 64-разрядное значение ключа для генератора.
Element 0 1 2 3 4 5
(32-bits each) |-------|-------|-------|-------|-------|-------|
<--------128-bit counter------> <-64-bit key-->
При первой инициализации входного состояния генератора обычно 128-разрядный счетчик (первые четыре 32-разрядных значения UINT32) следует инициализировать 0. Ключ можно выбрать произвольно; значения разных ключей создают разные последовательности чисел. Значение ключа обычно создается с помощью начального значения, предоставленного пользователем.
OutputTensor
Тип: const DML_TENSOR_DESC*
Выходной тензор, содержащий полученные псевдослучайные значения. Этот тензор может иметь любой размер.
OutputStateTensor
Тип: _Maybenull_ const DML_TENSOR_DESC*
Необязательный выходной тензор THAT содержит обновленное внутреннее состояние генератора. Если он указан, этот оператор использует InputStateTensor для вычисления соответствующего обновленного состояния генератора и записывает результат в OutputStateTensor. Как правило, вызывающие стороны сохраняют этот результат и предоставляют его в качестве входного состояния при последующем выполнении этого оператора.
Type
Тип: DML_RANDOM_GENERATOR_TYPE
Одно из значений из перечисления DML_RANDOM_GENERATOR_TYPE , указывающее тип используемого генератора. В настоящее время единственным допустимым значением является DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, который создает псевдослучайные числа в соответствии с алгоритмом Philox 4x32-10.
Комментарии
При каждом выполнении этого оператора 128-разрядный счетчик должен увеличиваться. Если указан OutputStateTensor , то этот оператор увеличивает счетчик с правильным значением от вашего имени и записывает результат в OutputStateTensor. Величина, на которую она должна увеличиваться, зависит от количества созданных 32-разрядных выходных элементов и типа генератора.
Для DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10 128-разрядный счетчик должен увеличиваться ceil(outputSize / 4)
на при каждом выполнении, где outputSize
— количество элементов в OutputTensor.
Рассмотрим пример, в котором значение 128-разрядного счетчика в настоящее 0x48656c6c'6f46726f'6d536561'74746c65
время равно , а размер OutputTensor — {3,3,20,7219}
. После выполнения этого оператора один раз значение счетчика должно быть увеличено на 324 855 (количество созданных выходных элементов, разделенных на 4, округленное вверх), что приведет к значению счетчика 0x48656c6c'6f46726f'6d536561'746f776e
. Это обновленное значение должно быть предоставлено в качестве входных данных для следующего выполнения этого оператора.
Доступность
Этот оператор появился в DML_FEATURE_LEVEL_3_0
.
Ограничения тензоров
InputStateTensor и OutputStateTensor должны иметь одинаковые значения DimensionCount и Sizes.
Поддержка тензоров
DML_FEATURE_LEVEL_4_0 и выше
Тензор | Kind | Измерения | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|---|
InputStateTensor | Входные данные | { [1], [1], [1], [1], [1], [1], [1], 6 } | От 1 до 8 | UINT32 |
OutputTensor | Выходные данные | { [D0], [D1], [D2], [D3], [D4], [D5], [D6], D7 } | От 1 до 8 | UINT32 |
OutputStateTensor | Необязательные выходные данные | { [1], [1], [1], [1], [1], [1], [1], 6 } | От 1 до 8 | UINT32 |
DML_FEATURE_LEVEL_3_0 и выше
Тензор | Kind | Измерения | Поддерживаемые счетчики измерений | Поддерживаемые типы данных |
---|---|---|---|---|
InputStateTensor | Входные данные | { 1, 1, 1, 6 } | 4 | UINT32 |
OutputTensor | Выходные данные | { D0, D1, D2, D3 } | 4 | UINT32 |
OutputStateTensor | Необязательные выходные данные | { 1, 1, 1, 6 } | 4 | UINT32 |
Требования
Минимальная версия клиента | Сборка Windows 10 20348 |
Минимальная версия сервера | Сборка Windows 10 20348 |
Верхняя часть | directml.h |