J'utilise la méthode monte carlo pour calculer pi et faire une expérience de base avec la programmation parallèle et OpenMPparallèle, mais plus lent
le problème est que lorsque j'utilise 1 fil, x itérations, court toujours plus vite que les fils n , x itérations. Quelqu'un peut-il me dire pourquoi?
Par exemple, le code fonctionne comme celui-ci "a.out 1 1000000", où 1 est fils et 1000000 les itérations
include <omp.h>
include <stdio.h>
include <stdlib.h>
include <iostream>
include <iomanip>
include <math.h>
using namespace std;
int main (int argc, char *argv[]) {
double arrow_area_circle, pi;
float xp, yp;
int i, n;
double pitg= atan(1.0)*4.0; //for pi error
cout << "Number processors: " << omp_get_num_procs() << endl;
//Number of divisions
iterarions=atoi(argv[2]);
arrow_area_circle = 0.0;
#pragma omp parallel num_threads(atoi(argv[1]))
{
srandom(omp_get_thread_num());
#pragma omp for private(xp, yp) reduction(+:arrow_area_circle) //*,/,-,+
for (i = 0; i < iterarions; i++) {
xp=rand()/(float)RAND_MAX;
yp=rand()/(float)RAND_MAX;
if(pow(xp,2.0)+pow(yp,2.0)<=1) arrow_area_circle++;
}
}
pi = 4*arrow_area_circle/iterarions;
cout << setprecision(18) << "PI = " << pi << endl << endl;
cout << setprecision(18) << "Erro = " << pitg-pi << endl << endl;
return 0;
}
J'ai un core duo, mais je vais essayer une solution à arrow_area_circle – blueomega
Vous devriez voir une accélération à 2 threads puis un ralentissement après cela. – Michael