|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
Chercheur en informatique Inscription : mars 2011 Messages : 19 ![]() |
Bonsoir à tous,
J'ai une question concernant la programmation pthread. J'ai réalisé une programme qui contient un seul thread dans la fonction main(). J'ai mesuré le temps d'exécution j'ai constaté que ce temps est augmenté de 60 % par rapport au programme original(séquentiel). Mais c'est pas logique ce résultat ?? Merci. |
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Julien Chef de projet R&D Inscription : mars 2007 Messages : 183 ![]() |
Salut Moktar,
Si je comprend bien, tu as pris les code qui était exécuté depuis ton main, tu l'as mis dans un thread et c'est tout. Dans ce cas, il est tout à fait logique que ton code s'exécute plus lentement. Il faut être conscient que l'utilisation d'un thread a un cout. Lorsque tu le démarre d'abord. Mais surtout, la machine va régulièrement passer de l'exécution d'un thread a un autre, ce qui implique plusieurs accès mémoire, avec empilement/dépilement sur la stack du contexte de chaque thread et branchement du pointeur ordinal. Les threads deviennent intéressants lorsque plusieurs opérations peuvent ou doivent se faire en parallèle. Dans ce cas, et notamment dans un contexte multiprocesseurs, tu auras des gains performances. Par exemple, les algorithmes diviser pour régner s'adaptent très bien aux threads. Les problèmes producer/consumer aussi. Note que le cout d'exécution de tes threads ne doit pas être supérieur au gain de la parallélisation. Tes problèmes doivent donc avoir une certaine taille. Un exo simple et rapide pour voir le gain apporté par un thread est de créer un tableau de booléens aléatoire et de compter les "true". D'un coté, tu fais un algo itératif bête et méchant. D'un autre coté tu fais un algo avec autant de threads que ton CPU a de cores. Compare les performances sur un tableau de 2 millions d'éléments et sur un de seulement 4 éléments. Sur le tableau de 2 millions l'algo threadé devrait gagner et sur celui de 4 il devrait perdre. A+ |
|
|
20
|
|
|
#3 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
djuju a raison : les threads coûtent car il faut passer d'un thread à l'autre, il y a le coût de démarrage des threads, etc.
Il faut aussi être conscient que mesurer le temps d'un petit programme puis le temps d'un autre petit programme n'est pas évident, surtout si petit signifie "faible temps d'exécution". Il y a plein d'autres programmes sans doute plus prioritaire sur ton PC au même moment, qui te dit que ce n'est pas ton OS qui a laissé ton programme threadé sur le carreau pour donner la main à un autre programme qui en avait plus besoin ? Il ne faut pas se baser sur un temps de mesure mais sur un ensemble de mesures et il faut que le temps d'exécution soit suffisamment long pour que les aléas du scheduling de l'OS soit gommé. Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Ca n'a rien à voir avec le fait que le système a à passer d'un thread à l'autre. Tu n'as qu'un thread, il n'y a donc pas de scheduling en plus.
Par contre, le fait de te linker avec la libpthreads va compiler ton code en mode thread-safe, et de nombreuses fonctions de la librairies standard auront en plus à prendre des locks qu'elles ne prennent pas en mode threadé. La différence de perfs vient de là. |
|
|
20
|
|
|
#5 |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Si tu crées, un thread cela en fait 2 avec le thread du main(), non ?
Sinon, une application si simple n'est pas franchement impactée par le scheduling, ma phrase se plaçait dans un contexte plus général de multi-threading.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
10
|
|
|
#6 | |||
|
Membre éprouvé
![]() Julien Chef de projet R&D Inscription : mars 2007 Messages : 183 ![]() |
Citation:
Anyway, le but ici n'est que de donner un exemple simple de gain de perf avec les threads. Quand on débute avec les threads, je pense qu'il vaut mieux ne pas trop entrer ces détails. Citation:
Citation:
Anyway, que l'overhead vienne du cout des threads, du mode thread-safe ou des 2, tu fais bien de soulever cet aspect, car c'est un point important => Compiler thread-safe a un cout. |
|||
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 296 ![]() |
Citation:
Le premier changement de contexte se ferra donc uniquement lors du pthread_exit. C'est le principe de l'utilisation des signaux dans un OS. Sinon on n'utiliserai pas de signaux mais un simple flag qu'on vérifierai à chaque ordonnancement. Pour moi ce temps vient de l'aspect thread-safe. Cela rajoute un bon nombre de delta non négligeables sur un bon nombre de fonctions. Et donc ce 60% ne me paraît pas bizarre.
__________________
|
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Ingénieur développement logiciels Inscription : octobre 2008 Messages : 1 482 ![]() |
Ah non ça c'est totalement faux par contre. Que le deuxième thread soit créé en mode attaché ou détaché ne change rien au scheduling ; dans tous les cas les deux threads s’exécutent en parallèle. La différence concerne seulement la terminaison du threads.
|
|
|
00
|
|
|
#9 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Citation:
Donc, sans voir le code, on ne pourra pas tirer de conclusions pertinentes… |
|
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 296 ![]() |
Citation:
Il n'est réveillé que sur réception de certains signaux en provenance de son thread lancé ou d'un process extérieur (chose assez rare sauf si vous l'avez explicitement programmé). On peut donc simplifier en disant que le main ne sera absolument pas ordonnancé (il restera endormi) jusqu'à l'envoi du signal par le thread lors du pthread_exit. A contrario avec un thread lancé en mode détaché, le main n'est pas endormi et donc poursuit son exécution. On a donc un ordonnancement de cette tâche. Et si on veut être pointilleux je devrai vous reprocher le fait d'appeler un main un thread car ce n'est absolument pas la même chose suivant l'OS. Sur certains OS le main sera identifié par l'id de process, tandis que sur d'autres OS il sera aussi identifié par un id de thread. Et on retrouve aussi d'autres OS qui fonctionnent par tâche et non par process/thread à l'ordonnancement.
__________________
|
|
|
|
00
|
|
|
#11 |
Chercheur en informatique Inscription : mars 2011 Messages : 19 ![]() |
Bonsoir à tous,
Merci pour vos réponse. Je travaille sur le code d'un codeur H.264, il est très long, ce pourquoi je l'ai pas postulé. Ci-joint une figure qui explique le programme séquentiel et parallèle. Donc c'est que j'ai fait ce de créer un thread "Encode_chroma_MB" qui sera traité en parallèle avec la fonction main(), alors j'ai un processus qui est la fonction main() et un thread. Le problème est que le temps d'exécution augmente avec plus de 60%. Donc j'ai essayé de faire un teste,calculer seulement le temps d'exécution de thread. J'ai trouvé que le temps augmente même si le corps de thread est vide, c'est dire aucune instructions exécutés dans le thread. C'est bizarre ,non ?? C'est à dire lorsque je mets pthread_create () dans mon programme cela me coute presque 78 ms !!!!! Merci, Moktar. |
|
|
00
|
|
|
#12 | |
|
Membre éprouvé
![]() Julien Chef de projet R&D Inscription : mars 2007 Messages : 183 ![]() |
Citation:
Par ailleurs, un thread endormi, que ce soit sur un wait, un lock, un join, un sleep ou autre sera quand même schedulé. Lorsqu'un thread "s’endort", il est sortie de sa queue de priorité sur du scheduler pour être mis dans la queue des threads endormis. Régulièrement, le schéduler va parcourir cette queue pour vérifier si certain ne sont pas signalés ou tombés en timeout. Si c'est le cas, le thread est sorti de la queue "dormante" pour être remis dans sa queue de priorité. Donc, même si l'overhead d'une telle attente est foncièrement inférieur qu'une attente active, il y a quand même scheduling. |
|
|
|
10
|
|
|
#13 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Citation:
Ensuite, pas de changement de contexte ne signifie pas forcément pas de temps utilisé par le scheduler pour voir s'il y a un changement de contexte à faire et ne pas le faire parce que le thread courant est toujours celui à exécuter. Et tout cela en ne raisonnant que sur les 2 threads du programme comme s'ils étaient seuls.
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#14 | |
Chercheur en informatique Inscription : mars 2011 Messages : 19 ![]() |
Citation:
Comme je vous dis, la création d'un thread (sans aucune instruction dedans) coute 78 ms !! |
|
|
|
00
|
|
|
#15 |
|
Membre expérimenté
![]() Inscription : octobre 2004 Messages : 329 ![]() |
La création d'un thread ça implique un appel système et du temps pour créer les structures pour l'OS, c'est pas "gratuit".
|
|
|
00
|
|
|
#16 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Citation:
Dans un contexte multi-threadé sur PC, il faut quand même être conscient que des 2 threads ne sont pas tous seuls à se battre pour un coeur de CPU. Tu as d'autres threads, c'est au final assez compliqué de suivre le flow d'exécution. Prenons un cas simple : ton programme et 3 autres threads (T1, T2, T3). Je ne vois pas ce qui empêcherait les 2 scénarios suivants (certes schématiques), d'autres intervenants diront ce qu'ils en pensent :
Au passage, comment as-tu fait pour arriver à cette valeur ? C'est une moyenne ? C'est une mesure unique ?
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#17 | |||
Chercheur en informatique Inscription : mars 2011 Messages : 19 ![]() |
Citation:
Citation:
Citation:
Merci, Moktar. |
|||
|
|
00
|
|
|
#18 | |
|
Expert Confirmé Sénior
![]() ![]() Ingénieur systèmes embarqués Inscription : juin 2009 Messages : 1 708 ![]() |
Citation:
__________________
Si Code::Blocks vous dit undefined reference to 'socket@12', cela signifie que vous avez un problème d'édition des liens. Allez dans Projects / Build Options / Linker Settings / Add et renseigner ici les .a qui vont bien. Exemple pour les sockets : C:\Program Files\CodeBlocks\MinGW\lib\libws2_32.a Pour les adeptes du langage SMS, allez ici et ramenez la traduction française ^^ Pour vos problèmes d'embarqué, utilisez le forum dédié ! |
|
|
00
|
|
|
#19 |
Chercheur en informatique Inscription : mars 2011 Messages : 19 ![]() |
|
|
|
00
|
|
|
#20 |
|
Membre expérimenté
![]() Inscription : octobre 2004 Messages : 329 ![]() |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com