#0 

26-01-2011 19:49:22

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

En faisant un peu de raytracing cet été, je me suis rendu compte qu'il y avait une manière plus rapide pour effectuer des calculs avec les vecteurs, je n'ai pas pris le temps de regarder comment ça fonctionne dans irrlicht, donc je fait appel à vous pour savoir si ça vaut le coup que j'essaye de l'implémenté, ou si c'est pas possible.
Actuellement dans irrlicht:

Code c++ :

vector3d operator+(const vector3d& other) const { return vector3d(X + other.X, Y + other.Y, Z + other.Z); }


il me semble que dans le return il y a une allocation de memoire inutile, à moins que ça serve à autre chose dont je n'ai pas conscience ?


Ce que j'ai fait ressemble à ça:

Code c++ :

vector3d operator+(const vector3d& other) const { return (vector3d){X + other.X, Y + other.Y, Z + other.Z}; }


Qu'en pensez-vous ?

Hors ligne


#1 

26-01-2011 20:09:53

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

A mon avis c'est pareil, l'opérateur est bien obligé d'allouer un vecteur pour le retour et il n'est pas copié lors du return. Dans le tien, tu instancie également et tu cast mais je ne vois pas de différences après compile.
Ma foie je peux me tromper je ne suis pas métaprogrammeur.


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#2 

26-01-2011 20:21:09

tmyke
Administrateur
Date d'inscription: 24-03-2008
Messages: 1025

Oui, c'est plus rapide, d'ailleurs j'ai fait un test n'étant pas convaincu à la base, et pour 10.000.000 d'additions de vecteurs, je passe de 250 ms à 205 ms avec le deuxième type de définition.
Donc, oui, un gain de 20% chez moi, c'est pas négligeable wink


Force et sagesse...

Hors ligne


#3 

26-01-2011 21:55:43

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

Merci pour le test Tmyke wink
TUpac, je ne pourrai pas te dire ce qu'il se passe en mémoire, mais j'imagine qu'il doit y avoir allocation dans le premier cas,

sinon pour le deuxième cas, exemple:
return (char){1};
moi je traduit ça par: return 00000001; (en octet)
Donc je ne voit pas d'allocation, mais là je parle que par déduction, je ne suis pas sûre wink

Hors ligne


#4 

27-01-2011 00:16:32

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Certainement oui. C'est de la métaprog ça, mais la je suis une bille tongue
Ce serait sympas que quelqu'un nous éclaire un peut. J'vais potasser un peu loulou.developpez pour voir..
En tout cas c'est à généraliser à tout les types possibles.
De mon coté j'ai un peu regardé le code concernant les vbo d'aip et tout est normal en tout cas pour les statics.
Il y'a juste un glBufferSubData() qui ne prend quasi pas de ressources.
Quesque ça veut dire?, c'est l'nsemble qui est mal codé ?
Du coup ca se pourrait bien qu'on ai qu'a recoder à coup d'inlining et de métaprog pour le booster.... :espoir:
Qu'en pensez-vous, vous avez une idée?

Dernière modification par TUpac (27-01-2011 00:19:53)


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#5 

27-01-2011 01:30:24

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

Ouhou pas si vite, il y a peut être des raisons que l'on ignore, perso je pars plutôt pessimiste pour pas être déçu. et je pense qu'il ne faut pas crier victoire avant qu'un mod ai été testé par un certains nombres de membres, afin d'être sûre qu'il n'y ai pas de bug et qu'il soit bien fonctionnel.

De mon coté j'ai un peu regardé le code concernant les vbo d'aip et tout est normal en tout cas pour les statics.


ça veut dire quoi tout est normal ? neutral

Hors ligne


#6 

27-01-2011 09:19:19

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

D'après le forums anglophones, j'avais compris que les vbo étaient utlisés mais que les données étaient retransférées à chaque rendu. C'est faux ! en static, ils ne sont remplis (les vbo) qu'une fois.
Je n'ai pas testé beaucoup mais il est clair que malgré les vbo, irrlicht reste plus lent que les autres.


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#7 

27-01-2011 10:11:40

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

la différence majeur entre le cas 1 et 2, c'est que dans le premier on passe par un constructeur, mais pas dans le second, en effect, pour faire simple on peut également interpreter d'une structure ou d'une class comme un tableau et y acceder comme t'elle.

struct tempory { char *filename; int size; };
tempory tmp;

nous pouvons y acceder par deux manière
la traditionner tmp.variable;
mais aussi tmp[i], où i est l'emplacement de la variable, donc ici 0 = filename et 1 = size.

sa reviens donc a faire:
char data[] = { a, b, c };
plutot que
char *data = new char[3],
data[0] = a;
data[1] = b;
data[2] = c;

cert concretement cela en revien au même mais le nombre d'intruction est différent
c'est un peut comme if(){} else{} et la forme "contracter" condition ? true : false;

edit: syntaxe
edit 2: non TUpac, l'inline est a éviter, même si cela peut représenter un gain par fois conséquant, ( entre 0 et 15fps ), je te le déconseil si tu souhaite faire du multithreading, sa fous tout en l'aire smile
a la rigeur essaye d'optimiser avec register, et un peut d'asm wink
edit3: if ...

Dernière modification par Magun (27-01-2011 10:21:08)

Hors ligne


#8 

27-01-2011 10:47:10

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Ok je comprend mieu merci Magun. Donc c'est bien de la métaprog, les données sont connus à la compilation et on se passe de constructeur.

Magun :

je te le déconseil si tu souhaite faire du multithreading, sa fous tout en l'aire


J'aimerai bien savoir pourquoi et du coup, dans quel cas précis c'est à proscrire. Car il faut vraiment l'utiliser un max.

ps: Ogre utilise l'inline pour les template vector par example. wink

Dernière modification par TUpac (27-01-2011 10:52:59)


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#9 

27-01-2011 11:00:47

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

je parlais des inline wink
le soucis avec inline ses qu'il inject plus ou moin le code dans le code, au moment de la compilation, et il arrive qu'il enchevetre les instructions a cause du multithreading, où alors il peut confrondre les variables a modifier

par exemple:
inlne void free_memory(void *mem){ delete mem; mem = 0; }
l'apelle de cette fonction n'est pas standar, c'est a dire qu'au lieux de faire apelle a la fonction il va injecter sont code au moment de la compilation
on se retrouve donc avec

Code c++ :

void *mem = (void*)new data();
delete mem;
mem = 0;


au lieux d'un apelle 'classic'

Code c++ :

void *mem = (void*)new data();
free_memory(mem);



se pendant on peut tout a fait se retrouver avec

Code c++ :


void *mem0 = (void*)new data();
void *mem1 = (void*)new data();
//thread 1
delete mem0;
mem = 0;
//thread 2
delete mem0;
mem0 = 0; // alors que c'était destiner a mem1


a cause du multithreading, même si ça na pas été coder comme ça, enfin c'est asser complex et pas facil à résumer en 10 ligne, sachant qu'une codition pour savoir si mem est allouer ou non, ne corrige pas toujours le probleme, bref, regarde du coter des thread-safe, rare sont les examples et applications, car il faut être sur cas t'elle moment on écris pas sur t'elle variable avec 2 thread .... etc

Dernière modification par Magun (27-01-2011 11:01:46)

Hors ligne


#10 

27-01-2011 12:42:25

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

Magun :

sa reviens donc a faire:
char data[] = { a, b, c };
plutot que
char *data = new char[3],
data[0] = a;
data[1] = b;
data[2] = c;


Je ne pense vraiment pas, car char data[] va réservé 3 cases en ram il me semble, alors que (char){a, b ,c} j'ai plutôt l'impression que c'est le cpu qui va s'occuper de traduire la valeur en octet.
cela dit, je ne fait que supposer. aucune certitude.

Hors ligne


#11 

27-01-2011 13:17:05

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

La différence c'est que c'est optimisé par le compilo car la valeur est connue avant l’exécution.
Comment? je n'en sais rien.


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#12 

27-01-2011 13:17:45

Magun
SleekThink Producer
Lieu: Punakha
Date d'inscription: 18-11-2007
Messages: 910
Corrections: 2
Site web

l'exemple est pas très exacte mais j'ai comprit, en général quand je dit quelque chose c'est que je le sais, je fait rarement des spéculations smile
bref, quand tu fait { a, b, c } sa aloue forcement un tableau de 3 uniter, si tu rajoute (typename T) cela fait un cast en gros tu spésifie que le tableau alouer est de t'elle type donc un vector3d
il n'y a alors pas beusoin de passe par un constructeur les données sont alouer via le tableau ... wink

edit: c'est comme quand tu fait une chaine de caractère
char[] = "blablabla" et char[] = { 'b', 'l', 'a', 'b', 'l', 'a' } est équivalent tout comme (char*){ 'b', 'l', 'a', 'b', 'l', 'a' }

edit2: @Gehogor (en dessous) c'est se que j'explique depuis le debut, ce pendant même étant une pseudo allaction comme tu dit, ce n'est pas dangeureux si l'ont est sur de l'emploie, dans se cas ici il n'y a pas de probleme envisageable, après pour se qui est de l'emploie ou non c'est personnel

Dernière modification par Magun (27-01-2011 13:27:11)

Hors ligne


#13 

27-01-2011 13:19:01

Gehogor
Abonné
Lieu: Paris
Date d'inscription: 02-06-2009
Messages: 130
Corrections: 7

Coucou très cher vous, moi ce que j'en pense:

En C++, un objet, n'est rien d'autre qu'une structure (en terme de stockage mémoire) .

Donc, le vector3d d'Irrlicht, ses membres publics doivent être accessibles en faisant vector3d[0] (qui correspond à X), et ainsi de suite (comme si on considérait que vector3d est une structure en fait.

Donc dans ce cas là, pour moi, une "structure" avec les 3 champs va être créée (initialisation avec une liste de valeur), puis castée en vector3d pour être compatible avec la valeur de retour... C'est à mon sens :

- dégueulasse : on exploite le fait qu'une classe est "comme une structure" en C++
- dangereux : un objet doit être construit via un constructeur, et non via une "pseudo allocation via structure"

Soit je préfèrerai la propreté a une tentative d'optimisation. De plus, j'ai vérifié sur les sources de Qt, qui sont des fous, des pro et il font sans le cast de structure.

    Et hop, bon appétit à vous si ce n'est déjà fait.

Dernière modification par Gehogor (27-01-2011 13:27:46)


Et hop... wink

Hors ligne


#14 

27-01-2011 13:40:12

TUpac
Habitué
Date d'inscription: 08-09-2009
Messages: 387
Corrections: 1

Peut être une nouvelle preuve que microsoft c'est de la  ù$ù*$ : J'ai fait le test des deux opérateurs sur 100000000 additions avec GCC et surprise même temps de calcul pour les deux ......


"Si vous ne partagez pas votre stabilité avec les pauvres, les pauvres partageront leur instabilité avec vous."

Hors ligne


#15 

27-01-2011 13:55:04

nico
Webmaster
Date d'inscription: 07-08-2009
Messages: 563
Corrections: 9

ouai bien vu gehogor, dans mon raytracer j'ai utilisé des structures

Code c++ :

template<typename T> struct vecteur3
    {
        T X, Y, Z;

        vecteur3<T> operator + (const vecteur3<T>& v2){ return (vecteur3<T>){X + v2.X,  Y + v2.Y,   Z + v2.Z};}
        vecteur3<T> operator - (const vecteur3<T>& v2){ return (vecteur3<T>){X - v2.X,  Y - v2.Y,   Z - v2.Z};}
        vecteur3<T> operator * (const float& c)       { return (vecteur3<T>){X * c,     Y * c,      Z * c   };}
    };
    typedef vecteur3<float> vecteur3f;
    vecteur3f  Vecteur3f(float x, float y, float z) {return (vecteur3f){x,y,z};}


Donc moi je n'ai pas eu de soucis. tu pense que ça serait pas propre avec des class ? dommage sad

ps Magun: ok, mais essai d'être plus précis la prochaine fois sinon on comprend pas ce que tu veut dire wink

Hors ligne


Options Liens officiels Caractéristiques Statistiques Communauté
Corrections
irrlicht
irrklang
irredit
irrxml
xhtml 1.0
css 2.1
Propulsé par FluxBB
Traduit par FluxBB.fr
882 membres
1429 sujets
11119 messages
Dernier membre inscrit: LiseBuisson96
24 invités en ligne
Aucun membre connecté
RSS Feed