mardi 2 septembre 2014

CPUID en C : compter les cores

Comment compter le nombre de coeurs du processeur en C ?

Rien de plus simple : en utilisant l'instruction CPUID du processeur. La documentation (à jour, car beaucoup de vieilles informations sont disponibles sur cpuid et sont maintenant érronées du fait de l'évolution...) nous apprend qu'en appelant CPUID en mettant eax à 0xB et ecx à 1 nous permettra de récupérer dans ebx le nombre de coeurs logiques de notre processeur.
On veut donc réaliser un code :

mov eax, 0xb
mov ecx, 1
cpuid
; à cet endroit, ebx contient le nombre de coeurs.

Pour interfacer avec le C en inline on peut écrire quelque chose comme :
asm("movl $0xb, %%eax\n"
        "movl $1, %%ecx\n"
        "cpuid\n"
        "movl %%ebx, %0\n"
        : "=r" (ebx));

printf("Coeurs : %i\n", ebx);
Sur mon CPU, un Intel core i3 avec l'hyperthreading et 2 cores (4 "threads" grâce à HT) on obtient 4 coeurs logiques, si on passe ecx à 0 en paramètre (avec toujours eax = 11) on obtient 2, pour les coeurs physiques du processeur. L'instruction CPUID permet également d'obtenir de nombreuses autres informations précieuses sur le processeur où s'exécute votre programme, comme le support de certaines extensions (MMX, SSE ou AES..) ainsi que des informations sur les caches et la topologie du CPU.

Aucun commentaire:

Enregistrer un commentaire