Contourner le Koenig lookup - C++ - Programmation
Marsh Posté le 11-11-2004 à 16:05:39
Code :
|
Ca doit marcher mais c'est moins beau et pratique .
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.
Marsh Posté le 11-11-2004 à 16:29:27
ReplyMarsh 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 ?
Marsh Posté le 11-11-2004 à 17:11:04
laisse tomber, t'es largué ... tu m'appelles quand tu te réveilles
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
bon sinon :
Code :
|
me dit :
|
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.
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 ?
Marsh Posté le 11-11-2004 à 17:50:26
parce que je dois permettre d'optimiser localement
mes calculs.
Marsh Posté le 11-11-2004 à 17:52:20
pourquoi pas optimiser en permanence ?
différents .hpp ça suffit pas ?
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.
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 :
|
biensur faut que tu fasses des macros par dessus, etc
mais au fait, pourquoi des fois tu veux repasser en scalaire ?
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.
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
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
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
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.
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à.
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.
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 : |
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.
Marsh Posté le 11-11-2004 à 15:18:22
Voici un extrait de mon code :
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.