Rdtsc
La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la
versión revisada el 29 de diciembre de 2019; las comprobaciones requieren
5 ediciones .
rdtsc ( Read Time Stamp Counter ) es una instrucción de ensamblador para plataformas x86 y x86_64 que lee el contador TSC ( Time Stamp Counter ) y devuelve el número de ciclos de reloj de 64 bits en los registros EDX: EAX desde el último reinicio del procesador .
rdtsc es compatible con Pentium (y compatible) y procesadores más nuevos. Código de operación : 0F 31 [1] .
rdtscp [2] ha sido compatible desde Intel Nehalem y AMD Family 0x0F [3] . Código de operación: 0F 01 F9 [4] .
Uso
rdtsc es el más utilizado:
- medir el tiempo;
- para la medición precisa de intervalos de tiempo, incluso durante la optimización (medición del tiempo requerido para ejecutar instrucciones específicas o su conjunto);
- para fines anti-depuración; [5] [6]
- como fuente de entropía para generadores de números pseudoaleatorios . [7]
Beneficios
En comparación con las API proporcionadas por el sistema operativo, como WINAPI::QueryPerformanceCounter() o gettimeofday(), las instrucciones rdtsc/rdtscp pueden proporcionar las siguientes ventajas:
- Mejor precisión, especialmente para arquitecturas y sistemas operativos heredados que no cuentan con soporte HPET completo . Dichos sistemas operativos utilizan un temporizador del sistema de baja precisión (a veces hasta un segmento del programador, OsTimeSlice, del orden de unidades o decenas de milisegundos).
- Menos sobrecarga: las instrucciones rdtsc/rdtscp se ejecutan en aproximadamente una docena de ciclos de reloj, lo que es mucho más rápido que las llamadas al sistema.
- No es necesario cambiar al modo privilegiado de Ring0 o al hipervisor en la mayoría de los sistemas (si el comando está permitido en el sistema operativo).
Problemas de uso
- Debe haber modos de programa que no requieran este comando, ya que RDTSC/RDTSCP puede no estar disponible o estar prohibido para su uso en el sistema final donde se utilizará la aplicación:
- en procesadores muy antiguos (por ejemplo, 80486 ) o en sistemas que no implementan completamente la arquitectura x86.
- la instrucción se puede convertir potencialmente en una instrucción privilegiada (el sistema operativo establece el tercer bit en el registro de control CR4), y su uso dará como resultado que se produzca una excepción en el programa.
- la instrucción puede ser interceptada por los sistemas de virtualización, su uso dará lugar a una hiperllamada.
- El modo de ahorro de energía puede afectar el conteo del reloj:
- Cuando el procesador cambia dinámicamente la frecuencia (reduciendo y aumentando la frecuencia en SpeedStep, Turbo Boost, Cool&Quiet y tecnologías similares), la velocidad del contador TSC cambia.
- Poner un procesador en modo de suspensión profunda C3 detiene el contador TSC en los procesadores más antiguos.
- En los procesadores Intel modernos ( Nehalem y más nuevos) y AMD (presumiblemente desde K10 Barcelona/Phenom), el contador TSC es independiente del uso de tecnologías de ahorro de energía y aumenta a una frecuencia constante, independientemente de la frecuencia a la que se ejecuta el procesador y si estaba funcionando o estaba en estado de suspensión. Tal contador se llama invariante ( invariante TSC ).
- Es posible que no sea posible realizar mediciones precisas con una sola ejecución del fragmento de instrucciones medido debido a la influencia de las memorias caché del procesador al acceder a la memoria. Tradicionalmente se resuelve midiendo repetidamente un fragmento de programa o repitiendo el fragmento medido en un bucle.
- RDTSC se puede reordenar con instrucciones medidas en procesadores fuera de servicio. El reordenamiento se puede deshabilitar agregando comandos de serialización (por ejemplo, CLD/CLC para los modelos Pentium P5, P54 [8] o cpuid para los modelos más nuevos) o usando RDTSCP.
- Las mediciones de duración de fragmentos cortos pueden ser inestables en sistemas multinúcleo y multiprocesador, o cuando se usa HyperThreading debido a la influencia mutua de otros subprocesos y la carga en las unidades de procesador compartidas.
- En casos excepcionales, los contadores de TSC pueden estar desincronizados en algunos sistemas multinúcleo o multiprocesador, en particular:
- Al inicializar procesadores.
- Es posible que los contadores se desincronicen en los primeros sistemas multinúcleo debido a la inicialización incorrecta de los procesadores por parte de algunos BIOS. Solucionado actualizando el BIOS o actualizando el sistema operativo. Hay programas para comprobar este error. [9]
- El sistema operativo puede cambiar el subproceso entre diferentes núcleos que tienen contadores no sincronizados. A nivel de aplicación, puede rastrear el hecho de un cambio de kernel en sistemas de varios núcleos utilizando la instrucción RDTSCP, que, al funcionar de manera similar a RDTSC, también devuelve el número del procesador lógico en el registro ECX.
Para resolver muchos problemas, se recomienda arreglar el hilo en un procesador específico ( afinidad de cpu ) y deshabilitar las tecnologías de cambio automático de frecuencia (tecnologías de ahorro de energía y cambios dinámicos de rendimiento).
Notas
- ↑ Manual del desarrollador de software de las arquitecturas Intel® 64 e IA-32 . — vol. 2 (referencia del conjunto de instrucciones). - Pág. 4-301.
- ↑ Una versión de serialización de la instrucción rdtsc, que también lee el MSR IA32_TSC_AUX, que a menudo almacena el número de kernel.
- ↑ rdtscp . Consultado el 1 de noviembre de 2011. Archivado desde el original el 2 de enero de 2012. (indefinido)
- ↑ Manual del desarrollador de software de las arquitecturas Intel® 64 e IA-32 . — vol. 2 (referencia del conjunto de instrucciones). - Pág. 4-303.
- ↑ Referencia de antidepuración de Windows | Comunidad Symantec Connect . Fecha de acceso: 30 de diciembre de 2011. Archivado desde el original el 14 de enero de 2012. (indefinido)
- ↑ Diapositiva 58 Antidepuración basada en el tiempo Archivado el 4 de marzo de 2012.
- ↑ Calle Tom. Denis, Simon Johnson, Criptografía para desarrolladores Archivado el 9 de octubre de 2021 en Wayback Machine .
- ↑ Cómo optimizar para la familia de microprocesadores Pentium Archivado el 6 de enero de 2012 en Wayback Machine // 1996-2000 por Agner Fog. Capítulo "30. Prueba de velocidad", archivado el 19 de noviembre de 2011.
- ↑ Afinidad de ICE . Consultado el 19 de octubre de 2011. Archivado desde el original el 7 de septiembre de 2011. (indefinido)
Enlaces