lunes, 17 de marzo de 2008

CLASE 11-3-2008

La clase comienza comentando la práctica 1.

Actualidad: Vemos una noticia en la web sobre los sistemas multicore, Nvidia ha creado una gráfica con 128 cores.

¿Cómo se gestiona una gráfica con 128 cores, a 1´35 Hz? Cada uno procesa 3 o 4 bit, de forma simétrica. Esto sirve para procesar texturas…

El número de cores se doblará cada 18 meses, por lo que los cores se deberían dedicar a temas específicos, para aprovechar su capacidad (E/S,..)


A continuación comentan varios ejercicios de autoevaluación.

Seguimos con el temario.


1.5 Medición de la carga de un sistema

Carga del sistema: número medio de procesos que están esperando para ejecutarse.

Para medir la utilización de sistemas informáticos se usan los denominados monitores, que son herramientas de medición que permiten seguir el comportamiento de los principales elementos de un sistema informático cuando éste se halla sometido a una carga de trabajo determinada.

Comprobamos la carga del sistema con el comando top, y matamos al proceso que consume más CPU (sudo kill ), y vemos como baja la carga.

En linux para ver las estructuras de datos se hace con filesystems virtual llamado /proc. Todos los procesos de root aparecen como un fichero (ls –alt).

Los maps son ficheros de los mapas de memoria (cat maps).


1.5.1 Profilers

Los profilers son trozos de código linkados a un programa, y que son llamados cada cierto tiempo para medir el uso de esa parte del programa. Hay dos tipos: por muestreo y por poling.

Estos nos ayudan a detectar el código que el programa ejecuta más veces o tarda más (subrutinas,..). Una vez detectado, modificamos el código (por ejemplo cambiando por algoritmos más eficientes como Quicksort, o actualizando el valor de las variables antes de los bucles en lugar de dentro,..). Con está práctica el programa será mucho más rápido.

Otro método para disminuir el tiempo de ejecución, aunque poco aconsejado es desenrollar un bucle (copiar las veces que se ejecuta el bucle seguidas).
Para compilarlo se pone la opción -pg en la línea de comandos (
bash$ gcc -pg mipogama.cpp -o mipogama).

Gprof-> Segundos que tarda cada subrutina, número de llamadas (no es igual gastar mucho tiempo en realizar muchas llamadas que en pocas), número de milisegundos por llamada.

Ejemplo. Ejecutamos un programa y vemos que el 2% del tiempo clona vectores, un 14% del tiempo lo consume en comprobar el número y la corrección de los parámetros que le pasamos…, por lo que estas serían las partes del programa que deberíamos mejorar.

Existen profiler en todos los lenguajes de programación (Java, php, C...)

1.5.2 Métricas de la carga de trabajo más comunes.

Se usan para ver lo bien/rápido/lento que va nuestro sistema.

  • Throughpout: número de peticiones procesadas en la unidad de tiempo, es del tipo mas es mejor (por ejemplo, en una impresora el número de páginas que imprime por unidad de tiempo).
  • Tiempo de respuesta: tiempo que se tarda en procesar una petición, por tanto opuesto del throughput.
  • Eficiencia: diferencia entre throughput máximo y el throughput efectivo (por ejemplo, en ADSL es el número de bytes reales recibidos por unidad de tiempo).
  • Ancho de banda: bits por segundo que es capaz de procesar el sistema, no confundir con baudios que son cambios de estados en la línea en la unidad de tiempo.
  • Porcentaje de utilización de diversos componentes y solapamiento entre los mismos. A mayor solapamiento mayor eficiencia.
  • Overhead: tiempo usado en tareas que no son directamente del usuario.
  • Factores relacionados con la multiprogramación: como el tiempo usado en cambiar de contexto.
  • Factores relacionados con la memoria virtual: fallos de página, swapping.
  • Factores relacionados con la memoria caché: número de veces que se vacían los buffer TLB.
  • Otros subsistemas: red, gráficos...



1.5.3 A qué se dedica el tiempo

Antes de intentar mejorar las prestaciones de cualquier sistema, es decir, hacerlo más rápido (al menos en algún aspecto), hay que saber en qué invierte el tiempo el sistema.
Para medir el tiempo que tarda en ejecutarse un programa, una de las medidas básicas de las prestaciones de cualquier sistema, se puede ejecutar una utilidad tal como /bin/time, /usr/bin/time o timex, que son el equivalente en las dos versiones del sistema operativo; y que son diferentes a una función del shell, también llamada time.

  • Tiempo de usuario: tiempo que se tarda en ejecutar el código del usuario.
  • Tiempo del sistema: tiempo que se tarda en hacer las llamadas, funciones de kernel...
  • Tiempo de Entrada/Salida: tiempo que se pasa esperando a que algo suceda (que el usuario pulse el ratón, introduzca datos...)


Explicamos la práctica 3, uso de un profiler. En ella hay que interpretar lo que dice el profiler (la mayor parte del tiempo se gasta en tal subrutina...).

Para nota, mejorar el programa y poner los tiempos de ambos o indicar posibles mejoras. No confundir el tiempo de llamada con el de ejecución.


También concretamos las fechas de entrega de las prácticas 2 y 3:

Practica 2-> 31 Marzo.

Práctica 3-> 6 Abril


Para finalizar vemos el video del día: profiling de una aplicación web con C++.

No hay comentarios: