Programación en Lenguaje Ensamblador

-El Verdadero Lenguaje de las Máquinas-

RDTSC: Read Time-Stamp Counter

El Contador de Kilometraje del CPU

No importa en cuantos lenguajes de programación uno haya programado antes, es solo cuando se programa en ensamblador que uno tiene conciencia de las verdaderas capacidades de una computadora. En la entrada de hoy se discute una instrucción simple pero muy util para medir el desempeño de nuestras rutinas: RDTSC, Read Time-Stamp Counter.

En esta imagen se muestra el OpCode que consiste tan solo de 2 bytes. Se trata de una instruccón sin operandos que carga un valor de 64 bits en EDX:EAX en modo de 32 bits o en RAX en el modo de 64. Dicho valor es conocido como Time-Stamp y es la cuenta de ciclos de reloj transcurridos desde el arranque del procesador. Este valor se reincia en cero con cada encendido. Para los nuevos lectores que no saben bien lo que es un ciclo de reloj va una explicación rápida.

Definición de un Ciclo de Reloj

De seguro habrán escuchado que la velocidad de un procesador se mide en Hertz, un procesador típico para computadoras del final de la primer década del siglo XXI se mide en Gigahertz. Cuando decimos por ejemplo que un CPU tiene una velocidad de un GHz significa que su reloj interno es capaz de dar mil millones de pasos en tan solo un segundo. Dependiendo de la construcción del CPU las instrucciones pueden tomar unos pocos ciclos de reloj e incluso ejecutarse multitud de ellas en tan solo uno, pero en general cualquier instruccion no tarda mas ciclos de reloj que los que pueden contarse con los dedos de las manos. Así que saquen sus cuentas.

Ahora que ha quedado claro lo que es un ciclo de reloj retomemos el tema del Time-Stamp Counter. Cuando el CPU arranca en algun lugar del sistema se lleva la cuenta de los ciclos de reloj transcurridos. La máquina usa 64 bits para llevar esta cuenta, parece poco pero para que un CPU de 1GHz llenara esos 64 bits necesitaría estar encendido durante mas de 584 años. Esa cuenta de ciclos transcurridos es el famoso Time-Stamp. Y ahora que ya sabemos lo que es ahora veamos para que sirve.

Usos para RDTSC

Como ya se han de imaginar, el primer y mas interesante uso del RDTSC es para medir la cantidad de ciclos de reloj que tardan en ejecutarse las rutinas y usar este valor para ver cual de ellas se ejecuta en el menor tiempo; para hacer esto basta con ejecutar RDTSC antes de la rutina a medir y guardar el valor, luego volverlo a leer al terminar la rutina y restarle el valor anterior. El resultado seran los ciclos de reloj que duro la rutina. Otro uso es el de usar RDTSC en combinación con el reloj del sistema operativo para tener un reloj mucho mas preciso que el del propio OS, aunque esto no es muy buena idea porque en ciertas condiciones la velocidad de un CPU puede no ser constante. Otra es usar los bits mas bajos del time-stamp para obtener un número arbitrario (no confundir con aleatorio) durante la ejecución del programa. Como dato inutil, aunque es posible llamar esta instrucción desde otros lenguajes por medio de funciones Wrapper el resultado devuelto por RDTSC no va a ser muy preciso pues se habrá perdido mucho tiempo con todo el overhead involucrado para hacer la llamada externa. De hecho, esta instrucción fue diseñada para evitar el problema del overhead.

Si el procesador fuera un automovil, sin duda RDTSC sería el contador de kilometros. Aunque para medir el desempeño en tiempo real de un CPU existe otra instrucción mucho mas avanzada llamada RDPMC o Read Performance Monitor Counter. Esta otra instrucción no es tan sencilla como RDTSC pero devuelve mucha mas información sobre lo que el CPU está haciendo y que tan bien lo está haciendo en un momento determinado. Por cierto, en ciertas condiciones estas instrucciones pueden no funcionar si no se activan determinados bits de control en ciertos registros internos del CPU. Aunque en mi experiencia, estas instrucciones trabajan bastante bien con los programas en ensamblador para Windows sin necesidad de inicializar nada. Pueden encontrar mas información en los manuales oficiales de Intel. Ahora mejor sigo con el minijuego que en su desarrollo fue que surgió la necesidad de usar las instrucciones para medir el desempeño del CPU.

marzo 19, 2011 - Posted by | Uncategorized

4 comentarios »

  1. Mamalon, no conocia esta instruccion. Uik

    Comentario por Puerco | marzo 25, 2011 | Responder

  2. que bien seria como el GetTickCount?

    me gusta relacionarlos para entenderlos mejor

    Comentario por Roberto Carlos | abril 15, 2011 | Responder

    • La diferencia entre RDTSC y GetTick count es que RDTSC cuenta cicclos de rejor g GetTickCount milisegundos, otra diferencia es que GetTickCount es una funcion de la API y tiene mas overhead que RDTSC que es solo una instruccion maquina. Lo malo de RDTSC es que en algunas situaciones la velocidad del CPU puede no ser constante.

      Comentario por asm86 | abril 15, 2011 | Responder

  3. Es fabuloso tu tecnica de relacion para aprehender assembler gracias por ello

    Comentario por FERNANDO | octubre 21, 2011 | Responder


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: