[c] vitesse d'execution lors d'appels de fonctions

vitesse d'execution lors d'appels de fonctions [c] - C - Programmation

Marsh Posté le 17-08-2004 à 12:58:10    

Bonjour a tous,
 
Voila, je pense que ma question est triviale mais je voudrais savoir si mon raisonnement est bon ou alors si je me plantes completement...
Donc j'ai une structure (on va l'appeler struc pour simplifier la suite) a mettre en argument d'une fonction (structure qui ne seras pas modifiée dans la fonction) donc je peux avoir sois
une definition du type :
int ma_fonction(struc a)
sois
int ma_fonction(struc *a)
 
Donc , c'est la ou est ma question, si je rajoutes le nombre d'elements de ma structure, si j'utilise la 1ere methode d'appel alors j'aurais un temps necessaire un peu plus long (temps pris par la creation de la copie) avec une strucuture plus importante alors que dans mon 2nd cas, vu que je fais un passage par adresse, il ne devrait pas y avoir de difference non??
 
 
Merci d'avance,
@+
 
Edit : pardont je m'etais trompé quand j'ai donné le deuxieme exemple de definition, je parle de pointeurs, pas de references... c'etait juste unee erreur de symbole


Message édité par GuiYom_00 le 17-08-2004 à 14:06:48
Reply

Marsh Posté le 17-08-2004 à 12:58:10   

Reply

Marsh Posté le 17-08-2004 à 13:09:04    

jme lance, et puis si je me trompe, taz passera me corriger sévèrement :D
 
oui, et en plus, ton 1er appel utilisera de la mémoire en plus, c'est surtout ca qu'il faut éviter, le temps de la création de copie c'est quand même pas énorme, mais faut pas allouer de la mémoire pour rien alors qu'on peut passer par référence

Reply

Marsh Posté le 17-08-2004 à 13:12:33    

C'est aussi ce qui me semble... et on va vite voir si on a raison je pense... :D
Ensuite, meme si le temps est pas enorme, moi je parles de fonctions qui sont utilisées plusieurs millions (voir milliards) donc meme une difference de 10% peut a long terme etre benefique...

Reply

Marsh Posté le 17-08-2004 à 13:15:55    

Et ta déclare ta réfèrence constante

Reply

Marsh Posté le 17-08-2004 à 13:18:05    

oui... dsl j'avais oublié de preciser...
 
Edit : j'avais pas fait gaffe que tu parlais de reference cricri_ moi je parlais juste de definir la structure comme constante, pas de l'utilisation d'un passsage par reference


Message édité par GuiYom_00 le 17-08-2004 à 13:57:01
Reply

Marsh Posté le 17-08-2004 à 13:23:27    

c'est du C les références ?
 
le passage par ref permet aussi de bénéficier le l'hériatge (comme pour un pointeur) et de ne pas avoir à appeler le constructeur de copie qui peut être complexe dans certains cas.
Il vaut toujours mieux passer en référence ce qui est plus gros qu'un pointeur. Un booléen doit plutôt être passé par valeur.

Reply

Marsh Posté le 17-08-2004 à 13:24:41    

non ... t'as raison, mauvaise sous-section ..

Reply

Marsh Posté le 17-08-2004 à 14:00:51    

on parle de quoi là ?

Reply

Marsh Posté le 17-08-2004 à 14:07:54    

voila j'ai rectifié mon 1er post, je parlais de la difference entre une transmission d'une structure par copie ou par adresse

Reply

Marsh Posté le 17-08-2004 à 15:02:42    

en C y a que la copie qui existe.

Reply

Marsh Posté le 17-08-2004 à 15:02:42   

Reply

Marsh Posté le 17-08-2004 à 15:54:04    

Ok Taz mais dans ce cas, je me trouves avec un cas ou il fait une copie d'une structure et dans l'autre cas, il fait la copie d'un pointeur juste non? Ce qui pourrait me laisser penser que la 2eme methode est plus rapide mais j'en suis pas sur...
 
Edit  : j'ai reformulé mon message car je pense que y avait une grosse boulette dans l'ancienne version :D


Message édité par GuiYom_00 le 17-08-2004 à 16:06:38
Reply

Marsh Posté le 17-08-2004 à 16:34:38    

la deuxième méthode est plus rapide. mais tu ne disposes pas de ta propre copie de travail, ce qui peut ne pas être  pratique. fais bien attention de marquer const si tu souhaites par un passage par pointeur mais toute fois modifier la structure sous-jacente

Reply

Marsh Posté le 17-08-2004 à 16:37:21    

Taz a écrit :

la deuxième méthode est plus rapide. mais tu ne disposes pas de ta propre copie de travail, ce qui peut ne pas être  pratique. fais bien attention de marquer const si tu souhaites passer par un passage par pointeur mais sans toute fois modifier la structure sous-jacente


c'était ca que tu voulais dire?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 27-08-2004 à 19:50:25    

Remarque : Es-tu sûr que ça vaille la peine de se prendre la tête sur l'optimisation de la vitesse de l'appel de la fonction ? Je veux dire par là que les progs rament rarement aux endroits où on les attends... Et gagner une seconde de temps d'exécution sur une heure, bof.
Il est *vraiment* plus efficace de bosser sur l'algo plutôt que sur le code. Enfin, tu as peut-être déjà réfléchi à tout ça.
 
Ok, les soluces :

Citation :

... fonctions qui sont utilisées plusieurs millions (voir milliards)...


Pour la vitesse max, utilise tout simplement une variable globale ! Du coup, tu n'as même plus besoin de la passer en argument. Autre truc : dans ta fonction, si tu as des variables locales, passe les toutes en "static" : le compilateur n'aura même plus besoin de toucher à la pile.


---------------
If I want to fail and succeed, which I have done ?
Reply

Marsh Posté le 28-08-2004 à 00:33:08    

En effet, c'est sur que bosser sur l'algo est le plus important mais cette phase est finie...
ensuite c'est vrai que 1sec par rapport a 1h ca fait pas grand chose, mais a la base je travaille sur un code qui est destiné  a tourner plusieurs heures, jours, semaines... donc voila pour quoi je dis que tout qain de temps qui a la base peut paraitre negligeable est assez important, surtout quand    la durée d'utilisation est un facteur important et que tout gain (meme de l'ordre du 1%) est a prendre en compte...
Voila pourquoi je m'interesse a ces "details" et je suis aussi en train de passer mes variables locales en static , de verifier que j'ai bien mis les variables qu'in faut en "const"...
 
Ensuite concernant l'utilisation des variables globales, il me semblait qeu c'etait a deconseiller par rapport a la quantité de memoire, et aussi, car les compilateurs on plus de mal a vectoriser des codes avec des variables globales dedans, mais je peut totalement me tromper sur ce point!!

Reply

Marsh Posté le 28-08-2004 à 00:40:07    

GuiYom_00 a écrit :

les compilateurs on plus de mal a vectoriser des codes avec des variables globales dedans


 
la vectorisation totomatique ca n'existe pas [:le kneu]

Reply

Marsh Posté le 28-08-2004 à 00:41:35    

oui, les variables globale ca casse tout, et le compilo osera rien optimiser
 
toujours penser aux const, static, aux prototypes des fonctions
 
et a mon avis faire en sorte que  les fonctions ne prennent pas de parametres n'as  aucun interet, c'est pas  fonctionnel

Reply

Marsh Posté le 28-08-2004 à 01:12:22    

si si la vectorisation automatique existe... le seul truc c'est qu'il faut souvent rajouter des pragma pour dire au compilo qu'il peut y aller, qu'il y aura pas de probleme...
c'est sur que je ne parles pas dans le cas de compilos "grand publics" (quoique le compilateur intel sous linux en est capable et il est gratuit pour une utilisation non commerciale, je pense que la version windows aussi mais ne la connaissant pas, je peux pas dire...)

Reply

Marsh Posté le 28-08-2004 à 09:24:54    

GuiYom_00 a écrit :

si si la vectorisation automatique existe... le seul truc c'est qu'il faut souvent rajouter des pragma pour dire au compilo qu'il peut y aller, qu'il y aura pas de probleme...


 
Ton compilo ne sait pas vectoriser ton code, il a juste un série de pattern qu'il reconnait et rempalce par une avgue soupe vectorielle.
 
Si tu parles de VAST, il fait pas grand chose, et le
résultat est souvent à revoir ...
 
Y a plein de gens partout qui font des théses la dessus (j'en fait partie) et je peut te dire que si qqn avait commercialiser un VRAI Vectorisateur automatique , ca se saurait [:le kneu]

Reply

Marsh Posté le 28-08-2004 à 11:39:02    

donc ca veut dire qu'on m'aurait menti... :cry:  
 
Plus serieusement, je parles pas de VAST mais du compilo se trouvant sur une machine de calcul vectorielle et le compilo utilisé est sxcc (compilo dvp par nec pour la machine en question)...
 
Sinon petite precision, je n'ai pas dit que TOUT mon code était vectorisé, mais la partie qui prends le plus de temps l'est... pour que cela marche (du moins d'apres ce que me dit le compilo...) je me suis débrouillé pour me ramener a une boucle du type...

Code :
  1. for(i=0;i<n;i++)
  2. {
  3. a[i]=b[i]+c[i];
  4. }


avec aucune dependance entre a, b et c
 
En tout cas, si tu connais de bonnes techniques pour vectoriser un code (je ve dire par la ou trouver les techniques juste),  vu que tu bosses dessus, je suis preneur car de mon coté j'ai un peu de mal a trouver de telles info... enfin peut etre que ca serait mieux qu'on continue cette conversation par MP car je ne suis pas sur que ca interesse tout le monde...

Reply

Marsh Posté le 28-08-2004 à 12:03:42    

Ok, dans ce cas la, oui. Je pensais que tu bosser sur de l'Intel ou du PPC.
 
Une machine vectorielle a un compilo dédié. Neanmoins :| a part vectorisé des for(), ca doit pas aller loin :|
 
C quoi ta machine ?
 
sinon ta demarche est la bonne, decompose ton calcul en serie d'element independant.
Jai pas le pdf la, mais j'ai un papier sur la reduction de dependances dans les calculs avec quelques astuces non triviales, je te passe les ref des que je retourne au boulot.

Reply

Marsh Posté le 28-08-2004 à 20:51:34    

la machine est une nec sx6 352 gflops/s... composée de 44 cpu vectoriels a 500MHz avec 352Go de mem
et merci pour les ref je pense que ca va m'etre utile...

Reply

Marsh Posté le 28-08-2004 à 21:09:08    

GuiYom_00 a écrit :

la machine est une nec sx6 352 gflops/s... composée de 44 cpu vectoriels a 500MHz avec 352Go de mem
et merci pour les ref je pense que ca va m'etre utile...


 
han le truc de boeuf >.< le CPU vectoriel il a quoi comme jeu d'instructions, c'est quoi ?

Reply

Marsh Posté le 28-08-2004 à 23:08:27    

j'ai pas ces infos a disposition mais je peux essayer de me renseigner pour savoir ce que c'est...

Reply

Marsh Posté le 28-08-2004 à 23:13:30    

GuiYom_00 a écrit :

la machine est une nec sx6 352 gflops/s... composée de 44 cpu vectoriels a 500MHz avec 352Go de mem
et merci pour les ref je pense que ca va m'etre utile...

sans déconner ?me dit pas que t'es un matheux, que tu joue avec ça mais que t'as pas eu de cours de vectorisation ?

Reply

Marsh Posté le 28-08-2004 à 23:24:35    

d'après toi?

Reply

Marsh Posté le 29-08-2004 à 00:27:13    

bon ben je part loin lundi, mais jeudi je reviens et je te passe ma biblio de these sur la vectorisation ...
 
sinon ca a quelle geule ton API vectorielle ? paske moi j'ai un bon plan sinon ^^

Reply

Marsh Posté le 29-08-2004 à 01:17:29    

Taz a écrit :

sans déconner ?me dit pas que t'es un matheux, que tu joue avec ça mais que t'as pas eu de cours de vectorisation ?


 
Justement, le truc c'est qeu a la base je suis pas matheux mais physicien numericien et sur cette machine, je tiens a le dire desuite, y a pas que moi qui bosses dessus...loin de la meme...c'est sur que sinon mes codes prendraient pas plusieurs semaines en general...
 
Ensuite concernant l'aspect cour, non justement je n'en ai pas eu car, contrairement a une idée qui pourrait etre communement admise, souvent quand on est numericien, on a pas droit a des cours d'algo ou meme d'optimisation...ni meme de programmation donc c'est a chacun d'apprendre sur le tas... et ceci pour un (le plus) grand nombre...
donc actuellement par exemple pour voir un peu comment on vectorise un code, j'ai juste les trucs de base a faire et a pas faire (par ex faire des reccurences dans les boucles du style a[i]=a[i-1]+b[i] ...) et actu ma "source" principale d'apprentissage etait le manuel icc pour linux car, comme sur le nec je n'ai qu'un certains nombres d'heurse allouées, je les depense pas dessus a faire la phase "debug" pour ca je prends mon PC professionnel pour voir ce que ca donne (bi-xeon 2.6GHz)...
C'est pour ca que je reconnais volontiers a ce niveau la que je pars vraiment "from scratch"...et que je ne cherches qu'une chose, c'est a me renseigner...

Joel F a écrit a écrit :

bon ben je part loin lundi, mais jeudi je reviens et je te passe ma biblio de these sur la vectorisation ...
 
sinon ca a quelle geule ton API vectorielle ? paske moi j'ai un bon plan sinon ^^



Je n'utilisa pas d'api vectorielle encore (je pense que je regaraderais ce que j'ai au niveau api vectorielle quand je regarderais en detail l'inversion de matrice que j'ai a faire...) donc je suis pas contre un bon plan  :D  
Sinon, bon voyage aussi  ;)

Reply

Marsh Posté le 29-08-2004 à 02:00:41    

GuiYom_00 a écrit :

Ensuite concernant l'utilisation des variables globales, il me semblait qeu c'etait a deconseiller par rapport a la quantité de memoire


 
Oui du moment qu'elles sont constamment en mémoire tant que dure l'exécution.
Mais sache que pour les variable static, même locales, c'est la même chose : elles sont stockées au même endroit que les variables globales et ont la même durée de vie que le programme.

Reply

Marsh Posté le 29-08-2004 à 11:43:51    

GuiYom_00 a écrit :


je regarderais en detail l'inversion de matrice que j'ai a faire


 
Euh [:le kneu] je t'en souhaite  .... c tres data-dependant l'inversion de matrcie. Elle des propriétés speciales au moins , paske sinon :|
 

GuiYom_00 a écrit :


donc je suis pas contre un bon plan  :D  


 
Bah jette sun oeil à ma signature, c'est une API vectorielle en C++ pour l'extension vectorielle des PPC. Facilement portables à d'autres processeurs vectoriels ^^

Reply

Marsh Posté le 29-08-2004 à 11:48:02    

Ah petit truc aussi, avant d'optimiser tout comme un bourrin profil ton code sequentiel et met en evidence les points critiques. Ca sert a rien de gagner x5 sur un truc qui dure 0.1 ms, mais un x2 sur un ruc de 10s c bien.
 

Reply

Marsh Posté le 02-09-2004 à 10:50:35    

Justement la phase de profiling est deja faite... et la partie que je voudrais vectoriser au max est celle qui doit prendre environ 80% du temps de calcul... d'ou l'interet... :D

Reply

Marsh Posté le 02-09-2004 à 10:56:11    

OK alors ^^
 
bref, c koi ce code à vectoriser ??

Reply

Marsh Posté le 02-09-2004 à 13:34:40    

C'est un code de resolution d'equations differentielles... bien sur actu c'est du 2D mais ca va bientot passer au 3D...d'ou l'interet de pouvoir vectoriser tout ca... ^^

Reply

Marsh Posté le 02-09-2004 à 14:38:44    

attention vectorisation != vecteur mathematique !!
 
On pourrait en voir un bout ?

Reply

Marsh Posté le 02-09-2004 à 14:41:09    

je sais que vectorisation != vecteur mathematique...

Code :
  1. for(i=1; i<=iNbMode;i++)
  2. {
  3.  ptemp0=ptm1[i];
  4.  ptemp1=pt[i];
  5.  ptemp2=ptp1[i];
  6.  utemp0=utm1[i];
  7.  utemp1=ut[i];
  8.  wtemp0=wtm1[i];
  9.  wtemp1=wt[i];
  10.  wtemp2=wtp1[i];
  11.  poisstmp=poiss1[i];
  12.  poisstmp1=poiss2[i];
  13.  c1=psc->pdGWMN[i];
  14.  c2=psc->pdDcGPMN[i];;
  15.  pdCnst2PMN=psc->ppdChipPMN[i];
  16. // pdCnst3PMN=psc->ppdGradmPMN[i];
  17. // pdCnst4PMN=psc->ppdGradPar2PMN[i];
  18.  pdCnst5PMN=psc->ppdChiGradPar2pPMN[i];
  19.  pdCnst6PMN=psc->ppdChiGradPar2mm1PMN[i];
  20.  pdCnst2WMN=psc->ppdChipWMN[i];
  21. // pdCnst3WMN=psc->ppdGradmWMN[i];
  22.  pdCnst4WMN=psc->ppdGradPar2WMN[i];
  23. // pdCnst5WMN=psc->ppdChiGradPar2pWMN[i];
  24. // pdCnst6WMN=psc->ppdChiGradPar2mm1WMN[i];
  25.  for(j=1; j<=iNbRadius;j++)
  26.  {
  27. ptemp2[j].real = pdCnst6PMN[j]*(/*-poisstmp[j].real-c2*utemp1[j].imag+*/pdCnstPMN[j]*ptemp1[j+1].real+pdCnst1PMN[j]*ptemp1[j-1].real+pdCnst2PMN[j]*ptemp1[j].real+pdCnst5PMN[j]*ptemp0[j].real);
  28. ptemp2[j].imag = pdCnst6PMN[j]*(/*-poisstmp[j].imag+c2*utemp1[j].real+*/pdCnstPMN[j]*ptemp1[j+1].imag+pdCnst1PMN[j]*ptemp1[j-1].imag+pdCnst2PMN[j]*ptemp1[j].imag+pdCnst5PMN[j]*ptemp0[j].imag);
  29. wtemp2[j].real = wtemp0[j].real/*-poisstmp1[j].real+c1*ptemp1[j].imag*/+pdCnstWMN[j]*wtemp1[j+1].real+pdCnst1WMN[j]*wtemp1[j-1].real+pdCnst2WMN[j]*wtemp1[j].real/*+pdCnst4WMN[j]*utemp0[j].real*/;
  30. wtemp2[j].imag = wtemp0[j].imag-poisstmp1[j].imag-c1*ptemp1[j].real+pdCnstWMN[j]*wtemp1[j+1].imag+pdCnst1WMN[j]*wtemp1[j-1].imag+pdCnst2WMN[j]*wtemp1[j].imag+pdCnst4WMN[j]*utemp0[j].imag;
  31.  }
  32. }


 
edit : rq : les parties en commentaires ne sont pas prises en compte juste pour des test faits actuellement sur la realité "physique" des resultats obtenus...


Message édité par GuiYom_00 le 02-09-2004 à 14:42:31
Reply

Marsh Posté le 02-09-2004 à 14:44:30    

Je precisais paske des fois j'en vois de belles  
Ouais, ca dois ce faire, laisse moi demain et je t'en ponds une version E.V.E.
ca te donnera une idée de la structure à utilir.


Message édité par Joel F le 02-09-2004 à 14:44:54
Reply

Marsh Posté le 02-09-2004 à 14:45:48    

oki thanks...;)
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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