Contourner le Koenig lookup

Contourner le Koenig lookup - C++ - Programmation

Marsh Posté le 11-11-2004 à 15:18:22    

Voici un extrait de mon code :
 

Code :
  1. #include <iostream>
  2. using namespace std;
  3. namespace fml
  4. {
  5.   struct Matrix
  6.   {
  7.     size_t v;
  8.     Matrix(size_t v_) : v(v_) {}
  9.     Matrix& operator=( const Matrix& m )
  10.     {
  11.       v = m.v;
  12.       return *this;
  13.     }
  14.   };
  15. }
  16. namespace ppc
  17. {
  18.   fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  19.   {
  20.      // operateur "simd" (resultat different pr meilleur visu)
  21.     return fml::Matrix(m.v*p.v);
  22.   }
  23. }
  24. fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  25. {
  26.   // operatuer classique
  27.   return fml::Matrix(m.v+p.v);
  28. }
  29. using namespace fml;
  30. #define ENABLE_SIMD(ARCH) { using namespace ARCH
  31. #define DISABLE_SIMD(ARCH) }
  32. int main( int, const char** )
  33. {
  34.   Matrix a(5),b(7),d(0);
  35.   d = a+b;
  36.   cout << "fml : " << d.v << endl;
  37.  
  38.   ENABLE_SIMD(ppc);
  39.   d = a+b;
  40.   cout << "fml::ppc : " << d.v << endl;
  41.   DISABLE_SIMD(ppc);
  42.   d = a+b;
  43.   cout << "fml : " << d.v << endl;
  44. }


 
Ne faites pas attention au struct ultra imple et au macro moche.
Ce code ne compile pas :
 


g++ test.cc -o main.exe
test.cc: In function `int main(int, const char**)':
test.cc:48: error: ambiguous overload for 'operator+' in 'a + b'
test.cc:31: error: candidates are: fml::Matrix operator+(const fml::Matrix&, const fml::Matrix& )
test.cc:25: error: fml::Matrix ppc::operator+(const fml::Matrix&, const fml::Matrix& )
 
Compilation exited abnormally with code 1 at Thu Nov 11 15:08:07


 
Ce qui est completement logique lorsque l'on suit le Koenig Lookup.
 
Ma question est de savoir COMMENT effectuer le calcul avec le bon operator+ et non pas celui correspodnant au KL.
 
 
 
 

Reply

Marsh Posté le 11-11-2004 à 15:18:22   

Reply

Marsh Posté le 11-11-2004 à 16:05:39    

Code :
  1. namespace ppc
  2. {
  3.     fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  4.     {
  5.         // operateur "simd" (resultat different pr meilleur visu)
  6.         fml::Matrix(m.v*p.v);
  7.     }
  8. }
  9. fml::Matrix operator+( const fml::Matrix& m, const fml::Matrix& p )
  10. {
  11.     // operatuer classique
  12.     return ARCH::operator +(m, p);
  13. }
  14. using namespace fml;
  15. int main(int argc, const char *argv)
  16. {
  17.     matrix a(5), b(7), d(0);
  18.     #define ARCH ppc   
  19.     d = a + b;
  20.     #undef ARCH
  21.    
  22.     cout << "fml : " << d.v << endl;
  23.    
  24.     return 0;
  25. }


 
 
Ca doit marcher mais c'est moins beau et pratique :/.

Reply

Marsh Posté le 11-11-2004 à 16:13:03    

bah plutôt que de dire 'hey, faut regarder la dedans', dis 'hey utilise ça'
 
#define ENABLE_SIMD(ARCH) { using namespace ARCH
 
->
 
#define ENABLE_SIMD(ARCH) { using namespace ARCH::operator+
 
 
bon évidemment, vu le bordel que tu as, ça va faire beaucoup.
 

Reply

Marsh Posté le 11-11-2004 à 16:14:12    

et ouais JoelF, c'est là qu'on voit qui comprend

Reply

Marsh Posté le 11-11-2004 à 16:29:27    

Taz a écrit :

et ouais JoelF, c'est là qu'on voit qui comprend


o_O ??? hein ?

Reply

Marsh Posté le 11-11-2004 à 17:07:59    

t'as pas du bien lire le truc de Panini

Reply

Marsh Posté le 11-11-2004 à 17:09:49    

Taz a écrit :

t'as pas du bien lire le truc de Panini


 
hmmm, oui et c'est totalement pas ca et ensuite ?

Reply

Marsh Posté le 11-11-2004 à 17:11:04    

laisse tomber, t'es largué ... tu m'appelles quand tu te réveilles

Reply

Marsh Posté le 11-11-2004 à 17:15:44    

Taz a écrit :

laisse tomber, t'es largué ... tu m'appelles quand tu te réveilles


 
C'est juste que j'ai perdu l'habitude de ta réparti légendaire :o
 
bon sinon :
 

Code :
  1. {
  2.     using ppc::operator+;
  3.     d = a+b;
  4.     cout << "fml::ppc : " << d.v << endl;
  5.   }


 
me dit :
 


test.cc: In function `int main(int, const char**)':
test.cc:48: error: syntax error before `operator'
test.cc:49: error: `d' undeclared (first use this function)

Reply

Marsh Posté le 11-11-2004 à 17:31:43    

gcc-3.3 inside

Reply

Marsh Posté le 11-11-2004 à 17:31:43   

Reply

Marsh Posté le 11-11-2004 à 17:34:38    

et oui :
 
gcc 3.3.1 :-/
bon je suis senser m'assoir sur cette fantaisie et coder ça de maniere plus sioux.

Reply

Marsh Posté le 11-11-2004 à 17:48:51    

pourquoi tu veux changer de mode de calcul comme ça, en plein milieu d'un calcul ?

Reply

Marsh Posté le 11-11-2004 à 17:50:26    

parce que je dois permettre d'optimiser localement
mes calculs.

Reply

Marsh Posté le 11-11-2004 à 17:52:20    

pourquoi pas optimiser en permanence ?
différents .hpp ça suffit pas ?

Reply

Marsh Posté le 11-11-2004 à 17:54:23    

non. Y a des phases de certaines applis qui ne peuvent etre "SIMDiser" facilement. Je dois repasser en mode scalaire tout en continuant à travailler sur la même matrice.
 
Mais si tu as des diées ca m'itneresse.

Reply

Marsh Posté le 11-11-2004 à 18:10:55    

en fait du supprimes les optimisation localement ?
 
c'est faisable avec des trucs comme ça
 

Code :
  1. template<typename T>
  2. struct Holder
  3. {
  4.   T &value;
  5.   Holder(T &t) : value(t) { }
  6.   operator T() { return value; }
  7. };
  8. template<typename T>
  9. Holder<T> operator+(Holder<T> &l, Holder<T> &r)
  10. { return ppc::operator+(l.value, r.value); }
  11. template<typename T>
  12. Holder<T> hold(T &v)
  13. { return v; }


 
biensur faut que tu fasses des macros par dessus, etc
 
 
 
mais au fait, pourquoi des fois tu veux repasser en scalaire ?

Reply

Marsh Posté le 11-11-2004 à 18:14:42    

exemple : sur des tabelau rikiki le SIDM n'apporte rien,
les algos de tri sont merdiques, donc revenir lcoalement en scalaire evite de perdre du temps.
 
typiquement, y a des algos qui pour etre exprimer en SIMD necessite du preprocessing des données PLUS LONG que le traitement lui même en scalaire.

Reply

Marsh Posté le 11-11-2004 à 18:17:02    

et alors ? t'es pas foutu de faire des templates qui décide de l'algo en fonction de la taille ? ou d'un paramètre template ?
 
t'as qu'à rajouter un paramètre template à ton type matrice, par défaut à true, si c'est à false, tu change d'algo

Reply

Marsh Posté le 11-11-2004 à 18:19:30    

certes certes .... je cherchais une methode plus simple.
bon je repart sur mon idée initiale alors. Merci :)

Reply

Marsh Posté le 11-11-2004 à 18:21:49    

bah ouais :/

Reply

Marsh Posté le 11-11-2004 à 18:32:38    

spa grave ^^
ca eu été elegant

Reply

Marsh Posté le 11-11-2004 à 18:35:54    

La bidouille que j'ai proposé ne fonctionne pas :o.

Reply

Marsh Posté le 11-11-2004 à 18:36:42    

ça on avait vu que t'as pas compris la différence entre template et cpp

Reply

Marsh Posté le 11-11-2004 à 18:43:25    

o_O
 
Je vois pas le rapport avec les templates. J'ai déjà utilisé une bidouille semblable, mais le contexte "dynamique" de calcul ici ne le permet pas.

Reply

Marsh Posté le 11-11-2004 à 18:46:23    

c'est exactement ça, t'as rien compris

Reply

Marsh Posté le 11-11-2004 à 18:54:44    

Merci, je vois très bien où est ma connerie.
Mais ne peux tu pas expliquer clairement plutôt que d'envoyer les gens sur les roses ?
Parce que le rapport entre template, cpp et belle bourde d'utilisation du préprocesseur, je le vois pas trop là.

Reply

Marsh Posté le 11-11-2004 à 19:02:34    

ben t'as agit comme si les template étaient des macros

Reply

Marsh Posté le 11-11-2004 à 19:13:24    

Bon, y a pas de templates dans le truc que j'ai écris mais je vois ce que tu veux dire.

Reply

Marsh Posté le 11-11-2004 à 19:33:08    

Panini a écrit :

Bon, y a pas de templates dans le truc que j'ai écris mais je vois ce que tu veux dire.


 
Moi, je vois pas, et je suis intéressé.
 

Citation :


ben t'as agit comme si les template étaient des macros

Reply

Marsh Posté le 11-11-2004 à 21:26:10    

L'erreur est que j'ai voulu utiliser des macros comme un paramètre de template. Dans le cas que j'ai écrit, ça n'a aucun sens. Mon operateur + n'est défini qu'une fois pour une valeur de ARCH donnée qui aurait du être définie en amont. L'usage que j'en fais dans le main n'a donc aucun sens.
 
Bref, le code que j'ai écrit est complètement foireux. La solution template proposée par Taz par contre fonctionne.
Le using ppc::operator+ fonctionne également sous vc.net 2003.

Reply

Marsh Posté le 11-11-2004 à 21:49:51    

ha ok. Merci

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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