Multi-threaded random_r is slower than single threaded version.
        Posted  
        
            by Nixuz
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by Nixuz
        
        
        
        Published on 2010-06-08T19:12:35Z
        Indexed on 
            2010/06/08
            20:12 UTC
        
        
        Read the original article
        Hit count: 264
        
The following program is essentially the same the one described here. When I run and compile the program using two threads (NTHREADS == 2), I get the following run times:
real        0m14.120s
user        0m25.570s
sys         0m0.050s
When it is run with just one thread (NTHREADS == 1), I get run times significantly better even though it is only using one core.
real        0m4.705s
user        0m4.660s
sys         0m0.010s
My system is dual core, and I know random_r is thread safe and I am pretty sure it is non-blocking. When the same program is run without random_r and a calculation of cosines and sines is used as a replacement, the dual-threaded version runs in about 1/2 the time as expected.
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#define NTHREADS 2
#define PRNG_BUFSZ 8
#define ITERATIONS 1000000000
void* thread_run(void* arg) {
    int r1, i, totalIterations = ITERATIONS / NTHREADS;
    for (i = 0; i < totalIterations; i++){
        random_r((struct random_data*)arg, &r1);
    }
    printf("%i\n", r1);
}
int main(int argc, char** argv) {
    struct random_data* rand_states = (struct random_data*)calloc(NTHREADS, sizeof(struct random_data));
    char* rand_statebufs = (char*)calloc(NTHREADS, PRNG_BUFSZ);
    pthread_t* thread_ids;
    int t = 0;
    thread_ids = (pthread_t*)calloc(NTHREADS, sizeof(pthread_t));
    /* create threads */
    for (t = 0; t < NTHREADS; t++) {
        initstate_r(random(), &rand_statebufs[t], PRNG_BUFSZ, &rand_states[t]);
        pthread_create(&thread_ids[t], NULL, &thread_run, &rand_states[t]);
    }
    for (t = 0; t < NTHREADS; t++) {
        pthread_join(thread_ids[t], NULL);
    }
    free(thread_ids);
    free(rand_states);
    free(rand_statebufs);
}
I am confused why when generating random numbers the two threaded version performs much worse than the single threaded version, considering random_r is meant to be used in multi-threaded applications.
© Stack Overflow or respective owner