struttura DML_RANDOM_GENERATOR_OPERATOR_DESC (directml.h)
Riempie un tensore di output con bit distribuiti uniformemente generati in modo deterministico e pseudo-casuale. Questo operatore facoltativamente può anche restituire uno stato del generatore interno aggiornato, che può essere usato durante le esecuzioni successive dell'operatore.
Questo operatore è deterministico e si comporta come se fosse una funzione pura, ovvero la sua esecuzione non produce effetti collaterali e non usa alcuno stato globale. L'output pseudo-casuale prodotto da questo operatore dipende esclusivamente dai valori forniti in InputStateTensor.
I generatori implementati da questo operatore non sono crittograficamente sicuri; pertanto, questo operatore non deve essere usato per la crittografia, la generazione di chiavi o altre applicazioni che richiedono la generazione di numeri casuali sicuri crittograficamente.
Sintassi
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;
};
Members
InputStateTensor
Tipo: const DML_TENSOR_DESC*
Tensore di input contenente lo stato del generatore interno. Le dimensioni e il formato di questo tensore di input dipendono dal DML_RANDOM_GENERATOR_TYPE.
Per DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, questo tensore deve essere di tipo UINT32 e avere dimensioni {1,1,1,6}
. I primi quattro valori a 32 bit contengono un contatore a 128 bit ad aumento monotonico. Gli ultimi due valori a 32 bit contengono il valore della chiave a 64 bit per il generatore.
Element 0 1 2 3 4 5
(32-bits each) |-------|-------|-------|-------|-------|-------|
<--------128-bit counter------> <-64-bit key-->
Quando si inizializza lo stato di input del generatore per la prima volta, in genere il contatore a 128 bit (i primi quattro valori UINT32 a 32 bit) deve essere inizializzato su 0. La chiave può essere scelta arbitrariamente; valori chiave diversi produrranno sequenze diverse di numeri. Il valore della chiave viene in genere generato usando un valore di inizializzazione fornito dall'utente.
OutputTensor
Tipo: const DML_TENSOR_DESC*
Tensore di output che contiene i valori pseudo-casuali risultanti. Questo tensore può essere di qualsiasi dimensione.
OutputStateTensor
Tipo: _Maybenull_ const DML_TENSOR_DESC*
Tensore di output facoltativo che contiene lo stato del generatore interno aggiornato. Se specificato, questo operatore usa InputStateTensor per calcolare uno stato del generatore aggiornato appropriato e scrive il risultato in OutputStateTensor. In genere, i chiamanti salvano questo risultato e lo specificano come stato di input in un'esecuzione successiva di questo operatore.
Type
Tipo: DML_RANDOM_GENERATOR_TYPE
Uno dei valori dell'enumerazione DML_RANDOM_GENERATOR_TYPE , che indica il tipo di generatore da utilizzare. Attualmente l'unico valore valido è DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, che genera numeri pseudo-casuali secondo l'algoritmo Philox 4x32-10.
Commenti
In ogni esecuzione di questo operatore, il contatore a 128 bit deve essere incrementato. Se viene fornito OutputStateTensor , questo operatore incrementa il contatore con il valore corretto per conto dell'utente e scrive il risultato in OutputStateTensor. La quantità da incrementare dipende dal numero di elementi di output a 32 bit generati e dal tipo del generatore.
Per DML_RANDOM_GENERATOR_TYPE_PHILOX_4X32_10, il contatore a 128 bit deve essere incrementato in ceil(outputSize / 4)
base a ogni esecuzione, dove outputSize
è il numero di elementi in OutputTensor.
Si consideri un esempio in cui il valore del contatore a 128 bit è attualmente 0x48656c6c'6f46726f'6d536561'74746c65
e le dimensioni di OutputTensor sono {3,3,20,7219}
. Dopo l'esecuzione di questo operatore una volta, il contatore deve essere incrementato di 324.855 (il numero di elementi di output generati per 4, arrotondato per enumerazione) con conseguente valore del contatore .0x48656c6c'6f46726f'6d536561'746f776e
Questo valore aggiornato deve quindi essere fornito come input per l'esecuzione successiva di questo operatore.
Disponibilità
Questo operatore è stato introdotto in DML_FEATURE_LEVEL_3_0
.
Vincoli tensor
InputStateTensor e OutputStateTensor devono avere lo stesso DimensionCount e Sizes.
Supporto di Tensor
DML_FEATURE_LEVEL_4_0 e versioni successive
Tensore | Tipo | Dimensioni | Conteggi delle dimensioni supportati | Tipi di dati supportati |
---|---|---|---|---|
InputStateTensor | Input | { [1], [1], [1], [1], [1], [1], [1], 6 } | da 1 a 8 | UINT32 |
OutputTensor | Output | { [D0], [D1], [D2], [D3], [D4], [D5], [D6], D7 } | da 1 a 8 | UINT32 |
OutputStateTensor | Output facoltativo | { [1], [1], [1], [1], [1], [1], [1], 6 } | da 1 a 8 | UINT32 |
DML_FEATURE_LEVEL_3_0 e versioni successive
Tensore | Tipo | Dimensioni | Conteggi delle dimensioni supportati | Tipi di dati supportati |
---|---|---|---|---|
InputStateTensor | Input | { 1, 1, 1, 6 } | 4 | UINT32 |
OutputTensor | Output | { D0, D1, D2, D3 } | 4 | UINT32 |
OutputStateTensor | Output facoltativo | { 1, 1, 1, 6 } | 4 | UINT32 |
Requisiti
Client minimo supportato | Windows 10 Build 20348 |
Server minimo supportato | Windows 10 Build 20348 |
Intestazione | directml.h |