O programa OpenMP é mais lento que o seqüencial

Quando eu tento o seguinte código

double start = omp_get_wtime(); long i; #pragma omp parallel for for (i = 0; i <= 1000000000; i++) { double x = rand(); } double end = omp_get_wtime(); printf("%f\n", end - start); 

O tempo de execução é de cerca de 168 segundos, enquanto a versão sequencial gasta apenas 20 segundos.

Eu ainda sou um novato em programação paralela. Como eu poderia obter uma versão paralela mais rápida que a sequencial?

O gerador de números randoms rand(3) usa variables ​​de estado global (ocultas na implementação da (g) libc). O access a eles a partir de vários segmentos leva a problemas de cache e também não é thread-safe. Você deve usar a rand_r(3) com seed parâmetro seed privado para o encadeamento:

 long i; unsigned seed; #pragma omp parallel private(seed) { // Initialise the random number generator with different seed in each thread // The following constants are chosen arbitrarily... use something more sensible seed = 25234 + 17*omp_get_thread_num(); #pragma omp for for (i = 0; i < = 1000000000; i++) { double x = rand_r(&seed); } } 

Observe que isso produzirá um stream diferente de números randoms quando executado em paralelo do que quando executado em serial. Eu também recomendaria erand48(3) como uma fonte de número (pseudo) aleatória melhor.