¿Cómo puedo obtener el número de núcleo de la CPU desde una aplicación de espacio de usuario (Linux, C)?

Es de suponer que hay una biblioteca o simple blob asm que me puede dar el número de la CPU actual que estoy ejecutando.

Use sched_getcpu para determinar la CPU en la que se está ejecutando el hilo de llamada. Ver man getcpu (la llamada al sistema) y man sched_getcpu (un contenedor de la biblioteca). Sin embargo, tenga en cuenta lo que dice:

La información colocada en la CPU solo está garantizada para ser actual en el momento de la llamada: a menos que la afinidad de la CPU se haya solucionado utilizando sched_setaffinity (2), el kernel puede cambiar la CPU en cualquier momento. (Normalmente, esto no ocurre porque el planificador intenta minimizar los movimientos entre CPU para mantener cachés calientes, pero es posible). El llamador debe estar preparado para manejar la situación cuando la CPU y el nodo ya no son la CPU y el nodo actuales.

Necesitas hacer algo como:

  • Llame a sched_getaffinity e identifique los bits de la CPU
  • Iteramos las CPU, haciendo sched_setaffinity a cada una (no estoy seguro si después de sched_setaffinity está garantizado que está en la CPU, o necesita ceder explícitamente)
  • Ejecutar CPUID (instrucción asm) … hay una manera de obtener una identificación única por núcleo de una de sus salidas (consulte los documentos de Intel ). Recuerdo vagamente que es la “ID APIC”.
  • Construya una tabla (un std :: map?) De ID de APIC a un número de CPU o máscara de afinidad o algo así.
  • Si hiciste esto en tu hilo principal, ¡no olvides volver a establecer sched_setaffinity en todos los CPUS!

Ahora puede CPUID nuevamente cuando lo necesite y buscar en qué núcleo se encuentra.

Pero preguntaría por qué necesitas hacer esto; normalmente quieres tomar el control a través de sched_setaffinity en lugar de descubrir en qué núcleo estás (e incluso eso es algo bastante raro de querer / necesitar). (Es por eso que no conozco el detalle crucial de qué extraer exactamente de CPUID, ¡lo siento!)

Actualización: Acabo de enterarme de sched_getcpu de la respuesta de litb aquí. ¡Mucho mejor! (mi Debian / etch libc es demasiado antigua para tenerlo).

No sé de nada para obtener su identificación de núcleo actual. Con la migración de tarea / proceso de nivel de kernel, no se le garantizaría que se mantendría constante durante un período de tiempo, a menos que se ejecutara en alguna forma de modo en tiempo real.

Si desea estar en un núcleo específico, puede usar esa función sched_setaffinity() o el comando taskset para iniciar su progtwig. Sin embargo, creo que estos necesitan permisos elevados para trabajar. En su progtwig, podría ejecutar sched_getaffinity() para ver la máscara que se estableció anteriormente y usarla como la mejor suposición en el núcleo en el que está ejecutando.

 sysconf(_SC_NPROCESSORS_ONLN);