Il
s'agit d'exploiter les deux processeurs d'un nœud de calcul,
pour cela deux moyens :
Parallélisation
automatique par le compilateur.
Parallélisation
à l'aide de directives de compilation insérées
dans le code source.
Un
grand nombre de sous-programmes (BLAS level
3, FFT,...) de la librairie
Intel®
Math Kernel Library exploite le parallélisme, lire User
Notes
Positionner
la variable OMP_NUM_THREADS
:
[cros@gmfe3 Essai]$ export
OMP_NUM_THREADS=2
Pour réaliser
automatiquement ce positionnement lors des prochaines
connexions,
ajouter dans le fichier .bashrc
la ligne suivante : export
OMP_NUM_THREADS=2
Soit
le programme fortran 77 : test.f
Ce programme fait appel à
quatre sous-programmes ddot.f,
dgemv.f,
xerbla.f
et lsame.f
et utilise un fichier
de données test.dat.
Ce programme ouvre le fichier de données, effectue
quelques opérations et crée un fichier
(test.out)
contenant les impressions.
Parallélisation automatique :
Compilation
en ajoutant les options -static -parallel
-par_threshold0 :
ifort
-static -parallel -par_threshold0
test.f $MKLPATH/libmkl_lapack.a
$MKLPATH/libmkl_ia32.a -o
test_omp
[cros@gmfe3 Essai]$ ifort -static
-parallel -par_threshold0 test.f
$MKLPATH/libmkl_lapack.a
$MKLPATH/libmkl_p4.a -o test_omp
program TEST
test.f(34)
: (col. 0) remark: LOOP WAS AUTO-PARALLELIZED.
test.f(39) :
(col. 0) remark: LOOP WAS AUTO-PARALLELIZED.
62 Lines Compiled
Compilation
en ajoutant l'option -par_report3
pour avoir un rapport détaillé sur la parallélisation
:
ifort -static -parallel
-par_threshold0 -par_report3 test.f
$MKLPATH/libmkl_lapack.a
$MKLPATH/libmkl_ia32.a -o
test_omp
[cros@gmfe3 Essai]$ ifort -static
-parallel -par_threshold0 -par_report3 test.f
$MKLPATH/libmkl_lapack.a
$MKLPATH/libmkl_ia32.a -o test_omp
program
TEST
procedure: test
test.f(34) : (col. 0) remark: LOOP WAS
AUTO-PARALLELIZED.
parallel loop: line 34
shared: {"a",
"b"}
private: {"i"}
first private: {
}
reductions: { }
test.f(39) : (col. 0) remark: LOOP WAS
AUTO-PARALLELIZED.
parallel loop: line 39
shared:
{"d"}
private: {"i"}
first private: {
}
reductions: { }
62 Lines Compiled
Script-shell
minimal permettant d'exécuter ce job :
Peu de différence
par rapport au script d'un job séquentiel :
#PBS -l
nodes=1:ppn=2
export
OMP_NUM_THREADS=2
Cas
d'un code faisant peu d'I/O, utilisation du /home
sur le frontal :
run_test_openmp_home.sh
Cas
d'un code faisant beaucoup d'I/O, utilisation du /scratch
sur les nœuds :
run_test_openmp_scratch.sh
Parallélisation à l'aide de directives de compilation :
Le
source du programme est modifié par l'ajout de directives de
compilation
(lignes commençant par !$OMP
pour les sources Fortran) autour de certaines
zones
(boucles,...) : test_openmp.f
Compilation
en ajoutant les options -static -openmp
-fpp (appel du préprocesseur
pour interpréter
les directives) :
ifort -static
-openmp -fpp test_openmp.f
$MKLPATH/libmkl_lapack.a
$MKLPATH/libmkl_ia32.a -o test_omp
[cros@gmfe3
Essai]$ ifort -static -openmp -fpp test_openmp.f
$MKLPATH/libmkl_lapack.a $MKLPATH/libmkl_ia32.a -o
test_omp
program TEST
test_openmp.f(35) : (col.
0) remark: OpenMP DEFINED REGION WAS PARALLELIZED.
69 Lines
Compiled
Le script-shell minimal permettant d'exécuter ce job est identique à celui du paragraphe précèdent.
Cas
d'un code faisant peu d'I/O, utilisation du /home
sur le frontal :
run_test_openmp_home.sh
Cas
d'un code faisant beaucoup d'I/O, utilisation du /scratch
sur les nœuds :
run_test_openmp_scratch.sh
Page maintenue par Jean-Michel CROS (enseignant-chercheur).