commit:2010:08_10
Differences
This shows you the differences between two versions of the page.
commit:2010:08_10 [2010/08/10 09:59] – created boman | commit:2010:08_10 [2016/03/30 15:23] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
+ | ====== Commit 2010-08-10 ====== | ||
+ | ===== Mise en place d' | ||
+ | |||
+ | J'ai décidé de mettre entre parenthèse la refonte de la base de données de Metafor pour avancer un peu du côté du parallélisme. Ce commit permet de compiler Metafor avec OpenMP. Pour ceux qui ne le saurait pas, OpenMP est un ensemble d' | ||
+ | |||
+ | |||
+ | |||
+ | ==== Makefiles ==== | ||
+ | |||
+ | * Les makefiles ont été adaptés pour compiler le code avec OpenMP (aussi bien avec gcc que le compilateur intel). Il n'y a pas de problème sous linux mis à part que certaines machines n'ont pas de gcc supportant OpenMP. C'est le cas de clifton et gaston. Sous Windows, il y a un petit problème si on veut compiler le projet avec le compilateur Intel: l' | ||
+ | * Il est bien sûr toujours possible de compiler sans OpenMP (mettre à '' | ||
+ | * Sous linux, la séquence des libs MKL au link a été adaptée pour pouvoir mixer de l' | ||
+ | |||
+ | ==== Interface OpenMP (et MKL) ==== | ||
+ | |||
+ | Pour éviter d' | ||
+ | OpenMP status: | ||
+ | max_threads = 2 | ||
+ | num_procs | ||
+ | dynamic | ||
+ | nested | ||
+ | La première valeur correspond à la valeur '' | ||
+ | |||
+ | Pour s'y retrouver dans ce qui est parallèle et ce qui ne l'est pas (encore), j'ai fait la même chose pour MKL: il existe maintenant une classe nommée '' | ||
+ | MKL 10.2 (Intel(R) Core(TM) i7 Processor) | ||
+ | num_threads = 2 | ||
+ | dynamic | ||
+ | La première valeur est votre '' | ||
+ | On voit déjà que les MKL s' | ||
+ | |||
+ | Ces infos ci dessus s' | ||
+ | |||
+ | Les classes '' | ||
+ | OpenMP.setNumThreads(8) | ||
+ | Blas.setNumThreads(2) | ||
+ | |||
+ | |||
+ | ==== Option "-j ncpu" ==== | ||
+ | |||
+ | Il est possible d' | ||
+ | metafor -nogui -j 8 -run snecma.tests.snecmaRup | ||
+ | lance snecmaRup sur 8 CPUs (en pratique, le seul le solveur DSS en bénéficie aujourd' | ||
+ | |||
+ | ==== Timers ==== | ||
+ | |||
+ | Étape suivante après avoir réglé la compilation et affiché les infos concernant OpenMP, il faut pouvoir __mesurer__ le temps qui s' | ||
+ | |||
+ | J'ai donc modifié le '' | ||
+ | |||
+ | Le '' | ||
+ | |||
+ | Voilà par exemple ce qu'on obtient en lançant '' | ||
+ | [TSC-CPU] | ||
+ | [TSC-REA] | ||
+ | [TSC-KER] | ||
+ | [TSC-OMP] | ||
+ | Le calcul dure réellement 17.4 sec mais, à cause du thread graphique et vu que j'ai plusieurs coeurs sur ma machine, le temps " | ||
+ | |||
+ | ==== Chronométrage du code ==== | ||
+ | |||
+ | Pour savoir ce qu'il faut paralléliser en premier, il est important d' | ||
+ | |||
+ | J'ai donc introduit des timers dans Metafor. Ils sont situés das la classe '' | ||
+ | |||
+ | ^ | ||
+ | | GEN_EXT_FORC | ||
+ | | GEN_INERT_FORC | ||
+ | | GEN_INTER_FORC | ||
+ | | Metafor | ||
+ | | buildK | ||
+ | | contactDetection | ||
+ | | prepro | ||
+ | | solveK | ||
+ | |||
+ | |||
+ | --- // |