Tableau dynamique BOOST

Tableau dynamique BOOST - C++ - Programmation

Marsh Posté le 13-04-2009 à 09:00:33    

Salut  :p  
 
Je cherche à manipuler le plus rapidement possible des tableaux 1D et 2D de taille variable.
...et j'ai pensé à Boost  :ange:  
D'après la doc, il semble que l'utilisation d'array ou multiarray ne concerne que des tableaux de tailles fixes  :cry:  
Est-ce bien vrai, n'y a-t-il pas d'astuces pour gérer des tableaux de taille variable ?
 
merci pour vos précisions...

Reply

Marsh Posté le 13-04-2009 à 09:00:33   

Reply

Marsh Posté le 13-04-2009 à 09:13:32    

1D dynamqiue : std::vector
2D dynalmique : boost::multi_array
 
Y a que boost::array qui gére des tailles statiques.

Reply

Marsh Posté le 13-04-2009 à 11:39:39    

Joel F a écrit :

1D dynamqiue : std::vector
2D dynalmique : boost::multi_array
 
Y a que boost::array qui gére des tailles statiques.


 
Ah, je me disais bien que j'avais mal lu, merci Joel F  :D  
Je vais donc revoir ce que j'avais commencé à faire avec multi_array...
Mais à première vue, ce qui semble peu pratique, c'est l'absence d'un push_back , car il faut directement attaquer les positions dans le tableau tab[n][n][...]. Et d'après ce que j'imagine, on doit évaluer le nombre d'éléments ds chaque dimension avant de trouver l'emplacement suivant !?
... et pas d' erase non plus, là par contre je vois pas comment effacer un élément  :ouch:

Message cité 1 fois
Message édité par spinzero le 13-04-2009 à 12:05:36
Reply

Marsh Posté le 13-04-2009 à 12:20:17    

spinzero a écrit :


 
Ah, je me disais bien que j'avais mal lu, merci Joel F  :D  
Je vais donc revoir ce que j'avais commencé à faire avec multi_array...
Mais à première vue, ce qui semble peu pratique, c'est l'absence d'un push_back , car il faut directement attaquer les positions dans le tableau tab[n][n][...]. Et d'après ce que j'imagine, on doit évaluer le nombre d'éléments ds chaque dimension avant de trouver l'emplacement suivant !?
... et pas d' erase non plus, là par contre je vois pas comment effacer un élément  :ouch:


c'est une matrice NxM[...] ça n'a pas de sens de changer la taille d'un élément. Si ton machin c'est plus un tas de spaghettis, alors tu ferais mieux de faire des list de list [...] de vector

Reply

Marsh Posté le 13-04-2009 à 13:36:58    

Taz a écrit :


c'est une matrice NxM[...] ça n'a pas de sens de changer la taille d'un élément.


Donc même si je voulais modifier la capacité de la 2d colonne du premier élément de ma matrice, cela s'appliquerait à toute les autres.  
Il faut donc fixer les limites dès le début,  même si on ne sait pas quelle sera la quantité de particules (2d col) contenu dans une mollécule(1ere col) ?
 

Taz a écrit :

Si ton machin c'est plus un tas de spaghettis, alors tu ferais mieux de faire des list de list [...] de vector


Ben je voudrais juste associer à chaque assiette (1er col), une quantité variable de spaghettis (2d col)  :whistle:

Message cité 1 fois
Message édité par spinzero le 13-04-2009 à 13:39:34
Reply

Marsh Posté le 13-04-2009 à 13:45:41    

spinzero a écrit :


Donc même si je voulais modifier la capacité de la 2d colonne du premier élément de ma matrice, cela s'appliquerait à toute les autres.  
Il faut donc fixer les limites dès le début,  même si on ne sait pas quelle sera la quantité de particules (2d col) contenu dans une mollécule(1ere col) ?
 


 

spinzero a écrit :


Ben je voudrais juste associer à chaque assiette (1er col), une quantité variable de spaghettis (2d col)  :whistle:


Donc pas une matrice, ni un tableau (au sens taille fixe).

Reply

Marsh Posté le 13-04-2009 à 19:53:17    

effectivement, le besoin suggère plutot un vector de list non ?
ou un array de list si la "1ere colonne" ne change jamais de taille.
apres, en fonction des besoins des accès aux listes (en terme de perfs par rapport aux operations qui seront faites le plus souvent), il faut choisir le bon conteneur.
par exemple, si tu ne sais pas la taille finale, tu ne feras que push_back dessus puis finir par parcourir le tout et désallouer tout a la fin.
boost::fast_pool sera un parfait allocateur pour les list.


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 14-04-2009 à 12:42:33    

Lightness1024 a écrit :

... plutot un vector de list non ou un array de list si la "1ere colonne" ne change jamais de taille.


Par list  veux-tu dire ptr_list de boost ?
 
En tout cas le principe du vector de liste semble le plus approprié.  
Pour avoir une idée, quelle serait la différence en terme de performance entre une matrice et un vector ou array de list ?
 
Car si c'est considérable, quitte à avoir de nombreuses cases vides,  peut être faudrait-il conserver la première solution  ?
 
Enfin, je ne me rends pas encore compte de ce que je pourrais gagner comme perf mais ces calculs ayant lieu en même temps que d'autres,  des collisions 3d géré par un moteur de physique par ex, il faudrait que je sois le plus léger possible  :sweat:  
 

Lightness1024 a écrit :

... si tu ne sais pas la taille finale,...boost::fast_pool sera un parfait allocateur pour les list.


Je ne l'ai pas encore testé mais en faisant quelques recherches je suis tombé sur cette remarque (http://www.nabble.com/-boost::pool [...] 29499.html) :
 
1. memory blocks allocated by boost::fast_pool tended to never get freed again until the end of the program, because the release mechanism was (is?) disabled
... In fact, when I tested it, fast_pool eventually ran out of memory at about the same time the the local member variable storing the memory increment size sufferd an overflow!

 
J'ai peut être pas compris, mais on dirait qu'on ne peut pas libérer de la mémoire avec cette méthode !?


Message édité par spinzero le 14-04-2009 à 16:25:07
Reply

Marsh Posté le 14-04-2009 à 16:31:29    

Taz a écrit :


...pas une matrice, ni un tableau (au sens taille fixe).


Tu t'y prendrais comment alors ?

Reply

Marsh Posté le 14-04-2009 à 21:37:56    

oula, en effet si il y a des leaks.... je ne sais pas je n'ai jamais testé cet allocateur.
j'utilise un conteneur freelist qui me convient
-> http://lightness1024.free.fr/xtrem [...] eelist.hpp
 
si tu veux utiliser des indices tres disparates pour ne jamais rien mettre dans les zones libres, il s'agit d'un contenu "sparse".
peut etre que ce que tu veux c'est ca ?
 

Code :
  1. boost::unordered_map< std::size_t, tools::freelist< double > > mySparseMatrix;
  2. for (std::size_t c = 0; c < 20; ++c)
  3.   for (std::size_t l = 0; l < variable_limit(....); ++l)
  4.     mySparseMatrix[compute_large_value(....)].push_back(compute_some_double(....));


 
ceci créerait une "matrice" de 20 colonnes mais indexée par des valeurs potentiellement tres étalées sans gigantesque perte de mémoire (comme ce serait le cas avec un vector)
chacune des colonne contiendrait un nombre variable de valeur 'double', avec une operation 'push' rapide.
il serait rapide d'acceder en random a une colonne specifique, mais tu ne pourrais que itérer sur les lignes.

Message cité 1 fois
Message édité par Lightness1024 le 14-04-2009 à 21:39:18

---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 14-04-2009 à 21:37:56   

Reply

Marsh Posté le 14-04-2009 à 21:49:33    

y a pas de leak, juste que la politique de dealloc est de desaoulée en fin de programme ce qui peut mener à arriver à la fin de la zone allouable dans un programme.


Message édité par Joel F le 14-04-2009 à 21:49:40
Reply

Marsh Posté le 15-04-2009 à 10:50:47    

Lightness1024 a écrit :

oula, en effet si il y a des leaks.... je ne sais pas je n'ai jamais testé cet allocateur.


Comme le dit JoelF c'est un choix volontaire... j'aimerais bien comprendre l'intérêt  :heink:  
Peut-on encore parler le tailles dynamiques si l'on ne peut libèrer de la mémoire durant l'execution d'un programme !?
 

Lightness1024 a écrit :


... freelist ... indices tres disparates ..."sparse".

Code :
  1. boost::unordered_map< std::size_t, tools::freelist< double > > mySparseMatrix;
  2. for (std::size_t c = 0; c < 20; ++c)
  3.   for (std::size_t l = 0; l < variable_limit(....); ++l)
  4.     mySparseMatrix[compute_large_value(....)].push_back(compute_some_double(....));



 
Yep, je ne demande qu'à essayer ... ;)  
 

Lightness1024 a écrit :


...  des valeurs potentiellement tres étalées sans gigantesque perte de mémoire (comme ce serait le cas avec un vector)]


Que veux-tu dire par gigantesque , c'est mesurable ?
 

Lightness1024 a écrit :

chacune des colonne contiendrait un nombre variable de valeur 'double', avec une operation 'push' rapide.


Doit-on préciser quand une colonne est de taille fixe et l'autre non, ou ça ne change rien ?
 L'idéal étant pour moi une 1ere colonne fixe et l'autre non...
 

Lightness1024 a écrit :

il serait rapide d'acceder en random a une colonne specifique, mais tu ne pourrais que itérer sur les lignes.


Là j'suis nouille sur le vocab mais 'les lignes', c'est à l'intérieur d'une colonne ou de la matrice ?
 
  :jap:  
 

Reply

Marsh Posté le 15-04-2009 à 10:58:45    

spinzero a écrit :


Comme le dit JoelF c'est un choix volontaire... j'aimerais bien comprendre l'intérêt  :heink:  
Peut-on encore parler le tailles dynamiques si l'on ne peut libèrer de la mémoire durant l'execution d'un programme !?


 
TU libère jamais pendant. Si t'as besoin de reallouer tu alloue un novueau bloc et laisse tomber l'ancien.
A la terminaison du programme, tout les blocs alloués (actifs ou inactifs sont libéré).
 
En gros, t'as une grosse alloc au debut du chargement du proigramme, allouer pendant coute rien, desallouer coute rien et t'as une seul grosse desalloc en fin de programme.
 
Donc la justification est assez simple à trouver ;)

Reply

Marsh Posté le 15-04-2009 à 12:51:26    

Joel F a écrit :


 
TU libère jamais pendant. Si t'as besoin de reallouer tu alloue un nouveau bloc et laisse tomber l'ancien


Lorsque tu parles de 'reallouer un novueau bloc' c'est en pensant recommencer quelque chose à partir de zéro, c-à-d supprimer forcément les données antérieures où l'on peut imaginer un transfert vers une matrice plus grande ?
J' avais pensé redéclarer une matrice plus grande à mesure que l'on ajoute des éléments  et la remplir ...mais ça paraissait absurde, étant donné que durant le transfert, 2 matrices était memoire soit 2*+ de données !?
Enfin, est-ce qu'on peut bidouiller de cette manière tout en restant performant où c'est n'importe quoi ?
 

Joel F a écrit :

Donc la justification est assez simple à trouver ;)


Oui c'est clair, enfin je l'imagine comme une étape préliminaire importante au lancement d'une apli,  par ex un jeux video avec le chargement des media, textures, maillages, sons...tout un monde à mettre en place  :D   mais pour un groupe d'objets particuliers, créer à la volé ça colle moins  ;)


Message édité par spinzero le 15-04-2009 à 13:21:47
Reply

Marsh Posté le 15-04-2009 à 13:51:34    

soyons clair sur ce que tu as envie de faire.
c'est bien un truc comme ca ou pas ?
http://lightness1024.free.fr/conteneur_sparse.jpg


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 15-04-2009 à 14:09:22    

Exactly !
... j'insistais juste pour savoir à quel point un tableau fixe serait plus performant mais dans l'idée ton schéma serait le mieux.
 
ps:merci pour le schèm, je vois où sont les lignes  :)


Message édité par spinzero le 15-04-2009 à 14:11:45
Reply

Marsh Posté le 15-04-2009 à 14:28:51    

Avec Freelist je commence par :
 

Code :
  1. #include <boost/unordered_map.hpp>
  2. #include <tools/freelist.hpp>
  3. #include <cassert>
  4. static boost::unordered_map< std::size_t, tools::freelist< int > > molles_A;
  5. ...
  6. void ajoute( int mol_i, int mode, int idA, int idB )
  7. {
  8. ...
  9. molles_A[0] = mol_i;
  10. //pAdd = molles_A[0][0].push_back(idA);//ne renvoit pas de bool !
  11. molles_A[0][0].push_back(idA);
  12. }


 
Mais erreur C2676 à la ligne 14  :sweat:  
binary '[':'tools::freelist<T> does not define this operator or a conversion to a type acceptable to te predefined operator
 
Ca aussi ça ne marche pas:
 

Code :
  1. molles_A[0] = mol_i;
  2. tools::freelist< int >id_L;
  3. id_L.push_back(idA);
  4. molles_A[0][0].push_back(id_L);


 
ps: j'entends dire qu' std::size_t est un type avec lequel on mesure un array...mais ici comme on ne peut pas le redéfinir, est-ce qu'il sert de valeur indéfinie lors de la déclaration de notre tableau ?


Message édité par spinzero le 15-04-2009 à 17:02:33
Reply

Marsh Posté le 16-04-2009 à 13:20:30    

Comme j'ai encore du mal avec la syntaxe de boost...je suis reparti du multi_array avant d'attaquer freelist :
 

Code :
  1. typedef boost::multi_array<int, 2> array_type;
  2. typedef array_type::index index;
  3. int cl1 = 10;
  4. int cl2 = 50;
  5. array_type molles_A(boost::extents[cl1][cl2]);
  6. ...
  7. void ajouter(int idMol, int idA, int idB)
  8. {
  9. int nextPos = ..? comment évaluer la position suivant le dernier élément ajouté ?
  10. molles_A[idMol][nextPos] = idA;
  11. molles_A[idMol][nextPos] = idB;
  12. }
  13. void supprimer(id)
  14. {
  15. for(index i = 0; i != cl1; ++i)
  16.     for(index j = 0; j != cl2; ++j)
  17.        if( molles_A[i][j]  == id )
  18. molles_A[i][j] = NULL;
  19.  break;
  20. }


 
 
J'épluche encore la doc de Boost mais pourriez vous m'aider à trouver la formulation pour nextPos ?
 
Et que pensez vous de la manière de supprimer() un élément ?
 
merci


Message édité par spinzero le 16-04-2009 à 16:44:42
Reply

Marsh Posté le 16-04-2009 à 22:57:00    

pour quel conteneur push_back renvoit-il un bool ?
http://www.cppreference.com/wiki/stl/list/push_back
une liste ne peut pas s'acceder avec l'operateur [] c'est normal si molles[x][y] ne compile pas.
 
voici une solution avec contenu mémoire optimisé exactement par rapport au contenu et accès "efficace":
 

Code :
  1. /**********************************************************************
  2. * File  : sparse_2D_content.cpp
  3. * Date  : 16/04/2009
  4. *********************************************************************/
  5. #include <boost/unordered_map.hpp>
  6. #include <iostream>
  7. struct Position
  8. {
  9. friend size_t hash_value(Position const & p)
  10. {
  11.  size_t seed = 0;
  12.  boost::hash_combine(seed, p.x);
  13.  boost::hash_combine(seed, p.y);
  14.  return seed;
  15. }
  16. size_t x;
  17. size_t y;
  18. Position(size_t x, size_t y) : x(x), y(y)
  19. {}
  20. };
  21. bool operator == (Position const & l, Position const & r)
  22. {
  23. return l.x == r.x && l.y == r.y;
  24. }
  25. int generate_ints;
  26. struct Molle
  27. {
  28. int some_data;
  29. Molle() : some_data(++generate_ints)
  30. {}
  31. };
  32. std::ostream& operator << (std::ostream& os, Molle const & m)
  33. {
  34. os << m.some_data;
  35. return os;
  36. }
  37. int main()
  38. {
  39. const size_t y_max = 3;
  40. boost::unordered_map< Position, Molle > sparse2Dcontent;
  41. typedef boost::unordered_map< Position, Molle >::iterator It;
  42. // ==== usage ====
  43. size_t limit[y_max] = {4,
  44.         2,
  45.         3};
  46. for (size_t y = 0; y < y_max; ++y)
  47. {
  48.  for (size_t x = 0; x < limit[y]; ++x)
  49.  {
  50.   sparse2Dcontent[Position(x, y)] = Molle();
  51.  }
  52. }
  53. size_t x = 0, y = 0;
  54. while (y < y_max)
  55. {
  56.  It it = sparse2Dcontent.find(Position(x, y));
  57.  if (it == sparse2Dcontent.end())
  58.  {
  59.   ++y;
  60.   x = 0;
  61.   std::cout << std::endl;
  62.  }
  63.  else
  64.  {
  65.   std::cout << "element en y:" << y << " x:" << x << " = " << it->second.some_data << std::endl;
  66.   ++x;
  67.  }
  68. }
  69. return 0;
  70. }


 
 
affichage:
 

element en y:0 x:0 = 2
element en y:0 x:1 = 4
element en y:0 x:2 = 6
element en y:0 x:3 = 8
 
element en y:1 x:0 = 10
element en y:1 x:1 = 12
 
element en y:2 x:0 = 14
element en y:2 x:1 = 16
element en y:2 x:2 = 18


---------------
http://projets.6mablog.com/
Reply

Marsh Posté le 17-04-2009 à 10:53:28    

Super Lightness1024  :wahoo:  
 

Lightness1024 a écrit :

pour quel conteneur push_back renvoit-il un bool ?
http://www.cppreference.com/wiki/stl/list/push_back
une liste ne peut pas s'acceder avec l'operateur [] c'est normal si molles[x][y] ne compile pas.


ah, j'avais pas compris ça comme ça  :heink:  
 
...par contre j'ai un peu de mal à saisir ta manière de modifier une Molle  :D  
Jusqu'à présent je pensais la déduire du tableau (1ere col pour son ID, 2d col particle IDs),  
et là c'est carrément une Structure !
Bon, ok pour le principe mais ces 2 lignes m'intrigue :

Code :
  1. Molle() : some_data(++generate_ints)


...

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


Je ne vois pas où tu modifies le contenu d'une Molle ?
On dirait que ça se passe dans la sructure avec ++generate_ints produisant une valeure aléatoire ?
Comme je ne suis pas habitué à la syntaxe, j'ai l'impression que Molle() est appelé comme une fonction ?
 
Enfin, le test fonctionne, reste à formuler l'ajout/suppression des ID de mes particules ds la 2d col ...
 
merci bcp pour ton exemple  :jap:  
 
ps: j'ai entendu dire que les arrays 2D d'STLSoft seraient plus rapide .?!


Message édité par spinzero le 17-04-2009 à 10:58:28
Reply

Marsh Posté le 17-04-2009 à 11:21:06    

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.
 

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


 
creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau
 

Reply

Marsh Posté le 17-04-2009 à 11:27:37    

Joel F a écrit :

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.
 

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


 
creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau
 


Ca vaut quoi les sparse machin implémenté sur des hash ? Faut vraiment que ça soit ultra sparse, parce que niveau localité, c'est 0 ?

Reply

Marsh Posté le 17-04-2009 à 11:31:00    

moi j'aime aps, les technqiues à base d'horizon m'ont trjrs paru  meilleurs.
Ca ou utilisé des algos  cache oblivious

Reply

Marsh Posté le 17-04-2009 à 11:41:44    

Joel F a écrit :

Code :
  1. Molle() : some_data(++generate_ints)


constructeur par défaut qui appelle ++ sur generate_int qui incremente l'entier.


Evidament, c'est pourtant ce que j'ai vu...mais  mal interprété les valeurs de x  :whistle:  

Code :
  1. sparse2Dcontent[Position(x, y)] = Molle();


Joel F a écrit :


creation d'un objet Molle temporaire apr appel du constructeur par defaut et copie dasn le tableau


 
Ok, donc je peux faire passer les id de mes particules comme ça :
 

Code :
  1. void updateMolles_A(  int id_mol, int idA, int idB)
  2. {
  3. generate_ints = idA;
  4. sparse2Dcontent[Position(id_mol, 0)] = Molle();
  5. generate_ints = idB;
  6. sparse2Dcontent[Position(id_mol, 1)] = Molle();
  7. }


Message édité par spinzero le 17-04-2009 à 12:14:03
Reply

Marsh Posté le 17-04-2009 à 11:46:10    

Joel F a écrit :

... technqiues à base d'horizon ...ou des algos  cache oblivious


Ah, pourrais-tu être plus explicite ?
 
ps: ça rabaisse sans doute le niveau du sujet discuté  ;) ...mais il paraît qu'en terme de perf, le plus radical reste le bon vieux tableau natif [n][n];  sachant qu'on ne pourra pas gérer d'exceptions mais si en sachant cadrer correctement...


Message édité par spinzero le 17-04-2009 à 11:47:50
Reply

Marsh Posté le 17-04-2009 à 15:18:37    

le coup du tableau natif c'ets un bon vieux FUD.
Quant au reste : google :o

Reply

Marsh Posté le 18-04-2009 à 09:05:35    

Joel F a écrit :

...tableau natif c'ets un bon vieux FUD.


 :lol:  bon
 
As tu déjà utilisé StlSoft ?
 
Sinon, une dernière interrogation sur les tableaux:
Un tableau fixe, déclaré ou non au début d'un programme, n'est-il pas aussi plus rapide à parcourir, du fait que ses cases mémoires sont plus compactes que celles d'un tableau dynamique qui, en fonction de la mémoire disponible à un instant T, mobilisera des cases plus disparates ?

Reply

Marsh Posté le 18-04-2009 à 13:00:49    

spinzero a écrit :


 :lol:  bon

 

As tu déjà utilisé StlSoft ?

 

Sinon, une dernière interrogation sur les tableaux:
Un tableau fixe, déclaré ou non au début d'un programme, n'est-il pas aussi plus rapide à parcourir, du fait que ses cases mémoires sont plus compactes que celles d'un tableau dynamique qui, en fonction de la mémoire disponible à un instant T, mobilisera des cases plus disparates ?

Ca dépend si t'alloues ton tableau à N dimension comme un étudiant de L1 ou si tu mérites ton salaire (hum enfin mériter pour 3 lignes de codes...)

Message cité 1 fois
Message édité par Taz le 18-04-2009 à 13:01:22
Reply

Marsh Posté le 18-04-2009 à 19:35:17    

un tableau à N dimensions dense bien alloué est compacte et cache friendly. Sinon c'ets que tu sais pas programmer :o
 
J'ai donner 10 fois le code pr le faire proprement

Reply

Marsh Posté le 18-04-2009 à 19:36:46    


 
Ben non, je vois tout les jorus de ingés et des psot-docs me crier que tab[][] ets plsu rapide que tout alors que meme vector<T> ou multi_array<T,N> votn strictement à la meme vitesse sur des cas normaux. Ce qui comtpe c'est le cache friendliness de l'algo pas comment ton tableau est géré (sauf remarque precedente sur l'alloc)

Reply

Marsh Posté le 19-04-2009 à 01:12:08    

Taz a écrit :

Ca dépend si t'alloues ton tableau à N dimension comme un étudiant


C'est vrai que dans mon cas, je n'ai même pas le niveau d'un mauvais étudiant  ;)  
Si j'avais compris plus tôt la puissance de la prog, j'ai pourtant eu un amiga avec des démo pirates...j'aurais changé de branche directe!.. mais bon, ch'suis plus étudiant et pouvoir apprendre grâce aux forums, c'est vraiment génial!
Merci les gars  :jap:  
 

Taz a écrit :

si tu mérites ton salaire (hum enfin mériter pour 3 lignes de codes...)


Oh oui, s'il arrive au bout de son projet, je peux te dire qu'il sera le plus heureux des hommes  :pt1cable:


Message édité par spinzero le 19-04-2009 à 01:55:23
Reply

Marsh Posté le 19-04-2009 à 01:24:22    

Joel F a écrit :


... je vois tout les jorus de ingés et des psot-docs me crier ...
)


Oui, moi je prépètes ce que je lis car je commence mais toi qui exerce, en faisant tes propres tests, tu dois avoir un avis perso ?
Ce que tu m'as dis jusqu'à présent, c'était théorique ou aussi lié à ta praxis ?
 

Joel F a écrit :


 Ce qui comtpe c'est le cache friendliness de l'algo pas comment ton tableau est géré (sauf remarque precedente sur l'alloc)


Je découvre l'expression (http://blog.cplusplus-soup.com/200 [...] rency.html)  mais j'ai déjà rencontré un problème de processus concurrents, une boucle graphique OpenGl contre une boucle son avec buffer;  et c'est là que j'ai découvre les threads  :ange: ...

Reply

Marsh Posté le 19-04-2009 à 09:09:54    

spinzero a écrit :


Oui, moi je prépètes ce que je lis car je commence mais toi qui exerce, en faisant tes propres tests, tu dois avoir un avis perso ?
Ce que tu m'as dis jusqu'à présent, c'était théorique ou aussi lié à ta praxis ?


 
C'est d ela pratique, ca fait 5 ans que mon boulot c'est faire des outils de calcul haute-performances alors ce genre de blague , je les ai testé de A à Z. Moralité, l'interface entre la mémorie brute et l'utilsiateur n'a pas d'impact. La seule chose qui impact c'est la manière dont les elements sont allouées et comment on aprcourt. Engros :
 
tableau natif [][] est equivalnt à tableau dynamique dans une classe avec operator() et ces deux méthodes sont 3 à 12 fois plus rapide que des iterator.

Reply

Marsh Posté le 19-04-2009 à 19:17:29    

Joel F a écrit :


 ca fait 5 ans que mon boulot c'est faire des outils de calcul haute-performances


Ok, respect  :jap:  
 

Joel F a écrit :


tableau natif [][] est equivalnt à tableau dynamique dans une classe avec operator() et ces deux méthodes sont 3 à 12 fois plus rapide que des iterator.


 
Je le note en rouge !
...hum, encore un petit éclaircissement,  
dans  ce que tu m'as proposé plus haut, on utilise à la fois operator et iterator !?


Message édité par spinzero le 19-04-2009 à 19:17:45
Reply

Marsh Posté le 19-04-2009 à 19:21:33    

Bah ça depends de ce que tu as besoin aussi et si ton container à une semantique de conteneur dense contigu ce qui n'est pas le cas d'une hash table.

Reply

Marsh Posté le 20-04-2009 à 09:12:49    

Joel F a écrit :

Bah ça depends de ce que tu as besoin aussi et si ton container à une semantique de conteneur dense contigu ce qui n'est pas le cas d'une hash table.


D'accord, donc dans ce cas l'iterator est bien indispensable .
 
Sinon, comment supprimer un élément, trouver son range et redimentionner ?


Message édité par spinzero le 20-04-2009 à 09:23:07
Reply

Marsh Posté le 20-04-2009 à 09:26:21    

lire la doc de unordered_map :o ?

Reply

Marsh Posté le 20-04-2009 à 13:11:07    

Joel F a écrit :

lire la doc de unordered_map :o ?


Ben oui qd même, mais si c'est bien dans ce menu :
 
Table of Contents
 
Introduction  
The Data Structure  
Equality Predicates and Hash Functions  
Comparison with Associative Containers  
Implementation Rationale  
Change Log  
Reference  
Header <boost/unordered_set.hpp>  
Header <boost/unordered_map.hpp>  
Bibliography  
 
c que j'ai loupé un passage :sleep:


Message édité par spinzero le 20-04-2009 à 13:20:55
Reply

Marsh Posté le 21-04-2009 à 16:16:41    

Salut  :whistle:  
 
Tu n'aurais pas une piste, je sèche  :sweat:  
 
 j'ai beau lire la doc ... on parle de re_hash, unordered_multiset, de Buckets ...  
moi pas bien comprendre articulation tt ces concepts  :??:  
Je pense avoir au - compris qu'on ne pouvait pas effacer directement un élement mais qu'il fallait passer par un redimensionnement et/ou rehashage ??
 
Dans Implementation rationale j'entends parler  
Are insert and erase stable for unordered_multiset and unordered_multimap?  
It is not specified if unordered_multiset and unordered_multimap preserve the order of elements with equivalent keys (i.e. if they're stable under insert and erase). This is issue 581. The current proposal is that insert, erase and rehash are stable - so they are here.

 
...mais pas d'exemples.
 
Là seul bêtise que j'ai commencé à faire c'est:
 

Code :
  1. void cleanMollePOS( size_t x, size_t y ){
  2.    for( boost::unordered_map< Position, Molle >::iterator It= sparse2D.begin(); sparse2D.end()!= It ; It++)
  3.    {
  4.     delete(It)->second;
  5.    }
  6. }


 


Message édité par spinzero le 21-04-2009 à 16:22:07
Reply

Marsh Posté le 21-04-2009 à 17:39:46    

Bah si Molle est un typdef de Machin*, aucun problème ?

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed