Operación de recuperación de TSC de CPU, especialmente en entornos multinúcleo y multiprocesador

11 minutos de lectura

avatar de usuario
jay d

En el mundo de Linux, para obtener un temporizador/reloj de precisión de nanosegundos, se puede usar:

#include <sys/time.h>

int foo()
{
   timespec ts;

   clock_gettime(CLOCK_REALTIME, &ts); 
   //--snip--      
}

Esta respuesta sugiere una asm enfoque para consultar directamente el reloj de la CPU con el RDTSC instrucción.

En una arquitectura multinúcleo y multiprocesador, ¿cómo se sincroniza este reloj/valor del temporizador entre varios núcleos/procesadores? Tengo entendido que allí se está haciendo una cerca inherente. ¿Es correcto este entendimiento?

¿Puede sugerir alguna documentación que explique esto en detalle? Estoy interesado en las microarquitecturas Intel Nehalem y Sandy Bridge.

EDITAR

Limitar el proceso a un solo núcleo o CPU no es una opción, ya que el proceso es realmente enorme (en términos de recursos consumidos) y le gustaría utilizar de manera óptima todos los recursos en la máquina que incluye todos los núcleos y procesadores.

Editar

Gracias por la confirmación de que el TSC está sincronizado entre núcleos y procesadores. Pero mi pregunta original es ¿cómo se realiza esta sincronización? ¿Es con algún tipo de vallado? ¿Conoces alguna documentación pública?

Conclusión

Gracias por todos los aportes: aquí está la conclusión de esta discusión: los TSC se sincronizan en la inicialización mediante un REINICIO que ocurre en los núcleos y procesadores en un sistema multiprocesador/multinúcleo. Y después de eso, cada núcleo está solo. Los TSC se mantienen invariables con un bucle de bloqueo de fase que normalizaría las variaciones de frecuencia y, por lo tanto, las variaciones del reloj. dentro de un núcleo dado y así es como el TSC permanece sincronizado entre núcleos y procesadores.

  • Por cierto, no puedes contar con clock_gettime() para una precisión de nanosegundos; solo es preciso dentro de un cuarto de microsegundo. Me encontré con esto cuando estaba tratando de obtener tiempos súper precisos y descubrí que gettime() en sí mismo cuesta más de 250 ns. stackoverflow.com/questions/7935518/…

    – Crashworks

    7 de junio de 2012 a las 23:05

  • si se usa TSC para proporcionar una marca de tiempo, se supone que debe reflejar solo delta nanosegundos. Estoy usando linux. Y tengo entendido que el kernel proporciona el rendimiento esperado. ventanas – puede que no lo sea.

    – Jay D.

    7 junio 2012 a las 23:16


  • @Crashworks por favor lea mi último comentario sobre el enlace de esta pregunta que compartió.

    – Jay D.

    7 junio 2012 a las 23:25


  • @Crashworks Me interesa saber si ve el rendimiento afectado con los procesadores Intel de última generación con el último kernel de Linux (ya sea 2.6 o 3.0)

    – Jay D.

    7 de junio de 2012 a las 23:26


  • No se trata de múltiples fuentes de reloj. Se trata de una celda PLL en cada núcleo que genera esencialmente su propio reloj que no solo tiene variaciones de período a corto plazo en comparación con todos los demás, sino que también tiene una deriva a largo plazo distinta de cero que es diferente a todos los demás núcleos. Una CPU multinúcleo usa un PLL por núcleo, todos están referenciados a la fuente de reloj única. Pero un PLL usa ese reloj único solo como referencia, y este proceso de referencia introduce errores.

    – Kuba no se ha olvidado de Mónica

    16 de junio de 2012 a las 7:05

avatar de usuario
amén

Directamente de Intel, aquí hay una explicación de cómo los procesadores recientes mantienen un TSC que funciona a un ritmo constante, está sincronizado entre núcleos y paquetes en una placa base de múltiples zócalos, e incluso puede continuar funcionando cuando el procesador entra en un estado C de suspensión profunda. , en particular vea la explicación de Vipin Kumar EK (Intel):

http://software.intel.com/en-us/articles/best-timing-function-for-measuring-ipp-api-timing/

Aquí hay otra referencia de Intel que analiza la sincronización del TSC entre núcleos, en este caso mencionan el hecho de que rdtscp le permite leer atómicamente tanto el TSC como la identificación del procesador, esto es importante para rastrear aplicaciones… supongamos que desea rastrear la ejecución de un subproceso que podría migrar de un núcleo a otro, si lo hace en dos instrucciones separadas (no atómicas), entonces no tiene certeza de en qué núcleo se encontraba el subproceso en el momento en que leyó el reloj.

http://software.intel.com/en-us/articles/intel-gpa-tip-cannot-sychronize-cpu-timestamps/

Todos los zócalos/paquetes en una placa base reciben dos señales comunes externas:

  1. REINICIAR
  2. RELOJ de referencia

Todos los zócalos ven RESET al mismo tiempo cuando enciende la placa base, todos los paquetes de procesador reciben una señal de reloj de referencia de un oscilador de cristal externo y los relojes internos en el procesador se mantienen en fase (aunque generalmente con un multiplicador alto, como 25x) con circuito llamado Phase Locked Loop (PLL). Los procesadores recientes registrarán el TSC a la frecuencia más alta (multiplicador) que el procesador tiene clasificado (el llamado TSC constante), independientemente del multiplicador que cualquier núcleo individual pueda estar usando debido a la regulación de la temperatura o la administración de energía (el llamado TSC invariable). Los procesadores Nehalem como el X5570 lanzado en 2008 (y los procesadores Intel más nuevos) admiten un “TSC ininterrumpido” que continuará funcionando incluso cuando conserva energía en un estado C (C6) de potencia profunda. Consulte este enlace para obtener más información sobre los diferentes estados de apagado:

http://www.anandtech.com/show/2199

Tras investigar más, encontré una patente que Intel presentó el 22/12/2009 y se publicó el 23/6/2011 titulada “Control de compensaciones del contador de marca de tiempo (TSC) para múltiples núcleos e hilos”

http://www.freepatentsonline.com/y2011/0154090.html

Página de Google para esta solicitud de patente (con enlace a la página de la USPTO)

http://www.google.com/patents/US20110154090

Por lo que deduzco, hay un TSC en el no núcleo (la lógica en un paquete que rodea los núcleos pero no forma parte de ningún núcleo) que se incrementa en cada reloj de bus externo por el valor en el campo del registro específico de la máquina especificado por Vipin Kumar en el enlace de arriba (MSR_PLATFORM_INFO[15:8]). El reloj del bus externo funciona a 133,33 MHz. Además, cada núcleo tiene su propio registro TSC, cronometrado por un dominio de reloj que es compartido por todos los núcleos y puede ser diferente del reloj para cualquier núcleo; por lo tanto, debe haber algún tipo de búfer cuando el RDTSC lee el TSC central. (o RDTSCP) instrucción que se ejecuta en un núcleo. Por ejemplo, MSR_PLATFORM_INFO[15:8] puede establecerse en 25 en un paquete, cada reloj de bus, el TSC sin núcleo aumenta en 25, hay un PLL que multiplica el reloj del bus por 25 y proporciona este reloj a cada uno de los núcleos para registrar su registro TSC local, manteniendo así todo el TSC registra en sincronía. Entonces, para mapear la terminología al hardware real

  • El TSC constante se implementa mediante el uso del reloj de bus externo que funciona a 133,33 MHz, que se multiplica por un multiplicador constante especificado en MSR_PLATFORM_INFO[15:8]
  • El TSC invariable se implementa manteniendo el TSC en cada núcleo en un dominio de reloj separado
  • El TSC continuo se implementa al tener un TSC no central que se incrementa en MSR_PLATFORM_INFO[15:8] hace tictac en cada reloj de bus, de esa manera un paquete multinúcleo puede apagarse profundamente (estado C6) y puede apagar el PLL… no hay necesidad de mantener un reloj en el multiplicador más alto. Cuando un núcleo se reanuda desde el estado C6, su TSC interno se inicializará con el valor del TSC no central (el que no se fue a dormir) con un ajuste de compensación en caso de que el software haya escrito un valor en el TSC, los detalles de que están en la patente. Si el software escribe en el TSC, entonces el TSC para ese núcleo estará desfasado con otros núcleos, pero con una compensación constante (la frecuencia de los relojes del TSC está ligada al reloj de referencia del bus por un multiplicador constante).

  • Gracias por tu respuesta. Su primer enlace habla de un contenedor de tiempo en la biblioteca Intel IPP. IPP es una biblioteca de procesamiento de imágenes. El enlace simplemente establece el mismo hecho mencionado anteriormente, que los TSC están sincronizados entre núcleos en los procesadores modernos. pero no proporciona la razón por la cual: ¡la pregunta original!

    – Jay D.

    16 de junio de 2012 a las 8:58

  • Su segundo enlace habla sobre cómo los chips Intel Graphics informan si los TSC no están sincronizados. y cómo hacen frente a los TSC delta. el artículo realmente no habla de cómo se sincronizan los TSC.

    – Jay D.

    16 de junio de 2012 a las 9:00

  • tercer enlace habla de las características de nehalem. y Phase Locked Loop (PLL) normalizaría el reloj para un núcleo determinado, NO A TRAVÉS de los núcleos y entre los procesadores.

    – Jay D.

    16 de junio de 2012 a las 9:10

  • Jay, encontré una patente de Intel sobre este tema y actualizaré mi respuesta para incluir ese enlace. Gracias por los puntos de bonificación.

    – amdn

    16 de junio de 2012 a las 19:07

  • Agregué dos enlaces a la patente y mi interpretación en mi respuesta anterior

    – amdn

    16 de junio de 2012 a las 23:58

avatar de usuario
Gunther piez

En las CPU más nuevas (i7 Nehalem+ IIRC), el TSC se sincroniza en todos los núcleos y funciona a una velocidad constante. Entonces, para un solo procesador, o más de un procesador en un solo paquete o placa base (!), puede confiar en un TSC sincronizado.

Del Manual del sistema Intel 16.12.1

El contador de marca de tiempo en los procesadores más nuevos puede admitir una mejora, denominada TSC invariable. El soporte de procesadores para TSC invariable se indica mediante CPUID.80000007H:EDX[8]. El TSC invariable se ejecutará a una velocidad constante en todos los ACPI P-, C-. y estados T. Este es el comportamiento arquitectónico que avanza.

En los procesadores más antiguos, no puede confiar ni en la velocidad constante ni en la sincronización.

Editar: al menos en múltiples procesadores en un solo paquete o placa base, el TSC invariable está sincronizado. El TSC se restablece a cero en /RESET y luego avanza a una velocidad constante en cada procesador, sin deriva. Se garantiza que la señal /RESET llegue a cada procesador al mismo tiempo.

  • Tenga en cuenta que solo se aplica a los procesadores Intel. Ha pasado un tiempo desde que hice alguna prueba en AMD (la CPU AMD más reciente que probé fue IIRC, Phenom II), pero en ese momento ni siquiera tenían sincronización entre núcleos en un solo dado.

    – Eugenio Smith

    8 de junio de 2012 a las 7:26

RTDSC no está sincronizado entre las CPU. Por lo tanto, no puede confiar en él en un sistema multiprocesador. La única solución que se me ocurre para Linux sería restringir el proceso para que se ejecute en una sola CPU configurando su afinidad. Esto se puede hacer externamente usando usando taskset utilidad o “internamente” usando sched_setaffinity o pthread_setaffinity_np funciones

avatar de usuario
Juan Gruber

este manual, capítulo 17.12, describe el TSC invariable utilizado en los procesadores más nuevos. Disponible con Nehalem, esta marca de tiempo, junto con la instrucción rtscp, permite leer una marca de tiempo (no afectada por estados de espera, etc.) y una firma de procesador en una operación atómica.

Se dice que es adecuado para calcular el tiempo del reloj de pared, pero obviamente no espera que el valor sea el mismo en todos los procesadores. La idea establecida es que puede ver si las lecturas sucesivas son para el mismo reloj de la CPU o para ajustarse a varias lecturas de la CPU. “También se puede usar para ajustar las diferencias por CPU en los valores TSC en un sistema NUMA”.

Consulte también la precisión de rdtsc en los núcleos de la CPU

Sin embargo, no estoy seguro de que la conclusión de consistencia final en la respuesta aceptada se derive de la declaración de que el tsc se puede usar para la hora del reloj de pared. Si fuera consistente, ¿qué razón habría para determinar atómicamente la fuente de CPU del tiempo?

NB La información de TSC ha pasado del capítulo 11 al capítulo 17 en ese manual de Intel.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad