-
-
Notifications
You must be signed in to change notification settings - Fork 475
Description
Disclaimer: I don't really know what I am talking about here.
The first step, as far as Rand is concerned, is to generate a small array of values from an RNG. Some RNG's may lend itself well for this, like ChaCha, and possibly HC-128, although that one does not use SIMD. Other options are packing together multiple small RNGs, like Xorshift+ or Xoroshiro+. The result type of such an RNG should be some array, so maybe we can make use of the BlockRngCore
trait?
Making use of the generated values can be a more interesting problem. This involves the distributions code.
Converting to floating point: the Standard
uniform distribution should not cause any problems, and neither should the range code.
I suppose the other distributions are going to give trouble, at least anything that needs branches or a look-up table (i.e. the current ziggurat code) is not going to work well. And what should happen when an algorithm needs to do rejections sampling, and one of a couple of SIMD values get rejected? Return NaN
? For most distributions there should exist an algorithm suitable for SIMD. The Box-Muller transform for example looks promising for the Normal
distribution, although it would need a library to provide functions like sin
and cos
.
Integer ranges: I don't expect the widening multiply method to work for integer range reduction, and division or modulus also do not seem to be available. And I suppose we have no way to indicate a value is rejected because it falls outside the acceptable zone and can cause bias.
Now I don't know how far we should go, and if Rand should provide any implementations at all. But I think we should make sure the API does not prevent Rand from being used in this area.