lunes, 12 de mayo de 2008

DYEC - 11 de Marzo de 2008

Como siempre nada más comenzar, hacemos una recapitulación de la clase anterior.

A continuación vemos un artículo sobre el futuro de los multicores en el que se comentan varias cuestiones como que la famosa Sony PlayStation 3 tiene una CPU con 9 cores pero no funciona con procesamiento simétrico.
Todos los ordenadores que se fabrican hoy en día son de arquitectura Turing.
La ley de Moore, aquella que decía que cada 18 meses se iba a duplicar la velocidad de las CPUs, está hoy en día estancada en los 3.8 GHz; Pero, ha surgido una nueva ley de Moore sobre los núcleos o cores y es que cada 18 meses se van a duplicar el número de cores de las CPUs. Cierto es esto pues hace como que 2 años y medio salieron al mercado los Intel Core Duo que tenían 2 núcleos, a este le siguieron los Core 2 Duo y los Core 2 Quad con 4 núcleos. Actualmente hay varios prototipos con 80 y 160 núcleos pero tendremos que esperar bastante hasta verlos en las tiendas.
Vemos lo último en tarjetas gráficas que viene de parte de Nvidia, la serie Quadro que llegan a tener 128 núcleos.

Hecho esto, comentamos los resultados de la primera práctica y corregimos varios ejercicios de autoevaluación. Al medir prestaciones de un sistema nunca hay que medir el precio, salvo por ejemplo como en casos de una impresora al medir el precio por página imprimida.

Seguimos con el temario:

1.5 Medición de la carga de un sistema

La carga del comando de linux top es el número de procesos que están esperando para ejecutarse.
Uno de los procesos que más tiempo de procesador consume en linux es el network manager que accede de forma gráfica a las redes.
Los Filesystem en linux son ficheros que contienen datos (estructuras de datos) del kernel en disco. Los maps son ficheros de los mapas de memoria.

Para poder medir un sistema utilizamos los profilers que son trozos de código que se insertan dentro de un programa para monitorizar un sistema midiendo diferentes partes de un programa. Identifican partes de un programa que consumen mucho tiempo de ejecución.

Lo más eficiente para programar es utilizar código máquina pero hoy en día es imposible.

Una técnica para hacer más eficiente los procesadores segmentados es la técnica del desenrollado de bucles (loop unrolling). El objetivo es obtener un conjunto de instrucciones no relacionadas que pueden ser usadas para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo. El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos. Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar convenientemente el código (planificación de instrucciones). Para poder planificar convenientemente la ejecución de instrucciones es necesario que el bucle no contenga dependencias entre instrucciones de distintas iteraciones (dependencias loop-carried).

Analizamos un programa con un profile y vemos que el 24% del tiempo lo usa para comprobar los argumentos y el 14% para clonar vectores. Ahora podemos mejorar estas partes que son las que más tiempo consumen haciendo nuestro programa mucho más eficiente.

Existen profilers para todos los lenguajes.

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

Throughput - equivalente al ancho de banda.
Ancho de banda - número de bits que es capaz de procesar un canal.
Baudios - cambios de estado en la línea por unidad de tiempo. No es equivalente a los bits. En un cambio de estado de la línea se pueden procesar 1 o más bits.
Buffer TLB - dirección física donde está almacenada la memoria virtual.

1.5.3. A qué se dedica el tiempo.

No se deben hacer mediciones al pedir un página web porque depende de mucho factores como el servidor, la conexión, la distancia al servidor, etc.
Intentamos ver el vídeo del día que trata sobre como utilizar un profiler con Visual C++.

Vemos la tercera práctica y echamos un vistazo al tema 2.

Entrega de la práctica 2: 31 de Marzo de 2008
Entrega de la práctica 3: 6 de Abril de 2008

para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las
dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo.
El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se
disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el
incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado
el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos.
Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar
convenientemente el código (planificación de instrucciones).
para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las
dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo.
El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se
disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el
incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado
el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos.
Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar
convenientemente el código (planificación de instrucciones).
para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las
dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo.
El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se
disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el
incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado
el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos.
Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar
convenientemente el código (planificación de instrucciones).
para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las
dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo.
El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se
disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el
incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado
el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos.
Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar
convenientemente el código (planificación de instrucciones).
para eliminar los bloqueos producidos por las dependencias de datos. Estos bloqueos pueden ser eliminados si entre las
dos instrucciones que lo producen se inserta un número de instrucciones igual al número de ciclos de bloqueo.
El desenrollado de bucles consiste replicar el cuerpo del bucle un número determinado de veces. De esta manera, se
disponen de más instrucciones para la eliminación de los bloqueos de datos. Es necesario reajustar el
incremento/decremento del puntero, pues en cada iteración se procesan tantos elementos como veces se haya replicado
el bucle. Se eliminan, por tanto, operaciones de incremento/decremento y saltos.
Una vez desenrollado el bucle, hay que renombrar los registros utilizados en diferentes iteraciones para poder reordenar
convenientemente el código (planificación de instrucciones).

No hay comentarios: