Top Banner
Lattice Boltzmann sur architecture multicoeurs vectorielle une approche de haut niveau Antoine Tran Tan Joel Falcou Université de Paris Sud LRI - ParSys Inria - Postale Juin 2015 1 of 18
26

Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Jul 31, 2015

Download

Software

Joel Falcou
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: 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

Page 2: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Plan

Introduction

La bibliothèque NT2

L’algorithme Lattice Boltzmann

Conclusion

2 of 18

Page 3: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Plan

Introduction

La bibliothèque NT2

L’algorithme Lattice Boltzmann

Conclusion

2 of 18

Page 4: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 5: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 6: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Plan

Introduction

La bibliothèque NT2

L’algorithme Lattice Boltzmann

Conclusion

4 of 18

Page 7: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 8: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 9: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 10: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Plan

Introduction

La bibliothèque NT2

L’algorithme Lattice Boltzmann

Conclusion

6 of 18

Page 11: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 12: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 13: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Contexte du code

■ Travail sur un lattice 2D

8 of 18

Page 14: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 15: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 16: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Coeur de l’algorithme - Version Pull

■ Propagation ■ Collision

Légendes. : élément à lire

. : position du point à mettre à jour9 of 18

Page 17: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 18: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 19: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 20: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 21: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Mesures de performance - Architecture

■ 2 processeurs Intel Westmere (6 coeurs chacun)■ Cache L3 : 12 MB■ RAM : 2 x 24 GB

14 of 18

Page 22: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 23: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 24: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Plan

Introduction

La bibliothèque NT2

L’algorithme Lattice Boltzmann

Conclusion

16 of 18

Page 25: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

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

Page 26: Lattice Boltzmann sur architecture multicoeurs vectorielle - Une approche de haut niveau

Merci pour votre attention

18 of 18