Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau
-
Upload
joel-falcou -
Category
Software
-
view
88 -
download
0
Transcript of Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau
Lattice Boltzmann sur architecture multicoeurs vectorielleune approche de haut niveau
Antoine Tran Tan Joel Falcou
Université de Paris SudLRI - ParSys
Inria - Postale
Juin 2015
1 of 18
Le compromis matériel/logiciel
Single Core Era
Performance
Expressiveness
C/Fort.
C++
Java
Multi-Core/SIMD Era
Performance
Expressiveness
Sequential
Threads
SIMD
Heterogenous Era
Performance
Expressiveness
Sequential
SIMD
Threads
GPUPhi
Distributed
3 of 18
Le compromis matériel/logiciel
Single Core Era
Performance
Expressiveness
C/Fort.
C++
Java
Multi-Core/SIMD Era
Performance
Expressiveness
Sequential
Threads
SIMD
Heterogenous Era
Performance
Expressiveness
Sequential
SIMD
Threads
GPUPhi
Distributed
?
Comment allier performance ET expressivité ?
4 of 18
NT2 : The Numerical Template Toolbox
Une bibliothèque pour le calcul scientique
■ Interface semblable à M pour les utilisateurs■ Classes et primitives pour le calcul haute performance■ Souplesse vers les nouvelles architectures
Composantes
■ Boost.SIMD pour le parallélisme mono-processeur■ Utilisation de squelettes parallèles récursifs pour le parallélisme
multi-processeurs■ Un code portable multi-architectures et multi-runtimes
5 of 18
NT2 : The Numerical Template Toolbox
Une bibliothèque pour le calcul scientique
■ Interface semblable à M pour les utilisateurs■ Classes et primitives pour le calcul haute performance■ Souplesse vers les nouvelles architectures
Composantes
■ Boost.SIMD pour le parallélisme mono-processeur■ Utilisation de squelettes parallèles récursifs pour le parallélisme
multi-processeurs■ Un code portable multi-architectures et multi-runtimes
5 of 18
NT2 : Du code M au code C++
Code MatlabA1 = 1:1000;A2 = A1 + randn(size(A1));
X = lu( A1*A1’ );
rms = sqrt( sum(( A1(:) - A2(:) ).^2) / numel(A1) );
Code C++ avec bibliothèque NT2
..table <double > A1 = .._(1 ,1000..);
..table <double > A2 = A1 + randn(size(A1));
..table <double > X = lu( ..mtimes(A1 , ..trans(A1) ..) );
..table <double > rms = sqrt( sum(..sqr( A1(.._) - A2(.._) ..)) / numel(A1) );
6 of 18
L’algorithme Lattice Boltzmann
Pourquoi cet algorithme ?
■ Simplicité du coeur de l’algorithme■ Fort parallélisme de données■ Degré de liberté sur la structure des données
La version D2Q9
■ Le schéma le plus simple■ Se généralise aux versions DnQm■ Des accès mémoire prenant le dessus sur le calcul
7 of 18
L’algorithme Lattice Boltzmann
Pourquoi cet algorithme ?
■ Simplicité du coeur de l’algorithme■ Fort parallélisme de données■ Degré de liberté sur la structure des données
La version D2Q9
■ Le schéma le plus simple■ Se généralise aux versions DnQm■ Des accès mémoire prenant le dessus sur le calcul
7 of 18
Contexte du code
■ Travail sur un lattice 2D■ Rebonds sur bords et
obstacle (en gris), etconditions de Neumann enentrée (en bleu)
8 of 18
Contexte du code
■ Travail sur un lattice 2D■ Rebonds sur bords et
obstacle (en gris), etconditions de Neumann enentrée (en bleu)
■ Mise à jour des 9composantes de vitesse pourchaque point
8 of 18
Coeur de l’algorithme - Version Pull
■ Propagation ■ Collision
Légendes. : élément à lire
. : position du point à mettre à jour9 of 18
Vers une version NT2
1. Obtenir un code simple similaire à Matlab
2. Utiliser tout le potentiel d’une machine multi-coeur
3. Tendre vers l’efficacité d’une version GPU écrite en CUDA
10 of 18
Aperçu du code
void get_f( table <float > const & f, table <float > & fcopy, int nx, int ny)
{..fcopy(_ ,_ , ..1) = ..f(_ ,_ , ..1);..fcopy(_(2,nx) ,_ , ..2) = ..f(_(1,nx -1) ,_ , ..2);..fcopy(_ ,_(2,ny) , ..3) = ..f(_ ,_(1,ny -1), ..3);..fcopy(_(1,nx -1) ,_ , ..4) = ..f(_(2,nx) ,_ , ..4);..fcopy(_ ,_(1,ny -1), ..5) = ..f(_ ,_(2,ny) , ..5);..fcopy(_(2,nx) ,_(2,ny) , ..6) = ..f(_(1,nx -1) ,_(1,ny -1), ..6);..fcopy(_(1,nx -1) ,_(2,ny) , ..7) = ..f( _(2,nx) ,_(1,ny -1), ..7);..fcopy(_(1,nx -1) ,_(1,ny -1), ..8) = ..f( _(2,nx) ,_(2,ny) , ..8);..fcopy(_(2,nx) ,_(1,ny -1), ..9) = ..f(_(1,nx -1) ,_(2,ny) , ..9);}
11 of 18
Aperçu du codevoid bouzidi ( table <float > & f, table <float > & fcopy
, table <int > & bc , table <int > & alpha, int k, int nx , int ny)
{table <int ,of_size_ <9> > invalpha = (cons <int >(1, 4, 5, 2, 3, 8, 9, 6, 7));const float q = .5f;
..fcopy(_,_,invalpha(k)) =if_else( (alpha >> (k-2) &1) // composante impliquée?
,..if_else( (bc == 1) // condition de rebond,if_else(q*ones(of_size(nx ,ny),meta::as_ <float >()) <=.5f
,(1.f-2.f*q)*..fcopy(_,_,k)+2.f*q*..f(_,_,k)+..fcopy(_,_,invalpha(k)),(1.f-.5f/q)*..f(_,_,invalpha(k)) +.5f/q*..f(_,_,k)+..fcopy(_,_,invalpha(k)))
, ..if_else( (bc == 2) // condition d’anti -rebond,if_else(q*ones(of_size(bound),meta::as_ <float >()) <.5f
,-(1.f-2.f*q)*..fcopy(_,_,k) -2.f*q*..f(_,_,k)+..fcopy(_,_,invalpha(k)),-(1.f-.5f/q)*..f(_,_,invalpha(k)) -.5f/q*..f(_,_,k)+..fcopy(_,_,invalpha(k)))
,..if_else( (bc == 3) // condition de Neumann, ..f(_,_,invalpha(k)), ..fcopy(_,_,invalpha(k)))
))
,..fcopy(_,_,invalpha(k)));
}
12 of 18
Aperçu du codevoid relaxation( nt2::table <float > & m
, nt2::table <float > const s_)
{const float la = 1.f; const float rho = 1.f; const float dummy_ = 1.f/(la*la*rho);
..m(_,_,4) = ..m(_,_,4) *(1.f-s_(1))+ s_(1)*(-2.f*..m(_,_,1)
+ 3.f*( dummy_*..m(_,_,2)*..m(_,_,2) + dummy_*..m(_,_,3)*..m(_,_,3)));
..m(_,_,5) = ..m(_,_,5)*( 1.f-s_(2))+ s_(2)*( ..m(_,_,1)
+ 1.5f*( dummy_*..m(_,_,2)*..m(_,_,2) + dummy_*..m(_,_,3)*..m(_,_,3)));
..m(_,_,6) = ..m(_,_,6) *(1.f-s_(3))- s_(3)*..m(_,_,2)/la;
..m(_,_,7) = ..m(_,_,7) *(1.f-s_(4))- s_(4)*..m(_,_,3)/la;
..m(_,_,8) = ..m(_,_,8) *(1.f-s_(5))+ s_(5)*( dummy_*..m(_,_,2)*..m(_,_,2) - dummy_*..m(_,_,3)*..m(_,_,3));
..m(_,_,9) = ..m(_,_,9) *(1.f-s_(6))+ s_(6)*dummy_*..m(_,_,2)*..m(_,_,3);
}13 of 18
Mesures de performance - Architecture
■ 2 processeurs Intel Westmere (6 coeurs chacun)■ Cache L3 : 12 MB■ RAM : 2 x 24 GB
14 of 18
Mesures de performance (En Mlup/s) - Comparaisonde versions
Taille du latticeversion
séquentielle
version NT2
avec boucles(SOA)
version NT2
avec boucles(AOS)
version NT2
avec l’opérateur ’_’sans threads
(SOA)
version NT2
avec l’opérateur ’_’avec threads
(SOA)(512,256) 5.27 6.07 6.11 7.68 (x 1.46) 38.38 (x 7.28)(1024,512) 7.04 6.24 7.01 7.32 (x 1.10) 11.62 (x 1.65 )(2048,1024) 6.77 5.99 7.13 7.47 (x 1.10) 12.89 (x 1.9 )(4096,2048) 3.99 4.12 7.16 (x 1.79 ) 6.03 (x 1.51) 14.24 (x 3.57)(8192,4096) 3.77 3.86 7.14 (x 1.89 ) 5.93 (x 1.57) 16.23 (x 4.31)
15 of 18
Mesures de performance - Passage à l’échelle
.....
0
.
2
.
4
.
6
.
8
.
10
.
12
.
0
.
20
.
40
.
60
.
Nombre de coeurs
.
Perfor
man
ceen
Mlu
p/s
.
. ..Version NT2 optimisée
. ..Performance idéale
16 of 18
Conclusion
■ Des performances attendues pour un problème limité par la bandepassante mémoire
■ Extension sur GPU disponible (Ian Masliah, Doctorant au LRI)■ Suivez-nous sur https://github.com/NumScale/nt2
17 of 18