MONITOREO DE EVENTOS EN LOS PROCESADORES PENTIUM

Anuncio
MONITOREO DE EVENTOS
PARA PENTIUM CON MMX
ORGANIZACIÓN DE COMPUTADORES II
Alumnos: Andrea Katz y Andrés Stoliar
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 1/10
MONITOREO DE EVENTOS EN LOS PROCESADORES PENTIUM DE INTEL
En la familia de procesadores Pentium, Intel introduce soporte de hardware que permite
monitorear y medir parámetros de performance del procesador. Se provee de contadores
que pueden ser programados para incrementarse cuando ocurran determinados eventos.
Estos eventos pueden ser, por ejemplo, cantidad de instrucciones de algún tipo ejecutadas, hits o misses de caché, flushes de pipeline, etc. Observando algunos de estos eventos es posible llegar a conclusiones acerca, no solo del funcionamiento del procesador,
sino también de cuales son las mejores opciones para escribir código eficiente para cada
modelo de la familia.
Cada modelo de procesador Pentium tiene un conjunto de lo que Intel llama Model
Specific Registers (MSR). Si bien estos registros varían de modelo a modelo, las
instrucciones para acceder a ellos son propias de la arquitectura y de acuerdo a esto
pertenecen al set de instrucciones de toda la familia. Estas instrucciones son RDMSR
y WRMSR (read/write MSR), que leen y escriben respectivamente los registros MSR,
y entre ellos los contadores (Performance Monitor Counters) a los que nos referimos
antes.
En adelante nos referiremos particularmente a los procesadores Pentium con MMX.
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 2/10
REGISTROS DE MONITOREO DE PERFORMANCE (PMC)
Existen cuatro reistros de monitoreo, a saber:
Time Stamp Counter (TSC)
Se incrementa en cada ciclo de reloj.
Programmable Event Counters (CTR0 y CTR1)
Son dos registros contadores de 40 bits que pueden ser programados para contar cantidad de ocurrencias o ciclos de duración de una lista pre-determinada de eventos.
Control and Event Select Register (CESR)
Controla la operación de los contadores programables y sus pins asociados.
Relacionados con cada contador (CTR0 y CTR1) el CESR contiene tres campos: 6 bits
para la selección del evento (ES), un bit de control del pin (PC) y 3 bits de control del
contador (CC).
Selección del evento (ES0 - ES1)
Hasta dos eventos pueden ser monitoreados simultáneamente escribiendo los códigos de
evento en los bits correspondientes a estos campos. (ver Lista de eventos).
Control del contador (CC0 - CC1)
Controla la operación del monitor. Los dos bits menos significativos permiten indicar
que se monitoreen solo eventos ligados a ejecución de código en algún nivel de privilegio (CPL) en particular. El bit más significativo selecciona entre contar ocurrencias
del evento o ciclos de duración de la ejecución.
CC
000
001
010
011
100
101
110
111
Significado
deshabilita el contador
cuenta el evento seleccionado para CPL = 0, 1 ó 2
cuenta el evento seleccionado para CPL = 3
cuenta el evento seleccionado independientemente del nivel de privilegio
deshabilita el contador
cuenta los ciclos de ejecución de código de CPL = 0, 1 ó 2
cuenta los ciclos de ejecución de código de CPL = 3
cuenta los ciclos de ejecución de código independientemente del privilegio
Control del pin (PC0 - PC1)
Asociados con CTR0 y CTR1 hay dos pins, PM0 y PM1 (PM0/BP0 y PM1/BP1). Estos
pins pueden ser programados por medio de estos campos para indicar que su contador
asociado fue incrementado o bien que hubo un overflow.
PC
0
1
Señal activa cuando (en) el contador correspondiente
fue incrementado
hubo overflow
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 3/10
RESTRICCIONES DE USO DE LOS MSR
Las instrucciones RDMSR y WRMSR solamente pueden ser ejecutadas bajo nivel de
privilegio cero. Dado que los programas de usuario que se ejecutan bajo un sistema
operativo tienen nivel de privilegio 3 (solamente el S.O. ejecuta en nivel de privilegio
0), no les es posible incluir las instrucciones de lectura y escritura de los MSR.
Se nos ocurren dos posibilidades para que un programa de usuario pueda acceder a estas
instrucciones:
La primera sería cambiar de privilegio, para lo cual sería necesario un sistema operativo
que lo permita (por ejemplo DOS).
La otra opción sería utilizar un S.O. que provea de una interfaz para usar las intrucciones desde privilegio 3.
Hasta donde sabemos ningún sistema operativo cuenta con esta interfaz. La opción es
agregar esta funcionalidad a un sistema operativo existente. Linux, cuyas fuentes son
abiertas y su documentación abundante, resulta ideal porque permite, además, agregar
funcionalidad al kernel en tiempo de ejecución, sin necesidad de volver a compilarlo
una vez modificado.
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 4/10
EL MÓDULO MONITOR
La interfaz deberá darnos la posibilidad de programar el Control and Event Select
Register (CESR), leer los registros contadores (CRT0 y CRT1) y leer el Time Stamp
Counter (TSC).
Intel provee la instrucción RDPMC (read PMC) para leer CRT0 y CRT1 bajo nivel de
privilegio 3. Esta instrucción es soportada por el procesador bajo la condición de que se
active el flag Program Counter Enable del registro de control 4 (CR4.PCE). Este registro
solo puede ser modificado bajo nivel de privilegio 0, por lo que se deberá hacerlo a
través de esta interfaz.
Análogamente, existe la instrucción RDTSC (read TSC). A diferencia de la anterior, el
uso de esta instrucción con nivel de privilegio 3 está habilitado por defecto. Por esto no
será necesaria ninguna intervención de esta interfaz.
En cuanto a la programación de los contadores, es necesario que la interfaz provea la
forma de escribir el CESR.
Las operaciones que provee el modulo monitor son las siguientes:
Código de
operación
0
1
2
3
4
Descripción
Entrada
Salida
Hello. Verifica el funcionamiento del módulo.
Escribe el CESR
Lee el CESR
Resetea CESR
Resetea contadores CRT0 y CRT1
CESR a escribir
-
CESR
-
No se dispone de una operación para setear el flag Program Counter Enable (CR4.PCE)
dado que el módulo se ocupa de hacerlo cuando es cargado.
El módulo monitor atiende con el código de llamada 250 de la int 0x80, que es la que se
utiliza para las llamadas al sistema operativo. El pasaje de parámetros se realiza por
medio de registros. Por lo tanto, la llamada para realizar alguna de estas operaciones se
hace del siguiente modo:
mov ecx, parámetro
mov ebx, cód_op
mov eax, 250
int 0x80
(si es necesario)
El hecho de que estas operaciones sean hechas por medio de una llamada al S.O. genera
un overhead sobre la operación propiamente dicha. Esto debería ser tenido en cuenta en
el momento de realizar las mediciones.
Otra cosa que debería tenerse presente es que los registros de monitoreo no son salvados
durante los cambios de contexto. Esto es, los eventos son monitoreados continuamente
si el CESR está programado, independientemente de qué proceso sea el que se esté
ejecutando. Además no hay restricciones en cuanto a que cualquier proceso puede
acceder a las operaciones del monitor en todo momento.
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 5/10
MODOS DE INSTALACIÓN Y USO
El módulo monitor está compilado para la versión de kernel 2.2.14. Bajo esta versión
solamente es necesario introducir –como root– el comando “insmod monitor.o” desde el
directorio en que se encuentra el archivo “monitor.o”.
Se provee también de los archivos fuentes “mod.c”, “mon.c”, “msr.h” y el Makefile
correspondiente.
A los efectos de simplificar el uso de las funciones del módulo monitor, se agrega una
pequeña librería de macros. En los archivos de código en que éstas sean usadas deberá
incluírse la línea “%include “monitor.mac””.
Macro HELLO
Solo para propósitos de debug. Permite verificar si el módulo se encuentra cargado.
Sintaxis:
HELLO
Entrada:
ninguna
Salida:
Devuelve 0 por eax.
Imprime un mensaje por consola.
Utiliza:
eax y ebx
Ejemplo:
HELLO
Macro PROGRAMAR
Escribe 0 en los contadores CTR0 y CTR1. Genera la palabra de control y la escribe en
el CESR.
Sintaxis:
PROGRAMAR pin0, control0, evento0, pin1, control1, evento1
Entrada:
Las tres primeras entradas programan el contador 0 (CTR0),
las tres siguientes programan el contador 1 (CTR1).
pin0:
Selecciona la función del pin externo (PM0/BP0).
- Si es incr el pin activo indica incremento del contador.
- Si es ovrf el pin activo indica overflow del contador.
control0:
Actúa sobre dos aspectos.
En primer lugar indica si el contador debe incrementarse en cada
ocurrencia del evento o en cada ciclo que dure el evento.
Por otro lado permite decidir sobre la ejecución de código de qué nivel
de privilegio se quiere medir.
- Si es veces012 cuenta la cantidad de ocurrencias del evento que se
produjeron bajo privilegio 0, 1 o 2.
- Si es veces3 cuenta la cantidad de ocurrencias del evento que se
produjeron bajo privilegio 3.
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 6/10
- Si es veces0123 cuenta la cantidad de ocurrencias del evento que se
produjeron independientemente del nivel de privilegio.
- Si es ciclos012 cuenta y acumula los ciclos durante los cuales se
ejecutó en nivel de privilegio 0, 1 o 2.
- Si es ciclos3 cuenta y acumula los ciclos durante los cuales se
ejecutó en nivel de privilegio 3.
- Si es ciclos0123 cuenta y acumula los ciclos durante los cuales se
ejecutó independientemente del nivel de privilegio.
- Si es nada el contador no se incrementa.
evento0:
Selecciona el evento. Constante que identifica el evento.
(Ver Lista de eventos).
pin1:
control1:
evento1:
idem que pin0 pero para CTR1
idem que control0 pero para CTR1
idem que evento0 pero para CTR1
Salida:
Devuelve 0 por eax.
Utiliza:
eax, ebx y ecx.
Ejemplo:
PROGRAMAR ovrf, veces3, 3, ovrf, veces3, 3
Cuenta en el contador 0 las veces que se produjo un miss durante una
operación de lectura de datos por parte del usuario, y en el 1 el mismo
evento bajo cualquier nivel de privilegio (incluyendo los de CPL 3).
La definición de las macros es la siguiente:
SYSMONITOR EQU 250
;pin
incr EQU 0
ovrf EQU 1
;control
nada
veces012
veces3
veces0123
ciclos012
ciclos3
ciclos0123
EQU
EQU
EQU
EQU
EQU
EQU
EQU
0
1
2
3
5
6
7
;HELLO
%MACRO HELLO
mov ebx, 0
mov eax, SYSMONITOR
int 0x80
%endmacro
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 7/10
;escribe el CESR
;PROGRAMAR pin0, control0, evento0, pin1, control1, evento1
%MACRO PROGRAMAR 6
mov ebx,4
mov eax,SYSMONITOR
int 0x80
mov ecx,((%3)+(%2<<6)+(%1<<9)+(%6<<16)+(%5<<22)+(%4<<25))
mov ebx,1
mov eax,SYSMONITOR
int 0x80
%endmacro
Notar que los contadores comienzan a incrementarse en el momento en que se programa
el CESR. La macro que programa el CESR resetea los contadores antes de escribir el
registro.
Para efectuar un conteo entre dos puntos determinados del código debe incluirse una
instrucción RDPMC de lectura del contador correspondiente en cada uno de ambos
lugares y luego calcular la diferencia, de este modo:
PROGRAMAR CESR
—
—
mov ecx, Nro_de_Contador
rdpmc
{salvar edx:eax}
—
—
{código a monitorear}
—
mov ecx, Nro_de_Contador
rdpmc
{recuperar resultados anteriores}
{restar resultados anteriores a los nuevos}
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 8/10
EJEMPLO
Esta es la parte de un programa que busca el máximo de un vector de enteros de 32 bits
de tamaño dado. Si quisiéramos medir la cantidad de saltos efectivamente tomados en
ella, lo haríamos del siguiente modo:
%include “mon.mac”
TAMANIO EQU 12
TAKEN_BRANCHES EQU 32h
VECTOR DD TAMANIO
PROGRAMAR incr, nada, 0, incr, veces3, TAKEN_BRANCHES
mov esi,0
mov ebx,0
(en esi el índice para recorrer el vector)
(en ebx guardamos el máximo, por ahora 0)
mov ecx,1
rdpmc
ciclo:
cmp ebx,[VECTOR+esi*4]
jg sig
mov ebx,[VECTOR+esi*4]
sig:
inc esi
cmp esi,TAMANIO
jne ciclo
(*)
(*)
mov edi,eax
(como seguramente vamos a medir menos de
4294967296 ocurrencias del evento, solo guardamos eax)
;mov ecx,1 (en este caso esta línea no es necesaria porque ecx ya tiene el valor 1)
rdpmc
sub eax,edi
Luego de ejecutar el código del ejemplo, queda en eax el número de saltos tomados. En
este caso el resultado sería TAMAÑO menos uno más la cantidad de veces en que el
valor en la posición del vector es mayor que todos los anteriores.
Notar que las dos instrucciones marcadas con asteriscos se incluyen en la medición. En
este caso en particular no modifican el resultado (porque no son saltos), pero para algún
otro evento podrían significar un overhead inevitable en las cuentas.
Notar también que para algunos eventos solo se puede usar algún contador en particular
(TAKEN_BRANCHES solo puede ser programado en el contador 1).
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 9/10
Para el caso que estamos viendo, medimos los saltos tomados que se ejecutaron con
nivel de privilegio 3, independientemente de si se ejecutaron también saltos pertenecientes a procesos del sistema operativo, ya que estos últimos son de privilegio 0.
De cualquier modo, en un esquema multitarea, podría suceder que este proceso se ejecutara concurrentemente con otro del mismo nivel de privilegio. En este caso se medirían
los saltos tomados de ambos procesos, ya que, como antes mencionamos, los contadores
no son guardados durante los cambios de contexto.
Por otra parte, hay algunos eventos en los cuales la interacción entre procesos es más
fuerte que en otros. Por ejemplo, en el caso de monitorear misses de caché, las mediciones dependerán fuertemente de si otros procesos desalojan o no líneas de caché usadas
por nuestros datos. Un caso de estos podría ser el de las rutinas de administración de
paginación del sistema operativo, que podrían desalojar datos de nuestro proceso y por
lo tanto la cantidad de misses se vería incrementada, a pesar de estar midiendo solamente sobre nivel de privilegio 3.
Notar también que algunos eventos son mediciones de duración. Estos eventos miden
ciclos de clock cuando se los programa como cantidad de ocurrencias (uno de estos
casos es el de MMX_Multiply_Unit_Interlock, que mide número de ciclos de latencia
de multiplicaciones MMX).
Para otra información ver Intel Architecture Software Developer’s Manual, Vol.3, System Programming
(order number 243192), Capitulo 15 y Apéndice A.
Monitoreo de Eventos para Pentium con MMX • Organización de Computadores II • Andrea Katz y Andrés Stoliar • 10/10
Descargar