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

  FORUM HardWare.fr
  Programmation
  C++

  C++, boucles, compilo, et optimisation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

C++, boucles, compilo, et optimisation

n°1675579
noliramlis
Posté le 23-01-2008 à 12:33:22  profilanswer
 

Boujour tout le monde,
Alors donc, je bosse dans le traitement d'image et la reco de forme, je suis pas franchement un wizard, le code tenant plus du moyen que de la finalité.  
Mais donc je suis confronté a ce petit probleme : pour le traitement d'image, de gros tableaux donc, j'avais tendance à favoriser l'acces par pointeur que par index.
C'est a dire considerer ca  

Code :
  1. for (i=0 ; i < TabSize; i++ )
  2. {
  3. (*ptab)+=1;
  4. ptab++;
  5. }

 
 
mieux que ca  

Code :
  1. for (i=0 ; i < TabSize; i++ )
  2. {
  3.         tab[i]+=1;
  4. }


 
en debug sous VS2005 c'est vrai, mais je m'apercois qu'en release... la deuxieme version est juste deux fois plus rapide.
vive la prediction !
 
mais bon, en meme temps si maintenant je travaille sur un voisinnage, les deux versions suivantes sont strictement aussi rapide :

Code :
  1. for (i=1 ; i < TabSize-1; i++ )
  2. {
  3.         tab2[i]+=tab[i]+tab[i-1]+tab[i+1];
  4.     }


 

Code :
  1. ptab=tab+1;
  2. ptab_ante=tab;
  3. ptab_post=tab+2;
  4. ptab2=tab2+1;
  5. for (i=1 ; i < TabSize-1; i++ )
  6. {
  7.     (*ptab2)+= *ptab+*ptab_ante+*ptab_post;
  8. ptab++;
  9. ptab_ante++;
  10. ptab_post++;
  11. ptab2++;
  12.    
  13. }


 
mais moins rapide (5%) que la version bourrin :
 

Code :
  1. for (i=1 ; i < TabSize-1; i++ )
  2. {
  3. a=i-1;
  4. c=i+1;
  5. tab2[i]+=tab[i];
  6. tab2[i]+=tab[a];
  7. tab2[i]+=tab[c];
  8.     }


 
 
D'ou ma QUESTION :
Quelles sont les règles à observer avec les compilo moderne pour optimiser les temps de calcul???
 
 
Toute les remarques sont les bienvenues


Message édité par noliramlis le 23-01-2008 à 12:45:26
mood
Publicité
Posté le 23-01-2008 à 12:33:22  profilanswer
 

n°1675882
kyntriad
Posté le 23-01-2008 à 18:30:43  profilanswer
 

Je te conseillerais de mater du côté de comment le compilo de 2005 optimise le code, voire aussi de celui des post/pre incrementations.
 


---------------
You can't start a fire with moonlight
n°1676055
noliramlis
Posté le 24-01-2008 à 10:14:57  profilanswer
 

Oui merci, je vais regarder ça de plus pres.
Sinon pour la preincrementation, d'apres les tests, c'est aussi à ranger dans la catégorie vielle légende.
PS : one sait jamais :) , des liens pour des doc sur le compilo 05?
Marci en tout cas

n°1676062
Joel F
Real men use unique_ptr
Posté le 24-01-2008 à 10:39:13  profilanswer
 

arrete d'utiliser cette notation 1D pour l'accés au élément et fait comme les grandes personnes : utilise une notation  2D aprés une allocation façon NRC.

 

Ensuite, la tu bouibouite pour rien. Tu gagnera vraiment en optimisant la localité de tes données dans le cache, càd en travaillant sur des tuiles carrées au sein de ton image.
CF le topic : http://forum.hardware.fr/hfr/Progr [...] 0227_1.htm
Ensuite, ca te permet aussi de parcourir des voisinages proprement

 

Ah et ICC >> Visual Crap 2005 :o Faudra voir à utiliser le compilo qui correspondt à ton archi et pas un ersatz


Message édité par Joel F le 24-01-2008 à 10:46:21
n°1676278
noliramlis
Posté le 24-01-2008 à 15:03:25  profilanswer
 

ICC :), ca me rappelle un certain Lacassagne, me demande s'il est pas à Orsay lui aussi. Mais oui sur le principe oui. Mais apres.
NRC : faudrait que je m'y remette. en ce moment je suis plus sur OpenCV. (Qui est lui aussi basé sur les lib Intel mais qui ne pratique pas l'index 2D sauf erreur.)
Les index 2D : ah ouais t's raison il faut que je grandisse!!! :)
Plus serieusement je comprends pas bien : une alloc 1D garantie une certaine continuité dan le cache nan?
et puis tu dis dans l'autre thread que tu sauves un Multiplication a chaque acces. Perso moi de mon cote ca fait une multiplication +une addition mais seulement 1 fois par ligne. apres c'est gratos. ca me semble mieux ou alors j'ai pas compris.  
 
Mais sinon tres merci de ton attention que je suppute tres documentée. Dans l'attente d'une réponse !

n°1676285
Joel F
Real men use unique_ptr
Posté le 24-01-2008 à 15:14:54  profilanswer
 

noliramlis a écrit :


ICC :), ca me rappelle un certain Lacassagne, me demande s'il est pas à Orsay lui aussi. Mais oui sur le principe oui. Mais apres.


Ouasi, il est genre dans le bureau d'en face là :p
 

noliramlis a écrit :


NRC : faudrait que je m'y remette. en ce moment je suis plus sur OpenCV. (Qui est lui aussi basé sur les lib Intel mais qui ne pratique pas l'index 2D sauf erreur.)
Les index 2D : ah ouais t's raison il faut que je grandisse!!! :)
Plus serieusement je comprends pas bien : une alloc 1D garantie une certaine continuité dan le cache nan?
et puis tu dis dans l'autre thread que tu sauves un Multiplication a chaque acces. Perso moi de mon cote ca fait une multiplication +une addition mais seulement 1 fois par ligne. apres c'est gratos. ca me semble mieux ou alors j'ai pas compris.  


 
Regarde comment j'alloue : 1 bloc contigue de N*M puis un bloc de pointeur de M qui pointe sur le debuts des lignes. Tout est contigue.  
Pour assurer la localité dans le cache, c'ets pas tant le fait d'etre contigue. On demontre mathematiquement que la zone memoire qui optimise la localité, c'est une boule. Dans le monde des caches, les boules, c'est des carrés ;)
Ensuite, l'acces [][] simplifie grandement la description de la boule optimale et c'est la ou y a le gain.

n°1676321
noliramlis
Posté le 24-01-2008 à 15:46:18  profilanswer
 

Citation :

Ouasi, il est genre dans le bureau d'en face là :p


bon ben passe lui le bonjour de la part de celui qui lui a optimisé une multiplication matricielle a Jussieu.
 

Citation :

l'acces [][] simplifie grandement la description de la boule optimale et c'est la ou y a le gain.


Alors qu'elle implique une addition a chaque acces????
 

n°1676328
Joel F
Real men use unique_ptr
Posté le 24-01-2008 à 15:55:19  profilanswer
 

compare à comment tu ecrirais ton parcours de tuile carré avec ton accés 1D.
 

n°1676335
Joel F
Real men use unique_ptr
Posté le 24-01-2008 à 16:12:40  profilanswer
 

noliramlis a écrit :

bon ben passe lui le bonjour de la part de celui qui lui a optimisé une multiplication matricielle a Jussieu.


 
Salut, C'est "Lacassagne", j'hésite entre 2 personnes: 1 qui était bonne à CS et l'autre à peine moyenne en frag...
Si tu veux avoir des info sur le compilo Intel, j'ai une vielle version de l'aide en ligne sur ma page: http://www.ief.u-psud.fr/~lacas
 
Je retrouve mon login sur Hardware et je te poste la suite.
Je suis neanmoins surpris que, quelques années apres mon départ de Jussieu, plus personne ne sache coder ;-)
 
L.

n°1676337
noliramlis
Posté le 24-01-2008 à 16:19:34  profilanswer
 
mood
Publicité
Posté le 24-01-2008 à 16:19:34  profilanswer
 

n°1676340
noliramlis
Posté le 24-01-2008 à 16:29:29  profilanswer
 

Citation :

compare à comment tu ecrirais ton parcours de tuile carré avec ton accés 1D.


 
Alors si on neglige le calcul des i+j*M en debut de ligne et stockés en variables intermediaires, chaque acces va me couter une addition pour parcourir le voisinnage tab[a-1]..tab[a+1], tab[b-1]..tab[b+1]... et toi Deux ;tab[i-1][j].... puisque qu'une intervient a chaque calcul d'adressede toute facon..
Apres j'admets que mon code sera du type " a gerber" genre le dernier exemple que je donnais a la fin de mon premier message
 
Combien de PS3 a la maison les celleux?  

n°1676341
Joel F
Real men use unique_ptr
Posté le 24-01-2008 à 16:30:11  profilanswer
 

tab[i][j] ne fait que une addition ... je vois pas ou est la deuxieme

n°1676342
lacas
Posté le 24-01-2008 à 16:33:47  profilanswer
 


 
Tu veux dire R1 ?
 
En ce qui concerne les compilos, c'etait au 19eme siecle qu'on utilisait la notation pointeur, parce qu'a l'epoque les compilos etaient franchement mauvais.
Maintenant, cela va mieux et l'idee c'est de se rapprocher le plus possible du F77 et de ses notations tableaux, d'ou T[i][j].
Apres, dans le choix du compilo, sur intel et AMD: icc, sur Power, XLC.
 
Apres tu peux derouler ta boucle, faire de la rotation de registres, et d'autre trucs sympa. Sur des noyaux de convolutions, en passant en SIMD, on jusqu'a un gain x30 a x40 (si si) en combinant differentes technique.
 
en ce qui concerne les problemes de codage en OpenCV, il faut transformer les pointeurs 1D en pointeurs 2D via une structure NRC, ce qui resoudra ton pbm
 
L.

n°1676354
noliramlis
Posté le 24-01-2008 à 16:55:31  profilanswer
 

tab[i][j] ouais alors ok 1 addition pour le parcours , mais alors moi tab[k] et dans ce cas zero (encore une fois je neglige le k=i+j*M en debut de ligne): mais decidément je crains le quiproquo.  
 
 

Citation :

en ce qui concerne les problemes de codage en OpenCV, il faut transformer les pointeurs 1D en pointeurs 2D via une structure NRC


Je vais ptet faire ca ouais. Merci.
Ptain vous vous etes bien trouvé tout les deux :D
 
R1(donc)

Message cité 1 fois
Message édité par noliramlis le 24-01-2008 à 16:56:29
n°1676360
lacas
Posté le 24-01-2008 à 17:05:52  profilanswer
 

noliramlis a écrit :

tab[i][j] ouais alors ok 1 addition pour le parcours , mais alors moi tab[k] et dans ce cas zero (encore une fois je neglige le k=i+j*M en debut de ligne): mais decidément je crains le quiproquo.  
 
Ptain vous vous etes bien trouvé tout les deux :D
 
R1(donc)


 
Les grands esprits se rencontrent. Pour info, il y a actuellement en France un regroupement de ce type de competences (et d'autre ofc) via les Poles de Competitivité qui combine l'approche industrielle (R&D) avec les Labos de Recherche. Passe donc sur les sites web d'Ocelle (http://ocelle.ief.u-psud.fr) et de Teraops (http://teraops-emb.ief.u-psud.fr)
 
Avec l'explosion de la complexité des algo, on est de plus en plus obligé d'optimiser les codes. Ceux qui ne le font pas vont disparaitre a terme...
Idem pour le hard.
 
Nous on developpe des outils pour que justement il ne soit plus necessaire de maitriser le codage en C et connaitre toutes les techniques d'optimisation.
Car une fois que ton code tourne sur 1 proc, il faut distribuer le calcul sur p procs (par exemple deux quadri-core). Et la c'est NP complet...
 
L.

n°1676366
noliramlis
Posté le 24-01-2008 à 17:10:56  profilanswer
 

"Et la c'est NP complet" : toujours le mot pour rire à ce que je vois

n°1676368
lacas
Posté le 24-01-2008 à 17:13:50  profilanswer
 

noliramlis a écrit :

"Et la c'est NP complet" : toujours le mot pour rire à ce que je vois


 
OK, explosion combinatoire.
 
T'es dans quelle boite ?

n°1676372
noliramlis
Posté le 24-01-2008 à 17:27:11  profilanswer
 

Houla c'est complique :) :
j'ai fait un an pour le LCPC, 3 mois pour le LIVIC via une chtite boite, et comme ils sont cool, j'y reste un peu. ils lancent une micro filiale vision/ reco de la route. on est 2 pour l'instant. on va bosser sur LOVE un petit peu.
 mais sur laval :( .bref dans 5 6 mois j'avise.

n°1676389
lacas
Posté le 24-01-2008 à 17:52:49  profilanswer
 

typiquement pour Love (http://love.univ-bpclermont.fr/ pour ceux qui nous lisent), il faut des outils car les algos sont compliqués et nombreux.
si pour le moment, on se contente de faire tourner cela en mono thread, la version finale devra etre optimisée et parallelisee...
 
Donc il faut y penser des maintenant pour que ton code soit parallelisable. Avec NRC ca l'est avec des pointeurs ce sera bien plus difficile...
 
L.


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

  C++, boucles, compilo, et optimisation

 

Sujets relatifs
optimisation de boucles[SQL] Optimisation de requete
[resolu]Boucles sur des requetes MySQLOptimisation Comparer deux colonnes en VBA sous Excel
surcharges const, non const, et optims du compiloBoucles et performances [ résolu ]
optimisation du code, tester valeur avant attribution ?Tracage itinéraire - Optimisation performances
[MDX] Optimisation de requetes sur cubes / AnalysisServices2005 
Plus de sujets relatifs à : C++, boucles, compilo, et optimisation


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