SlideShare ist ein Scribd-Unternehmen logo
1 von 31
Downloaden Sie, um offline zu lesen
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
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
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
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.
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
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
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
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
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É
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;
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
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
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
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;
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];
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];
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
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; 
};
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); 
}
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); 
}
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_; 
};
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
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 ?
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() { ... }
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); 
}
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);
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);
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&
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)
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
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

Weitere ähnliche Inhalte

Was ist angesagt?

Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesECAM Brussels Engineering School
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMALoic Yon
 
La programmation GPU avec C++ AMP pour les performances extrêmes
La programmation GPU avec C++ AMP pour les performances extrêmesLa programmation GPU avec C++ AMP pour les performances extrêmes
La programmation GPU avec C++ AMP pour les performances extrêmesMicrosoft
 
TP4 Atelier C++ /GL2 INSAT / Tunisie
TP4 Atelier C++ /GL2 INSAT / TunisieTP4 Atelier C++ /GL2 INSAT / Tunisie
TP4 Atelier C++ /GL2 INSAT / TunisieMariem ZAOUALI
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Laurent BUNIET
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...ECAM Brussels Engineering School
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonMohammed TAMALI
 
Langage C
Langage  CLangage  C
Langage Cjwilili
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Emeric Tapachès
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Loic Yon
 
Claire epita-février2014
Claire epita-février2014Claire epita-février2014
Claire epita-février2014Yves Caseau
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduralekemenaran
 
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...Pôle Systematic Paris-Region
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerSana Aroussi
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Fahad Golra
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en cbenouini rachid
 

Was ist angesagt? (20)

Python avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de donnéesPython avancé : Ensemble, dictionnaire et base de données
Python avancé : Ensemble, dictionnaire et base de données
 
Cours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMACours de C++ / Tronc commun deuxième année ISIMA
Cours de C++ / Tronc commun deuxième année ISIMA
 
Boost.SIMD
Boost.SIMDBoost.SIMD
Boost.SIMD
 
Carré Magique Cpp
Carré Magique CppCarré Magique Cpp
Carré Magique Cpp
 
La programmation GPU avec C++ AMP pour les performances extrêmes
La programmation GPU avec C++ AMP pour les performances extrêmesLa programmation GPU avec C++ AMP pour les performances extrêmes
La programmation GPU avec C++ AMP pour les performances extrêmes
 
TP4 Atelier C++ /GL2 INSAT / Tunisie
TP4 Atelier C++ /GL2 INSAT / TunisieTP4 Atelier C++ /GL2 INSAT / Tunisie
TP4 Atelier C++ /GL2 INSAT / Tunisie
 
Développement informatique : Programmation graphique
Développement informatique : Programmation graphiqueDéveloppement informatique : Programmation graphique
Développement informatique : Programmation graphique
 
Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1Cours de C++, en français, 2002 - Cours 2.1
Cours de C++, en français, 2002 - Cours 2.1
 
Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...Développement informatique : Gestion de projet, versioning, debugging, testin...
Développement informatique : Gestion de projet, versioning, debugging, testin...
 
Chap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec pythonChap XIII : calcul scientifique avec python
Chap XIII : calcul scientifique avec python
 
Langage C
Langage  CLangage  C
Langage C
 
Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2Algorithmique_et_programmation_part3_V2
Algorithmique_et_programmation_part3_V2
 
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
Java - Support etudiant - Tronc Commun Deuxième année ISIMA - 2018
 
Claire epita-février2014
Claire epita-février2014Claire epita-février2014
Claire epita-février2014
 
Formation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procéduraleFormation C# - Cours 2 - Programmation procédurale
Formation C# - Cours 2 - Programmation procédurale
 
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
OSIS18_IoT: L'approche machine virtuelle pour les microcontrôleurs, le projet...
 
Chapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régnerChapitre iii récursivité et paradigme diviser pour régner
Chapitre iii récursivité et paradigme diviser pour régner
 
Seance 3- Programmation en langage C
Seance 3- Programmation en langage C Seance 3- Programmation en langage C
Seance 3- Programmation en langage C
 
Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
Cours de programmation en c
Cours de programmation en cCours de programmation en c
Cours de programmation en c
 

Andere mochten auch

LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++cppfrug
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingcppfrug
 
Programmation orientée objet avancée
Programmation orientée objet avancéeProgrammation orientée objet avancée
Programmation orientée objet avancéeMahfoud EL HOUDAIGUI
 
Programmation orientée objet et java
Programmation orientée objet et javaProgrammation orientée objet et java
Programmation orientée objet et javaAxel KAMALAK
 
How static analysis supports quality over 50 million lines of C++ code
How static analysis supports quality over 50 million lines of C++ codeHow static analysis supports quality over 50 million lines of C++ code
How static analysis supports quality over 50 million lines of C++ codecppfrug
 
Async await in C++
Async await in C++Async await in C++
Async await in C++cppfrug
 

Andere mochten auch (7)

LLVM, clang & c++
LLVM, clang & c++LLVM, clang & c++
LLVM, clang & c++
 
C++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogrammingC++ How I learned to stop worrying and love metaprogramming
C++ How I learned to stop worrying and love metaprogramming
 
Programmation orientée objet avancée
Programmation orientée objet avancéeProgrammation orientée objet avancée
Programmation orientée objet avancée
 
Polymorphisme
PolymorphismePolymorphisme
Polymorphisme
 
Programmation orientée objet et java
Programmation orientée objet et javaProgrammation orientée objet et java
Programmation orientée objet et java
 
How static analysis supports quality over 50 million lines of C++ code
How static analysis supports quality over 50 million lines of C++ codeHow static analysis supports quality over 50 million lines of C++ code
How static analysis supports quality over 50 million lines of C++ code
 
Async await in C++
Async await in C++Async await in C++
Async await in C++
 

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

Inria - Catalogue logiciels
Inria - Catalogue logicielsInria - Catalogue logiciels
Inria - Catalogue logicielsInria
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Aziz Darouichi
 
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersREMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersAtol Conseils et Développements
 
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersREMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersATOL Conseils et Développements
 
Réutilisation de code entre windows 8 et windows phone 8
Réutilisation de code entre windows 8 et windows phone 8Réutilisation de code entre windows 8 et windows phone 8
Réutilisation de code entre windows 8 et windows phone 8Arnaud Auroux
 
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"OCTO Technology
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)rezgui mohamed
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la rechercheJohan Moreau
 
Catalogue pfe 2018 2019
Catalogue pfe 2018 2019Catalogue pfe 2018 2019
Catalogue pfe 2018 2019TELNETTunisie
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxLuneSabsPericolo1
 
Captronic grenoble 01102014 version presentee
Captronic grenoble 01102014 version presenteeCaptronic grenoble 01102014 version presentee
Captronic grenoble 01102014 version presenteePatrick MOREAU
 
DDD session BrownBagLunch (FR)
DDD session BrownBagLunch (FR)DDD session BrownBagLunch (FR)
DDD session BrownBagLunch (FR)Cyrille Martraire
 
#1 cloud-infra-talk- l ops-du-devops
#1 cloud-infra-talk- l ops-du-devops#1 cloud-infra-talk- l ops-du-devops
#1 cloud-infra-talk- l ops-du-devopsEmmanuel Roldan
 

Ähnlich wie Du Polymorphisme dynamique au polymorphisme statique : Abstraction sans perte de performances (20)

Inria - Catalogue logiciels
Inria - Catalogue logicielsInria - Catalogue logiciels
Inria - Catalogue logiciels
 
Chap1V2019: Cours en C++
Chap1V2019: Cours en C++Chap1V2019: Cours en C++
Chap1V2019: Cours en C++
 
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersREMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
 
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiersREMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
REMOcRA : offrir un outil décisionnel aux sapeurs-pompiers
 
Réutilisation de code entre windows 8 et windows phone 8
Réutilisation de code entre windows 8 et windows phone 8Réutilisation de code entre windows 8 et windows phone 8
Réutilisation de code entre windows 8 et windows phone 8
 
Chap1: Cours en C++
Chap1: Cours en C++Chap1: Cours en C++
Chap1: Cours en C++
 
SystemC
SystemCSystemC
SystemC
 
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"
La Duck Conf - "Quelle place pour le no code/low code dans les entreprises ?"
 
Cours structures des données (langage c)
Cours structures des données (langage c)Cours structures des données (langage c)
Cours structures des données (langage c)
 
Outils de construction pour la recherche
Outils de construction pour la rechercheOutils de construction pour la recherche
Outils de construction pour la recherche
 
Cours de c
Cours de cCours de c
Cours de c
 
Catalogue pfe 2018 2019
Catalogue pfe 2018 2019Catalogue pfe 2018 2019
Catalogue pfe 2018 2019
 
Chapitre 01 - Notions de base
Chapitre 01 - Notions de baseChapitre 01 - Notions de base
Chapitre 01 - Notions de base
 
COURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptxCOURS C++ [Enregistrement automatique]Complet (1).pptx
COURS C++ [Enregistrement automatique]Complet (1).pptx
 
Captronic grenoble 01102014 version presentee
Captronic grenoble 01102014 version presenteeCaptronic grenoble 01102014 version presentee
Captronic grenoble 01102014 version presentee
 
Airbus - Conception Réalisation Cockpit
Airbus - Conception Réalisation CockpitAirbus - Conception Réalisation Cockpit
Airbus - Conception Réalisation Cockpit
 
DDD session BrownBagLunch (FR)
DDD session BrownBagLunch (FR)DDD session BrownBagLunch (FR)
DDD session BrownBagLunch (FR)
 
§G-VisualDECO
§G-VisualDECO§G-VisualDECO
§G-VisualDECO
 
#1 cloud-infra-talk- l ops-du-devops
#1 cloud-infra-talk- l ops-du-devops#1 cloud-infra-talk- l ops-du-devops
#1 cloud-infra-talk- l ops-du-devops
 
introduction au CPP
introduction au CPPintroduction au CPP
introduction au CPP
 

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

  • 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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