CHALLENGE/Partage de connaissances : optimiser son code !!!
Bonjour � tous, je vous propose un petit challenge de programmation la plus efficace possible,
le but est de partager ses connaissances et montrer � tous des m�thodes de programmation performantes
la r�gle du jeux est la suivante, � partir d'un code simple de filtrage d'image par exemple, tout candidat peut proposer ses propres modifications
et montrer � tous le gain en performance qu'il a pu noter. pr�sentez les gains de vitesse chiffr�s et proposez un code clair (et comment�) pour que chacun puisse le comprendre ais�ment.
Sont autoris�s tout changement du code d'origine qui ne modifie pas le r�sultat final, � partir de l�, toute optimisation est possible
pointeurs/registres, fonction intrinsics (SSE2 etc), threads etc tout est envisageable, mais doit rester portable (linux et windows, restons en l�)
les shaders peuvent aussi �tre propos�s.
Le code simple de base est pr�sent� ci dessous, Bon courage � tous.
l'exemple propos� ici r�alise un filtrage sur une image en NIVEAUX DE GRIS (donc, pas en RGB ou autre, juste sur un calque), ligne par ligne, de la gauche vers la droite, il s'agit en fait d'un filtrage passe bas (lissage des contours) assym�trique couramment utilis� en traitement d'image.
dans le code propos�, les calculs sont effectu�s sur une image de taille _NBrows par _NBcolumns
le r�sultat final est stock� dans le tableau 'outputFrame', en entr�e on a le tableau outputFrame (r�sultat de la frame pr�c�dente par exemple que l'on va �craser apr�s calcul), l'image d'entr�e 'inputFrame' (de m�me taille que la sortie) et une autre image de param�tres 'window' de m�me taille que l'image de sortie), une variable temporaire 'value' permet d'inclure dans le calcul du pixel courant, le r�sultat du calcul du pixel pr�c�dent.
TOUS LES CALCULS SONT EFFECTUES EN TYPE DOUBLE
voici le code non optimis� :
%%%%%%%%%%%%%%%%%%%%%%%%%%
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <iostream.h>
#include <time.h>
unsigned int _NBcolumns=640; // nombre de colonnes des buffers
unsigned int _NBrows=480; // nombre de lignes des buffers
// Entry point
int main(int argc, char *argv[])
{
// buffers d'entrée et de sortie
double outputFrame[480][640], inputFrame[480][640], windowfilter[480][640];
// variables/buffers utilisés dans les boucles:
double value, tau=10.0;
unsigned int IDrow, IDcolumn, NBloops=100;
cout<<"loop started"<<endl;
int startTime=clock();
//appel de la fonction de filtrage 10 fois
for (unsigned int i=0; i<NBloops; ++i)
// def des variables de taille des buffers
{
/* PARTIE A OPTIMISER */
// boucle appelée pour toute nouvelle image d'entrée (inputFrame) on retyrouve le code suivant :
for (IDrow=0; IDrow <_NBrows; ++IDrow)
{
value=0; // initialize la variable pour chaque nouvelle ligne traitée
for (IDcolumn=0; IDcolumn<_NBcolumns ; ++IDcolumn)
{
value = outputFrame[IDrow][IDcolumn]*tau + inputFrame[IDrow][IDcolumn] + windowfilter[IDrow][IDcolumn]* value;
outputFrame[IDrow][IDcolumn] = value;
}
}
/* FIN DE LA PARTIE A OPTIMISER */
}
int endTime=clock();
cout<<"filtering finished, time elapsed="<<(endTime-startTime)/(NBloops)<<"clocks"<<endl;
return 0;
} |
%%%%%%%%%%%%%
merci pour vos contributions, pour toute les personnes int�ress�s par l'optimisation de code et les novices d�sireux de progresser (moi compris)
++
ALex : :)
Re: CHALLENGE/Partage de connaissances : optimiser son code
Citation:
Envoy� par alexIsBack
'exemple propos� ici r�alise un filtrage sur une image, ligne par ligne, de la gauche vers la droite, il s'agit en fait d'un filtrage passe bas (lissage des contours) assym�trique couramment utilis� en traitement d'image.
Salut.
C'est int�ressant comme challenge.
Si tu travailles sur des pixels, donnes le format aussi (RGBA?). Vu que c'est du traitement d'image, je ferais faire le travail par la carte graphique en utilisant les pixels shaders. Mais bon tout d�pend du contexte, et je trouve que le tien n'est pas bien d�finit:
par exemple, tu devrais donner un code complet, compilable qui incluerait les tests de performance (un timer genre Queryperformancecounter) et les conditions de test (processeur, ram, etc...). Il n'y aurait plus qu'� modifier la boucle.