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.
Quali opzioni della riga di comando state passando a gcc durante la compilazione di questo in linux e quali opzioni vengono utilizzate in Windows. –
"gcc -o rand rand.c -lm" Su entrambi i sistemi. – Zec
Qualunque generatore di numeri casuali si finisca, inizializzalo ** una volta ** per programma eseguito. ** UNA VOLTA SOLTANTO! ** – pmg