5.3 Unidades Aritméticas Segmentadas.
Introducción a la segmentación.La segmentación o “pipelining” es la técnica de dividir un determinado procesamiento de la información en etapas independientes que se pueden ejecutar de forma solapada.
Como ejemplos de aplicación en la informática tenemos el diseño de unidades aritméticas segmentadas y el procesamiento de instrucciones en todos los procesadores modernos.
Pero la segmentación comenzó como una idea de Henry Ford, que construyo la primera fábrica moderna de automóviles dividiendo la construcción en etapas diferentes, con material y mecánicos diferentes, lo cual le permitió no producir un coche en un menor tiempo, si no terminar más coches por unidad de tiempo. En la figura siguiente se ilustra este proceso.
Si cada etapa tardaba un día en realizase, y por tanto un coche tardaba 4 días en montarse, con el nuevo método de fabricación, un coche seguía costando 4 días de fabricar, pero cada día salía un coche de la cadena de montaje.
Al segmentar un proceso en k subprocesos tiene las siguientes características: El tiempo total para procesar un dato no cambia.
Unidades Segmentadas (Pipelines) en el computador.
Un sistema se segmenta en etapas. Una etapa es un módulo independiente de procesamiento, con un cierto retardo añadido debido a los registros intermedios de almacenamiento que debemos colocar entre etapas para poder almacenar y estabilizar las señales entre etapas.
Debemos utilizar un reloj que sincroniza el funcionamiento de todas las etapas. El periodo de este reloj lo fijamos dividiendo el tiempo total de procesamiento D por el número de etapas k en que hemos subdividido el procesamiento de la información (en el caso ideal):
T = D/k
siendo D el retardo del sistema original y k el número de etapas utilizadas.
Los registros intermedios permiten independizar el diseño pues permiten dos cosas: 1. Retardos diferentes entre módulos.
2. Retardos diferentes entre las líneas de un mismo modulo.
Pueden diseñarse unidades segmentadas con igual retardo en todos los módulos y por lo tanto sin hacer uso de los registros intermedios. A esta técnica se llama: “maximum rate pipeline”.
Resumiendo, obtenemos una mejora evidente al segmentar: Antes: 1 resultado cada D segundos (o fracción).
Después: tras ejecutar un mínimo de k ciclos de reloj, optemos un resultado cada (D/k) segundos, lo cual implica una mejora de un factor k.
Condiciones para obtener mejora al segmentar: 1- Procesar gran cantidad de datos. 2- Alimentación ininterrumpida de datos.
En un computador la segmentación se aplica principalmente en el procesador (ejecución de instrucciones) y en la unidad aritmética.
Veamos otro ejemplo de cómo segmentar una unidad aritmética de suma de registros de n bits en k=n etapas segmentadas:
Este sumador se puede realizar de forma segmentada. El tiempo total de procesamiento de dos datos (suma de dos datos) aumenta considerablemente, pero si alimentamos de forma ininterrumpida el sumador se obtiene un mejor rendimiento que si utilizamos la unidad de suma secuencial.
Periodo de Reloj.
En el caso ideal tenemos:
τ = D/k
donde τ es el periodo de reloj de un segmento, D es el retardo del circuito original y k es el número de etapas.Pero en un caso real nos vamos a encontrar con tres dificultades: 1 Diseños desequilibrados.
2. Registros intermedios con retardos TR.
3. Desfase en la señal de reloj aplicada en cada etapa TS. Veámoslo en la figura siguiente:
Donde ahora tendremos:
τ = max
ki=1
(τ
i) + T
R+ T
SLa etapa con mayor retardo del diseño segmentado impone el tiempo del periodo de reloj para el diseño segmentado. Y además se suele cumplir la siguiente condición:
Evaluación de las unidades segmentadas.
Las unidades segmentadas suelen utilizar lo que se conoce como tablas de reserva para controlar que etapa está trabajando y sobre que datos. Un ejemplo de tabla de reserva para una unidad segmentada de 4 etapas se puede observar en la figura siguiente:
S1 1 2 3 4 5 6 7 8 9 10
S2 1 2 3 4 5 6 7 8 9
S3 1 2 3 4 5 6 7 8
S4 1 2 3 4 5 6 7
Donde de S1 a S4 son las etapas y [1..10] son los datos que procesan. Aceleración.
La aceleración vendrá dada por la fórmula:
S = T
no_seg/ T
seg DondeTno_seg es el tiempo necesario para procesar n datos en la unidad no segmentada. Tseg es el tiempo necesario para procesar n datos en la unidad segmentada.
En el caso ideal tendremos:
τ
i= τ = D/k
para todoi,
T
R= 0 y T
S= 0
con lo cualT
no_seg= n*D = n*k*τ
T
seg= (k + (n-1)) * τ
S
ideal= T
no_seg/ T
seg= (n*k*τ) / ((k + (n-1)) * τ) = n*k / (k+n-1)
S
max= lim
n∞S = lim
n∞(n*k) / (k+n-1) = k
Pero en un caso real tendríamos:S
real= T
no_seg/ T
seg= (n*D) / ((k + (n-1)) * (max
ki=1
(τ
i) + T
R+ T
S)
Vemos que afecta negativamente a las prestaciones el tener etapas con distinto retardo, el retardo de los registros intermedios y en menor medida el desfase en el reloj aplicado a cada etapa.
Eficiencia.
La eficiencia mide el aprovechamiento de los segmentos de las unidades segmentadas.
µ = (nº de etapas aprovechadas procesando n datos) / (nº de etapas totales)
µ = S/k = n / (k+n-1)
Lo cual nos indica que cuantas más etapas posee una unidad segmentada más datos necesitamos procesar para aprovechar mejor el diseño. Pero por el contrario, mejor rendimiento neto podemos llegar a obtener.
Completar la siguiente tabla:
K=4 K=8 n S
µ
Sµ
1 1 0.25 1 1.125 2 1.6 0.4 1.77 1.22 4 2.3 0.58 10 3 0.75 100 3.88 0.97 1000 3.99 0.99 Productividad.La productividad de un diseño segmentado se define como:
ω= n/[(k+n-1)τ] = µ/ τ
donde la productividad máxima se obtiene cuando:
ω
max=
limn∞ω = 1/ τ
Equilibrado del retardo de las etapas.En un diseño segmentado suele ser bastante común que las etapas diseñadas posean duraciones distintas en tiempo. Y para solucionar este problema se presentan varias soluciones, la primera de ellas es agrupar etapas rápidas, siempre que no excedan en curación a una etapa más lenta. Veámoslo en un ejemplo:
Otra solución más costosa en realización, pero más efectiva en resultados es duplicar la etapa más lenta. Lo vemos en una imagen.
Pero que ocurre cuando no podemos modificar de ninguna manera la duración de las etapas, y esta a su vez poseen irremediablemente diferente duración?. Pues hay varias soluciones.
1) lo peor es hacer que todas las etapas sean tan lentas como la etapa más costosa en tiempo:
Y este problema se agrava si cualquier etapa puede tener cualquier duración. Por ejemplo consideremos un diseño segmentado que posea 3 etapas y que cada una de ellas en un momento dado puede durar entre 1 y 3 ciclos de reloj. Lo mejor es comenzar a ejecutar cualquier etapa, siempre y cuando esté libre.