Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1041 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°824980
GuiYom_00
Posté le 17-08-2004 à 12:58:10  profilanswer
 

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
mood
Publicité
Posté le 17-08-2004 à 12:58:10  profilanswer
 

n°824989
burgergold
5$? va chez l'diable!
Posté le 17-08-2004 à 13:09:04  profilanswer
 

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

n°824994
GuiYom_00
Posté le 17-08-2004 à 13:12:33  profilanswer
 

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...

n°824997
cricri_
Posté le 17-08-2004 à 13:15:55  profilanswer
 

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

n°825000
GuiYom_00
Posté le 17-08-2004 à 13:18:05  profilanswer
 

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
n°825004
jesus_chri​st
votre nouveau dieu
Posté le 17-08-2004 à 13:23:27  profilanswer
 

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.

n°825006
cricri_
Posté le 17-08-2004 à 13:24:41  profilanswer
 

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

n°825048
Taz
bisounours-codeur
Posté le 17-08-2004 à 14:00:51  profilanswer
 

on parle de quoi là ?

n°825057
GuiYom_00
Posté le 17-08-2004 à 14:07:54  profilanswer
 

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

n°825134
Taz
bisounours-codeur
Posté le 17-08-2004 à 15:02:42  profilanswer
 

en C y a que la copie qui existe.

mood
Publicité
Posté le 17-08-2004 à 15:02:42  profilanswer
 

n°825177
GuiYom_00
Posté le 17-08-2004 à 15:54:04  profilanswer
 

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
n°825220
Taz
bisounours-codeur
Posté le 17-08-2004 à 16:34:38  profilanswer
 

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

n°825222
masklinn
í dag viðrar vel til loftárása
Posté le 17-08-2004 à 16:37:21  profilanswer
 

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?


---------------
I've never understood the compulsion to use Web technologies minus the Web's security and deployment models. It seems a bit like throwing the orange away and eating the peel. — @ justinschuh‬
n°834549
lsdYoYo
gravity powered
Posté le 27-08-2004 à 19:50:25  profilanswer
 

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 ?
n°834853
GuiYom_00
Posté le 28-08-2004 à 00:33:08  profilanswer
 

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!!

n°834869
Joel F
Real men use unique_ptr
Posté le 28-08-2004 à 00:40:07  profilanswer
 

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]

n°834873
cris56
Posté le 28-08-2004 à 00:41:35  profilanswer
 

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

n°834910
GuiYom_00
Posté le 28-08-2004 à 01:12:22  profilanswer
 

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...)

n°834967
Joel F
Real men use unique_ptr
Posté le 28-08-2004 à 09:24:54  profilanswer
 

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]

n°834996
GuiYom_00
Posté le 28-08-2004 à 11:39:02  profilanswer
 

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...

n°835005
Joel F
Real men use unique_ptr
Posté le 28-08-2004 à 12:03:42  profilanswer
 

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.

n°835281
GuiYom_00
Posté le 28-08-2004 à 20:51:34  profilanswer
 

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...

n°835286
Joel F
Real men use unique_ptr
Posté le 28-08-2004 à 21:09:08  profilanswer
 

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 ?

n°835318
GuiYom_00
Posté le 28-08-2004 à 23:08:27  profilanswer
 

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

n°835320
Taz
bisounours-codeur
Posté le 28-08-2004 à 23:13:30  profilanswer
 

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 ?

n°835326
docmaboul
Posté le 28-08-2004 à 23:24:35  profilanswer
 

d'après toi?

n°835337
Joel F
Real men use unique_ptr
Posté le 29-08-2004 à 00:27:13  profilanswer
 

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 ^^

n°835345
GuiYom_00
Posté le 29-08-2004 à 01:17:29  profilanswer
 

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  ;)

n°835351
leneuf22
Posté le 29-08-2004 à 02:00:41  profilanswer
 

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.

n°835436
Joel F
Real men use unique_ptr
Posté le 29-08-2004 à 11:43:51  profilanswer
 

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 ^^

n°835443
Joel F
Real men use unique_ptr
Posté le 29-08-2004 à 11:48:02  profilanswer
 

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.
 

n°839525
GuiYom_00
Posté le 02-09-2004 à 10:50:35  profilanswer
 

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

n°839535
Joel F
Real men use unique_ptr
Posté le 02-09-2004 à 10:56:11  profilanswer
 

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

n°839754
GuiYom_00
Posté le 02-09-2004 à 13:34:40  profilanswer
 

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... ^^

n°839943
Joel F
Real men use unique_ptr
Posté le 02-09-2004 à 14:38:44  profilanswer
 

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

n°839949
GuiYom_00
Posté le 02-09-2004 à 14:41:09  profilanswer
 

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
n°839969
Joel F
Real men use unique_ptr
Posté le 02-09-2004 à 14:44:30  profilanswer
 

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
n°839979
GuiYom_00
Posté le 02-09-2004 à 14:45:48  profilanswer
 

oki thanks...;)
 

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[Visual C++?] temps d'execution[C] changer de répertoire en cours d'exécution
connaitre les fonctions des librairiesProbleme pour l'exécution
lancer l'execution d'une ressourceexecution de fichier!
utilisation des fonctions imagesExécution auto d'un script SQL sur un serveur MySQL
stockage de fonctions entre 2 serveurs de données sous SQL serverComment inclure une dll pour utiliser ses fonctions ?
Plus de sujets relatifs à : [c] vitesse d'execution lors d'appels de fonctions


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR