Académique Documents
Professionnel Documents
Culture Documents
Olivier Pironneau1
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
1 / 118-op
Outline I
1 Leçon 1 : Architecture des machines
Principes
Les environnements de travail
Machines Parallèles
2 Leçon 2: architectures parallèles
Les logiciels
Un exemple facile a paralléliser
Le code C
3 Leçon 3: Parallélisation avec openMP
Principes de openMP
Exemples et syntaxes
Analyse de edostochOMP.c
Plus d’exemple et de mots clés en OpenMP
Exemple 2: EDP-1d en éléments finis
Discretisation par Elements Finis P 1
Parallélisation en OpenMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
2 / 118-op
Outline II
Le code vanilafem.c
4 Leçon 4: Message Passing Interface
Historique et résumé
Parallélisation mémoire distribuée en MPI
5 Leçon 5: UPC: Unified Parallel C
UPC de Berkeley
6 Leçon 6: Les GPU, CUDA et openCL
Historique
Portabilité: openCL
openCL sur Mac
7 Leçon 7: Les outils du calcul parallèle
le partitionneur Metis pour les Maillages non-structurées
Integration les compilateurs dans Eclipse
Bibliothèques pour le calcul parallèle
PetSc
8 Leçon 8: les algorithmes du calcul parallèle
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
3 / 118-op
Outline III
Méthodes de Schwarz
Méthode de Schur
Méthodes Lagrangienne et Mortier-Joint
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
4 / 118-op
La machine de von Neumann
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
6 / 118-op
Hiérarchisation des mémoires
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE
- UPC - CUDA
9 / 118-op
CBLAS memento
Level 1 BLAS
dim scalar vector vector scalars 5-element array prexes
SUBROUTINE xROTG ( A, B, C, S ) Generate plane rotation S, D
SUBROUTINE xROTMG( D1, D2, A, B, PARAM ) Generate modied plane rotation S, D
SUBROUTINE xROT ( N, X, INCX, Y, INCY, C, S ) Apply plane rotation S, D
SUBROUTINE xROTM ( N, X, INCX, Y, INCY, PARAM ) Apply modied plane rotation S, D
SUBROUTINE xSWAP ( N, X, INCX, Y, INCY ) x$y S, D, C, Z
SUBROUTINE xSCAL ( N, ALPHA, X, INCX ) x x S, D, C, Z, CS, ZD
SUBROUTINE xCOPY ( N, X, INCX, Y, INCY ) y x S, D, C, Z
SUBROUTINE xAXPY ( N, ALPHA, X, INCX, Y, INCY ) y x + y S, D, C, Z
FUNCTION xDOT ( N, X, INCX, Y, INCY ) dot xT y S, D, DS
FUNCTION xDOTU ( N, X, INCX, Y, INCY ) dot xT y C, Z
FUNCTION xDOTC ( N, X, INCX, Y, INCY ) dot xH y C, Z
FUNCTION xxDOT ( N, X, INCX, Y, INCY ) dot + xT y SDS
FUNCTION xNRM2 ( N, X, INCX ) nrm2 jjxjj2 S, D, SC, DZ
FUNCTION xASUM ( N, X, INCX ) asum jjre(x)jj1 + jjim(x)jj1 S, D, SC, DZ
FUNCTION IxAMAX( N, X, INCX ) amax 1st k 3 jre(xk )j + jim(xk )j S, D, C, Z
= max(jre(xi)j + jim(xi)j)
Level 2 BLAS
options dim b-width scalar matrix vector scalar vector
xGEMV ( TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y; y AT x + y; y AH x + y; A m n S, D, C, Z
xGBMV ( TRANS, M, N, KL, KU, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y; y AT x + y; y AH x + y; A m n S, D, C, Z
xHEMV ( UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y C, Z
xHBMV ( UPLO, N, K, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y C, Z
xHPMV ( UPLO, N, ALPHA, AP, X, INCX, BETA, Y, INCY ) y Ax + y C, Z
xSYMV ( UPLO, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y S, D
xSBMV ( UPLO, N, K, ALPHA, A, LDA, X, INCX, BETA, Y, INCY ) y Ax + y S, D
xSPMV ( UPLO, N, ALPHA, AP, X, INCX, BETA, Y, INCY ) y Ax + y S, D
xTRMV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX ) x Ax; x AT x; x AH x S, D, C, Z
xTBMV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX ) x Ax; x AT x; x AH x S, D, C, Z
xTPMV ( UPLO, TRANS, DIAG, N, AP, X, INCX ) x Ax; x AT x; x AH x S, D, C, Z
xTRSV ( UPLO, TRANS, DIAG, N, A, LDA, X, INCX ) x A 1 x; x A T x; x A H x S, D, C, Z
xTBSV ( UPLO, TRANS, DIAG, N, K, A, LDA, X, INCX ) x A 1 x; x A T x; x A H x S, D, C, Z
xTPSV ( UPLO, TRANS, DIAG, N, AP, X, INCX ) x A 1 x; x A T x; x A H x S, D, C, Z
options dim scalar vector vector matrix
xGER ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA ) A xyT + A; A m n S, D
xGERU ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA ) A xyT + A; A m n C, Z
xGERC ( M, N, ALPHA, X, INCX, Y, INCY, A, LDA ) A xyH + A; A m n C, Z
xHER ( UPLO, N, ALPHA, X, INCX, A, LDA ) A xxH + A C, Z
xHPR ( UPLO, N, ALPHA, X, INCX, AP ) A xxH + A C, Z
xHER2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA ) A xyH + y(x)H + A C, Z
xHPR2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, AP ) A xyH + y(x)H + A C, Z
xSYR ( UPLO, N, ALPHA, X, INCX, A, LDA ) A xxT + A S, D
xSPR ( UPLO, N, ALPHA, X, INCX, AP ) A xxT + A S, D
xSYR2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, A, LDA ) A xyT + yxT + A S, D
xSPR2 ( UPLO, N, ALPHA, X, INCX, Y, INCY, AP ) A xyT + yxT + A S, D
Level 3 BLAS
options dim scalar matrix matrix scalar matrix
xGEMM ( TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) C op(A)op(B) + C; op(X ) = X; X T ; X H ; C m n S, D, C, Z
xSYMM ( SIDE, UPLO, M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) C AB + C; C BA + C; C m n; A = AT S, D, C, Z
xHEMM ( SIDE, UPLO, M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) C AB + C; C BA + C; C m n; A = AH C, Z
xSYRK ( UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC ) C AAT + C; C AT A + C; C n n S, D, C, Z
xHERK ( UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC ) C AAH + C; C AH A + C; C n n C, Z
xSYR2K( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) C ABT + BAT + C; C AT B + BT A + C; C n n S, D, C, Z
xHER2K( UPLO, TRANS, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC ) C ABH + BAH + C; C AH B + BH A + C; C n n C, Z
xTRMM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB ) B op(A)B; B Bop(A); op(A) = A; AT ; AH ; B m n S, D, C, Z
xTRSM ( SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB ) B op(A 1 )B; B Bop(A 1 ); op(A) = A; AT ; AH ; B m n S, D, C, Z
2
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -10
CUDA
/ 118-op
CBLAS
for(int iter=0;iter<n;iter++) {
atimesx(A,x,grad); // externe pour grad=Ax
cblas_daxpy( n,-1,f,1,grad,1); // grad[i] -= f[i];
double norm2min; // normg2 = scal(grad,grad)
double normg2 = cblas_ddot(n,grad,1,grad,1);
if(!iter) norm2min = normg2*1.0e-8;
if(normg2<norm2min) break;
double gamma = normg2/normg2old;
cblas_dscal(n,gamma,h,1); //h[i] = gamma*h[i]-grad[i]
cblas_daxpy( n, -1., grad,1, h, 1); h[0]=0;
double rho = cblas_ddot(n,h,1,grad,1); //rho=scal(h,grad)
atimesx(A,h,grad);
rho /= cblas_ddot(n,h,1,grad,1); //rho /= scal(h,grad)
cblas_daxpy( n, -rho, h,1, x, 1); // x[i] -= rho*h[i];
}
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -13
CUDA
/ 118-op
L’outil linux ubuntu
Dans l’ensemble les pro du calcul travaillent sous unix: l’accès aux
bibliothèques y est plus simple. L’OS Mac est construit sur un Berkeley
unix. Donc pas la peine de mettre ubuntu.
Sur PC le plus simple est d’installer ubuntu avec wubi, une application
windows qui met ubuntu dans un dossier distinct et sans partitionner le
disque (donc pas de danger pour Windows). Réserver 12Go de disque
au moins.
Installer la 9.04 sur XP (9.10+XP=pb de veille) ou la 9.10 sur
vista/7.
Ouvrir une fenêtre terminal dans ubuntu et taper g++ puis faire ce
qui est demandé (sudo install...)
idem en tapant javac (installer le jdk)
idem en tapant mpicc (installer openmpi)
idem en tapant gnuplot (installer le gnuplot-x11)
Télécharger avec le firefox de ubuntu la version Galileo de
Eclipse C++, de-zipper et tester (voir plus bas).
Vous avez maintenant les outils pour le C++, l’openMP, le MPI.
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -14
CUDA
/ 118-op
L’environnement de travail Eclipse (I)
Eclipse est très populaire en entreprise. Pour tester un programme:
créer un projet par le menu file/new C++ project. Choisir Hello world
C++Project Nommer le projet; faire next plutot que finish.
Puis cliquer sur le marteau puis sur la flèche blanche dans le rond vert
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -15
CUDA
/ 118-op
L’environnement de travail Eclipse (II)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -16
CUDA
/ 118-op
Première séance de TD
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -21
CUDA
/ 118-op
Multiprocesseurs
Mémoires partagées
Mémoires distribuées
SIMD - MIMD
Cartes mères multi-cœurs et multi-processeurs
GPU
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -23
CUDA
/ 118-op
Les Ordinateurs disponibles
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -24
CUDA
/ 118-op
Les outils Middleware (intergiciels!)
openMP
MPI (openMPI et MPICH2)
Globus et mpich-G
upc-Berkeley, chapel
CUDA, openCL
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -25
CUDA
/ 118-op
Exemple 1. Calcul d’une option en finance
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -26
CUDA
/ 118-op
edostoch.c(I)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -27
CUDA
/ 118-op
edostoch.c (II)
int main(int argc, char* argv[]){
const double K=110, S0=100;
const int kmax=20000; // nb de realisations
const double T=1., r=0.03, sigma=0.2;
double dt=T/M, sdt, rdt, P0=0;
double time0=CPUtime();
sdt =sigma*sqrt(dt);
rdt = r*dt; srand(time(NULL));
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -31
CUDA
/ 118-op
openMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -32
CUDA
/ 118-op
Hello world
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -33
CUDA
/ 118-op
Principales commandes
chaque thread a son ‘a‘ mais ‘b‘ est le meme pour tous
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -34
CUDA
/ 118-op
Concepts
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -35
CUDA
/ 118-op
Loi de Amdhal
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -37
CUDA
/ 118-op
edostochOMP.c II
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -38
CUDA
/ 118-op
Produit Matrice Vecteur (Juvigny) I
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -39
CUDA
/ 118-op
Produit Matrice Vecteur (Juvigny) II
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -40
CUDA
/ 118-op
Produit Matrice Vecteur (Juvigny) III
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -41
CUDA
/ 118-op
Exercices pour le TD
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -42
CUDA
/ 118-op
Equation de la chaleur
2h h 2κ κ
Bii = , Bi,i−1 = Bi,i+1 = , Aii = , Ai,i−1 = Ai,i+1 = −
δt δt h h
A priori le système tridiagonal pourU m+1 is résolu par factorisation de
Gauss (A = LU) . La parallélisation de la méthode du gradient conjugé
est beaucoup plus simple mais dans un premier temps on étudie
l’implémentation LU.
Ci dessous le programme pour Black-Scholes:
σ2x 2
∂t u + ru − rx∂x u − ∂xx u = 0, u(t = 0) = max(K − x, 0)
2
If there is a low-barrier then u = 0 at xm ; u = 0 at xM anyway but if xM is not large
compare to K then it is an up-barrier. L’exercice va consister à mettre des directives
openMP dans le code, essentiellement en parallélisant toutes les boucles for.
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -44
CUDA
/ 118-op
Le code vanilafem.c (I)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -45
CUDA
/ 118-op
Le code vanilafem.c (II)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -46
CUDA
/ 118-op
Le code vanilafem.c (III)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -47
CUDA
/ 118-op
Le code vanilafem.c (IV)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -48
CUDA
/ 118-op
Le code vanilafem.c (V)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -49
CUDA
/ 118-op
Outline I
1 Leçon 1 : Architecture des machines
Principes
Les environnements de travail
Machines Parallèles
2 Leçon 2: architectures parallèles
Les logiciels
Un exemple facile a paralléliser
Le code C
3 Leçon 3: Parallélisation avec openMP
Principes de openMP
Exemples et syntaxes
Analyse de edostochOMP.c
Plus d’exemple et de mots clés en OpenMP
Exemple 2: EDP-1d en éléments finis
Discretisation par Elements Finis P 1
Parallélisation en OpenMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -50
CUDA
/ 118-op
Outline II
Le code vanilafem.c
4 Leçon 4: Message Passing Interface
Historique et résumé
Parallélisation mémoire distribuée en MPI
5 Leçon 5: UPC: Unified Parallel C
UPC de Berkeley
6 Leçon 6: Les GPU, CUDA et openCL
Historique
Portabilité: openCL
openCL sur Mac
7 Leçon 7: Les outils du calcul parallèle
le partitionneur Metis pour les Maillages non-structurées
Integration les compilateurs dans Eclipse
Bibliothèques pour le calcul parallèle
PetSc
8 Leçon 8: les algorithmes du calcul parallèle
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -51
CUDA
/ 118-op
Outline III
Méthodes de Schwarz
Méthode de Schur
Méthodes Lagrangienne et Mortier-Joint
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -52
CUDA
/ 118-op
Présentation de MPI
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -53
CUDA
/ 118-op
Le Hello World de MPI
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -54
CUDA
/ 118-op
Produit matrice vecteur
On exploite le fait que A est tridiagonal:
si {xi }iiMm −1 est dans un banc mémoire p
Axi = ai xi−1 + bi xi + ci xi+1 demande la reception de
xim −1 et de xiM des bancs mémoires p − 1 et p + 1.
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -55
CUDA
/ 118-op
Produit scalaire
Chaque proc fait sa part de boucle puis les resultats sont aditionnés
dans le proc 0 et le résultat est renvoyé a tous les procs.
double Option::scal (const Vector& v1,const Vector& v2){
double S,s=0;
for(int i=im1; i<iM1;i++)
s += v1[i] * v2[i];
MPI_Barrier(MPI_COMM_WORLD);
MPI_Reduce(&s, &S, 1, MPI_DOUBLE, MPI_SUM,0,MPI_COMM_WORLD);
MPI_Bcast(&S, 1, MPI_DOUBLE,0, MPI_COMM_WORLD);
return S;
}
Noter que la mémoire n’est pas optimisée et qu’il faudrait decaller les
indices et accéder à v [i − im1].
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -56
CUDA
/ 118-op
La fonction principale (I)
Le C++ de la fonction qui calcul l’option:
void Option::calc() {
const double dt=m.T/m.nT;
int argc; char **argv; MPI_Status status;
MPI_Init (&argc, &argv); /* starts MPI */
MPI_Comm_rank (MPI_COMM_WORLD, &p); /* get current process id */
MPI_Comm_size (MPI_COMM_WORLD, &P); /* get number of processes */
im=(m.nX*p)/P, iM = (m.nX*(p+1))/P;
im1 = (im==0)?1:im, iM1 = (iM==m.nX)?m.nX-1:iM;
for (int i=im1; i<iM1; i++) {
double hi = m.x[i]-m.x[i-1], hi1 = m.x[i+1]-m.x[i];
double xss = m.x[i]*sigma*sigma; // FEM tridiag matrix:
bm[i] =(hi+hi1)*(1./3 +dt*(m.x[i]*xss/hi/hi1+r)/2);
am[i] = hi/6 - dt*m.x[i]*(xss/hi - r)/2;
cm[i] = hi1/6- dt*m.x[i]*(xss/hi1 + r)/2;
}
for (int i=im; i<iM; i++)
uold[i] = u0(m.x[i]);
MPI_Barrier(MPI_COMM_WORLD);
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -57
CUDA
/ 118-op
La fonction principale (II)
for (int j=1; j<m.nT; j++) { \\ time loop
if(p!=0){
MPI_Send(&(uold[im]),1,MPI_DOUBLE, p-1,0, MPI_COMM_WORLD);
MPI_Recv(&(uold[im-1]),1,MPI_DOUBLE,p-1,0,MPI_COMM_WORLD,&s);
} if(p!=P-1){
MPI_Send(&(uold[iM-1]),1,MPI_DOUBLE, p+1,0, MPI_COMM_WORLD);
MPI_Recv(&(uold[iM]),1,MPI_DOUBLE,p+1,0,MPI_COMM_WORLD,&s);
}
for (int i=im1; i<iM1; i++) {
double hi = m.x[i]-m.x[i-1], hi1 = m.x[i+1]-m.x[i];
w[i]=(hi+hi1)*uold[i]/3+(hi*uold[i-1]+hi1*uold[i+1])/6;
}
u[m.nX-1]=0; u[0]=uold[0]*exp(-r*dt); // C.L.
double h1 = m.x[1]-m.x[0];
w[1]-=uold[0]*(h1/6-dt*m.x[1]*(m.x[1]*sigma*sigma/h1-r)/2);
MPI_Barrier(MPI_COMM_WORLD);
gradconj(am,bm,cm,w);
for (int i=im1; i<iM1; i++) uold[i]=w[i];
} MPI_Finalize(); }
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -61
CUDA
/ 118-op
Présentation de UPC
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -62
CUDA
/ 118-op
Organisation mémoire
#define J 200000
#define N J*THREADS
shared double a[N], b[N];
shared double sum;
int main(){
int j;
double localSum=0;
for(j=0;j<J;j++){ a[j] =1; b[j] =1e-8;} // initialisation
for(j=0;j<J;j++)
localSum += a[j] + b[j] ;
sum += localSum; // not scalable
upc_barrier;
if(MYTHREAD==0)
printf("sum = %f \n", sum);
return 0;
}
int main(){
int j;
double localSum=0;
for(j=0;j<J;j++){ a[j] =1; b[j] =1e-8;} // initialisation
for(j=0;j<J;j++)
localSum += a[j] + b[j] ;
upc_barrier;
double sum = bupc_allv_reduce(double, localSum, 0, UPC_ADD);
if(MYTHREAD==0)
printf("sum = %f \n", sum );
return 0;
}
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -68
CUDA
/ 118-op
Locks
Notez la séquence
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -69
CUDA
/ 118-op
Exemple:vanilafem.upc (I)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -70
CUDA
/ 118-op
Exemple: vanilafem.upc (II)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -71
CUDA
/ 118-op
Exemple 2(0): vanilafem.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -72
CUDA
/ 118-op
Exemple 2(I): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -73
CUDA
/ 118-op
Exemple 2(II): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -74
CUDA
/ 118-op
Exemple 2(III): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -75
CUDA
/ 118-op
Exemple 2(IV): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -76
CUDA
/ 118-op
Exemple 2(V): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -77
CUDA
/ 118-op
Exemple 2(V): vanilafem2.upc
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -78
CUDA
/ 118-op
Exercices pour le TD
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -79
CUDA
/ 118-op
Outline I
1 Leçon 1 : Architecture des machines
Principes
Les environnements de travail
Machines Parallèles
2 Leçon 2: architectures parallèles
Les logiciels
Un exemple facile a paralléliser
Le code C
3 Leçon 3: Parallélisation avec openMP
Principes de openMP
Exemples et syntaxes
Analyse de edostochOMP.c
Plus d’exemple et de mots clés en OpenMP
Exemple 2: EDP-1d en éléments finis
Discretisation par Elements Finis P 1
Parallélisation en OpenMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -80
CUDA
/ 118-op
Outline II
Le code vanilafem.c
4 Leçon 4: Message Passing Interface
Historique et résumé
Parallélisation mémoire distribuée en MPI
5 Leçon 5: UPC: Unified Parallel C
UPC de Berkeley
6 Leçon 6: Les GPU, CUDA et openCL
Historique
Portabilité: openCL
openCL sur Mac
7 Leçon 7: Les outils du calcul parallèle
le partitionneur Metis pour les Maillages non-structurées
Integration les compilateurs dans Eclipse
Bibliothèques pour le calcul parallèle
PetSc
8 Leçon 8: les algorithmes du calcul parallèle
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -81
CUDA
/ 118-op
Outline III
Méthodes de Schwarz
Méthode de Schur
Méthodes Lagrangienne et Mortier-Joint
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -82
CUDA
/ 118-op
Graphic Processor Units
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -83
CUDA
/ 118-op
Comparaison de performance sur edostoch.c
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -84
CUDA
/ 118-op
Le Modèle de mémoires de Nvidia (I)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -85
CUDA
/ 118-op
Le Modèle de mémoires de Nvidia (II)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -86
CUDA
/ 118-op
Le Modèle de mémoires de Nvidia (III)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -87
CUDA
/ 118-op
Programmation en CUDA
Nous allons ecrire un priceur d’option put basé sur la formule
√ N
(r − 21 σ 2 )T +σ T N n (0,1) e−rT X
STn = S0 e , PT = (K − STn )+
N
n=1
Le plus simple est d’utiliser un Mac avec une carte Nvidia. On peut
utiliser Xcode et meme Eclipse mais le plus simple est d’utiliser une
fenetre terminal.
Le site de Nvidia permet d’installer un binary tout pret dans
/usr/local/bin
Pour pointer sur le compilateur il faut faire export
PATH=/usr/local/cuda/bin:$PATH
export DYLD_LIBRARY_PATH
=/usr/local/cuda/lib:$DYLD_LIBRARY_PATH
Pour compiler il faut
nvcc -deviceemu BSCuda.cu
Pour lancer l’exécutable il faut ./a.out
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -89
CUDA
/ 118-op
Implémentation des formules (cf. BSCuda.cu)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -90
CUDA
/ 118-op
Transfer du CPU au GPU
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -91
CUDA
/ 118-op
Calcul dans le GPU
Preambule
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -93
CUDA
/ 118-op
Multiplication Matrice Vector (cf. testcublas.cu)
Utilisation de cblas
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -94
CUDA
/ 118-op
Préparation de l’appel d’une fonction cublas
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -95
CUDA
/ 118-op
Appel de la fonction de cublas
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -96
CUDA
/ 118-op
Gradient Conjugué cublas
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -98
CUDA
/ 118-op
Programmation en CUDA de la méthode de Jacobi (I)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC -99
CUDA
/ 118-op
Programmation en CUDA de la méthode de Jacobi (II)
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC100
- CUDA
/ 118-op
openCL sur Mac OSX 10.6
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC101
- CUDA
/ 118-op
HMPP et CAPS Entreprise
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC102
- CUDA
/ 118-op
Exercices pour le TD sur CUDA
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC103
- CUDA
/ 118-op
Outline I
1 Leçon 1 : Architecture des machines
Principes
Les environnements de travail
Machines Parallèles
2 Leçon 2: architectures parallèles
Les logiciels
Un exemple facile a paralléliser
Le code C
3 Leçon 3: Parallélisation avec openMP
Principes de openMP
Exemples et syntaxes
Analyse de edostochOMP.c
Plus d’exemple et de mots clés en OpenMP
Exemple 2: EDP-1d en éléments finis
Discretisation par Elements Finis P 1
Parallélisation en OpenMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC104
- CUDA
/ 118-op
Outline II
Le code vanilafem.c
4 Leçon 4: Message Passing Interface
Historique et résumé
Parallélisation mémoire distribuée en MPI
5 Leçon 5: UPC: Unified Parallel C
UPC de Berkeley
6 Leçon 6: Les GPU, CUDA et openCL
Historique
Portabilité: openCL
openCL sur Mac
7 Leçon 7: Les outils du calcul parallèle
le partitionneur Metis pour les Maillages non-structurées
Integration les compilateurs dans Eclipse
Bibliothèques pour le calcul parallèle
PetSc
8 Leçon 8: les algorithmes du calcul parallèle
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC105
- CUDA
/ 118-op
Outline III
Méthodes de Schwarz
Méthode de Schur
Méthodes Lagrangienne et Mortier-Joint
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC106
- CUDA
/ 118-op
Metis pour les methodes de sous domaine
6 1 6
1 2 3 7
2 4 6
2 6 3 3
2
4 5 6
5 6 3
7 4 2
. 1
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC107
- CUDA
/ 118-op
Metis: contenu des fichiers simpletest.txt
4
5
0 1
epart npart 6
B 0 0 C 7
B C
B 0 0 C
B C
B 1 1 C 3
2
B C
B 1 0 C
B C
B 1 1 C
B C
@ 0 1 A
. 0 1
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC108
- CUDA
/ 118-op
Eclipse et le calcul parallèle
Il faut installer les plug-ins PTP (Parallel Tools Plateform)
http://www.eclipse.org/ptp/docs/install.html (bien lire la doc)
openMP est dans gcc> 4.2, c.f. le plugin PTP
openMPI 1.2 est géré par eclipse/PTP mais il faut l’installer
(configure, make install, pas simple, marche pas sous cygwin)
Un plug-in UPC peut etre downloader pour PTP
http://wiki.eclipse.org/PTP/other_tools_setup
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC109
- CUDA
/ 118-op
PetSc
- Présentation
- Application a une méthode de sous-domaine avec gradient conjugué
- Une méthode de Scharwz
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC110
- CUDA
/ 118-op
Outline I
1 Leçon 1 : Architecture des machines
Principes
Les environnements de travail
Machines Parallèles
2 Leçon 2: architectures parallèles
Les logiciels
Un exemple facile a paralléliser
Le code C
3 Leçon 3: Parallélisation avec openMP
Principes de openMP
Exemples et syntaxes
Analyse de edostochOMP.c
Plus d’exemple et de mots clés en OpenMP
Exemple 2: EDP-1d en éléments finis
Discretisation par Elements Finis P 1
Parallélisation en OpenMP
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC111
- CUDA
/ 118-op
Outline II
Le code vanilafem.c
4 Leçon 4: Message Passing Interface
Historique et résumé
Parallélisation mémoire distribuée en MPI
5 Leçon 5: UPC: Unified Parallel C
UPC de Berkeley
6 Leçon 6: Les GPU, CUDA et openCL
Historique
Portabilité: openCL
openCL sur Mac
7 Leçon 7: Les outils du calcul parallèle
le partitionneur Metis pour les Maillages non-structurées
Integration les compilateurs dans Eclipse
Bibliothèques pour le calcul parallèle
PetSc
8 Leçon 8: les algorithmes du calcul parallèle
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC112
- CUDA
/ 118-op
Outline III
Méthodes de Schwarz
Méthode de Schur
Méthodes Lagrangienne et Mortier-Joint
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC113
- CUDA
/ 118-op
Méthode de Schwarz avec recouvrement
On décompose Ω = Ω1 ∪ Ω2 avec Ω1 ∩ Ω2 6= ∅:
1 Tant que |u1k − u2k |Ω1 ∩Ω2 > ,
2 calculer u1k +1 solution de l’EDP dans Ω1 avec u1k +1 = u2k sur Γ12
3 calculer u2k +1 solution de l’EDP dans Ω2 avec u2k +1 = u1k sur Γ21
4 dans Ω1 ∩ Ω2 set u k +1 = 12 [u1k +1 + u2k +1 ].
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC114
- CUDA
/ 118-op
Méthode de Schwarz sans recouvrement
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC115
- CUDA
/ 118-op
Méthode de Schur
Considerons le probleme d’algebre linéaire avec A ∈ Rn×n , b ∈ Rn :
Trouver x ∈ Rn tel que Ax = b
Soit une partition de A en 4 blocks A11 ∈ Rl×l , A12 ∈ Rl×(n−l) ,
A21 ∈ R(n−l)×l et A22 ∈ R(n−l)×(n−l) tel que:
11
A12
A
A= .
A21 A22
Soit b1 le vecteur des l premiere entrées de b et b2 le reste et de
même pour x. On a:
11
A12
1 1
A x b
=
A21 A22 x2 b2
−1
Si (A11 )−1 existe, alors x 1 = (A11 ) (b1 − A12 x 2 ), et
−1 12 −1 1
(A22 − A21 (A11 ) A )x 2 = b2 − A21 (A11 ) b
−1 12
La matrice A22 − A21 (A11 ) A est le complément de Schur de A.
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC116
- CUDA
/ 118-op
Une Méthode lagrangienne (I) Principe
−∆u = f in Ω, u|Γ = 0
∂u i
−∆u i = f in Ωi , u i |Γ = 0, |Σ = λ,
∂n
où nest une normale de Σ et où λ sera ajusté pour avoir u 1 = u 2 sur
Σ. Tout ceci se est équivalent à trouver
{u 1 , u 2 , λ} ∈ H 1 (Ω1 ) × H 1 (Ω2 ) × L2 (Σ) tel sque
i · ∇w dx + (−1)i 1
R R R
Ωi ∇u Σ λw = Ωi fw dx, ∀w ∈ H0 (Ω), i = 1, 2,
2 1 2
R
Σ (u − u )µ = 0, ∀µ ∈ L (Σ).
Olivier Pironneau (LJLL) Optimisation des performances et Parallélisme en C/C++ - openMP - MPI
MPE- UPC117
- CUDA
/ 118-op
Implémentation
Prenons des éléments finis de degré 1 pour u et 0 pour λ:
Trouver uh ∈ H0h et λh ∈ Lh tels que
i dx + (−1)i Σh λh wh = Ωhi fwh dx, ∀w ∈ H0h ,
R R R
Ωhi ∇uh · ∇wh R
2 1
Σh (uh − uh )µh = 0, ∀µh ∈ Lh ,
Le système linéaire généré:
11
0 B1
1 1
A U b
0 A22 B 2 U 2 = b2 .
B 1T B 2T 0 Λ 0
On note w i ∈ Hh et w̄ i ∈ L2 (Σ) les fonctions de base des 2 espaces,
U i les componsantes de uji et Λ = ((λk )). Alors
Z Z
kk i j k k
Aij = ∇w ∇w dx, Bij = (−1) w i w̄ j , k = 1, 2.
Ωhk Σh