2009-12-08 19 views
5

Je suis en train de faire de la programmation parallèle avec MPI sur le cluster Beowulf. Nous avons écrit un algorithme parallèle pour le recuit simulé. Ça fonctionne bien. Nous nous attendons à une exécution 15 fois plus rapide qu'avec le code série. Mais nous avons fait quelques exécutions de code C en série sur différentes architectures et systèmes d'exploitation juste pour que nous ayons différents ensembles de données pour la mesure de la performance. Nous avons utilisé cette fonction aléatoire dans notre code. Nous utilisons GCC sur Windows et Ubuntu Linux. Nous avons compris que l'exécution prend beaucoup plus de temps sur les linux, et nous ne savons pas pourquoi. Quelqu'un peut-il compiler ce code sur linux et windows avec gcc et essayer de m'expliquer.Performance 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; 
    } 

Si je l'exécute avec 100 000 000 comme argument pour NUM_ITERATIONS, je reçois 20 fois plus lent exécution sur linux que sur Windows. Testé sur machine avec la même architecture avec dual boot win + ubuntu linux. Nous avons besoin d'aide car cette fonction aléatoire est un goulot d'étranglement pour ce que nous voulons montrer avec nos données.

+0

Quelles options de ligne de commande passez-vous à gcc lors de la compilation sous Linux, et quelles sont les options utilisées dans Windows. –

+0

"gcc -o rand rand.c -lm" Sur les deux systèmes. – Zec

+2

Quel que soit le générateur de nombres aléatoires avec lequel vous vous retrouvez, initialisez-le ** une fois ** par programme. ** ONCE ONLY! ** – pmg

Répondre

1

Je voudrais étudier d'autres générateurs de nombres aléatoires disponibles. Beaucoup existent qui ont été bien testés et fonctionnent mieux que les fonctions aléatoires de la bibliothèque standard, à la fois en termes de rapidité d'exécution et en termes de pseudo-aléatoire. J'ai également mis en place mon propre RNG pour un cours de deuxième cycle, mais je ne l'utiliserais pas en code de production. Aller avec quelque chose qui a été approuvé par la communauté. Random.org est une bonne ressource pour tester quel RNG vous sélectionnez.

8

Sous Linux gcc, l'appel à srand(rand()); dans la fonction aléatoire représente plus de 98% du temps.

Il n'est pas nécessaire pour la génération de nombres aléatoires, du moins pas dans la boucle. Vous appelez déjà srand() une fois, c'est assez.

+0

Nous avons besoin de changer la graine tout le temps. void srand (graine int non signée); Le générateur de nombres pseudo-aléatoires est initialisé en utilisant l'argument passé en tant que germe. Pour chaque valeur de départ différente utilisée dans un appel à srand, on peut s'attendre à ce que le générateur de nombres pseudo-aléatoires génère une succession différente de résultats dans les appels suivants à rand. Deux initialisations différentes avec la même graine, indiquent au générateur pseudo-aléatoire de générer la même succession de résultats pour les appels suivants à rand dans les deux cas. – Zec

+3

@ZeKoU - Je ne dis pas que vous avez tort, mais ce code sent très poisson. Je pense (mais je ne suis pas sûr) que vous pourriez générer une séquence déterministe ou devinable. Le premier appel du 'rand' dans le' srand' va toujours semer srand avec la même valeur. De là, je pense qu'un attaquant pourrait relancer votre pouvoir. Je crois que DTROSSET est correct. En outre, vous pouvez appeler 'srand (time (NULL))' à la place: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random- numéros-avec-rand –

+0

ne vous est-il pas venu à l'esprit que int randPrime() {return srand (rand()), rand();} ? – ima