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 :

temps de calcul ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 75
    Par défaut temps de calcul ?
    Bonjour tous,

    j'ai un code C++ qui est très bien mais qui prend beaucoup de temps,
    j'aimerai savoir où il passe du temps es ce que ceci est possible ?
    (je suis débutant)

    Sinon, avez vous quelques conseille pour gagner du temps de calcul informatiquement parlant ?

    1) par exemple je fais toujours des boucles "for i=1..." et une fois quelqu'un m'a dit d''utiliser "BOOST" or je ne l'ai jamais fait car je ne sais pas comment ça marche... es ce vraiment utile ?

    2) Dans mon programme j'écris aussi pas mal de fichier texte, es ce qu'il y a une astuce là aussi pour gagner du temps ?
    Moi en général à chaque itération de mon programme j'ouvre un fichier, j'écris dedans et je le referme. Peux etre que je devrais l'ouvrir et ne le refermer qu'à la fin de tout les calculs ?

    3) j'ai entendu parlé de parallélisation mais ça me sembe un peu compliqué, auriez vous des conseils pour débuter dans ce domaine ? que faut il utiliser ? j'ai cru comprendre que MPI c'etait tres bien ???

    merci grandement pour l'aide que vous pourrez m'apporter !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Citation Envoyé par thomMonteillet Voir le message
    Bonjour tous,

    j'ai un code C++ qui est très bien mais qui prend beaucoup de temps,
    j'aimerai savoir où il passe du temps es ce que ceci est possible ?
    (je suis débutant)
    Oui, on appelle ça du profiling. Voir gprof, cachegrind, intel Vtune (payant) par exemple.

    1) par exemple je fais toujours des boucles "for i=1..." et une fois quelqu'un m'a dit d''utiliser "BOOST" or je ne l'ai jamais fait car je ne sais pas comment ça marche... es ce vraiment utile ?
    Boost n'a rien à voir avec le fait de faire des boucles sur des entiers. Ce serait long d'expliquer ce qu'est Boost, comment par lire la page wikipedia ou la doc de Boost.

    2) Dans mon programme j'écris aussi pas mal de fichier texte, es ce qu'il y a une astuce là aussi pour gagner du temps ?
    Moi en général à chaque itération de mon programme j'ouvre un fichier, j'écris dedans et je le referme. Peux etre que je devrais l'ouvrir et ne le refermer qu'à la fin de tout les calculs ?
    Oui il faut éviter d'ouvrir/fermer, mais également éviter d'écrire autant que possible. Si tu n'a pas grand chose à écrire, peut-être que tu peux tout garder en mémoire pendant plusieurs itérations et écrire de temps en temps seulement.

    3) j'ai entendu parlé de parallélisation mais ça me sembe un peu compliqué, auriez vous des conseils pour débuter dans ce domaine ? que faut il utiliser ? j'ai cru comprendre que MPI c'etait tres bien ???
    Il y a tellement de choses à faire avant de paralléliser, c'est vraiment la dernière chose que tu veux faire !
    MPI est utilisé pour distribuer les données, en général sur un cluster de plusieurs machines. Pour exploiter un processeur multi-coeurs, on peut faire de l'OpenMP par exemple, ou du TBB, etc.
    Ne pas oublier la vectorisation également...

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 75
    Par défaut
    merci énormement de prendre le temps de m'aider!!!

    Citation Envoyé par Joker-eph Voir le message
    Oui, on appelle ça du profiling. Voir gprof, cachegrind, intel Vtune (payant) par exemple.
    OK, je vais regarder. Es ce facile à utiliser pour un débutant ? es ce qu'il y a des choses qui sont dépendante de l'IDE ? moi j'utilise souvent Qt ou codeBlock...


    Citation Envoyé par Joker-eph Voir le message
    Boost n'a rien à voir avec le fait de faire des boucles sur des entiers. Ce serait long d'expliquer ce qu'est Boost, comment par lire la page wikipedia ou la doc de Boost.
    ah ok, j'avais cru comprendre que dans boost il y a des trucs qui s'appel "itérateurs" et que soit disant ça ferait gagner pas mal de temps si on met ceci dans toutes les boucles....

    Citation Envoyé par Joker-eph Voir le message
    Oui il faut éviter d'ouvrir/fermer, mais également éviter d'écrire autant que possible. Si tu n'a pas grand chose à écrire, peut-être que tu peux tout garder en mémoire pendant plusieurs itérations et écrire de temps en temps seulement.
    ah oui c'est une bonne idée !

    Citation Envoyé par Joker-eph Voir le message
    Il y a tellement de choses à faire avant de paralléliser, c'est vraiment la dernière chose que tu veux faire !
    MPI est utilisé pour distribuer les données, en général sur un cluster de plusieurs machines. Pour exploiter un processeur multi-coeurs, on peut faire de l'OpenMP par exemple, ou du TBB, etc.
    Ne pas oublier la vectorisation également...
    - en fait j'ai parlé de ceci car j'ai des taches qui se font totalement indépemment l'une de l'autre.
    - du coup je me suis dis vu que mes taches sont compléments découplées si je pouvais les lancer sur trois PC mon programme irait 3fois plus vite ?

    au fait qu'appel tu vectorisation ?

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Oublie tes points 1, 2 et 3 et concentre toi sur le profiling pour commencer. C'est ça qui va t'indiquer les améliorations à apporter, toutes autres amélioration "a priori" risque d'être une perte de temps car non adapté à ton programme

    vectorisation : utilisation des instructions de calcul parallèle CPU (SSE)

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 75
    Par défaut
    d'accord, merci.

    Profiler:
    quel est le profiler que vous me conseillerez ? avez vous un tuto qui explique comment s'en servir ?

    Parallélisation:
    par contre je suis certain que la parallélisation va me faire gagner du temps car voici comment mon code fonctionne :

    - j'ai un objet "A" à qui on fourni à travers la méthode "input" un vecteur
    - en sortie cet objet "A" à travers la méthode "output" me donne une matrice "B"
    - et je peux avoir environ 80000 objets "A" différents. ce que je fais pour le moment c'est une boucle: pour le premier objet je fais le calcul, une fois fini je fais le calcul avec le 2eme objet, une fois fini avec le troisième...etc
    - si je fais les choses en parallèle il est clair que je vais gagner du temps vu que mes objets sont totalement indépendants

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    On peut déjà te donner quelques astuces cependant:

    Essayes de passer tous les arguments qui ne sont pas des type primitifs par référence (éventuellement constante si la fonction qui les prend ne doit pas les modifier) et non par valeur: cela t'évitera bien des copies inutiles, et t'apportera sans doute un gain énorme tant en terme de temps d'exécution qu'en terme d'utilisation de mémoire.

    Essayes de limiter au maximum les accès en lecture ou en écriture à des fichiers: les disques durs ont, vraiment, des performances catastrophiques comparé à la RAM, sans oublier qu'il faut fatalement un certain temps pour accéder aux endroits où se trouvent les fichiers sur le disque dur (déplacement des tête de lecture, fin du tour pour accéder à l'endroit exact, etc)

    Vérifie tes algorithmes, il est souvent "facile" de gagner en performances en évitant d'entrer dans une boucle ou en faisant les choses "dans le bon ordre" (mais le profiling te dira surement où il est intéressant de revoir l'algorithme ) et quand tu crois avoir fini, revérifie les

    Pour ce qui est du profiling, cela dépend énormément des outils que tu utilises:

    La chaine de compilation Gcc vient, par exemple, avec un programme nommé gprof qui sert souvent de base au profiling, alors que certains outils sont prévus pour fonctionner avec Visual Studio et d'autres encore avec d'autres chaine d'outils
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2004
    Messages : 329
    Par défaut
    Citation Envoyé par thomMonteillet Voir le message
    - j'ai un objet "A" à qui on fourni à travers la méthode "input" un vecteur
    - en sortie cet objet "A" à travers la méthode "output" me donne une matrice "B"
    - et je peux avoir environ 80000 objets "A" différents. ce que je fais pour le moment c'est une boucle: pour le premier objet je fais le calcul, une fois fini je fais le calcul avec le 2eme objet, une fois fini avec le troisième...etc
    - si je fais les choses en parallèle il est clair que je vais gagner du temps vu que mes objets sont totalement indépendants
    OpenMP pour ta boucle sur les 80000 objets (gros grain), et SSE/AVX/Whatever pour les traitement à l'intérieur des objets (grain fin).
    Encore une fois, c'est à la fin...

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Citation Envoyé par thomMonteillet Voir le message
    par contre je suis certain que la parallélisation va me faire gagner du temps car voici comment mon code fonctionne :

    - j'ai un objet "A" à qui on fourni à travers la méthode "input" un vecteur
    - en sortie cet objet "A" à travers la méthode "output" me donne une matrice "B"
    - et je peux avoir environ 80000 objets "A" différents. ce que je fais pour le moment c'est une boucle: pour le premier objet je fais le calcul, une fois fini je fais le calcul avec le 2eme objet, une fois fini avec le troisième...etc
    - si je fais les choses en parallèle il est clair que je vais gagner du temps vu que mes objets sont totalement indépendants
    Ce n'est pas si évident que tu gagnes du temps : Si à l'intérieur de ton traitement, tu accèdes à une ressource partagée, par exemple le disque dur, il y a des chances que si tu parallélises, tout le temps soit passé à attendre cette ressource. Un cas plus courant der essource partagée pouvant insidieusement plomber les performances en parallèle est la mémoire cache.

    Ensuite, tu ne gagneras pas plus de temps que le nombre de processeurs de ta machine. Ce qui peut te sembler très bien (et l'est probablement), mais n'a d'intérêt que si à la base tu pars de code qui est déjà raisonnablement optimal. Si tes algorithmes sont mauvais, les remplacer peut provoquer des gains très importants (j'ai déjà gagnée des *1000 pour 1h de travail...) et d'autant plus importants que ton volume de données est grand. Ensuite, travailler en gérant bien la mémoire cache/la mémoire/le disque peut aussi avoir des impacts importants, minimiser le nombre d'allocations mémoire aussi.

    Une fois que ce sera fait, il sera temps de regarder la parallélisation, qui est plus complexe à mettre en place, et qui en plus a besoin des améliorations citées au dessus pour pouvoir vraiment être rentable.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

Discussions similaires

  1. temps de calcul RSA
    Par othland dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 13/03/2006, 11h16
  2. Temps de calcul d'un algo
    Par Rémiz dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 23/12/2005, 13h52
  3. temps de calcul sius VC++ !!
    Par Axiome dans le forum MFC
    Réponses: 16
    Dernier message: 13/12/2005, 09h57
  4. Temps de calcul avec deux écrans
    Par Shaga dans le forum OpenGL
    Réponses: 2
    Dernier message: 14/11/2005, 09h24
  5. temps de calculs extremement long !!
    Par salseropom dans le forum C++
    Réponses: 9
    Dernier message: 19/01/2005, 20h12

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