En el mundo Linux, para conseguir temporizador nano segundos de precisión/clockticks se puede utilizar:CPU TSC operación de recuperación, especialmente en el entorno de múltiples núcleos de procesadores múltiples
#include <sys/time.h>
int foo()
{
timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
//--snip--
}
This answer sugiere un enfoque asm
para consultar directamente para el reloj de la CPU con la instrucción RDTSC
.
En una arquitectura multi-core, multiprocesador, ¿cómo se sincroniza este reloj/valor del temporizador en varios núcleos/procesadores? Tengo entendido que se está haciendo una valla inherente. ¿Es este entendimiento correcto?
¿Puede sugerir alguna documentación que explique esto en detalle? Estoy interesado en las microarquitecturas Intel Nehalem y Sandy Bridge.
EDITAR
Limitar el proceso de 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 me gustaría utilizar de manera óptima todos los recursos de la máquina que incluye todos los núcleos y procesadores.
Editar
Gracias por la confirmación de que el TSC se sincroniza a través de núcleos y procesadores. Pero mi pregunta original es ¿cómo se hace esta sincronización? ¿Es con algún tipo de esgrima? ¿Conoces alguna documentación pública?
Conclusión
Gracias para todas las entradas: Aquí está la conclusión para esta discusión: Los TSCs se sincronizan en la inicialización utilizando un RESET que pasa a través de los núcleos y procesadores en un sistema multi procesador/multi núcleo. Y después de eso, cada núcleo está solo. Los TSC se mantienen invariables con un bucle de fase bloqueada que normalizaría las variaciones de frecuencia y, por lo tanto, las variaciones de reloj dentro de un núcleo determinado y así es como el TSC permanece sincronizado en los núcleos y procesadores.
No se puede contar con clock_gettime() para la precisión de nanosegundos, por cierto; es solo preciso a aproximadamente un cuarto de microsegundo. Me encontré con esto cuando estaba tratando de obtener sincronizaciones súper precisas y descubrí que gettime() en sí cuesta más de 250ns. http://stackoverflow.com/questions/7935518/is-clock-gettime-adequate-for-submicrosecond-timing – Crashworks
si se utiliza TSC para proporcionar la marca de tiempo, se supone que solo refleja delta nano segundos. Estoy usando linux. Y entiendo que kernel proporciona el rendimiento esperado. ventanas - puede ser no. –
@Crashworks pls lea mi último comentario sobre este enlace de la pregunta que compartió. –