RDRAND é legal, mas é uma boa idéia usá-lo em seus códigos?

A regra que citei no artigo anterior impõe um problema muito importante: Não se deve chamar a instrução RDRAND em intervalos inferiores a 10 μs!

Parece que contornamos o problema com o uso da função wait10us(), não é? Mas existe outro ainda maior: threads! Num ambiente multithreading (windows e linux) vários processos podem estar usando, simultâneamente, a instrução RDRAND. A Intel nos diz que ISSO não é um problema, mas a regra acima é desobedecida e o resultado por ser menos que aleatório!

RDRAND, embora seja uma instrução de uso geral (não está restrita ao ring 0), deve ser usada apenas pelo kernel do sistema operacional ou, no máximo, por algum device driver, justamente para garantir que a regra do intervalo de tempo seja respeitada… Dito isso, o que postei até aqui não substitui o uso de LCGs (Linear Congruency Generators) ou outro método PRNG (Pseudo Random Number Generator), no sentido de que estes últimos podem ser usados em múltiplas threads sem perder suas características “quase” aleatórias.

No caso do linux, pode-se usar o device /dev/urandom e, no Windows, a função CryptGenRandom() da CryptoAPI… bem como as funções rand() e random(), da biblioteca padrão de C e libc, respectivamente… Nos dois primeiros casos você obterá, provavelmente, um valor vindo, de uma forma ou de outra, de RDRAND (embora eu não esteja convencido que isso ocorra, no caso do Windows, no caso linux isto está codificado nos kernels mais recentes – basta baixar o código em kernel.org)… No caso dos outros, com toda certeza, um tipo de PRNG é usado (provavelmente LGC).

Então, my friends, cuidado ao usar RDRAND em seus códigos… Evite usá-la em códigos de produção!

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s