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 :

Benchmark sur processeur multi-core


Sujet :

C++

  1. #61
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ok, effectivement on dirait qu'OpenMP est bien activé. Bizarre...

  2. #62
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    flute j'avais loupe l'init du t0

    en corrigeant tous ca j'obtiens:

    number max of threads:4
    C =10000000: 1.094s
    OpenMP=10000000: 0.625s
    STL =10000000: 0.625s

  3. #63
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    a priori un benchmark comme cela ne montre pas vraiment la superiorité du MT...
    il faut charger la mule pour le voir...
    juste en mettant: sum+=cos(X[j]/(double)i);
    j'obtiens:

    C =0: 37.813s
    OpenMP=0: 15.25s

    et en STL ?

  4. #64
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Le mystère est (en bonne partie) résolu.

    J'ai l'impression que c'est à cause d'une histoire de fonctions non inlinées correctement. Ce qui corrobore ma première impression sur OpenMP sur le fait que c'est trop "C" et pas assez "C++".

    En utilisant un pointeur plutôt qu'un std::vector j'obtiens les résultats suivant.
    C++ : 0.797s
    OpenMP: 0.61s
    STL : 0.765s
    (Ma lib: 0.532s)

    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
    #include <vector>
    #include <numeric>
    #include <iostream>
    #include <ctime>
    #include <omp.h>
    using namespace std;
     
    inline double get_time() { return double(clock())/CLOCKS_PER_SEC; }
     
    int main()
    {
      typedef int value_type;
      vector<value_type> X(10000000,1);
      value_type *pX=&X[0];
     
      double t0=0;
      value_type *psum = new value_type; // alloué dynamiquement pour tromper l'optimisation d'ICL
     
      t0=get_time();
      for (int i=0; i<50; ++i)
      {
        value_type sum=0;
        int imax=X.size();
        for (int i=0; i<imax; ++i)
          sum+=pX[i];
        *psum=sum;  
      }
      cout << "C     =" << *psum << ": " << get_time()-t0 << "s" << endl;
     
      t0=get_time();
      for (int j=0; j<50; ++j)
      {
        value_type sum=0;
        int imax=X.size();
        //#pragma omp parallel for schedule(static) reduction(+:sum)
        #pragma omp parallel for schedule(dynamic,100000) reduction(+:sum)
        for (int i=0; i<imax; ++i)
          sum+=pX[i];
        *psum=sum;  
      }
      cout << "OpenMP=" << *psum << ": " << get_time()-t0 << "s" << endl;
     
      t0=get_time();
      for (int i=0; i<50; ++i)
        *psum=accumulate(X.begin(),X.end(),0);
      cout << "STL   =" << *psum << ": " << get_time()-t0 << "s" << endl;
    }

  5. #65
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    il faudrait vraiment faire plus qu'une addition dans cette boucle ...
    une expression mathematique ? un cos tan etc..

  6. #66
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    pourquoi pas, mais le hic c'est que ça ne serait plus vraiment comparable avec l'un des très peu nombreux algos mathématiques de la STL. Peut-être un produit scalaire (inner_product).

    Quoiqu'il en soit je pourrai bientôt reposter un nouveau bench FFT.

  7. #67
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ... j'attends tres impatiemment le nouveau bench ....

  8. #68
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    Résultats de cpuid :

    Citation Envoyé par cpuid
    name Intel(R) Pentium(R) 4 CPU 3.00GHz
    vendor GenuineIntel
    intel 1
    amd 0

    mmx 1
    sse 1
    sse2 1
    sse3 1
    3dnow 0

    L1 cache 1048576
    L2 cache 1

    processors 2
    logical cores 2
    physical cores 1
    Résultats de CPU-Z : <piece jointe>

    Résultats des benchs sur un Intel x2 : <pieces jointes>

    Benchmark FFT 64 SSE2.txt
    Benchmark FFT 64 SSE2 MT2.txt
    Benchmark FFT 64 SSE2 OpenMP2.txt
    Fichiers attachés Fichiers attachés
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  9. #69
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    Citation Envoyé par Charlemagne
    pourquoi pas, mais le hic c'est que ça ne serait plus vraiment comparable avec l'un des très peu nombreux algos mathématiques de la STL. Peut-être un produit scalaire (inner_product).
    je ne pense pas que l'addition soit representatif pour un benchmark. Regarde le mien quand j'ai utilisé un cos ... OpenMP etait plus de 2 fois plus rapide...

    ... j'adore OpenMP

  10. #70
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Merci mchk0123
    C'est vraiment 2 processeurs P4 HT ????!!! C'est bizarre parce que mon programme ainsi qu'OpenMP ne reconnaissent qu'un seul processeur. CPUZ ne semble pas faire mention d'un 2ème processeur également.
    Et comme l'hyper-threading n'apporte malheureusement rien à ma FFT, c'est pas meilleur que le single-thread.

    Citation Envoyé par epsilon68
    je ne pense pas que l'addition soit representatif pour un benchmark. Regarde le mien quand j'ai utilisé un cos ... OpenMP etait plus de 2 fois plus rapide...
    ok c'est normal tu fais moins appel aux accès mémoires et donc tu te rapproches du gain théorique de x2.
    Finalement le seul benchmark qui compte, c'est celui du programme qui répond au problème propre à chacun.


    Je travaille encore sur ma FFT, les prochains benchs ne sont pas encore près...
    (Faut dire qu'au départ je n'avais pas prévu les comparer avec OpenMP)

  11. #71
    Membre éclairé Avatar de mchk0123
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    816
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 816
    Points : 844
    Points
    844
    Par défaut
    @Charlemagne, je pensais vraiment que c'était un bi-core car j'ai une double courbe sur le gestionnaire de tâches et l'exe systeminfo me donne les résultats suivants :

    Nom : TaskManager.png
Affichages : 53
Taille : 30,6 Ko
    systeminfo.txt

    En revanche CPU-Z et cpuid, comme tu l'as dit, ne semblent détecter qu'un seul core ... Qui est dans le vrai ?
    Avant de poster un message .
    Quand vous avez la réponse à votre question, n'oubliez pas de cliquer sur .

  12. #72
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    c'est l'hyperthreading si je ne m'abuse...

  13. #73
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Je confirme c'est l'hyper-threading, moi aussi j'ai 2 courbes dans le gestionnaire de tâches.
    (je suis rassuré, mon programme fonctionne!)

    Voici le nouveau bench (comme avant il suffit d'exécuter le fichier '.bat' et de me rendre les 3 fichiers textes) Merci d'avance.
    http://www.ient.rwth-aachen.de/team/...ads/Benchs.zip

    J'ai pas réussi à rendre le coût de synchronisation négligeable, et donc les perfs pour les petites matrices sont de l'ordre de 10-20% moins bonnes par rapport au single-thread. Mais en tout cas mon implémentation s'en sort beaucoup mieux qu'OpenMP malgré sa clause 'if' (pour dire en deçà de quelle valeur il n'y a pas de multi-threading) qui l'améliore mais pas suffisamment.

    J'espère que c'est le dernier bench pour les matrices complexes, mais attendez vous en tout cas à un bench pour la généralisation du multi-threading aux matrices réelles.

  14. #74
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    voila...

  15. #75
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    ca me surprend quand meme drolement que OpenMP est plus lent que ta solution ... ca peut pas venir d'autre chose ?

  16. #76
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Y'a un problème auquel j'avais pas pensé.
    En fait j'avais demandé à mon programme de ne pas tenir compte de l'hyper-threading (pas efficace pour ma FFT), donc il ne crée que 2 threads (et non 4 comme OpenMP) sur ton 2x Xeon HT.
    Le problème c'est que mon programme multi-thread n'est pas plus rapide que le single-thread de référence. Je suppose donc que le 2ème thread a été affecté à un CPU "virtuel". C'était pas le cas dans ton bench précédent, j'imagine que c'est une question de "chance".
    En bref: l'hyper-threading c'est ici la merde. Je ne vois pas quoi faire pour imposer un thread à un processeur précis.

    Voici un bench qui tiendra compte de l'hyper-threading (seul le programme Benchmark_FFT_64_SSE2_MT.exe a changé, pas la peine pour Epsilon68 d'exécuter les autres)
    http://www.ient.rwth-aachen.de/team/...ads/Benchs.zip

    Citation Envoyé par epsilon68
    ca me surprend quand meme drolement que OpenMP est plus lent que ta solution ... ca peut pas venir d'autre chose ?
    Pour les petites matrices tu veux dire? (car pour les grandes à cause du problème ci-dessus c'est pas le cas).
    je sais en tout cas que j'ai eu du mal a réduire le temps de synchonisation sur mon implémentation. Essaye d'en juger par toi-même pour OpenMP dans les fonctions parrallel_for et parallel_reduce à la fin de ce fichier. Je vois pas comment faire mieux.

  17. #77
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    A la réflexion je ne vois rien à faire pour améliorer cette "latence" d'OpenMP pour les petites matrices.
    Tu te rappelles de mon premier bench FFT avec OpenMP? J'avais mentionné que c'était vite fait bien fait: j'avais parallélisé les 2-3 boucles directement dans mon implémentation de la FFT, alors que les benchmarks actuels utilisent la fonction parallel_for réécrite avec OpenMP.
    Eh bien, j'avais déjà remarqué ce temps de latence prééminent pour OpenMP.
    La clause 'if' permet de rattraper ce retard en partie mais pas assez pour rendre l'utilisation d'OpenMP transparente sur des petites boucles.

    PS: En tout cas sur l'implémentation d'OpenMP que j'utilise

  18. #78
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    voila:

  19. #79
    Membre expérimenté
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 354
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 354
    Points : 1 419
    Points
    1 419
    Par défaut
    j'ai un doute sur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #pragma omp parallel if (nchunks>1) firstprivate(func)
      {
        #pragma omp for schedule(dynamic,1)
        for (int i=0; i<nchunks; ++i)
        {
          int d=i*grain;
          RanIt it=begin+d;
          func(it,it+__min(n-d,grain));
        }
        #pragma omp critical
        f.join(func);
      }
    je ne comprends pas le schedule(dynamic,1)
    et je l'aurais surement ecrit en boucle for normal.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #pragma omp for
    for( i=0; i<end-begin; i++)
    j'aurais au préalable declaré un tableau de taille avec le max processor
    puis j'aurais appliquer le reduce sur ce nombre d'element (sans openmp donc).
    Qu'en penses-tu ?

    il faut que je creuse plus ton code de toute facon, c'est tres interessant.

  20. #80
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Merci, les benchs sont meilleurs.
    Mais j'arrive pas à avoir des gains en multi-threading faramineux sur ton 2x Xeon HT, OpenMP non plus d'ailleurs. J'obtiens des gains de l'ordre de x1.2 à x1.4 pour les matrices de grande taille. Ca varie mais ma librairie se tient dans les mêmes eaux qu'OpenMP.


    Il faudrait que quelqu'un fasse le dernier bench (pour rappel http://www.ient.rwth-aachen.de/team/...ads/Benchs.zip) sur un CPU multi-core pour que je me fasse une opinion sur ce style de processeurs.
    Avis aux volontaires: HanLee, Laurent...?

    Citation Envoyé par epsilon68
    je ne comprends pas le schedule(dynamic,1)
    et je l'aurais surement ecrit en boucle for normal.
    Je me doutais que t'allais poser la question. La fonction-objet passée en paramètre prend un intervalle en paramètre (avec 2 itérateurs), donc que le découpage vu par OpenMP soit de 1 n'est pas génant.
    J'avais certes pensé à changer la syntaxe de la fonction-objet pour qu'elle ne prenne qu'un paramètre:
    -mais il aurait fallu changer les appels à parallel_for dans ma librairie
    -je ne veux pas renoncer à une programmation dans le style de la STL avec des itérateurs
    Pour l'instant je ne vois pas meilleur compromis, et je t'assure que ça n'a pas d'incidence sur la vitesse (j'ai comparé avec la FFT "vite fait bien fait" avec OpenMP)

    Citation Envoyé par epsilon68
    j'aurais au préalable declaré un tableau de taille avec le max processor
    puis j'aurais appliquer le reduce sur ce nombre d'element (sans openmp donc).
    Qu'en penses-tu ?
    Je crois pas car il faut absolument que la réduction soit faite dans une section critique à cause de la modification d'une variable partagée. Avec ma syntaxe je ne peux/veux pas imposer les mêmes restrictions qu'OpenMP aux réductions (opérations atomiques). Et si je renonce d'une manière ou d'une autre à utiliser OpenMP, il faut que j'utilise les mutex de ma librairie (ce qui n'a plus de sens si on s'impose l'utilisation d'OpenMP).

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

Discussions similaires

  1. Les processeurs multi-cores pourraient gagner en performances
    Par Katleen Erna dans le forum Hardware
    Réponses: 0
    Dernier message: 01/02/2011, 18h44
  2. Optimiser l'utilisation d'un processeur multi-core
    Par photorelief dans le forum Modules
    Réponses: 11
    Dernier message: 11/04/2010, 21h28
  3. petite question sur le multi core
    Par vmfa-2 sven dans le forum Composants
    Réponses: 4
    Dernier message: 23/05/2008, 14h51
  4. Réponses: 268
    Dernier message: 07/11/2007, 11h11
  5. Réponses: 5
    Dernier message: 14/04/2007, 14h12

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