Topologie du Processor Core

mercredi 12 mars 2014Par : CyrIng

x2topology

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.
    topology-with-htt-4xcores
  • Topologie avec l’Hyperthreading désactivé et 4 x Coeurs activés.
    topology-without-htt-4xcores
  • Topologie avec l’Hyperthreading et 2 x Coeurs activés.
    topology-with-htt-2xcores
  • Topologie avec l’Hyperthreading désactivé et 1 seul Coeur activé.
    topology-without-htt-1xcore

Mise en oeuvre

Les instructions pour la compilation du code source et l’exécution du programme sont détaillées dans le wiki:

  1. Télécharger le code source x2topology.c
  2. Compiler la source avec gcc pour Linux
  3. 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()

topology_np-with-htt-4xcores

L’algorithme est le suivant:

  1. 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.
  2. Allouer, à la dimension ThreadCount, un tableau de la structure des données.
  3. 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.

    1. 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.
    2. Si l’affinité est validée, c.à.d. pthread_setaffinity_np() retourne 0, alors invoquer la fonction 0Bh de CPUID sur 2 niveaux :
      1. au niveau Thread du Processeur, valeur 1 dans le registre ECX
      2. 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 :
        1. l’identifiant étendu APIC
        2. l’identifiant APIC du Core
        3. l’identifiant APIC du Thread
  4. Boucler à nouveau de 0 à ThreadCount pour y attendre la fin de traitement des fonctions thread en appelant pthread_join()