[LLVMdev] [LLVMDev] Does LLVM have a random number generator?

Jeff Kunkel jdkunk3 at gmail.com
Sat Oct 9 07:50:12 PDT 2010


I forgot to cc the list.

On Sat, Oct 9, 2010 at 10:47 AM, Jeff Kunkel <jdkunk3 at gmail.com> wrote:
> On Sat, Oct 9, 2010 at 10:37 AM, Michael Spencer <bigcheesegs at gmail.com> wrote:
>>> On Sat, Oct 9, 2010 at 1:10 AM, Jeff Kunkel <jdkunk3 at gmail.com> wrote:
>>>> Hello, does LLVM already have a Random Number Generator built into
>>>> it's library somewhere?
>>>>
>>>> I know code generation is suppose to be deterministic, but when
>>>> producing a random number can be deterministic if the random number
>>>> generator is also deterministic.
>>
>> What exactly is this for? Most heuristics in llvm passes are generated
>> by calculating an arbitrary "goodness" value by iterating over the
>> code in question and looking for indicators.
>
> I am using this is my register allocator. For phi elimination, I've
> created a simulated annealing like algorithm. I expect this to
> generate good results quickly, rather than using the integer linear
> programming approaches or the iterative approaches. Second, the
> problem instances going into this algorithm are fairly small. I have
> cut down the problem instances to a very few variables which are
> required for such hard algorithms.
>
>>
>> I have no opinion on using psudorandom numbers, but you have to be
>> careful to keep the results the same across platforms. Quite a few
>> stdlib algorithms don't say exactly how many times any given function
>> will be called.
>
> Hence, a register allocator class where the user can specify the seed
> would be preferred over the C-style srand(), rand() because at that
> point rand() would not be thread safe.
>
>>
>>> I am plugging this into my code. If someone wants to take it out and
>>> add it to the llvm library, it's a simple Linear Congruential
>>> Generator, but here it is:
>>>
>>>    typedef struct random_number_gen {
>>>      unsigned a, c, seed, m;
>>>      random_number_gen( unsigned seed, unsigned modulo ) :
>>> seed(seed), m(modulo) {
>>>        unsigned primes[] = { 2,   3,   5,   7,  11,  13,  17,  19,  23,  29 };
>>>        a = 1 + primes[ seed % ( sizeof(primes)/sizeof(primes[0]) ) ];
>>>        c = primes[ modulo % ( sizeof(primes)/sizeof(primes[0]) ) ];
>>>      }
>>>      unsigned rand() { return seed = (a*seed + c) % m; }
>>>    } random_number_gen;
>>>
>>> -Thanks
>>> -Jeff Kunkel
>>
>> If we do add a psudorandom number generator to the Support library, I
>> would rather we use the same interface as C++0x <random> and use the
>> Mersenne twister.
>
> I just needed something simple and stupid. I just whipped this up as
> fast as I could.
>
>>
>> - Michael Spencer
>>
>
> Thanks,
> Jeff Kunkel
>




More information about the llvm-dev mailing list