I. Hrivnacova, IPN Orsay
Séminaire sur le calcul parallèle et GPU, 20 December 2013, IPN Orsay
PROOF
● PROOF = The Parallel ROOT Facility
● An extension of ROOT enabling interactive analysis of large sets of ROOT files in parallel on clusters of computers or many-core machines.
● More generally PROOF can parallelize tasks that can be formulated as a set of independent sub-tasks
● PROOF for TSelector based analysis:
● Start analysis locally ("client"),
● PROOF distributes data and code,
● Lets CPUs ("workers") run the analysis,
● Collects and combines (merges) data,
● Shows analysis results locally
Séminaire sur le calcul parallèle et GPU,20 December 2013, IPN Orsay 3
With courtesy of Bertrand Bellenot, Axel Naumann, CERN
Séminaire sur le calcul parallèle et GPU,20 December 2013, IPN Orsay 4
With courtesy of Bertrand Bellenot, Axel Naumann, CERN
TSelector & PROOF
● To be able to perform event-level parallelism, PROOF needs to be in charge of the event-loop;
● This is provided by the Selector framework, defined by the abstract class TSelector with methods
● Begin() - called on the client only
● SlaveBegin() - called on each worker (create histograms)
● Process() - do event analysis
● SlaveTerminate() - rarely used; post processing of partial results before they are sent to master and merged
● Terminate() - runs on the client: save results, display histograms, ...
Séminaire sur le calcul parallèle et GPU,20 December 2013, IPN Orsay 6
With courtesy of Bertrand Bellenot, Axel Naumann, CERN
Documentation
● “Formation ROOT” in February 2012 at IPN Orsay:
● http://ipnwiki.in2p3.fr/ipnsii/index.php/Formation_ROOT_2012
● Root documentation:
● http://root.cern.ch/drupal/content/proof
Christophe DIARRA Séminaire sur le calcul parallèle et GPU IPNO - 20/12/2013 diarra@ipno.in2p3.fr
C’est un ensemble de ressources
informatiques distribuées géographiquement , reliées à Internet et interagissant via un middleware (intergiciel)
Les ressources sont : les CPU, le stockage, les logiciels
Le matériel informatique est hétérogène et géré de façon décentralisée
Grace au middleware les utilisateurs disposent d’un supercalculateur virtuel
La grille facilite la mutualisation des
ressources et la collaboration scientifique
2001-2010 : projets européens sur les grilles
European DataGrid (EDG)
Enabling Grids for E-SciencE (EGEE)
Buts : Créer une grille européenne pour la communauté scientifique
Avril 2010 : fin EGEE début EGI
S’appuie sur les NGI (National Grid Initiative)
En France la NGI (GIS France Grilles) est pilotée par l’Institut des Grilles et du Cloud du CNRS
Buts : pérenniser l’infrastructure de grille en Europe
EGI comporte 37 NGI + CERN
EGI fournit le middleware EMI (european middleware initiative)
LCG est la plus grande grille de production au monde (300K CPU, 200 PB disk et 100PB tape, +1M jobs/jour)
Le middleware EMI comprend :
Un système d’autorisation et d’authentification
Un système de gestion de jobs
Un système de gestion des données
Un système d’information
Un système d’accounting (comptabilité)
Un système de monitoring (supervision)
Il faut posséder un certificat électronique
S’inscrire dans une Organisation Virtuelle
Une VO (Virtual Organization) est une
communauté d’utilisateurs ayant des intérêts communs et qui utilisent la grille pour
collaborer et partager des ressources
Se servir des utilitaires ou outils (fournis) pour transférer des données
Soumettre un job (traitement par lot) pour pour faire tourner un code de calcul
6 Authentification
Autorisation Accounting Workload Management
System (WMS) Information System
User Interface
Worker Nodes Computing
Element
Soumission job + suivi et
récupération résultat
Logging &
Bookeeping (LB)
Demande status
Information sur le CE, SE
Storage Element
File Replica Metadata Catalog
Information sur la localisation des
données Informations publiées par les services CE, SE,
…
Soumission job et récupération résultat
Données d’auth.
& d’autorisation
La grille avec 2 clusters distincts:
CE ipngrid04: >800 cores
CE ipngrid12: 496 cores avec MPI/IB
2 SE : DPM (17 TB), xrootd (>300 TB pour ALICE)
2 UI: ipngrid01 et ipngrid02
Calcul interactif : sur ipngrid01 (32 cores) + 3GPUs NVIDIA M2090
Compilateurs/Logiciels: CUDA, Compilateurs
Intel/MKL, PGI/ACML, Matlab, Mathematica, NAG
~30 utilisateurs locaux (RC, PACS/MURE, PANDA, Physique Théorique, AUGER, Instrumentation, …)
NB: ressources GRIF disponibles aussi (12K cores, 4PB)
JDL :
$ cat hello.jdl
Executable = "/bin/echo";
Arguments = "Hello World";
StdOutput = "std.out";
StdError = "std.err";
OutputSandbox = {"std.out","std.err"};
Requirements = RegExp("ipngrid04.in2p3.fr.*ipno$",other.GlueCEUniqueID);
voms-proxy-init --voms vo.ipno.in2p3.fr --valid 24:0
glite-wms-job-submit -a -o jid hello.jdl
glite-wms-job-status -i jid
glite-wms-job-output -i jid
8
https://ipngridwiki.in2p3.fr
http://www.egi.eu
http://lcg.web.cern.ch/lcg/
http://public.web.cern.ch/public/
http://grif.fr
http://www.gridcafe.org/index.html
Christophe DIARRA Séminaire sur le calcul parallèle et GPU
IPNO - 20/12/2013 diarra@ipno.in2p3.fr
C’est un standard industriel qui permet de la la parallélisation multi-tâches/multi-threads dans un contexte de mémoire partagée
OpenMP propose une API pour C/C++, Fortran avec:
Des directives du compilateurs
Des bibliothèques
Des variables d’environnement
Le parallélisme est explicite mais la communication inter-tâches est gérée par le compilateur
OpenMP ne sait :
Gérer la mémoire distribuée
Gérer les I/O parallèles dans un même fichier (pas de garantie du résultat)
Détecter les problèmes de dépendances des données, d’accès concurrents, de deadlocks, de conflits entre données
Peu de directives au total
Possibilité de paralléliser avec 3 ou 4 directives
Facilité d’utilisation:
parallélisation incrémentale à la différence de MPI
Même* code source pour la version parallèle et série
(*) Moyenanant quelques directives du préprocesseur
Un programme OpenMP est exécuté par un processus unique qui active des threads à l’entrée d’une région parallèle
OpenMP utilise le modèle Fork – Join
4
Forme générale:
sentinelle directive [clause, ...]
Exemples:
Fortran: !$OMP PARALLEL DEFAULT(SHARED) PRIVATE(BETA,PI)
C/C++: #pragma omp parallel default(shared) private(beta,pi)
N.B.: sentinelles acceptés en Fortran
en free form source fortran: !$OMP
en fixed form source fortran: !$OMP, C$OMP,
*$OMP en colonne 1
Lors d’une compilation sans OpenMP, les
lignes de directives sont traitées comme des lignes de commentaires.
En Fortran:
!$OMP directive
[ structured block of code ]
!$OMP end directive
En C/C++:
#pragma directive
[ structured block of code ]
NB: En C le bloc est délimité par ‘{}’ sauf s’il est implicite (ex: après un ‘#pragma omp for’)
Une région parallèlle est un bloc de code exécuté par plusieurs threads
Fortran !$OMP PARALLEL [clause ...]
IF (scalar_logical_expression) PRIVATE (list)
SHARED (list)
DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE) FIRSTPRIVATE (list)
REDUCTION (operator: list) COPYIN (list)
NUM_THREADS (scalar-integer-expression) block
!$OMP END PARALLEL
C/C++ #pragma omp parallel [clause ...] newline if (scalar_expression)
private (list) shared (list)
default (shared | none) firstprivate (list)
reduction (operator: list) copyin (list)
num_threads (integer-expression) structured_block
Parallélisation de boucles (DO/for)
Création de sections (pour les blocs de code indépendants) : SECTIONS
Exécution : exécution mono-thread (SINGLE)
PROGRAM DOT_PRODUCT
INTEGER N, CHUNKSIZE, CHUNK, I PARAMETER (N=100)
PARAMETER (CHUNKSIZE=10) REAL A(N), B(N), RESULT
! Some initializations DO I = 1, N
A(I) = I * 1.0 B(I) = I * 2.0 ENDDO
RESULT= 0.0
CHUNK = CHUNKSIZE
!$OMP PARALLEL DO
!$OMP& DEFAULT(SHARED) PRIVATE(I)
!$OMP& SCHEDULE(STATIC,CHUNK)
!$OMP& REDUCTION(+:RESULT) DO I = 1, N
RESULT = RESULT + (A(I) * B(I)) ENDDO
!$OMP END PARALLEL DO
PRINT *, 'Final Result= ', RESULT END
#include <omp.h>
main () {
int i, n, chunk;
float a[100], b[100], result;
/* Some initializations */
n = 100;
chunk = 10;
result = 0.0;
for (i=0; i < n; i++) {
a[i] = i * 1.0;
b[i] = i * 2.0;
}
#pragma omp parallel for \ default(shared) private(i) \ schedule(static,chunk) \ reduction(+:result)
for (i=0; i < n; i++)
result = result + (a[i] * b[i]);
printf("Final result= %f\n",result);
}
BARRIER: synchronise tous les threads du groupe
MASTER: restreint l’exécution d’un bloc de code au master thread. Les autres thread continuent leur exécution après cette
section. Donc synchroniser si nécessaire avec BARRIER.
CRITICAL: un seul thread peut s’exécuter à la fois
ATOMIC: lecture+modification+écriture atomique
Pour pouvoir utiliser la biblothèque OpenMP:
Compilation GNU:
gcc –fopenmp –o prog prog.c
gfortran –fopenmp –o prog prog.f
Compilation Intel:
icc –openmp –o prog prog.c
ifort –openmp –o prog prog.f
setenv OMP_NUM_THREADS 8
./prog
Fortran C/C++
INTEGER FUNCTION OMP_GET_NUM_THREADS() ou
USE OMP_LIB
…
NBTHREADS = OMP_GET_NUM_THREADS()
#include <omp.h>
…
nbthreads=omp_get_num_threads();