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 :

gain de temps avec pthread


Sujet :

C

  1. #1
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut gain de temps avec pthread
    Bonjour à tous,

    C'est encore moi mais avec une autre question !!

    Toujours dans l'idée d'optimiser mon temps d’exécution, je me suis lancé dans le multi-threading.
    J'ai copié quasi point par point l'exemple qu'Emmanuel Delahaye avait publié sur ce forum (http://www.developpez.net/forums/d47.../posix-thread/).

    Tout compile bien et s’exécute sans problème. Les résultats sont bons. Mon seul problème c'est qu'avec et sans multi-threading, j'ai le même temps d’exécution !

    Auriez-vous quelques conseils à me donner pour trouver comment diminuer le temps de calcul ?

    Merci

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Tu gagneras du temps si les threads se répartissent sur plusieurs cœurs et/ou processeurs.

  3. #3
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Si tu travaille sur une matrice 3x3 tu ne verra pas grand chose, le cout de répartition sur les différents coeurs te coutera probablement à peu pres autant que le gain de calcul en parallélisation, sans compter que la charge généré par ton application étant faible il est probable que l'OS choisisse de tout faire sur un seul coeurs (donc de faire les traitement plus ou moins en série).

    Les gains s'observerons quand tes thread commenceront a travailer sérieursement et que le système les repartira sur les différents coeurs de ton processeur (que tu peux aussi choisir la répartition des thread sur les coeurs avec pthread_set_affinity si je me souviens)

    En gros sur un programme monothread ton appli ne pourra travailler que sur un seul coeur, alors qu'en multi-thread cela pourra se répartir sur les coeur et donc paralléliser les traitements. Si les traitement sont leger tu ne verra pas de gain (parfois même une perte), si les traitement sont lourd (beaucoup de calcul) alors tu commencera a voir une différence.

  4. #4
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Merci de ces réponses.

    Je me suis inspiré du code d'Emmanuel mais en l'appliquant sur des matrices 1400x1900 et en faisant des traitements plus compliqués qu'une multiplication matricielle !

    Comme pour le code d'origine, je décompose la matrice en autant de blocs de lignes que de threads. Mais j'ai l'impression que les threads sont exécutés séquentiellement. En effet, quand je fais un printf du numéro de ligne dans la fonction exécutée par le thread, je retrouve mes blocs de lignes, alors que s'il y avait exécution simultanée, il devrait y avoir des mélanges (par exemple, une ligne du bloc 1, puis une ligne du bloc 2, ...)

    Du coup, j'ai deux questions :
    1) comment puis-je vérifier si plusieurs cœurs ou processeurs sont utilisés ?
    2) comment puis-je forcer la répartition des threads sur les cœurs/processeurs ?

    Merci

  5. #5
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Tu travailles :

    • Sur quelle machine, équipée de quel microprocesseur ?
    • Avec quel système d'exploitation ?

  6. #6
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Ben oui, ça peu aider :
    OS : Linux 2.6.17-5mdv (mandriva 2007 official)
    Machine : 2 processeurs AMD Athlon 64 X2 Dual Core Processor 4400+
    donc 4 cœurs en tout

  7. #7
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Ton kernel est-il compilé en SMP?

  8. #8
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Ton kernel est-il compilé en SMP?
    Je n'en sais rien et je ne sais pas comment le savoir.

    Ceci dit, il s'agit de mon poste au bureau, je n'ai donc pas la main haute pour le recompiler comme je veux, quant à mon administrateur réseau ... il me demandera comment on fait ça depuis son poste winDaub !

  9. #9
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Salut,

    Citation Envoyé par corentin59 Voir le message
    Je n'en sais rien et je ne sais pas comment le savoir.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grep SMP /proc/sys/kernel/version
    et
    grep SMP /boot/config-*
    te diras si ton kernel a ete compile avec les options SMP et lesquels.

    Apres un kernel SMP peut tourner sur une machine avec un seul proc, donc tu dois savoir si ton proc supporte SMP aussi.

  10. #10
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep SMP /proc/sys/kernel/version
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1 SMP Wed Sep 13 14:28:02 EDT 2006
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep SMP /boot/config-*
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # CONFIG_X86_VSMP is not set
    CONFIG_SMP=y
    CONFIG_SUSPEND_SMP=y
    Comment dois-je interpréter ces résultats ?
    Ca sert à quoi "SMP" ? C'est une obligation pour faire du multithreading ?

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    http://www.blaess.fr/christophe/2011...par-des-mutex/
    Dans ce code, C.Blaess montre comment forcer les threads à s’exécuter sur un seul cœur. Tu dois pouvoir explorer les fonctions qu'il utilise pour voir comment forcer la répartition sur plusieurs cœurs.

  12. #12
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par Bktero Voir le message
    http://www.blaess.fr/christophe/2011...par-des-mutex/
    Dans ce code, C.Blaess montre comment forcer les threads à s’exécuter sur un seul cœur. Tu dois pouvoir explorer les fonctions qu'il utilise pour voir comment forcer la répartition sur plusieurs cœurs.
    pthread_setaffinity_np

    en general le mot clé dans google pour ça est CPU affinity...

  13. #13
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Hello,

    Citation Envoyé par corentin59 Voir le message
    Comme pour le code d'origine, je décompose la matrice en autant de blocs de lignes que de threads. Mais j'ai l'impression que les threads sont exécutés séquentiellement. En effet, quand je fais un printf du numéro de ligne dans la fonction exécutée par le thread, je retrouve mes blocs de lignes, alors que s'il y avait exécution simultanée, il devrait y avoir des mélanges (par exemple, une ligne du bloc 1, puis une ligne du bloc 2, ...)
    Oui, mais ce test n'est pas fiable. Il est tout-à-fait possible que la bibliothèque qui gère les tampons de la sortie standard accorde une concession d'un temps donné à un thread et/ou utilise un second buffer après celui visible par setbuf() justement pour gérer au mieux ces accès concurrents. C'est encore plus vrai si tes threads ne sont pas des processus légers partageant le même espace mémoire mais, en réalité, de véritables processus produits avec fork().

    Mais surtout : même si tu crées exactement le même nombre de threads que de cœurs, il n'est pas du tout certain que tes deux threads soient planifiés en même temps ! Chaque cœur peut se voir chargé, tout simplement, d'exécuter l'un des nombreux autres processus éligibles à l'exécution dans la liste, à commencer par le terminal censé afficher tes résultats.

    Citation Envoyé par corentin59 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep SMP /proc/sys/kernel/version
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #1 SMP Wed Sep 13 14:28:02 EDT 2006
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep SMP /boot/config-*
    donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    # CONFIG_X86_VSMP is not set
    CONFIG_SMP=y
    CONFIG_SUSPEND_SMP=y
    Comment dois-je interpréter ces résultats ?
    Ca sert à quoi "SMP" ? C'est une obligation pour faire du multithreading ?
    SMP signifie « Symmetric Multiprocessing » et se réfère au modèle d'architecture multi-processeur utilisé entre autres sur les architectures Intel et qui, dans les faits, consiste à former des paires de processeurs identiques et accédant au même matériel.

    Dans « CONFIG_SMP=y », « y » signifie « yes ». Le fichier en question n'est rien d'autre que le fichier des options de compilation du noyau (celui-là même que tu modifies avec make gconfig ou make xconfig). Le fait de le voir dans uname indique que ton noyau a été compilé pour prendre le SMP en charge.

    Jusqu'à une époque relativement récente, disons jusqu'au Pentium 4, tous les ordinateurs grand public étaient mono-cœur et ça fonctionnait très bien comme ça. Linux a très vite entamé la prise en charge des architectures multi-processeurs (et pas seulement les PC), mais y parvenir entièrement était un vrai chantier, pas une formalité. Donc, pendant très longtemps, cette option n'était pas activée par défaut et n'avait pas de raison de l'être.

    Quand c'eût été parfaitement au point, notamment parce qu'entretemps, le noyau a été considérablement réécrit, pour d'autres raisons mais en tenant compte de ce point, donc, le message d'aide de l'outil de configuration spécifiait qu'il était parfaitement safe de lancer un noyau SMP sur un mono-cœur, le seul impact étant une très légère latence, en principe imperceptible. Les distributions ont alors commencé à proposer en standard les deux noyaux compilés puis, très vite, à passer au SMP systématique.

    Aujourd'hui, tous les ordinateurs ou presque sont multi-cœurs. Il n'y a plus de raison de compiler encore le kernel en mono-cœur sauf cas très particulier, par exemple, lorsque tu fais une « vraie » machine virtuelle en partitionnant les ressources de ta machine et en faisant tourner les deux systèmes à la fois. C'est donc tout naturellement que le noyau de ta machine pourtant pas toute jeune est compilé en SMP.

    Enfin, pour répondre à ta question, il n'est pas nécessaire d'avoir un noyau SMP pour utiliser les threads, pas plus qu'il ne l'est pour créer plusieurs processus. Ils fonctionneront donc à tour de rôle sur le même cœur mais de façon transparente pour l'utilisateur et le développeur. Il l'est en revanche pour que le système exploite tous les cœurs à sa disposition.

  14. #14
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Merci beaucoup de toutes ces réponses.

    En fait, je sens que je vais me faire tapé dessus car le "problème" venait de la manière de mesurer le temps écoulé.

    Jusqu'à maintenant, j'utilisais la fonction clock qui mesure le temps CPU ! Mais, qu'on utilise un ou plusieurs cœurs, la charge CPU reste la même, c'est pourquoi j'avais toujours la même durée.

    Maintenant, en utilisant la fonction time, qui mesure bien le temps écoulé indépendamment de l'utilisation des cœurs, je passe bien de 12s à 7s avec le multithreading !

    Par contre, je subis les ralentissement liés autres applications qui tournent ! C'est pas facile de bien mesurer le temps !!!

  15. #15
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par corentin59 Voir le message
    Maintenant, en utilisant la fonction time, qui mesure bien le temps écoulé indépendamment de l'utilisation des cœurs, je passe bien de 12s à 7s avec le multithreading !
    Il y a aussi quelque chose dont il faut tenir compte : l'échelonnement de la fréquence des CPU : aujourd'hui, pour éviter de trop chauffer et consommer, les micro-processeurs fonctionnent généralement à basse fréquence et le système les fait progressivement monter en fonction de la charge.

    Par contre, je subis les ralentissement liés autres applications qui tournent ! C'est pas facile de bien mesurer le temps !!!
    Ça non, et c'est un problème récurrent. :-)

  16. #16
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Citation Envoyé par Bktero Voir le message
    http://www.blaess.fr/christophe/2011...par-des-mutex/
    Dans ce code, C.Blaess montre comment forcer les threads à s’exécuter sur un seul cœur. Tu dois pouvoir explorer les fonctions qu'il utilise pour voir comment forcer la répartition sur plusieurs cœurs.
    J'ai testé ces fonctions. Ca marche bien, sauf que ça permet de forcer l'utilisation de tel ou tel processeur mais pas de tel ou tel cœur.
    Ainsi, j'ai pu vérifier que les deux processeurs étaient bien utilisés mais impossible d'en savoir plus sur la répartition sur les cœurs.

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

Discussions similaires

  1. Pourquoi le temps d'exécution s'augmente avec pthread ?
    Par moktar_bouain dans le forum POSIX
    Réponses: 34
    Dernier message: 05/03/2013, 10h03
  2. mesurer le temps avec precision
    Par xantares dans le forum API, COM et SDKs
    Réponses: 4
    Dernier message: 11/03/2006, 11h22
  3. Comment lancer 2 serveur X en même temps avec Xorg ?
    Par narmataru dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 10/01/2006, 18h55
  4. Procédures stockées: un vrai gain de temps?
    Par 24 faubourg dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/01/2006, 11h15

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