|
|
# Utiliser une machine OpenMP au LPNHE #
|
|
|
Désormais, toutes les machines de type PC sous OS récent sont des machines à plusieurs cœurs de calcul, avec mémoire partagée.
|
|
|
|
|
|
Par exemple la machine qui supporte les [Phi](PhiAtLpnhe) est une machine :
|
|
|
* avec 16 cœurs physiques avec ses Intel(R) Xeon(R) CPU E5-2630 v3 @ 2.40GHz; dans la pratique, la machine est configurée en [hyperthreading](https://fr.wikipedia.org/wiki/Hyper-Threading), ce qui lui confère deux fois plus de cœurs de calculs logiques soit 32 cœurs (que l'on voit ainsi via `top` ou bien dans le fichier `/proc/cpuinfo`.
|
|
|
* avec 64 GB de mémoire partagée pour tous ces cœurs de calcul
|
|
|
|
|
|
Les autres machines du laboratoire sont également OpenMP bien sûr (`lpnatlas`, `lpnui`, etc.).
|
|
|
|
|
|
## Utiliser et spécifier les ressources en OpenMP ##
|
|
|
|
|
|
Pour accéder à ces ressources, une programmation [OpenMP](http://openmp.org) est requise. On consultera utilement les exemples du projet `pi_omp.c` et consorts par exemple.
|
|
|
|
|
|
La compilation d'un programme *OpenMP* nécessite des flags spécifiques (voir les manuels des compilateurs utilisés). Dans le cas d'un programme en `python`, il faut utiliser des librairies adhoc. En tout état de cause, on spécifiera en ligne de commande le nombre de cœurs dont on a besoin ainsi :
|
|
|
```bash
|
|
|
export OMP_NUM_THREADS=4
|
|
|
```
|
|
|
Par ailleurs, pour une machine [NUMA](https://en.wikipedia.org/wiki/Non-uniform_memory_access), qui physiquement possède plusieurs processeurs dont certains accèdent plus vite à certaines partie de la mémoire qu'à d'autre, il peut être utile de préciser une option d'[affinité](https://software.intel.com/en-us/articles/using-kmp-affinity-to-create-openmp-thread-mapping-to-os-proc-ids), demandant ainsi que les process soient exécutés sur des processeurs en particulier (et donc que le *scheduler* ne les balade pas de cœurs en cœurs), ce qui permet aussi de ne pas avoir accès à des données présent dans une mémoire éloignée du processeur d'exécution de la tâche. Par exemple :
|
|
|
```bash
|
|
|
export KMP_AFFINITY=physical,0
|
|
|
```
|
|
|
|
|
|
### Compilation C ###
|
|
|
#### Avec le compilateur GNU ####
|
|
|
Par exemple :
|
|
|
```gcc -O3 -lm -fopenmp pi_omp.c
|
|
|
```
|
|
|
#### Avec le compilateur Intel ####
|
|
|
```bash
|
|
|
icc -m64 -O3 -Wall -fPIC -ipo -msse4.2 -restrict -fargument-noalias-global -qopenmp pi_omp.c
|
|
|
```
|
|
|
### Python ###
|
|
|
*(à compléter...)*
|
|
|
|
|
|
### Et en shell ? ###
|
|
|
Il est aussi possible d'utiliser les ressources OpenMP d'une machine directement en `shell`. Soit en gérant les process à passer en tâche de fond, à la main. Soit par exemple en utilisant l'outil [`parallel`](http://www.gnu.org/software/parallel/), bien pratique.
|
|
|
|
|
|
Exemples :
|
|
|
En utilisant l'entrée standard de l'outil
|
|
|
```bash
|
|
|
ls * | parallel cksum {}
|
|
|
```
|
|
|
ou bien une boucle sur 3 fichiers avec des arguments
|
|
|
```bash
|
|
|
parallel mon_script fichier{}.txt ::: 0 1 2
|
|
|
```
|
|
|
|
|
|
## OpenMP ou MPI ? ## |