[Development] CSPRNG vs DPRNG

Thiago Macieira thiago.macieira at intel.com
Thu Oct 12 19:42:53 CEST 2017


On quinta-feira, 12 de outubro de 2017 10:06:05 PDT Thiago Macieira wrote:
> The conversion to double via ldexp is what generateDouble() does in the new
> class and is optional. Though I will take a look now to see if using ldexp()
> produces better code than
> 
> return double(generate64()) / (double((std::numeric_limits<quint64>::max)())
> + 1);

Ok, quick test shows that using ldexp causes all 4 compilers tested (GCC 7, 
Clang 4, MSVC 2017 and ICC 17) to generate an out-of-line call to ldexp. My 
original code above is better, since it's all inline.

See: https://godbolt.org/g/AS8XPC

Yet my code is not optimal, since it generates a check for the sign bit 
because the x86 instruction CVTSI2SD takes a signed integer as input. That's 
useless, since the result has only 53 bits of randomness anyway. So a simple 
one-line masking the high bits change makes the result drop the branch in 
three of the four compilers (the one with the poor optimiser doesn't realise 
that masking the sign bit means the result can't have the sign bit set).

See https://godbolt.org/g/m8WwXX

-- 
Thiago Macieira - thiago.macieira (AT) intel.com
  Software Architect - Intel Open Source Technology Center




More information about the Development mailing list