Bonjour,
Dans l'optique de faire un moteur physique, j'ai choisi d'utiliser les template pour faire des arbres syntaxiques et simplifier mes calculs.
le syst�me est �xpliqu� dans ce tutoriel:
http://loulou.developpez.com/tutorie...taprog/#LIII-C
Je travaille sur des vecteur de 3 double et des matrices de 3*3 doubles.
Ce que je veux faire est d�river une expression math�matique, pour ensuite rentrer dans un solveur les t�rmes inconnus( les t�rmes inconnus seront les t�rmes de d�riv�e seconde). Pour l'instant j'ai simplement impl�ment� la d�rivation et l'�valuation de l'expression. Et le probl�me est que le compilateur n'inline pas assez l'arbre syntaxique, or sa complexit� devient quadratique en fonction du nombre d'�l�ments dans l'arbre syntaxique. On peut facilement le voir lorsque l'on fait une sortie assembleur:
Par exemple si l'arbre syntaxique est r�ellement construit (ce qui ne devrait pas arriver si l'inlining fonctionne bien):
Pour une suite d'additions la taille de la variable de l'expression a la taille de l'ensemble des variable qu'il contitent
Or la construction de l'arbre se fait comme suit:
Code : S�lectionner tout - Visualiser dans une fen�tre � part sizeof(v1+v2+v3+v4+v5+v6+v7+v8)==sizeof(v1)*8
(avec Tn+1==Opplus<Tn,T> et)
Code : S�lectionner tout - Visualiser dans une fen�tre � part sizeof(Tn)==sizeof(T)*n
La construction du type int�rm�di�re Tn se fait en copiant une variable de taille n*sizeof(T)
Code : S�lectionner tout - Visualiser dans une fen�tre � part Opplus<Tn,T>(Tn a, T b):op1(a),op2(b){}
Or il ya n type int�rm�di�re construit donc la taille totale des variables d�plac�e est sizeof(T)n*(n+1)/2
Ce qui fait beaucoup, la complexit� devient quadratique alors que l'on voulait gagner en complexit�!!
Le compilateur ne fait pas son travail! Deplus cela devient dangereux lorsque je d�rive une expression qui fait intervenir des multiplication:
J'ai donc de gros template, si le template n'est pas optimis� la complexit� finale dans le pire des cas est de
Code : S�lectionner tout - Visualiser dans une fen�tre � part sizeof(derive(derive(v*v*v)))==sizeof(v)*27
27*28/2*C(copie)+27*C(op�rations)
alors qu'il ne devrait y avoir seulement 27*C(op�rations)
Voil� le code du template pour quelques op�rations(ce code fonctionne):
essais.h
matr9d.cpp
matr9d.h
essais.cpp
patrons.h
matr9f.h et matr9f.cpp contienne le vecteur de 3 double et la matrice de 3*3 double, avec plein d'op�rations.
patrons.h contient deux trois template
essai.cpp contient le main et essai.h contient l'arbre syntaxique.
On peut essayer diff�rentes expressions qui r�alisent la m�me chose entre le calcul direct et le calcul par �valuationde l'arbre syntaxique. On voit que la sortie assembleur effectu�e avec l'arbre syntaxique est plus longue.
compilation pour sortie assembleur:
g++ -O2 -S -std=c++0x *.cpp
Y a-t-il un truc pour r�gler ce probl�me?
Merci d'avance pour vos r�ponses![]()
Partager