Topologie du Processor Core
mercredi 12 mars 2014Par : CyrIngx2topology
Le programme x2topology énumère la topologie du processeur Core.
La collecte des informations relatives à chaque coeur s’appuie sur des appels itératifs à l’instruction CPUID.
Illustrations
- Topologie avec l’Hyperthreading et 4 x Coeurs activés.
- Topologie avec l’Hyperthreading désactivé et 4 x Coeurs activés.
- Topologie avec l’Hyperthreading et 2 x Coeurs activés.
- Topologie avec l’Hyperthreading désactivé et 1 seul Coeur activé.
Mise en oeuvre
Les instructions pour la compilation du code source et l’exécution du programme sont détaillées dans le wiki:
- Télécharger le code source x2topology.c
- Compiler la source avec gcc pour Linux
- Exécuter le programme
./x2topology
via le script Shell, sur l’ensemble des coeurs,
./x2topology.sh
x2topology_np
x2topology_np.c est une nouvelle version du programme qui effectue une affinité des Coeurs au moyen d’un appel à la fonction pthread_setaffinity_np()
L’algorithme est le suivant:
- Obtenir le nombre maximum de Coeurs au sein du Processeur dans le registre EAX, position des bits [31-26], en retour de la fonction 04h de l’instruction CPUID. Ce nombre sera désigné ThreadCount.
- Allouer, à la dimension ThreadCount, un tableau de la structure des données.
- Boucler de 0 (zéro) à ThreadCount (exclut), en créant une fonction thread au moyen de pthread_create().
Les caractéristiques de cette fonction seront passées en argument, en particulier l’indice du tableau sur lequel la fonction portera son traitement.- Au sein de la fonction thread, commencer par un changement d’affinité sur le numéro de CPU qui est recupéré des arguments d’appel.
- Si l’affinité est validée, c.à.d. pthread_setaffinity_np() retourne 0, alors invoquer la fonction 0Bh de CPUID sur 2 niveaux :
- au niveau Thread du Processeur, valeur 1 dans le registre ECX
- au niveau Core, valeur 2 dans ECX
- la collecte est terminée, dès lors que les registres EAX et EBX ont la valeur 0 en sortie de la fonction 0Bh du CPUID.
- Pour tout niveau validé (Thread et Core), ranger dans le tableau, à l’indice du numéro CPU, les valeurs de Topologie :
- l’identifiant étendu APIC
- l’identifiant APIC du Core
- l’identifiant APIC du Thread
- Boucler à nouveau de 0 à ThreadCount pour y attendre la fin de traitement des fonctions thread en appelant pthread_join()