J'ai une application multi-thread qui fonctionne sous Linux 2.6.30 sur un processeur PowerPC 8 cœurs. Je veux déterminer quel processeur est utilisé lorsqu'un thread est lancé. La réponse évidente est d'imprimer le registre PID - ID du processeur. Le registre PID est accédé en utilisant l'instruction mfspr. Je tente d'accéder à l'aide de la asm suivante dans mon programme C:Comment puis-je obtenir l'ID du processeur sur un PowerPC multicœur?
asm(" mfspr %0, 286 " : "=r" (cpu_no));
Le problème est que mfspr
est une instruction privilégiée, et même lorsque cette application est exécutée en tant que root, il défauts avec une erreur d'instruction illégale. Cette instruction fonctionne correctement lorsqu'elle est exécutée sur une application en métal nu.
Bien qu'il soit possible de créer un pilote qui exécuterait ces instructions dans l'espace noyau, au moment où la réponse reviendrait au thread, il pourrait avoir été déplacé vers un autre noyau. A partir d'un processus d'utilisateur Linux, y a-t-il un moyen d'obtenir l'identifiant du noyau sur lequel le thread actuel est exécuté?
Si ma compréhension est correcte, pthread_getaffinity_np renverrait un mappage binaire des cœurs sur lesquels le thread pourrait être programmé pour s'exécuter. Je veux savoir sur quel noyau il fonctionne. – Russ
Je pensais que vous pourriez définir l'affinité avant de lancer le fil. sched_getcpu pourrait être plus proche de ce que vous voulez vraiment. – Duck
Le problème fondamental que j'essaie de comprendre est pourquoi l'application fonctionne à seulement 12% de la CPU (comme indiqué par le haut). J'ai installé LTTng - et pour 41 des 42 threads, il rapporte que le CPUID est le même (varie d'une exécution à l'autre, mais il semble que 41 threads sont tous regroupés sur un seul noyau). Cependant, la visionneuse de contrôle de flux dans lttv montre 8 threads tous en mode de fonctionnement en même temps, ce qui est ce que j'espère. – Russ