Dopo aver esaminato lo Intel Digital Random Number Generator (DRNG) Software Implementation Guide, ho alcune domande su cosa succede allo stato interno del generatore quando viene richiamato RDRAND
. Sfortunatamente le risposte non sembrano essere nella guida.Quali sono le caratteristiche di esaurimento di RDRAND su Ivy Bridge?
Secondo la guida, all'interno della DRNG ci sono quattro buffer 128 bit che servono bit casuali per
RDRAND
di scarico.RDRAND
stessa provvederà o 16, 32, o 64 bit di dati casuali secondo la larghezza del registro di destinazione:rdrand ax ; put 16 random bits in ax rdrand eax ; put 32 random bits in eax rdrand rax ; put 64 random bits in rax
Sarà l'uso di registri destinazione grandi svuotare i buffer a 128 bit più rapidamente? Ad esempio, se ho bisogno solo di 2 bit di casualità, dovrei passare attraverso il problema di usare un registro a 16 bit su un registro a 64 bit? Questo farà alcuna differenza sul throughput del DRNG? Mi piacerebbe evitare di consumare più casualità del necessario.
La guida dice verrà impostato il flag di carry dopo
RDRAND
esegue:CF = 1 Destination register valid. Non-zero random value available at time of execution. Result placed in register. CF = 0 Destination register all zeros. Random value not available at time of execution. May be retried.
Che cosa significa "non disponibile" significa? I dati casuali non sono disponibili perché le chiamate
RDRAND
hanno esaurito troppo rapidamente i buffer a 128 bit? O non è disponibile significa che il DRNG sta fallendo i suoi controlli di integrità e non può generare nuovi dati? Fondamentalmente, sto cercando di capire se CF = 0 può verificarsi solo perché i buffer capita di essere (transitoriamente) vuoto quando viene invocatoRDRAND
.
Nota: Ho rivisto il answers a this question on throughput and latency of RDRAND, ma io sto cercando informazioni diverse.
Grazie!
Si noti che [il throughput di 'rdrand' è di uno per ~ 110 cicli su IvB, uno per ~ 460 cicli su Skylake] (http://agner.org/optimize/).È una buona idea ottenere 64 bit e sminuzzarli se si ha un uso per più numeri casuali piccoli allo stesso tempo, o usare 'rdseed' per seminare un PRNG più veloce se si ha bisogno di un sacco di numeri casuali. È solo ~ 16 uops, ma ad alta latenza, e la risposta di David sulla domanda collegata indica che tende a bloccare la pipeline quando si utilizza subito il risultato. La gente sembra solo misurare il throughput di RNG, non l'impatto che ha sui calcoli che usano i numeri. –