structure DML_RANDOM_GENERATOR_OPERATOR_DESC (directml.h)
Remplit un tenseur de sortie avec des bits générés de manière déterministe, pseudo-aléatoires et uniformément distribués. Cet opérateur peut également générer un état de générateur interne mis à jour, qui peut être utilisé lors des exécutions ultérieures de l’opérateur.
Cet opérateur est déterministe et se comporte comme s’il s’agissait d’une fonction pure, c’est-à-dire que son exécution ne produit aucun effet secondaire et n’utilise aucun état global. La sortie pseudo-aléatoire produite par cet opérateur dépend uniquement des valeurs fournies dans l’InputStateTensor.
Les générateurs implémentés par cet opérateur ne sont pas sécurisés par chiffrement ; par conséquent, cet opérateur ne doit pas être utilisé pour le chiffrement, la génération de clés ou d’autres applications qui nécessitent une génération de nombres aléatoires sécurisés par chiffrement.
Syntaxe
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;
};
Membres
InputStateTensor
Type : const DML_TENSOR_DESC*
Tenseur d’entrée contenant l’état du générateur interne. La taille et le format de ce tenseur d’entrée dépendent du DML_RANDOM_GENERATOR_TYPE.
Pour DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, ce tenseur doit être de type UINT32 et avoir des {1,1,1,6}
tailles . Les quatre premières valeurs 32 bits contiennent un compteur 128 bits à augmentation monotone. Les deux dernières valeurs 32 bits contiennent la valeur de clé 64 bits du générateur.
Element 0 1 2 3 4 5
(32-bits each) |-------|-------|-------|-------|-------|-------|
<--------128-bit counter------> <-64-bit key-->
Lors de l’initialisation de l’état d’entrée du générateur pour la première fois, le compteur 128 bits (les quatre premières valeurs UINT32 32 bits) doit généralement être initialisé sur 0. La clé peut être choisie arbitrairement; différentes valeurs de clé produisent différentes séquences de nombres. La valeur de la clé est généralement générée à l’aide d’une valeur initiale fournie par l’utilisateur.
OutputTensor
Type : const DML_TENSOR_DESC*
Tenseur de sortie qui contient les valeurs pseudo-aléatoires obtenues. Ce tenseur peut être de n’importe quelle taille.
OutputStateTensor
Type : _Maybenull_ const DML_TENSOR_DESC*
Un tenseur de sortie facultatif qui contient l’état du générateur interne mis à jour. S’il est fourni, cet opérateur utilise l’InputStateTensor pour calculer un état de générateur mis à jour approprié et écrit le résultat dans le OutputStateTensor. En règle générale, les appelants enregistrent ce résultat et le fournissent comme état d’entrée lors d’une exécution ultérieure de cet opérateur.
Type
Type : DML_RANDOM_GENERATOR_TYPE
L’une des valeurs du DML_RANDOM_GENERATOR_TYPE énumération, indiquant le type de générateur à utiliser. Actuellement, la seule valeur valide est DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, qui génère des nombres pseudo-aléatoires selon l’algorithme Philox 4x32-10.
Notes
À chaque exécution de cet opérateur, le compteur 128 bits doit être incrémenté. Si le OutputStateTensor est fourni, cet opérateur incrémente le compteur avec la valeur correcte en votre nom et écrit le résultat dans le OutputStateTensor. La quantité à incrémenter dépend du nombre d’éléments de sortie 32 bits générés et du type du générateur.
Pour DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, le compteur 128 bits doit être incrémenté de ceil(outputSize / 4)
chaque exécution, où outputSize
est le nombre d’éléments dans le OutputTensor.
Prenons un exemple où la valeur du compteur 128 bits est actuellement 0x48656c6c'6f46726f'6d536561'74746c65
, et la taille du OutputTensor est {3,3,20,7219}
. Après avoir exécuté cet opérateur une fois, le compteur doit être incrémenté de 324 855 (le nombre d’éléments de sortie générés divisé par 4, arrondi vers le haut), ce qui entraîne une valeur de compteur de 0x48656c6c'6f46726f'6d536561'746f776e
. Cette valeur mise à jour doit ensuite être fournie en tant qu’entrée pour la prochaine exécution de cet opérateur.
Disponibilité
Cet opérateur a été introduit dans DML_FEATURE_LEVEL_3_0
.
Contraintes tensoriels
InputStateTensor et OutputStateTensor doivent avoir les mêmes DimensionCount et Sizes.
Prise en charge de Tensor
DML_FEATURE_LEVEL_4_0 et versions ultérieures
Tenseur | Type | Dimensions | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|---|
InputStateTensor | Entrée | { [1], [1], [1], [1], [1], [1], [1], 6 } | 1 à 8 | UINT32 |
OutputTensor | Output | { [D0], [D1], [D2], [D3], [D4], [D5], [D6], D7 } | 1 à 8 | UINT32 |
OutputStateTensor | Sortie facultative | { [1], [1], [1], [1], [1], [1], [1], 6 } | 1 à 8 | UINT32 |
DML_FEATURE_LEVEL_3_0 et versions ultérieures
Tenseur | Type | Dimensions | Nombre de dimensions pris en charge | Types de données pris en charge |
---|---|---|---|---|
InputStateTensor | Entrée | { 1, 1, 1, 6 } | 4 | UINT32 |
OutputTensor | Output | { D0, D1, D2, D3 } | 4 | UINT32 |
OutputStateTensor | Sortie facultative | { 1, 1, 1, 6 } | 4 | UINT32 |
Spécifications
Client minimal pris en charge | Windows 10 Build 20348 |
Serveur minimal pris en charge | Windows 10 Build 20348 |
En-tête | directml.h |