700 likes | 1.04k Views
Estructuras segmentadas. Noción de segmentación Rendimiento. Tipos de cauces. Cauces no lineales y tablas de reserva. Cálculo de latencias en cauces. Segmentación de instrucciones Arquitectura DLX. Encauzamiento de instrucciones en el DLX. stallses. Múltiples unidades funcionales.
E N D
Estructuras segmentadas Noción de segmentación Rendimiento. Tipos de cauces. Cauces no lineales y tablas de reserva. Cálculo de latencias en cauces. Segmentación de instrucciones Arquitectura DLX. Encauzamiento de instrucciones en el DLX. stallses. Múltiples unidades funcionales.
Noción de segmentación • ¿Qué es la segmentación o pipelining? • Técnica para la generación de paralelismo en monoprocesadores. • Consiste en dividir una función en subfunciones independientes que pueden realizarse simultáneamente (trabajo en cadena). • En un instante determinado, se está trabajando sobre un número de elementos igual al número de etapas => paralelismo.
Etapas del cauce Evolución de los elementos a través de las etapas del cauce:
Mejora del rendimiento • Suponemos que se cumple aproximadamente: • T0 => tiempo en ejecutar el proceso completo sin segmentar • T => tiempo en ejecutar una etapa • k => número de etapas de que consta el cauce • Sin embargo, el tiempo en ejecutar n procesos sin segmentar:
Mejora del rendimiento • El tiempo en ejecutar el proceso segmentado sobre 1 elemento en k etapas será: • Y desde que sale el primer resultado del cauce, va saliendo uno nuevo cada T, por lo que el tiempo de procesar n elementos será: • Con todo esto, la ganancia es:
Rendimiento Limite • Observemos que la ganancia límite, cuando n tiende a infinito, es k:
Requisitos para la segmentación • Características del proceso necesarias para poder aplicar segmentación: • Se debe poder descomponer en etapas. • Es necesario que las entradas de una etapa estén determinadas únicamente por las salidas de la anterior. • Cada etapa debe poder ser realizada por un circuito específico de forma más rápida que el conjunto del proceso. • Los tiempos de ejecución de cada etapa deben parecidos.
Tipos de cauces • Tipos de cauces: • uní función: ejecutan un único proceso. • multifunción: pueden ejecutar varios procesos: • estáticos: en un instante determinado sólo pueden ejecutar uno. • dinámicos: pueden ejecutar simultáneamente varios procesos. • lineal: a cada etapa sólo le puede seguir otra etapa concreta. • no lineal: se pueden establecer recorridos complejos de las etapas.
Aplicaciones • Aplicación de la segmentación: • A operadores aritméticos: • n ejecutan una o varias operaciones de la ALU. • n pueden ser lineales (sumas) o no lineales (división). En este caso suelen ser cíclicos (bucles). • n los procesadores actuales incluyen varias ALUs segmentadas, y cada una se puede ocupar de varias operaciones. • A ejecución de instrucciones: • suelen ser cauces lineales. • alguna de sus fases puede a su vez sub-segmentarse (uso de una ALU segmentada para la fase de ejecución).
Tablas de reserva • Cauces no lineales y tablas de reserva
Latencia • Latencia: • número de ciclos que separan la iniciación de dos operaciones (la distancia en ciclos entre las entradas de dos elementos al cauce) Latencia prohibida: latencia con la que se producen colisiones (en el ejemplo, 1 es una latencia prohibida) Latencia permitida: latencia con la que no se produce colisión (en el ejemplo, 2 es una latencia permitida)
Ciclos de latencia • Ciclo de latencia: • secuencia de latencias permitidas que se puede repetir indefinidamente. • Ejemplo. Para la función B, se tiene que (1,4) es un ciclo de latencia:
Segmentación de instrucciones • Segmentación de instrucciones • Arquitectura DLX. • Encauzamiento de instrucciones en el DLX. • stallses: • por dependencia estructural, • por dependencia de datos, • por dependencia de control. • Múltiples unidades funcionales.
Formato de instrucciones DLX • Carga/almacenamiento y operaciones con valores inmediatos, saltos condicionales: • Operaciones aritméticas: • Saltos incondicionales:
Ciclos de cada instrucción • Ejecución de instrucciones en 5 ciclos
DLX encauzado • Etapas del cauce • Búsqueda (IF) • se accede a memoria por la instrucción, • se incrementa el CP. • Decodificación / Búsqueda de operandos (ID) • se decodifica la instrucción, • se accede al banco de registros por los operandos, • se calcula el valor del operando inmediato con el signo extendido (por si hace falta más adelante). • WB MEM EX ID IF • se almacena el resultado (si lo hay) en el banco de registros.
Máquina segmentada • Máquina segmentada
Ejecución de instrucciones segmentadas • Ejecución de instrucciones segmentadas
Ejecución de instrucciones segmentadas • Ejecución de instrucciones segmentadas
Ejemplo de ejecución de instrucciones • Ejemplo de ejecución de instrucciones
Efecto de los stallses • Efecto: el rendimiento disminuye del máximo teórico. • La ganancia de rendimiento, a reloj constante, es: • Máximo teórico: número de etapas del cauce.
Ejemplo de stole • Ejemplo: • una instrucción de carga seguida de otras varias (la máquina tiene un único puerto de memoria).
Ejemplo del efecto del stole • Efecto: • el load y la instrucción 3 tienen un conflicto: compiten por el puerto de memoria. El stole en el cauce:
stallses por dependencia estructural • Las limitaciones en los recursos implican stallses estructurales: • 1 puerto de memoria en lugar de 2; (fetchó acceso a memoria). • 1 ALU en lugar de 2; (incremento PC ó instrucción de proceso). • banco de registros con pocos puertos; (lectura ó escritura). • Solución a los stallses estructurales: • añadir más recursos, buscando un equilibrio entre rendimiento y coste.
stallses por dependencia de datos • Código con dependencia de datos
Adelanto de resultados • Solución a los stall ses por dependencia de datos: • reenvío/adelanto de resultados (bypassing, forwarding). • La instrucción 1, que calcula el nuevo valor de R1, lo tiene listo al final del ciclo 3. • La instrucción 2, que lo lee, en realidad necesita que esté listo al principio del ciclo 4. • Se puede modificar la ALU con una realimentación, para que el nuevo valor de R1 vaya de la salida a la entrada (además, sigue siendo enviado al banco de registros en la fase WB).
Ejecución con adelanto • La ejecución queda ahora:
Adelanto de resultados • Adelanto de datos
Problemas del adelanto de resultados • Observaciones al adelanto de resultados: • Se deben habilitar caminos de realimentación de todas a todas las unidades: de la ALU a memoria, de la ALU a la ALU, etc. • Las dependencias se dan entre instrucciones de todos los tipos. • Hay que tener en cuenta que el control se complica aún más: • hay que decidir cuándo se realimenta un resultado, controlar la realimentación, etc. • Aun así, puede no ser suficiente; por ejemplo, si una instrucción de memoria genera un dato para una operación de la ALU: • lw r1,0(r2) • sub r4,r1,r5
Dependencias de datos: clasificación • Clasificación de las dependencias de datos: • Lectura después de Escritura (RAW, dependencia): • una instrucción genera un dato que lee otra posterior (la que hemos visto hasta ahora). • Escritura después de Escritura (WAW, dependencia en salida): • una instrucción rescribe un dato que otra posterior ya había escrito; • en una máquina segmentada simple sólo se da si se permite que las instrucciones se adelanten unas a otras. • Escritura después de Lectura (WAR, antidependencia): • una instrucción modifica un valor antes de que lo lea otra instrucción anterior; • tampoco se puede dar en nuestro cauce.
Ejemplos de dependencias de datos • Ejemplos: • RAW: • add r1,r2,r3 • add r4,r1,4 • WAW: • lw r1,0(r2) • add r1,r2,r3 • WAR: • sw r1,0(r2) • add r1,r3,r4
Reordenación de instrucciones • Aprovechamiento del cauce: reordenación de instrucciones • Se trata de calcular: • a = b + c • d = e - f • g = a + d
Reordenación de código Código inicial Código reordenado
Eficacia de la reordenación • Eficacia de la reordenación
stallses por dependencia de control • stallses por dependencia de control • Hasta ahora: el CP se actualiza en la fase de búsqueda (fetch). • Si en el cauce entra un salto, hay dos instrucciones que pueden ser la siguiente que hay que buscar: • la que está a continuación del salto, o bien • la que es el destino del salto. • Problema: necesitamos saber ya cuál es la siguiente instrucción que vamos a meter en el cauce, pero: • si es un salto condicional, aún no se sabe cuál de las dos es la correcta (se sabe en la fase EX); • en cualquier caso, el contador de programa incrementado se almacena en la fase (WB).
stallses por dependencia de control • Esto sólo sería importante si, en el código, el porcentaje de saltos (tomados y no tomados) es significativo.
Estadísticas de saltos • En promedio, para enteros: • 13% de instrucciones son saltos condicionales hacia delante, • 3% de instrucciones son saltos condicionales hacia atrás, • 4% son saltos incondicionales. • Estos datos dependen fuertemente de las optimizaciones que use el compilador, pero como orientación sirven. • Resumiendo: • 1 de cada 5 instrucciones es un salto. • Conclusión: sí hay que tener en cuenta los saltos.
Estrategias frente a los saltos • ¿Qué se puede hacer? • Plan A: • en cuanto veamos que una instrucción es un salto, paramos el cauce, hasta que sepamos adónde salta; • sabemos si es un salto en la fase ID; • conocemos el destino en MEM (usando realimentación). • Total: 3 ciclos de stole. • Si el porcentaje de saltos es del 30%, y el CPI ideal es 1, la máquina tiene una ganancia del 50% del máximo teórico aproximadamente. • Conclusión: No interesa.
Estrategias frente a los saltos • ¿Qué se puede hacer? • Plan B: • intentamos averiguar, en una fase anterior, si el salto se toma o no; • vamos calculando el destino lo antes posible, por si acaso hace falta; • por ejemplo, en la fase de decodificación (ambas). • Total: 1 ciclo de stole. • Necesitamos un recurso adicional (un sumador). • Si el porcentaje de saltos es del 30%, y el CPI ideal es 1, la máquina tiene ahora una ganancia del 77% del máximo teórico, aproximadamente. • Conclusión: Puede interesar.
Tratamiento de los saltos • Formas de tratar un salto en el flujo de instrucciones: • no hacer nada: • es el esquema más sencillo (y barato), • también es el que peor rendimiento da; • suponer que el salto no se va a tomar: • se siguen buscando instrucciones a continuación del salto, • en caso de que se tome, se invalidan; • suponer que el salto se va a tomar: • se calcula el destino, y se empieza a buscar por él • en nuestra máquina no es viable: se conocen el sentido y el destino a la vez => no es suposición, es certeza • retardar la ejecución del salto: • ejecutar la instrucción siguiente, tanto si el salto se toma, como si no.
Opción “suponer salto no se toma” • Opción: suponer que el salto no se toma.
¿Tomamos salto o no? • Porcentaje de saltos tomados sobre el total de ejecutados:
Opción “suponer salto se toma” • En promedio: • En programas de enteros, el 62% de los saltos ejecutados se toman. • En programas de coma flotante, el porcentaje sube al 70%. • Por lo tanto: • sería más interesante la opción de suponer que el salto se va a tomar (es más probable). • Problema: • para buscar la instrucción destino del salto, es necesario calcularla; • en nuestra máquina, este valor se obtiene en la fase ID; • para entonces, también sabemos si el salto se toma o no, por tanto ya no es necesario suponer.
Opción “retardar el salto” • Opción de ejecución retardada del salto. • Cuando se llega a un salto, la siguiente instrucción se ejecuta, tanto si el salto se toma como si no se toma (delay-slot). • Implicaciones: • a la hora de generar código es necesario tener esto en cuenta • => cambio en la compilación / programación; • el número de instrucciones, situadas a continuación de un salto, que se ejecutan puede variar con la arquitectura; • a veces no es posible utilizar el delay-slot para hacer trabajo útil • => nop’s.
Relleno del delay-slot • Diferentes posibilidades para rellenar el delay-slot.