desempenho GCC
-
18-09-2019 - |
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.
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.