Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2403 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

Manipulation d'expression par templates : la vengeance

n°507801
Joel F
Real men use unique_ptr
Posté le 04-09-2003 à 19:51:04  profilanswer
 

Reprise du message précédent :
Bon :
 
CA MARCHE !
 
J'ai testé pour deux, trois et quatre arguments et le gain est de bien 35%. Je suis pas a 50% de plus bicose les tests et le fait que j'ai pas MPT les tuples mais c deja encourageant :D
 
MERCI !!!!

mood
Publicité
Posté le 04-09-2003 à 19:51:04  profilanswer
 

n°507903
Taz
bisounours-codeur
Posté le 04-09-2003 à 21:58:12  profilanswer
 

plus le vecteur est grand, plus le surcout est négligeable. je savais bien que je déconnais pas tout à l'heure
edit: tu as fait avec des tuples ? si oui tu a gardé ma solution ou tu as fait un truc avec des références et tie ?


Message édité par Taz le 04-09-2003 à 21:58:48
n°507906
Joel F
Real men use unique_ptr
Posté le 04-09-2003 à 22:02:00  profilanswer
 

j'ai pas réfléchi, j'ai pris les tuples.
par contre les tuples boost s'arretent à 10 éléments. Va falloir que j'edite ca pour en avoir plus.
 
En clair je peut gagner 30-40% sur avant :D
bref maintenant j'ecris du code clair (r =x+y/2*ln(z)) et je profite de 70% de l'accéléeration max :D (x3 à x12)

n°507908
Taz
bisounours-codeur
Posté le 04-09-2003 à 22:02:53  profilanswer
 

cool. en effet pour les tuples. les boost::tuples sont vraiment chouettes

n°507923
Taz
bisounours-codeur
Posté le 04-09-2003 à 22:24:34  profilanswer
 

par contre tu as gardé comme moi des fonctions normales pas templates avec des numéros pour travailler les tuples ? par ce que sinon:
1) faut mettre un paramètre template Tuple en plus du numéro, pour Tuple, à moins de mettre la liste des 10args de Tuple, bref, la merde
2) la spécialisation partielle des fonctions n'étant pas possible, faut faire une classe
3) faut faire des t. template get<0>(), gaffe de pas oublier
4) et doit y avoir d'autres merdes ...

n°507932
Taz
bisounours-codeur
Posté le 04-09-2003 à 22:32:58  profilanswer
 


tu m'offres un bi-G4 ?

n°507993
Joel F
Real men use unique_ptr
Posté le 04-09-2003 à 23:32:36  profilanswer
 

Taz a écrit :


1) faut mettre un paramètre template Tuple en plus du numéro, pour Tuple, à moins de mettre la liste des 10args de Tuple, bref, la merde


Je suis dessus :D
 

Taz a dit :


2) la spécialisation partielle des fonctions n'étant pas possible, faut faire une classe


j'ai vu :/ mais bon si je faitune classe avec les fonctions
en static ca devrait aller.
 

Taz a ordonné :


3) faut faire des t. template get<0>(), gaffe de pas oublier


oui  :jap:  
 

Taz a pensé :


4) et doit y avoir d'autres merdes ...


 
hmmm la je vois pas, je pense plutto que ca va etre a mon code
de se plier a sa.
 
 
Pour le bi-G4 y en a un en rab au labo mais on le agrde  :sol:

n°508073
Taz
bisounours-codeur
Posté le 05-09-2003 à 00:34:52  profilanswer
 

dernières remarques:
 
1) on peut manipuler mes UniqueLoader::Shared directement, en remplaçant la classe par un typedef et en faisant une fonction load(shread_ptr<Shared> )
 
2) quand y a pas beaucoup d'éléments ça va, la méthode benête des comparaisons fonctionnes, mais le cout est fonction de (N! / 2!) pour N>2 si je ne m'abuse. alors un joli DesignPattern Stratégie, une joli surcahrge de < et == (en utilisant les adresses), et à partir d'une certaine limite, on créer tous les UniqueLoader, on fout tout en conteneur, on trie, on parcours en fusionnant (affectation pour partager l'implémentation) les éléments égaux.  
l'algo à la con que j'ai filé, est bête et inefficace, (il doit y avoir plusieurs fois les meme comparaisons), mais il a le mérite de s'écrire facilement et l'invocation est simple (UniqueN(tuple)). ça serait interessant quand meme de voir si le compilo est pas capable de détecte les comparaisons en trop.
 
donc:
si y a beaucoup -> tri + affectation
sinon, la solution N² comme un tri par bulles: comparaison avec chaque élément, et si ==, on partage l'implémentation
 
le problème de ces solutions, c'est que l'allocation. il faut un truc genre tuple, bref un truc indexable et initialisable ( (obligatoirement, les reférences impose cela, à moins de fonctionner avec des adresses). avec un Array<N>, on peut std::sort, mais on ne peut pas initialiser (à moins de passer par des pointeurs), mais avec un Tuple, on doit passer par la méthode N² de comparaisons (pas d'itérations possibles). donc: soit passer à un fonctionnement avec des pointeurs directement, comme ça on peut faire un Array<UniqueLoader, N> et le remplir tranquillement, puis le std::sort ou N²; soit garder nos sympatiques tuples et garder la N².
 
le tout est donc de bien estimer les 3 méthodes: N!, N², et std::sort, en terme de cycle et de mémoire. N² me semble la plus appropriée, j'ai un peu peur de std::sort, à déterminer expérimentalement.

n°508130
Taz
bisounours-codeur
Posté le 05-09-2003 à 01:20:58  profilanswer
 

mon dernier mot

Code :
  1. // http://forum.hardware.fr/forum2.ph [...] 160&cat=10
  2. // réduire les paramètres alias
  3. #include <iostream>
  4. #include <boost/shared_ptr.hpp>
  5. #include <boost/tuple/tuple.hpp>
  6. struct Vector
  7. {};
  8. struct LoadedVectorHandle
  9. {
  10.   Vector *v;
  11.   LoadedVectorHandle(Vector *vv = 0)
  12.     : v(vv)
  13.   {}
  14. };
  15. LoadedVectorHandle load(Vector &v)
  16. {
  17.   std::cout << "loaded " << static_cast<void*>(&v) << '\n';
  18.   return LoadedVectorHandle(&v);
  19. };
  20. struct Shared
  21. {
  22.   Vector *v;
  23.   LoadedVectorHandle lvh;
  24.   bool loaded;
  25.   Shared(Vector *vv)
  26.     : v(vv), loaded(false)
  27.   {}
  28. };
  29. typedef boost::shared_ptr< Shared > UniqueLoader;
  30. LoadedVectorHandle load(UniqueLoader ul)
  31. {
  32.   if(!ul->loaded)
  33.     {
  34.       ul->lvh = ::load(*ul->v);
  35.       ul->loaded=true;     
  36.     }
  37.   return ul->lvh;
  38. }
  39. void Unique(UniqueLoader uls[], size_t N)
  40. {
  41.   for(unsigned i=0; i<N; ++i)
  42.     {
  43.       UniqueLoader *p(&uls[i]);
  44.       for(unsigned j=i+1; j<N; ++j)
  45. {
  46.   if((*p)->v == uls[j]->v)
  47.     {
  48.       *p = uls[j];
  49.     }
  50. }     
  51.     }
  52. }
  53.      
  54. void compute(LoadedVectorHandle a, LoadedVectorHandle b, LoadedVectorHandle c)
  55. {
  56.   std::cout << "compute "
  57.     << static_cast<void*>(a.v) << ' '
  58.     << static_cast<void*>(b.v) << ' '
  59.     << static_cast<void*>(c.v) << '\n';
  60. }
  61. void computeWrapper(Vector &a, Vector &b, Vector &c)
  62. {
  63.   std::cout << "computeWrapper "
  64.     << static_cast<void*>(&a) << ' '
  65.     << static_cast<void*>(&b) << ' '
  66.     << static_cast<void*>(&c) << '\n';
  67.   UniqueLoader args[3];
  68.   args[0]= UniqueLoader(new Shared(&a));
  69.   args[1]= UniqueLoader(new Shared(&b));
  70.   args[2]= UniqueLoader(new Shared(&c));
  71.   Unique(args, 3);
  72.   compute( load(args[0]), load(args[1]), load(args[2]) );
  73.   std::cout << std::endl;
  74. }
  75. int main()
  76. {
  77.   Vector a, b, c;
  78.   computeWrapper(a, b, c);
  79.   computeWrapper(a, a, b);
  80.   computeWrapper(a, a, a);
  81. }

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[CSS] height d'un div reglé par expression[C] Question sur les union et gestion de priorités dans une expression
expression reguliere[JS] Regular expression
templates de formulaires pour PHPManipulation de string c++
[Meta-prog] Les templates-ExpressionsSpécialisation des templates
PHP expression reguliere helpExpression Reguliere ... Où est le problème ?
Plus de sujets relatifs à : Manipulation d'expression par templates : la vengeance


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)