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 Vitesse d'Exécution Calcul matriciel


Sujet :

Langage C++

  1. #21
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Vectors Iliffe de leur petit nom. (et NRC pour numerical recipe in C).

    Plus par oubli que par volonté.
    J'ai pas dis le contraire, et l'origine ne change rien au fait que c'est pas garantie.


    D'ailleurs, certaines interprétations de la sainte norme affirment que la contigüité est sous-entendu.
    C'est pas la mienne. (d'interprétation)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  2. #22
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Et pour ceux qui ne parle pas le Joel couramment , NRC ça veut dire quoi
    Je vais finir par faire une entrée dans la FAQ ^^

    Tableaux NRC == tableaux alloués selon la methode preconisée dans Numerical Recipes in C.

  3. #23
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Joel F Voir le message
    Je vais finir par faire une entrée dans la FAQ ^^
    Chiche. Il y le dico aussi pour ça
    Citation Envoyé par Joel F Voir le message
    Tableaux NRC == tableaux alloués selon la methode preconisée dans Numerical Recipes in C.
    En même temps, je comprends pourquoi ça ne m'évoquait rien. Ca sent l'analyse numérique (qui n'est pas mon meilleur souvenir)

  4. #24
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par Goten Voir le message
    Non, c'est pas garantie en C++98 (par contre toute les implémentations que je connaissent le sont oui )
    La contigüité dans les vecteurs est garantie en C++03.
    Pour les sttring, j'ai la flemme de chercher si c'est maintenant assuré dans le C++11.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #25
    Membre chevronné
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Points : 1 921
    Points
    1 921
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Chiche. Il y le dico aussi pour ça
    En même temps, je comprends pourquoi ça ne m'évoquait rien. Ca sent l'analyse numérique (qui n'est pas mon meilleur souvenir)
    Je pensais a la FAQ, histoire qu'on ai le bout de code d'example avec.

  6. #26
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Salut,

    J'en viens aux nouvelles, tu as réussi ?

    Sinon, je crois qu'en c++, tu peux directement intégrer du code assembleur

  7. #27
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut
    Citation Envoyé par Joel F Voir le message
    pas pour 600x600 pauvres valeurs ... tu va payer 100000 fois le temps de trasnfert et avoir une acceleration moisie.
    sauf en host alloc

  8. #28
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Avant de passer à une version SSE ou GPU, il faudrait peut être faire des choses simples avec un impact assez immédiat, comme sortir les calculs non nécessaires des boucles les plus imbriquées, éliminer au mieux les multiplications (par exemple, u augmente de 1 en 1, donc index2 va augmenter de nbPixH en nbPixH ; il y a quelques autres exemples), simplifier le calcul des bornes, changer la représentation mémoire, etc.

    Ce code peut être optimisé de manière assez violente avant même de penser à changer de techno.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 52
    Points : 60
    Points
    60
    Par défaut
    sinon pour savoir exactement exactement ou ton code à des eprtes de performances tu peux te former dans l'utilisation d'outils de profiling.

    http://matthieu-brucher.developpez.c...visual-studio/

    suivant les opinions d'une ou deux personnes que j'ai recontré, les vectors on des gros problèmes de perfomances ( 15% du temps passé pour certains algorithmes est utilisé dans l'operateur [] )

    Je suppose que je le code est utilisé pour du traitement d'image, passer dans le domaine fréquentiel (FFT/FFTi) est généralement une bonne idée pour gagner en performances

  10. #30
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par xelif Voir le message
    suivant les opinions d'une ou deux personnes que j'ai recontré, les vectors on des gros problèmes de perfomances ( 15% du temps passé pour certains algorithmes est utilisé dans l'operateur [] )
    Etrange - à moins qu'ils n'aient fait les tests de performance en release débug. L'opérator [] est du vector est inliné en mode release.

    Le code de operator[] pour la libstdc++ de gcc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          reference
          operator[](size_type __n)
          { return *(this->_M_impl._M_start + __n); }
    Ce qui est strictement équivalent à l'accès à une entrée d'un tableau simple (déréférencement d'une pointeur + offset)
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  11. #31
    Membre éprouvé Avatar de oxyde356
    Homme Profil pro
    Ingénieur Recherche Imagerie
    Inscrit en
    Février 2006
    Messages
    797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur Recherche Imagerie

    Informations forums :
    Inscription : Février 2006
    Messages : 797
    Points : 1 087
    Points
    1 087
    Par défaut
    As-tu activé le max d'optimisations niveau compilo ?
    Il me semble que setter la macro _SECURE_SCL à 0 (qui permet de s'assurer que tu ne fais pas de bêtises avec les containers de la STL) te donnera un petit gain. Le multithreading avec répartition de charges te donnera de biens meilleurs performances aussi.

  12. #32
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut
    Si ça te dit poste un main.cpp qui compile tout seul et j'essaye de faire des améliorations.
    Ca me fera plaisir de faire un peu d'optimisation, ça fait longtemps

  13. #33
    Membre habitué

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2010
    Messages
    80
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2010
    Messages : 80
    Points : 127
    Points
    127
    Par défaut
    voici ce que j'ai fait (c'est-à-dire pas grand chose)
    et en mettant des tableaux C (des double* quoi) ça va 3,5 fois plus vite chez moi. (sous visual studio 2008 Express avec les options d'optimisation de base)

    j'imagine que GCC doit faire bien mieux.
    Sans parler d'ICC.

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    #include <Windows.h>
    #include <cstdlib>
    #include <cstdio>
    #include <cmath>
     
    // timer pour afficher les perfs
    struct timer
    {
    	LARGE_INTEGER _start, _stop, _freq ;
    	timer () { ::QueryPerformanceFrequency(&_freq); }
    	void start () { ::QueryPerformanceCounter(&_start); }
    	double stop () 
    	{
    		::QueryPerformanceCounter(&_stop);
    		return double (_stop.QuadPart - _start.QuadPart) / double (_freq.QuadPart) ;
    	}
    };
    // petite fonction d'allocation pour les double**
    double** allocate(int n) ;
    void desallocate(double** a, int size) ;
     
    void fonction1 (); // la tienne (sans rien changer)
    void fonction2(); // la mienne
     
    // -------------- MAIN ------------------------
     
    int main (int argc, char** argv)
    {
    	fonction1 ();
    	fonction2 ();
    }
    // -------------- MAIN ------------------------
     
    double** allocate(int n)
    {
    	double** res = (double**) malloc(600*sizeof(double*));
    	for (int i=0; i<600; ++i)
    		res[i] = (double*) malloc(600*sizeof(double));
    	return res ;
    }
     
    void desallocate(double** a, int size)
    {
    	for (int i = 0 ; i < size ; ++i)
    		free(a[i]);
    	free(a);
    }
     
    void fonction1 ()
    {
    	timer tim ;
     
    	double** tabInitial = allocate(600);
    	double** tabFinal = allocate(600);
    	double** filter = allocate(21);
     
     
    	tim.start () ;
     
    	int demiTaille = 10;
     
    	for(int n=0; n< 600; ++n)
    	{
    		for(int m=0; m<600; ++m)
    		{
    			int uBegin = max(0, n - demiTaille );
    			int uEnd = min(599, n + demiTaille );
    			int vBegin = max(0, m - demiTaille );
    			int vEnd = min(599, m + demiTaille );
    			double temp = 0.0;
    			for(int u=uBegin; u<=uEnd; ++u) {
    				for(int v=vBegin; v<=vEnd; ++v) {
    					temp += abs(tabInitial[u][v]) * filter[demiTaille + u - n][demiTaille + v - m];
    				}
    			}
    			tabFinal[n][m] = temp;
    		}
    	}
     
    	::printf("fonction initiale : %f\n", tim.stop ());
    	desallocate(tabInitial, 600);
    	desallocate(tabFinal, 600);
    	desallocate(filter, 600);
    }
     
     
    void fonction2 ()
    {
    	timer tim ;
     
    	int demiTaille = 10;
     
    	double* tabInitial = (double*) malloc(600*600*sizeof(double)) ;
    	double* tabFinal = (double*) malloc(600*600*sizeof(double)) ;
    	double* filter = (double*) malloc(21*21*sizeof(double));
    	tim.start () ;
     
    	int ind = 0 ;
    	for (int n = 0; n < 600; ++n) // loop on main matrix
    	{
    		for (int m = 0 ; m < 600 ; ++m, ++ind)
    		{
    			double temp = 0. ;
    			int uBegin = max(0, n - demiTaille );
    			int uEnd = min(599, n + demiTaille );
    			int vBegin = max(0, m - demiTaille );
    			int vEnd = min(599, m + demiTaille );
    			for(int u=uBegin; u<=uEnd; ++u) {
    				int uu=demiTaille+u -n ;
    				for(int v=vBegin; v<=vEnd; ++v) {
    					int vv=demiTaille+v-m;
    					temp += abs(tabInitial[u*600+v]) * filter[uu*21 + vv];
    				}
    			}
    			tabFinal[ind] = temp;
    		}
    	}
    	::printf("fonction mieux : %f\n", tim.stop ());
     
    	free(tabInitial);
    	free(tabFinal);
    	free(filter);
     
    }

  14. #34
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Avec un compilo qui fait bien son boulot:
    http://stackoverflow.com/questions/3.../381656#381656
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

Discussions similaires

  1. [Débutant] Optimiser la vitesse d'exécution
    Par horemheb dans le forum VB.NET
    Réponses: 2
    Dernier message: 02/08/2013, 11h40
  2. Optimisation de calcul matriciel
    Par maxi_simo dans le forum MATLAB
    Réponses: 3
    Dernier message: 20/03/2013, 13h53
  3. Optimisation de boucles via calcul matriciel
    Par HAL-9000 dans le forum MATLAB
    Réponses: 12
    Dernier message: 06/03/2010, 22h53
  4. Calcul de la vitesse d'exécution d'un prog.
    Par fred61 dans le forum Débuter
    Réponses: 4
    Dernier message: 10/08/2009, 18h14
  5. Calcul Matriciel en PL/SQL
    Par PpPool dans le forum PL/SQL
    Réponses: 4
    Dernier message: 02/02/2004, 11h11

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