Upload
others
View
5
Download
0
Embed Size (px)
Citation preview
Atelier JDEV 2017
Marseille 04 – 07 Juillet 2017
Parallélisme synchrone et asynchrone en calcul scientifique
Thierry Garcia & Pierre Spiteri
(1) IRIT – ENSEEIHT, UMR CNRS 5505, Toulouse – France (2) Li-PaRAD, Univ. Paris-Saclay-UVSQ, Versailles, France
2
1 – Domaine et modèle mathématiques
Dans la suite on ne considère que ce qui se passe sur Ω1 et Ω2 (i.e. sur Ω3 u3 = u2 )
3
- Pose Γ1,2 = Γ2∩ Ω1 & Γ1,3 = Γ3∩ Ω1 (frontières haut & bas) -
-
!
c1"u1
"t# div($1%u1) = f1(x, t), 0, tfinal] ]x&1
u1(x, y,t = 0) = u1,0 (x, y) C.I.u1 = 'imp , sur (1
u1 = g1, sur (1,2 (1,3U
#$1"u1
"n=
1R
(u1 # u1,cst ), sur (5
)
*
+ + + +
,
+ + + +
-
- Pose Γ2,2 = Γ2∩ Ω2 & Γ2,3 = Γ3∩ Ω2 (frontières haut & bas) -
!
!
c2"u2
"t# div($2%u2 ) = f2 (x,t), 0, tfinal] ]x&2
u2 (x, y,t = 0) = u2,0 (x, y) C.I.u2 = u1,'5
, sur '5 (condition transmission)
u2 = g2 , sur '2,2 U '2,3 u2 = g3, sur '6
(
)
* * * *
+
* * * *
4
2 – Discrétisation du problème 2 – 1 - Discrétisation spatiale
!
"2u"x2
#1.0$x(u(x +$x, y, z)% u(x, y, z)
$x%u(x, y, z)% u(x %$x, y, z)
$x)+O($x2 )
!
"2u"x2
#u(x +$x, y, z)% 2.u(x, y, z)+ u(x %$x, y, z)
$x2+O($x2 )
schémas différences finies
Remarque : même type de schéma pour les autres coordonnées spatiales Remarque : même type de schéma par discrétisation volumes finis ou éléments finis 2 – 1 - Discrétisation temporelle
!
"u(xi,t
n)
"t#u(x
i,t
n+1)$ u(x
i,t
n)
%t+ o(%t)
!
"t = TN
⇒ plusieurs choix possibles (explicites; implicite)
Schéma explicite : écriture du problème à l’instant t ⇒ équation de récurrence ⇒ peut être instable
⇒ Un+1 = δt Fn + (I - α A) Un
!
" = #$th2
(h = δx)
5
Remarque : pas de temps δt nécessairement petit sinon risque d’effet papillon Remarque : bien adapté au calcul sur GPU (très vectoriel)
Effet papillon (schéma instable)
6
Schéma implicite : écriture du problème à l’instant t+1 ⇒ résolution de systèmes linéaires ⇒ stable
⇒ (I + α A) Un+1 = δt Fn+1 + Un
!
" = #$th2
(h = δx)
Remarque : pas de temps δt quelconque et pas d’effet papillon Remarque : il existe une solution intermédiaire : schéma semi – implicite, en principe stable
7
Exemple : Discrétisation implicite de l’équation 1D exemple : discrétisation par différences finies de problèmes d’évolution (équation de la chaleur)
!
"u(x,t)"t
- a " 2u(x,t)"x 2
= f(x, t), p.p. sur 0,1[ ] x 0,T[ ], a > 0,
u(x,0) = u0(x), p.p. sur 0,1[ ]
u(0, t) = u(1, t) = 0, p.p. sur 0,T[ ]
#
$
% %
&
% %
exemple : schéma implicite : écriture de l’équation de la chaleur au point (xi,tn+1) qui conduit à la résolution d’une séquence de systèmes algébriques à chaque pas de temps
!
ui
n+1 " ui
n
#t " a ui+1
n+1 " 2ui
n+1 + ui"1
n+1
h 2= f
i
n+1 , 1$ i $ m, n % 0,
u0
n+1 = um+1
n+1 = 0, n % 0,u
i
0 = u0(ih),
&
'
( (
)
( (
⇒ (I + α A) Un+1 = δt Fn+1 + Un
!
" = a #th2
(h = δx)
8
Matrice de discrétisation 1 D : matrice tridiagonale
!
A =
2 "1"1 2 "1
. . .. . .. . .
. . .. 2 "1
"1 2
#
$
% % % % % % % % %
&
'
( ( ( ( ( ( ( ( (
et
!
F =
h 2 f1+ u
0
h 2 f2
.
.
.
.h 2 f
m"1
h 2 fm
+ um+1
#
$
% % % % % % % % %
&
'
( ( ( ( ( ( ( ( (
12
3 – Méthode de relaxation par blocs Prise en compte de la structure bloc de la matrice ⇔ nécessaire en calcul parallèle
!
Ai,iVi + Ai, jVjj"i
#
$ = Bi , i =1,..,# % Vi = Ai,i&1(Bi & Ai, jVj
j"i
#
$ )
α nombre de blocs méthode de Jacobi par blocs
!
Vi(p+1) = Ai,i
"1(Bi " Ai, jVj( p)
j#i
$
% ) = Fi,BJ (V ), i =1,..,$ méthode de Gauss – Seidel par blocs
!
Vi(p+1) = Ai,i
"1(Bi " Ai, jVj( p+1) " Ai, jVj
( p)
j=i+1
#
$j=1
i"1$ ) = Fi,GS (V ), i =1,..,#
Remarque : on n’inverse pas les matrices blocs diagonales Ai,i ; on résout plutôt les sous – systèmes linéaires Ai,i.Vi = Gi en utilisant des algorithmes efficaces (par exemple gradient conjugué et ses variantes ou bien des méthodes de relaxation ou encore des méthodes directes lorsque les sous – matrices sont creuses (triple diagonales))
13
Programme structuré : résolution séquentielle par blocs de AV = B (problème stationnaire)
V0 approximation initiale de V* norme ← bidon ; tantque norme > ε faire pour i = 1 à α faire norme ← 0 ; calcul de
!
Gi = Bi " Ai, jV jj#i
$
% ; résoudre
!
Ai,iVinew =Gi ;
calcul
!
Vinew "Vi
old ;
!
norme " Max(norme, Vinew #Vi
old ) ; ranger
!
Vinew
; finpouri ; fintantque. α nombre de blocs
14
Remarques : - pour la résolution des sous-systèmes on pourra utiliser n’importe quel algorithme, en particulier le plus efficace, - ici on a considéré la norme uniforme (du maximum) pour stopper les itérations ; on peut prendre d’autres normes car en dimension finie elles sont toutes équivalents, mais certaines sont plus fines que d’autres, - en séquentiel : pour le rangement des sous vecteurs Vi dans le vecteur global V on utilise un système de pointage définis en fonction du découpage en sous problèmes, - en calcul parallèle chaque processeur aura à sa charge une partie de la gestion de la boucle pour associée à son bloc ; les sous-matrices Ai,i sont donc découpées en sous blocs et les portions de chaque vecteur traitées par un processeur sont repérées par un autre système de pointeurs. Pour avoir une meilleure granularité, plusieurs blocs sont affectés à un processeur. - en calcul parallèle il y aura des communications entre processeurs pour la transmission des données d’interaction
!
V i ; on pourra effectuer des communications synchrones (on suit donc la méthode séquentielle) ou asynchrones (on utilise les données d’interaction disponibles les plus « fraîchement » calculées par les autres processeurs) et on résoudra de façon synchrone ou asynchrone les sous-systèmes.
17
Schéma parallèle asynchrone de calcul avec communications flexibles : pas de temps d’attente
utilization de mises à jour incompletes de composantes itérées (relaxes) durant les calculs
⎯⎯⎯ itétation ⎯⎯→
18
Programme structuré : résolution séquentielle par blocs de AV = B (problème d’évolution) ⇒ on ajoute une boucle en temps
!
V 0 donnée initiale du problème d’évolution
pour chaque pas de temps faire V0 approximation initiale de V* (valeur au pas de temps précédent) norme ← bidon ;
V0 ←
!
V 0
tantque norme > ε faire pour i = 1 à α faire norme ← 0 ;
calcul de
!
Gi = Bi " Ai, jV jj#i
$
% ;
résoudre
!
Ai,iVinew =Gi ;
calcul
!
Vinew "Vi
old ;
!
norme " Max(norme, Vinew #Vi
old ) ; ranger
!
Vinew dans
!
V 0;
finpouri fintantque.; finpour.
19
Parallélisation en temps : rendre cohérent l’algorithme en temps !!
!
V 0 donnée initiale du problème d’évolution
pour chaque pas de temps faire V0 approximation initiale de V* (valeur au pas de temps précédent)
norme ← bidon ; V0 ←
!
V 0
pour i = 1 à α faire tantque norme > ε faire norme ← 0 ;
calcul de
!
Gi = Bi " Ai, jV jj#i
$
% ;
résoudre
!
Ai,iVinew =Gi ;
calcul
!
Vinew "Vi
old ;
!
norme " Max(norme, Vinew #Vi
old ) ; ranger
!
Vinew dans
!
V 0;
fintantque. finpouri ; Barrière de synchronisation ⇐ finpour.
20
Retour au problème défini sur deux sous-domaines Ω1 et Ω2 - Pose Γ1,2 = Γ2∩ Ω1 & Γ1,3 = Γ3∩ Ω1 (frontières haut & bas) -
-
!
c1"u1
"t# div($1%u1) = f1(x, t), 0, tfinal] ]x&1
u1(x, y,t = 0) = u1,0 (x, y) C.I.u1 = 'imp , sur (1
u1 = g1, sur (1,2 (1,3U
#$1"u1
"n=
1R
(u1 # u1,cst ), sur (5
)
*
+ + + +
,
+ + + +
- Pose Γ2,2 = Γ2∩ Ω2 & Γ2,3 = Γ3∩ Ω2 (frontières haut & bas)
!
!
c2"u2
"t# div($2%u2 ) = f2 (x,t), 0, tfinal] ]x&2
u2 (x, y,t = 0) = u2,0 (x, y) C.I.u2 = u1,'5
, sur '5 (condition transmission)
u2 = g2 , sur '2,2 U '2,3 u2 = g3, sur '6
(
)
* * * *
+
* * * *
21
Programme séquentiel et sous programmes en Fortran iterG1=0 iterG2=0 do it=1,Nbtemp ! Boucle en temps ! Dans omega1 ! Calcul du second membre dans OMEGA 1 CALL SCDMB1(f,u,A1,nn,n,m) ! Boucle de calcul dans OMEGA 1 normmax1=10. iter1=0 ! Boucle de calcul dans OMEGA 1 (points interieurs) CALL PTSINT1(f,u,diag1,codiag1,nn,n,m,normmax1,iter1,epsi) iterG1=iterG1+iter1 ! Dans omega 2 ! Calcul du second membre dans OMEGA 2 CALL SCDMB2(f,u,A2,nn,n,m,p) ! Boucle de calcul dans OMEGA 2 (points interieurs) normmax2=10. iter2=0 CALL PTSINT2(f,u,diag2,codiag2,nn,n,m,p,normmax2,iter2,epsi) iterG2=iterG2+iter2 enddo ! Fin boucle en temps
22
CALCUL DES SECONDS MEMBRE ! SECOND MEMBRE 1 DANS OMEGA 1
SUBROUTINE SCDMB1(f,u,A1,nn,n,m) integer nn,n,m real*8 ,dimension (141,141,141):: u real*8, dimension (141,141,141):: f real*8 A1 do k=1,nn+2 do j=1,n+2 do i=2,m f(i,j,k)=A1*u(i,j,k) enddo enddo enddo return end Note : dans le problème le terme source est nul ; s’il était égal à g, g différent de zero, on mettrait
f(i,j,k)=g(i,j,k)+ A1*u(i,j,k)
23
! SECOND MEMBRE 2 DANS OMEGA 2 SUBROUTINE SCDMB2(f,u,A2,nn,n,m,p) integer nn,n,m,p real*8 ,dimension (141,141,141):: u real*8, dimension (141,141,141):: f real*8 A2 do k=1,nn+2 do j=1,n+2 do i=m+2,m+p f(i,j,k)=A2*u(i,j,k) enddo enddo enddo return end
24
INTERFACE ! INTERFACE OMEGA 1 OMEGA 2 SUBROUTINE LINTERFACE(u,epsi,nn,n,m,iter1,normmax1,ct11,ct2,ct31prim) integer nn,n,m, iter1 real*8 ,dimension (141,141,141):: u real*8 epsi, normmax1,ct11,ct2,ct31prim, SS, RR ! VERTICAL INTERFACE omega1 omega2 indice I=m+1 do k=1,nn+2 do j=1,n+2 SS=(ct11*u(m,j,k)+ct2)/ct31prim ! %norme RR=dabs(SS-u(m+1,j,k)) if ( RR .gt. normmax1) then normmax1=RR endif u(m+1,j,k)=SS enddo enddo return end
25
SOUS PROGRAMMES RESOLUTION : POINTS INTERIEURS OMEGA 1 ! SOUS PROGRAMMES RESOLUTION ! POINTS INTERIEURS OMEGA 1 SUBROUTINE PTSINT1(f,u,diag1,codiag1,nn,n,m,normmax1,iter1,epsi) integer :: nn,n,m integer,intent(inout) :: iter1 real*8,dimension (141,141,141):: u real*8,dimension (141,141,141):: f real*8 :: diag1,codiag1, epsi, SS, RR real*8,intent(inout) :: normmax1 ! POINTS INTERIEURS do while( normmax1.gt.epsi) normmax1=0. do k=2,nn+1 do j=2,n+1 do i=2,m SS=(1.0/diag1)*(f(i,j,k)& -codiag1*u(i+1,j,k)-codiag1*u(i,j+1,k)-codiag1*u(i-1,j,k)& -codiag1*u(i,j-1,k)-codiag1*u(i,j,k+1)-codiag1*u(i,j,k-1)) !%norme RR=dabs(SS-u(i,j,k)) if (RR .gt. normmax1)then normmax1=RR endif u(i,j,k)=SS enddo enddo enddo ! Verticale interface entre omega1 et omega2 CALL LINTERFACE(u,epsi,nn,n,m,iter1,normmax1,ct11,ct2,ct31prim) iter1=iter1+1 enddo return end
26
C POINTS INTERIEURS OMEGA 2 ! POINTS INTERIEURS OMEGA 2 SUBROUTINE PTSINT2(f,u,diag2,codiag2,nn,n,m,p,normmax2,iter2,epsi) integer :: nn,n,m,p integer,intent(inout) :: iter2 real*8,dimension (141,141,141):: u real*8,dimension (141,141,141):: f real*8 :: diag2,codiag2, epsi, SS, RR real*8,intent(inout) :: normmax2 ! POINTS INTERIEURS do while(normmax2.gt.epsi) normmax2=0 do k=2,nn+1 do j=2,n+1 do i=m+2,m+p SS=(1.0/diag2)*(f(i,j,k)& -codiag2*u(i+1,j,k)-codiag2*u(i,j+1,k)-codiag2*u(i-1,j,k)& -codiag2*u(i,j-1,k)-codiag2*u(i,j,k+1)-codiag2*u(i,j,k-1)) !%norme RR=dabs(SS-u(i,j,k)) if (RR .gt. normmax2) then normmax2=RR endif u(i,j,k)=SS enddo enddo enddo iter2 =iter2+1 enddo return end
27
PROGRAMME COMPLET SEQUENTIEL !===================================================================== ! Resolution du probleme a coefficients constants par la methode ! des differences finies !===================================================================== ! Declaration des variables !===================================================================== real*8,dimension (141,141,141):: u real*8,dimension (141,141,141):: f real*8,dimension (141):: x,y,z integer :: Nbtemp,m,p,n,nn,i,j,k,t,tt,num,iter1,iter2,it integer :: iterG1,iterG2 real*8 :: Temps,lamda1,Rij,Uconst,cmv1,ct2 real*8 :: lamda2,cmv2,longx real*8 :: epsi,h,kk,A1,codiag1, diag1,ct11,ct31prim real*8 :: A2,codiag2, diag2 real*8 :: start,normmax1,normmax2, stop_time,start_time !=================================================================== ! Initialisation ! Temps : horizon - longx : dimension - Nbtemp : nb de pas de temps ! - m - p - nombre de pts !=================================================================== Temps=1. longx=1. Nbtemp=100 m=70 p=70 n=m+p-1 nn=m+p-1 !=================================================================== ! Definition constantes physiques !=================================================================== Rij=15. Uconst=30. epsi=1.0e-03 ! précision !===================================================================
28
! Pas de discretisation h : espace - kk : temps !=================================================================== h= longx/(m+p) kk=Temps/Nbtemp !=================================================================== ! Initialisation second membre !=================================================================== do k=1,nn+2 do j=1,n+2 do i=1,m+p+1 f(i,j,k)=0. end do end do enddo !================================================================ ! Appel horloge (mesure du temps d execution) !================================================================ call cpu_time(start_time) !================================================================ ! Coefficients physiques concernant la zone Omega 1 !================================================================ lamda1=32. cmv1=7340. * 688. A1=cmv1/kk codiag1=-lamda1/(h*h) diag1=(-6*codiag1+A1) ct11=(lamda1/h) ct31prim=(ct11+(1.0/Rij)) ct2=(Uconst/Rij) !================================================================= ! Coefficients physiques concernant la zone Omega 2 !================================================================= lamda2=35.6 cmv2=7659. * 745. A2=cmv2/kk
29
codiag2=-lamda2/(h*h) diag2=(-6*codiag2+A2) !============================================================== ! C.L DIRICHLET PARTOUT SAUF A L'INTERFACE !============================================================= !============================================================== ! Conditions initiales !============================================================== do k=1,nn+2 do j=1,n+2 do i=1,m+1 u(i,j,k)= 1500 end do do i= m+2,m+p+1 u(i,j,k)=900 enddo enddo enddo !============================================================= ! Phase de calcul !============================================================= iterG1=0 iterG2=0 do it=1,Nbtemp ! Boucle en temps ! Dans omega1 ! Calcul du second membre dans OMEGA 1 CALL SCDMB1(f,u,A1,nn,n,m) ! Boucle de calcul dans OMEGA 1 normmax1=10. iter1=0 ! Boucle de calcul dans OMEGA 1 (points interieurs) CALL PTSINT1(f,u,diag1,codiag1,nn,n,m,normmax1,iter1,epsi) iterG1=iterG1+iter1 ! Dans omega 2
30
! Calcul du second membre dans OMEGA 2 CALL SCDMB2(f,u,A2,nn,n,m,p) ! Boucle de calcul dans OMEGA 2 (points interieurs) normmax2=10. iter2=0 CALL PTSINT2(f,u,diag2,codiag2,nn,n,m,p,normmax2,iter2,epsi) iterG2=iterG2+iter2 enddo ! Fin boucle en temps call cpu_time(stop_time) start=stop_time-start_time write (*,*) 'temps=', start write (*,*) 'normmax1=',normmax1 write (*,*) 'normmax2=',normmax2 write (*,*) 'iter1=',iterG1 write (*,*) 'iter2=',iterG2 stop end ! SOUS - PROGRAMMES ! SECOND MEMBRE 1 DANS OMEGA 1 SUBROUTINE SCDMB1(f,u,A1,nn,n,m) integer nn,n,m real*8 ,dimension (141,141,141):: u real*8, dimension (141,141,141):: f real*8 A1 do k=1,nn+2 do j=1,n+2 do i=2,m f(i,j,k)=A1*u(i,j,k) enddo enddo enddo return end
31
! SECOND MEMBRE 2 DANS OMEGA 2 SUBROUTINE SCDMB2(f,u,A2,nn,n,m,p) integer nn,n,m,p real*8 ,dimension (141,141,141):: u real*8, dimension (141,141,141):: f real*8 A2 do k=1,nn+2 do j=1,n+2 do i=m+2,m+p f(i,j,k)=A2*u(i,j,k) enddo enddo enddo return end ! INTERFACE OMEGA 1 OMEGA 2 SUBROUTINE LINTERFACE(u,epsi,nn,n,m,iter1,normmax1,ct11,ct2,ct31prim) integer nn,n,m, iter1 real*8 ,dimension (141,141,141):: u real*8 epsi, normmax1,ct11,ct2,ct31prim, SS, RR ! VERTICAL INTERFACE omega1 omega2 I=m+1 do k=1,nn+2 do j=1,n+2 SS=(ct11*u(m,j,k)+ct2)/ct31prim ! %norme RR=dabs(SS-u(m+1,j,k)) if ( RR .gt. normmax1) then normmax1=RR endif u(m+1,j,k)=SS enddo enddo return end
32
! SOUS PROGRAMMES RESOLUTION ! POINTS INTERIEURS OMEGA 1 SUBROUTINE PTSINT1(f,u,diag1,codiag1,nn,n,m,normmax1,iter1,epsi) integer :: nn,n,m integer,intent(inout) :: iter1 real*8,dimension (141,141,141):: u real*8,dimension (141,141,141):: f real*8 :: diag1,codiag1, epsi, SS, RR real*8,intent(inout) :: normmax1 ! POINTS INTERIEURS do while( normmax1.gt.epsi) normmax1=0. do k=2,nn+1 do j=2,n+1 do i=2,m SS=(1.0/diag1)*(f(i,j,k)& -codiag1*u(i+1,j,k)-codiag1*u(i,j+1,k)-codiag1*u(i-1,j,k)& -codiag1*u(i,j-1,k)-codiag1*u(i,j,k+1)-codiag1*u(i,j,k-1)) !%norme RR=dabs(SS-u(i,j,k)) if (RR .gt. normmax1)then normmax1=RR endif u(i,j,k)=SS enddo enddo enddo ! Verticale interface entre omega1 et omega2 CALL LINTERFACE(u,epsi,nn,n,m,iter1,normmax1,ct11,ct2,ct31prim) iter1=iter1+1 enddo return end ! POINTS INTERIEURS OMEGA 2 SUBROUTINE PTSINT2(f,u,diag2,codiag2,nn,n,m,p,normmax2,iter2,epsi)
33
integer :: nn,n,m,p integer,intent(inout) :: iter2 real*8,dimension (141,141,141):: u real*8,dimension (141,141,141):: f real*8 :: diag2,codiag2, epsi, SS, RR real*8,intent(inout) :: normmax2 ! POINTS INTERIEURS do while(normmax2.gt.epsi) normmax2=0 do k=2,nn+1 do j=2,n+1 do i=m+2,m+p SS=(1.0/diag2)*(f(i,j,k)& -codiag2*u(i+1,j,k)-codiag2*u(i,j+1,k)-codiag2*u(i-1,j,k)& -codiag2*u(i,j-1,k)-codiag2*u(i,j,k+1)-codiag2*u(i,j,k-1)) !%norme RR=dabs(SS-u(i,j,k)) if (RR .gt. normmax2) then normmax2=RR endif u(i,j,k)=SS enddo enddo enddo iter2 =iter2+1 enddo return end
!
34
Note d’utilisation
Paramètres influant sur les performances : cmv1, cmv2, lamda1, lamda2
Dans le source : cmv1=7340*688, cmv2=7659*745, lamda1=32, lamda2=35.6
Forte diagonal dominance ⇒ grande vitesse de convergence
Faire des essais avec : cmv1=1, cmv2=1.2, lamda1=1, lamda2=1.5
Comportement différent ⇒ vitesse de convergence faible
Pour chaque jeu de données : influence sur performances parallèles
35
En parallèle dans la boucle en temps on va traiter - d’abord le premier domaine Ω1 jusqu’à convergence - on inclut une barrière de synchronisation lorsque Ω1 est traité - puis on traite le second sous domaine Ω2 jusqu’à convergence - on inclut une barrière de synchronisation lorsque Ω2 est traité pour chaque pas de temps faire Traitement du problème dans Ω1 jusqu’à convergence Barrière de synchronisation Traitement du problème dans Ω2 jusqu’à convergence Barrière de synchronisation Finpour. il y aura des communications entre processeurs pour la transmission des données d’interaction
!
V i ; on pourra effectuer des communications synchrones ou asynchrones et on résoudra de façon synchrone ou asynchrone les sous-systèmes.
⇒ Relais à Thierry Garcia