18/03/2013 © ANEO – Tous droits réservés 1 
Du Polymorphisme dynamique au polymorphisme statique : abstraction sans perte ...
19/03/2013 © ANEO – Tous droits réservés 2 
ANEO en quelques mots 
Quels outils pour développer des logiciels multidiscipl...
ANEOestunCabinetdeConseilenOrganisationetTechnologies.Fondéen2002,lamajoritéducapitalestdétenupardesAssociés,Exécutifs. 
...
De la stratégie à la déclinaison opérationnelle 
18/03/2013 © ANEO – Tous droits réservés 4 
ANEO en quelques mots 
ANEOac...
Les interventions de la practice HPC 
LedomaineduHPCregroupel’ensembledesexpertisesimpliquéesdanslaréductiondestempsd’exé...
Les expertises de practice HPC 
Mise au point d’un base de benchmarks 
Implémentation de différents algorithmes 
Implém...
18/03/2013 © ANEO – Tous droits réservés 7 
ANEO en quelques mots 
Quels outils pour développer des logiciels multidiscipl...
Quand l’écriture du logiciel nécessite la mise en oeuvre de compétences multidisciplinaires 
Analyse physique 
•Descriptio...
Les complexités inhérentes à chaque discipline s’ajoutent 
Si une modélisation physique n’est pas solvable dans un temps ...
Le compromis entre performances et abstraction 
18/03/2013 © ANEO – Tous droits réservés 10 
Les projets logiciels multidi...
19/03/2013 © ANEO – Tous droits réservés 11 
ANEO en quelques mots 
Quels outils pour développer des logiciels multidiscip...
La mise au point d’un langage enfouis (DSEL) est soumise aux possibilités syntaxiques du langage hôte 
•Appel de la foncti...
Un DSEL C++ s’appuie sur la surcharge des opérateur afin de mimer un langage 
Un DSEL C++ accorde une sémantique aux opér...
Une classe définissant un DSEL dédié aux opérations vectorielles de l’algèbre 
class Vector{ 
public: 
Vector(constintsize...
Un code client simple mais quid des problématiques informatiques ? (ex: performances) 
Vectortmp1(N); 
for(inti=0; i<N; ++...
Comment encapsuler le corps de la boucle dans un objet pour fusionner les boucles ? 
19/03/2013 © ANEO – Tous droits réser...
Une arborescence de classes pour représenter les expressions vectorielles 
Une expression vectorielle peut être : 
La som...
Une arborescence de classes pour représenter les expressions vectorielles 
Une expression vectorielle peut être : 
La som...
Une arborescence de classes pour représenter les expressions vectorielles 
Une expression vectorielle peut être : 
La som...
Une arborescence de classes pour représenter les expressions vectorielles 
Une expression vectorielle peut être : 
La som...
Une arborescence de classes pour représenter les expressions vectorielles 
Une expression vectorielle peut être : 
La som...
La construction de l’expression vectorielle revient à construire un arbre syntaxique ScalVectorExprbz_(b, Z); 
constVector...
Supprimer les fonctions virtuelle ou construire un arbre syntaxique à la compilation 
typedefScalVectorExpr<Vector> BZ; 
B...
Créer une arborescence de classes résolue à la compilation : Curiously Recursive Template Pattern(CRTP) 
19/03/2013 © ANEO...
Résoudre les expressions vectorielles à la compilation 
19/03/2013 © ANEO – Tous droits réservés 25 
Les langages dédiés e...
Résoudre les expressions vectorielles à la compilation 
19/03/2013 © ANEO – Tous droits réservés 26 
Les langages dédiés e...
Résoudre les expressions vectorielles à la compilation 
19/03/2013 © ANEO – Tous droits réservés 27 
Les langages dédiés e...
Résoudre les expressions vectorielles à la compilation 
19/03/2013 © ANEO – Tous droits réservés 28 
Les langages dédiés e...
La complexité «informatique» du traitement des expressions vectorielle est localisée et n’impacte pas le code client 
cons...
19/03/2013 © ANEO – Tous droits réservés 30 
ANEO en quelques mots 
Quels outils pour développer des logiciels multidiscip...
L’utilisation de design patternspécifiques permet d’orthogonaliserles complexités issues des différentes disciplines 
L’ut...
Prochain SlideShare
Chargement dans…5
×

Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte de performances

423 vues

Publié le

Comment développer des logiciels de calculs performants en C++ via l'utilsiation d'idiome avancé comme les Expression Templates.

Publié dans : Logiciels
0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
423
Sur SlideShare
0
Issues des intégrations
0
Intégrations
14
Actions
Partages
0
Téléchargements
4
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte de performances

  1. 1. 18/03/2013 © ANEO – Tous droits réservés 1 Du Polymorphisme dynamique au polymorphisme statique : abstraction sans perte de performances Rencontre C++ Francophone - Coverity Metascale Wilfried KIRSCHENMANN Senior Consultant wkirschenmann@aneo.fr 122, avenue du Général Leclerc F-92100 Boulogne-Billancourt Tél. : +33 1 46 44 24 66 Fax : +33 1 46 44 28 63
  2. 2. 19/03/2013 © ANEO – Tous droits réservés 2 ANEO en quelques mots Quels outils pour développer des logiciels multidisciplinaires ? Les langages dédiés embarqués en C++ Conclusion Sommaire
  3. 3. ANEOestunCabinetdeConseilenOrganisationetTechnologies.Fondéen2002,lamajoritéducapitalestdétenupardesAssociés,Exécutifs. SonCA2012estestiméà23M€pouruneffectifde190personnes. ANEOdéploiesonexpertisedansdeuxdomaines: BusinessPerformance TechnologiesetSystèmes Fiche d’identité 18/03/2013 © ANEO – Tous droits réservés 3 ANEO en quelques mots 18/03/2013
  4. 4. De la stratégie à la déclinaison opérationnelle 18/03/2013 © ANEO – Tous droits réservés 4 ANEO en quelques mots ANEOaccompagnesesclientsdans -ladéclinaisonopérationnelledeleurstratégie -ladéclinaisondesimpactsdeleurstratégied'entreprisesurl'organisationetlesystèmed'information.
  5. 5. Les interventions de la practice HPC LedomaineduHPCregroupel’ensembledesexpertisesimpliquéesdanslaréductiondestempsd’exécutiondeslogicielsdecalcul Nosinterventionssontessentiellementorientéessurlesactivitéssuivantes: CadragedeprojetsHPC Conseiltechnologique(architecturesmatérielles,logicielsdecalcul,architecturelogicielle…) PropositiondescenariidemiseenoeuvredelogicielsHPC Implémentationetdéploiement Développement Apportd’expertisestechnologiques Définitionetmiseenplacedeprocéduresdetestsetdevalidationdesperformances Supportetexploitation Centresdeservices Définitionetmiseenplacedeprocéduresdereporting Améliorationcontinue Identifieretévaluerlesopportunitésd’améliorationsdeperformancesd’unechaînedecalcul Nous intervenons principalement dans le domaine de la BFI où la demande en calcul est forte. 18/03/2013 © ANEO – Tous droits réservés 5 ANEO en quelques mots RP: HOUCEM HAMZA / 1,9 M€/ SERVICE ET CONSEIL / 19 ETP
  6. 6. Les expertises de practice HPC Mise au point d’un base de benchmarks Implémentation de différents algorithmes Implémentations sur différentes architectures matérielles Implémentations avec différents niveaux d’efforts de développement Objectif : pouvoir estimer a priorile coût et les gains apportés par un changement d’algorithme, de matériel ou par des optimisations spécifiques Etudede la propagation des erreurs d’arrondis dans les code de calcul numérique Analyse de la non reproductibilité des résultats numériques Estimation de la précision des résultats numériques Implémentation d’algorithmes minimisant la propagation des erreurs d’arrondis Objectif : garantir la fiabilité d’un résultat numérique Outils et méthodes pour la mise au point de codes de calcul multicibles HPCLib : une bibliothèque C++ générique d’algèbre linéaire Mise au point d’une bibliothèque C++ de parallélisation multicible Étude des outils de développement multicibles disponibles sur le marché Objectif: assurer la portabilité des performances sur différentes architectures matérielles 19/03/2013 © ANEO – Tous droits réservés 6 ANEO en quelques mots RP: HOUCEM HAMZA / 1,9 M€/ SERVICE ET CONSEIL / 19 ETP
  7. 7. 18/03/2013 © ANEO – Tous droits réservés 7 ANEO en quelques mots Quels outils pour développer des logiciels multidisciplinaires ? Exemple d’un logiciel de simulation physique Les sources de complexité Historique de différentes solutions Les langages dédiés embarqués en C++ Conclusion Sommaire
  8. 8. Quand l’écriture du logiciel nécessite la mise en oeuvre de compétences multidisciplinaires Analyse physique •Description du phénomène •Mise sous forme d’équations physiques Analyse fonctionnelle ou stochastique •Caractérisation des propriétés mathématiques des équations mises en oeuvre •Choix des espaces de résolution Analyse numérique •Discrétisation et choix des méthodes de résolution Informatique scientifique •Caractérisation et visualisation du problème •Mise en oeuvre de l’algorithme de résolution 18/03/2013 © ANEO – Tous droits réservés 8 Les projets logiciels multidisciplinaires : des projets complexes EXEMPLE D’UN LOGICIEL DE SIMULATION PHYSIQUE
  9. 9. Les complexités inhérentes à chaque discipline s’ajoutent Si une modélisation physique n’est pas solvable dans un temps réaliste, les solutions sont : Modifier la modélisation Retirer les termes négligeables Linéariser près du point de fonctionnement Modifier l’espace de résolution résolution de l’équation de la chaleur dans l’espace de Fourrier Utilisation des espaces de Hilbert en mécanique Modifier les méthodes de résolution Résolution itérative plutôt que directe Gauss-Seidel au lieu de Jacobi Modifier l’implémentation Parallélisation Utilisation de bibliothèques Chacune de ces solutions à un impact sur les autres éléments de la chaîne Un tel projet nécessite une organisation et des outils spécifiques 18/03/2013 © ANEO – Tous droits réservés 9 Les projets logiciels multidisciplinaires : des projets complexes LES SOURCES DE COMPLEXITÉ
  10. 10. Le compromis entre performances et abstraction 18/03/2013 © ANEO – Tous droits réservés 10 Les projets logiciels multidisciplinaires : des projets complexes HISTORIQUE DE DIFFÉRENTES SOLUTIONS L’approche des langages dédiés (enfouis) permet de dissocier le traitement des complexités informatiques des complexités mathématiques Implémentation 풀←휶푿+풀 풀←휶푿+휷풁+풀 Langages généralistes (C) for(inti=0; i<N; ++i) Y[i]+=a*X[i] for(int i=0; i<N; ++i) Y[i]+=a*X[i]+b*Z[i] Bibliothèques de fonction axpy(Y, a, X, N) axpypz(Y, a, X, b, Z, N) Bibliothèques externes (BLAS) blas_axpy(Y, a, X, N) blas_axpy(Y, a, X, N) blas_axpy(Y, b, Z, N) Langages dédiés (Scilab) Y=a*X+Y Y=a*X+b*Z+Y ou langages enfouis (Blitz++) Y+=a*X; Y+=a*X+b*Z;
  11. 11. 19/03/2013 © ANEO – Tous droits réservés 11 ANEO en quelques mots Quels outils pour développer des logiciels multidisciplinaires ? Les langages dédiés embarqués en C++ Sémantique du langage Construire un arbre syntaxique lors de l’exécution Construire un arbre syntaxique lors de la compilation Conclusion Sommaire
  12. 12. La mise au point d’un langage enfouis (DSEL) est soumise aux possibilités syntaxiques du langage hôte •Appel de la fonction f f() •Addition de A et B A+B •Multiplication de A par B A*B •Soustraction dans A de B A-B •Division de A par B (si défini) A/B •Produit scalaire de A et B <A,B> •Affectation à A de B AB •Accès au ièélément de A Ai 18/03/2013 © ANEO – Tous droits réservés 12 Les langages dédiés embarqués en C++ SÉMANTIQUE DU LANGAGE Le langage des mathématiques appliquées définit un certain nombre d’opérateurs et de notations et leur accorde une sémantique Il est impossible de reprendre le langage des mathématiques directement
  13. 13. Un DSEL C++ s’appuie sur la surcharge des opérateur afin de mimer un langage Un DSEL C++ accorde une sémantique aux opérateur surchargeablesen C++ La mise au point d’un langage enfouis (DSEL) est soumise aux possibilités syntaxiques du langage hôte •Appel de la fonction f f() •Addition de A et B A+B •Multiplication de A par B A*B •Soustraction dans A de B A-B •Division de A par B (si défini) A/B •Produit scalaire de A et B dot(A,B) •Affectation à A de B A=B •Accès au ièélément de A A[i] 18/03/2013 © ANEO – Tous droits réservés 13 Les langages dédiés embarqués en C++ SÉMANTIQUE DU LANGAGE
  14. 14. Une classe définissant un DSEL dédié aux opérations vectorielles de l’algèbre class Vector{ public: Vector(constintsize); Vector(constVector& v); ~Vector(); constVector& operator=(constVector& v); Vectoroperator+(constVector& v) const; Vectoroperator-(constVector& v) const; Vectoroperator*(constVector& v) const; constfloat& operator[](inti) const; float& operator[](inti); intsize() const; private: constintsize_; float* data_; }; floatdot(constVector& a, constVector& b) 18/03/2013 © ANEO – Tous droits réservés 14 Les langages dédiés embarqués en C++ SÉMANTIQUE DU LANGAGE VectorX(N), Y(n), Z(n); floata, b; Y = a*X+b*Z+Y;
  15. 15. Un code client simple mais quid des problématiques informatiques ? (ex: performances) Vectortmp1(N); for(inti=0; i<N; ++i) tmp1[i]=b*Z[i]; Vectortmp2(N); for(inti=0; i<N; ++i) tmp2[i]=tmp1[i]+Y[i]; Vectortmp3(N); for(inti=0; i<N; ++i) tmp3[i]=a*X[i]; Vectortmp4(N); for(inti=0; i<N; ++i) tmp4[i]=tmp2[i]+tmp3[i]; for(inti=0; i<N; ++i) Y[i]=tmp4[i]; 19/03/2013 © ANEO – Tous droits réservés 15 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION Y = a*X+b*Z+Y; Code généré équivalent 5 boucles for et 12 accès mémoire Au lieu de 1 boucle for et 4 accès mémoire : for(inti=0; i<N; ++i) Y[i]=a*X[i]+b*Z[i]+Y[i];
  16. 16. Comment encapsuler le corps de la boucle dans un objet pour fusionner les boucles ? 19/03/2013 © ANEO – Tous droits réservés 16 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION Y = a*X+b*Z+Y; Objectif StructVectorExpression{ constfloat& operator[](inti) const{ return a*X[i]+b*Z[i]+Y[i]; } Vector& X, & Y, & Z; floata,b; }; VectorExpressioncompute_operation= ... ; for(inti=0; i<N; ++i) Y[i] = compute_operation[i];
  17. 17. Une arborescence de classes pour représenter les expressions vectorielles Une expression vectorielle peut être : La somme de deux expressions vectorielles La multiplication d’une expression vectorielle par un scalaire Un vecteur 19/03/2013 © ANEO – Tous droits réservés 17 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION VectorExpression AddExpression ScaleExpression Vector
  18. 18. Une arborescence de classes pour représenter les expressions vectorielles Une expression vectorielle peut être : La somme de deux expressions vectorielles La multiplication d’une expression vectorielle par un scalaire Un vecteur 19/03/2013 © ANEO – Tous droits réservés 18 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION class VectorExpression{ public: virtualintsize() const=0; virtualconstfloat& operator[](inti) const=0; };
  19. 19. Une arborescence de classes pour représenter les expressions vectorielles Une expression vectorielle peut être : La somme de deux expressions vectorielles La multiplication d’une expression vectorielle par un scalaire Un vecteur 19/03/2013 © ANEO – Tous droits réservés 19 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION class AddVectorExpr: public VectorExpression{ public: AddVectorExpr(constVectorExpression& l, constVectorExpression& r) : l_(l), r_(r) { assert(l_.size== r_.size()); } virtualintsize() const{ return l_.size(); } virtualconstfloat& operator[](inti) const{ return l_[i]+r_[i]; } private: constVectorExpression& l_; constVectorExpression& r_; }; AddVectorExproperator+(constVectorExpression& r, constVectorExpression& r) { return AddVectorExpr(l, r); }
  20. 20. Une arborescence de classes pour représenter les expressions vectorielles Une expression vectorielle peut être : La somme de deux expressions vectorielles La multiplication d’une expression vectorielle par un scalaire Un vecteur 19/03/2013 © ANEO – Tous droits réservés 20 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION class ScalVectorExpr: public VectorExpression{ public: ScalVectorExpr(floata, constVectorExpression& x) : a_(a), x_(x) {} virtualintsize() const{ return x_.size(); } virtualconstfloat& operator[](inti) const{return a*x_[i]; } private: constfloata_; constVectorExpression& x_; }; ScalVectorExproperator*(constfloat& a, constVectorExpression& x) { return ScalVectorExpr(a, x); }
  21. 21. Une arborescence de classes pour représenter les expressions vectorielles Une expression vectorielle peut être : La somme de deux expressions vectorielles La multiplication d’une expression vectorielle par un scalaire Un vecteur 19/03/2013 © ANEO – Tous droits réservés 21 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION class Vector: public VectorExpression{ public: Vector(constintsize) : size_(size), data_(allocate(size_)) {} Vector(constVectorExpression& ve) : size_(ve.size()), data_(allocate(size_)){ for(inti=0 ; i<size_ ; ++i) data_[i]=ve[i]; } ~Vector(){ deallocate(data_); data_ = 0; } constVector& operator=(constVectorExpression& ve){ if(size_ != ve.size()) reallocate(data, ve.size()); for(inti=0 ; i<size_ ; ++i) data_[i]=ve[i]; return *this; } virtualintsize() const{ return size_; }; virtualconstfloat& operator[](inti) const{ return data_[i]; } float& operator[](inti) { return data_[i]; } private: constintsize_; float* data_; };
  22. 22. La construction de l’expression vectorielle revient à construire un arbre syntaxique ScalVectorExprbz_(b, Z); constVectorExpression& bz(bz_); AddVectorExprbzpy_(bz, Y); constVectorExpression& bzpy(bzpy_); ScalVectorExprax_(a, X); constVectorExpression& ax(ax_); AddVectorExpraxbzpy_(ax, bzpy); constVectorExpression& axbzpy(axbzpy_); for(inti=0; i<N; ++i) Y[i] = axbzpy[i]; 19/03/2013 © ANEO – Tous droits réservés 22 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE L’EXÉCUTION Y = a*X+b*Z+Y; Code généré équivalent Problème : L’appel à axbzpy[i]génère l’appel de 7 fonctions virtuelles : axbzpy[i]ax[i] X[i]bzpy[i] Bz[i]Z[i] Y[i] lors de l’exécution
  23. 23. Supprimer les fonctions virtuelle ou construire un arbre syntaxique à la compilation typedefScalVectorExpr<Vector> BZ; BZ bz(b, Z); typedefAddVectorExpr<BZ, Vector> BZPY; BZPY bzpy(bz, Y); typedefScalVectorExpr<Vector> AX; AX ax(a, X); typedefAddVectorExpr<AX, BZPY > AXBZPY; AXBZPY axbzpy(ax, bzpy); for(inti=0; i<N; ++i) Y[i] = axbzpy[i]; 19/03/2013 © ANEO – Tous droits réservés 23 Les langages dédiés embarqués en C++ VERS UN LANGAGE PERFORMANT Y = a*X+b*Z+Y; Code généré souhaité Les opérateurs [] peuvent maintenant ne pas être virtuels et donc être inlinéspar le compilateur Question : comment construire l’arbre syntaxique de manière automatique ?
  24. 24. Créer une arborescence de classes résolue à la compilation : Curiously Recursive Template Pattern(CRTP) 19/03/2013 © ANEO – Tous droits réservés 24 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE LA COMPILATION Pour pouvoir résoudre les appels de fonctions à la compilation, il suffit de connaître le type réel des objets manipulés : template<class DERIVED> class Base { public : private: inlineconstDERIVED & derived() const{ return *static_cast<constDERIVED *>(this); } }; class Derived: public Base<Derived> { public : }; inlinevoidfoo() { derived().foo(); } inlinevoidfoo() { ... }
  25. 25. Résoudre les expressions vectorielles à la compilation 19/03/2013 © ANEO – Tous droits réservés 25 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE LA COMPILATION On applique le CRTP sur les classes précédemment définies class VectorExpression{ public: intsize() const constfloat& operator[](inti) const }; virtual=0; virtual=0; template<class DERIVED> : inline{ return derived().size(); } inline{ return derived()[i]; } private: inlineconstDERIVED & derived() const{ return *static_cast<constDERIVED *>(this); }
  26. 26. Résoudre les expressions vectorielles à la compilation 19/03/2013 © ANEO – Tous droits réservés 26 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE LA COMPILATION On applique le CRTP sur les classes précédemment définies class AddVectorExpr: public VectorExpression{ public: AddVectorExpr(constVectorExpression& l, constVectorExpression& r) : l_(l), r_(r) { assert(l_.size== r_.size()); } virtualintsize() const{ return l_.size(); } virtualconstfloat& operator[](inti) const{ return l_[i]+r_[i]; } private: constVectorExpression& l_; constVectorExpression& r_; }; AddVectorExproperator+(constVectorExpression& r, constVectorExpression& r) { return AddVectorExpr(l, r); } template<class LEFT, class RIGHT> VectorExpression<AddVectorExpr<LEFT, RIGHT> >{ constVectorExpression<LEFT>& l, constVectorExpression<RIGHT>& r) inlineintsize() inlineconstfloat& constVectorExpression<LEFT>& l_; constVectorExpression<RIGHT>& r_; template<class LEFT, class RIGHT> AddVectorExpr<LEFT, RIGHT>operator+(constVectorExpression<LEFT>& r, constVectorExpression<RIGHT>& r) AddVectorExpr<LEFT, RIGHT>(l, r);
  27. 27. Résoudre les expressions vectorielles à la compilation 19/03/2013 © ANEO – Tous droits réservés 27 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE LA COMPILATION On applique le CRTP sur les classes précédemment définies class ScalVectorExpr: public VectorExpression{ public: ScalVectorExpr(floata, constVectorExpression& x) : a_(a), x_(x) {} virtualintsize() const{ return x_.size(); } virtualconstfloat& operator[](inti) const{return a*x_[i]; } private: constfloata_; constVectorExpression& x_; }; ScalVectorExproperator*(constfloat& a, constVectorExpression& x) { return ScalVectorExpr(a, x); } template<class VE> VectorExpression<ScalVectorExpr<VE> >{ constVectorExpression<VE>& x) inlineintsize() inlineconstfloat& constVectorExpression<VE>& x_; template<class VE> ScalVectorExpr<VE>operator*(constfloat& a, constVectorExpression<VE>& x) ScalVectorExpr<VE>(a, x);
  28. 28. Résoudre les expressions vectorielles à la compilation 19/03/2013 © ANEO – Tous droits réservés 28 Les langages dédiés embarqués en C++ CONSTRUIRE UN ARBRE SYNTAXIQUE LORS DE LA COMPILATION On applique le CRTP sur les classes précédemment définies class Vector: public VectorExpression{ public: Vector(constintsize) : size_(size), data_(allocate(size_)) {} Vector(constVector& ve) : size_(ve.size()), data_(allocate(size_)){ for(inti=0 ; i<size_ ; ++i) data_[i]=ve[i]; } ~Vector(){ deallocate(data_); data_ = 0; } constVector& operator=(constVector& ve){ if(size_ != ve.size()) reallocate(data, ve.size()); for(inti=0 ; i<size_ ; ++i) data_[i]=ve[i]; return *this; } virtualintsize() const{ return size_; }; virtualconstfloat& operator[](inti) const{ return data_[i]; } inlinefloat& operator[](inti) { return data_[i]; } private: constintsize_; float* data_; }; template<class VE> constVectorExpression<VE>& ve):size_(ve.size()),data_(allocate(size_)){ template<class VE> constVectorExpression<VE>& ve){ inlineintsize() inlineconstfloat&
  29. 29. La complexité «informatique» du traitement des expressions vectorielle est localisée et n’impacte pas le code client constVector& operator=(constVectorExpression<VE>& ve){ #pragmaompparallelfor for(inti=0 ; i<size_ ; ++i) data_[i]=ve[i]; return *this; } Parallélisation multithread constVector& operator=(constVectorExpression<VE>& ve){ for(sse::Index i=0 ; i<size_ ; ++i) sse::Setter(data_,i)=sse::Getter(ve,i); return *this; } Vectoriser constVector& operator=(constVectorExpression<VE>& ve){ cuda::VectorExpressionEvaluate<VE>(ve, *this); return *this; } Utiliser un accélérateur de calcul (GPU) 19/03/2013 © ANEO – Tous droits réservés 29 Les langages dédiés embarqués en C++ POUR ALLER UN PEU PLUS LOIN Design pattern à employer : command Nécessite de modifier la conception des classes (tout doit être POD)
  30. 30. 19/03/2013 © ANEO – Tous droits réservés 30 ANEO en quelques mots Quels outils pour développer des logiciels multidisciplinaires ? Les langages dédiés embarqués en C++ Conclusion Sommaire
  31. 31. L’utilisation de design patternspécifiques permet d’orthogonaliserles complexités issues des différentes disciplines L’utilisation de DS(E)L permet aux utilisateurs de manipuler les concepts de leur domaine d’expertise •À chaque expertise son DS(E)L : un DS(E)L de parallélisme peut servir à définir un DS(E)L d’algèbre linéaire puis un DS(E)L d’éléments finis •Le C++ est un langage à qui permet d’obtenir des DSEL efficaces Cependant cela ne supprime pas la complexité •La mise au point d’un DSEL nécessite des compétences informatiques importantes •La mise au point est souvent plus complexe car les outils ne sont pas adaptés Gardons espoir : des outils nous aident •boost::proto est un DSEL C++ … Pour mettre au point des DSEL C++ •Les messages des compilateurs sont de plus en plus compréhensibles •Des travaux visent à intégrer des outils dédiés aux DSEL dans le langage 19/03/2013 © ANEO – Tous droits réservés 31 Conclusion

×