2009-12-08 5 views
5

Estoy haciendo programación en paralelo con MPI en clúster de Beowulf. Escribimos un algoritmo paralelo para el recocido simulado. Funciona bien. Esperamos una ejecución 15 veces más rápida que con el código de serie. Pero hicimos algunas ejecuciones del código serie C en diferentes arquitecturas y sistemas operativos solo para poder tener diferentes conjuntos de datos para la medición del rendimiento. Hemos utilizado esta función Aleatoria en nuestro código. Usamos GCC en ambas ventanas y ubuntu linux. Descubrimos que la ejecución lleva mucho más tiempo en linux, y no sabemos por qué. ¿Alguien puede compilar este código en Linux y Windows con GCC e intentar explicarme?Rendimiento de 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 ejecuto con 100 000 000 como argumento para NUM_ITERATIONS, me sale de ejecución 20 veces más lento en Linux que en Windows. Probado en máquina con la misma arquitectura con doble arranque win + ubuntu linux. Necesitamos ayuda ya que esta función Aleatoria es un cuello de botella por lo que queremos mostrar con nuestros datos.

+0

¿Qué opciones de línea de comando le está pasando a gcc al compilar esto en Linux, y qué opciones se utilizan en Windows. –

+0

"gcc -o rand rand.c -lm" En ambos sistemas. – Zec

+2

Sea cual sea el generador de números aleatorios con el que termine, inicialícelo ** una vez ** por ejecución del programa. ** ¡SOLO UNA VEZ! ** – pmg

Respuesta

1

Investigaré otros generadores de números aleatorios disponibles. Existen muchos que han sido probados y funcionan mejor que las funciones aleatorias de la biblioteca estándar, tanto en términos de velocidad de ejecución como en términos de pseudoaleatoriedad. También implementé mi propio RNG para una clase de posgrado, pero no lo usaría en el código de producción. Vaya con algo que haya sido aprobado por la comunidad. Random.org es un buen recurso para probar cualquier RNG que seleccione.

8

En Linux gcc, la llamada a srand(rand()); dentro de la función Aleatoria representa más del 98% del tiempo.

No es necesario para la generación de números aleatorios, al menos no dentro del ciclo. Ya llamas al srand() una vez, es suficiente.

+0

Necesitamos cambiar la semilla todo el tiempo. void srand (unsigned int seed); El generador de números pseudoaleatorios se inicializa utilizando el argumento pasado como semilla. Para cada valor de inicialización diferente utilizado en una llamada a srand, se puede esperar que el generador de números pseudoaleatorios genere una sucesión de resultados diferente en las llamadas subsiguientes a rand. Dos inicializaciones diferentes con la misma semilla, instruyen al generador pseudoaleatorio para generar la misma sucesión de resultados para las llamadas subsiguientes a rand en ambos casos. – Zec

+3

@ZeKoU - No digo que estés equivocado, pero este código huele a pescado. Creo (pero no estoy seguro) que puede estar generando una secuencia determinista o adivinable. La primera llamada al 'rand' dentro del' srand' siempre va a sembrar srand con el mismo valor. A partir de ahí, creo que un atacante podría volver a ejecutar su poder. Creo que dtrosset es correcto. Además, es posible que desee llamar 'srand (time (NULL))' en su lugar: http://stackoverflow.com/questions/1108780/why-do-i-always-get-the-same-sequence-of-random- números-con-rand –

+0

¿no se te ocurrió que int randPrime() {return srand (rand()), rand();} ? – ima

Cuestiones relacionadas