THREAD:
Terme se rapportant au fonctionnement d'un processeur quel que soit son modèle ou sa technologie.
__________________________________________________ _______________
MUTLI-THREADING:
Voir plus sur cette page, il est toutefois conseillé de commencer la lecture ici !
__________________________________________________ _______________
HYPER-THREADING:
Voir plus sur cette page, il est toutefois conseillé de commencer la lecture ici !
__________________________________________________ _______________
Tous les programmeurs sont familliers avec l'écriture de programmes "sequentiels". Vous avez sûrement écrit, un jour, un programme qui affichait "Bonjour !" ou un programme qui triait une liste de nom ou encore un autre qui donnait la liste des nombres premiers.Ceux sont des programmes "sequentiels", avec un début, un séquence d'éxécution et une fin. A n'importe quel moment du programme, il n'y a qu'un seul point d'éxécution, qu'une seule instruction à éxécuter.
Un "thread" est similaire à un programme séquentiel décrit ci-dessus, un "thread" unique possède un début, une séquence d'éxécution et une fin; à chaque instant de d'éxécution d'un "thread", il n'y a qu'une seule instruction à éxécuter. Toutefois, un "thread" n'est pas un programme à part entière, il ne peut pas s'éxécuter tout seul mais uniquement avec un programme.
DEFINITION: Un thread est une lot d'instructions sequentielles contrôlé par un programme.
SYNONYMES: On trouve parfois dans certains articles se rapportant à la programmation système, ces termes: "lightweight process" ou encore "execution context"; Ce dernier terme étant très spécifique à la programmation système ( C++ ou assembleur).
EXEMPLE CONCRET:
Vous allez me dire, jusqu'ici, j'ai sorti des belles phrase, mais on à rien compris ! Eh bien je vais essayer d'y remédier en vulgarisant un peu le sujet.
Comme je l'explique plus haut, un "thread" est une partie séquentielle d'un programme, une certaine quantité d'instructions qui peut s'éxécuter de manière autonome mais toujours sous le contrôle d'un programme.
Concrètement, que se passe-t-il dans un processeur pendant l'execution d'un "thread" ? Imaginons un processeur "X", car sa marque ou son modèle ne change rien à notre exemple, imaginons un programme "ABC" que le processeur "X" doit éxécuter. Le programme "ABC" présente son premier "thread" au processeur "X", nous appelerons ce "thread" le thread "0", le thread "0" est composé de 10 instructions pour l'exemple:
PROCESSEUR "X"
0-0/ABC
1-0/ABC
2-0/ABC
3-0/ABC
4-0/ABC
5-0/ABC
6-0/ABC
7-0/ABC
8-0/ABC
9-0/ABC
10-0/ABC-éxécution finie !
A chaque étape du fonctionnement du processeur "X" est associé un "thread" (0), avec ses instructions (de 0 à 10), appartenant à un programme (ABC). Le principe est simple à comprendre, mais cette théorie prend toute sa valeur lorsqu'on complique le problème: imaginons un deuxième programme "DEF" qui demande au même processeur l'éxécution d'un "thread" composé lui aussi de 10 instructions:
PROCESSEUR "X"
0-0/ABC
0-0/DEF
1-0/DEF
1-0/ABC
2-0/ABC
2-0/DEF
3-0/DEF
3-0/ABC
4-0/ABC
4-0/DEF
5-0/ABC
5-0/DEF
6-0/DEF
6-0/ABC
7-0/ABC
7-0/DEF
8-0/DEF
9-0/DEF
8-0/ABC
10-0/DEF-éxécution finie !
9-0/ABC
10-0/ABC-éxécution finie !
Résultat: les "thread" sont imbriqués les uns dans les autres et tous ne se finissent pas en même temps car ceci est dû à la différence des instructions utilisées, une instruction d'adressage mémoire prend moins de cycle processeur qu'une comparaison sur 16 ou 32 bits, mais là on rentre dans le domaine de la programmation très avancée.
__________________________________________________ ______________
MULTI-THREADING
__________________________________________________ ______________
Là, ça devient interressant pour l'utilisateur lambda de pc ou autre machine puisqu'on va parler de performance. Le multithreading, c'est le fonctionnement en architecture parallèle de plusieurs processeurs, donc un système de répartition des "thread": Reprenons notre exemple précédent avec l'utilisation d'un deuxieme precesseur "Y":
PROCESSEUR "X" PROCESSEUR "Y"
0-0/ABC 0-0/DEF
1-0/ABC 1-0/DEF
2-0/ABC 2-0/DEF
3-0/ABC 3-0/DEF
4-0/ABC 4-0/DEF
5-0/ABC 5-0/DEF
6-0/ABC 6-0/DEF
7-0/ABC 7-0/DEF
8-0/ABC 8-0/DEF
9-0/ABC 9-0/DEF
10-0/ABC-éxécution finie ! 10-0/DEF-éxécution finie !
Et voilà, les "thread" sont affectés chacun à un processeur différent, ce qui signifie en théorie, un gain de temps multiplié par le nombre de processeurs. Toutefois, le "thread" 0 du programme "DEF" se terminera avant celui du programme "ABC" puisqu'il utilise des instructions moins gourmandes en cycle processeur, comme le démontre le test précédent.
Allez, encore un exemple pour bien cerner toutes les finesses d'un système multi-threading:
Le programme "ABC" demande l'éxécution simultanée de deux "thread", nommés "0" et "1" de dix instructions chacun pendant que le programme "DEF" demande l'éxécution d'un "thread" nommé "0", observons:
PROCESSEUR "X" PROCESSEUR "Y"
0-0/ABC
0-1/ABC 0-0/DEF
1-1/ABC 1-0/DEF
1-0/ABC 2-0/DEF
2-1/ABC 3-0/DEF
2-0/ABC 4-0/DEF
3-1/ABC 5-0/DEF
3-0/ABC 6-0/DEF
4-0/ABC 7-0/DEF
4-1/ABC 8-0/DEF
5-1/ABC 9-0/DEF
5-0/ABC 10-0/DEF-éxécution finie !
6-1/ABC
6-0/ABC
7-0/ABC
7-1/ABC
8-1/ABC
8-0/ABC
9-1/ABC
9-0/ABC
10-1/ABC-éxécution finie !
10-0/ABC-éxécution finie !
Aïe ! que se passe-t-il ? pourquoi le processeur "Y" n'a pas été mis plus à contribution pour gagner du temps ? Simple: un "thread" de peut pas être réparti sur plusieurs processeurs car ses instructions s'enchainent dans des parties de mémoires spécifiques à chacun des processeurs. Mais , alors, pourquoi le deuxieme "thread" du programme "ABC" ne s'est-il pas "branché" sur le processeur "Y" ? Là aussi la réponse est simple: les différents "thread" d'un même programme ne peuvent s'éxécuter que sur un seul processeur car avant de pouvoir être traité et executé par un processeur, un programme se voit attribué une zone de mémoire. Cette zone de mémoire est vérrouillée par le processeur qui va éxécuter le programme pour empêcher l'autre processeur d'y accèder, faute de quoi, c'est le crash du système assuré !
Heureusement certains programmes peuvent accèder à plusieurs processeurs en même temps, en se faisant passer pour plusieurs programmes, donc avec des "thread" bien distincts, ces programmes bénéficient donc de toute la puissance des deux processeurs. Pour l'exemple, on peut citer des soft comme "Discret /3DS max, Adobe /After Effect, e-on software /Vue d'Esprit", la liste est très loin d'être complète, on en compte des centaines voir plus...
Quel est le gain de performance ? il est d'environ de X 1.6 à X 1.84 selon les systèmes et les architectures pour le dual-processing (2 processeurs, le plus repandu).
Pourquoi pas un gain X 2 ? Il ne faut pas perdre de vue que le ou les processeur(s) ne gère(nt) pas que des "thread" émits par des programmes utilisateur, il y a aussi les programmes résidents ou TSR (Terminate and Stay Resident) induits par le système, ceux sont en grande partie les fameux "drivers" de périphériques, il y a les interruptions système comme les appuis clavier ou les mouvement souris, l'imprimante, les accès disques, le bus PCI et là encore j'en oublie une grand partie !
Pour information les sytèmes multi-processeurs existe en 2, 4, 8, 16?, 32 voir 64 processeurs !
En fonction des système et des types de processeurs, la gestion des "thread" à l'interieur de ces derniers peut varier, surtout sur le système d'attribution des "priorités" à chaque "thread"...
Termes à retenir: pour deux processeurs, on emploi le mot de DUAL-PROCESSING (DP) ou BI-PROCESSING (en français et en France uniquement), pour 4 et au-delà, on dit MULTI-PROCESSING (MP), sur des PC, le système de répartition des "thread" le plus répandu et le SMP (pour Symmetric Multi Processing) ou chaque processeur possède une priorité égale dans le traitement des tâches.
Il nous reste à voir une dernière technologie en la matière: "l'hyper-threading"...
__________________________________________________ ___________
HYPER-THREADING
__________________________________________________ ___________
Cette technologie, qui vient, depuis quelques mois, d'être introduite par La société INTEL, est spécifique à une serie de processeur: les IA-32, basé sur la micro-architecture NetBurst, le seul connu chez nous, à l'heure où j'écris cet article est le Pentium 4B cadencé à 3.06Ghz.
Faute d'en posseder un, pas de test possible, mais juste une explication théorique du fonctionnement:
La technologie hyper-threading rend possible l'execution simultané de deux "thread" dans un seul processeur "physique". Celui ci est en réalité composé de deux processeurs "logiques" qui possèdent chacun leurs propres registres (adressage, donné, controle, segment et debugage) ainsi que leur propre controleur programmable d'interruptions (APIC). Désolé pour les termes barbares ! toutefois, ces deux processeur "logiques" doivent partager le coeur du processeur, composé du moteur d'instruction (core+execution engine), les caches, l'interface avec le bus système et le bios !
Toute personne connaissant bien le fonctionnement d'un système avec deux "vrai" processeurs, comprendra dans la description précédente, les limitation d'une telle architecture.
Les "threads" et l'hyper-threading:
Revennont au fonctionnement même de l'hyper-threading, comme dans un sytème à deux processeurs "physiques", les "thread" sont répartis vers les deux processeurs "logique" (je rappelle qu'il s'agit en fait d'un seul processeur "physique"). Je reprends l'exemple de deux programmes avec un "thread" chacun:
PROCESSEUR "X" et "Y" (partageant le même moteur d'instruction donc travaillant l'un après l'autre: défaut majeur de l'hyper-threading !)
0-0/ABC
0-0/DEF
1-0/DEF
1-0/ABC
2-0/ABC
2-0/DEF
3-0/DEF
3-0/ABC
4-0/ABC+4-0/DEF
5-0/ABC
5-0/DEF
6-0/DEF+6-0/ABC
7-0/ABC+7-0/DEF
8-0/DEF
9-0/DEF
8-0/ABC
10-0/DEF-éxécution finie !
9-0/ABC
10-0/ABC-éxécution finie !
On remarque immediatement que les instructions 4, 6 et 7 on pu être "combinées" ensemble au sein d'un même cycle processeur pour gagner du temps, on se retrouve donc dans un système à mi-chemin du mono processeur et du bi-processeur.
Limite de la technologie: Malheureusement, le gain obtenu par la méthode d'imbrication des instructions issues de differents "thread" est aléatoire car les imbrication ne sont pas toujours possibles surtout lorsqu'il s'agit de "thread" issus de deux programmes distinct dont les instructions arrivent au processeur de manière quasi-aléatoire. Les seuls programmes à bénéficier d'une imbrication maximum et donc d'une accélération maximum par rapport à un seul processeur sont ceux écris avec le jeu d'instruction IA-32, mais à ce jour, j'en connais aucun, mais il y a fort à parier que les patches et mises-à-jour vont arriver dans les mois à venir...
Note de l'auteur: Cette technologie n'en étant qu'à son début et la conccurence s'apprêtant à sortir une technologie équivalente, je considère cet article non terminé, d'autre essais doivent avoir lieu, notament avec l'hyper-threading + un soft developpé scécifiquement afin de connaitre le niveau d'imbrication maximum possible des instructions.
Remerciement: Tous ceux qui ont lu l'article du début à la fin (et de manière sequentielle, comme des bons petits thread

.) Merci également à Babel, modérateur sur le forum du repaire, pour m'avoir demandé de le faire, sinon, cet article n'existerait pas. Merci également à mon chef qui n'a pas été capable de me griller pendant que j'écrivais cet article au lieu de bosser !
Trophy. (repairnaute-humoriste)