URL: https://linuxfr.org/forums/programmation-c--2/posts/parallelisation-dune-boucle-th%C3%A9oriquement-trivialement-parall Title: Parallelisation d'une boucle (théoriquement) trivialement parallélisable Authors: berti Date: 2010年11月05日T18:07:16+01:00 Tags: fortran Score: 7 Bonjour, Je dois effectuer un nombre très important de fois la boucle suivante avec un contrainte très forte sur le temps d'exécution: £spaces£ £/spaces£for(i = 0 ; i < N ; i++){ £spaces£ £/spaces£yvar1[i] = yvar1[i] + yvar2[i] + yvar3[i]; £spaces£ £/spaces£yvar2[i] = yvar2[i] + 2.0 * yvar3[i]; £spaces£ £/spaces£} où N est proche de 130000 et yvar* est un tableau de double. Ce calcul est théoriquement trivialement parallélisable mais malheureusemnt je n'obtiens pas un bon speedup avec plus de deux threads. C'est probablement dû au fait que N n'est pas si grand et qu'on effectue beaucoup de lecture/écriture par rapport au nombre de calcul. Avec le test suivant ( [http://codeviewer.org/view/code:1397](http://codeviewer.org/view/code:1397) ) compilé avec "cc -O3 -lpthread testPred.c -o testPred" sur un "biprocesseur-quadricore-hyperthreadé (i.e. 16 coeurs logiques) Intel(R) Xeon(R) CPU E5530 @ 2.40GHz" j'obtiens les temps suivant: [DEK328@PEGASE08 testParall]$ ./compile.sh && ./testPred inplace sequential prediction : 0.440000 ms inplace sequential prediction += : 0.356000 ms outplace sequential prediction : 1.003000 ms inplace parallel prediction += using 1 threads: 0.798000 ms inplace parallel prediction += using 2 threads: 0.304000 ms inplace parallel prediction += using 4 threads: 0.430000 ms inplace parallel prediction += using 8 threads: 0.425000 ms inplace parallel prediction += using 16 threads: 0.662000 ms outplace parallel prediction using 1 threads: 0.475000 ms outplace parallel prediction using 2 threads: 0.284000 ms outplace parallel prediction using 4 threads: 0.414000 ms outplace parallel prediction using 8 threads: 0.488000 ms outplace parallel prediction using 16 threads: 0.577000 ms On constate que dès qu'il y a plus de 2 threads, le speedup est très mauvais (même avec la version "outplace" où l'on ne devrait pas avoir de falsesharing). La meilleur combinaison mène à un temps de 0.28ms qui est malheureusement toujours trop élevé pour mes besoins. On a constaté le même genre de mesure en utilisant d'autre langage (intel Fortran et OpenMP). Plusieurs questions: * qu'est-ce qui explique ce si mauvais speedup ?. * y-a-t'il une autre technique qui améliorerait les performances ? Presque toutes les options sont ouvertes (hardware, algorithmiques, langages...) * pourquoi est-ce que la version avec "yvar1[i] = yvar1[i] + ... " est moins performante que celle avec "yvar1[i] += ..." ? Le compilateur n'est-il pas assez intelligent pour remarquer que c'est la même chose ? * par ailleurs connaîtriez-vous d'autres sites/forum où l'on s'intéresse à ce genre de question ? Merci d'avance pour vos suggestions.