Pergunta

Estou fazendo paralelo a programação com MPI em conjunto Beowulf. Nós escrevemos algoritmo paralelo para o recozimento simulado. Funciona bem. Esperamos execução 15 vezes mais rápida do que com código de série. Mas nós fizemos alguma execução de código C serial em diferentes arquiteturas e sistemas operacionais apenas para que pudéssemos ter diferentes conjuntos de dados para medição de desempenho. Temos usado essa função aleatória em nosso código. Usamos GCC em Windows e Ubuntu Linux. Descobrimos que a execução leva muito mais tempo em Linuxes, e não sabemos porquê. Alguém pode compilar este código em Linux e Windows com gcc e tentar me explicar.

    #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 eu executá-lo com 100 000 000 como argumento para NUM_ITERATIONS, recebo execução 20 vezes mais lento no Linux do que no Windows. Testado na máquina com a mesma arquitetura com vitória dual boot + Ubuntu Linux. Precisamos de ajuda como esta função aleatório é gargalo para o que queremos mostrar com nossos dados.

Foi útil?

Solução

Eu iria investigar outros geradores de números aleatórios disponível. Muitos existem que têm sido bem testada e melhor desempenho do que as funções aleatórias da biblioteca padrão, tanto em termos de velocidade de execução e em termos de pseudo-aleatoriedade. Eu também têm implementado minha própria RNG para uma classe de pós-graduação, mas eu não iria usá-lo no código de produção. Vá com algo que foi vetado pela comunidade. Random.org é um bom recurso para testar tudo o RNG que você selecionar.

Outras dicas

No Linux gcc, a chamada para srand(rand()); dentro da função aleatório responde por mais de 98% do tempo.

Não é necessário para a geração de números aleatórios, pelo menos, não dentro do circuito. Você já chamam srand() uma vez, é o suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top