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

Threads & Processus C++ Discussion :

[std::thread] Algorithme plus lent que en simple thread


Sujet :

Threads & Processus C++

Vue hybride

Trademark [std::thread] Algorithme plus... 11/04/2013, 19h42
imperio Créer un thread est plutôt... 12/04/2013, 08h22
Emmanuel Deloget Combien est-ce qu'il y a de... 12/04/2013, 08h38
Trademark Salut, Non créer les... 12/04/2013, 08h39
JolyLoic Vu que tout ce que tu fais à... 12/04/2013, 09h10
Emmanuel Deloget (En supposant, bien sûr, que... 12/04/2013, 09h43
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut [std::thread] Algorithme plus lent que en simple thread
    Bonjour à tous,

    J'ai multithreadé un code, et j'ai des résultats horribles, je ne suis pas expert mais je suspecte les threads qui se vident le cache entre eux. Voici l'algo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for (int y=y_begin; y<y_end; ++y)
    {  
          for (unsigned short x=0; x<w; x++)
          {
            int i=(h-y-1)*w+x;
            // Traitements (peuvent être plus ou moins long
            data[i] = data[i] + /* code */;
           }
    }
    Et j'appelle les threads de cette façon :

    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
        std::vector<Vector> data;
        data.resize(w*h); // Taille par exemple w = 256, h = 196
        int yb = 0;
        int ye = 0;
        std::vector<std::thread> threads(thread-1);
        for(int i=0; i < thread-1; ++i)
        {
          ye += h/thread;
          threads[i] = std::thread(ThreadFunction(), std::ref(data), yb, ye);
          yb = ye;
        }
        ThreadFunction()(data, yb, h);
     
        for(size_t i=0; i < threads.size(); ++i)
        {
          threads[i].join();
        }
    En le lançant avec time j'ai ces résultats :

    real 0m10.309s
    user 0m13.633s
    sys 0m21.829s

    (coupé avant la fin)

    Alors que en single thread j'ai quasi 0 en sys. Je suppose que c'est à cause de nombreux changements de contexte ?

    Et finalement pour donner un ordre de grandeur, sur mon processeur 4 coeurs, je met 20 secondes avec un thread et 3 minutes avec 4…

    Quelles sont les causes possibles ?

    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 869
    Par défaut
    Créer un thread est plutôt lourd mais pas à ce point ! T'as pas des mutex qui traîneraient quelque part ?

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Par défaut
    Combien est-ce qu'il y a de threads ?
    [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.

  4. #4
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    Salut,

    Non créer les threads ce n'est pas ça qui prend du temps. Et je n'ai pas de mutex car ils accèdent à des endroits différents de la mémoire partagée.

    J'ai fait des tests avec 1, 2 et 4 threads, dès qu'il y a plus d'un thread c'est la folie.

    Voici quelques résultats :

    1 thread :

    real 4m11.922s
    user 4m11.052s
    sys 0m0.064s


    2 threads :

    real 4m30.792s
    user 6m27.484s
    sys 1m54.035s

    4 threads :

    real 6m56.838s
    user 9m24.187s
    sys 13m21.746s

  5. #5
    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
    Vu que tout ce que tu fais à data, c'est de lui ajouter des valeurs, est-ce que tu as essayé de travailler dans un espace mémoire local, puis à la fin de ton travail, ajouter cet espace mémoire à data, de façon à minimiser les accès à cet emplacement mémoire ?
    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.

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Par défaut
    (En supposant, bien sûr, que tu utilises Linux)

    Est-ce que tu peux essayer d'utiliser perf ? J'aimerais bien savoir ou ce temps est perdu dans le kernel (je suppose que c'est le scheduler, et probablement la gestion de migration des threads).

    Autre chose, la version de Linux que tu utilises - uname -a. Une info sur ton hardware (nombre de coeurs...) serait aussi intéressante.

    Je doute que ce soit véritablement un problème de cache (même s'il est possible que la gestion du cache soit un peu plus lente, du fait de l'organisation de ton code ; il est souvent préférable de faire le travail sur de la mémoire locale pour éviter ce problème). Je penche plus pour le bug de migration de thread qui a été corrigé récemment (dans le kernel 3.9 ?), et qui fait que les threads passent leur temps à être migrés d'un coeur à l'autre sans raison. Est-ce que tu pourrais tester avec d'autres versions de Linux ?
    [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.

  7. #7
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    @JolyLoic : je viens d'essayer et ça ne change strictement rien aux temps (même un peu plus lent du aux copies…).

    @Emmanuel :

    uname -a : Linux trademark-machina 3.5.0-27-generic #46-Ubuntu SMP Mon Mar 25 19:58:17 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

    J'ai un AMD Phenom II à quatre coeurs.

    En ce qui concerne perf, voici les résultats avec 2 threads :

    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
    perf stat ./a.out 
    Performance counter stats for './a.out':
     
          97295.433950 task-clock                #    1.657 CPUs utilized          
             3,537,466 context-switches          #    0.036 M/sec                  
                 1,380 CPU-migrations            #    0.014 K/sec                  
                   698 page-faults               #    0.007 K/sec                  
       304,803,885,309 cycles                    #    3.133 GHz                     [50.01%]
        20,705,360,598 stalled-cycles-frontend   #    6.79% frontend cycles idle    [50.06%]
       162,879,758,647 stalled-cycles-backend    #   53.44% backend  cycles idle    [50.07%]
       208,827,475,073 instructions              #    0.69  insns per cycle        
                                                 #    0.78  stalled cycles per insn [50.00%]
        32,542,377,972 branches                  #  334.470 M/sec                   [49.95%]
         1,551,477,017 branch-misses             #    4.77% of all branches         [49.94%]
     
          58.700255741 seconds time elapsed
    Et avec 4 threads :

    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
     perf stat ./a.out 
     Performance counter stats for './a.out':
     
         251699.537773 task-clock                #    2.936 CPUs utilized          
            13,062,016 context-switches          #    0.052 M/sec                  
                19,055 CPU-migrations            #    0.076 K/sec                  
                   711 page-faults               #    0.003 K/sec                  
       780,541,320,480 cycles                    #    3.101 GHz                     [50.05%]
        43,865,126,625 stalled-cycles-frontend   #    5.62% frontend cycles idle    [49.83%]
       345,774,964,937 stalled-cycles-backend    #   44.30% backend  cycles idle    [49.98%]
       577,614,476,815 instructions              #    0.74  insns per cycle        
                                                 #    0.60  stalled cycles per insn [49.96%]
       118,773,519,774 branches                  #  471.886 M/sec                   [50.18%]
         2,561,552,532 branch-misses             #    2.16% of all branches         [50.02%]
     
          85.730728523 seconds time elapsed
    Je n'ai pas d'autre machine à disposition malheureusement. Je vais quand même demander à d'autres personnes de tester sur leur machine.

    Merci pour l'aide ;-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 76
    Dernier message: 29/03/2011, 16h15
  2. [MFC] Threads plus lent que process
    Par goestrip dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 25/02/2010, 16h18
  3. [Système] Mozilla plus lent que IE
    Par Halleck dans le forum Langage
    Réponses: 6
    Dernier message: 22/06/2005, 17h26
  4. [Firebird][Optimisation]Plus lent que le BDE!
    Par vincentj dans le forum Débuter
    Réponses: 3
    Dernier message: 07/02/2005, 15h48
  5. DBExpress est plus lent que BDE?
    Par palassou dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/07/2004, 08h39

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