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

Langage C++ Discussion :

Optimisation de code C++


Sujet :

Langage C++

Vue hybride

Thauglor Optimisation de code C++ 19/04/2010, 10h21
white_tentacle Une idée comme ça, c'est de... 19/04/2010, 10h35
Thauglor a savoir lesquelles? car je... 19/04/2010, 11h34
camboui Les appels à... 19/04/2010, 11h47
Thauglor c'est des fonctions inline ... 19/04/2010, 11h51
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Thauglor
    Homme Profil pro
    Ingénieur conception et développement
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur conception et développement
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut Optimisation de code C++
    Bonjour a tous...

    Voila je dois remplacer une librairie qui me fait ce calcul, mais j'ai un temps de calcul bien supérieur au leur. Je voulais savoir si quelqu'un a des idées d'optimisation qui pourrait diminuer cet écart de temps de calcul (2 à 3 fois supérieur que ce qu'il est possible de faire).

    Pour le contexte, c'est l'extraction d'une coupe 2D dans un volume 3D.

    J'ai calculé un vecteur de déplacement équivalent au déplacement entre deux pixels. 1 Sur l'axe des X l'autre sur l'axe des Y. a chaque itération (et donc a chaque pixel) j'effectue mon déplacement, regarde le voxels qui contient le point et en extrait la données.


    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
    56
    57
    int CVolume::RasterizeSliceNearest(void* aiSlice,
    							const double* adOrigVOL, 
    							const double* adVectorDepVOL,
    							const double* adResVOL, 
    							const int iNbWidthVIEW, 
    							const int iNbHeightVIEW,	
    							const int iValMinVOL)
    {
    	double adCurPosVOL[3];
    	double adOrigPosVOL[3];
    	double adVectorPosVOLX[3];
    	double adVectorPosVOLY[3];
    	int aiVoxelVOL[3];
    	short* aiVolumeTemp;
    	unsigned char* acVolumeTemp;
    	int iPos=0;
     
    	for(int k = 0 ; k<3;k++)
    	{
    		adOrigPosVOL[k] = adOrigVOL[k]/adResVOL[k];
    		adVectorPosVOLX[k] = adVectorDepVOL[k]/adResVOL[k];
    		adVectorPosVOLY[k] = adVectorDepVOL[k+3]/adResVOL[k];
    	}
     
    	aiVolumeTemp = (short*)m_aiPixelsValue;
    	for(int i=0; i<iNbHeightVIEW;i++)
    	{
    		adOrigPosVOL[0]+=adVectorPosVOLY[0];
    		adOrigPosVOL[1]+=adVectorPosVOLY[1];
    		adOrigPosVOL[2]+=adVectorPosVOLY[2];
    		adCurPosVOL[0] = adOrigPosVOL[0];
    		adCurPosVOL[1] = adOrigPosVOL[1];
    		adCurPosVOL[2] = adOrigPosVOL[2];
    		for(int j=0;j<iNbWidthVIEW;j++)
    		{
    			adCurPosVOL[0] += adVectorPosVOLX[0];
    			adCurPosVOL[1] += adVectorPosVOLX[1];
    			adCurPosVOL[2] += adVectorPosVOLX[2];
    			aiVoxelVOL[0] = (int)adCurPosVOL[0];
    			aiVoxelVOL[1] = (int)adCurPosVOL[1];
    			aiVoxelVOL[2] = (int)adCurPosVOL[2];
    			if(adCurPosVOL[0]>=0&&adCurPosVOL[1]>=0&&adCurPosVOL[2]>=0
    					&&aiVoxelVOL[0]<GetVolDimWidth()&&aiVoxelVOL[1]<GetVolDimHeight()&&aiVoxelVOL[2]<GetVolDimDepth())
    			{
    				((short*)aiSlice)[iPos] = (short)aiVolumeTemp[aiVoxelVOL[0]+m_aiDecalInWidthPos[aiVoxelVOL[1]]+m_aiDecalInWidthHeightPos[aiVoxelVOL[2]]];//Aislice est de type void * (tableau à 1 dimension)
    //m_aiDecalInWidthHeightPos contient les déplacement de mon tableau
     
    			}
    			else
    			{
    				((short*)aiSlice)[iPos] = (short)iValMinVOL;
    			}
    			iPos++;
    		}
    	}
    return 0;
    }

  2. #2
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Une idée comme ça, c'est de sortir de ta boucle toutes les opérations qui ne dépendent ni de i, ni de j (toutes celles qui ne dépendent pas de ipos en fait).

    Ca devrait largement améliorer tes performances .

  3. #3
    Membre confirmé Avatar de Thauglor
    Homme Profil pro
    Ingénieur conception et développement
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur conception et développement
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut
    a savoir lesquelles? car je pense les avoir toute enlevées.

    En fait je me sers de mes boucles également pour ajouter chaque composante de mon vecteur. je ne peux sortir ce calcul de mes boucles.

    C'est plus un problème de syntaxe ( stockage et accès de données) je pense car niveau algorithmique itérative je pense avoir fait le tour

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Les appels à GetVolDimWidth(), GetVolDimHeight() et GetVolDimDepth() peuvent être sortis de la boucle.

  5. #5
    Membre confirmé Avatar de Thauglor
    Homme Profil pro
    Ingénieur conception et développement
    Inscrit en
    Avril 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur conception et développement
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2006
    Messages : 81
    Par défaut
    c'est des fonctions inline

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    inline int GetVolDimWidth(void){return m_aiVolDim[0];};

    dans le doute j'ai remplacé les appels à ces fonctions par les

    m_aiVolDim[0] correspondant... Toujours trop de temps de calcul

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Calcul parallèle -> MMX, SSE, assembleur, etc...

  7. #7
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Effectivement, j'ai regardé un peu vite, pas évident de sortir des choses de la boucle.

    Tu peux tenter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int CVolume::RasterizeSliceNearest(void* aiSlice,
    							const double* __restricted__ adOrigVOL, 
    							const double* __restricted__ adVectorDepVOL,
    							const double* __restricted__ adResVOL, 
    							const int iNbWidthVIEW, 
    							const int iNbHeightVIEW,	
    							const int iValMinVOL)
    (plus tout à fait sûr de la position du __restricted__, ne marche qu'avec gcc, pour visual il y a un autre mot clé je crois). Ton optimiseur devrait pouvoir optimiser un peu plus. Ca n'explique toutefois pas un x3.

    Sinon, mettre le m_aiVolDim[x] dans une variable de pile plutôt que dans le tableau peut aider (dépend du volume de données --> la variable se trouvera sur la pile ou dans un registre plutôt que dans ta ram, ça peut potentiellement réduire le nombre de page faults et augmenter les perfs).

Discussions similaires

  1. optimiser le code d'une fonction
    Par yanis97 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 15/07/2005, 08h41
  2. Optimiser mon code ASP/HTML
    Par ahage4x4 dans le forum ASP
    Réponses: 7
    Dernier message: 30/05/2005, 10h29
  3. optimiser le code
    Par bibi2607 dans le forum ASP
    Réponses: 3
    Dernier message: 03/02/2005, 14h30
  4. syntaxe et optimisation de codes
    Par elitol dans le forum Langage SQL
    Réponses: 18
    Dernier message: 12/08/2004, 11h54
  5. optimisation du code et var globales
    Par tigrou2405 dans le forum ASP
    Réponses: 2
    Dernier message: 23/01/2004, 10h59

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