Mais si tu n'as pas de bol, et qu'un thread gère des « petites » sommes (exposant n, disons les dépenses quotidiennes), et qu'un autre thread gère des sommes plus grosses (exposant n', disons les salaires ou les chiffres du PMU, ou...), tu te retrouves avec des nombres d'ordres de grandeur potentiellement très différents.
Plus « sérieusement » : j'ai donné des formations sur OpenMP. Forcément à un moment donné j'ai parlé des opérations de réduction. Un bête truc du genre produit scalaire :
/* Algorithme non-optimisé pour le produit scalaire */voiddotproduct_omp(double*constsumref,doubleconst*constA,doubleconst*constB,constunsignedlongN){doublesum=0.0;#pragma omp parallel shared(A,B) {#pragma omp for default(none) reduction(+:sum) for(size_ti=0;i<N;++i){sum+=A[i]*B[i];}}*sumref=sum;}#define N 100ULintmain(void){double*A=NULL,*B=NULL;unsignedlongn=N,nbthreads=NUMTHREADS;doublesum=0.0;A=safe_malloc(sizeof(double)*N);B=safe_malloc(sizeof(double)*N);for(longi=0;i<n;++i){A[i]=i;B[i]=n-i;}dotproduct_omp_atomic(&sum,A,B,n);printf("Parallel (OpenMP) dot product = %.2f\n",sum);free(A);free(B);return0;}
Bien entendu si toutes les valeurs de tes vecteurs sont peu ou prou du même ordre de grandeur, alors pas de problème. Mais si tu as de grandes disparités, même en double précision, alors la version séquentielle et la version parallèle vont sérieusement diverger pour le résultat final — et pas besoin de beaucoup de threads, je crois qu'au-delà de 4 on voyait déjà poindre les ennuis.
[^] # Re: quelques points
Posté par lasher . En réponse à la dépêche De tout, de rien, des bookmarks, du bla bla #29. Évalué à 2.
Mais si tu n'as pas de bol, et qu'un thread gère des « petites » sommes (exposant
n, disons les dépenses quotidiennes), et qu'un autre thread gère des sommes plus grosses (exposantn', disons les salaires ou les chiffres du PMU, ou...), tu te retrouves avec des nombres d'ordres de grandeur potentiellement très différents.Plus « sérieusement » : j'ai donné des formations sur OpenMP. Forcément à un moment donné j'ai parlé des opérations de réduction. Un bête truc du genre produit scalaire :
Bien entendu si toutes les valeurs de tes vecteurs sont peu ou prou du même ordre de grandeur, alors pas de problème. Mais si tu as de grandes disparités, même en double précision, alors la version séquentielle et la version parallèle vont sérieusement diverger pour le résultat final — et pas besoin de beaucoup de threads, je crois qu'au-delà de 4 on voyait déjà poindre les ennuis.