IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Probleme optimisation de boucles


Sujet :

C

  1. #1
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut Probleme optimisation de boucles
    Bonjour a tous tout d'abord,

    je suis en stage la et je dois optimiser un programme (noyau de calcul de modification des orientations atomiques des constituants d'une molecule apres une deformation).
    Je ne suis qu'en L2 et mes connaissances en C sont suffisantes... MAIS... J'ai un pb avec du code... Je travaille sur une machine Sun SunBlade 1500 sous Solaris (JE VEUX MON BEAU UBUNTU)...

    Voila l'extrait de code original :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
        /*APPEL DE LinMode => Indicateurs de temps CallLinMode1 et CallLinMode2 */
        CallLinMode1 = time(NULL); /*MODIFIE LE 05/04/06*/
        printf("CallLinMode1 = %lf\n",CallLinMode1);
     
        k = 0;
     
     
        for (j = 0; j < Natomes; j++){ 
    		for (i = 0; i <= 2 ;i++) {
    			if (CMOD[j][i] == 1) {/*par defaut on traite tous les modes, plus tard on pourra choisir */
      		  		LinMode(Natomes, j, i, k, nj, nk, En, err, dx, nl, gg, D, M);
    				kk[j][i] = k;												
    	       	 	k = k+1;
    		}    	    	    	
    	} 			
        }
        CallLinMode2 = time(NULL); /*MODIFIE LE 05/04/06*/
        printf("CallLinMode2 = %lf\n",CallLinMode2); 
        TEMPS_BOUCLE_LINMODE    = difftime(CallLinMode2,CallLinMode1) ; /*MODIFIE LE 05/04/06*/
        printf("******************************************\n\n");
        printf("temps en s = %lf\n", TEMPS_BOUCLE_LINMODE);    
        printf("temps en min = %lf\n", TEMPS_BOUCLE_LINMODE/60) ;
        printf("\n\n******************************************\n\n");
    On voit bien ici un bel exemple de boucle longue... A lui suel, cet extrait dure 30 minutes environ pour s'executer (Natomes est une variable qui fait dans nos tests 46)...

    Je me suis demande si la longueur venait de la boucle du main ou de la fonction elle-meme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    48
    49
    50
    51
    52
    53
    54
    55
     
    void LinMode(int Natomes, int N, int in, int k, int nj, int nk, double En, double err, double
    *dx,int *nl, int *gg, double **D, double **M)
    {
        time_t LM_BEGIN=time(NULL), LM_END ;
        double eps, *ddx , LM_Duree ;
        int i, j, n, nn, ii, it;    
        ddx=vec(3 * Natomes);    
        puts("LinMode\n");
        eps = 10. * err;
        it = 3 * Natomes - 6;     
        for (i = 0; i < 3 * Natomes; i++) {
    	dx[i] = 0.;	
        }
        ii = 3 * nl[N] + in;
        if (ii == it) {
            ii = it - 1;
        }    
        printf("ii=%d\n",ii);    
        dx[ii] = 1.;    
        while (eps > err) {
    	for (i = 0; i < it ; i++) {
    	    ddx[i] = dx[i];
    	    if (i != ii) {
    		for (j = 0; j < it ; j++) {
    		    if (i != j) {
    		       dx[i] += D[i][j] * dx[j];		       		    
    		    }
    		}	    
    	    dx[i] = -dx[i] / D[i][i];
    	    }	    	    
    	    ddx[i] -= dx[i];	    	    	
    	}
    	eps = Norme(ddx,it); /* normalisation de ddx pas nécessaire !*/	
        }     
        En = Energie(Natomes, dx, D);      
        printf("Energie = %f\n",En);      
        for (n = 0; n < Natomes - 3; n++) { 
            nn = 3 * n;
    	ii = gg[n] * 3;        
            M[ii][k] = dx[nn];
    	M[ii + 1][k] = dx[nn + 1];
    	M[ii + 2][k] = dx[nn + 2];
        }  
        nn = 3 * Natomes - 9;
        M[3 * nk][k] = dx[nn]; 
        M[3 * nk + 1][k] = dx[nn + 1];
        M[3 * nj][k] = dx[nn + 2];     
        M[3 * Natomes][k] = En;
        M[3 * Natomes + 1][k] = 3 * N + in;    	      
     
        LM_END=time(NULL) ;
        LM_Duree=difftime(LM_END,LM_BEGIN) ;
        printf(" Duree (en secondes) d'execution pour cet appel = %lf\n", LM_Duree) ;
    }
    A mon avis c'est le passage du main qui est en faute... mais comment optimiser ce bout de code... ?
    De toute facon, la suite de mon stage consistera a passer sur super calculateur et/ou machine parallele mais bon autant d'abord optimiser l'algo !

    Si vous avez une idee, contactez-moi svp...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  2. #2
    Membre averti Avatar de Menthe_a_l_eau
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 47
    Par défaut
    Salut

    Selon les boucle les temps d'execution sont variables.

    un court switch case sera plus long que des if elseif.

    boucle for plus longue que while

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    C'est plus un probléme algorithmique qu'un probléme lié au langage C en java ou en C# tu aurais le même probléme je suppose. Il te faut trouver l'algo d'une complexité moindre que ce que tu as la...Pas toujours évident clair.

  4. #4
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    J'crois que je vais écrire un article sur comment écrire un "beau" code
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Oui, c'est vrai...

    Des noms de variables explicites, une indentation parfois bizarre ...

    Mais pour en revenir à ta question, est ce qu'une étude algorithmique à eu lieu parce que l'optimisation en C n'apportera pas grand chose sur ton programme si l'algorithme utilisé n'est pas le bon.

    Juste comme ça, une double boucle for appelée dans une boucle while, le tout appelé dans une double boucle for ...

  6. #6
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Je vous l'accorde le code est degueulasse... Je suis arrivé dans mon labo de stage et tout ca etait deja fait. Perso, n'importe quel codeur connaissant les moindres regles de Genie logiciel aurait compris qu'il faaut penser des le debut au deboguage et a la maintenance... Là, ben on voit rien...

    Mon stage dure (que) 4 mois et je ne sais pas si j'aurais le temps d'etablir un algo depuis le code... On avance a reculons là !

    Cote "optimisation" de l'algo... Moi je suis prêt mais yen a pas pour le moment... Vous savez les chercheurs...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  7. #7
    Expert confirmé
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Par défaut
    Vous savez les chercheurs...
    T'a quelque chose contre les chercheurs ?

    Mon stage dure (que) 4 mois et je ne sais pas si j'aurais le temps d'etablir un algo depuis le code...
    Il n'y a pas de doc avec le code ? T'a pas la personne qui a fait le code sous la main ?

  8. #8
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Je n'ai strictement rien contre les chercheurs mais MES chercheurs (enfin, j'ai pas gardé la facture... ), sont assez bordéliques... des physiciens, la théorie du chaos en prime !!!

    Aucune documentation, aucun cahier de recettes, aucun commentaire algorithmique...

    Bref, c'est la caca...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Ouais, t'as qqch contre les chercheurs ?
    Bon, commence par découper ta fonction en sous-blocs de 5-10 lignes maximum. Regarde ce qu'elle fait et nomme-la de manière explicite, ainsi que les variables.

  10. #10
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Citation Envoyé par PRomu@ld
    Oui, c'est vrai...
    Juste comme ça, une double boucle for appelée dans une boucle while, le tout appelé dans une double boucle for ...
    Pour l'indenation, c'est juste un pb de copier-coller.

    La boucle While avec les deux for imbriqués ne me plait pas non plus.

    J'aimerais en effet refondre entierement l'algo de cette fonction LinMode mis je ne sais pas trop par quoi commencer (niveau L2 IUP Info)...
    Est-il préférable de séparer les POUR du PENDANT QUE et de faire un WHILE portant les resultats calculés dans les FOR placés en amont ? Serait-ce utile de transformer tout ou partie des boucles en récurisivité ? Pour choisir entre toutes les solutions qui s'offrent, il me faudrait des connaissances complémentaires au calcul (ou la détermination) de la complexité.
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  11. #11
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Citation Envoyé par Miles
    Ouais, t'as qqch contre les chercheurs ?
    Bon, commence par découper ta fonction en sous-blocs de 5-10 lignes maximum. Regarde ce qu'elle fait et nomme-la de manière explicite, ainsi que les variables.
    Ok, je procède et je vous recontacte si jamais. En tout cas, merci beaucoup de votre aide. Ce forum est super et le site avec. (COURS Recursivité et Megabook du C m'ont bcp aidés).
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  12. #12
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    Bon, j'ai commencé...
    Voilà à peu près ce que j'ai fait. Pour le moment, j'ai remlacé le while(eps>err) par un appel récursif de paramètre eps.
    Ensuite, il y avait une initialisation d'un vecteur à 0. par une boucle FOR que j'ai remplacé par une MACRO.

    Maintenant, je voudrais m'attaquer aux FOR mais leur structure est biscornue et leur actions interdépendantes. Pour le moment, je bloque !
    Mais cela va s'eclaircir... Ils l'ont même dit à la météo !

    OK OK je sors
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    Salut,
    pour connaitre la fonction qui met le plus de temps tu peux utiliser le profiler non ?

  14. #14
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    J'avoue ne pas connaitre le Profiler... Je me suis simplement servi d'indicateurs de temps avec T1=time(NULL) et difftime...
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

Discussions similaires

  1. [Tableaux] Optimisation de boucles
    Par xdoreau dans le forum Langage
    Réponses: 4
    Dernier message: 12/02/2007, 11h28
  2. probleme dans un boucle for
    Par accoustic dans le forum Delphi
    Réponses: 2
    Dernier message: 26/08/2006, 10h45
  3. [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/07/2006, 01h04
  4. Optimisation de boucle 'while..do'
    Par delphi5user dans le forum Delphi
    Réponses: 10
    Dernier message: 25/07/2006, 22h37
  5. Réponses: 4
    Dernier message: 17/01/2006, 19h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo