2009-12-08 15 views
5

Sto facendo programmazione parallela con MPI sul cluster Beowulf. Abbiamo scritto algoritmo parallelo per ricottura simulata. Funziona bene. Ci aspettiamo 15 volte più veloce rispetto al codice seriale. Tuttavia, abbiamo eseguito un'esecuzione del codice seriale C su architetture e sistemi operativi diversi, in modo da poter disporre di set di dati diversi per la misurazione delle prestazioni. Abbiamo usato questa funzione casuale nel nostro codice. Usiamo GCC su Windows e Ubuntu Linux. Abbiamo capito che l'esecuzione richiede molto più tempo sugli linux e non sappiamo perché. Qualcuno può compilare questo codice su linux e windows con gcc e provare a spiegarmi.Prestazioni GCC

#include <stdio.h> 
    #include <stdlib.h> 
    #include <time.h> 

    int main (int argc, char** argv){ 
     double Random(); 

     int k,NUM_ITERATIONS = 10; 
     clock_t start_time = clock(); 
     NUM_ITERATIONS=atoi(argv[1]); 

     // iniciranje random generatora 
     srand(time(NULL)); 

     for(k=0; k<NUM_ITERATIONS; k++){ 
       double raa = Random(); 
     } 
     clock_t end_time = clock(); 
    printf("Time of algorithm execution: %lf seconds\n", ((double) (end_time - start_time))/CLOCKS_PER_SEC); 

    return 0; 
    } 

    // generate random number bettwen 0 and 1 
    double Random(){ 
     srand(rand()); 
     double a = rand(); 
     return a/RAND_MAX; 
    } 

Se eseguo con 100 000 000 come argomento per NUM_ITERATIONS, ottengo l'esecuzione 20 volte più lento su linux che su Windows. Testato su macchina con la stessa architettura con dual boot win + ubuntu linux. Abbiamo bisogno di aiuto in quanto questa funzione casuale è un collo di bottiglia per ciò che vogliamo mostrare con i nostri dati.

+0

Quali opzioni della riga di comando state passando a gcc durante la compilazione di questo in linux e quali opzioni vengono utilizzate in Windows. –

+0

"gcc -o rand rand.c -lm" Su entrambi i sistemi. – Zec

+2

Qualunque generatore di numeri casuali si finisca, inizializzalo ** una volta ** per programma eseguito. ** UNA VOLTA SOLTANTO! ** – pmg

risposta

1

Vorrei esaminare altri generatori di numeri casuali disponibili. Esistono molti che sono stati ben testati e funzionano meglio delle funzioni casuali della libreria standard, sia in termini di velocità di esecuzione che in termini di pseudo-casualità. Ho anche implementato il mio personale RNG per una classe di specializzazione, ma non lo userei nel codice di produzione. Vai con qualcosa che è stato controllato dalla comunità. Random.org è una buona risorsa per testare qualsiasi RNG selezionato.

8

Su Linux gcc, la chiamata a srand(rand()); all'interno della funzione Casuale rappresenta più del 98% delle volte.

Non è necessario per la generazione di numeri casuali, almeno non all'interno del ciclo. Hai già chiamato srand() una volta, è abbastanza.

+0

Abbiamo bisogno di cambiare il seme tutto il tempo. vuoto srand (seme int unsigned); Il generatore di numeri pseudo-casuali viene inizializzato utilizzando l'argomento passato come seme. Per ogni valore di seed diverso utilizzato in una chiamata a smar, è probabile che il generatore di numeri pseudo-casuali generi una diversa successione di risultati nelle successive chiamate a rand. Due diverse inizializzazioni con lo stesso seme, istruisce il generatore pseudo-casuale a generare la stessa successione di risultati per le successive chiamate a Rand in entrambi i casi. – Zec

+3

@ZeKoU - Non sto dicendo che ti sbagli, ma questo codice ha un odore abbastanza strano. Penso (ma non sono sicuro) che si possa generare una sequenza deterministica o ipotetica. La prima chiamata 'rand' all'interno di' srand' sta sempre per seminare srand con lo stesso valore. Da lì, penso che un utente malintenzionato potrebbe rieseguire il tuo potere. Credo che dtrosset sia corretto. Inoltre, potresti voler chiamare 'srand (time (NULL))' invece: http://stackoverflow.com/questions/1108780/why-do-i-ways-get-the-same-sequence-of-random- numbers-with-rand –

+0

non ti è venuto in mente che int randPrime() {return srand (rand()), rand();} ? – ima