Le code suivant fonctionne mieux avec 1 fil que de 2 (en utilisant 4 fils donne accélérer, cependant):En utilisant rand_r dans OpenMP « pour » est plus lent avec 2 fils
#include <stdlib.h>
#include <stdio.h>
#include <omp.h>
int main(int argc, char **argv) {
int n = atoi(argv[1]);
int num_threads = atoi(argv[2]);
omp_set_num_threads(num_threads);
unsigned int *seeds = malloc(num_threads * sizeof(unsigned int));
for (int i = 0; i < num_threads; ++i) {
seeds[i] = 42 + i;
}
unsigned long long sum = 0;
double begin_time = omp_get_wtime();
#pragma omp parallel
{
unsigned int *seedp = &seeds[omp_get_thread_num()];
#pragma omp for reduction(+ : sum)
for (int i = 0; i < n; ++i) {
sum += rand_r(seedp);
}
}
double end_time = omp_get_wtime();
printf("%fs\n", end_time - begin_time);
free(seeds);
return EXIT_SUCCESS;
}
Sur mon ordinateur portable (2 noyaux , HT activé) Je reçois les résultats suivants:
$ gcc -fopenmp test.c && ./a.out 100000000 1
0.821497s
$ gcc -fopenmp test.c && ./a.out 100000000 2
1.096394s
$ gcc -fopenmp test.c && ./a.out 100000000 3
0.933494s
$ gcc -fopenmp test.c && ./a.out 100000000 4
0.748038s
Le problème persiste sans réduction, drand48_r
apporte aucune différence, l'ordonnancement dynamique rend les choses encore pire. Cependant, si je remplace le corps de la boucle par quelque chose qui n'est pas lié au hasard, je. e. sum += *seedp + i;
, tout fonctionne comme prévu.
Ah! J'ai omis que rand_r modifie réellement le paramètre donné. Bonne réponse :) – Harald