INGENIERÍA DE COMPUTADORES II
INGENIERÍA DE COMPUTADORES 11 Sebastián Dormido Canto José Sánchez Moreno Victorino Sanz Prat
Departamento de Informática y Automática E.T.S.I . Informática, UNED Madrid,2011
sanz y torres
INGENIERíA DE COMPUTADORES" Todos los derechos reservados. Queda prohibida, salvo excepción prevista en la ley, cualquier forma de reproducción, distribución, comunicación pública y transformación de esta obra sin contar con la autorización de los autores y/o editores. La infracción de los derechos mencionados puede ser constitutiva de delito contra la propiedad intelectua l.
© Sebastián Dormido Canto. José Sá nchez Moreno y Victorino Sa nz Pral
© EDITORIAL SANZ y TORRES, S. L.
el Pinos Alta. 49 - 28029 Madrid ~
902 400 415 - 9 1 314 55 99 www.sa nzytorres.com
[email protected] www.sa nzytorres.co mjeditorial
[email protected] ISBN: 978-84-92948-60-4 Depósito legal: M·2841 4-2011
Porta da: Masterline. S. lo
el las Minas,
1. 28250 Torrelodones (Madrid)
Composición: Autores Impresión: Ed igrafos, S. A.
el Volta, 2,
Encuadernación: Felipe Méndez, S. A.,
el
PoI. Ind. Sa n Marcos, 28906 Getafe (Madrid )
Del Carbón, 6 y 8 . Poi. Ind. San José de Valderas 2, 28918 Leganés (Madrid)
Contenidos
Contenidos
m
Prefacio
vu
l. Procesadores segmentados 1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7.
1.8.
1.9. 1.1 O. 1. 11. 1.12. 1.1 3.
Guión-esquema . . . . Introd ucción . . . . . . . . . . . . . . . . . . . Procesadores RISC fren te a procesadores CISC C lasificación de las arq uitecturas paralelas Evaluación y mejora del rend imiento de un computador . Características de los procesadores segmentados. A rquitectura segmentada genérica . . . . . . . . . .. . 1.7. 1. RepertOlio de instrucciones de la ASG . . . . . 1.7.2. Implementació n de la segmentación de instrucciones en la ASG Riesgos en la segmentación . . . . . . .. . 1.8.1. Riesgos estructurales . . . . . . . . . . 1.8.2. Riesgos por dependencias de da tos .. 1.8.2. 1. La reorganizac ión de código. 1.8.2.2. El interbloqueo entre etapas 1.8.2.3. E l adelantamiento (caminos de bypass o forwardillg) . 1.8.3. Riesgos de control . . . . . . . . Pl anifi cación dinámica: Algoritmo de Tomasulo Resumen . . . . . . . . . . Refere ncias . . . . . Preguntas de autoevaluación Acti vidades . . . . . . . . .
1
2
3 6 13 18
20 22 25 30 31 34
36 38
40 41
47 58 58 59
63
INGENIERíA DE COMPUTADORES 11
2. Procesadores superescalares 2.1. 2.2. 2.3. 2.4. 2.5.
2.6.
2.7.
2.8. 2.9. 2.10.
IV
Guión-esquema . . . . . Introducción. . . . . . . Características de los procesadores superescalares Arquitectura de un procesador superescalar genérico Lectura de instrucciones . . . . . . 2.5. l. Falta de alineamiento . . . . 2.5.2. Rotura de la secuencialidad 2.5.3. Tratamiento de los saltos .. 2.5.4. Estrategias de predicción dinámica. 2.5.4.1. Predicción de la dirección de destino de salto mediante BTAC . 2.5.4.2. Predicción de la dirección de destino de salto mediante BTB con historial de salto . . . . . . . . . . . . . 2.5.4.3. Predictor de Smith o predictor bimodal . . . . . . . 2.5.4.4. Predictor de dos niveles basado en el historial global 2.5.4.5. Predictor de dos niveles basado en el historial local 2.5.4.6. Predictor de dos niveles de índice compartido gshare 2.5.4.7. Predictores híbridos . . . . . . .. . . . . . . 2.5.5. Pi la de dirección de retomo . . . . . . . . . . . . . 2.5.6. Tratamiento de los errores en la predicción de los saltos Decodificación . . . . . . . .. . . 2.6.1. Predecodificación .. . . .. 2.6.2. Traducción de instrucciones Distribución . . . . . . . .. . . . . 2.7.1. Organización de la ventana de instrucciones 2.7.2. Operativa de una estación de reserva individual 2.7.2.1. Fase de distribución 2.7 .2.2. Fase de supervisión 2.7.2.3. Fase de emisión . . 2.7.3. Lectura de los operandos. . . 2.7.4. Renombramiento de registros 2.7.4. 1. Organización independiente del RRF con acceso indexado . 2.7.4.2. Organización independiente del RRF con acceso asociativo 2.7.4.3. Organización del RRF como parte del buffer de reordenarniento 2.7.5. Ejemplo de procesamiento de instrucciones con renombramiento . Terminación. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Retirada . . . . . . . . . . . . . . . .. . . . . .. . . . . . . . . . . . . . Mejoras en el procesamiento de las instrucciones de carga/almacenamiento 2.10.1. Reenvío de datos entre instrucciones de almacenami ento y de carga
71 71 72 73
78 87 89 91 94 94 95
100 102
103 105 106 107 107 109 112 114 117
120 12 1 124 129 130 131 135 143 147 151 152 154
163 170 174 174
CONTENIDOS
2.10.2. Terminación adelantada de las instrucciones de carga 2.1 1. Tratamiento de interrupciones . . . ... . 2.11.1 . Excepciones precisas con buffer de reordenamiento . 2. 12. Limitaciones de los procesadores superescalares . . . . . . . 2.1 3. Resumen: Una visión global del núcleo de ejecución dinámica 2. 14. Referencias . . . . . . . . . 2.15. Preguntas de autoeval uación 2. 16. Actividades . . . .
3. Procesadores VLIW y procesadores vectoriales 3.1 . Guión-esquema . . . . . . . . . . 3.2. Introducción .. . . . . . . . . . . . . . . . 3.3. El concepto arquitectónico VLIW . . . . . 3.4. Arq uitectura de un procesador VLIW genérico 3.5. Planificación estática o basada en el compi lador 3.6. Desenrollamiento de bucles. 3.7. Segmentación software .. 3.8. Planificación de trazas . . . 3.9. Operaciones con predicado . 3.10. Tratamiento de excepciones. 3.11. El enfoque EP[C . . . . . . 3.1 2. Procesadores vectoriales .. 3.13. Arquitectura vectorial básica 3.14. Repertorio genérico de instrucciones vectoriales 3.15. Medida del rendimiento de un fragmento de código vectorial 3.16. La unidad funcional de carga/almacenamiento vectorial 3.17. Medida del rendimiento de un bucle vectorizado. 3.18. Resumen: Visión global y perspectivas de futuro . 3.19. Referencias .. . . . . . . . 3.20. Preguntas de autoevaluación 3.2 1. Actividades . . . . . . . . .
4. Procesamiento Para[elo 4.1. Guión-Esquema .. 4.2. Introducción . . . . 4.3. Tipos de plataformas de computación paralela 4.3.1. Organización basada en la estructura de control 4.3. 1.1. Paradigma Maestro/Esclavo . . . . . 4.3.1.2. Paradigma SPMD (Single Program Multiple Data) . 4.3.2. Organización basada en el modelo de comunicación
177 180 188 190
191 193
194 201
209 209 210 2[2 215
2[8 22 1 224
228 235 239
239 242 244 250 255
258 264 274
277 278 291 299 299
300 301 301 303 304
305 v
ING ENIERíA DE COMPUTADORES 11
4.4.
4.5.
4.6.
4.7. 4.8 . 4.9. 4. 10.
4.3.2.1. Espacio de direcciones compartido 4.3.2.2. Paso de mensajes Sistemas de memoria compartida. 4.4. 1. Redes de interconex.ión . . . 4.4. 1.1 . Redes estáticas .. 4.4. 1.2. Caracteri zación de redes estáticas 4.4. 1.3. Redes dinámi cas . .. . 4.4. 1.4. Comparación del rendimi ento de redes dinámicas 4.4.2. Protocolos de coherencia de caché . . . . . . Sistemas de memoria di stribuida . . . . . . . . . . . 4.5. 1. Consideraciones general es sobre los c1u sters 4.5.2. ¿Por qué c1usters? . . . . . . . . . 4.5.3. ¿Cuándo y cómo utili zar UD cluster? 4.5.4. Programación de c1usters . . . . . . Rendimi ento y costes en sistemas paralelos 4.6. 1. Factores que influyen en la velocidad computacional 4.6. 1.1. Granul atidad de los procesos . 4.6. 1.2. Factor de aceleración (speedup) 4.6. 1.3. Ley de AmdahJ 4.6. 1.4. Efi ciencia .. 4.6. 1.5. Coste... . . . 4.6.1 .6. Escalabilidad .. 4.6.1 .7. Balance de carga . 4.6.2. Costes de la comunicación med.i ante paso de mensajes 4.6.3. Costes de la comunicación mediante memori a compat·tida Resumen . . . . . Referencias . . . . . . . . . Preguntas de autoevaluación Acti vidades . .. . . . .
30': 30S 3 1C 3 11 3 11 3 18 3 19 327 327 333 336 336 339 34 1 342 342 342 343 345 347 348 348 349 352 355 357 358 358 363
A. Memoria Virtual
367
Índice
377
VI
PREFACIO
Objetivos El obje/ivo básico del libro Ingeniería de COl11pu/adores II es proporcionor una visi6n lo más c011lple/a posible de los fundame/1/os en que se apoya el disefio de los dijeren/es tipos de procesadores que ¡lIcOIporan los computado res actuales así como describi r los esqllemas y elementos básicos que se u/i1izan en el disefio de los cOl11pu/adores orien/ados al procesamielllo paralelo, es/o es, los denominados, genéricamente, multip rocesado res y multicomputadores. Los contenidos de este texto constituye n una continuación de los temas tra tados en el libro "Ingeniería de Computadores 1", publicado en esta mi sma edi torial. Si en "Ingenielia de Com putadores 1" se estudia la arquitectura, organi zac ión y di seño de computadores pOlliendo el foco en cada uno de los elementos básicos q ue consti tuyen un computador, en este li bro se estudian algunas de las técnicas más util izadas para mejorar las prestaciones, es decir, el tiempo que se tarda en ejecu tar un conj un to de inso·ucciones. Estas técnicas para mejorar el rendimien to se suelen agru par en dos grandes categorías: el paralelismo fu ncional yel paralelismo de datos. De forma escueta, el paralelismo funcional pretende mejorar las prestaciones de un computado r en base a la ejecución en paralelo de instrucciones , fu nciones, procesos o programas. E l paralelismo de datos se basa en el diseño de procesadores con repertorios de instrucciones que sean capaces de procesar un conj unto de datos de forma continua y sin detenciones, como si fue ra un único dato, Alrededor de estas dos formas de paraleli smo se articu la el contenido de los cuao'o capítulos del li bro, Como representantes del paralelismo func ional a nivel de instrucción se tratan los procesadores segmentados (Capítulo 1), los procesado res superesca lares (Capítu lo 2) y los procesadores VLlW (Capítu lo 3), y como forma de paralelismo de datos se estudi an los procesadores vectoriales (Capítulo 3). Dado que ambas aproximaciones presentan limitaciones que impiden por si solas una mejora sostenida y permanente de las prestaciones de un procesador, el texto se completa con un cuarto capítul o sobre mu ltiprocesadores y mul tico mputadores, es dec ir, computadores constru idos en base a la uni ón y replicación de procesadores individuales, Por ello, e l Capítulo 4 se centra en computadores que pueden explotar de fo rma sim ul tánea las ventaj as que brindan el paraleli smo funcional y el de datos.
INGENIERíA DE COMPUTADORES 11
A quién va dirigido este texto Ingeniería de Computadores II está concebido como texto base de la asignatura que con el mismo nombre, Ingeniería de Computadores l/, tienen que cursar obligatoriamente los alumnos de la Escuela Técnica Superior de Ingeniería Informática de la UNED en el 2° curso de los Grados de Ingeniería lnformática y de Tecnologías de la lnformación. Es una asignatura que pertenece a la materia denom.inada Ingeniería de Computadores, materia com.ún a ambos grados y compuesta por tres asignaturas, siendo ésta la que se puede considerar de carácter intermedio. La ubicación de Ingeniería de Computadores l/ en los planes de estudio de los dos grados impone una serie de li gadu ras sobre la estructuración de sus contenidos y la forma de desarrollarlos . Por un lado, los contenidos tienen que ser una conti nuación natural de lo estud iado previamente en lngeniería de Computadores I pero, al mismo tiempo, deben constituir un punto de partida para poder abordar nuevos temas en la tercera asignatura de la materia que aborda el estudio del diseño de los computadores actua les. El texto también puede resultar de gran utilidad a estudiantes y profesores de Facultades de Ciencias y Escuelas de Ingeniería que tengan incluidas en sus planes de estudio materias relacionadas con la ingeniería de computadores.
Organización del texto De acuerdo con sus contenidos y en función del posicionamiento de la asignatura a la que sirve de texto base, el libro se encuentra estructurado en dos bloques. El primer bloque, que podría titularse mejora de prestaciones en arquitecturas monoprocesador, está formado por los tres primeros cap ítulos y es una continuac ión natural y progresiva de los conceptos estudiados en Ingeniería de Computadores l. El segundo bloque, que podría denominarse arquitecturas y procesamiento paralelo, consta de un único capítu lo y contiene los conceptos necesarios para establecerse como el punto de partida para los temas de procesamiento distribuido y programación paralela que se estud ian en algunas asignaturas ubicadas en el segundo y tercer curso de los grados que oferta la UNED en materia de ciencias de la computación.
Capítulo 1: Procesadores segmentados En este capítu lo se estudia el concepto de segmentación, pieza básica y fundamental sobre la que se articu la el diseño de los procesadores de las últimas décadas. La segmentación constituye una técnica de implementación de procesadores mediante la cual se solapa la ejecución de múltiples in strucciones, explotando el paralelismo e ntre las instrucciones que componen un programa y permitiendo descomponer la ejecución de una instrucción en un número fijo de etapas donde cada cada una representa una fase del procesamiento de la instrucción. El disponer de varias etapas permite que en cada una de ellas haya una instrucción en un estadio diferente de su procesamiento y, por lo tanto, en un instante dado puedan llegar a estar ejecutándose en el procesador tantas instrucciones como etapas. Cada etapa se encuentra conectada con la anterior formando un cauce (o pipeline) por cuyo ex tremo entra la instrucción , se procesa en las VIII
sucesivas etapas de la segmentación o segmentos y, concluida la ejecución, sale por el otro extremo. Un simil muy utilizado para visualizar de forma rápida el concepto de segmentación es el de las cadenas de fabricación de automóv iles. Evidentemente, la segmentación no está carente de problemas siendo los más habituales las interdependencias que ex isten entre las instrucciones en mateIia de operandos. En este capítulo no solo se estudia el concepto de segmentación, utili zando para ello una segmentación genérica bás ica pero reflejo de las reales, si no que se analizan en detalle' los problemas que surgen y se estudian algunas de las soluciones adoptadas.
Capítulo 2: Procesadores superescalares La mayoría de los procesadores que se utilizan en los computadores actuales, ya estén orientados al mercado domésticos como al científi co o al industrial, se basan en segmentaciones capaces de procesar varias instrucciones simultáneamente y de forma desordenada, de ahí su denominación de procesadores superescalares. En este capítulo se estudia la arq uitectura de un procesador superescalar genérico, muy simil ar a la de los procesadores comerciales aunque más sencilla debido a su carácter didáctico. Rec urrie ndo a esta arqui tectura superescalar, se anali za cada una de las etapas que intervienen en el
procesam iento de los diferentes tipos de instrucciones (carga/almacenamiento, aritmético- lógicas, saltos, bifurcaciones) y se estudian las soluciones dadas por los investigadores y la industria a los problemas que se plantean en cada una de ellas. A lo largo de todo el capítulo se introducen numerosos ejemplos didácticos y se descIiben paso a paso con el fi n de poder comprender con total claridad determinados puntos que pueden presentar cierta complejidad. Además, se analizan las limitaciones que presentan este tipo de arquitecturas de procesador para crear computadores cada vez más potentes.
Capítulo 3: Procesadores VLIW y procesadores vectoriales En este capítulo se introducen dos nuevas filosofías para el diseño de procesadores que, aunque basadas en la segmentación, introducen formas alternativas para mejorar el rendimiento. Los procesadores VLfW se caracteri zan por utilizar internamente instrucciones compuestas de varias instrucciones u operaciones básicas de fonTIa que se maximi za el uso de las múltiples unidades func ionales que poseen. Este aspecto pone de manifiesto la gran importancia que tiene el di seño de compiladores para procesadores VLIW que tengan en cuenta la arquitectura interna del procesador y que generen código objeto acorde con sus características. Esto pone de relieve los inconvenientes de esta filosofía de diseño: la necesidad de disponer de compiladores altamente especializados y los problemas de incompatibilidad ya que el código objeto que se genera para un procesador VLIW tiene en cuenta las latencias y el número de unidades funcionales de ese procesador lo que provoca que sea ineficiente si se pretende ejecutar en otro procesador VLlW con características diferentes. Por otro lado, los procesadores vectoriales se caracteri zan por proporcionar operadores de alto nivel que trabajan sobre vectores, no sobre valores escalares. Así, una operación vectorial tomaría dos vectores de 11 elementos, realizaría la con espondiente operación aritmética con ellos y generaría como resul tado un vector de 11 elementos. Por lo tanto, una instrucción vectorial es equivalente a un bucle constituido por IX
INGENIERíA DE COMPUTADORES 11
instrucciones secuenciales, donde en cada iteración se realiza una operación aritmética y se genera uno de los elementos del resul tado. Aunque los computadores basados en procesadores vectori ales tu vieron su máx imo apogeo en la década de los 80 como punta de lanza de la supe rcomputaci ón científi ca, y habiendo sido superados por los mu ltiprocesadores y multi computadores, paradójicamente hoy en día se encuentran más accesibles que nunca. Ello se debe a que los actuales procesadores superescalares incorporan en su repertorio de instrucciones un conj unto de instrucciones vectoria les, conocidas como instrucciones SIMD , que permiten mejorar el rendimiento de las apli caciones multimedi a por lo que todos los procesadores incorporan una o dos unidades func ionales específi cas para el tratamiento de las instrucciones SIMD.
Capítulo 4: Procesamiento paralelo Hasta llegar a este punto, todo lo que se ha estudiado en los tres capítulos prev ios estaba orientado a la mejora de las prestaciones de computadores construidos con un único procesador. Si n embargo, se sabe que los sistemas basados en un único procesador presentan limi tes e n el re ndim iento que pueden alcanzar, por lo que la tendencia que se ha establ ecido es la de construir máquinas dotadas de vatios procesadores , pudiendo oscilar el número de procesadores desde unos pocos , como sucede en los computadores orientados al ámbito doméstico o empresari al, hasta alcanzar los c ientos de miles en sistemas orientados a la computación de alto rendimiento. Evidentemente, esta tendencia, basada en el incremento de rendimiento en base a la suma de procesadores, va unida a toda la investigación que se continúa rea lizando para mejorar las características de los procesadores a ni vel indiv idual (consumo de energía, disipac ión de calor, tamaño, veloc idad, etc.), ya se trate de procesadores superescalares, vectoriales o VLIWs . En este capítulo se presentan las arquitecturas más relevantes para construir computadores dotados de varios procesadores, es decir, sistemas de computación conocidos de forma coloqui al como co mputadores parale los. Para avanzar de fonna ordenada y comprensible en la explicación de los diferente tipos de plataforma de computac ión paralela que existen en la actuali zad, se rec urre a su cl asifi cac ión e n base a su organi zación lógica y física. La organi zac ión lógica se refiere a la visión que el programador ti ene de la plataforma, es dec ir, las capac idades para expresar tareas paralelas (la estructu ra de control) y los métodos de comunicación ent re dichas tareas (el modelo de comunicación). La organi zac ión física se re fi ere a la estructura del hardware q ue compone la plataforma, do nde el cri teri o habitual es catalogar los sistemas e n función de la organización de l espacio de di recc iones de memod a, obteniéndose así los dos ti pos fundamentales: los sistemas de memOli a compartida o multiprocesadores y los sistemas de memori a distribuida o multicomputadores.
Apéndice A: Memoria virtual En este apéndice se expli ca de form a di dácti ca cómo func iona el sistema de memoria de los procesadores actuales, más concretamente e l contenido de l apé ndice se centra en describir cómo funciona el d ireccionamiento de memori a cuando el procesador utili za memori a virtual. Hoy en el día, los procesadores se diseñan para trabajar con memori a virtual que es un mecanismo por e l que un procesador x
puede trabaj ar con un espac io de direccionamiento mu y supelior al ofertado por la memoria principal instalada físicamente junto al procesador. Gracias a ello, los programas se pueden ejecutar casi sin li mitaciones en lo referente al espacio de direccionamiento con que cuenta n ya que el procesador percibe que todo el espacio de direccionamiento virtual de que dispo ne se encuentra reside nte en la parte de la memoria física asignada a ese programa y que el acceso es transparente. Los contenidos de este apéndice constituyen una lectu ra adicional para ay udar a entender con mayor claridad el tratamiento de las instrucciones de carga/almace namiento en la segmentación de los procesadores superescalares descritos en el Capítulo 2.
Metodología Dado el perfil del al umno para el que se ha escrito este libro, se han tratado de cuidar de manera mu y especial los aspectos específicos de la enseñanza a distancia. Los conceptos se introducen de form a progresiva, tratando de que el estudio se reali ce de forma incremental y asentando los conceptos vistos con anterioridad. La gran cantidad de fi guras, tablas y ejemplos que presenta el texto (más de 200) ti enen como objet ivo facil itar su estudi o sin la ay uda directa de un profesor. La estructurac ión de todos los capítulos es un iforme. Todos contienen, además de las secciones específicas de desalTollo del tema, una sección guión-esquema donde se enumeran los temas tratados y una introducción en la que se exponen los objetivos a cubrir y se clan algunas reseñas históricas, una sección final de concl usiones en la que se resumen los conceptos introducidos y se proporciona una vis ión global y de futuro, una secc ión de preguntas de autoeval uación (alrededor de 250) y una sección de problemas (más de 40) con diferentes grados de di fic ul tad que pretenden cubrir la mayor parte de los aspectos tratados a lo largo de cada capítulo.
XI
.-
Capítulo 1
PROCESADORES SEGMENTADOS 1.1.
Guión-esquema
Los contenidos que se tratan a 10 largo del tema se resu men en los siguientes puntos: • Diferencias entre procesadores RISC y procesadores CISC . • Clasificación y características generales de las arquitecturas paralelas. • Medidas para evaluar el rendimiento de un computador. • Características de los procesadores segmentados. • Descripción de una arqu itectura segmentada genérica. • Tipos de riesgos presentes en la segmentación. • Técnicas que evitan los riesgos en la segmentación. • El algoritmo de Tomasulo como técnica de planificación dinámica en la segmentación.
INGENIERíA DE COMPUTADORES 11
1.2.
Introducción
E l capítulo se dedica al estudio de los procesadores segmentados, cuya principal característica es que utili zan la segmentación como técnica de di seño bardware para incrementar su rendimiento. Este capítu lo se centra, principalmente, en analizar las cuestiones que se plantean a la hora de aplicar la segmentación para mejorar el rendim.iento de un procesador. Un procesador segmentado es capaz de procesm' vari as instrucciones simultáneamente, aunque cada una de ell as puede encontrarse en una etapa distinta de su procesamiento. Por esta razón, el procesador es capaz de aprovechar el pm'aleli smo intrínseco ex istente entre las instrucciones y aumentar su rendimi ento, ejecutando más in strucciones por unidad de ti empo sin tener que reducir necesariamente el ti empo de ejecució n de cada in strucción. El origen del uso de la segmentación en los computadores se puede situar en el IBM 709, un computador basado en tubos de vacío con memoria de núcleos de ferrita que apareció en 1958 como una mejora del mM 704. Entre las nuevas técnicas que incorporaba, una de las más relevantes consistía en la incorporación de llllidades de sincronizac ión de datos que permitían e l procesamiento solapado de las in strucciones y de las entradas/salidas. Con la misma frecuenc ia de reloj que e l IBM 704, e l IBM 709 conseguía un 60 % más de prestaciones. En 1962 aparece e l mM 70941, un computador construido con tran sistores y memoria de núcleos de ferrita que incluía un registro, el lBR (/nsrl'u criol1 Backup Regisrer ), para alm acenar la sig uiente instrucción a ejecutar, permitiendo el solapamiento entre la ejecución de un a instrucción y la captación de la sig uiente. La frecuenc ia de reloj de l mM 70941 era 6 veces mayor que la del IBM 709 pero la velocidad era 7,5 veces mayor. E l término segmentació n aparece po r primera vez en 1956 en en el proyecto Stretch, cuyo objet ivo era conseguir una máquina 100 veces más rápida que el IBM 704. Precisamente, el mM 7030 Stretch se puede cons iderar el primer procesador de propós ito general segmentado. Su microarquitectlll'a estaba implementada a través de una segmentación o cauce con cuau'o etapas en la q ue se solapaban la lectura de instrucciones, su decodificación y su ejecución. En 1961 se demostró que solo habían conseguido ser 30 veces más rápidos que el mM 704 debido a que el IBM 7030 tardaba demasiado tiem po en recuperm'se de un error, lo cual originó un a fuerte caída del precio de la máq uina. A unque la segmentación se utilizó frecuenle mente en los computadores diseñados desde fin ales de los años 50, en la década de los 70 pasó a tener un papel secundario. Esto fue debido a que se hi zo más énfasis en las máquinas orientadas a simplifi car el software (la máquina más representativa en este periodo fue el VAX 1). A pesar de ello, en los años 70 apm'ecen una serie de trabajos dedicados a la aplicación de la segmentación que ya introd ucen la terminología asociada y muchas de las técnicas que se utilizarán posteriormente. Como consecue nci a de la abu ndante investigación y desarrollo que se realiza en la década de los 70, en 1981 se publica el libro de Kogge "A rcrutecture of Pipelined Computers" considerado como el primer tex to dedicado completamente y de una manera formal a la segmentación. Durante la década de los ochenta, la segmentació n se convirtió en la pi edra ang ular de l enfoque RISC pm'a el di seño de procesadores. Los procesadores RISC se diseñaron desde el princ ipio I Máqu ina CISC sucesora de la PDP- II , producida por Digital Equi pment Corporarioll. Fue la primera máquina comercial de arquitec tura de 32 bi ts, lo que la convierte en un hito destacabl e en la hi storia de la computación,
2
1.3. PROCESADORES RISC FRENTE A PROCESADORES CISC
como procesadores segmentados y, precisamente, uno de los argumentos más empleados para justifi car las arquitecturas RISC frente a las CISC 2 era que, puesto que las instrucciones RISC son más simples, su procesarniento segmentado se puede reali zar en cauces con menos etapas, facilitando el trabajo
del compilador a la hora de genenu' código que optim ice su aprovechamiento. No obstante, es difícil encontrar el número de etapas óptimo del cauce, debido a que éste dependerá de la arquitectura y de las car'acterísticas de los programas que se ejecuten. Así, han aparecido microprocesadores segmentados con un número de etapas muy diverso, desde las dos etapas del RISC I (1982), las 10 etapas del Pentium Ill, las 20 ó 3 1 etapas del Pentium 4 (2000-2005) según modelo, hasta las 14 etapas de los procesadores basados en la microarquitectura Intel Core (2006-20 10). Desde mediados de los 80, los microprocesadores ya incorporan la segmentac ión en sus microarqu itecturas de forma generalizada.
Para explicar el funcionamiento de los procesadores segmentados, en este capítulo se analizar'á una arquitectura segmentada genérica junto con ejemplos prácticos que facilitará" la comprensión de los conceptos teóricos. Además, se verá que el aprovechamiento de la segmentación en la ejecución de instrucciones plantea una serie de problemas que deben resol verse par'a que sea posible obtener un rendimi ento aceptable. Esos problemas se refieren a los riesgos que aparecen entre las instrucciones,
pudiendo ser riesgos por dependencias de datos, riesgos de control y riesgos estructurales. Finalmente, se estudiarán diversas técnicas basadas tanto en el hardware como en el software que permitirán gestionar los problemas de la segmentación. Los objetivos que se pretenden alcanzar con el estudio de este capítulo son: • Aprender las diferencias entre los procesadores RISC y los CISC. • Clasificar y conocer las características generales de las arquitecturas par·alelas. • Conocer y saber utilizar las medidas par'a evaluar el rendimiento de un computador. • Conocer las características de los procesadores segmentados. • Conocer y saber analizar los d.istintos tipos de riesgos presentes e n la segmentación.
• Aprender las técnicas que ev itan los riesgos en la segmentación. • Entender el funcionamiento del algoritmo de Tomasulo como técn ica de planificación dinámica en la segmentación.
1.3.
Procesadores RISC frente a procesadores CISC
En la década de los años 70 la técnica más apropiada para el desarTollo de procesadores era la mi croprogramación, que consiste e n
Ull
conjunto de lTu croinstrucciones que representan las señales
eléctricas internas de la unidad de control de un microprocesador. Debido al alto coste por byte en esos 2Los térmi nos RISC y CISC se ex pli can en la sigui e nte sección.
3
INGENIERíA DE COMPUTADORES 11
años, los computadores no disponían, en general, de grandes cantidades de memoria. Por esa razón, los diseñadores comenzaron a condensar la mayor cantidad posible de operaciones dentro del microcódigo reduciendo el tamaño de los programas tanto como fuese posible. En consecuencia, los procesadores fueron dotados de conjuntos de instrucciones muy potentes que reali zaban gran cantidad de operaciones internas. Estas instrucciones eran decodificadas interna mente en la unidad de control y ejecutadas mediante una serie de microinstrucciones almacenadas en una ROM interna, conocida como mem.oria de contm/. Para este proceso se requerían varios ciclos de reloj , siendo de al menos uno por microinstrucción a ejecutar. Debido a la gran cantidad de operaciones internas que realizaban las instrucciones de estos procesadores se los pasó a denominar CISC (Complex lnstruction Set Compute!" - Computadores con Conjunto de Instrucciones Complejo). Simultáneamente y con el afán de disminuir la cantidad de instrucciones que un programa debía almacenar en memoria, se introdujeron en la codificación de las instrucciones una gran cantidad de modos de direccionamiento. Esto fue debido a que en los años 60 y 70, el tiempo de acceso a memoria era mucho menor que el tiempo de procesamiento, por lo cual real izar sucesivos accesos a memoria para buscar operandos era la mejor alternativa con que se contaba para disminuir el tamaño del código. De esta forma surgieron las arquitecturas memoria-memoria y registromemoria. La arquitectura tipo CISC dificultaba, en general , el paraleli smo a nivel de instrucciones debido a que para realizar la ejecución de una instrucción, esta debía ser cargada desde la memoria y traducida a micl"Ooperaciones antes de ejecutar la siguiente instrucción. Por lo tanto, la gran cantidad de dependencias entre las microoperaciones pertenecientes a una misma instrucción dificultaba el paralelismo. Buscando aumentar la velocidad del procesamiento, se descubrió en base a distintos estudios, principalmente los de Patterson en el desarrollo del procesador RISC-I y los de Hennessy en el desarrol lo del MIPS , que con una determinada arquitectura de base, la ejecución de programas compilados con instrucciones si mples (de complejidades similares a las microinstrucciones de los pl"Ocesadores CISC) resultaban ser más eficientes. Como resultado de estos estudios, se observó que el 80 % del tiempo de procesamiento era consumido por solo el 20 % de las instrucciones, con una mayor preponderancia de los almacenamientos (stores), cargas (loads) y bifurcaciones (branches). Esto permitió visualizar que se poseían memorias de control muy grandes cuyo contenido era muy poco utilizado. Por otra parte, el avance en la tecno logía de fabricación de los circuitos integrados provocó que el aumento de velocidad de los procesadores pasase a ser mucho mayor que el de las memorias, con lo que el objetivo de diseño de las arq uitecturas RISC (Reduced lnstruct;on Se! Computer - Computadores con Conj unto de Instrucciones Reducido) pasó a ser el de di sminuir la cantidad de accesos a memoria tanto como fuese posible mediante un aumento de la cantidad de registros internos en el procesador. Debido a que un pl"Ocesador RISC tiene un conj unto de instrucciones simplificado, ya no es necesario disponer de un hardware de control extremadamente complejo. La decodificación de las instrucciones puede ser directamente implementada por hardware dentro de la CPU, di sminuyendo la lógica de control y obteniéndose una mayor velocidad de ejecución. La alternativa RISC se basa en esto y propone un conjunto de instrucciones sencill as con formatos fijos, permitiendo la posibilidad de introducir la 4
1.3. PROCESADORES RISC FRENTE A PROCESADORES CISC
ejecucIOn segmentada de las instrucciones (pipeline) y el diseño de procesadores cableados con un repertorio reducido de instrucciones sencillas pero frec uentemente utilizadas. Esto posibilita que todo código complejo puede descomponerse en instrucciones elementales en las que, para evitar los retardos de la memoria principal, se recune a numerosos regi stros internos para albergar la mayor cantidad posible de variables. En resumen, las principales ventajas de un diseño RISC, además de aumentar la velocidad de ejecución, son: • Reduce el tamaño de la CPU, por lo que se di spone de más espacio para más recursos, por ejemplo, mayor cantidad de registros o de memoria caché. • Al ser la lógica de control más simple, se facilita el diseño. • Permite máquinas más compactas y con menor consumo al reducirse el tamafio de la CPU. • Posibili ta la segmentación y el paralelismo en la ejecución de instrucciones. • Reduce los accesos a memoria debido a que los operandos se cargan en registros. El rendimiento de la implementación pipeline de un procesador RISC obtenido al simplificar el repertorio de instrucciones depende directamente de los riesgos que se generan durante la ejecuc ión de las instrucciones, considerando que un riesgo aparece cuando dos o más instrucciones entran en confl icto. Para minimizar los riesgos, la arquitectura RISC plantea en su fi losofía de diseño una relación mu y estrecha entre los compi ladores y la propia arquitectura. Por esta razón, el compil ador pasa a jugar un papel clave en el diseño de un sistema RISC eq uilibrado. Todas las operaciones complejas que aparecen en el códi go fuente se descomponen en multitud de operaciones senci llas RISC. De esta manera, el compilador asume la función de un mediador entre el programa de aplicac ión y el microprocesador. Es decir, se hace un gran esfuerzo para mantener al hardware tan simple como sea posible, au n a costa de hacer al compilador considerablemente más complejo. Esta estrategia se encuentra en clara contraposición con las máq uinas CISC que tienen instrucciones y modos de direccionamiento muy complejos intentando asemejar el lenguaje de máquina a los lenguajes de alto nivel. En un procesador RISC se obtiene una ganancia en velocidad por el hecho de que dominan las instrucciones más frecuentemente utilizadas, mientras que las operac iones menos frecuentes deben descomponerse en operaciones simples. Por esta razón, la cantidad de instrucciones que requ iere un RISC para ejecutar un programa resulta mayor que en el caso de un procesador CISC de características sim il ares. Aun así, con todos los datos obtenidos a favor del RISC y en contra del CISC, hay que tener en cuenta otro facto r im portante en el momento de tomar la deci sión de migrar a RISC: la compatibilidad con el software preexi stente. CISC y RISC no solo se refi eren a la cantidad de instrucciones que poseen ambos tipos de arq uitecturas , sino que también refl ejan dos fi losofías de diseño opuestas. Los atri butos complejo y reducido describen las diferencias entre los dos modelos de arquitectura para microprocesadores solo de forma superficial. Sin embargo, se requ ieren muchas otras características esenciales para definir de 5
INGENIERíA DE COMPUTADORES 11
forma detallada los RlSC y los CISC. Así, los términos complejo y reducido expresan muy bien una característica importante siempre que no se tomen solo como referenc ia los conjuntos de instrucciones, sino que se considere también la comp lej idad del hardware de los procesadores. Con tecnologías de semiconductores comparables e igual frecuencia de reloj , un procesador RlSC típico tiene una capacidad de procesamiento mayor que la de un CISC con una estructura de hardware mucho más simple, con 10 cual se puede implementar en una fracc ión de la superfi cie ocupada por el circuito integrado de un procesador CISC, teniendo los benefi cios de disminuij· e l consumo de potencia y reducir los costes. A su vez, el aumento de rendimiento de una ru·quitectura RlSC se sustenta en el diseño de un compil ador eficiente.
1.4.
Clasificación de las arquitecturas paralelas
La cont ribución de la arqu itectura al aumento de las prestaciones de los computadores ha venido dada conjuntamente por e l paralelismo y por la utili zación de los principios de localidad espacial y temporal de los datos almacenados en memoria . Ambas alternativas comp iten por el uso de los recursos disponibles e interactúan de formas muy diversas en todos y cada uno de los nivel es de un computador. Un ejemplo de esta situación se tiene en la utili zac ión de las memorias cachés en los multiprocesadores 3 . Gracias a ellas se reducen los accesos a los niveles más lentos de la jerarquía de memoria y se evi tan colisiones en los elementos comprutidos (redes y buses), pero a su vez ocasionan problemas de coherencia a los que hay que dedicar recursos. Otro ejemplo de compromi so entre localidad y paralelismo se tiene en la decisión de utilizru· más transistores en un microprocesador para aumentar el tamaño de la caché interna, o pru·a aumentar el número de las unidades funcionales 4 y así permitir un mayor paraleli smo entre las instrucciones. El paraleli smo se implementa en las arquitecturas siguie ndo fu ndamentalmente dos líneas. Por una parte está la replicación de elementos, incluyendo unidades funcionales, procesadores, módulos de memoria, etc., entre los que se distribuye el trabajo. Como ejemplos de esta alternativa a nivel de sistema están los multiprocesadores y los canales/procesadores de E/S (pru·a permitir la concurrencia entre operaciones de E/S), y a ni vel de procesador se tiene el uso de varias unidades funcionales en los procesadores superescalares, los procesadores VLIW (Vely Long Instruction Word - Pa labra de Instrucción Muy Larga) y los procesadores vectoriales . La segunda alternativa para implementar el parale li smo es la segmentación de cauce o simplemente segmentación (en inglés pipelining) , técnica a través de la cual un e le mento (unidad funcional , procesador, circuito, etc.) se divide en una seri e de etapas que funcionan de forma independiente, y por las que van pasando los operandos y las instrucciones que procesa cada elemento. De esta 3C0l11pUlador que cuent a con dos o más microprocesadores (CPUs). -I Tambi én denominadas unidHdcs de ej ecución. Son ull a parte de la CPU que reali za las operaciones y cá lculos de las
instrucciones de los program as. Tienen a menudo su propia unidad de control de secuencia (no confundir con la unidad de control principal de la CPU), algunos registros, otras unidades internas como ulla sub-A LU o una unidad de coma flotante , y al gunos componentes menores más específicos.
6
1.4. CLASIFICACiÓN DE LAS ARQUITECTURAS PARALELAS
forma , dicho elemento puede reali zar simultáneamente operaciones distintas en las diferentes etapas
en que se encuentra dividido. Esta técnica se ha apl icado en el di seño de procesadores, permitiendo un mayo r aprovechamiento del paralelismo entre instrucciones en los procesadores superescalares y VLJW, y en el di seño de las unidades fun cionales incluidas en los procesadores (sumadores segmentados, mul ti plicadores segmentados) que, por ejemplo, en los procesadores vectoriales do nde lo que prima es ap rovechar el paraleli smo de datos al ejecutar ulla operación sobre conjuntos de operandos diferentes. A continuación, se presenta la clasificación de las arquitecturas de computadores ideada por M ichael Flynn en los años 60. Como toda clasificación, pretende di vidir el uni verso de elementos sobre el que se aplica, en este caso computadores, en una seri e de clases caracterizadas por un conj unto de propiedades. D e esta forma , si se sabe a qué clase pertenece un computador, automáticamente se conocen toda una
serie de características interesantes de l mi smo. Esta taxonomía divide el uni verso de computadores en cuatro clases, según el número de secuencias o flujos de instrucciones y secuencias o fluj os de datos que pueden procesarse simultáneamente en el computador. La taxononúa de Flynn está relacionada, sobre todo, con el aprovechamiento del paralelismo a partir de la réplica de elementos por lo que existen otros as pectos del paralelismo que no se refl ejan del todo bien. Sin embargo, constitu ye un buen punto de partida porque se trata de una clasificación sufi cientemente simpl e que da una idea bastante buena de las di stintas ru'quitecturas paralelas e introduce una nomenclatura que es ampliamen te utilizada. Los cuatro computadores que se di stinguen en esta clasifi cación son los siguientes:
• Computadores SISD: Un único Rujo de instrucciones (SI, Single Insl/'uclion) procesa operandos y genera res ul tados, defini endo un único Aujo de datos (SD , Single Data). • Computadores SIMD: Un único flujo de instrucciones (S I) procesa operandos y genera resul tados, definiendo vruios flujos de datos (MD , Multiple Data). Dado que cada instrucción codifi ca realmente vari as operaciones iguales, cada una actúa sobre operandos distinto s.
• Computadores MIMD : El computador ejecuta varias secuencias o Aujos distintos de instrucciones (MI, Mulliple In sl/'ucliol1s) , y cada uno de ellos procesa operandos y genera resultados de forma que existen también vaIios flujos de datos (MD), uno por cada Rujo de instrucciones. • Computadores MTSD: Se ejecutan varios flujos de instrucciones (MI) aunque todos actúan sobre el mi smo fluj o de datos (SD). Para ilustrm el significado de la terminología empleada al describir los di stintos tipos de computadores, en la Figura 1.1 se muestran esquemas estructurales de las cuatro clases de computadores que establece la laxonouúa de Flylill. En un computador SISD (Figura l. l. a) ex iste una única unidad de control (UC) que rec ibe las instrucciones de memoIia, las decodifica y genera los códigos que definen la operación correspond iente a cada instrucción que debe realizar la unidad de procesamiento (UP) de datos. El Rujo de datos se establece a partir de los opera ndos fuente necesru'ios para rea li zar la operación codificada en cada instrucción y de los resultados generados por las instrucciones. En un computador SIMD (Figura 7
INGENIERíA DE COMPUTADORES 11
ue/: Unidad de control i-ésima
CPU
UP,: Unidad de procesamiento i-ésima
FI
FO,
FI
FD,
M: Memoria FI,: Flujo de instrucciones i-ésimo FO,: Flujo de dalos i-ésimo
M FI
CPUd] (
UC
~ ... ,
FD... ,
FI
FO.
(b) SIMO
(a) SISO
FI " F12 •
FI
FI"
FI " FI, . .. .. FI. FO
CPU,
CPU ,
FI,
FI,
FO,
CPU, FI,
FD,
FI,
M
M CPU ...,
FI... ,
FO... ,
FI ...,
CPU. FI.
FD.
FI"
(e) MISO
(d) MIMD
Figura 1.1: Clases de computadores que establece la taxononúa de Flynn .
8
1.4. CLASIFICACiÓN DE LAS ARQUITECTURAS PARALELAS
1.I.b), el código de operación que genera la única unidad de control del computador a partir de cada instrucción actúa sobre varias unidades de procesamiento (UPi). De esta forma , un computador SIMD puede realizar varias operaciones similares simultáneas sobre operandos distintos. Cada una de las secuencias de operandos y resultados utilizados por las distintas unidades de proceso define un flujo de datos diferente. En un computador MIMD (Figura 1.l.d) ex isten varias unidades de control que decodifican las instrucciones correspondientes a distintos programas. Cada uno de esos programas procesa conjuntos de datos diferentes, que definen distintos fluj os de datos. Los computadores MISO (Figura I.l.c) constituyen una clase de computadores cuyo comportantiento se puede replicar con similares prestaciones en un computador MfMO en el que sus procesadores se sincronizan para que los datos vayan pasando desde un procesador a otro. Por esta razón, aunque se pueden identificar computadores SISO (computadores monoprocesador), computadores SIMD (procesadores matriciales y procesadores vectoriales) y computadores MIMD (multiprocesadores y multicomputadores), no existen computadores MISO específi cos. Si la forma de procesamiento MISO fuera necesaria para algún problema, ésta se puede implementar en un computador MIMO en el que los datos son procesados sucesivamente por los procesadores del sistema. La mejora de prestaciones y el paraleli smo que aprovechan las arquitecturas SIMO y MIMO se pueden entender mejor estimando los tiempos de procesamiento que se tendrían en la ejecución de un fragmento de código. El siguiente ejemplo permite visualizar con claridad esta idea. Considérese el fragmento de pseudocódigo de la Figura 1.2. El código implica realizar un total de 12 operaciones (4 sumas, 4 restas y 4 multiplicaciones), además de las operaciones correspondientes al control del bucle (en este ejemplo se consideran despreciables) . Si se consideran intervalos de tiempos del mi smo orden para todas las operaciones, en un SISO se necesitarían del orden de 12 intervalos (se supone que cada intervalo es el tiempo que consume una operación de suma, resta o multipli cación). tar (i=1; i<=4; i++)
Clíl := Alíl + 6líl; F(í] := Dlí] . E(í]; G(í] := K(í] • H(í]; end tar;
Figura 1.2: Fragmento de pseudocódigo del ejemplo. E( pseudocódigo de ]a Figura 1.3 correspondería a un procesador matricia( con cuatro unidades de procesantiento (UPi, i= 1, ... ,4). La Figura l A muestra un esquema que ilustra la forma de ejecutarse el código de la Figura 1.3 y el paralelismo que se aprovecha. En este caso se necesitarían tres intervalos de tiempo. Es decir, cuatro veces menos que en el computador SISO, como sería de esperar, debido a que se están utilizando cuatro unidades de procesamiento. En cuanto a] uso de computadores MIMD para ejecutar el código de la Figura 1.2, existen distintas 9
INGENIERíA DE COMPUTADORES 11
far all UPi ( i=1; 1<=4 ; i++) C[il := A[i[ + 8[i[; F[i[ := O[i[ - E[i!; G[i[ := K[i[ · H[i[;
end for;
Figura 1.3: Fragmento de pseudocód igo del ejemplo correspondiente a un computador SIMD con cuatro unidades de procesamiento. UP1
UC
UP2
UP3
UP4
C[1[ := A[1[ + 8[1 [
C[2[ := A[2[ + 8[2[
C[3[ := A[3[ + 8[3[
C[4[ := A[4[ + 8[4[
F := O - E
F[1[:= 0[1[- E[1[
F[2[ := 0[2[ - E[2[
F[3[ := 0[3[- E[3[
F[4[ := 0[4[ - E[4[
G:= K · H
G[1[:= K[1[ · H[1[
G[2[ := K[2[ • H[2[
G[3[ := K[3[ • H[3[
G[4[ := K[4[ · H[4[
Flujo de instrucciones
Flujo de datos
Figura 1.4: Esquema de procesamiento de tres instrucciones en un computador SfMD con cuatro unidades de procesamiento.
posibilidades de aprovechamiento del para[elismo. En la Figura 1.5 se consideran tres procesadores, y cada uno ejecuta una operación distinta sobre cuatro componentes de los vectores. En este caso, el coste temporal selÍa de cuatro intervalos de tiempo, es decir, tres veces menos que en la implementación secuencial. También se puede utili zar un MIMD con cuatro procesadores, en el que cada uno de ellos realiza las tres operaciones con una de las cuatro componentes de los vectores. En este caso, e l tiempo se reduciría a tres intervalos, cuatro veces menos que en el caso de un SISD. En esta situación se dice que el computador MIMD util iza una implementación SPMD (Simple Pmgram. Multiple Data) del problema. La taxonomia de Flynn pone de manifiesto dos tipos de paralelismo que pueden aprovecharse segú n
Procesador 1
Procesador 2
Procesador 3
for (1=1; i<=4; i++)
for (1=1 ; 1<:::;4; i++)
for (1=1; i<=4; i++)
C[il := A[i[ + 8[il;
end for;
F[i[ := O[i[- E[il;
end for;
G[i[ := K[i[ • H[i[; end for;
Figura 1.5: Fragmento de código del ejemplo cuando se para leliza en tres procesadores. 10
1.4. CLASIFICACiÓN DE LAS ARQUITECTURAS PARALELAS
la plataforma utilizada: el paralelismo de da tos y el paralelismo funcional. El paralelismo de datos se explota cuando una misma fu nción, instrucción, etc. se ejecuta repetidas veces en paralelo sobre datos diferentes. Este tipo de paralelismo se explota en las máquinas cOLTespondientes a la clase SIMD, aunque también se puede considerar que se aprovecha en las plataformas MIMD, que permiten varios flujos de datos cuando la aphcación se implementa como un programa paralelo SPMD. El paralelismo func iona l se aprovecha cuando las funciones , bloques, instrucciones, etc. (iguales o distintas) que intervienen en la aplicación se ejecutan en paralelo. Existen distintos niveles en los que se puede presentar el paralehsmo funcional: ti. operacion.es CILP, lnstruction Level Parallelism.) , cuando se ejecutan en paralelo las instrucciones de un programa. Es un tipo de paralehsmo de muy bajo nivel que actualmente es explotado por el hardware de forma transparente al programador, o bien por el compilador. Es el nivel de granularidad más fina que se considera en el ámbito de la arquitectura de computadores. En este contexto, se entiende por granularidad la cantidad de trabajo asociado a cada tipo de tarea candidata a la paralelización.
• Nivel de instrucciones
• Nivel de bucle, cuando se ejecutan en paralelo distintas iteraciones de un bucle o secuencias de instrucciones de un programa. En este caso la granularidad del paralehsmo es más gruesa que la delLLP, por lo que se suele hab lar de granul aridad fina-media. • Nivel defuncion.es , en el que los disti ntos procedimientos que constituye n un programa se ejecutan simultáneamente. La granularidad del paralelismo de este nivel se suel e denominar como de granularidad media. • Nivel de programas, cuando la plataforma ejecuta en paralelo programas diferentes que pueden corresponder, o no, a una misma aplicación. Este nivel es el que presenta una gran ul aridad más gruesa. Desde el punto de vista de la taxonomía de F lynn, solo las arquitecturas MIMD y MISD pueden implementar paralelismo funcional. La taxonomía Oliginal de Flynn no considera el paralelismo LLP. En la Figura 1.6 se muestran varios esquemas que dan una idea simplifi cada e ideal del funcionamiento de las distintas arquitecturas que aprovechan el paralelismo LLP. Los procesadores segmentados, al disponer de una rnicroarquitectura que implementa las di stintas fases o etapas de una instrucción (El , E2, etc.) en elementos de circuito que pueden trabajar de forma independiente, penniten que se procesen simultáneamente varias instrucciones, cada una en una fase de su procesamiento. De esta forma, una vez que termina la plimera instrucción y se han Uenado todas las etapas de la segmentación, se puede terminar una instrucción por ciclo en el caso ideal. Las mejoras tecnológicas han dado lugar a distintas alternativas orientadas a aumentar las prestaciones de los procesadores segmentados. Por un lado, están los procesadores superescalares, que implementan microarquitecturas basadas en segmentaciones más complej as en cuyas etapas se puede procesar más de una instrucción (es decir, captar varias instrucciones simultáneamente, decodificar varias 11
INGENIERíA DE COMPUTADORES 11
Inslrucción
Procesador no segmentado
1 LIE _1_E_2__E_3_E _4__E_S+I________,
Instrucción 2
Instrucción 1
ST
I E1
Instrucción 2
I E1
E2 E3 E4
E2
E3 E4
ES
E1
E2
E3
E4
E1
E2 E3 E4 ES
Instrucción 3 Instrucción 4
E1
E2
ES
Instrucción 1
E1
E2 E3 E4
Instrucción 2
E1
E2 E3 E4 ES
11(57)
ESI
Procesador segmentado
ES E3
E4
11T
ESI
Procesador superescalar 21T
Instrucción 3
E1
E2 E3 E4
ES
Instrucción 4
E1
E2 E3 E4
ES
Instrucción 1
Procesador supersegmentado
Instrucción 2
1/( Tf2)=2IT
Instrucción 3
Instrucción 4
Figura 1.6: Alternativas para el aprovechamiento del paraleli smo entre instrucciones (ILP). Taxonomla
de Flynn
(
Paralelismo funcional
J
Paralelismo
de datos
~~~======~~--~
G G
SISO
MIMD
Proc. segmentados ,-_p_r_o_c._s_u_p_e_re_s_ca_ l_ar_e_s_ _ _~ Proc. VLlW Proc. vectoriales Proc. matriciales Proc. sistólicos
f _Memoria compartida: Acceso uniforme (SMP) Acceso no uniforme o distribuido (NUMA, COMA)
- Paso de mensajes: Multicomputadores
Figura 1.7: Arquitecturas según el lipo de paralelismo que aprovechan y su ubicación en la taxonomía de Flynn .
12
1.5. EVALUACiÓN Y MEJORA DEL RENDIMIENTO DE UN COMPUTADOR
instrucciones simultáneamente, etc.), y reducir de esta forma el número de ciclos por instrucción (CPI). por otro lado, se tiene la alteruativa de los procesadores supersegmentados que tratan de aprovechar la mayor velocidad de los circuitos, diseñando segmentaciones con más etapas, donde cada una de ellas necesita un tiempo menor y, por tanto, la segmentación puede funcionar a frecuencias mayores. En la Figura 1.6 se ilustran estas dos estrategias de mejora de prestaciones comparando procesadores superescalares y supersegmentados. Todos ellos proporcionan un factor de me jora de dos con respecto al procesador segmentado de partida, que a su vez mejora en un factor de ci nco al procesador no segmentado. A modo de resumen en la Figura 1.7 se muestran las arqu itecturas según el tipo de paralelismo que aprovechan y su ubicación en la taxonomfa de Flyrrn.
1.5.
Evaluación y mejora del rendimiento de un computador
El objetivo principal de di seño en los microprocesadores de altas prestaciones es el rendimi ento. Cada nueva generación de una microarquitectura busca mejorar de forma sustancial el rendimiento de la generación anterior. Por tanto, resulta de gran interés disponer de medidas para la evaluación del rendimiento de un computador. A continuación , se mencionan las más utili zadas: • Tiempo de respuesta: Tiempo que tarda el computador en procesar una entrada (programa, instrucción , etc.) • Pmductividad (t/lIvughput): Número de entradas procesadas por unidad de tiempo . • Funcionalidad: Tipos de entradas diferentes que es capaz de procesar. • Expansibilidad: Posibilidad de ampliar la capacidad de procesamiento añadiendo bloques a la arquitectura existente.
• Escalabilidad: Posibilidad de ampliar el sistema sin que esto suponga una devaluación de las prestaciones. • Eficiencia: Relación entre el rendimiento obtenido y el coste que ha supuesto consegui rlo (eficiencia = rendimiento / coste) .
La importancia de cada uno de estos parámetros en el rendimiento y la denominación concreta que reciben dependen del elemento que se estudie. Así, por ejemplo, en la organización de la memoria de un computador las elltradas son los accesos a memoria, y las medidas de rendimiento más utilizadas son la latencia de memoria (tiempo de respuesta), el ancho de banda (productividad) y la escalabilidad. Para un computador, las entradas son los programas de aplicación, las medidas de rendimiento serían el tiempo de respuesta y la productividad, mientras que la funcionalidad estaría relacionada con los programas que procesa eficientemente. Para un procesador, en el que las entradas son las instrucciones, las medidas de rendimiento que se utilizan son los ciclos que tarda en ejecutarse cada tipo de instrucción (C PI¡), 13
INGENI ERíA DE COMPUTADORES 11
el valor medio del número de ciclos que tarda en ejecutarse una illstruccióll (CPI) , laji"ecuencia de relaj O tiempo de ciclo (a partir de estos parámetros se pueden extraer medidas de tiempo de respuesta y productividad) y las instrucciones que procesa. Uno de los modelos más utili zado es el que viene descrito por la expres ión Tc pu
= N I · C PI · Tódo = N I. ( C;/)
donde Tc pu es el tiempo de CPU de un programa o tarea determinada (también denominado T wea ) , NI es el número de instrucciones máquina del programa que se ejecuta, C PI es el número medio de ciclos por instrucc ión y Tddo el periodo de reloj del procesador (el inverso de la frecuencia de reloj del procesador, /l. El valor de C PI se puede ex presar como 11
C PI
= C iclos de reloj del programa
¿NI; · C PI; ;= 1
NI
NI
donde C PI; es el número medio de ciclos de las instrucciones de tipo i (uno de los /1. tipos de instrucciones, ya que i = 1, ... , n), y N I; es el número de instrucciones de ese tipo. Por otra parte, la expres ión para el cálculo de Tc pu se puede utilizar para refl ejar las característi cas de los procesadores en relación con el aprovechamiento del paralelismo entre instrucciones o la potencia de sus arquitecturas en cuanto a la codifi cación de las operaciones del programa. Así, se puede escribir C PE)
T cpu = N I · ( 1PE
. T c;c1o
donde C PE es el número medio de ciclos entre inicios de ejecuc ión de in strucciones, es decir, ciclos entre emisión de instrucciones a ejecutar (C PE , Ciclos por Emisión), e ¡PE el número medio de instrucciones que se emiten (lPE, Instrucciones por Emisión) . Como se puede observar, el cociente entre C PE e IPE es otra forma de contabili zar el número med.io de ciclos por instrucción. En la Figura L. 8 se muestra un ejemplo donde se considera que la ejecución de las operaciones que codifi can las instrucciones comienza en la etapa E3. En el caso de un procesador no segmentado en el que todas las instrucciones tengan la misma duración, por ejemplo, cinco ciclos (C PI = 5), el número de ciclos entre etapas de emi sión es igual a cinco (ePE = 5), y dado que cada vez se emite una in strucción se tiene que IPE = L. En un procesador segmentado trabajando a pleno rendimiento se emitiría una úruca instrucción por ciclo, por lo que e PE = l e IPE = 1, teniéndose que e PI = 1 ya que en cada ciclo se termina de ejecutar una instrucción. En los procesadores superescalares se puede emitir más de una instrucción por ciclo. En el ejemplo de la Figura 1.8, el procesador emite dos instrucciones por ciclo, por lo que e PE = 1 e l P E = 2, con lo que e PI = 0, 5. En los ejemplos correspondientes al procesador no segmentado, segmentado y superescalar, el repertorio de instrucciones codifi ca una operación por instrucción. En la expresión del tiempo de C PU de un programa (T c pu), el número de instrucciones (N 1) se puede expresar ea términos del número de operaciones que reali za el programa (Nopemciolles) y del número 14
1.5. EVALUACIÓN Y MEJORA DEL RENDIMIENTO DE UN COMPUTADOR
medio de operaciones que puede codificar una instrucción (OPiI1Sfrt/cciól/), esto es T CPU --
(No peraciolles ) .
op¡lIs(l'II ccióll
ePI · Tciclo .
Así, si se considera el ejemplo de procesamiento SIMD que se muestra en la Figura lA, el número de operaciones que se ejecutan es Noperaciol1 e.\· = 12. Como ex isten cualro elementos de procesamjento que trabajan si mu ltáneamente, cada instrucción codifica cuatro operaciones (OPil/Sfl'llcciól/ = 4) Y el programa a ejecutar consta de tres instruccio nes del repertOli o e1el procesador SlMD (N [ = 3). En las
arqu itecturas VLlW cada instrucción puede codificar varias operaciones, como muestra la Figura 1.8. Como en este ejemplo cada instrucción codifica dos operaciones, en principio el rendi miento sería simi lar al del procesador superescalar que emite dos instrucciones por ciclo codificando en cada instrucc ión una única operación.
Instrucción 1
Inslrucción
IL
E _ l _ E_2_E_3__E_4_E_s--t_ _ _ _ _ _ _---,
2 _ _ __ .. ST "---_ _ _.LI_=E:..:l~E::2=____=E::3~E=_4~_=E:::JSI
Procesador no segmentado
CPE=S /PE=l Op-...-,=1
CP/=S
-
T
Instrucción 1
[ El
E2 E3 E4 ES El
Instrucción 2
E2 El
Instrucción 3
E3 E4
E2 E3 E4 El
Instrucción 4
Procesador segmentado
ES ES
CPE=l
/PE=l
CP/=l
OP.. >Irocci
E2 E3 E4 ES [
-
T
Instrucción 1
El
E2
E3 E4 ES
Instrucción 2
El
E2
E3 E4 ES
Instrucción 3
El
E2
E3 E4
ES
Instrucción 4
El
E2
E3
E4
ES
Procesador superescalar
CPE=l
/PE=2
CP/=O.S
OPt,ulnK
-
T
I
oper. l
El
E2
E3 E4
ES
Oper.2
El
E2
E3
E4
ES
OPer. 3
El
E2
E3
E4
ES
Oper. 4
El
E2
E3 E4
ES
Instr. 1
r
Inslr.2
Procesador V LlW
CPE=l
/PE=l
CP/=O.S
Op"'I~=2
Figura 1.8: Ejemplos de va lores característicos de CPE, ¡ PE y CP I según las microarquitecturas segme ntadas, superescalares y VLIW.
15
INGENIERíA DE COMPUTADORES 11
Existen medidas que pretenden caracterizar el rendimiento de un computador y facilitar la comparación entre distintos sistemas utilizando una única cantidad. En esta línea están los M IPS (Millones de lnstrucciones por Segundo) y los MFLOPS (Millones de Operaciones en Coma Flotante por Segundo). La definici ón de los MIPS en términos de Tcpu se proporciona en la siguiente expresión MIPS =
f NI = -C-P-'I-.-100'67 Tcpu' 106
Sin embargo, esta medida puede variar según el programa, por lo que no sirve como medida característica de una máquina. Además, depende del repertorio de instrucciones, por lo que tampoco permite comparar máquinas con repertorios di stintos y, lo que es más importante, puede ser inversamente proporcional al rendimiento (valores mayores de MIPS corresponden a peores rendimientos). Esto se debe a que, en realidad, lo que miden los MIPS es únicamente la velocidad de ejecución de las instrucciones. Si dos programas tardan igual (similares rendimientos) pero uno utili za más instrucciones que otro (por ejemplo, porque uno utili za instrucciones de tipo CISC y el otro instrucciones de tipo RISC que son mucho más simples), el que utiliza más instrucciones tendrá más MIPS , indicando, erróneamente, que proporciona un mayor rendimiento. En cuanto a los MFLOPS, cuya expresión se muestra a continuación, plantean una problemática similar a la de los MIPS.
M F L O PS
Operaciones en coma flotante = --'-----,::-----Tcpu
Por un lado, no es una medida adecuada para todos los programas ya que solo tiene en cuenta las operaciones en coma flotante . Además, ni el conjunto de instrucciones en coma flotante ni el coste de dichas instl'Ucciones es el mismo en todas las máquinas (por ejemplo, puede que la suma y la multiplicación no consuman el mismo número de ciclos). Cuando en un computador se pretende incrementar su renclimiento mejorando alguno de sus recursos o elementos, se puede utilizar la ganancia (speedup) para evaluar hasta qué punto la mejora de rendimiento en unfactor igual a p en ese elemento se manifiesta en el rendimiento global del computador. La expresión de esta ganancia se puede definir como
S = P
rendimiento(p) rendimien.to_original
TCPU _m.¡g;"al T CPUJllejorado
donde rendimiento(p) representa el rendimiento del programa prueba en la máquina mejorada, en la que uno de sus recursos se ha mejorado en un factor p (se ha hecho p veces más rápido, se ha replicado p veces, etc.) y rendill1iento _original es el rendimiento del programa prueba en la máquina original. Si el rendimiento se evalúa como la inversa del tiempo de CPU, la ganancia se puede definir como la relación entre el tiempo de CPU utili zado para la ejecución de un programa prueba en la máquina original (TCPU J> I"ig;,wl) Y el tiempo de CPU utilizado para la ejecución del mi smo programa utili zando la mejora 16
1.5. EVALUACiÓN Y MEJORA DEL RENDIMIENTO DE UN COMPUTADOR
en todo momento que sea posible (TcpuJ"ejomda). Surge la cuestión de hasta qué punto una mejora en un factor p e n un recurso se pone de manifiesto en la mejora final obtenida. Para dar respuesta a esta pregunta se puede recu'Tir a la ley de Amdah l. Esta ley establece que la ganancia S l' que se puede obtener cuando se mejora un recurso de una máquina en un factor p está limitada por la expresión
p S l' :o; -:----c:':---:-:l+f (p-I)
donde f es la fracción de tiempo de ejecución en la máquina original en la que no se puede apli car la mejora considerada. Así, solo si f = O (la mejora se utiliza siempre), una mejora e n un recurso en un factor p se observa en esa misma medida en la máquina. Por ejemplo, si una máquina pasa un 25 % de su tiempo procesando instrucciones de coma flotante y se mejora la máquina haciendo que esas instrucciones se ejecuten en la mitad de tiempo, esto es p = 2, entonces la ganancia que se puede obtener es SI':O; 2/(1 +0,75· (2- 1)) = 1, 14. Es decir, la máquina mejorada solo es un 14 % mejor. Como se puede deducir del análisis de la ley de Amdahl, por mucho que se mejore un recurso, la ganancia estaría siempre limitada por 1/ f. Es decir, no importa lo grande que sea p ya que la máxi ma ganancia que se puede conseguir está acotada. Para comprobar esto basta con calcular el límite de la ganancia S {' c uando p tiende a infinito lím S, = lím
p~""
{
{HOO
1
+f
p (p - 1)
La conclusión que se puede extraer de la ley de Amdah l es que para mejorar una máquina habría que aplicar el máx imo esfuerzo e n la mejora de aquel recurso que se utilice con una mayor frecuencia. Originariamente, Arndahl enunció esta ley en relación con la eficacia de los computadores paralelos de la siguiente forma : debido a que en un programa hay código secuencial que no puede paralelizarse, los procesadores no se podrían utili zar eficazmente, y el tiempo de ejecución en p procesadores sería TI' ?
f . T, + (1
TI - f) -
p
donde T, es el tiempo de ejecución en un único procesador. Es decir, en la parte secuencial no se mejoraría nada, y en la parte paralelizable se mejoraría como mucho en un factor igual a p si todos los procesadores estuvieran trabajando. Por lo tanto, si se sustituye en la expresión de la ganancia los tiempos TI' y T, se obtiene la expresión de la ley de Amdahl
T, T, S p = - < -----'-----,=_ TI' - j' ·T, + (1f - ) -T,
p
1 + f· (p - 1)
P 17
INGENIERíA DE COMPUTADORES 11
A continuació n, se ilustra con un ejemplo la aplicación de la ley de Amdalu. Se desea mejorar el rendimiento de un computado r introduciendo un coprocesador matemático que realice las operaciones aritméticas en la mitad de tiempo. ¿Cuál sería la ganancia en velocidad de l sistema para la ejecución de un programa si el 60 % del mismo se dedicase a operacio nes aritméticas? S i el programa ta rda 12 segundos en ej ecutarse sin la mejora, ¿cuánto tardará con la mejora? Apl icando directamente los datos en la expresión que determina la ganacia se tiene p
2
S fJ = 1 + f. (p _ 1) = I + 0, 4 (2 - 1)
= 1,42
donde f es igual al 40 %, es decir, la fracc ió n del tiempo donde no se puede apli car la mej ora y p es igual a 2 porque el recurso utilizado duplica el rendi miento, con lo que e l sistema es un 42 % más rápido. Como _ T CPU-Origillal 12 = 1,42 Sp = T CPUJllejorada
TCPU Jllejorada
equivale a que el programa con la mejora consuma TCPU Juejorada
1.6.
= 8,45 segundos.
Características de los procesadores segmentados
La segmentación (pipelin.ing) es una técnica empl eada en el diseño de procesadores que trata de explotar el paralelismo intrínseco que existe entre las instrucciones de un Aujo secuencial. Debido a que mediante la segmentación se puede solapar la ejecuc ió n de múltiples instrucciones, ex iste una cierta analogía e ntre e l procesamiento segmentado y la fabricación en cadena de un determinado producto: cada etapa de la segmentación (o segmento) com pleta una parte (subtarea) de la tarea total. Los segmentos están conectados cada uno con el sig uiente, de fonTIa que la salida de uno pasa a ser la entrada del sig uiente. De este modo, los segmentos config uran una especie de cauce a través del cual se van procesando las tareas. Por ello, en algunas ocasiones, a los procesadores segmentados también se les deno mina procesadores encauzados. Lo característi co de la segmentació n es que las diferentes subtareas pueden procesarse de forma si multánea, aunque sea sobre diferentes datos, siendo el factor clave la posibilidad de comenzar una nueva tarea sin necesidad de que la anterior se haya terminado. Por esta razón, la medida de la eficacia de un procesador segmentado no es el tiempo total transcurrido desde que comienza una determinada tarea hasta que termina (tiempo de late ncia del procesador), s ino el ti empo máximo que pasa entre la fina lización de dos tareas consecutivas. Para entender con mayor claridad este concepto, considere una tarea compuesta por n subtareas. Si las tareas se procesan de forma totalmente secuencial , el tiempo necesario para procesar una tarea com pleta será la suma de los tiempos necesarios para la terminación de cada una de las subtareas que la componen (véase la Figura 1.9). En este esquema, Tj representa la subtarea j dentro de la tarea i. Por lo tanto, para comenzar el tratamiento de una nueva tarea será necesario esperar e l tiempo que se tarda en procesar una tarea com pleta. Esto se debe a que habrá alg unas unidades fun cionales que serán necesarias 18
1.6. CARACTERíSTICAS DE LOS PROCESADORES SEGMENTADOS
Subtarea
T,'
Subtarea ~
T',
Subtarea
T'
~
Subtarea
f----.
"
T',
~
tiempo _
Figura 1.9: Tm'ea procesada de fo rma lotalmente secuencial.
para llevar a cabo varias de las subtareas y, por e llo, esas subtareas no podrán superponerse en e l tiempo. S i se e mpl ea UIl procesador segmentado para procesar esa mi sma tarea, basta que se haya te rminado la pri mera subtarea para poder empezar a procesar uoa nueva subtarea. En la F igura I . 1O puede verse el fluj o continuo de tareas que se van procesando a través de las 11 etapas encargadas de procesar cada llna de las subtareas. Puede observarse que el ti e mpo total de procesami ento de uoa tarea comple ta puede ser el mi smo que e l tie mpo empleado para e l procesamie nto secuencial de la mi sma tarea mostrado en la F igura 1.9, aunque frecuentemente será mayor. Esto, sin embargo, carece de re levanc ia ya que lo verdaderamente importante es el ritmo al que las tareas van saliendo del procesador (velocidad d e emisión de ta reas) . Al número de etapas del procesador, 11 , se le de nomioa en muchas ocasiones profill1didad de la segmentación. Para que el tiempo de latencia del procesador segmentado sea el minimo posible, es necesario que el procesador esté equilibrado, es decir, que todas las s ubtareas en que se haya dividido la tarea total tardeo en procesarse el mis mo tiempo. Esto es debido a que las tareas no podrán avan zar a la etapa siguiente hasta que no se haya terminado la subtarea más lenta. Por ello, si el procesador no está equilibrado , las etapas más rápidas estarán cierto tiempo sin hacer trabajo alguno, lo que di sminuirá e l rendimiento total del procesador. La relación de precedencia de uo conjunto de subtareas T I, . . . , T" que componen c ierta tarea T , especifi ca para cada subtarea T j que no puede comenzarse has ta que hayan terminado ciel1as subtareas
Subtarea
T,'
Subtarea
e----- T,' e-----
- - --
Subtarea
Subta rea
~
T',
-- T:
Subta rea
e----- T', e----Subtarea
T',
Su btarea
e----- T', e-----
tiempo _ _
Figura 1.10: Conjunto de tareas ejecutadas en UIl procesador segmentado.
19
INGENIERíA DE COMPUTADORES 11
Ti. Las relaciones de precedencia para todas las subtareas de T forman su grafo de precedencia. En el ejemplo de la Figura l. lO se ha supuesto que las tareas que se procesan en el cauce tienen un grafo de precedencia lineal. Esto significa que una subtarea T j no puede comenzar hasta que todas las subtareas previas, es decir Ti, Vi < j, hayan fina lizado. A los procesadores segmentados que solo pueden procesar tareas con grafo de precedencia de este tipo se les denomina de cauce lineal y son los que se analizan en este texto. A modo de resumen se presenta un ejemplo que pone de manifiesto la analogía de la segmentación con una cadena de empaquetado de tartas. El proceso de empaquetar una tarta consi.ste en: l. Poner una caja vacía en la mesa.
2. Meter una tarta en la caja. 3. Cerrar y precintar la caja. 4. Poner una etiqueta en la caja. 5. Llevar la caja a un gran contenedor. Si cada una de estas operaciones la reali za un operario en 10 segundos, en empaquetar una tarta se tarda 50 segundos y, por tanto, en empaquetar 10 tartas se tardaría 500 segundos. Suponga ahora que se dispone de una cadena de empaquetado de tartas con una cinta transportadora sobre la que trabajan cinco operarios especializados en tareas distintas. El primer operario pone la caja l en la cinta transportadora, y ésta avanza por la cinta hasta el segundo operario, que introduce una tarta en la caja 1, al mismo tiempo que el primer operario pone la caja 2 en la cinta. La caja I sigue avanzando hasta el tercer operario, que la cierra y la precinta, al mismo tiempo que el segundo operario mete otra tarta en la caja 2 y el primer operario pone la caja 3 en la cinta. La caja 1 sigue su cami no en la ci nta pasando por el cuarto operario, que pone una etiqueta, hasta llegar al quinto operario, que la retira de la cinta y la pone en un gran contenedor. En el momento que el quinto operario retü·a la caja de la cinta, hay cuatro cajas más en la cinta. Si cada una de las fases de empaquetado se realiza en 10 segundos, a partir de ahora, cada 10 segundos saldrá un a nueva tarta empaq uetada, en lugar de hacerlo cada 50 segundos, que es lo que se tardaba cuando no había cadena de empaquetado. Por tanto, en esta situación, en tener JO tartas empaquetadas se tardará solamente 100 segundos, mientras que con un único operario se tardaba 500 segundos. Es importante observar que, aunque sale una nueva tarta empaquetada cada 10 segundos, la preparación completa de cada tarta sigue requiriendo 50 segundos, igual que cuando hab ía una sola persona preparando las tartas.
1.7.
Arquitectura segmentada genérica
En esta sección se describe una sencilla arquitectura con propósitos educati vos encuadrada dentro de los microprocesadores de tipo RISC que servirá de referencia para la explicación de los conceptos 20
1.7. ARQUITECTURA SEGMENTADA GENÉRICA
teollcos que se vayan introduciendo en el capítulo. Aunque las máquinas más antiguas utili zaban arquitecturas de tipo pila o ac umulador (caracterizadas porque los operandos se referenciaban de una forma implícita), la arquitectura segmentada genérica que se presenta en esta sección, ASG en adelante, es del tipo de registros de propósito general donde los operandos se referencian explícitamente. Las ven tajas de las máquinas de registros de propósito general surgen del uso efectivo de los registros por parte del compil ador al calcular expresiones aritmético-lógicas y al almacenar datos. Los registros permiten una gestión más fl exible de los datos que las pilas o los acumuladores a la hora de evaluar expresiones. Además, cuando los datos están almacenados en registros se reduce el tráfico de memoria, se acelera la ejecución del programa (debido a que el acceso a los registros es más rápido que el acceso a la memoria) y se mejora la densidad de código (un registro se referencia con menos bits que una posición de memoria). Existen dos características importantes de los repertorios de instrucciones que permiten clasificar las arquitecturas de propósito general: 1. El número de operandos que pueden tener las insu'ucciones aritmético-lógicas.
2. El número de operandos que se pueden diJeccionar en memoria en las instrucciones aritméticológicas. Concretamente, las instrucciones aritmético-lógicas de la ASG utili zan en total tres operandos y ninguno de ellos se referencia en memoria. A las máquinas en las que los operandos no se referenci an en memoria se les denomina máquinas registro-registro O máquinas de carga/a lmacenamiento. Otro factor a tener en cuenta en la ASG es el modo de direccionamiento, que determina la forma en que el operando (OP) presente en las instrucciones especifica la diJección efectiva (DE) del dato operando en memoria (DO) sobre el que se realiza la operación indi cada por el código de operación (CO). Como en la ASG el modo de direcc ionamiento es con desplazamiento, la DE se calcul a sumando al contenido de un registro el operando OP declarado en la instrucción, que se interpreta como un desplazamiento respecto al contenido del registro. La Figura 1.11 muestra un esquema de un direccionamiento con desplazamiento. DE
=
+ OP; OP
Icol
=Desplazamiento Memoria
I
OP
DE
ase
DO
I
Figura 1.11: Esquema de direccionamiento con desplazamiento. 21
INGENIERíA DE COMPUTADORES 11
Por ejemplo, si el valor de OP fuese 1000 y e l contenido del registro base fuese 200, la dirección efectiva de memoria DE do nde habIia que buscar el dato sería la 1200.
1.7.1.
Repertorio de instrucciones de la ASG
La ASG tiene un total de 32 registros genéricos de 32 bits identifi cados como Rl'l, Rl , R2, .. . , R3 1. Cada registro puede contener un valor entero con la úni ca excepción del registro Rl'l que siempre contiene el valor cero. Además, hay un conjunto de registros de co ma fiotante que se pueden utili zar como 32 registros de si mpl e prec isión (32 bits) o como p¡u·ejas par-impar que conti enen valores de doble precisión (64 bits). Los registros de coma fi otante de 64 bits se identi fican como n , F2 , F4, ... , F28, F3 l'l . Como en la gran mayoría de los procesadores segmentados actua les, la longitud de todas las instrucc iones de la ASG es de 32 bits. Los cuatro tipos básicos de instrucc iones que soporta la AS G son las siguientes: • Aritméticas y lógicas. • Transferencia de datos . • Bifu rcaciones o saltos incondicionales. • Sa ltos condicionales. E n la Fi gura l . l2 se representa el formato de una instrucción ari tmético-lógica genérica cuando se consideran 3 operandos de forma explícita . CO representa e l código de la operación que se realiza sobre los operandos fu ente OP I Y OP2; el resultado de la operación se deja en e l operando destino OPd . Es importante comentar en este pun to que el tamaño en bits de cada campo que compone la instrucción son dec isiones de di seño que depende n de la finalidad del computador, estando entre los fac tores a tener en cuenta e l diseño del repertorio de instrucciones y el tamaño del fichero de registros. CO OPd (destino)
OP1 (fuente 1) OP2 (fuente 2)
F igura 1.12: Instru cc ión ari tmético- lógica genérica de 3 o perandos.
Las instrucciones de la AL U incluyen operaciones aritméticas sencill as (suma, resta, mul tiplicación, di visión y comparación) y operaciones lógicas (ANO, OR y XOR). También se utilizan las form as inmediatas de todas las in strucciones aritméticas pero úni camente se considerará la forma illlnediata en e l OP2. En las instrucc iones de comparac ión, si la condición es cierta se almacena un l en el bit menos signifi cativo del registro destino y los restantes se fijan a O; en otro caso se coloca un O en todos los bits. La Tabl a 1. 1 muestra algunos ejemplos de las instrucc iones aritméticas que se van a utili zar en el resto del libro. En el repertori o de instrucciones considerado, las operaci ones de transferencia de datos entre los registros y la memoria se realizan excl usivamente a través de instrucciones de carga (LD, Load Data) 22
1.7. ARQUITECTURA SEGMENTADA GENÉRICA Tabla 1.1: Ejemplos de instrucciones aritméticas. INSTRUCCiÓN EIB'IPLD
NOMBRE DE LA INSTRUCCiÓN
S IGN lFICADO
ADD ADDI ADDD ADDDI SUB SUBI SUBD SUBDI MULT MULTI MULTO MULTDI DIV DIVI DIVD DIVDI
R3,Rl,R2 R2,Rl,#4 F2,F4,F6 F8 ,F2 ,#4 R5,R2,R3 R4,Rl,#8 F4,F6,F8 F2,F4,#8 R3,R6,R5 R6,Rl,#5 F4,F6,F8 F6,F2,#5 R7,R3,R5 R8,Rl,#3 F2,F6,F8 F8,F4,#3
Suma Suma inmediata
SGT
R3,R6,R5
Comparación mayor que
R3 R2 F2 F8 R5 R4 F4 F2 R3 R6 F4 F6 R7 R8 F2 F8 if
SGTI
R6,Rl,#5
Comparac ión inmediata mayor que
SGE
R4,R6,R8
Comparac ión mayor o igual que
SGEI
R6,R2,#5
Comparación inmediata mayor o igual que
SLT
R3,R6,R5
Comparación menor que
SLTI
R6,Rl,#5
Comparación inmediata menor que
SLE
R4,R6,R8
Comparación menor o igual que
SLEI
R6,R2,#5
Comparación inmediata menor o igual qu e
Suma flotante Suma inmediata flotante Resta
Resta inmediata Rest a flotante
Resta inmediata flotante MultipLicHción
Multiplicación inmediata Multiplicación flotante Multiplicación inmediata fl otante División Divisjón inmediata
División flotante División imnediata flotante
+ R2 +4 F4 + F6 F2 + 4
<- Rl <- Rl <<-
R2 - R3 Rl - 8 F6 - F8 F4 - 8 R6 . R5 <- Rl • 5 <- F6 . F8 <- F2 * 5 <- R3/R5 <- Rl / 3 <- F6 / F8 <- F4/3 R6 > R5 R3 el se R3 if Rl > 5 R6 el se R6 if R6 :> R8 R4 el se R4 ifR2:>5 R6 el se R6 if R6 < R5 R3 el se R3 if Rl < 5 R6 el se R6 if R6 ,; R8 R4 el se R4 ifR2,;5 R6 el se R6 <<<<<-
<- 1 <- ~ <- 1 <- ~ <- 1 <- ~ <- 1 <- ~ <- 1 <- ~ <- 1 <- ~ <- 1 <- ~ <- 1 <- ~
y de almacenamiento (SD, Store Data). En una instrucción de carga se almacena el contenido de una dirección de memoria en un registro y al conlrario en una instrucción de almacenamiento. En estas instrucciones se debe indicar la dirección de memoria desde donde se extrae el dato en las cargas o donde se va a escribir el dato en los almacenamientos; y un registro donde se escribirá el dato que se trae de memoria en las cargas, o en donde se encuentra el dato a escribir en memoria en los almacenamientos. Por tanto, de forma genérica, las instrucciones de carga de memoria tendrán la forma
23
INGENIERíA DE COMPUTADORES 11
LD
Rd,d es pl azarn i en t o(R f )
donde Rd es el registro destino donde almacenar el dato leído de la memori a, y desplazarnientoCRf) representa la dirección de memoria a la que acceder para recuperar el dato siendo Rf el registro base. En cuanto a las instrucciones de almacenamiento, se escribirán como SD
desp l azarniento( Rd ),R f
donde Rf es el registro cuyo contenido se va a escribir en memoria, y de s plazarnientoCRd) representa la dirección de memoria donde se va a escribir siendo Rd el registro base. El valor del desplazamiento y el va lor del registro base siempre serán valores enteros positivos o negativos . En el caso de utilizar registros en coma flotante las expresiones de carga y almacenamiento de forma genérica quedarían LD SD
Fd,desplazarniento(Rf) de sp l aza rniento (Rd ) , Ff
En el caso de una carga o un alm acenamiento sencillo se lee o escribe una palabra de 4 bytes, y en el caso de ser una carga o almacenamiento fl otante una palabra de 8 bytes . En la ASG la diferencia entre una carga u otra está en el identificador del registro (Rd y Rf o Fd Y Ff). La Tabla 1.2 muestra un ejemplo de las instrucciones de carga y almacenamiento que se van a utilizar en el resto del libro. Tabla 1.2: Ejemplos de instrucciones de carga y almacenamiento. INSTRUCCIÓN EJEMPLO
NOMBRE DE LA INSTRUCCIÓN
S IGN IACA DO
LD Rl,4(R2) SD (,l(R3) , R5 LD F6,5(R3)
Carga
Rl
SD
6(Rl) ,F4
AJmacenamiento
Carga flotante Almacenami ento fl otanle
<- M[R2 + 4] M[R3 + (,l] <- R5 F6 <- M[R3 + 5] M[Rl + 6] <- F4
La modificación del flujo de control se realiza mediante las instrucciones de bifurcación y salto. En este texto se denominará bifurcación cuando el cambio en el flujo de control sea incondicional y salro cuando sea condicional. Las dos instrucciones de bifurcación consideradas (véase la Tab la 1.3) se diferencian por la forma de especificar la dirección destino que puede ser mediante una etiqueta o medi ante la dirección de un registro. En los saltos, la condición que determina el resultado del salto se especifica en el código de operación de la instrucción, que puede examinar el regi stro fuente para compararlo con cero, con distinto a cero, con mayor de cero o con menor de cero. La forma más común de especificar el destino del sa lto es sumini strar un desplazamiento que se sume al contador del programa (PC). Los saltos de este tipo se denominan sallas relativos al Pe. Los saltos relativos al pe son ventajosos porque el destino del salto, con frecuencia, está cerca de la instrucción actual , y especificar la posición relativa al pe actual requiere pocos bits. Además, el direccionamiento relativo al pe también permite que el cód igo se ejecute independientemente de la posición de memori a en donde esté cargado. Diremos que un salto se realiza o es efecti vo (/aken en inglés) si la condición probada por la instrucción de salto es verdadera y la siguiente instrucción que 24
1.7. ARQUITECTURA SEGMENTADA GENÉRICA
se va a ejecutar es el destino del salto. Observe que las bifurcaciones son siempre efectivas. La Tabla 1.3 muestra un ejemplo de algunas de las instrucciones de bifurcación y salto que se van a utilizar en el resto del libro. Tabla 1.3: Ejemplos de instrucciones de bifurcación y salto. I NSTRUCCiÓN EJEMPLO
NOMB RE DE LA INST RUCC iÓN
SIGNIFICADO
JUMP et iqueta JUMP R4
Bifurcación Bifurcación a registro Salto igual a cero Salto di,stinlo de cero Salto mayor que cero Salto menor que cero
pe ~ etiqueta pe <- R4 if (R3 = ~) pe <- pe + etiqueta if (R2 ~) pe <- pe + etiqueta if (R5 > ~) pe <- pe + etiqueta if (R7 < ~ ) pe <- pe + etiqueta
BEQZ BNEZ BGT BLT
R3, e tiqueta R2,etiqueta
R5,etiqueta R7,etiqueta
'*
1.7.2, Implementación de la segmentación de instrucciones en la ASG En el diseño de un procesador segmentado, el cálculo a segmentar es el trabajo que es necesario realizar en cada ciclo de instrucción, que es el número de ciclos de reloj que consume su procesamiento. En la ASG un ciclo de una instrucción se descompone en cinco etapas básicas: 1. IF (lllstruction Fetch): Lectura de la instrucción de la caché de instrucciones.
2. ID (lnstruction Decodillg): Decodificación de la instrucción y lectura de sus operandos de l fichero de registros. 3. EX (Executioll ): Ejecución de las operaciones si se trata de una instrucción aritmético-lógica y del cálculo de la condición y de la dirección de salto si se trata de una bifurcación o salto condicional. 4. MEM (Memoly occess): Acceso a la caché de datos para lecturas (cargas) o escrituras (almacenamiemtos). 5. WB (Wrüe-Back reslllts): Escritura del resultado en el fichero de registros. Un ciclo de instrucción comienza con la lectura de la instrucción a ejecutar, seguido de su decodifi cación. Normalmente, una instrucción especifica uno o más operandos fuente, que es necesario leer y, dependiendo del tipo de instrucción, estos operandos pueden estar almacenados en registros o en posiciones de memoria. Una vez que los operandos están disponibles, se realiza la operación especifi cada por la instrucción. El ciclo de instrucción finaliza almacenando el resultado generado por la operación reali zada. El resultado se puede almacenar en un registro o en una posición de memoria, lo que depende nuevamente del tipo de instrucción. En la segmentación de la ASG, el ciclo de instrucción lógico se ha asignado a cinco ciclos de máquina físicos. El objetivo de la cuantifi cación de las etapas consiste en partir 25
INGENIERíA DE COMPUTADORES 11
e l ciclo lógico de la instrucción en etapas de segmentación equilibradas (de la mi sma duración), con el fi n de minimi zar el desbalanceo interno entre las etapas de segmentación. El diagrama de segmentación de La Figura 1.13 constituye una representación fun cional de la segmentación de cilJco etapas de las instrucciones de la ASO. En esa fi gura se muestran de forma resumida las acciones para los distintos tipos de instrucciones y la etapa de la seg mentación en la que se realizan. La organización lógica de la segmentación de instrucciones de la ASO se muestra en la Figura 1. 14, que es e l diagrama de bloques funcional de la implementac ión del procesador. La organi zación de la segmentación de instrucciones de la ASO de cinco etapas de la Fi gura 1.1 4 parece más compleja de lo que realmente es. Para ayudar a comprenderla, primero es necesario examinar las interfaces de la segmentación con e l fichero de registros y el subsistema de memoria, es dec ir, son necesrui as cachés independientes pru·a almacenar instrucc iones (l-caché) y datos (D-caché). La interfaz del subsistema de memori a de la segmentación de la ASO es bastante sencill a y es mu y similar a la de la mayoría de procesadores escalru·es segmentados. La etapa IF accede a la caché de in strucciones y la etapa MEM accede a la caché de datos, tal y como se muestra en la Figura 1.1 4. La caché de instrucciones puede ad mi tir la lectura de una instrucción en cada ciclo de máquina y un fallo en la caché de iJlstrucciones dete ndrá la segmentación. Hay veces que un fa ll o en caché provoca la activación de una interru pción lo que implica rea li zar un cambio de contexto debido a los miles de ciclos que se consumen si hay que acceder a l di sco duro. En la etapa MEM de la segmentación, una instrucción de carga realiza una lectura de la caché de datos; mientras que una instrucc ión de almacenamiento efectúa una escritura en la caché de datos. Hay que tener en cuenta que se supone que la latenc ia5 para acceder a la caché de datos y a la caché de instrucciones es inferior a un ciclo de máquina. El acceso al fi chero de registros se produce ún.icamente e n las etapas ID y WB . En cada ciclo de máquina, e l fi chero de registros debe ad mitir, seglll1 el di seño de ASO, dos lecturas en la etapa ID y una escritu ra en la etapa WB. Por tanto, es necesario un fi chero de registros multipuerto con, como minimo, dos puertos de lectura y un puerto de escritu ra. Las instrucciones mitmético- Iógicas req uieren una unidad fu ncional ALU para realizar las operaciones necesarias (suma, resta, multiplicación, divi sión, comparación, AND, OR, etc.) Sin embargo, las instrucciones de carga, almacenamiento y salto no necesitrul rea lizar tales operaciones, pero sí necesitan generru· una dirección absoluta para acceder a memoria. Se puede observar que la tarea de generación de direcciones la puede reali zar la unidad funciona l ALU. Por tanto, estos subcálculos se pueden fu sionar en la tercera etapa de la segmentación, llamada EX, que consta principaLmente de la unidad fu ncional ALU para reali zar las operaciones aritmético-lógicas o generru· las düecciones efectivas. Las instrucciones de carga y almacenamiento necesitan acceder a la caché de datos pma lo cual la cuarta etapa de la segmentación, denomin ada MEM, está dedicada a tal fi n. Por su prute, las instrucciones aritmético-lógicas y de carga deben escribü el resul tado en el fic hero de registros, y esto lo hacen en la etapa WB que es la última etapa de la segmentación. Una instrucción ALU escribe el resultado de la operación reali zada sobre los operandos fuente en un registro destino. Una i.nstrucción de carga almacena en el registro deslino los datos leídos desde memori a. 5Tiempo de acceso a memoria caché.
26
1.7. ARQUITECTURA SEGMENTADA GENÉRICA
por Lanto, no es necesario ningún acceso a memoria cuando se ejecuta una instrucción ALU , con lo que
la escritura en el regis tro destino puede realizarse, en teoría, inmediatamen te después de la etapa EX . Si n embargo, para homogeneizar la escritura en las instrucciones ALU con la escritura en las instrucciones de carga se retrasa la escritura a la última etapa (WB ). Esto provoca un ciclo de máquina libre para las instnlcciones ALU en la etapa MEM de la segmentación. Para las instrucciones de salto condicional es necesario determinar si la condición de salto se cumple antes de actuali zar el contado r de programa. Como la ALU se uti liza para realizar el cálculo de las direcciones efectivas, no se puede utilizar para efectuar la evaluación de la condición de salto. Si la evaluación de la condición de salto únicamenle implica comprobar un registro para determinar si es igual a cero, o si es positivo o negativo, s010 será necesari o añad ir un comparador sencillo. Este comparador
se puede introduci.r, como muy pronto, en la etapa EX de la segmentación, es decir, después de leer el registro de referencia en la etapa ID. Por tanto, la primera etapa de la segmentación donde se puede actualizar el contador del programa con la dirección de destino del salto, suponiendo que el sa lto condicional sea efecti vo, es durante la etapa MEM, es decir, una vez ca lculada la dirección de destino y determ inada la condi ción de salto en la etapa EX. Las instrucciones de almacenamiento y salto no necesitan escribir en el fichero de registros y se encuentran liberadas durante la etapa WB. Además, las instrucciones de carga utilizan las cinco etapas de la segmentación, mientras que los otros tres tipos de instrucciones uti li zan cuatro de las cinco etapas, véase la Figura 1.1 3.
ALU
Ca rga
Almacenamiento
Salto/Bifurcación
Leer instrucción Actualizar pe
Leer instrucción
Leer instrucción Actualizar pe
Leer instrucción Actualizar pe
Decodificar Leer registros
Decodificar Leer registros
Decodificar Leer registros
Generar dirección
Generar dirección
Leer en memoria
Escribir en memoria
Decodificar l eer registros
Operación ALU
(
Escribir registro
Actualizar pe
Generar dirección y/o
calcular condición
Actualizar pe
Escribir registro
Figura 1.13: Operaciones qu e cada lipo de instrucc ión (ALU, ca rga, almacenamien to y sallo) reali za e n las e tapas de que con sta la seg men tación ASG.
27
ING ENIERíA DE COMPUTADORES 11
I
I
I
PC
MUX
Sallo
--- -efee!¡vo
$
LECTURA DE LA INSTRUCCiÓN
el apa IF
I
I
I-CAC HE
LÓG ICA DE DECODIFICACiÓN DE LA INSTRU CCi ÓN Identificador de registro destino
Desplazamiento
DECODIFICACiÓN DE LA INSTRUCCiÓN Y LECTURA DE OPERANDOS
Identificadores de registros fuente
etapa ID FICHERO DE REGISTROS
I
Oper:c~ó~ \
MUX
Y¡
ALU
1... - -
Modo de direccionamiento
EJECUCiÓN DE OPERACIONES ALU Y C ÁLCULO DE LA CONDICiÓN Y DIRECCiÓN DEL SALTO
etapa EX
ACCESO
Dalos
I
Dirección
O-CAC HE
I
¡
"--1
MU X
J
I
A MEMORIA
etapa MEM
ESCRITU RA
--
--
Instrucción de carga
DEL RESULTADO EN EL FICHERO DE REGISTROS
etapa WB
Figura 1.14: Organi zac ión lógica de la segmentación de instrucciones de la ASO de cin co etapas .
28
1.7. ARQUITECTURA SEGMENTADA GENÉRICA
Resumiendo, la segmentación de la ASG da como patrón de ejecución el mostrado en la Figura 1. 15. Se puede observar que aunque cada instrucción necesita cinco ciclos de reloj para ser ejecutada, durante cada ciclo de reloj se est,í ejecutando alguna de las etapas pertenecientes a cinco instrucciones diferentes. La gran ventaja que proporciona la segmentación radica en que es posible comenzar la ejecución de una nueva instrucción en cada ciclo de reloj. Así, aunque la instrucción consume sus cinco ciclos (un ciclo por etapa), el resultado real es que en cada ciclo de reloj se conclu ye la ejecución de una instrucción. De esta forma y sin considerar los riesgos de la segmentació n (estructurales, datos y control), el rendimiento obtenido es de cinco con respecto a la misma máquina no segmentada para el ejemplo de la Figura 1.15.
Ciclo de retoj
Número de instrucción
1
2
3
Instrucción i
tF
ID
EX
IF
ID
EX
IF
ID
EX
IF
ID
EX
IF
ID
Instrucción i+1 Instrucción i+2 Instru cción i+3 Instrucción i+4
4
5
6
7
8
9
MEM WB MEM WB MEM WB MEM WB EX MEM WB
Figura 1.15: Patró n de ejecuc ión ob te nido en la segme ntación de la ASO al procesar cinco instrucciones.
Si n embargo, au nque la segmentac ión incrementa la producti vidad de la CPU, es decir, e l número de instrucciones completadas por unidad de tiempo, no red uce el tiempo de ejecución de una instrucción individual. Por el contrario, el tiempo total de ejecución de la instrucción segmentada es li geramente superior al de su equi valente no segmentada debido al tiempo que se consume en el control de la segmentación. Este tiempo viene determinado por varios factores: • Los celTojos o buffers de contención que hay que colocar en el cami no de datos del procesador con el objeto de aislar la infollnación entre etapas. • La du ración de todas las etapas de la segmentación es similar y viene determinada por la duración de la etapa más lenta. Ello es debido a que el paso de información de etapa a etapa se debe realizar de forma síncrona por lo que todas las etapas deben tener la mi sma duraci ón. • Los riesgos que se producen en la segmentación y que introducen detenciones en el cauce. La Figura 1.16 muestra el patrón de ejecución de tres instrucciones para las versiones segmentada y no segmentada de ASG. La du rac ión de las etapas de la segmentación oscila entre 40 y 60 nseg., con lo que la instrucc ión no segmentada consume un total de 250 nseg. , mientras que su equi valen te segmentada emplea 325 nseg. debido a que todas las etapas duran lo que la más lenta, 60 nseg., y hay que sumar los retardos producidos por los celTojos en cada etapa, 5 nseg.
29
INGENIERíA DE COMPUTADORES 11 250
250
250
Instrucción 1
Instrucción 2
Instrucción 3
(a) Ejecución no segmentada
Instrucción 1 1
65
65
65
65
65
60
r 60
60
60
60
60
60
60
60
60
60
60
60
60
Instrucción 2
1nstrucción 3
60
~
(b) Ejecución segmentada
Figura 1.16 : Patrón de ejecución segmentada y no segmentada de tres in strucciones.
1.8.
Riesgos en la segmentación
Una vez unificados todos los tipos de in strucci ón en una segmentación y definida la funcionalidad de todas las etapas de la segmentación, es posible realizar un análisis de la segmentación para identificar todos los riesgos que se pueden producir en la segmentación . Los riesgos de segmentación son consecuencia tanto de la organización de la segme ntac ión como de las dependencias entre las instrucciones . La dependencia entre instrucciones provoca que la instrucción que sucede a aquella con la cual posee dependencias no pueda ejecutarse en el ciclo de reloj que le corresponde, ya que ha de esperar algún resultado para poder efectuar su ejecución. Se denomina riesgo a la situación que inlpide a una instrucción acceder a la ejecución de sus etapas al depender de otra anterior. Los riesgos se traducen en una parada en el fiujo de las instrucciones dentro de las etapas de la segmentación a la espera de que la dependencia causante se resuelva. Las causas de los riesgos pueden ser varias. A continuació n, se consideran los tres posibles tipos de riesgos: • Riesgos es/ruc/urales: Surgen de confi ictos por los recursos, es decir, por insufi ciencia del hard ware debido a que una instrucción ubicada en una etapa no puede avanzar a la siguiente porque el hardware que necesita está siendo utili zado por otra . • R iesgos por dependencia de da/os: Surgen cuando una instrucción necesita los resultados de otra anterior, que todav ía no los tiene disporubles por no haberse terminado de ejecutar completamente. 30
1.8. RIESGOS EN LA SEGMENTACiÓN
• Riesgos de contm/: Se on gman a partir de las instrucciones de contro l de fluj o (saltos y bifurcac iones) debido a que no se puede leer la insb·ucción siguiente hasta que no se conozca su d irección, q ue prec isamente es calculada por la propia instrucc ión de control de fluj o.
En las siguientes secciones se analizan estos riesgos con más
d~ta ll e.
1.8.1. Riesgos estructurales Cuando se segmenta una máquina, la ejecución so lapada de las instrucciones req ui ere la segmentación de las unidades fun cionales y la duplicación de ciertos recursos para permilir todas las pos ibles combinacio nes de instrucciones en el cauce. Si alguna combinación de instrucciones no se puede realizar debido a confl ictos por los rec ursos se d ice que la máqu ina tiene un riesgo estructural. Como ejemplo considérese una máquina segmentada que comparte un único puerto de memori a para
datos e instrucciones. En este caso, cuando una instrucción contenga una referencia a la caché de datos, Acceso a memoria para buscar un dalo Conmelo al acceder a memoria
\ \
Ciclo de reloj
In strucción
1
2
3
Instrucción de ca rga
IF
ID IF
EX ~ffi:> WB
45
6
7
8
ID
EX
IF
ID
EX
Instrucción i+3
(t.D
ID
EX MEM WB
Instrucción i+4
/
IF
ID
Instrucción ;+1
Instrucción ;+2
/
9
10
MEM WB MEM WB EX MEM WB
Acceso a memoria para buscar una instrucción Solución al conflicto al acceder a memoria
In strucción
1
2
3
Instrucción de ca rga
IF
ID IF
EX
Instrucción ;+1 Instrucción ;+2 Instrucción ;+3 Instrucción ;+4
Ciclo de reloj 4 5 6
7
8
9
10
MEM WB
ID
EX
IF
ID
EX
detención
IF
MEM WB MEM WB
ID
EX
IF
ID
MEM WB EX MEM WB
Figura 1.17: D etenció n durante un riesgo estruc tural en una máqu ina con un ún ico puerto de memori a cuando se ej ecuta una in stru cc ión de carga seg uida de cuatro ins tru cciones aritmético~ l ógicas.
31
INGENIERíA DE COMPUTADORES 11
la segmentación debe detenerse durante un ciclo de reloj 6La máquina no puede buscar la siguiente instrucción debido a que la referencia al dato está utili zando el puelto de memoria. Por tanto, el inicio de una nueva instrucción se tendrá que retrasar un ciclo de reloj . La Figura l. 17 muestra que una segmentación con un único puerto de memori a es equivalente a realizar una detención cuando hay una instrucción de carga. Obsérvese que en la etapa MEM de la segmentación de la instrucción de carga hay que realizar un acceso a memoria para buscar el dato y en la etapa fF de la instrucción i + 3 hay que acceder a memoria para buscar la instrucción. Si no se produjese una detención en el ciclo de reloj 4, los dos accesos comentados se tendrían que reali zar simul táneamente. Sin embargo, como solo hay un puerto de memoria no es posible realizar esos dos accesos simu ltáneamente, siendo necesario detener la segmentación durante un ciclo (ninguna instrucción se inicia en el ciclo de reloj 4). Es importante observar que este proble ma surge en los sistemas con una única memoria caché para instrucciones y datos. En el caso de la ASG no se presenta este inconveniente porque se di spone de dos memorias caché, una para instrucciones (l-caché) y otra para datos (D-caché) . Sin embargo, hay máquinas que se diseñan con riegos estructurales por un motivo bien sencillo, reducir el coste de producción. Está claro que si un determinado ri esgo estructural no se presenta muy a menudo, puede que no valga la pena evitarlo y, simplemente, se acepta como un mal menor la aparición de un retardo en el funciona miento. En el ejemplo comentado previamente, el riesgo es tan notorio por el elevado número de veces que ocurre que vale la pena diseñar el procesador con dos puertos de acceso a memoria, uno para la lectura de datos y otro para la lectura de instrucciones . Otras situaciones en las que pueden aparecer riesgos estructurales son las siguientes:
• No lodas las etapas de la segmentación tienen la misma duración. En este caso alguna etapa de menor duración debería esperar a que termine la que sea más larga. Esto provocará que la duración efecti va de cada etapa sea igual a la duración de la etapa más larga. Normalmente, los procesadores actuales tienden a un número elevado de etapas en la segmentac ión, con lo que automáticamente tienden a igualarse los tiempos . • Hay instrucciones más complejas que Olras. Hay instrucciones que pueden neces itar más tiempo de CPU en la etapa EX. Por ejemplo, las instrucciones de carga y almacenamiento requ ieren menos trabajo de ALU que una di visión en coma flotante. Considere el fragmento de cód igo de la Figura l . l 8.a donde todas las instrucciones necesi tan un único ciclo de reloj en la etapa EX sa lvo las instrucciones de multiplicación y divi sión que necesitan dos ciclos, tal como se muestra en la Figura l . 18.b. Además, se supone que únicamente hay un puerto de escritura para almacenar los resultados en memoria. Al exi stir solo una unidad funcional aritmética, hasta que no se consumen los dos ciclos que neces ita la instrucción de multiplicar en su etapa EX no se puede iniciar la etapa EX de una nueva instrucción. 6A los ciclos detenidos en el cauce de la segmentación también se les denominan burbujas.
32
1.8. RIESGOS EN LA SEGMENTACiÓN i1 : ADD
R3 , R6, R7
i2: MULT R4, R1 , R2
i3: MU LT R5, R8 , R9 7(R11), R10
i4: SD
(a)
i1
r
IF,
i2
ID,
EX,
IF,
ID,
MEM,
EX,-MULT
IF,
i3
WB,
i4
MEM 2
ID,
- - - --
IF,
-----
I
WB,
EX,- MULT
MEMJ
WB,
I
- - - --
MEM.
ID,
EX,
WB,
I
(b)
Figura 1.18: Ejemplo de riesgo estructural c uando hay in strucciones más comp lejas qu e otras. i1
I
IF,
i2
ID,
EX,
IF,
ID, IF,
i3
MEM 1
EX1-MULT¡ EX 2-MULT 2
MEM 2
EX]-MULT, EX]-MULT 2
ID,
ID,
IF,
i4
WB ,
EX,
WB,
MEMJ
WB,
- - - --
MEM,
WB,
Figura 1.19: Duplicac ión de la unidad funcional aritmética. Se ti ene un ciclo de espera en la ejecución de estas 4 instrucciones. i1 i2 i4 i3
I
IF,
ID,
EX,
IF,
ID, IF,
MEM,
WB,
EX,-MULT ID,
EX,
IF,
ID,
MEM 2
WB,
- - - --
MEM4
EX,-MU LT
WB,
MEMJ
WB,
J
Figura 1.20: Planificación de código del tal manera que no se solape n dos etapas EX de dos instrucciones en el mismo ciclo de reloj. Se tiene un c iclo de espera e n la ejecución de estas 4 in strucciones.
En este caso se pueden plantear dos alternativas para evitar las detenciones en las etapas de la segmentación. Una primera solución sería segmentar o duplicar la unidad funcional aritmética de tal forma que se puedan solapar dos etapas EX de dos instrucciones en el mi smo ciclo de reloj (Figura 1.19), Otra solución sería separar, si se puede, las dos instrucciones de multiplicar (siendo ahora el orden de ejecución de las instrucciones i1-i2-i4-i3 ) como se muestra en la Figura 1.20, lo que se denomina planificación de código. Con estas soluciones se tiene únicamente un ciclo de detención en la segmentac ión a diferencia de los dos ciclos que se tenían en el caso ini cial (Figura l.1 8. b). Es importante 33
INGENIERíA DE COMPUTADORES 11
comentar que las detenciones de un c iclo que se siguen produciendo en ambas soluciones (Figura 1.19 Y Figura 1.20) son debidas a riesgos estructura les, ya que únicamente exi ste un puerto de esclitura en memoria por lo que no se pueden so lapar las etapas MEM de dos instrucciones.
1.8.2.
Riesgos por dependencias de datos
Los riesgos por dependencias de datos surgen cuando dos instrucciones comparten algún dato (operandos y resu ltados). La situación es la siguiente: una instrucc ión ij actuali za el va lor de un registro, pero una instrucción posterior ik accede a ese registro antes de que i j haya terminado la operac ión . Considérese la ejecución segmentada de las dos instrucciones sigui entes:
ADD SUB
Rl,R 2,R3 R4,Rl,R5
La instrucción SUB utili za como operando fu ente el resu ltado de la instrucción ADD. La instrucc ión ADD escribe Su resultado en el registro Rl que es, precisame nte, uno de los operandos fuente de la instrucción SUB. Si se tiene en cuenta la di stribuc ión de funciones en cada una de las etapas de la segmentación de la ASG, tal y como se muestra en la Figura l.2 l , la instrucción SUB leería el operando Rl en su etapa ID. Sin embargo, el resultado de la instrucción ADD, es decir, el valor de Rl, estará disponible en la etapa WB . Esto significa que en el diseño que se tiene hasta ahora no se obtendrían resultados COITectos cuando alguno de los operandos de una instrucción se modifi case en la in strucción anterior. Ciclo de reloj 2
Instrucción ADD R1,R2,R3
IF
ID
3
4
EX IMEMI
5
6
WB Se escribe R1
Instrucción SUB R4 , R1, R5
IF
ID
EX IMEMI
WB Se lee R1
Figura 1.21: Ejemplo de riesgo por dependencia de datos.
Los tiesgos por dependencias de datos se clasifican, en función del orden de los accesos de esctitura y lectura de las instrucciones, en tres tipos. Para explicarlos se consideran dos instrucciones i y j, donde i ocurre antes que j en el orden del programa .
• Riesgo de lipa RAW (Read After Wrile - Lectura Tras Escritura), también denominado dependencia verdadera, que se produce cuando la instrucción j intenta leer un dato antes de que la instrucción i lo escriba. Este es el tipo más común de ri esgos por depende ncias de datos. El ejemplo de la Fi gura 1.2 1 corresponde a este tipo de ri esgo . • Riesgo de lipa WAR (Wrile Afler Read - Escritura Tras Lectura), tambi én denominado an/idepen· dencia, se produce cuando la instrucción j trata de escribir en su destino antes que éste sea leído por la instrucc ión i. De este modo, en la in strucc ión i se obtiene un valor incorrecto. La Figura 1.22 muestra un ejemplo de riesgo tipo WAR. 34
1.8. RIESGOS EN LA SEGMENTACiÓN Ciclo de reloj
2
Instrucción ADD R1. R2. R3
IF
ID IF
Instrucción SUB R2. R4. R5
3
4
5
EX [MEM[ WB ID EX[MEM[
6
Se lee R2
WB Se escribe R2
Figura 1.22: Ejemplo de posible riesgo tipo WAR .
• Riesgo de tipo WAW (Write After Write - Escri tura Tras Escritura) , también denominado dependencia de salida, se produce cuando la instrucción j intenta escribir un operando antes de que éste sea escrito por la instrucción i. En esta situación se realiza la escritura en el orden incorrecto, dejando en el destino el valor escrito por la instrucción i en lugar del valor escrito por la instrucción j. La Figura 1. 23 muestra un ejemplo de riesgo tipo WAR. Tanto las antidependencias COIllO las dependencias de salida se denominan dependencias falsas. Ciclo de reloj
2
Instrucción ADD R1, R2, R3
Instrucción SUB R1 , R4, R5
IF
ID IF
3
4
5
EX [MEM[ WB ID EX [MEM[
6
Se escribe R 1
WB Se escribe R1
Figura 1.23: Ejemplo de posible riesgo lipo WAW. Observar que el caso RAR (Read After Read - Lectura Tras Lectura) no es un riesgo. Esta situación se produciría cuando dos instrucciones necesitasen leer un dato desde el mi smo registro. En ASO, ambas instrucciones leerán el mi smo registro sin problemas en la etapa de decodificación de la instrucción. En el caso de la ASO únicamente se puede presentar el riesgo por dependencia de datos de tipo RAW, E l riesgo de tipo WAR no se puede presentar porque en la segmentación de la ASO todas las lecturas de registro se rea li zan en la etapa ID y todas las escrituras de registro tienen lugar en la etapa WB , siendo la etapa ID anterior a la etapa WB. Por otro lado, elliesgo WAW se presenta solamente en segmentaciones que escriben en más de una etapa. Como la ASO únicamente escribe un registro en WB , esta segmentación evita esta clase de riesgos. Los riesgos por dependencias de datos se denominan riesgos por dependencias de datos en registros en el caso de que se trate de instrucciones aritmético-lógicas, y se denominan riesgos por dependencias de dalos en memoria cuando suceden CO D instrucciones de carga y almacenamiento. Ex isten varias alternativas para evitar los problemas que ocasionan las dependencias de tipo RAW. Se pueden distinguir dependiendo de la necesidad de disponer de algún elemen to hardware específico en el procesador segmen tado o de si se trata de una solución software que se implementa a través del 35
INGENIERíA DE COMPUTADORES 11
compilador. A la hora de dec idirse por una de las distintas soluciones habrá que tener en cuenta tanto su coste como el rendimiento que proporciona. Las alternativas más importantes para ev itar los problemas de los riesgos RAW son: • La reorganización de código. • El interbloqueo entre etapas. • El adelantamiento.
1.8.2.1.
La reorganización de código
Esta técnica software consi ste en disponer las instrucciones en el programa de forma que entre inst.rucciones con dependencias de tipo RAW ex istan instrucciones que permitan retrasar la segu nda instrucción con respecto a la primera, dando tiempo a que la primera haya escrito su resultado antes de que la lectura ocasionada por la segunda tenga lugar. Es importante darse cuenta de que esta reorgani zación solo puede hacerse si se mantiene la semántica ori ginal del programa, es decir, el orden original de las lecturas y las escrituras de los registros y la memoria. E l siguiente fragmento de código muestra un ejemplo de instrucciones que no se pueden reorganizar porque se perdería la semántica original. Las instrucciones i l, i 2, i3 e i4 utili zan el registro R3 en escrituras y lecturas por lo que no es posible modificar su secuencia de ejecución sin perder la semántica original del programa.
il : i2: i 3: i4: iS:
ADD ADD SUB LD LD
R7,R3,R2 R3,R2,Rl RS,R3,R4 R3,lSrY(R9) RS,lrYrY(R6)
En la Figura 1.24.a se muestra un fragmento de cód igo en el que ex iste una dependencia de datos de tipo RAW entre las instrucciones i2 e i3 a causa del registro R3 . Como se puede observar en este caso, el compilador puede detectar la dependencia de datos y reorgani zar las instrucciones para retardar el acceso al registro R3 hasta que esté actualizado. Para evitar la dependencia de i3 respecto a i2 se neces ita que i 3 comience su ejecución cuatro ciclos después de que lo haga i2 como se muestra en la Figura 1.24. b. Como se puede apreciar en la F igura 1.24.c, esto se ha conseguido con la reorganización que ha realizado el compil ador, intercambiando i2 por il y adelantado i4 e iS a i 3. Si se tiene en cuenta que al fi chero de registros se accede dos veces en un ciclo de reloj , es posible realizar las escrituras en el Aanco de subida (en la primera mitad de la etapa WB) y las lecturas en el fl anco de bajada (en la segunda mitad de la etapa ID). Por tanto, considerando esta nueva hipótesis, en el ejemplo de la Figura 1.24 se reducen a tres los ciclos que separan la ejecución de i3 respecto a i2 , con lo que la reorganización del código cambi a como se muestra en la Figura 1.25. E n el caso de que el compilador no pueda reorganizm· el códi go para encontrar las k instrucciones que se tienen que desv im· sin modificar la lógica del programa, debe insertar instrucc iones NOP (instrucciones de No OPeración) entre las in strucciones que tengan dependencias de datos. 36
1.8. RIESGOS EN LA SEGMENTACiÓN
i1: LO
R7 .200(R9)
i1
i2:ADD
RJ . R2. R1
i2
i3: MULT R5. RJ , R4
i3
i4: LD
i4
R1 ,200(R10)
I
IF,
EX,
MEM .
WB ,
IF,
ID,
EX,
MEM 2
WB/
IF,
ID,
EX,
MEM3
WB,
/"
IF,
ID,
EX,
MEM.
WB,
IF,
ID,
EX,
MEMs
lectura de R3
R2, JOO(R11)
i5: LD
Escritura de R3
ID,
i5
WB,
I
WB,
I
(a)
i1
I
IF,
ID,
EX,
MEM 1
WB,
IF,
ID,
EX,
MEM 2
i2
4 ciclos
i3
WB, IF,
i4
ID,
EX,
MEMJ
WB,
IF,
ID,
EX,
MEM.
WB,
IF,
ID,
EX,
MEM,
i5
WB,
I
(b) Escritura de R 3
2 ADD : i1 : LO
0
RJ , R2, R1
i2
R7,200(R9)
i1
I
i4:LD
R1 , 200(R10)
i4
~5 LD
R2 ,300(R11)
i5
i3: MULT R5 , R3, R4
I
/ IF,
ID,
EX,
MEM 2
WB,
IF,
ID,
EX,
MEM 1
WB ,
IF,
ID,
EX,
MEM.
WB,
IF,
ID,
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
i3
.--/'
lectura de R3 (e)
Figura 1.24: Ejemplo de riesgo por dependencia de datos RAW con reorganizac ión de código.
37
INGENIERíA DE COMPUTADORES" EsCritUra de R3
i1 i2
I
IF,
ID,
EX,
MEM 1
WB,
IF,
ID,
EX,
MEM,
W~,
/'
IF,
Iq,
EX,
MEM,
IF,
ID,
EX,
IF,
ID,
3 ciclos
i3 i4
Lectura de R3
/
i5
WB,
MEM4 WB, EX,
MEM,
WB,
I
(a) Escritura de R3
R3, R2,R1
i2
i1: LO
R7,200(R9)
i1
14: LD
R1,200(R10)
14
\ ,2:ADD
(
i3: MULT R5,R3,R4
i3
i5: LD
i5
R2,300(R11)
l
/'
IF,
~B,
ID,
EX,
MEM,
IF,
ID,
EX,
MEM 1
WB ,
IF,
ID,
EX,
MEM.
WB,
IF,
19~
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
~ l ectura de R3
WB,
I
(b)
Figura 1.25: Ejemplo de riesgo por dependencia de datos RAW sin y con reorgani zación de código cuando la escritura se realiza en el flanco de subida y la lectura en el Aanco de bajada.
Considérese el fragmento de código de la Figura l. 26.a e n e l que existen dependencias de tipo RAW entre las instrucciones i 1, i2 e i3 a causa de los registros R1 y R3 . En este caso se observa que las instrucciones no se pueden reordenar si n alterar la lógica del programa, por lo que e l compil ador inserta las instrucciones NOP necesari as para ev itar la ejecución errónea de instrucc iones por dependencia de datos como se muestra en la Figura 1.26.b. La ventaja de la solución de la reorgani zación de códi go es que no se requi ere un hard ware adicional pero se necesita un compilador más complejo y una pérdida de tiempo si es necesario insertar instrucciones NOP c uando no se puede reordenar e l programa para insertar instrucciones útiles.
1.8.2.2.
El interbloqueo entre etapas
E n este método se introducen elementos hardware en e l cauce para detectar la existencia de dependencias. En el caso de que se detecte una, la instrucción que debe leer el res ultado proporcionado por la primera se detiene el número de ciclos necesario. Mediante esta técnica se consigue que e l programa termine correctamente (igua l que cuando se introduce una instrucción NOP), pero se siguen perdiendo ciclos sin que se terminen instrucciones, no ev itándose un a disminución del rendimiento. La Figura 1.27 muestra un eje mplo de esta técnica. La instrucción i3 queda detenida en su etapa 1F3 38
1.8. RIESGOS EN LA SEGMENTACiÓN
Escritura de R 1 /
11: LO
R1. 200(R9)
11
12: ADD
R3, R2, R1
12
13: MULT R5, R3. R4
13
14: ADDI
14
R3, R3, #1
I
IF ,
ID, IF,
,
-" Lectura de R1
Escritura de R3
EX,
MEM¡
WB,
ID,
EX,
MEM z
WB,
IF,
ID,
EX,
MEM 1
WB,
IF,
ID,
EX,
MEM.
./
/ '
WB,
I
Lectura de R3
(a)
11
I
IF,
ID,
EX,
MEM¡
WB,
NOP NOP NOP 12
IF,
ID,
EX,
MEM z
WB,
NOP NOP NOP IF,
13 14
ID,
EX,
MEMJ
WB,
IF,
ID,
EX,
MEM.
WB,
I
(b)
Figura 1.26: Ejemplo de riesgo por dependencia de datos RAW in sertando inS LntCciones NO?
39
INGENIERíA DE COMPUTADORES 11
basta que la instrucción i2 escribe en R3 en su etapa WB 2 . En ese momento la instrucción i3 ya puede leer el contenido de R3 en su etapa ID3. La instrucción i4 está detenida durante tres ciclos porque la i3 todavía no ha abandonado la etapa IF de la segmentación. i1: LD
R7,200(R9)
i2: ADD
R3 , R2 , R1
i3: MULT R5, R3, R4 i4: LD
R1,O(R2)
i5: LD
R3,O(R4)
I
IF,
ID,
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
IF,
Escritura de R3
/ /V / V / / /V / V /
W
Lectura de R3
WB,
/' ID,
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
WB,
J
Instrucción detenida
Figura 1.27: Ejemplo de riesgo por dependencia de datos RAW con interbloqueo entre etapas.
1.8.2.3.
El adelantamiento (caminos de bypass o forwardillg)
Mediante esta técnica se pueden aprovechar los elementos que en la técnica de interbloqueo permiten detectar la existencia de dependencias entre instrucciones . Sin embargo, esta información ahora se aprovecha para habilitar una serie de caminos (buses) que se añaden al cauce para permitir que los resultados de una etapa pasen como entradas a la etapa donde son necesarios en caso de dependencias RAW, al mismo tiempo que siguen su camino para almacenarse en el fichero de registros. En la Figura 1,28 se muestra un esquema de las modificaciones que hay que introducir en las etapas ID y EX de la segmentación de la Figura 1,14 para implementar esta técnica. Como se puede observar en la Figura 1,28, para implementar esta técnica se han introducido un par de multiplexores en cada una de las entradas de la ALU y una lógica de comparación para posibilitar el bypass. Las entradas de estos multiplexores son los identificadores de los registros de los operandos fuente y el identificador del registro destino en el que la ALU escribirá su resultado. Los buses que conectan el registro Resul tado ALU con la entrada con'espondiente en los multiplexores se muestran en la figura con un trazo más grueso, y son los que forman el atajo o camino de bypass que permite adelantar el resultado obtelüdo al final de la etapa EX, en el caso de que hubiera una dependencia de datos de tipo RAW entre dos instrucciones consecutivas. Para determinar la existencia de ese riesgo es para lo que se uti liza la lógica de bypass o lógica de atajo. Este circuito comprueba si hay coincidencia entre el identificador del registro de destino Rd de la instrucción que acaba su etapa EX (entrada 3 a la lógica de by pass) y los identifi cadores de los registros fuente de los operandos (Rfl y Rf2) de la siguiente instrucción, que va a iniciar su etapa EX (entradas 1 y 2 a la lógica de bypass). Si ex iste coincidencia con Rfl se act iva la entrada 4 del multiplexor para conectar el registro Resul tado ALU con la entrada de la ALU en lugar de que sea el regi stro Operando 1 el utili zado. Se procede de igual forma si la 40
1.8. RIESGOS EN LA SEGMENTACiÓN
,--------------
LÓGICA DE DECODIFICACiÓN DE LA INSTRUCC iÓN
Id . registros fuen te
Iden.tificado~~s ~e la mstrucClon,
I_~_'--~_-'--_~---' Rd Rf1 Rf2 .L
,
Id. reg. 1 destino :
, , I~'::I~' : I~':~t~' :
FICHERO DE REGISTROS
DECODIFICACiÓN DE LA INSTRUC CiÓN Y LECTURA DE OPERANDOS
etapa ID
,
t
,
, 3
Identificador de
etapa EX
~
la instrucción ;-1 ~ I ______
EJECUCiÓN DE OPERACIONES ALU Y CÁLCULO DE LA CONDICiÓN Y DIRECCiÓN DEL SALTO
, --~
Figura 1.28: Solución co n bypass o atajo para ri esgos por dependenc ia de datos RAW.
coincidencia es entre Rd y Rf2. En este caso se acti va la entrada 5 del otro multiplexor para que se utilice como entrada a la ALU el registro Resul tado ALU en lugar del registro Operando 2. En la Figura 1.29 se muestra un ejemplo de ejecución de dos instrucciones con dependencia RA W que ilustra el funcionamiento de la técnica de atajo o bypass, indicando la sucesión temporal de los eventos asociados a la gestión del riesgo.
1.8.3. Riesgos de control Cuando se ejecuta un salto condicional, el valor del contador del programa puede incrementarse automáticamente o cambiar su valor en fun ción de que el salto sea efectivo o no efectivo. En la ASG, si 41
INGENIERíA DE COMPUTADORES 11 Cálculo de R3 y se almacena en Resultado ALU
Lectura de
R2 Y R1
i1 : ADD R3 , R2 , R1
IF, IF,
i2: ADD R4 , R3, R5
ID,
1
Lectura de R3 y R5
Resultado ALU en una entrada de la ALU
.. Realiza la suma correcta: R5 + (resullado de R2+R1)
La lógica de bypass detecta que el operando R3 de i2 (Rf1) coincide con el resultado de i1 y conecta Resultado ALU a una entrada de la ALU
Figura 1.29: Ejemplo del fun cionamiento de la téc¡üca de atajo o bypass. la in strucción i es un salto efectivo entonces el pe no se actua liza hasta el final de la etapa MEM de la segmentación, una vez que se haya verifi cado la cond ición y calculado la nueva dirección de l pe en la etapa EX. Esto signifi ca que la detención en el cauce es de tres c iclos de reloj, al final de los cuales el nuevo pe es conocido y se puede buscar la instrucción de destino del salto. Esta situación se denomina riesgo de COllf1V1 o riesgo de salto. La Figura 1.30 muestra una detención de tres ciclos ocas ionada por un riesgo de control debido a que en ASG la instrucción de destino de sa lto no se conoce hast el fina l de la etapa MEM . La Figura 1.3 1 soluc iona este inconveniente debido a que se busca la sigui ente instrucción en la secuencia, la i + 1, aunque se ignora y se vuelve a comenzar la búsqueda de la instrucción correcta una vez que se conoce el destino de l salto. instrucción de salto
instrucción i+ 1 instrucción i+2 instrucción i+3 instrucción i+4
I
IF,
ID,
EX,
MEM,
WB,
/ / / / / / IF¡" 10 ", V/ / /V/ IFjo2 / /V/ V/
EX,., MEM/
10;'2
EX",
IF;'3
10103
Ex,.,
IF¡.~
10¡'4
V/ V/ V/
MEM¡'J W8¡'J
EX¡'4
MEM¡'4 WB,.. [
l : z ! lnstrucción detenida La instruccJón i+1 puede corresponderse con la siguiente en la secuencia del programa o estar alejada cuando el salto sea efectivo.
Figura 1.30: Detención ideal de la ASG debido a un riesgo de control. E n la F igura 1. 32 se muestra un esquema de las modifi caciones que hay que in troducir en las etapas lF, ro y EX de la segmentac ión de la Figura 1.1 4 para procesar las instrucciones de salto condi cional. En la fi gura aparece explícitamente el pe, que en cada cicl o se inc rementa automáticamente para ap untar a la siguiente instrucc ión a buscar (en condi ciones normales se incremen ta en 4 bytes si la memada 42
1.8. RIESGOS EN LA SEGMENTACiÓN
instrucción de salto instrucción i+ 1 instrucción i+2 instrucción i+3 instrucción i+4
l
IF,
ID,
IF,.,
EX,
MEM,
WB,
/ / 1/ / IF ';'I ID ~, EX'101 MEM:" WB~ , / / 1/ / 1/ / IF¡'2 1°"1 EX MEM¡'2 WB¡'l 1/ / 1/ / 1/ / IF"l ID¡'J EX;.) MEM,.) WB¡.) 1/ / 1/ / 1/ / IF" ID... EX,.• MEM"4 lo1
4
W
WB",¡
Instrucción detenida
l a instrucción i+ 1 puede corresponderse con la siguiente en la secuencia del programa o estar alejada cuando el salto sea efectivo. Si el sallo no es efectivo, la etapa IF,o, es redundante para la instrucción ;+1 .
Figura 1.31: Detenc ión real de la ASG después de un riesgo de control.
se direcciona por bytes o en I si se direcciona por palabras de 4 bytes). Como en las instrucc iones de salto condicional el PC debe cargarse con la dirección de destino del salto (si éste es efecti vo), existe un multiplexor que permite controlar el valor de carga del PC: el valor actual incrementado (si el salto no es efectivo) o el valor correspondiente a la dirección de destino (si el salto es efecti vo) que se ha calcu lado en la etapa EX. La señal que controla el cam ino habilitado por el multiplexor se genera mediante el módulo denominado Lógica de condición, y tiene en cuenta los bits de condición de la instru cción (si igual a cero, si di stinto a cero, si mayor, etc.), el tipo de salto que codi fica el código de la instrucción de sal to cargada (salto condicional o bifurcación) y el regisb'o fuente con el que se comprueba la condición (Operando 1). Si se verifica la cond ición de salto, se genera la señal de entrada del multiplexor con el resultado de la suma de PC y el registro Operando 2 (almace na el valor que hay que sumar al PC para obtener la dirección del salto) para que se cargue en el Pe. A unque exi sten varios métodos para tratar los riesgos de control , a continuación se comentan
únicamente los esquemas que se aplican en tiempo de compilación. En estos esquemas, las predicciones sobre si el salto es efectivo O no son estáticas ya que son fijas para cada salto y no ti enen en cuenta el historial del salto. En el Capítulo 2 se estudiarán detalladamente las técnicas de predicción dinámicas. El esquema más fácil de impl ementar en ASG es detener la segmentación hasta que se conoce el resultado del salto, introduciendo tres instrucciones de no operación (NOP) después de cada in strucción de salto condicional. En este caso se reduce el rendimiento de la segmentació n ya que no se termina ninguna instrucción durante tres ciclos. La Figura 1.33 muestra con un ejemplo la secuencia de eventos que se producen cuando se introducen tres instrucciones de no operación después de un salto condicional. Otra alternativa sería dejar que las instrucciones que se han captado prosigan su ejecución en el cauce. En este caso, el compilador debería introducir en esos huecos instrucciones que se tengan que ejecutar antes de la instrucción destino de salto de forma que su efecto sea independiente de que el salto sea efecti vo o no. En la Figura 1.34 se muestra un ejemplo de esta situación. Las instrucciones i 1, i2 e i3 deben ejecutarse antes de que se produzca el salto i4. Como son independientes de la instrucción de salto
43
INGENIERíA DE COMPUTADORES 11
Sallo
eta pa lF
I
I
PC
1
------------ ----
------ ------
$
I
I-CACHE
eta pa ID
MUX
r ,efectivo
LÓGICA DE DECODIFICACiÓN DE LA INSTRUCC iÓN Desplazamiento
Identificadores de registros fuente
inslrucción de salto
BANCO DE REGISTROS
•
I ca I condición I ,, ,,, ,, , ,,
eta pa EX
I Operando 1 I
Operando 2
I
,-- ,~ - ------ - ---- - --- -
, - - , , ,,, , ,,,
•
•
( Lógicade ) condlClon
2
1
(LÓgiCa de bypass
3
,,, ,,
I _ _ ____
e J
] MUX
I
5
r
Modo de direccionamiento
MUX
I
MUX
"~ ~ Resullado ALU
I
- - -- ,,
,, ,,, ,,, ,,, ,,, ,,
,~--- - - - ---------------- - --- - - - -- - --------- - ---------
------ --- --- ----------- --- --- --- -- ---- - --- - --- ---- - - - - - - - -
etapa MEM
Figura 1-32: Implementación de los salios condicionales en la ASG.
44
1.8. RIESGOS EN LA SEGMENTACiÓN
Verifica la condición y ca Ieu lai ad'Ireea 6n de de,l;no
/
Acualización del
i1 : ADD
I
R3. R3. R1
IF,
i2: BEQZ R7 , etiqueta
ID,
EX,
MEM 1
WB,
IF,
ID,
EX,
MEM 2
pe
/ WB,
i3: NOP i4: NOP i5: NOP IF.
in : Instrucción destino del sallo
ID.
EX.
MEM.
WB.
I
Nuevo pe
Figura 1.33: Uso de in strucc iones NOP e n la ejec ución de ulla in strucc ión de sa lto condic ional para no abortar instrucciones captadas erróneamente. i1:ADD
R6 . R5. R4
i2:ADDI
R6 . R2 . #4
i3: SUB
R7. R6 . R1
I
IF,
ID,
EX,
MEM 1
WB,
IF,
ID,
EX,
MEM 2
WB,
IF,
ID,
EX,
MEM]
WB,
IF,
ID,
EX,
MEM.
i4: BEQZ R3 , etiqueta
WB,
i5: NOP
i6: NOP i7: NOP IF.
in: instrucción destino del sallo
Nuevo
I
i4: BEQZ R3 , etiqueta
i1: ADD
R6. R5 . R4
i2: ADDI
R6 . R2 . #4
i3: SUB
IF,
R7. R6. R1
in : instrucción destino del salto
MEMn
WB.
I
pe
ID,
EX,
MEM.
WB,
IF,
ID,
EX,
MEM,
WB,
IF,
ID,
EX,
MEM,
WB,
ID,
EX,
MEM]
WB,
IF.
ID.
EX.
MEM.
IF,
EX.
ID.
WB.
J
Nuevo pe
Figura 1.34: Ejemplo de aplicación de la téc nica de sa lto retardado.
45
INGEN IERíA DE COMPUTADORES 11
debido a que no hay dependencias de datos se podrían ubicar justo después de la instrucción de salto. De esta form a se ejec utarían las instrucciones il , i2 e i3 y después la instrucc ión que debe seguir a la instrucción de salto, sea éste efectivo o no, tal como debía ocurrir en la situación ini cial. Gracias a esta técni ca, el cauce puede continuar terminando una instrucción por ciclo, mejorando así su rendimiento. Esta técnica se conoce con el nombre de salto retanlado (delayed brand /). Un esquema mejor y solo li geramente más complejo es predec ir el salto como no efecti vo, permiti endo que el hardwme continúe procesando la sigui ente instrucc ión en la secuencia del programa como si el salto fuese efecti vo. En esta técni ca, denominada ejecuci6n especulati va, hay que tener cuidado de no cambi ar el estado de la máquina 7 hasta que no se conozca definiti vamente el resultado del salto ya que se produce la ejecución de instrucciones que, dependiendo del resultado del salto, podrían no haberse tenido que ejecutar. En el caso de que el sal to sea efecti vo será necesario detener la segmentación y recomenzm la búsqueda ele la instrucción destino del salto. Por tanto, las in strucciones que se estaban 7EI estado de la máquina viene defini do por el contador de programa. el fic hero de registros
y el espacio de memoria
as ignado al programa que ocupa el procesador en un instant e dado.
instrucción de salto no efectivo
l
IF,
instrucción i+ 1
ID,
EX,
MEM,
WB,
IF¡"
ID,.,
EX/.,
MEM Io1
IFIo1
IDIo2
EX¡.z
IF¡.]
ID;o]
EX¡.]
IF Io•
10;0.
instrucción ;+2
instrucción i+3 instrucción ;+4
W 8 "1
MEM.. 2 W B.. 2 MEM..J WB¡.)
EX
M
M E M!.~
WBe,
I
(a)
instrucción de salto efectivo instrucción i+ 1 instrucción ;+2 instrucción i+3 instrucción ;+4
I
IF,
ID,
IF;o!
EX,
MEM,
WB,
/ /V/ IF'¡., ID'.. , EX'¡., MEM ',. , WB'''l / /V/ / / IF,.! 10 EX MEM;'2 WB'.2 V/ / / / / IF¡.] 1D"3 EX"J MEM¡'J WB¡.] MEM.. / / / / / / IF¡'4 10 M
M
1'4
W
E X,,~
4
WB,.,¡
Instrucción detenida
La etapa IF'", se corresponde con la instrucción desUno del sallo (;+1).
(b)
Figura 1.35: Esq uema de predec ir un saJto como no efec ti vo y la secuencia de la segmentac ió n cuando no es efecti vo (a) y clIando es efecti vo (b).
46
1.9. PLANIFICACiÓN DINÁMICA: ALGORITMO DE TOMASULO
ejecutando por detrás de la instrucción de salto se eli minan . Esta situación provoca una pérdida de tres ciclos de reloj . En el caso de que el salto no sea efectivo no penali za con pérdidas de ciclo de reloj. La Figura 1.35 muestra ambas situaciones. Finalmente, también se contribuiría a mejorar considerablemente el rendimiento del procesador frente a los saltos si se adelantara el cálculo de la dirección y de la condi ción de la instrucción de salto a las plimeras etapas del cauce. Por ejemplo, si se organi za convenientemente el hard ware de la etapa ID para que en dicha etapa se realice la determinación de que la instrucción es de salto, el acceso al registro en el que se eva lúa la condición, así como la obtención de la dirección del destino del salto (se requi ere un sumador que pueda sumar en la etapa ID), solo habrá una detención de un cic lo de reloj en los saltos frente a las tres que se tenían en el caso de no añadir este hm'dware adicional (Figura 1. 3 1). La Figura l. 36 muestra la segmentación cuando hay una instrucc ión de salto y se tiene el hardware adicional necesario para tratar el salto en la etapa ID. instrucción de salto
instrucción i+1 instrucción i+2 instrucción i+3
[ IF,
ID,
EX,
MEM¡
IFfo1
IF:"
ID'jol
V/
IF"2
V/
instrucción i+4
W
WB,
EX'Io ' MEM'¡' 1 WB',., 10;'2
EX¡.z
MEM;.2 WB¡.z
IFfo)
10"3
EX..) MEM.. J
//
IF,.•
ID...
EX...
WB,.] ME M...
WB,.• [
Instrucción detenida
Si el sallo es efectivo la etapa IF'¡., se corresponde con la instrucción destino del salto (;+1).
Figura 1.36: Detenc ió n real de la ASa después de un ri esgo de co ntrol cuando se tiene hardware adicional para tratar el sa lto e n la e tapa ID .
1.9.
Planificación dinámica: Algoritmo de Tomasulo
Hasta este momento se ha considerado la planificación estática como la única técnica que se utiliza en un procesador segmentado pm'a realizar el procesamiento de las instrucciones. Un procesador segmentado como ASO con planificació n estática busca una instrucción y la envía a la unidad funcional (emisión) a menos que haya una dependencia verdadera entre esa instrucción y otra que ya esté en el cauce y que no pueda ser ev itada mediante adelantamiento. Si hay dependencias tipo RAW que no pueden ser resueltas entonces se detienen, empezando con la instrucción dependiente que usa el resu ltado que tiene que generar otra instrucción que va por delante. No se busca o emite ninguna instrucción hasta que se solucione la dependencia. La principal limitac ión de las técnicas de segmentación estática es que emiten las instrucciones en orden. Si el procesador se detiene con una instrucc ión , las posteriores no pueden proceder au nque no
47
INGENIERíA DE COMPUTADORES 11
mantengan ninguna dependencia con las instrucciones que van por delante en el cauce. De esta manera, una dependencia entre dos instrucciones espacialmente cercanas en el procesador segmentado puede dar lugar a un riesgo y a una detención. Si , además, hay múltiples unidades funcionales, estas pennanecerán inactivas. Así, si una instrucción j depende de una instrucción ; que consume muchos ciclos y que está actualmente en ejecución, todas las instrucciones posteriores aj deberán detenerse hasta que termine i y se pueda ejecutar j. Una alternativa es la planificación dinámica en la que e l hardware reorgani za la ejecución de la instrucción para reducir las detenciones mientras mantiene el fluj o de datos y la consistencia del estado del procesador y de la memoria. Entre las ventajas de la planifi cación dinámica está el aprovechamiento más óptimo en tiempo real de una etapa EX con múltiples unidades funcionales, con lo que se simplifica el trabajo del compilador. Sin embargo, las ventaj as de la planificación dinámica se consiguen a costa de un importante aumento en la complejidad del hardware, como se verá al estudiar los procesadores superescalares en el Capítulo 2. Aunque un procesador con planificación dinámica no puede cambiar el fluj o de datos, intenta evitar detenciones cuando hay dependencias RAW que pueden generar riesgos . Por contra, un procesador segmentado con planificación estáti ca en tiempo de compilación, intenta minimi zar las detenciones separando las instrucciones dependientes, de form a que no puedan dar lugar a riesgos. En la ejecución de instrucciones en la ASO de cinco etapas, los riesgos estructurales y de datos se pueden comprobar durante la decodifi cación de la instrucción en la etapa ID. Cuando una instrucción se pueda ejecutar sin riesgos, se emite sabi endo desde ID que todos los riesgos tipo RAW han sido resueltos. Medi ante la planifi cación dinámicas se comprueban los riesgos estructurales cuando se decodifica la instrucción. Este hecho conlleva que todavía se mantiene el orden del programa, pero las instrucciones comienzan a ejecutarse tan pronto como todos sus operandos están di sponibles. De esta manera, el procesador segmentado realizaria ejecución de instrucciones fuera de orden, lo que implica terminación fuera de orden. La ejecución fuera de orden introduce la posibilidad de tener que gestionar más ri esgos que no ex istirían en un cauce de cinco etapas ni en su extensión a un procesador segmentado con operaciones en coma flotante y ejecución en orden. Para permitir la ejecución fuera de orden es necesario desdoblar la etapa ID del procesador segmentado de la ASO en: • Decodificación (ID, Ins/ruc/ion Decoding): Decodifi cación de instrucciones y comprobación de los riesgos estructurales . • Em.isión (H, In s/ruc/;on Issl/e): La instrucc ión espera has ta que no haya riesgos de tipo RAW y cuando estén li stos todos los operandos fuente, se leen y se emite la instrucc ión hacia la unidad funcional. II Es importante observar que 1<1 pl ani ficación dinámi ca tiene sen tido cuando hay múltiples unidades funcionales y por eso hay que diferenciar entre distribu ir las instrucciones hacia las unidades funcionales y comenzar su ejecución.
48
1.9. PLANIFICACiÓN DINÁMICA: ALGORITMO DE TOMASULO
La decodificación de instrucciones (ID) precede a la etapa de emisión. La ejecución (etapa EX) es la etapa siguiente a la emisión (I1). Como el cauce permite tener múltiples instrucciones en ejecución al mismo tiempo, será necesario disponer de múltiples unidades funcionales (hipótesis que se asume). Para mostrar las diferencias en la ejecución entre un código no planificado y el mismo código usando planificación dinámica, se supone una configuración en la que la latencia de la unidad de multiplicación es de cinco ciclos y la de la unidad de suma de dos cic los pernlitiéndose el adelantamiento. Se parte del fragmento de código que se muestra en la Figura 1.37.a. En este código existe una dependencia de datos entre la primera y la segunda instrucción, que será la que resalte las diferencias entre la ejecución sin planificación y con planificación dinámica. Esta dependencia de datos influirá en ambas ejecuciones, tal y como se ve en la Figura 1.37, ya que en ambos casos detiene la ejecución de la segunda instrucción. Lo que varía es el tratamiento de aquellas instrucciones que son posteriores a la que tiene elliesgo, pero que no tienen ninguna dependencia y, por lo tanto, podrían ejecutarse correctamente. i1 : MULTD FO, F2, F6 i2: ADDD
F4, FO , F2
i3: ADDD
F8, F2, F6
i4: SUBD
F10, F6.F2
(al 2
3
4
5
6
i1 I tF,
ID ,
EX,
EX ,
EX,
EX ,
i2
IF,
ID, IF,
i3 i4
10
7
8
9
EX,
MEM,
WB,
EX,
EX,
MEM 2
WB,
ID,
EX,
EX,
MEMJ
IF,
ID,
EX,
EX,
/ / V / V/ / / / / VV / / /V IV / IV V IV V /V
11
12
13
WB,
MEM4 WB, J
(b) Sin planificación
i1 i2 i3 i4
I
IF ,
2
3
ID ,
11 ,
IF,
ID, IF,
4
EX,
5
EX ,
6
EX,
7
8
9
10
EX ,
EX ,
MEM ,
WB ,
EX,
EX,
["A/ V/ V/ VV V/ ID,
11,
EX,
IF,
ID,
11,
EX,
MEM]
WB,
EX,
EX,
MEM4
11
12
MEM,I WB, I
WB,
(e) Planificación dinámica
C2:2J
Instrucción detenida
Figura 1.37: Ejemplo de la ejecución de un f ragmento de código sin planificación y co n planificación di námica.
49
INGENIERíA DE COMPUTADORES 11
La ejec ución sin planificac ión (Figura 1.37. b) se caracteri za por una emisión y terminación en orden de las in strucciones. Como la instrucción que tiene el riesgo, la i2 , ha sido detenida en la etapa ID , todas aque llas instrucc iones que estén en una etapa previa son detenidas (en este caso solo la etapa IF). Es decir, hasta que la instrucc ión de la etapa ID conozca e l valor correcto de su operando fuente no avanzará a la etapa EX, perm.iti endo as í e l avance del resto de l cauce. Esto ocas iona que durante cuatro ciclos haya recursos del procesador que estén infrautilizados. Este proble ma será más crítico cuanto mayor sea la latencia de la instrucción que tiene que escribir el operando fu ente. Es importante observar que este inconveniente ha sido minimi zado con la técnica de l ade lanta miento, que permite que una in strucc ión que esté esperando por un operando fu ente lo rec iba tan pronto ha sido calculado y no tenga que esperar a la escritura. En el ejemplo esto permite que la segunda instru cción pase a la etapa EX en el ciclo ocho, en lugar de esperar al ciclo JO e n e l caso de no utilizar el adelantamiento. Por su parte, la aproximación basada en la pl anifi cación dinám.ica (Figura 1.37.c) permite una ejecución fuera de orden y puede tener varias instrucciones en la etapa de emi sión simultáneamente, con lo que aunque la segunda instrucc ión se quede parada, las instrucciones siguientes de l ejemplo puedan avanzar su ejecución, ya que no ex iste ninguna dependencia. El proble ma de ejecutar instrucciones fuera de orden es que terminan fuera de orden con el inconveniente de que se puede perder la semántica del program a original. En el ejemplo considerado es posible permitir la terminac ión fuera de orden de las instrucciones porque no se viola ninguna dependencia con lo que la semántica de l programa permanece inalterable. Una solución sencilla para terminar las instrucciones en orden consiste en introducir detenciones o burbujas en las instrucciones que lo necesiten. E n la Figura 1.37 se puede comparar el rendimiento conseguido por ambas ejecuciones. Se observa que en la ejecución en orden, en el cicl o décimo sol o ha fina li zado una insu-ucción yen la planifi cación dinámica son tres las instrucciones que han fin alizado su ejecuc ión . A continuac ión, se presenta una de las primeras técni cas basada en la planifi cación dinámica: e l algoritmo de Tomasulo. De este algoritmo se deri van las técni cas de planificación dinámica que utili zan todos los procesadores superesca lares actuales. El algoritmo de Tomas ulo se utilizó en la unidad de coma fl otante del mM 360/9 1, cuyo objeti vo era conseguir un alto rendimiento y ev itar los grandes retrasos que se tenían en los accesos a memoria y en las operaciones de coma fl otante. En principio, se di señó solo para operaciones de coma fl otante pero se puede apli car a todas las clases de instrucciones. La Figura 1.38 muestra el di seño modificado de la uni dad de coma fl otante (FPU - Floating Poin/ Vni/) del lBM 360/9 Lque se va a utili zar para explicar e l algoritmo de Tomasulo. La FPU contiene dos uni dades funcionales: una unidad de suma de coma fl otante y un a unidad de multip licación/división de coma fl otante. Ex isten tres ficheros de registros e n la FPU: los registros de coma fl otante FR (Floa/ing Regis/ers), los bu fl-ers de coma flotante FE (Floating Bl.lffers) y los buffers de a Lmacenamiento de datos SDB (S/o re Da/a Buffe rs). La generac ión de direcciones y eLacceso a memoria se reali zan fuera de La FPU. Cuando se obtienen los datos de memoria se cargan e n un o de Los seis registros FE. Igual mente, si el operando destino de una instrucción es un a ubicación de memori a, e l res ul tado a almacenar se 50
1.9. PLANI FICACiÓN DINÁMICA: ALGORITMO DE TOMASULO
Unidad de instrucciones
desde memoria
Cola d e instrucciones flotantes
FLOS
Registros de
8uffe rs de coma fl otante
FB
FR
coma f10tanle
6
bitOc. etiq ueta ~
5
bilOc. etiqueta I
FO F2
•
bilOc. etiqueta I
F•
bilOc. etiqueta ~
F6
3
--------i
,,
2 1
Buffer de almacenamiento de dalos
SOB etiqueta!
3
i
2
etiqueta t
1
etiqueta
[1 a memoria
,
1
r -::::..-..:::..: :..-..: :..-..: :..-..: :..-..::::..:::..::: :i--~
• i
RS1 etiqueta 1 ~
R~
operando 1
etiqueta
eliquela_' I operando 1 etiqueta 1 I operando 1
etiqueta etiqueta
~
(
SUMA
t
2'
operando_2
I etiqueta
21 21
operando 2
1 etiqueta 1
1
operando_ ' operando_ '
~ (
operando 2
I
j
=--- - 1 ,,,
)
etiqueta etiq ueta
2 2
operando 2 operando_ 2
I I
I
j
MUlT./DIV,
)
COB (dalo+etiquela)
Figura 1.38: Diseño modificado de la unidad de coma flotante del mM 360/9 1 con el al goritmo de Tomasulo.
51
INGENIERíA DE COMPUTADORES 11
coloca en uno de los tres registros SOB , y una unidad independiente accede a los SDB para terminar el almacenamiento del resultado en la ubicac ión de me moria correspondiente. Medi ante estos dos fich eros de registros adi cionales FB y SOB , la FPU admite instrucc iones de almacenamiento-registro y registroalmacenamiento, funci onando como una máquina registro a registro. La unidad de instrucción decodifi ca todas las instrucciones y pasa en orden todas las instrucciones de coma notante a la pila de operaciones de coma flotante FLOS (Floa/ing Poin/ Opera/ion S/ack) . A continuación, ya en la FPU, las instrucciones se emiten en orden desde la FLOS a las dos unidades fu ncionales. Las unidades funcionales tienen unos registros asociados denominados estaciones de reserva (RS , Reserva/ion S/a/iol1s) que forman una pequeña cola de in strucciones a la entrada de cada unidad funci onal. Estas estaciones de reserva se consideran como unidades fu ncionales virtuales; siempre que ex ista una unidad funcional libre, la FLOS puede emitir nna instrucción hacia esa unidad fun cional, incluso si actua lmente se encuentra ocupada ejecutando otra instrucción, ya que las unidades fun cionales pueden estar segmentadas. Como la FLOS emite instrucciones en orden se evitarán paradas innecesarias debidas a una ordenación desafortunada de di stintos tipos de instrucciones de coma flotante . La unidad de suma dispone de tres estaciones de reserva, mientras que la unidad de multiplicación/divi sión tiene dos, tal y como muestra la Figura 1.38. Una vez se encuentra disponible una de las estaciones de reserva, las instrucciones se emiten desde la FLOS aunque no estén todavía disponibles todos los operandos. Estas instrucciones pueden esperar sus operandos en la estación de reserva asignada y solo comenzarán a ejecutarse c uando estén di sponibles. El uso de estaciones de reserva y del fichero de registros centralizado FR da lugar a dos propiedades importantes. En primer lugar, la detección de ri esgos y el control de la ejecución están di stribuidos ya que la información mantenida en las estaciones de reserva de cada unidad funcional determina si una instrucción puede empezar su ejecución en esa unidad. En segundo lugar, los resu ltados pueden pasar directamente a la unidad funcional desde las estaciones de reserva donde estaban almacenados, en vez de acceder a ellos a través de los registros. Para realizar este adelantamiento se utiliza un bus de datos común (CDB , Common Da/a Bus), que permite cargar simultáneamente un resultado en todas las unidades fun cionales que lo estaban esperando. El COB conecta la salida de las unidades funcionales con [as estaciones de reserva y los registros FR y SOB . Cuando la FLOS envía una instrucción a una unidad funcional, la asigna una estación de reserva y comprueba si están disponibles los operandos necesarios. Si un operando se encuentra disponible en el FR, el contenido de ese registro del FR se copia a la estación de reserva; en caso contrario, se copia una etiqueta para indi car que esa instrucción está a la espera de un operando pendi ente de ser generado. La etiqueta indica de dónde procederá el operando pendiente, pudiendo ser de una instrucción que está actualmente en una de las cinco estaciones de reserva o de uno de los seis registros de FLB . Cuando el operando pendiente se genera como resultado de una instrucción se publica su valor junto con la etiqueta. Una instrucción en espera en una estación de reserva utili za su etiqueta para supervisar continuamente el COB y detectar una coincidencia de etiqueta. Básicame nte, el productor de un operando difunde la etiqueta y el va lor del operando en el COB ; todos los receptores de ese operando (instrucciones ubicadas
52
-1.9. PLANIFICACiÓN DINÁMICA : ALGORITMO DE TOMASULO
en las estaciones de reserva) supervisan el CDB en busca de esa etiq ueta, y cuando se produce una coincidencia, entonces recuperan el valor del operando desde el CDB . Por tan to, todos los posibles receptores de los operandos pendientes de lectura incluyen un campo etiq ueta y deben supervisar continuamente el C OB para detectar una coincidencia con la etiqueta y poder leer el dato asociado a ella. Cada estación de reserva contie ne dos cam pos por operando, do'nde uno cOlTesponde a la etiq ueta y otro al valor del operando. Los cuatro FR y los tres registros del SOB también llevan un campo eli queta
asociado. En las estaciones de reserva si un campo de operando contiene datos reales, entonces su campo de etiqueta se esta blece a cero. En caso contrario, su ca mpo de etiqueta identifi ca el origen del que procede el opera ndo pend iente. Siempre que la FLOS d istribu ye una instrucc ión a la estación de reserva, se obtienen los datos del FR correspondientes a los operandos y se cop ian en la estación de reserva. Al mismo tiempo, se establece a l el bit de ocupado asociado con el registro destino del resul tado en el FR, lo que indica que existe una actualización pendiente de ese registro, y el valo r de la etiq ueta que identifi ca la estación de reserva a la que se distribuye la instrucc ión se escribe en el campo de etiqueta del FR cOlTespondiente. Esto identi fi ca claramente qué estación de reserva generará el dato actuali zado para ese FR . A contin uación, si una instTucción posterior utiliza este registro como uno de sus operandos, cuando se d istri buye a una estación de reserva, so lo se copiará el campo etiq ueta al cOlTespondiente campo etiq ueta de la estación de reserva en lugar del dato real. C uando se establece el bit de ocupado, se indica que los datos del FR están anticuados y la etiq ueta representa el origen de donde proceden los datos reales. Además de las estacio nes de reserva y los FR, los registros SDB también pueden ser desti nos de operandos pendientes con lo que es necesario incorporar un campo etiqueta para cada uno de los tres registros SOB o Para clarifi car el funcionami ento del algoritmo de Tomasulo se presenta un ejemplo de ejecuc ión de un fragmento de códi go (Figura 1.39.a) con las siguientes hi pótesis de partida: • Para red ucir el número de ciclos máquina se permite que la FLOS distribuya has ta dos instrucciones en cada ciclo según el orden del programa. • Una instrucción puede comenzar su ejecución en el mismo ciclo en que se d istri buye a una estación de reserva. • La operación suma tiene una latencia de dos ciclos y la de mu ltipLicación de tres ciclos. • Se permi te que una instrucción reenvíe su resultado a instrucciones dependientes durante su úl ti mo ciclo de ejecución. De esta forma, una instrucción a la espera de un resultado puede comenzar su ejecució n en el siguiente ciclo si detecta una coincidencia. • Los valores de etiqueta (\11 , (\1 2 Y (\13 se utili zan para identi ficar las tres estaciones de reserva de la unidad f uncional de suma, mi entras que (\14 y (\1 5 se utilizan para identificar las dos estacio nes de reserva de la unidad funcional de multiplicación/d ivisión. Estos valores de etiqueta son los ID de las estac iones de reserva. • lnicia lmente, el valor de los registros es F(\I=6 . (\1 , F2= 3 . 5, F4= l (\1. (\1 Y F6=7 . 8. 53
INGENIERíA DE COMPUTADORES 11
i1 : ADDD
F4, FO, F6
i2: MULTD F2, FO, F4 i3: ADDD
F4, F4, F6
i4: MULTD F6, F4 , F2 (a) Secuencia de instrucciones Ciclo 1: Distribución de i1 e 12 (en orden) FR
bitOc. etiqueta
dato I
FO
6,0
F2
SI
04
I
3,5
F4
Si
01
I
10,0 7,8
I
F6 RS
11
ID
etiqueta- 1
01
00
~
02
I
03
I
RS
operando- 1
etiqueta- 2
6,0
00
,
operando- 2
7,6
10
eliqueta_ '
i2 04
operando_1
etiquela_2
operando_2
01
00
05~-----+----~---4------4---------4
I I
~
11(
I
¡
SUMA
Ciclo 2: Distribución de i3 e i4 (en orden) FR
bitDc. etiqueta
FO
dalo
,
6,0
F2
SI
04
I
3,5
F4
SI
10,0
SI
02 05
I
F6
I
7,6
RS ID
etiquela_1
operando_1
01
00
6,0
13 02
01
i1
RS
eliquela_2
operando_2
00
7,8
i2 04
00
00
7,8
14 05
02
ID
eliquela_1
operando_1
6,0
etiquel8_2
operando_2
01 04
03
Figura 1.39: Dustración de l algoritmo de Tomasulo para un fragme nto de código con in strucciones aritmélicas en coma flotante (contin(Ia).
54
1.9. PLANIFICACiÓN DINÁMICA: ALGORITMO DE TOMASULO
Cic lo 3:
FR bilOc. etiqueta
FO F2 F4 F6
dato
SI
04
i
6.0 3.5
SI
02
I
10,0
SI
05
I
7.6
RS
ID
etiqueta- 1
operando- 1
RS
etiqueta- 2
I
01 00
i3 02
03
I I
ID
operando- 2 I
00
13.8
I
etiquela_1
i2 04
operando_ 1
etiquela_2
00
operando_2
00
14 05 t--;0"2,----+---'------1t--;0"4 --+--:c..:..--1
7.8
I
~ 13 (
I
I
i2
SUMA
MULT.lDIV.
Ci clo 4 :
FR bitOc. etiqueta
FO F2 F4 F6
dalo
6.0 SI
04
i
3.5
SI
02 05
I
10,0
SI
7.8
RS ID
03
eliqueta_2
00
I
operando_2 I
I
01 i3 02
operando_1
eliquela_1
RS
13,8
00
I
ID
1/ 12 041 7.8
I
P
,,(~,~I /~
/
i4 05 1
eliqueta_1
00 02
operando_1 I
I
6.0
.......
~
12 (
etiqueta_2
operando_2
I
00
I
13,8
I
04
I
.- .....
I I
I 1
MULT./D IV.
)
Figura 1.39: [Continuac iónlllustración del algoritmo de Tomasulo para un frag mento de código con instrucciones aritméti cas en coma fl otante (conLinúa).
55
INGENIERíA DE COMPUTADORES 11 CicloS: FR bitOc. etiqueta
dato
FO F2
6,0 04
Si
F4 F6
SI
05
I
3,5
I
21 ,6
I
7,8
RS ID
eliquela_1
operando_1
RS
etiquela_2
I
01
operando_2 I
02
I
I
03
I
I
~
(
etiqueta_ 1
ID
i2 04 1 i4 OS ,
00 00
6,0
I
21,6
I
¡ )
SUMA
operando_1 I
i2
eliqueta_2
I
~
00
I
04 \
j /
MULTJDIV,
operando_2 I
13,8
J
.......
,1
I )
Ciclo 6: FR bUOc etiqueta
dato
FO
I
6,0
F2
I
82,8
I
21 ,6
I
7,8
F4 F6
05
Si
RS
ID
01
etiqueta- 1
,
operando- 1
RS
etiqueta- 2
operando 2
-
02
I
I
03
I
I
~
(
SUMA
ID
eliqueta_1
operando_1
etiqueta_2
operando_2
04 i4 05 I---,O "2c--l----c'"'"""'c--+---cO"0--+----==------l ~--~-,~~----~~--~
I
j
)
i4
Figura 1,39: [Continuación] Ilustración de l a lgo ritmo de Tomasulo para un fragmen to de código con instrucciones aritméticas en coma fl otante.
56
1.9. PLANI FICACiÓN DINÁMICA: ALGORITMO DE TOMASULO
La Figura 1.39.b muestra la evolución de las estaciones de reserva y de los registros de coma flotante FR para los seis ciclos de la ejecución. En el ciclo J se distribu yen las instrucciones i 1 e i 2 (en orden) a las estaciones de reserva lIl1 y lIl4. Los registros de destino de las instrucciones i1 e i2 son F4 y F2 (es decir los F4 y F2 de FR), res pecti vamente, por lo que se establecen los bits de ocupado de estos dos registros. Como la instmcción i1 se distribu ye a la estación de reserva lIl1, se introduce el valor de etiqueta lIl1 en el campo de etiqueta de F4 . Análogamente, se introduce el valor de etiqueta t'l4 en el campo de etiqueta de F2. Como están disponibles los dos operandos migen de la instrucción i1, esto eS el FlIl y el F6, sus coITespondientes campos de etiqueta se fijan a lIllll y comienza la ejecució n de la instrucción inmediatamente. Como la instrucción i2 necesita el resultado (F4) de i1 para su segundo operando, cuando se distribuye a la estación de reserva lIl4 en el campo etiqueta de su segundo operando se escribe el valor lIl1 , lo que indica que la instrucción de la estación de reserva lIl1 generará el operando que necesita para poder comenzar su ejecución. Durante el ciclo 2 se distribu yen las instmcciones i3 e i4 (en orden) a las estac iones de reserva (\)2 y lIl 5, respecti vamente. Como se necesita el resultado de i1 para el primer operando de i 3, cuando i 3 se di stribuye a la estación de reserva lIl2 recibe el valor de etiqueta de lIl1 en el campo de etiqueta de su primer operando. Análogamente, i4, distribuida a la estación de reserva lIl5 , recibe los valores de etiqueta de lIl 2 y lIl4 en sus dos campos de etiqueta, lo que indica que las estaciones de reserva lIl 2 y (\)4 generarán los dos operandos que necesitan . Como F4 es el destino de la instrucción i 3, el campo de etiqueta de F4 se actuali za con el nuevo va lor de etiqueta de lIl 2, lo que indica que la estación de reserva (\)2 (instrucción i3) es ahora respo nsable de la actuali zación pendiente de F4. El bit de ocupado de F4 permanece establecido. C uando i 4 se distribu ye a la estación de reserva lIl5 se establece el bit de ocupado de F6 y el campo de etiqueta de F6 se fij a a (\) 5 dado que en esa estación de reserva reside la instrucción que producirá el resultado. Al fi nal del ciclo 2, la instrucción i 1 fi naliza su ejecución y emite su ID (estación de reserva lIl1) y su resultado al CDB . En ese instante, todos los campos etiqueta que contienen el valor de etiqueta (\)1 desencadenarán una coincidencia de etiq ueta e insertarán el resultado emitido. El primer campo de etiqueta de la estación de reserva (\)2 (que contiene a i 3) Yel segundo campo de etiqueta de la estación de reserva lIl4 (que contiene a i 2) tienen esas coincidencias de etiqu etas. Por tanto, el resultado de i1 se reenvía a las instrucciones dependientes i2 e i 3. La ex istencia de estas dos coincidencias implica que el valor de la etiqueta [\)1 en las estaciones de reserva lIl 2 y [\)4 pasa a lIllll y se copia el resultado de i 1 en el campo operando que cOITesponda. En el ciclo 3 comienzan a ejecutarse i3 en la unidad de suma e i2 en la unidad de multiplicac ió n/di · visión. La instrucción i 3 fin ali za su ejecución en el ciclo 4 y emite su resul tado al C DB junto con el va lor de etiqueta lIl2 (su ID de estación de reserva). El pri mer campo de etiqueta en la estación de reserva [\) 5 (que contiene la instrucc ión i 4) y el campo de etiq ueta de F4 tienen coincidencia de etiquetas e in sertan el resultado de la instrucción i 3. La instrucción i2 fi naliza su ejecución en el ciclo 5 y emite su resul tado al CDB jun to con el valor de etiqueta lIl4. El segundo campo de etiqueta de la estación de reserva (\)5 (que conti ene a i4) y el campo de etiqueta de F2 tienen coincidencia de etiquetas e insertan el resul tado de la instrucción i 2. En el ciclo 6 comienza la ejecución de la instrucción i4 y fin ali za en el ciclo 8. 57
INGENIERíA DE COMPUTADORES 11
1.10. Resumen La segmentación es una técnica de microarquitectura qu e se puede aplicar a cualquier arqu itectura con conjunto de instrucciones. Aunque las características de las arquitecturas RISC facilitan la segmentación y generan diseños de segmentación más efi caces, en las arquitecturas CISC es igual de efi caz. En este capítulo se ha demostrado que la segmentación es una técnica muy útil para aume ntar el re ndimiento del procesador. El principal imped imento para mejorar el rendimiento del procesador segmentado es la detención de la segmentación debida a riesgos entre las instrucciones. Se han analizado di stullas técni cas que intentan ev itar, dentro de lo posible, las detenc iones en la segmentación. La técnica más sencilla para evitar estos riesgos sería parar la ejecución de la instrucción que vaya a ca usar el riesgo, insertando instrucciones NOP o burbujas hasta que hayan terminado de ejecutarse todas las instrucciones anteriores. Esta técnica supone demasiadas paradas en la ejecución, 10 que provoca una caída considerable del rendimiento . O~·a téc nica para so lucionar los riesgos RAW es la del adelantamiento, consistente en copiar un resultado en un registro intermedio para que la instrucción que venga detrás pueda utilizar ese valor sin tener que esperar a que term ine compl etamente la instrucción anterior, que es la productora del resultado. Para intentar solucionar los demás riesgos se emplean técnicas más avanzadas como el algOlitmo de pl anificación dinámi ca de Tomasulo o la predicción dinámi ca de saltos. De una manera u otra, lo que se pretende con cualquiera de estas técnicas es reducir lo máx imo posible los ciclos de parada ya que incrementan el C PI, el cual idealmente es l. El compilador también influye notablemente en la búsqueda del CPI ideal, puesto que otra manera de ev itar riesgos y, por lo tanto, posibles ciclos de parada, podría ser cambiar el orden de ejecución de las in strucc iones, ev itando siempre, por supuesto, que no cambie el resul tado del programa. Aprute de los riesgos por dependencias de datos tamb ién existen los ri esgos de control provocados por los saltos condicionales. Los procesadores empiezan a mandar instrucciones a ejecutar antes de saber si esas in strucciones deben ejecutru·se (ya que hasta que no se procesa la condición de salto, no se sabe si será o no efectivo), por lo que deben incorporarse técni cas para deshacer cambios o pru·a descartar in s~·ucci ones que no conesponden pero que han comenzado a ejecutarse, además del desperdicio de ciclos que supone el haber empezado a ejec utar instrucciones inútiles . Por esto se emplean técnicas para intentar predecir si un salto condicional será efecti vo o no, y e n caso de equivocarse, que la pena lización sea la mínima posible. Para ello existen técnicas de predi cción estática (en el caso de un salto, ·siempre se acturu·á de la misma manera), o técnicas de predi cción dinámica (añadiendo hru·dware adicional que intenta aprender el comportamiento del programa para saber que ha de hacer en el próximo salto). Ejemp los de estas últimas técnicas se estudiarán y anal izarán con un mayor detaUe en el Capítu lo 2 del libro.
1.11. Referencias Amdahl G.M. Val idity of the single processor approach to achieving large scale computing capabili ties, Prac. AFIPS Spring Joillt Computer COIl!, Atlantic City, NJ, pp. 483-485, 1967. 58
1.12. PREGUNTAS DE AUTOEVALUACIÓN
Bucholtz W. Plalling a compute/" system: Project Stretch, McGraw-Hill, Inc., Hightstown, NJ, 1962. Culler D.E. , Sh ing J.P., Gupta A. Parallel COII/pute/" Arc/¡itecture. A Hardware/Software Approach, Morgan Ka ufmann, San Francisco, CA, 1999. Flynn M.J. Very High-Speed Computing Systems, Proc. of the lEEE, vol. 54, nO 12, pp. 190 11909, 1966. Handler W. T he impact of classificatioll schemes on computer architecture, Proc. Int. Conf on ParaUet Proc., Wayne State University, Detroit, MI, pp. 7- 15, 1977. Hennessy lL., Jouppi N., Gill J. MIPS: A VLSI Processor Architecture. Proc. CMU Conf 011 VLSI Systems alld Computations, Carnegie-Mellon Uni versity, P ittsburgh, PE, 1981. Hennessy J.L. , Patterson D.A. Arquitectura de Computadores. Un enfoque cuantitativo, McGrawHiLI, Madrid , 1993. Hennessy lL. , Patterson D.A. Compute/" ArchitecllIre. A Qualltitative Approach, 3" edición, Morgan Kaufmann, San Francisco, CA, 2003. HerUlessy J.L. , Patterson D.A. Compute/" Architecture. A Quantitative Approach, 4' edición , Morgan Ka ufmann , San Francisco, CA , 2007. Hwang K., Briggs EA. Compute/" Architecture and Parallel Processi/1g, McGraw-Hi ll , New York C ity, NY, 1984. Kogge P.M . The architecture af Pipelined Computers, Advanced Computer Science Selies, McGraw-Hill , New York City, NY, 1981. Séquin C.H. , Patterson D .A. RISC I: A Reduced lnstruction Set VLSI Computer, Proc. 8th Itnl. Symp. 0/1 Compute/" Architecture, M inneapolis, MN, 198 1. Shen lP. , Lipasti M.H. Arquitectura de Computadores: Fundamentos de los procesadores superescalares, McGraw-Hi ll , Madrid, 2006. Tomasu lo R. An efficient algonthm for exploiti ng multiple arithmetic uruts, IBM Journal of Research alld Developmelll , vol. 11 , pp. 25-33, 1967.
1.12. Preguntas de autoevaluación P1 .1 ¿Qué ventajas presentan los procesadores RISC frente a los CISC?
• Tienen una mayor velocidad de ejecución.
59
INGENIERíA DE COMPUTADORES 11
• Reducen el tamaño de la CPU por lo que se dispone de más espacio para más recursos, por ejempl o, mayor cantidad de regi stros de memoria caché. • Al ser la lógica de control más simple se facilita el diseño. • Permiten máquinas más compactas y con menor consumo al reducirse el tamaño de la CPU. • Posibilitan la segmentación y el paraleli smo e n la ejecución de in strucciones. • Reducen los accesos a memoria debido a que cargan los datos en registros.
PI.2 ¿De qué depende el rendimiento de la segmentación de un procesador RISC? El rendimiento de la implementación pipeline de un procesador RISC lograda por la simplicidad de las instrucciones depende directamente de los riesgos que se generan durante la ejecución de instrucciones.
PI.3 ¿Qué se entiende por segmentación? La segmentación de cauce o simplemente segmentación (en inglés pipelining) es la técnica a través de la cual un elemento (unidad funcional , procesador, circuito, etc.) se divide en una serie de etapas que funcionan de forma independiente y por las que van pasando los operandos y las instrucciones que procesa cada elemento. De esta fmma , dicho elemento puede reali zar simu ltáneamente operaciones di stintas en las diferentes etapas en que se encuentra dividido.
PI.4 ¿Cuáles son los cuatro tipos de computadores que se consideran en la taxonomía de Flynn? 1. Computadores SISO. 2. Computadores SIMO. 3. Computadores MIMD . 4. Computadores MISO.
PI.S ¿Qué dos tipos de paralelismo pone de manifiesto la taxonomía de Flynn? El paralelismo de datos y el paralelismo func ional.
PI.6 ¿En qué consiste el paralelismo funcional a nivel de instrucciones? El paralelismo funcional a nivel de instrucciones u operac iones (ILP· Instruction Level Paralle· lism.) se produce cuando se ejecutan en paralelo las instrucciones de un programa. Es un tipo de paralelismo de muy bajo nivel que es explotado por el hardware de forma transparente al programador o bien por el compilador. Es el nivel de granularidad más fi no que se considera en el ámbito de la arquitectura de computadores.
PI.7 ¿Qué es el tiempo de respuesta? Es el tiempo que tarda el computador en procesar una entrada (programa, instrucc ión , etc.) 60
1.12. PREGUNTAS DE AUTOEVALUACIÓN
p1.8 Si el rendimiento se evalúa como la inversa del tiempo de CPU, ¿cómo se puede definir la ganancia? Como la relación e ntre el tie mpo de CPU utilizado para la ejecució n de un programa prueba en la máqu ina original, TCPU_originol, y el tiempo de CPU utili zado para la ejecución del mi smo programa utilizando la mejora en todo momento que sea posible, TCPUJllejorada.
PI.9 ¿Qué es la profundidad de la segmentación? Es el número de etapas en las que puede dividi.rse el procesamien to de una instrucción.
PI.IO ¿Cuándo se dice que un procesador segmentado está equilibrado? Cuando todas las etapas en que se ha dividido el procesamiento de las instrucciones tarda n el rnismo ti empo.
PI.l1 ¿Por qué se caracterizan las máquinas registro-registro o máquinas de carga/almacenamiento? Son máq uinas en las que los operandos no se referencian en memoria.
PI.12 ¿En qué consisten las instrucciones de carga y las de almacenamiento? En una instrucc ión de carga se almacena el contenido de una dirección de memori a en un regi stro y al contrario en una instrucción de almacenamiento.
PI.13 ¿Qué diferencia hay entre una bifurcación y un salto? Se denomina bifurcación cuando el cambio en el fluj o de control es incondi cional y salto c uando es condicional.
Pl.14 ¿Cuándo se dice que un salto es efectivo? Cuando la condición probada por la instrucción de salto es verdadera y la siguiente instrucción que se vaya a ejec utar es el destino del salto.
Pl.lS ¿Qué acciones se realizan en la etapa ID de la ASG? La decodi fi cación de la in strucción y la lectura de sus operandos del fic hero de regi stros:
Pl.l6 ¿Qué tipos de instrucciones no realizan ninguna acción en la etapa WB de la ASG? Las instrucciones de almacenamie nto y salto ya que no necesitan escribir e n el fichero de registros y se enc uentran libe radas durante la etapa WB.
P1.17 ¿Qué es un riesgo? Se denomi na riesgo a la dependencia entre instrucc io nes que provoca que la instrucción que sucede a aquella con la cual posee dependencias no pueda ejecutarse en el ciclo de reloj que le corresponde ya que ha de esperar algún res ultado para poder efectuar su ejecución. 61
INGENIERíA DE COMPUTADORES 11
Pl.18 ¿Qué son los riesgos estructurales? Los riesgos estructurales surgen de conflictos por los recursos, es decir, por insuficiencia del hardware debido a que una instrucción ubicada en una etapa no puede avanzar a la siguiente porque el hardware que necesita está siendo utiHzado por otra .
Pl.19 ¿Cuándo aparecen los riesgos por dependencias de datos? Los riesgos por dependencia de datos surgen cuando una instrucción necesita los resultados de otra anterior, que todavía no los ti ene di sponibles por no haberse terminado de ejecutar completamente.
P1.20 ¿Qué es un riesgo tipo RAW? También denominado dependenc ia verdadera, es el riesgo que se produce cuando la instrucción j intenta leer un dato antes de que la instrucción i lo escriba, siendo la j posterior a la i en el orden del programa.
P1.21 ¿Qué es un riesgo tipo WAR? También denominado antidependencia o dependencia fa lsa, es el riesgo que se produce cuando la instrucción .i trata de escribir en su destino antes que éste sea leído por la instrucción i, siendo la j posterior a la i en el orden del programa.
P1.22 ¿Cuáles son las soluciones más importantes para evitar los problemas de los riesgos RAW? 1. La reorgan izac ión de código,
2. E l interbloqueo entre etapas, y 3. El adelantamiento.
P1.23 ¿Qué es la reorganización de código? Es una técnica software que consiste en disponer las instrucciones en el programa de fOI1na que entre instrucciones con dependencias de tipo RAW ex istan instrucciones que permitan retrasar la segunda instrucc ión con respecto a la primera, dando tiempo a que la primera haya escrito su resultado antes de que la lectura ocasionada por la segunda tenga lugar.
P1.24 ¿Qué función tiene la lógica de by pass? Comprobar si hay co incidencia entre el identificador del registro de destino de la instrucción que acaba su etapa EX y los identificadores de los registros fuente de los operandos de la instrucción sigui ente que va a ini ciar su etapa EX .
P1.25 ¿Qué se entiende por estado de la máquilla? El estado de la máquina viene definido por el contador de programa, el fichero de registros y el espacio de memoria asignado al programa que ocupa el procesador en un in stante dado. 62
1.13. ACTIVIDADES
p1.26 ¿Qué acciones se realizan en la etapa II de la ASG? En la etapa de emisión (1I - rnstructioll ¡ssue), la instrucción espera hasta que no haya riesgos de tipo RAW, y cllando estén listos todos los operandos fuente, se leen y se emite la instrucción hacia la unidad funcional. P1.27 ¿Cuál es una de las principales limitaciones de la segmentación estática? Que emiten las instrucc iones en orden. Si el procesador se detiene con una instrucción , las posteriores no puede n proceder aunque no mantengan ninguna dependenc ia con las instrucciones que van por delante en el cauce. De esta manera, una dependencia entre dos instrucciones espacialme nte cercanas en el procesador segmentado puede dar lugar a un riesgo y a una dete nción. P1.28 ¿Qué aporta la planificación dinámica? En la planifi cación dinálTuca e l hardware reorgani za la ejecución de la instrucción para redu cir las detenciones mientras mantiene el flujo de datos y la consistencia del estado del procesador y de la memoria. E ntre las ventajas de la planificación dinámica está el aprovechamie nto más óptimo e n tiempo real de una etapa EX con múltiples unidades fun cionales, con lo que se simplifi ca el trabajo del compilador.
P1.29 ¿Qué es el algoritmo de Tomasulo? Es una de las primeras técnicas basada en la planificación dinámica De este algoritmo se delivan las técnicas de planifi cación dinámica que utilizan todos los procesadores superescalares ac tuales. El algoritmo de Tomasulo se utilizó en la unidad de coma fl otante del IBM 360/91 , cuyo o bj etivo era conseguir un alto rendimiento y evitar los grandes retrasos que se te nían en los accesos a memoria y en las operaciones de coma flotante. Pl.30 ¿Qué son las estaciones de reserva? Las estaciones de reserva son unos registros asociados a las unidades funcionales que fo rman una pequeña cola de instrucciones a la entrada de cada unidad fu ncional. Estas estaciones de reserva se consideran como unidades fun cionales virtuales . P1.31 ¿Para qué sirve el bus de datos común? Permite cargar simultáneamente un resul tado en todas las unidades funcionale s que lo estaban esperando.
1.13.
Actividades
Al.1 S uponiendo que se aplica una mejora a una máquina de tal forma que el rendimiento es 20 veces superior al que tenía y considerando que la mejora únicamente se puede aplicar durante e l 20 % del 63
INGENIERíA DE COMPUTADOR ES II
tiempo, ¿cuál es la gananc ia o btenida?
Al.2 Tras añadir un nuevo procesador a un ordenador se logra un aumento de la velocidad de ejecución en un facto r de 8. Se observa que tras aplicar esta mejora, el 60 % de l tiempo de ejecució n se está uti lizando el nuevo procesador. ¿Qué porcentaje del ti empo de ejecución original se ha reducido gracias a la mej ora?
Al.3 Un procesador sin segmentación necesita 400 nseg. para procesar una instrucción. Con respecto a este procesador, calcular la aceleración que se obtiene en los dos casos s iguientes: • Un procesador A dotado de una segmentació n de 5 etapas, consumiendo cada etapa el mismo tiempo. Cada etapa ocasio na una sobrecarga de 10 nseg. , no existiendo ningún tipo de detención en la segmentación. • Un procesador B con una segmentació n de 5 etapas, consumi endo cada una de eUas 60 nseg., 60 nseg., 80 nseg., 100 nseg. y 100 nseg., respecti vamente, y siendo la sobrecarga por cada etapa de \O nseg. Un 40 % de todas las instrucciones de la segmentación son deteni das durante un ciclo de reloj y un \O % durante dos ciclos.
AI.4 Al diseño A de un procesador se le propone añadir una instrucción AL U que tenga un operando fuente en memOti a (el otro se encuentra cargado en un registro en el 25 % de las operaciones de la ALU) obteniendo de esta manera el di seño del procesador B . Si en este nuevo diseño B aumenta en I el número de ciclos de reloj de los saltos y suponiendo que la nueva instrucción consume 2 c iclos, ¿cuál de los dos di seños es el más rápido considerando el recuento de instrucciones de la siguiente tabl a? Tabla 1.4: Recuento de instrucciones.
Operación
Frecuencia
Ciclos/instrucción
ALU Cargas
43% 2 1% 12 % 24%
I 2 2 2
Almacenam ienlos
Saltos
A 1.5 Suponga q ue se tiene un procesador segmentado en el q ue e l 20 % de las instrucciones son cargas y un 50 % de las veces la instrucció n siguiente se detiene un ciclo de reloj debido a un riesgo por dependencia de datos. Además, el \O % de las instrucciones de carga producen un fall o de caché que se tarda 4 ciclos en resolver. Ig norando cualq uier otro tipo de riesgo, ¿cuántas veces es más rápida la segmentació n ideal de CP!= 1 q ue esta nueva segmentación?
Al.6 Un procesador sin segme ntación neces ita 200 nseg. para procesar una instrucción. Con respecto a este procesador, ca lcular la ace lerac ión que se obtiene en los dos casos siguien tes: 64
1.13. ACTIVIDADES
• Un procesador A dotado de una segmentación de S etapas, consumiendo cada etapa el mismo tiempo. Cata etapa ocasiona una sobrecarga de 4 nseg., no existiendo ningún tipo de detención en la segmentació n. • Un procesador B con una segmentación de S etapas, consumiendo cada una de ellas 30 nseg ., 30 nseg., 40 nseg., SO nseg. y SO nseg., respectivamente, y siendo la sobrecarga por cada etapa de 4 nseg. Un 20 % de todas las instrucciones de la segmentación son detenidas durante un ciclo de reloj y un 5 % durante dos ciclos.
Al.7 Sea una máquina de carga/almacenamiento a la que se quiere añadi r un modo de direccionamiento registro-memoria, de tal forma que se puedan susti tuir secuencias de:
LD ADD
R2,R2,Rl
ADD
R2,~CRb)
Rl,~CRb)
por:
Suponga que la nueva instrucción hace que el ciclo de reloj se incremente en un 10 % pero no afecta en ninguna forma al CPI. Las frecuencias de instrucciones para esta máquina son: 18 % de saltos, 36 % de transferencias y 46 % de operaciones ALU , siendo 2/3 de las transferencias instrucciones de carga y el resto almacenamientos. Se pide: • ¿Qué porcentaje de las instrucciones de carga debe eliminarse de la máquina con la nueva instrucción para que como máximo tenga el mismo rendimiento? • Escriba un fragmento de códi go ensamblador en el que una carga de Rl seguida inmediatamente de una operación en la ALU de Rl no se pueda sustituir por una simple instrucción de la forma propuesta al com ienzo del enunciado, suponiendo que existe el mismo código de operació n.
Al.8 Dado el siguiente fragmento de código de DLX en el que inicialmente la posición de memo ri a 2!\1tiH'iI contiene el valor (\l , ¿cuántas referencias de datos a memoria se efectuarán e instrucciones se ejecutarán? il: i2: i3: i4: i 5: i6: i 7: i8: i9:
LD Rl,15~~CR~) LD R2,2~~~CR~) R3,5~~ (R2) LD ADD R4,R3,Rl SD ~(R2),R4 ADDI R2,R2,#4 SD 2~~~(R~),R2 SUBI R4,R2,#4~~ BNEZ R4,i2 65
INGENIERíA DE COMPUTADORES 11
A1.9 Sea un procesador con una segmentación de 4 etapas: fe tch (lF), decodificación (ID), ejecución (EX) y escritura (WB). En la etapa ID se reali za e l cálculo de la dirección y los cambi os iniciales sobre el registro de estado. La cond ición de salto se examina en la etapa EX. Las frecuencias de las instrucciones de salto condic ional y bifurcación son un 30 % Y un 7 %, respectivame nte, siendo efectivos el 70 % de los saltos condi cional es. • Escri bir un diagrama de la segmentació n para cada caso (bifurcación, salto condicional efecti vo y salto condicional no eFectivo) cons iderando las estrategias predecir como efecti vo y predecir como no efectivo. • Calcu lar para ambas estrategias de sa lto el valor del CPI asumiendo que los riesgos de control Son los únicos riesgos existentes.
A1.10 En los fragmentos de cód igo situados a continuación: FRAGMENTO
i1: i2: i3: i4:
DIV ADD ADD ADD
l
FRAGMENTO
Rl,R2,R3 R4,R1 , R5 R5,R6,R7 R1,R8,R9
i1: i2: i3: i4: i5: i6: i7: i8: i9:
2
LD
F2
MULT LD ADDD SD ADDI ADDI SGT BEQZ
F4,F2,F~
, ~(R1)
F6,~(R2)
F6,F4,F6 ~(R2),F6
R1,R1,#8 R2,R2,#8 R3,R1,#8~~
R3,i1
• Señale las dependencias de datos y de memoria existentes en ambos fragmentos. • Analice y ex plique lo que sucede con el registro Rl en suces ivas iteraciones de la segunda sec uencia de código.
A1.U La siguiente secuencia de instrucciones se ejecuta sobre un procesador sin seg mentación y empleando una instrucción de sa lto condicional:
i 1: i2: i3: i4: i5: i6:
LD ADDI BEQZ ADD SUB SD
Rl,X(R7) Rl,Rl,#1 Rtest , i6 R2,R1,R2 R2,R2,R3 ~(R8),R5
II II II II II II
Rl Rl Si R2 R2
<- /'1 [R7+X] <- Rl+l Rtest=~
entonces salta a la instrucción i6
<- Rl+R2 <- R2 -R3 /'I[R8+~] <- RS
Basándose en el fragmento ante rior de cód igo escribir la secuencia de instrucciones en un procesador segmentado similar a ASG usando la técnica de salto retardado en las sig ui entes precondic io nes: 66
I 1.13. ACTIVIDADES
• lnserción de una instrucción de no operación (NOP) con el objeto de rellenar el hueco de la detención. • Optimi zación de la secuencia de instrucciones suponiendo que Rtest sea R4 . e li mi nando la instrucción NOP cuando sea posible. • Optimización de la secuencia de instrucciones si Rtest es Rl eliminando la instrucción NOP si es posible.
Al.12 Dado el código que aparece a continuación y uti li zando la segmentación ASG sin ningún tipo de adelantamiento entre etapas:
i1: i2 : i3: i4: i5: i6: i7: i8:
ADD LD SUB ADD SUB SD LD SUB
R3.R1.R2 R1.~(R4)
R5.R 3 .R4 R6.R1.R2 R1 .R3.R6 4(R4).R 1 R2.4(R4) R3 • R5 • R6
• Indicar los riesgos por dependencias de datos que se producen al ejecutar el código. Suponer que las escrituras se producen en la primera mitad de la etapa WB y que las lecnlras en ID se producen en la segunda mitad de la etapa. • Compruebe si la siguiente afirmación es cierta: La instrucción i 7 no carga el valor previamente almacenado por la inwucción i6 en la posición de memoria M[R4+4] . Indicar la razón de ello tanto en caso afilmativo como negativo. • Reo rgani zar el código sin cambiar su efecto añad iendo el mínimo número posible de instrucciones NOP.
• Repetir el primer apartado sobre el cód igo original considerando que se añade a la segmentación de ASG adelantamiento entre las etapas. Señalar el dato y la etapa de cada instrucción que hace uso del adelantamiento y a qué instrucción y etapa se adelanta.
Al.13 Considere la segmentación ASG en la que la lectu ra y decod ifi cación de los registros se reali za en el etapa 1.0. Dado el siguiente fragmento de códi go:
i1: AD D R5 • R~ • R~ i2: LD R 1 .~(R2) i3 : ADD R6.R1.R5
/ / R5 <- RI'i+RI'i / / Rl <- /'I[R2+1'i] / / R6 <- Rl+R5
67
I
INGEN IERíA DE COMPUTADORES 11
i4: i S: i6: i7 : i8:
ADD SD ADDI SUB BNEZ
RS,Rl,R\'Y \'Y(R2),R6 R2,R2,#4 R4,R3 ,R2 R4 , i2
II RS <- Rl+RI'J
/1 M[R2+1'J]
<- R6
II R2 <- R2+4 II R4 <- R3-R2 II Si R4 !=I'J ir a i2
• Di buje una tabla en la que se muestre la evolución temporal de la secuencia de instrucciones en la segmentación. No considere ningún tipo de adelantamien to salvo que las etapas ID y WB pueden acceder en el ,nismo ciclo de reloj al banco de registros (la etapa WB accede en la primera mitad y la etapa ID en la segunda mitad). Los saltos condicionales se marupulan con la técnica de predecirno-efectivo pero el contador de programa se actualiza en la etapa MEM por prute de la instrucción de salto. • D ibuje una tabla similar a la del primer apru·tado pero considerando adelantamiento entre etapas así como que las etapas ID y WB pueden acceder en el mi smo cicl o de reloj al banco de regi stros. Los saltos condicionales son manipul ados mediante la técn ica de predecir como no-efectivo considerando que al fina l de la etapa ID ya se conoce el destino del salto. • Asumiendo que el valor inicial del registro R3 es R2+24, calcule para cada uno de los dos supuestos anteriores cuántos cic los de reloj tarda en ejecutarse el fragmento de código de ASG.
AI.14 Mostrru' la evolución de los registros en coma flotante (FR) y las estaciones de reserva (RS) para todos los ciclos que sean necesarios en la ejecución del siguie nte fragmento de código utilizando el algoritmo de Tomasul o: i 1: i2: i3: i4: iS: i6:
ADDD MULTD ADDD MULTO ADDD ADDD
F2,F\'Y , F6 F4,F\'Y,F2 F2,F2,F6 F6,F2,F4 F4,F4 , F6 F6,F2,F4
Co nsidere las siguie ntes hi pótesis de partida: • Pru'a reducir el número de ciclos máquina se permite que la FLOS di stri buya hasta dos instrucciones en cada ciclo según el orden del programa. • Una instrucción puede comenzar su ejecución en el mismo ciclo en que se di stribuye a una estación de reserva. • La operación suma tiene una latencia de dos ciclos y la de multiplicación de tres ciclos. 68
1.13. ACTIVIDADES
• Se permite que una instrucc ión ree nvíe su resultado a instrucc iones dependientes durante su último ciclo de ejecución . De esta forma una instrucción a la espera de un resultado puede comenzar su ej ecución en el siguiente ciclo si detecta una coincidencia. • Los valores de etiqueta (\) 1, (\)2 Y (\)3 se utilizan para ide ntificar las tres estaciones de reserva de la un idad funcional de suma, mientras que (\)4 y (\)5 se utili zan para identi fi car las dos estaciones de reserva de la unidad funcional de multiplicación/división. Estos va lores de etiqueta son los ID de las estaciones de reserva. • Tnicialmente, el va lor de los registros es F(\)=4. (\), F2=2. 5, F4=1(\). (\) y F6=3. 5.
Al.15 Mostrar la evolución de los registros en coma fl otante (FR) y las estac iones de reserva (RS ) para todos los ciclos que sean necesarios en la ejecución del siguiente fragmento de código utilizando el algoritmo de Tomasulo: i 1: i2: i3: i4 : i5:
MULTD MULTD ADDD ADDD ADDD
F2,F2,F6 F4,F2,F6 F2 ,F 4,F6 F6,F2,F6 F4,F4,F6
Considere las siguientes hipótesis de partida: • Para reduc ü' el número de ciclos máq uina se penuite que la FLOS d istribuya hasta dos instrucciones en cada ciclo según el orden del programa. • Una instrucción puede comenzar su ejecución e n el mismo ciclo en que se distribu ye a una estac ión de reserva.
• La operación su ma tiene una late ncia de dos ciclos y la de multiplicación de cuatro ciclos. • Se perm ite que una instrucción reenvíe su resultado a instrucciones depe ndientes durante su último ciclo de ejecución. De esta fOll1la una instrucción a la espera de un resultado puede comenzar su ejecución en el siguie nte ciclo si detecta una coincidencia. • Los valores de etiqueta (\)1 , (\)2 Y (\)3 se util izan para identifi car las tres estaciones de reserva de la unidad fun cional de suma, mientras que (\)4 y (\)5 se utili zan para identificar las dos estaciones de reserva de la unidad funcional de multiplicación/división. Estos valores de etiqueta son Jos ID de las estaciones de reserva. • IniciaLmente, el valor de los registros es F(\)=2. (\), F2=4. 5, F4=8 . (\) Y F6=3. (\).
69
I
Capítulo 2
PROCESADORES SUPERESCALARES 2.1.
Guión-esquema
Los contenidos que se tratan a lo largo del tema se resumen en los siguientes puntos: • Características y arquitectura genérica de un procesador superescalar. • Problemática de la ejecución de instrucciones fuera de orden. • Técn icas de prelectura y lectura de instrucciones para mejorar el anc ho de banda. • Técn icas dinámicas para la predicción del resultado y dirección de las instrucciones de sa lto. • Técnicas de predecodificación, decodificación y traducción de instrucciones. • Distribución de instrucciones con y sin lectnra de operandos. • Buffer de di stribución. Estaciones de reserva centralizadas, indi viduales y compartidas. • Re nombrmn iento de registros.
• Emisión y fina li zación de instrucciones fuera de orden. • Gestión de depende ncias fal sas de datos y de memoria. • Buffer de terminación. Mantenimiento de la consistencia del procesador. • Buffer de almacenamiento y de cargas. Mantenim iento de la consistencia de la memoria. • Tratam iento de interrupciones.
r
INGENIERíA DE COMPUTADORES 11
2.2.
Introducción
Una vez estudiados los fundamentos en los que se basan los procesadores segmentados, también denominados escalares, se está en condiciones de abordar el estudio de la arquitectura y el funcionamiento de los procesadores superescalares. Para darse una idea de la importancia que esta clase de procesadores tiene actualmente, todos los procesadores de propósito general son superescalares; incluso, los procesadores con varios núcleos o mullÍ-core no son más que una combinación de varios procesadores superescalares conectados dentro de un mismo circuito integrado. Por otra p31te, con independencia del tipo del repertorio de instrucciones que hoy en día maneje un procesador, esto es, CISC o RISC, su arquitectura es superescalar. Al igual que un procesador segmentado, un procesador superescalar se caracteriza por intentar aumentar al máximo el número de instrucciones ejecutadas por ciclo de reloj , aprovechando para ello el paralelismo implícito a nivel de instrucción (ILP - I/lstr"ction-Level Paralelism). La principal diferencia con respecto a un procesador escalar es que un procesador superescalar procesa v31ias instrucciones simultáneamente en cada una de las etapas de que consta su segmentación. Recuerde que un procesador escalar solo puede m311tener una instrucción en cada una de sus etapas, de forma que si la profundidad de su segmentación es cinco, el procesador mantendrá en su cauce un máximo de cinco instrucciones por ciclo. Un procesador superescalar actual puede llegar a estar manejando más de cien instrucciones por ciclo de reloj , distribuidas de forma desigual entre sus diferentes etapas. Este capítulo comienza con una descripción de las características más importantes de un procesador superescal31' para, a continuación, analizar las etapas de que consta su segmentación. Por lo general , estas etapas son: lectura de instrucciones, decodifi cación, distribución, ejecución , terminación y retirada. A lo largo del capítul o se estudi an los prob lemas que surgen en cada etapa al tener que manejar v31'ias instrucciones simultáneamente, prestando especial atención a la gestión de las dependencias de datos y de memoria tanto verdaderas como fa lsas. La gestión COlTecta de estas dependencias es un tema clave ya que otra de las c3l'acterísticas notorias de estos procesadores es su capacidad para ejecutar instrucciones fuera de orden. Muchas de las técnicas que se utilizan en un procesador superesca lar son las mi smas que se aplican en un procesador segmentado básico, como, por ejemplo, los predictores estáticos de saltos. La principal diferencia es que, ahora, adquieren una relevanci a aún mayor ya que la detención de una segmentación superescalar o un fallo de predicción conlleva la pérd ida de muchos ciclos de reloj. Los objetivos que se pretenden alcanzar con el estudio de este capítulo son: • Conocer las características de los procesadores superescalares y sus diferencias con respecto a una segmentación escalar. • Entender la problemática que plantean las etapas de una segmentación superescalar. • Saber qué son el jront-end, el núcleo de ejecución fuera de orden y el back-end de un procesador superescal31·. • Conocer las técn icas dinámicas más utilizadas para la especu lación de l resultado y la dirección de destino de una instrucción de salto. 72
2.3. CARACTERíSTICAS DE LOS PROCESADORES SUPERESCALARES
• Conocer técnicas que mejoran el ancho de banda del procesador, como la prelectura, la predecodifi cación y la traducción de instrucciones. • Comprender la fin alidad del renombramiento de registros y conocer las diferentes formas que existen para incorporar esta técnica en un procesador superescalar. • Entender la relevancia de las etapas de distribución y terminación. • Comprender las técnicas para la resolución de las dependencias falsas de memoria. • Entender cómo se mejora el procesamiento de las instrucciones de carga y almacenamiento. • Conocer cómo se consigue que un procesador superescal ar tenga precisión de excepción. • Conocer otras técnicas para mantener interru pciones precisas.
2.3.
Características de los procesadores superescalares
Tras estudiar el funcionamiento de los procesadores basados en segmentaciones de un único cauce, se desprende que este tipo de procesadores posee límites en su rendimiento. En el caso ideal, es decir, ante la ausencia de detenciones, el número máximo de instrucciones que pueden emitir en cada ciclo de reloj es uno. Una alternati va para mejorar su rendimiento es reducir la duración del ciclo de reloj para aumentar el número de instrucciones ejecutadas por segundo pero esto, ciertamente, conlleva peligros . Por ejempl o, al tener menos tiempo por etapa hay que reducir el número de operaciones a realizar por el hardware y, por lo tanto, aumentar la profundidad de la segmentación para poder realizar todos los pasos que conlleva el procesamiento de una instrucción. Sin embargo, este aumento del número de etapas se traduce en un aumento de los buffers que las separan y el consiguiente aumento de las dependencias entre insu·ucciones. Esto último se traduce en un aumento de los riesgos y, por consiguiente, en un aumento de las detenciones y de las burbuj as en la segmentación o, lo que es lo mismo, en una pérdida mayor de ciclos. Es decir, se llega a un punto de infl ex ión en donde la sobrecarga que introduce una segmentación muy profunda es mayor que las ventajas obtenidas por el aumento de la frecuencia, dándose el contrasentido de que un aumento de la frec uencia de reloj provoca un decremento del rendimiento global del procesador. Otro fac tor que no hay que olvidar es que, a medida que la segmentación se hace más profunda, intervienen más tra nsistores, y se produce un incremento de la potencia consumida y de la cantidad de calo r a disipar. En el tema anterior se han estudiado técnicas que permiten mejorar el rendimiento de los procesadores segmentados y superar algunos de sus inconvenientes. Sin embargo, las necesidades de procesa miento que demandan las aplicaciones informáticas de hoy en día, exigen un rendimiento a este tipo de procesadores que, por su diseño arquitectóni co, no son capaces de proporcionar desde hace ya algunos años. Una de las soluciones más utili zadas para alcanzar esos ni veles de rendimiento son las segmentaci ones superescales que, implementadas en forma de componente electróni co, dan lugar a lo que se conoce
73
INGENIERíA DE COMPUTADORES 11
como procesadores superescalares . Hoy en día, la casi totaüdad de los computadores se constru yen en base a este tipo de procesadores. Otras alternativas actuales son los procesadores construidos conectando varios núcleos superescalares y los procesadores VLIW y EPre, que dejan en manos del compil ador el extraer el máx imo provecho del paralelismo a nivel de instrucción. No hay que olvidar la existencia del procesamiento vectorial , que muchos procesadores superescalares incorporan gracias a la i.nclusión de unidades funcionales diseñadas para procesar instrucciones SIMD. La di ferencia más destacada de una segmentación superescalar con respecto a una segmentación clásica o escalar es que vru·ias instrucciones avanzan simultáneamente por las etapas de la segmentación, lo que implica la existencia de vru·ias unidades fu nciona les para poder efecturu· esa concurrenc ia. Otra característica fundamenta l de estas segmentaciones es la ejecución de instrucciones en un orden diferente al que se especifica en el programa. En resu men, las segmentaciones superesca lares se caracteri zan por tres atributos: pru·aleli smo, diversificación y dinamismo. Paralelismo Los procesadores segmentados presentan paraleljsmo de máquina temporal , es decir, e n un mismo instante de tiempo varias instrucciones se encuentran ejecutándose pero en diferentes etapas. Así, si un procesador c uenta con una segmentación de k etapas, estarán ejecutándose k instrucc iones en el in stante de tiempo t. En un procesador superescalar se dan simultáneamente el paralelismo de máquina temporal y el espacial. El temporal es una consecuencia directa de ser procesadores segmentados. El espacial surge como consecuencia de la replicación del hardware que pennite que varias instrucciones se estén procesando simultáneamente en la misma etapa. El nj vel de paraleüsmo espacial de un procesador se especifica con el término ancho o grado de la segll1entacióll y especifica el número de in strucciones que se pueden procesar simu ltáneamente en una mi sma etapa. Por lo tanto, en un procesador superescalar de ancho y profundidad de segmentación 4 y 5, respectivamente, como el de la F igura 2. 1, pueden llegar a estru· ejecutándose 20 instrucciones diferentes en un ciclo de reloj. Evidente mente, el coste y la complejidad del hardware aumenta ya que, por citar so lo algunos de los elementos afectados, hay que aumentar los puertos de lectura/escritura del fichero de regi stros para que varias instrucciones puedan acceder a sus operandos simultáneamente, lo lnismo sucede co n las escrituras/lecturas en las cachés de datos y de instruccjones, las unidades aritméticas, los buffers de contención entre etapas, etc. De lo descrito hasta este punto se puede desprender que un procesador superescalar no es más que la réplica de una segmentación esca lar lígida. Así, va ldría con replicar 4 veces una segmentación escalru· para obtener un procesador superescalar de ancho 4. Pero no es tan fáci l. Por un lado hay que tener en cuenta la posibilidad de la ejecución de instrucciones fuera de orden y el conocido problema de las dependencias de datos y de memoria. Además, si se refl ex iona por UIlOS instantes, se deduce que los buffers de contención entre etapas ya no pueden ser simples réplicas de los buffers de las segmentaciones escalares; ahora pasru·ían a ser complejos buffers multientrada que deberían permitir, por ejemplo, pasar a unas instrucciones pero no a otras . Otro elemento a incluir es una compleja red de interconexión entre las entradas y salidas de las múltiples unidades funciona les que perm ita la resolución de las dependencias verdaderas de datos. 74
2.3. CARACTERíSTICAS DE LOS PROCESADORES SUPERESCALARES
Etapa 1 Buffer 1
Etapa 2 Buffer 2 Profundidad
Etapa 3
=5
Anchura = 4 Buffer 3
Etapa 4
Buffer 4
Etapa 5
i¡"16
i i+17
Figura 2.1: Esquema de una segmentación de profundidad 5 y anchura 4. En condiciones ideales pueden concluir su procesamiento de forma simultánea hasta 4 instrucciones por ciclo.
Diversificación Debido a que los diferentes tipos de instrucción que constituyen un repertorio de in strucciones (aritméticas, lógicas, cargas, almacenamientos, saltos, bifurcaciones, etc.) implican diferentes operaciones, disponer de un único tipo de cauce en la segmentación es ineficiente, incluso aunque se trate de una segmentación con varios cauces en paralelo. Hay instrucciones que no tienen que pasar por todas las etapas ya que solo utili zan un subconjunto. Por ejemplo, las instrucciones aritméticas en una máquina de carga/almacenamiento no necesitan acceder a la memoria. Pero, además, el agl utinamiento de operaciones de valios tipos de instrucciones en una misma etapa hace ineficiente el uso de los recursos hardware (por ejemplo, diferentes tipos de operaciones enteras y flotantes se realizan en una única unidad funcional) . Por esta razón, los procesadores superescalares incluyen en la etapa de ejecución múltiples unidades funcionales diferentes e independientes, siendo habitual la ex istencia de varias unidades del mismo tipo. Un ejemplo de segmentación diversificada lo constituye el procesador Alpha 21264 e n e l que la etapa de ejecución consta de 6 unidades funciona les de la cuales 2 realizan operaciones con enteros, 2 son para el cálculo de direcciones, 1 para sumas, divisiones y raíces cuadradas en coma fiotante y I para multiplicaciones en coma flotante. Otro ejemplo es el procesador PowerPC 970, que dispone de 12 unidades de ejecución: 2 unidades para operaciones enteras (FXUO y FXUl) , 2 unidades de coma flotante (FPUO y FPU 1), 2 unidades de carga/almacenamiento (LSUO y LSU 1), 4 unidades especiales 75
INGENIERíA DE COMPUTADORES 11
para el procesamiento de instrucciones vectoriales SIMD (VP, VF, VX, VC), I unidad para la resolución de saltos (BRU) y I unidad para operar con registros de condi ción o de estado (CRU). El procesador AMD Opteron cuenta con 3 unidades enteras, 3 unidades de punto fl otante, 3 unidades para la generación de direcciones y 2 unidades de carga/almacenamiento. Hay que destacar que el ancho de la segmentación en las dife rentes etapas puede vari ar. Por ejemplo, e l PowerPC 604 tiene una segmentación de 6 etapas, es capaz de leer y decodificar 4 instrucciones, c uenta con 6 unidades funcionales en la etapa de ejecución (3 unidades enteras, I de coma flotante, I para procesamiento de saltos y J unidad de carga/almacenamiento), y puede concluir e l procesamiento de hasta 6 instrucciones por ciclo. El PowerPC 970 está diseñado para leer y decodifi car hasta 8 instrucciones por ciclo, emitir 8 instrucciones a las unidades fun cionales y terminar hasta S por cic lo. Lo anterior no impli ca que queden unidades func ionales ociosas. Las unidades fun cionales están segmentadas pudiendo ocurrir que todas estén ocupadas por instrucciones que se hayan emitido en diferentes ciclos de reloj . Volviendo al PowerPC 970, éste di spone de 12 unidades de ejecución pero, según especifi caciones de l fabricante, envía a las unidades un máx imo de 8 instrucciones por c iclo, lo que implica que en un ciclo de re loj pueden convivi r en la fase de ejecución instrucciones que fueron emitidas en diferentes ciclos.
Dinamismo Las segmentaciones superescalares se etiquetan como dinámicas al permitir la ejecución de instrucciones fuera de orden. Las instrucciones se leen, decodifican, di stribuyen y terminan e n el orden secue ncial en que aparecen en el programa pero se pueden e mitix y finali zar en las unidades funcional es en un orden diferente al establecido por e l programa. La segmentación superescalar cuenta con los mecmlÍsmos necesarios para garantizar que se obtendrán los mismos resu ltados, es decir, que se respeta la semántica del código fu ente. En una segmentación rígida paralela todas las instrucciones situadas en la etapa i pasan a la etapa i+ I en el siguiente ciclo de re loj. Todas las instrucciones entran y avan zan simultáneamente por la segmentación y terminan simultáneamente. Los registros que separan las etapas en una segmentación paxalela rígida son buffers multientrada o multipuerto y, básicamente, son una réplica de los registros que separan las etapas en una segmentaci ón escalar clásica. Tal y como se ha indi cado, la problemática de este tipo de segmentaciones es la detención de todo el cauce ante una dependenc ia por parte de una de las instrucciones que se han em itido. Una segmentación din ámica paralela utiliza buffers multientrada que permiten que las instrucciones entren y salgan de los buffers fuera de orden. Puede suceder que una instrucción se quede detenida e n el buffer en espera de un operando, mientras que se da paso a instrucciones posteriores pero que disponen de todos sus operandos. En el momento de concluir su procesamie nto puede suceder que estas instrucciones (s i hay dependencias WAW) tengan que quedar retenidas en otro buffer para respetar la semántica del programa y terminar en orden. La ventaja que apOlta la ejecución fuera de orden es clara: intenta aprovechar al máximo el paralelismo que permiten las instrucciones y el que permite el hardware al di sponer de múltiples unidades func ionales. Esto se traduce en: 76
2.3. CARACTERíSTICAS DE LOS PROCESADORES SUPERESCALARES
• Unas instrucciones pueden adelantar a otras si no hay dependencias fal sas, evitando ciclos de detenc ión innecesarios.
• Una reducción de los ciclos de detención por dependencias verdaderas de datos y memoria. Se dispone de mecani smos que penniten que una instrucción se pueda emitir a una unidad funcion al
en cuanto sus operandos fuente están di sponibles en las salidas de otras unidades fu ncionales.
La Figura 2.2 muestra un esquema por bloques de una segmentación superescalar. Hay dos partes claramente diferenciadas: el bloque de etapas compuesto por el fron/-end y el back-end en el que las instrucciones avanzan en orden y se asegura su terminación ordenada y el núcleo de ejecución dinámica que es el conjunto de uni dades funcionales en el que se ejecutan las instrucciones fuera de orden.
Otra característica de los procesadores superescalares es su capacidad para especuJar, es decir, realizar predicciones sobre las instrucc iones que se ejecutarán tras una instrucción de sa lto. En un procesador superescalar no solo las instrucciones se ejecutan fuera de orden sino que se ej ecutan
instrucciones que puede que no sean necesarias si el destino de salto no coincide con la especulación realizada por el procesador.
Núcleo de
ejecución dinámica
Terminación
1
Back-end
Figura 2.2: Esquema de bloques de un procesador superescalar segmentado con ejecución fuera de orden.
77
INGENI ERíA DE COMPUTADORES 11
2.4.
Arquitectura de un procesador superescalar genérico
Conocidas las características genéricas de las segmentaciones superescalares, en esta sección se presenta un sencillo modelo de este tipo de arquitectura. Este modelo servirá como guía para explicar el funcionamiento de cada una de las etapas de que consta, así como para profundi zar en las técnicas que se aplican para solucionar los problemas que surgen al permitir la ejecución de las instrucciones fuera de orden. El modelo de segmentación superescalar genérica consta de 6 etapas: • Etapa de lectura de instrucciones (IF - /l1structioll Fetch). • Etapa de decod ifi cación (ID - /l1slructiol1 Decodillg). • Etapa de distribución/emisión (I! - 1l1structio/1. lssue). • Etapa de ejecución (EX - Execution). • Etapa de terminación (WR - Write-Back Results) . • Etapa de retirada (RI - Retiremel1t 1I1S1ructioI1S). Tomando como referencia este modelo, la F igura 2.3 muestra un ejemplo de segmentación superescalar con 7 unidades funcionales en la etapa de ejecución: 2 para operaciones con enteros, 1 para sumas/restas en coma fl otante, l para mul tiplicación/división en coma flotante, 1 para instrucciones de salto, 1 para las instrucciones de almacenamiento y I para las instrucciones de carga desde memOli a. En este ejemplo se considera que el ancho de la segmentac ión es 4 a lo largo de toda la segmentac ión, aunque en los procesadores reales no es así y el ancho varía según la etapa. En el ejemplo de la Figura 2.3, la etapa IF es capaz de leer simultáneamente 4 instrucciones de 4 bytes desde la I-caché. A continuación, las 4 instrucciones pasan a la etapa ID en donde se decodifi can en paralelo. Tras esto, las instrucciones pasan ordenadame nte a la etapa I! donde, según su ti po y disponibilidad de sus operandos Fuente, quedan en la estación de reserva centralizada (más adelante, se estudiará este elemento clave) a la espera de ser emiti das a las unidades funcionales correspondientes. Desde este momento es cuando comienza la ejecución fuera de orden de las instrucciones, ya que puede suceder que unas instrucciones posteriores a otras en el orden del programa se ejecuten antes en las unidades funcionales debido a que dispongan de todos sus operandos fuente y su unidad funcional esté libre. Finalizada su ejecución, las instrucc iones se almacenan en el buffer de reordenamiento o de terminación donde quedan a la espera de poder termi nar arquitectónicamente su procesamiento. Tras salir del bufrer, las instrucciones pasan por la etapa de terminación para reali zar la esclitura de res ul tados en registros, de form a que la actuali zación del estado de la máqu ina no viole la semántica del programa y se mantenga la consistencia del procesador. Para concluir su procesamiento, las instrucciones de almacenamiento quedan detenidas en el bu ffer de almacenamiento para proceder a la escritura ordenada de sus resultados en memoria en la etapa de retirada, es decir, para actualizar el estado de la memori a y mantener la consistencia de la memoria. La finalidad de esta etapa de retirada es permitir que los
78
2.4. ARQUITECTURA DE UN PROCESADOR SUPERESCALAR GENÉRICO
~
Multiplicación I División: 3 ciclos Carga: 3 ciclos
Almacenamiento : 2 ciclos
I
Sum a en coma flotante: 2 c iclo s
1
j
I Buffer de instrucciones
C::=C::=!==C:::::::J1 Buffer de distribución
I
Distribución
...
l
Entero
J
I Estación de reserva centralizada
¡
I Entero I
Floal
Float
- - - --
- - - --
J
J
Almacenamiento
Carga
----------
- - - --
I
I
Terminación
- --
I
Salto
I
- - - --
I .. .
- -
[
Buffer de reordenamienlo o de terminación
I
¡ E~~~~3 Buffer de almacenamiento
¡ Retirada
Figura 2.3: Ej emplo de segmentación superescalar genérjca.
79
INGENIERíA DE COMPUTADORES 11
almacenamientos concluyan ordenadamente cuando no esté ocupado el bus de acceso a la caché de datos, dando mayor prioridad a las instrucciones de lectura. Existe una gran conf usión en lo que respecta a algunos de los términos utilizados en la literatura para describir los estados por los que pasa una instrucción en una segmentación superesca lar. En líneas generales yen este texto se entiende que una instrucción ha sido : • Distribuida (dispatched) cuando ha sido enviada a una estación de reserva asociada a una o varias unidades fu nciona les del mismo tipo. • Em.itida (issued) cuando sale de la estación de reserva hacia una unidad funcional, es dec ir, cuando comienza su verdadera ejecución. En algunas ocasiones, y dependiendo de la arqu itectura, la distribución y emi sión se realizan en la rrusma fase. • Finalizada (finished) cuando abandona la unidad funcional y pasa al buffer de reordenamiento. Los resultados se encuentran almacenados temporalmente en registros no accesibles al programador, conocidos como registros de renombra miento. • Term.inada (completed) o terminada arquüectónicamente es cuando ha rea lizado la escri tura de los resultados desde los registros de renombramiento a los registros arquitectónicos, ya visibles al programador. En esta fase se realiza la actualización del estado del procesador para garantizar así su consistencia. • Retirada (retired) cuando ha real izado la escritura e n memoria (actualización del estado de la memoria). Si las instrucci ones no necesitan escribir e n memoria (por ejemplo, las instrucciones atitméti co- Iógicas) se considera que la finali zación de una instrucción coincide con su retirada.
Veamos algunos ejem plos para comprender un poco mejor la problemática que entraña el diseño de un procesador superescalar. En los siguientes ejemplos se va a emplear una segmentación superescalar similar a la del modelo de la Figura 2.3. Como única técnica para minimizru· las detenciones causadas por las dependencias de datos se considerará el adelantam iento de resultados entre unidades funcionales. Las instrucciones leen sus operandos fuente en cuanto están disponibles en el fi chero de registro o les son adelantados y se emiten cuando ya di sponen de todos los operandos y la unidad está libre.
Ejemplo 1 La Figura 2.4 muestra la ejecución de un fragmento del código ensamblador del bucle DAXPY en el modelo de segmentación superescalar. El bucle DAXPY (Doub Le Precision A Times X Plus Y ) es parte del benchmark LINPACK e implementa la operación vectorial Y(i)=a*X(i)+ Y(i). En este ejemplo la longitud del vector es de 100 elementos de 8 bytes. Siguiendo el modelo de la Figura 2.3, inicialmente se extrae de la caché de instrucciones y se decodifica un bloque de cuatro instrucciones. Debido al riesgo RAW entras las dos primeras instrucciones por el registro F2, la instrucción i2 se detiene 3 ciclos hasta q ue la instrucc ión i lle adelanta el resultado de la carga al finali zar su etapa EX. La instrucción i3 queda detenida un ciclo debido a un riesgo estructural ya que la única unidad funciona l de carga se encue ntra ocupada por la instrucción i 1. Una vez 80
2.4. ARQUITECTURA DE UN PROCESADOR SUPERESCALAR G ENERICO 2
3
4
5
6
7
8
9
10
11
12
I IF
ID
1I
i2: MULTD F4. F2. FO
IF
ID
11
i3: LD
F6.0(R2)
IF
ID
11
i4: ADDD
F6.F4. F6
IF
ID
II
i5: SD
0(R2). F6
IF
ID
11
i6: ADDI
R1.R1.#8
IF
ID
II
EX WB
i7 : ADDI
R2. R2. #8
IF
ID
II
EX WB
i8: SGT
R3. R1. #800
IF
ID
1I
i9: BEQZ
R3. ¡1
IF
ID
i1 : LD
F2.0(R1 )
13
I
14
15
I
EX, EX, EX, WB EX, EX, EX, WB EX, EX, EX, WB EX, EX, WB
... ¿ LD
EX, EX, I WB I RE I
EX WB
11
EX WB
F2. 0(R1)?
¿ MULTD F4. F2. FO? ¿ LD F6. 0(R2) ?
Figura 2.4: Secuencia de la ejecución de l bucle DAX PY en la segmentación superescalar de 6 etapas.
liberada la primera etapa de la unidad de carga, la instrucción i3 puede comenzar su ejecución y concluye antes que la insLrucción i 2 ya que no viola la semántica del programa. Debido a la dependencia RAW que tiene la insLrucción i4 con respecto a la i 2, i 4 se tiene que detener hasta que se pueda adelantar el resul tado de la multiplicación. Aunque la instrucción i4 presenta una dependencia de datos verdadera con la instrucción i3, esta no constituye ningún riesgo ya que el resultado se genera a tiempo no forzando ninguna detención. En el ciclo 2, el siguiente grupo de cuatro instrucciones se extrae de la l-caché y se decodifica. La instrucción i 5 mantiene una dependencia RAW con i 4 lo que la obliga a detenerse hasta que la unidad de multiplicación pueda adelantar el resultado. La instrucción de almacenamiento hace uso de la etapa de retirada para escribir en memoria y mantenerla actualizada. Las instrucciones i6 e i 7 no presentan ningún ti po de riesgo verdadero y avanzan a lo largo de la segmentación sin ningún impedimento. La instrucción i8 presenta una dependencia RAW con respecto a i6 a causa del registro Rl , por lo que queda detenida has ta disponer del resultado. En el ciclo 3 se efectúa la lectura del siguiente bloque de cuatro instrucciones, de las cuales solo la i 9 no es una especulación mientras que las otras tres serán resultado de la política de predicción de saltos que implemente el procesador. En este caso, la instrucción de compamción i9 mantiene una dependencia con la instrucción i 8 ya que necesita el valor de R3 por lo que deberá detenerse un ciclo en espera de que le adelanten el resultado. En el ejemplo anterior, la emisión y termin ación de las instrucc iones se realiza de form a desordenada. En el momento en que una instrucción di spone de sus operandos (no hay riesgos RAW) y hay unidades fun cionales libres (no hay riesgos estructurales) pasa a ejecutarse. Por lo tanto, como la terminación de 81
INGENIERíA DE COMPUTADORES 11
las instrucciones se rea)jza de forma desordenada se impide un tratam iento preci so de las interrupciones al no garantizarse la consistencia del procesador como consecuencia de las escrituras desordenadas en los registros sin atender al orden del programa. Por otra parte, la ejecución desordenada no garantiza el cumplimiento de las dependencias falsas en las sucesivas iteraciones del bucle. En este ejemplo, si los operandos se leyesen del fichero de registros e n el momento de la em.i sión de la instrucc ión hacia una unidad funcional, se vio laría la dependencia WAR entre las instrucciones iS e i7 por culpa del regislTO R2. Si se continúa desarrollando el ejemplo con las sucesivas iteraciones del bucle se puede apreciar, con toda claridad, la magnitud del prob lema.
Ejemplo 2 En el ejemplo de la Figura 2.5 se aprecia, claramente, cómo la final ización de las instrucciones de forma desordenada puede producir la violación de dependencias WAR. Las instrucciones i2 e i 3 presentan detenciones ya que deben esperar por la generación de sus ope randos fuente. La instrucción i4 no presenta ninguna detenc ión y concl uye su procesam.iento con la etapa de retirada que es cuando se produce la escritura en memoria del conte nido de FS. 2
i1: ADD I
34
R1, RO , #1
IF
ID
II
i2 : MULTI R1 , R1, #4
IF
ID
II
i3: LD
F1 , O(R1)
IF
ID
II
i4: SD
O(R2), F5
IF
ID
11
EX
56
7
8
9
WB EX WB EX, EX, Ex, 1WBI
EX, EX, WB RE
Figura 2.5: Ejecución de una secuencia de instrucciones en la segmentación superescalar de 6 etapas.
Si se analiza con detalle el procesam.iento de las instrucciones, se observa que se puede haber producido la violación de una dependencia WAR ya que el almacenam.iento de i4 ha escrito en memoria antes que la in strucc ión de carga haya real.izado la lectura. La violación de la dependencia WAR se habrá producido si el conten.ido de Rl y R2 coinciden. En estos dos ejemplos se puede apreciar que una term.inación ordenada de las instrucciones evita los riesgos WAW y WAR ya que se impide que una instrucción posterior a otra en la secuencia de código 2
3
4
5
6
7
8
9
10
11
I i1: ADD I
R1, RO , #1
IF
ID
II
i2 : MULTI R1 , R1 , #4
IF
ID
II
i3: LD
F1 , O(R1)
IF
ID
II
i4 : SD
O(R 2), F5
IF
ID
II
EX WB EX
WB EX, EX, EX, WB
EX, EX,
WBI REI
Figura 2.6: Tenn inación ordenada de instrucciones mediante la introducción de ciclos de detención.
82
2.4. ARQUITECTURA DE UN PROCESADOR SUPERESCALAR GENÉRICO
escriba antes. U na soluc ión inmediata para forzar la terminac ión orde nada de las instrucciones es la
introd ucción de ciclos de detención, tal y como muestra la Figura 2.6. Sin embargo, esta solución no es mu y adec uada y en segmentaciones anchas y profundas, como las superescalares, provoca grandes pérd idas de rendimiento. Es muy importante diferenciar entre el concepto de etapa lógica y etapa física. Las etapas lógicas permiten agrupar un conjunto de operaciones que realizan un a tarea completa, como por ejemplo, la lectura de instrucciones, la decodificación, la ejecución, etc. En las implementac iones reales, las etapas lógicas se encuentran segmentadas, es decir, compuestas por varias etapas físicas o segmentos, donde cada segmento consume un ciclo de reloj. En el modelo de segmentación superescalar de la Figura 2.3 se ha considerado que todas las etapas sal vo la de ejecución consumen un ciclo de reloj y que la etapa de ejecución oscila de I a 3 ciclos según la unidad funcional de que se trate. Es muy habitual que cada etapa lógica tenga una profundidad y anchura diferentes, dependiendo del diseño del fabri cante. U n ejemplo muy ilustrativo lo constituye la segmentación del procesador PowerPC 970 (Figura 2.7) cuya anchura y profundidad varían dependiendo de la etapa y del tipo de instrucción. En lo que respecta a su anchura: • Lee hasta 8 instrucciones por ciclo de reloj . • Decodifica en instrucciones internas hasta 5 instrucciones por ciclo. Operaciones carga { almacenamiento
B=EE= ~ffi
L1 LZ
Operaciones enteras y salto
~I
X1 XZ SR CR
D
Operaciones en coma flotante
B=EB:"'-I1""-;111""-'1~
F1 FZ
Operaciones SIMO
'~=l=;=;::~q::¡::¡
VX VC VF VP
Procesamiento
fuera de orden
Lectura y decodificación
Distribución
Ejecución
I Terminación I
Figura 2.7: Esque ma lógico de la segmentac ión rea l de un procesador PowerPC 970. Observe que las cinco etapas lóg icas (fetch , decade , dispafch, execute, complete) se descomponen en segmentos que consume n un c ic lo de re loj.
83
INGENIERíA DE COMPUTADORES 11
• Distribuye hasta 5 instrucciones internas por ciclo. • Emite hasta 10 instrucciones internas por ciclo a las unidades de ejecución. • Termina hasta 5 instrucciones internas por ciclo. Mientras que la profundidad de la segmentación varía según el tipo de instrucción: • 16 etapas para operaciones con enteros y saltos.
• 18 etapas pam operaciones de carga/a lmacenamiento. • 2 1 etapas para las operaciones de coma Rotante.
• 19 etapas para operaciones SIMD con nú meros enteros. • 19 etapas para operaciones SIMD de permutación. • 22 etapas para operaciones SIMD con números comp lejos. • 25 etapas para operaciones SIMD con número en coma flotante . lo que le permite estar procesando simultáneamente un máximo de 2 15 instrucciones, que se distribuirían de la siguiente forma: • La etapa de fetch dispone de un buffer interno (buffer de fetch/ovelflow) que mantiene hasta 16 instrucciones. • E l buffer de instrucciones previo a la decodifi cación mantiene hasta 32 instrucciones. • En cada ciclo se transfieren 5 instrucciones del buffer de instrucciones a la etapa de decodificación (3 etapas) . Por lo tanto, en la etapa de decodificación se mantienen 15 instrucciones. • Hay 4 buffers de distribución , cada uno de los cuales manti ene un grupo de distribución compuesto por 5 operaciones. Por lo tanto, en un ciclo se mantienen hasta 20 instrucciones en los buffers de di stribución. • El buffer de reordenamiento puede mantener información de hasta 20 grupos de distribución de las inslTucc iones que hay en fase de ejecución y de las que ya han sido terminadas. Esto hace un total de LOO instrucc iones. • El buffer de almacenamiento puede mantener hasta 32 instrucciones de almacenamiento. 84
2.4. ARQUITECTURA DE UN PROCESADOR SUPERESCALAR GENÉRICO
Un rápido análisis de estas cifras permite apreciar la enorme complej idad que conll eva el diseño de un procesador superescalar comercial y las simplificaciones que se reali zan en los ejemplos didácticos. Después de conocer algunas de las características de la segmentación del PowerPC 970, se deduce rápidamente lo importante que es una con ecta gestión de la lectura de instrucciones y su decod incación para poder alimentar a las unidades funcionales de form a constante. Pero, además, la resolución de los tres tipos de dependencias de datos que pueden ex istir entre las numerosas instru cciones que están en la etapa de ejecución! ya sea a la espera de su el11i sióIl o en una
unidad funcional, no es tampoco ev idente. Las dependencias RAW entre instrucciones se pueden resolver mediante el adelantam iento de resultados entre unidades funcionales. Para ello es necesario inc luir buses de interconexión o de reenvío entre las unidades así como el hard ware adicional con la lógica de control de acceso a los buses. Sin embargo, esto provoca la ex istencia de dependencias estructurales al estar limitadas las interconexiones entre unidades. Pero al ser varias las instrucciones que pueden estar esperando por uno o varios de sus operandos
fuente para emitirse a las unidades funcionales , el reenvío de las salidas de las unidades funcionales no es tan tri vial como en una segmentación escalar. Las estaciones de reserva, que son las encaTgadas de emitir las instrucciones a las unidades funcionales una vez que estén listas, deben poder saber cuándo el resultado de una unidad funcional que circula por el bus de reenvío corresponde a uno de los operandos fuente de las inso'ucciones que están en espera de poder iniciar su ejecución. En lo que respecta a los riesgos WAR y WAW, la inserción de ciclos de reloj para forzar la tenninación ordenada de las instrucciones y respetar la semántica del programa es conservadora y no permite aprovechar todo el paralelismo que brinda la existencia de múltiples unidades funcionales así como evitar detenciones innecesarias en las unidades. Es decir, penaliza el rendimiento. Como se ha visto en el ejemplo del PowerPC 970, las unidades fun cionales tienen segmentaciones profundas lo qu e implica pagar un precio elevado en cic los de reloj si hay que mantener una unidad funcional detenida para resolver unas dependencias WAW y WAR como, por ejemplo, las que se presentan en: i 1: i2: i3: i4:
AD D
Rl,Rl,R 2
MULTI R3,Rl,#1
ADDI
Rl,R2,#1
MULTI R5,Rl,#8
Observe en el ejemplo que no sería necesario detener las instrucciones i3 e i4 hasta que la i2 leyese el contenido de Rl si se reemplazase el registro Rl en las instrucciones i 1 e i2 por otro no utili zado. Como ya se ha señalado, las dependencias WAR y WAW se conocen como dependencias falsas ya que no existe una dependenc ia real , tal y como sucede en las RAW, donde un operando fu ente es el resultado de una operación previa. Es decir, en las dependencias falsas no existe una relación productor-
consumidor entre dos instrucciones como ocurre en las dependencias verdaderas. Las dependencias de datos falsas se resuelven en los procesadores superescalares recun-iendo a un almacenami ento te mporal en el que se realiza la escritura que entraña li esgo, es decir, la de i3 en el ejemplo anterior. Para ello se emplea una técnica conoc ida como renombramiento dinámico de registfVs que consiste en utilizar un
conjunto de registros ocu ltos al programador en los que se realizan los almacenamientos temporales. De 85
INGENIERíA DE COMPUTADORES 11
forma resum ida, la técnica consta de dos pasos: l. Resolución de riesgos WAWy WAR . Se renombran de forma única los registros arquitectónicos que son objeto de una escritura. Se resuelven así las dependencias WAW y WAR ya que se manejan registros diferentes. Utilizando el ejemplo anterior se tendría: AOO MULTI AOOI MULTI
Rrl,Rl,R2 Rr3,Rl,#1 Rr2,R2,#1 Rr5 , Rl ,#8
2. Man.fell im.ienfo de dependencias RAW. Se renombran los registros arqui tectónicos fuente que corresponden a una escritura prev ia. El objeto de este paso es mantener las dependencias RAW: AOO MULTI AOOI MULTI
Rrl,Rl,R2 Rr3,Rrl,#1 Rr2,R2,#1 Rr5,Rr2,#8
Una vez que se han resuelto todas las dependencias en la etapa de di stribución y las instlUcciones se han procesado fuera de orden en la etapa de ejecución, se procede en la fase de telminación a deshacer el renombra miento y a actualizar ordenadamente los registros arqu itectónicos. En lo que respecta a las dependencias entre instrucciones de carga/almacenam iento, se presentan las mismas situaciones que con las instrucciones que operan con registros . Suponiendo que la posición de memoria es común se tiene que: • Una carga seguida de un almacenam iento produce una dependencia RAW: SO ~(Rl),R5 LO R5, ~(Rl)
• Un almacenamiento tras una carga implica una dependencia WAR: LOR3,~(Rl)
SO
~(Rl),R5
• Dos almacenamientos segui dos implican una dependencia WAW: SO SO
~(R l ),R3 ~(R l ),R5
La so lución para respetar las dependencias que pueden existir entre las instrucciones de carga/almacenamiento es su ejecución ordenada pero esto no resulta eficiente. Lo habitua l es que se realice el renombramiehto y la terminación ordenada de los almacenamientos ya que así se resuelven las 86
2.5. LECTURA DE INSTRUCCIONES
dependencias WAR y WAW, pero no las RAW. Al igual que con las operaciones con registros, la solución clásica para resolver las dependencias RAW es el adelantamiento de los operandos. Ahora, una instrucción de almacenam iento es la que adelanta el valor a escribir en memoria a la carga pero sin pasar por la memoria, recurriendo al reenvío interno. Otra forma de mejorar el rendimiento es adelantar la ejecución de las cargas ya que suelen ex istir muchas instrucciones aritméticas que dependen del dato que recupera de la memoria una instrucción de carga. Para finali zar este rápido recorrido por algunos de los problemas que implica el procesamiento fuera de orden de varias instrucciones en un procesador superescalar, es necesario detenerse unas líneas en la problemática de la consistencia. El que se adelanten resultados o se renombren los registros para ev itar dependencias WAR y WAW y aumentar así el rendimiento de las unidades funcionales no garantiza la consistencia semántica del procesador y de la memoria. Para lograr la consistencia, una vez deshecho el renombramiento, hay que real izar la escritura ordenada de los registros arquitectónicos en la etapa de terminación y de las posiciones de memoria en la etapa de retirada. Además, solo es posible terminar aq uellas instrucciones que no sean el resultado de especular con una instrucción de salto, ya que si actualizan el estado de la máquina puede que, a posteriori , sea necesario reestablecerlo si no hubo lugar a su ejecución. Por otra parte, el mantenimiento de la consistencia es un aspecto funda mental para realizar un tratam iento correcto de las interrupciones. Como se verá postetiOlmente, el buffer de reordenamiento o ternunación se convierte en la pieza fundamental para conseguir esta consistencia del procesador ya que es el lugar en donde se realiza el seguimiento de una instrucción desde que se distribuye hasta que se termina.
2.5.
Lectura de instrucciones
La principal diferencia en la etapa de lectura de instrucciones entre un procesador superescalar y un escalar es el número de in strucciones que se extraen de la caché de instrucciones en cada ciclo de reloj. En un procesador escalar es una, mientras que en un superescalar el número de instrucciones está determinado por el ancho de la etapa de lectura. En el modelo de la Figura 2.3 se ha considerado que el ancho es 4, mientras que en el PowerPC 970 es 8. Todo esto implica que la caché de instrucciones tiene que estar diseñada para que en un único acceso proporcione tantas instrucciones como ancha sea la etapa de lectura. Dado que en los accesos a la caché pueden aparecer fallos de lectura que detengan el sumini stro de instrucciones, los procesadores disponen de mecanismos auxiliares de almacenamiento entre las etapas de lectura y decodificación. Habitualmente, esta función la realiza el buffer de instrucciones aunque cada fabricante incorpora sus propios mecanismos complementatios. El buffer de instrucciones se comporta como un amortiguador o shock absorber entre la etapa de decodificación y la etapa de fetch. Aunque la etapa de lectura no suministre instrucciones durante uno O varios ciclos de reloj , la etapa de decodificación puede continuar exu'ayendo instrucciones del buffer y continuar su tarea sin detenerse. Por esta razó n, los procesadores superescalares cuentan con mayor ancho de banda para la lectura de instrucciones que para la decodificación. La Figura 2.8 corresponde a un ejemplo de memoria caché en la que el ancho de un hloque 87
INGENIERíA DE COMPUTADORES 11
I
I
pe
j
Lógica de control
I
I
I A
A
B
o
B
O
1,
1
1,
1
2
2
,,
,, ,,
,,
,
N
¡
¡
~
I
i,
I
2
,,
,, ,
,, ,,
,
, ,,
¡
J
i,
¡
MUX
I
,, ,,, ,
, ,,, ,,
J
J
N
MUX
~
l.
1
N
J
·1MUX 1
13
,,, ,,
N
B
O
2
,, ,,, ,
,, ,
A
B
A O
i3
.JJ-,. Buffer de instrucciones
1~I
MUX
~
I
i,
I
1
Grup o de lecl ura
.
Figura 2.8: Organización de memoria caché en la que el1amaiío de l bloque físico corresponde al ancho de la etapa de decodificación.
corresponde exactamente con el tamaño de la etapa de lectura del modelo de procesador superescalar, es decir, 4 instrucciones. En este ejemplo, la caché es asociativa por conj untos de dos vías, estando el bloque físicamente distribuido en cuatro an'ays de memoria, de forma que cada array almacena una de las cuatro instrucciones captadas por cic lo. Una vez que se introduce una dirección en el contador de programa, la lógica de control accede al conjunto y bloque correspondiente, distribuido entre los cuatro arrays, realiza la lectura y sumini stra al buffer de instrucciones 4 instrucciones en un único ciclo. Al conj unto de instrucciones que se extrae simultáneamente de la l-caché se le denomina grupo de lectura. Veamos las características de un procesador real como el PowerPC 970 en lo relativo a los mecani smos con que cuenta para suministrar un flujo continuo de instrucciones a la segmentación. Dispone de una I-caché de 64 Kbytes por correspondencia directa con bloques de 128 bytes a los que se puede acceder por sectores de 32 bytes. Por cada palabra (4 bytes) di spone de 5 bits adicionales 88
2.5. LECTURA DE INSTRUCCIONES
para realizar la predecodificación de instrucciones. La I-caché admite una lectura y una escritura por ciclo de reloj. Las instrucciones entran al procesador en bloques alineados de 32 bytes que constan de 8 instrucciones de 32 bits. Estos bloques o grupos de lectura quedan encolados en el buffer de instrucciones, que es quien se ocupa de alimentar la etapa de decodificación. Este buffer es capaz de almacenar hasta 32 instrucciones, de admi tir la entrada de 8 instrucciones por ciclo de reloj y de emitir hasta 5. Además, para garantizar el suministro continuo de instrucciones al procesador, la etapa de fetch dispone intel11amente de un buffer auxiliar, denominado de fetdVoverflow, que puede almacenar hasta 16 instrucciones. Tal y como se ha indicado, el objeti vo que debe cubrir la etapa de lectura de instrucciones es garantizar un sumini stro constante de instrucciones al procesador. No obstante, aunque el ancho de la memori a caché de instrucciones sea suficiente pueden surgir dos problemas: la falta de alineamiento de los grupos de lectura y el cambio en el flujo de instruccio nes debido a las instrucciones de salto.
2.5.1.
Falta de alineamiento
Un alineami ento incorrecto de un grupo de lectura implica que las instrucciones que forman el grupo superan la frontera que delimita la unidad de lectu ra de una caché. Esto conlleva la necesidad de dos accesos a la caché ya que el grupo de lectura ocupará dos bloques consecuti vos (Fi gura 2.9). Esto ya reduce el ancho de banda, como míninlO, a la mitad al ser necesarios dos ciclos de reloj para sumini strar las instrucciones que form an el grupo de lectura pero, además, puede provocarse un fallo de lectura si la segunda parte del grupo de lectura pertenece a un bloque que no está en la caché. Por lo general, las máquinas se di señan con ciertas restricciones de alineamiento para evitar problemas de lectura. Por ejemplo, la lectu ra de instrucciones en el PowerPC 970 se realiza de form a alineada en grupos de lectura de 32 bytes (8 instrucciones de 4 bytes). Se indica la dirección en el PC, y la l-caché del PowerPC sumini stra un sector de 32 bytes que, a su vez, form a parte de un bloque de 128 bytes. Si no hay restricciones de alineación , una solución es recurrir a hardware adicional para reali zar la extracción parcial de la unidad de lectura con las instrucciones desordenadas y, tras esto, proceder a la colocación correcta de las instrucciones en el grupo de lectura mediante una red de alineamiento (Figura 2. 10.a) o una red de desplazamiento (Fi gura 2.10. b). La red de alienamiento consiste en reubicar las salidas de la caché mediante multiplexores que conducen las instrucciones leídas a su posición correcta dentro del grupo de lectura. La red de desplazamiento recurre a registros de desplazamiento para mover las instrucciones. Una técnica util izada para minimizar el impacto de los fallos de lectura en la caché de instrucciones se conoce como prejefching o prelecfll ra. Consiste en disponer de una cola de prejefch o de prelectura de instrucciones a la que se recurre cuando sucede un fa llo de lectura en la caché de instrucciones. Si las instrucciones se encuentran en la cola de prefetch, estas se introducen en la segmentación de form a similar a como si hubi eran sido extraídas de la l -caché. Por ejemplo, el PowerPC 970 di spone de una cola de prefetch de 4x 128 bytes. Cuando una lectura de un sector de 32 bytes (8 instrucciones de 4 bytes) de un bloque de la T-caché produce un fa llo, el PowerPC analiza el contenido de la cola de prefetch en busca ele las instrucciones. En caso de que estén, 89
INGENIERíA DE COMPUTADORES 11
se leen y se introducen en la segmentación de forma análoga a como si hubiesen sido extraídas de la I-caché pero con una penalización de 3 ciclos. Al mismo tiempo, el sector crítico que ha producido el fallo de lectura se trae y se escribe en la I-caché para evitar futuros fallos. En caso de que el grupo de instrucciones no esté tampoco en la cola de prefetch, se lanza un fallo al siguiente nivel de caché, el L2, y se procesa con máxima prioridad. Además de estas peticiones bajo demanda a la cola de prefetch, el procesador mantiene una lógica de control que, de forma automática, extrae bloques de la ¡-caché con una elevada probabi lidad de ser referenciados con prontitud y los almacena en la cola ele prefetcb, que dispone de capacidad para almacenar 4 bloques.
I
Lógica de control
I A
B
A
o
B
O
i,
1
2
,, ,, ,
i,
j
MUX
,,, ,, ,
O
1- 1
,,, ,,
~
1
MUX
i,
-
i,
2
,, ,, ,,
,
j
B
1
,,, , ,
,
,,, , ,,
, ,,, ,
,
j
j
N
N
j
i,
i,
1
N
j
A
B
2
, , ,,, ,
N
A
O
2
,
I
pe
j
1
j MUX
i,
1- 1
MUX
~ 1
i,
Grup ad. lectura
.,¿J-.. I
Buffer de instruccion es
Figura 2.9: Grupo de lectura de cuatro instrucciones desa li neado con respecto a la unidad de lectura, provocando la necesidad de dos accesos.
90
2.5. LECTURA DE INSTRUCCIONES
2.5.2.
Rotura de la secuencialidad
El segundo problema que se presenta es la rotura de la secuencialidad en el flujo de instrucciones que componen un grupo de lectu ra. Puede suceder que una de las instrucciones que forme parle de un grupo de 4 instrucciones sea un salto incondicional o un salto condicional efectivo, por ejemplo, la segunda del grupo. Esto provoca que las instrucciones posteriores del grupo, en este caso la tercera y la cuarta, sean inválidas, red uciéndose el ancho de banda de lectura considerablemente. Pero además de la reducción del ancho de banda de lectura de instrucciones, la rotura de la secuencialidad inlplica pagar un elevado coste en ciclos de reloj desperd iciados. En una segmentación de ancho s, cada ciclo de parada equivale a no emitir s instrucciones (o a leer s instrucciones de no operación, NOP) . A esto se le denomina coste mínimo de la oportunidad perdida y se expresa como el
i,
i,
i,
i4
i,
i4
Grupo de lectura
(a)
i,
i,
Grupo de
lectura
(b)
Figura 2.10: Red de alin ea miento basada en mult iplex ores (a) y basada en registros de desplaza mj e nto (b).
91
INGENIERíA DE COMPUTADORES 11
prod ucto entre el ancho de la segmentación y el número de c iclos de penal izac ión. C uando se detecta que la instrucción es un salto incondicional hay que insertar en el PC la dirección de salto, dejando inservible el procesamiento de las instrucciones posteriores al salto que ya se encontrasen en alguna etapa de la segmentación. Análogamente, s i la instrucc ión es un salto condicional, hay que esperar a conocer si el salto es efecti vo o no y, en caso afirmativo, calcular la direcc ión de salto, proceder a su inserción en e l PC y anular las instrucciones posteliores que estu viesen en el cauce. En ambos tipos de saltos se pierden ciclos de procesamiento, pérdida que se agudiza en función del ancho y de la profundidad de la segmentación. Detengámonos a analizar el coste de la pérdida en el procesador superescalar de la Figura 2.3 para los saltos incondicionales y los condicionales sin recurrir a ninguna técnica de mejora y suponiendo que todas las instrucciones son operaciones enteras que consumen un ciclo de reloj en la etapa de ejecución. En este modelo de procesador, las instrucc iones de salto se procesan en la un idad fun ciona l de salto que consume un ciclo de reloj , de forma que al salir de la unidad ya se conoce e l valor del nuevo contador de programa. S i el ancho de la segmentación f uese uno, un ca mbio del PC por parte de la instrucción de salto in1plicaría 3 ciclos de penalización ya que habría que anular las instruccion es posteriores que hu biese en las etapas de distribución, decodifi cación y fetch; habría 3 c iclos sin produc ir ningún resul tado. Pero si el ancho de la segmentación es 4, el coste de la oportunidad perd ida es mucho mayor. En el ej emplo de la Figura 2.11 , cuando la in strucción de salto i genera e l nuevo contador de programa al finali zar la etapa EX , es necesario vaciar el cauce de las in strucciones posteriores que se encuentren en las etapas EX, ll, ID e IF, así como las instrucciones posteriores a i pero que se haya n ejecutado previamente como consecuencia del procesamiento fuera de orden. E n este ejemplo, el coste núnimo de la oportunidad perdida sería de 4*3 ciclos= 12 ciclos. En realidad, el coste de la pérdida es mayor ya que no se incluyen en este cómputo las pérdidas causadas al an ular las instrucciones posteriores al salto que están en la etapa de ejecuc ión y las instrucciones posteriores pero ejecutadas con anterioridad. La técnica de salto retardado que se aplica en los procesadores escalares para rell enar huecos en la segmentación no es válida en un procesador superesca lar. E n un procesador escalar las instrucciones se procesan en orden y la reubicación de instrucciones a continuación de un salto tiene por fi nalidad rellenar las burbujas, que de otra forma, surgirían hasta detectar la efectiv idad de l salto y la dirección de destino. Sin embargo, dado que los procesadores superesca lares son capaces de procesar las instrucciones fu era de orden, no tiene mucho sentido que se coloquen in strucciones no depe ndi entes a continuación del salto. Precisamente por esa razó n, la no dependenc ia, el núcleo de ejecución dinámica puede decidir ejecutar esas instrucciones antes que el salto con lo que el problema permanece. En el ejemplo que se presenta en la F igu ra 2.1 1, si las instrucciones situadas a continuación del salto (de la i + 1 a la i + 15) no guardasen ninguna dependenc ia con e l salto y hubiesen sido colocadas ahí para rellenar huecos, el procesador podría decidir ejecutar algunas de esas instrucciones antes que el salto, siendo otras las instrucciones las que pasasen a ocupar su lugar en la segmentación tras e l sa lto y volviéndose a repetir la mi sma situación: la anul ación del procesamiento de todas esas iJ1Strucciones a l tener que procesar la instrucción i + 40. La solución a este problema pasa por la detecc ión temprana de las in strucc iones que cambian e l fluj o de instrucciones. Lo habitual es detectar las in strucciones e n la etapa de decodificación TD pero cuanto
92
2.5. LECTURA DE INSTRUCCIONES
1
2
3
IF
ID
11
/ EX WB
i+1
IF
ID
11
EX
i+2
IF
ID
II
i+3
IF
ID
11
EX EX
i+4
IF IF
ID ID
11
IF IF
ID ID
11
~ )Q
11
)Q
;+8
IF
;+9
IF
ID ) I( ID )(
;+10
IF
ID
;+11
IF
ID
)( )(
;+12
IF
!)o
PC=M[i]
PC = PC+16 byles
i+5
;+6 i+7 PC = PC+16 bytes
PC = PC+16 bytes
PC = M[i] +160 bytes
, , ,, , ,, , ,, , ,,
4
11
Salto efectivo Nuevo pe =M[i) +1 60 bytes
5
Jvt 1\ Jvt Jv(
~
15 instrucciones anuladas
IF !)~ ;+14 IF ) ó
;+13
;+15
,, ,, , ,,, ,
IF
!) ó /
;+40
IF
ID
11
EX WB
;+41
IF
ID
11
EX WB
;+42
IF
ID
11
;+43
IF
ID
11
EX WB EX WB
3 ciclos de penalización
Figura 2.1 1: El nuevo va lor del pe generado por Ja instrucc ión de sallo e n la etapa EX obliga a vac iar e l cauce y proceder él la ex tracció n del nu evo grupo de lectura.
antes el procesador conozca que hay una instrucción de salto, antes podrá comenzar a apli car alguna de las técnicas destinadas a minimizar e] impacto de este tipo de instrucciones. Una técnica es efectuar una detección integrada con la extracc ión del grupo de lectura. Esta técnica consiste en comenzar el análi sis antes de que se exu'aiga el grupo de lectura de la l-caché. Para ell o se dispone de una pre-etapa de decodificación situada entre la [-caché y el sigui ente ni vel de memoria, el ni vel L2 de caché. Entre otras fun cionalidades, en esta pre-etapa se anali za la instrucción y como resultado se le concate nan unos bits con diversas indicaciones, como por ejemplo, que se trata de un salto.
93
INGENIERíA DE COMPUTADORES 11
2.5.3.
Tratamiento de los saltos
El principal problema que plantea el tratamiento de los saltos no es descubrir que se trata de una instrucción de salto, sino los ciclos que hay que esperar para conocer el resultado de la evaluación de la condición que determina si el salto es efectivo o no y la dirección de destino, en caso de que sea efectivo . Por 10 tanto, el procesamiento de los saltos se realiza, por 10 general, en una unidad funcional específica, ya que detener todo el cauce hasta saber cuál es la siguiente instrucción implicada desperdiciar demasiados ciclos. Lo habitual es que el tratamiento de los saltos se inicie, realmente, en la misma etapa IF, durante la lectura de la ¡-caché, incluso sin que haya confirmación de que hay una instrucción de salto en el grupo de lectura. Una vez que las instrucciones han sido extraídas, y se confirma en la etapa ID que una instrucción es un salto, se puede mantener el tratamiento iniciado o proceder a su anulación . La técnica que se emp lea en los procesadores superescalares para tratar las instrucciones de salto es especular, es decir, realizar predicciones. Al mismo tiempo que se están leyendo las instrucciones de la l-caché, se comienza a predecir su efectividad y su dirección de destino, sin saber realmente si se trata de un salto (lo que se confirma en la etapa ID). Así, por ejemplo, si durante la etapa IF para una instrucción i del grupo de lectura el predictor señala un destino y que el salto es efectivo, nada más concluir la etapa IF ya se puede comenzar el procesamiento especulativo de la instrucción destino del salto: se procede a leer de la l-caché la instrucción de destino y siguientes . Mientras tanto y en paralelo, se continúa procesando el salto i, y si a la salida de la unidad funcional de salto el resultado real no coi ncide con la especulación , el hardware procederá a vaciar la segmentación de las instrucciones especuladas y se rediri ge la segmentación a la dirección COITecta (la instrucción siguiente al salto, la i + 1). Observe que la especulación también puede realizarse con los saltos incondicionales o bifurcaciones: en este caso la espec ulación siempre acabará coincidiendo con el resultado del salto. Volviendo a recurrir al procesador PowerPC 970 como ejemp lo, éste emplea una técnica de predecodificación que añade 5 bits de información a cada in strucción que se almacena en la l-caché y en la cola de prefetch. De esta forma, la longitud de la in strucción pasa a ser de 37 bits. Una vez extraído el grupo de lectura, el PowerPC 970 es capaz de anali zar hasta 8 instrucciones por ciclo en busca de saltos y reali zar la predicción de 2 de eUos, pudiendo mantener en el cauce hasta 16 secuencias de código especuladas. Todos los saltos cond icionales son especul ados en el PowerPC 970, mientras que no sucede lo mismo con los saltos incondicionales. Dependiendo del tipo de salto condicional, algunos de eUos son estáticamente predi chos como efectivos mientras que otros tienen que utili zar los mecanismos de predicción dinámica de que consta el procesador. El compil ador es el encargado de realizar la predicción estática cuando puede conocer de antemano el resultado del salto condicional.
2.5.4.
Estrategias de predicción dinámica
Tal y como ya se ha señalado al abordar el estudio ele los procesadores segmentados, las técnicas que se empl ean para predecir el comportamiento de las instrucciones de salto se dividen en dos grandes 94
2.5. LECTURA DE INSTRUCCIONES
grupos: estáticas y dinámi cas. A diferencia de las técnicas estáticas, las téc nicas dinámicas se basan en el hecho de que un salto es una instrucción cuya ejecución se repite con cierta frecuencia, lo que permite derivar un patrón de comportamiento futuro basado en el análisis de su comportamiento pasado. Gracias a los numerosos estudios reali zados, se sabe que las técnicas de predicción estática logran tasas de predicción de saltos condicionales de entre un 70 % Y 80 %. Sin embargo, de bido al flujo de instrucciones tan elevado y a la complejidad de las segmentaciones superescalares, la utilización de técnicas que minimicen todo lo posible los riesgos que implican las llstruccioIies de salto es fundamental para extraer el máx imo rendimiento posible de estos procesadores. Las técnicas de predicción dinámica obtienen tasas de acierto que osc ilan entre el 80 % Y el 95 %, de allÍ la importancia que ti enen para aumentar el rendi miento de los procesadores superescalares . El inconveniente que presentan las técnicas de predicción dinámica es el incremento en el coste económico del procesador debido a que la complejidad del hardware aume nta, lo que implica un incre mento en el ¡amafio del área del chip y, por tanto, e n toda
la ingeniería asociada. Para realizar una especulación comple ta de una instrucción de salto, es necesario predecir los dos compone ntes que produce su procesamie nto: la dirección de destino y el resul tado (efecti vo, no efectivo). A continuación, se presentan algunas de las técnicas de predicción dinámi ca más utilizadas. Inicialmente, se describe una técnica de predicción de la dirección de destino que lleva implícita la predicción del resultado del salto. Tras esto, se generaliza la técnica de predicción de destino para poder utiliza rse con otras téc nicas de predi cc ión del resultado que se irán introduciendo: el predictor de Smith, el predictor de dos ni veles basado en el historial local, el predictor de dos ni veles basado en el historial g lobal y el predictor gshare. 2.5.4.1.
Predicción de la dirección de destino de salto mediante BTAC
Conocer c uanto antes si una instrucción es un salto efectivo y cuál es su dirección de destino más probable es fundamenta l para poder reducir la penalización por salto mediante la ejecución especulati va de instrucciones. Una técnica sencilla para predecir la dirección de destino es recu,,.ir a una BTAC (Branch Targef Aclclress Cache). Un BTAC es una pequeña memoria caché asociativa en la que se almacenan las direcciones de las instrucciones de saltos efecti vos ya ejecutados o BIAs (Brand, ¡lIstruetion Aclclress) y las direcciones de destino de esos saltos o BTAs (Brand! Targef Aclclress). La Figura 2.1 2 muestra un esquema de la estructura de la BTAC. El funcionamiento de la BTAC es sencillo. El acceso a la BTAC se realiza en paralelo con el acceso a la I-caché utilizando el valor del contador de programa. Si ninguna de las direcciones de las in strucciones que forman el grupo de lectura coincide con algu na de las BIAs que hay en la BTAC es debido a que no hay ninguna instrucción de salto efecti vo o se trata de un salto efectivo que nunca antes había sido ejecutado. La Figura 2.1 3 ilustra de forma esque mática el funcionamiento de la BTAC. Si la BTAC no dev uelve ninguna direcc ión de destino pe ro, posteriormente, en la etapa ID se verifica que en el grupo de lectura hay una instrucción de salto, ¿cómo se debe proceder? Si la BTAC no devuelve ningún valor lo habitual es apLicar, por defecto, la técnica de predecir como-na-efectivo ; se procede normalmente con la ej ecución de las instrucciones que siguen al salto y se deshace su procesamiento en
95
INGENIERíA DE COMPUTADORES 11
caso de que el salto sea finalmente efectivo. En este caso, las penalizaciones serían :
• O ciclos de detención si el salto finalmente no es efectivo. Al aplicarse la predicción como-noefectivo el procesamiento se realiza normalmente . • (Ciclos...ID + Ciclos_TI + Ciclos...EX_salto) de detención si el salto es efectivo, suponiendo que el salto se resuelve en la etapa EX, y el vaciado del cauce de las instrucciones que seguían al salto. En este caso hay que actualizar la BTAC con la di.rección de la instrucción de salto y el destino real del salto. No tiene sentido almacenar en la tabla los saltos no efectivos ya que aunque se almacenen, su resultado real siempre coincidida con la predicción por defecto, es decir, la ejecución de la siguiente instrucción. Observe que si como predicción por defecto se opta por la técnica predecir-coma-efectivo, no se obtiene ninguna mejora ya que siempre hay que esperar a la resolución real del salto para poder efectuarlo. Dirección del siguiente grupo de lectura
+1
I
PC
i
L I
MUX
~¡-
L:, L
Dirección de lectura
I-Caché
1 1
¡ Ha
-h~Wdo-c~i ~cid~~cia? : , =O
SI = 1
NO
________ ______ •
BIA
BTA
,,, ,, ,
,,, ,,,
Buffer de 1 instrucciones
I Actualización
Dirección de destino del salto predicho
Unidad funcional de salto
Figura 2.12: Esquema de
96
una
BTAC.
2.5. LECTURA DE INSTRUCCIONES
SI
NO
¿Está i en la BTAC?
Leer pe predicho
Etapa IF
SI ¿Es i un salto?
NO
Salto en falso:
- Vaciar cauce de instrucciones especuladas - Procesar desde ;+1 Etapa ID
Etapa 11
SI
¿Predicción tomada
NO
es correcta?
SI
¿ Predicción no tomada
NO
es correcta?
Vaciar cauce de instrucciones especuladas
Salto efectivo:
- Si sa lto efectivo pero predicción destino incorrecta:
- Incluir en trada en la BTAC - Vaciar cauce desde ;+1 - Saltar al resultado del sallo
- Actualizar entrada en la BTAC - Saltar al resultado del salto
- Si sa lto no efectivo: - Borrar entrada de la BTAC - Procesar instrucción i+ 1 Etapa EX
Figura 2.13: Diagrama con las posibles situaciones que se pueden prese ntar al real izar predi cción mediante la BTAC.
97
INGENIERíA DE COMPUTADORES 11
Si la dirección de la instrucción que se busca en la BTAC coincide con una de las BIAs lo más probable (aunque puede haber falsos positivos, como se verá) es que se trate de un salto efectivo que ha sido ejecutado con anterioridad (de lo contrario, no estarla en la tabla) y se procede a extraer el valor de BTA que tenga asociado, es decir, la dirección de desti no asociada a la última vez que fue ejecutada esa instrucción de salto. Una vez que se di spone de la pred icción de la dirección de destino, esta dirección pasará a utili zarse como nuevo contador de programa, se leerá de la [-caché y comenzará la ejecución especulativa de esa instrucción y de las siguientes . Mientras tanto, la instrucción de salto debe fi nalizar Su ejecución con el fin de validar que la especulación realizada es correcta. Se pueden dar dos situaciones al conocer el res ultado del salto: • La predicción realizada es incorrecta debido a que se trataba de un salto no efectivo o a que la dirección de destino especulada no coinci día con la real. En ambos casos hay que anular las instrucciones especuladas que ya estaban procesándose en el cauce. Hay que eliminar de la BTAC la instrucción de sa lto si se trataba de un salto no efectivo o actuali zarl a con la dirección de destino con ecta si el salto fue efectivo. Considerando que en la etapa EX ya se conoce el res ultado del salto, la penalización es ele (cic1oLID+c i clos~+c i c1os-EX_sa l to) ciclos . • Si la predicción fue correcta se conti núa con el procesamiento de instTUcciones. No es necesa¡i o modifica¡· la tabla. Un problema que puede surgir es el de los falsos positivos, es decir, la BTAC devuelve una direcc ión de desti no pero en el grupo de lectura no hay real mente ningún salto (se descubre en la etapa ID). Esto se conoce como salios jantasmas o salios en jc¡[so. El tratamiento conecto pa¡·a un salto fantasma es desestimar la predicción de la BTAC una vez que se confi rma que se trata de un falso positivo. El coste es incunir en una pequeña penalización (ciclos_ID) ya que hay que anu lar el procesamiento del salto fantasma. En conclusión, cuanto antes se detecte que se trata de una instrucción de salto, las penalizaciones serán menores en caso de error en la predicción. Los falsos positivos son debidos a que el campo BrA de la BTAC no almacena una dirección completa, si no una pa¡te de ell a. Esto puede provoca¡· que a direcciones distintas se les asocie la misma BrA dado que el subconjunto de bits que se uti liza para el BrA sea simila¡· en ese grupo de direcciones. El motivo de esta resolución parcial en la búsq ueda es reducir el tamaño de la BTAC a cambio de admitir las penalizac iones producidas por los falsos positivos. Si la tasa de falsos positivos es suficientemente baja, es admisible paga¡· ese coste dado que no ralentiza mucho el procesador. Pero si la tasa es alta, puede no ser admisible y la solución es que la longitud del campo BIA se incremente hasta alcanzar una tasa de saltos fantasma tolerab le. Si la longitud del BrA llega a iguala¡·se a la longitud de las direcciones, el problema de los fa lsos positivos deja de existir. Otra técnica para predecir la dirección de salto es utilizar una BTIB (Brand, Targel InslrUclio/l B!(ffer). Su estructura es muy similar a la de la BTAC pero se almacena la instrucción de destino (BTI - Brand, Ta/gellnslruclion) y algunas posteriores (BTI+ 1, BTI+2, etc.) en lugar de solo la dirección 98
2.5. LECTURA DE INSTRUCCIONES
de salto efectivo BTA (Figura 2. 14). Así, la BTlB entrega una secuencia de instrucciones al buffer de inso'ucciones, de forma análoga a como si se hubiesen extraído de la I-caché, y en el pe se coloca la dirección que cOlTesponde a la siguiente instrucción que hay después de la última BTI que forma el paquete.
Dirección del siguiente grupo de lectura
+1
I
~IJ
I
pe I
I MUX
I
Dirección de la
instrucción 8TI+3
1
_______ J____ ___ _ : ¿Ha habido coincidencia? : SI = 1 NO = O
,
L~~
Dirección de lectura
__
__ __
_
,
_____ •
BIA
BTI
BTI+1
BTI+2
Dirección
,, ,,,
,,, ,,
, ,, , , ,
,,,
, ,, , , ,
I-Cache
,
,
, , ,
-
Actualización con resultado de sallo
I
Unidad funcional de salto
I
Buffer de instrucciones
Figura 2. 14: Esquema de una BTTB en la que se e ntregan al buffer de instrucc iones paquetes de 3 instrucciones. Esto ob liga a modificar el
caso, el
pe
para que apunte a la i.ll strucc ión que sigue a la última que forma el paquete, en este
pe debe apuntar a la direcció n de la in slru cción BTl +3. 99
INGENIERíA DE COMPUTADORES 11
2.5.4.2.
Predicción de la dirección de destino de salto mediante BTB con historial de salto
La princ ipal diferencia de una BTB (Brand!. Targe f Buffer) con respecto a la técnica anterior de predicción es que junto con la direcc ión de destino predicha, BTA, se a lmacena un conjunto de bits que representan el historial de la efectividad del salto (BH - Bral/eh HisfOl y). De hecho, la predicción mediante BTAC se puede considerar un caso particular de la predicción mediante BTB considerando un hi st0l1al de sa lto de I bit, de fo rma que si la dirección de la instrucc ión está en la BTAC el salto se predice siempre como efectivo y si no lo está se predice como no efectivo. La Figura 2. 15 corresponde a un esquema en el que se aprecia el funcionamiento de una BTB. El funcionamiento es muy si milar al de la técnica anterior. Al mi smo tiempo que se extrae e l grupo Dirección del siguiente grupo de lectura
+1
I
PC
i MUX~
L
I
I MUX ~I
¡:¡Ha-h~~dO-C~i~C;d~;c;a; : I
SI = 1
NO = O
I
-- ---- -, ,-- ¿---Utilizar dirección destino predicha? , ,: deE=l NE = O
~-- - --- -- -----_.
I I
L
Dirección de lectura
BIA
BTA
BH
,,, ,,,
,, , ,,
,,, ,,,
t-Caché
I
I Buffer de
instrucciones
,
_ _ _ _ _ __ _ _ _ _ _
Predicción
lE oNE)
I 1 Historial del sallo
J I
Predictor
I
Actualización con el resultado del sallo
Unidad
Dirección de destino predicha
funcional de salto
Figura 2.15: Esquema de una BTB con historial de sa lto. 100
,
2.5. LECTURA DE INSTRUCCIONES
de lectura de la l-caché, se accede a la BTB en busca de alguna de las instrucciones del gmpo de lectura. Si hay un acierto (y no se trata de un salto fantasma) se anali zan los bits del historial del salto y se decide si la dirección de destino predicha ha de ser utilizada o no (en el siguiente apartado se explica el predictor de Smith como forma de decidir si utilizar o no la dirección predicha). Al igual que en e l caso anterior, la instrucción de salto se continúa procesando para validm' el resu ltado de la especu lación. Las cuatro situac iones que se pueden dar con sus respecti vas acciones son:
• Se predice como e fecti vo y no hay error en la predicción (tanto en el resu ltado como en la dirección desti no): No sucede nada, no hay penaLización de ninguna clase, se actualiza el historial del salto. • Se pred ice como efectivo pero hay algün error en la predicción (en el resultado, en la direcc ión, O en ambos): Se vacía el cauce de las instrucciones especuladas, se ac tualiza el historial de salto con el resultado, se actualiza la entrada de la BTB con la dirección de destino y se comienza a procesar la instrucción indicada por el resultado del salto. • Se predice como no efectivo y el salto no lo es: No sucede nada, no hay penalización de ninguna clase, solo hay que act ualizar el historial del salto. • Se predice como no efectivo pero el salto sí lo es: Se vacía el cauce con las instrucciones especuladas (en este caso, las sigu ientes al salto), se salta a la dirección de destino obtenida, se actualiza el historial del salto, y se actualiza la entrada de la BTB con la dirección de destino del sa lto. Si ninguna de las instrucciones del grupo de lectura proporciona una coincidencia en la BTB, se predice como no efecti vo. Y pueden plantearse dos si tuaciones: • El salto no es efectivo : No sucede nada en el cauce. • El sa lto es efecti vo: Se limpian del callce las instrucciones siguientes al salto (las especuladas) y se salta a la dirección de destino obtenida, se incluye una entrada en la BTB con los siguie ntes datos: dirección de la instrucción de salto, dirección de destino e hi storial del salto. En caso de que la instrucción no sea un salto, no sucede nada. El aplicar predecir como no efectivo implica la ejecución de la sigu iente instrucción al salto por defecto, es decir, una situación análoga a como si no se tratase de una instrucción de salto.
Otro aspecto que hay que resolver en las dos técnicas anteriores es la eliminación de entradas en la tabla debido a fa llos de capacidad o de conflicto. Como se trata de una especie de memori a caché, la solución depende de la organi zac ión de la tabla: • Correspondencia directa. Se sustituye la entrada. • Asociati vidad. Se opta por descartar la entrada que tenga menos potencial pm'a mejorar el rendimiento. Dos opciones posibles son la apli cación de un algoritmo LRU (Leasl Recenlly Used), mediante el que se elimina la entrada que ll eva sin utili zarse más ticmpo, o eliminm la e ntrada con mayor posibilidad de ser no efecti va según su hi storial de salto. 101
,
"
/ •• 1:: I . 'C I
(-
\ IBLlOTI
\
<\'
INGENIERíA DE COMPUTADORES 11
2.5.4.3.
Predictor de Smith o predictor bimodal
Como se ha detallado en el algoritmo anterior, cada entrada de la BTB contiene un campo, el BH, donde se almacena un pequeño conj unto de bits que refl eja el hi storial de la instrucción de salto. El historial de sa lto no es más que un registro con los resul tados del salto en las últimas veces que fue invocado. Por lo tanto, a mayor número de bits, mayor longitud del registro tem poral, aunque esto se ha demostrado que no siempre conduce a mejores predicciones. El p redicfor de Smifh, o predictor bimodal, es el algoritmo de predicción d inám ica del res ul tado de salto más sencillo. Se basa en asociar un contador de satu ración de k bits a cada salto de forma que el bit más significa tivo del contador indica la predicción par a el salto: si el bi t es O, el salto se predice como no efecti vo (en inglés se expresa como NOI Taken o NT) ; si el bit es 1, el salto se predice como efectivo (Taken o T). Los k bits que forman el contador de saturación constituyen el historial de salto y es la in fo rmación que se almacena en el campo BH de la BTB. Estos bits j unto con el resultado actual del salto se utilizan para realizar la pred icción de lo que sucederá la vez siguiente que ese salto sea ejecutado. Un contador de saturación es un contador clásico con la diferencia de que cuando está en su valor máx imo y se incrementa no vuelve a O, sino que se queda igual; a su vez cuando alcanza el valor de O y se decrementa, el valor continúa siendo O. Cada vez que un salto es invocado, se extrae el historial del salto (el valor del contador) de la BTB, se mi ra la predicc ión (el bit más signifi cati vo) y se aplica. Tras esto se procede a actualizar el contador con el resul tado real del salto para dejar preparada la p róxima predicción: • Si el sal to fue efectivo, el contador se incrementa. • Si el salto no fue efectivo, el contador se decrementa. Esto significa que para valores altos del contador, el sa lto se predecirá como efecti vo, mientras que para valores bajos será pred icho como no efectivo. Aunque se puede utilizar un contador de I bit (Smith,), el más utilizado es el de 2 bits (Smitbú El contador de 2 bits presenta cuatro pos ibles estados que se suelen denominar: • SN (Sfrongly Nof Taken): 00 • WN (Weakly NOf Taken): 01
• WT (Weokly Token): 10 • ST (Sfrongly Taken) : 11 Los estados SN y WN predicen que el salto no será efectivo, mientras que WT y ST predicen que sí 10 será. La Figura 2. 16 muestra la representación en forma de autómata finito de un predictor Smi th, y de un pred ictor Smith2. Las transiciones representan el resul tado real del sa lto mientras que los estados del autómata representan el histori al del sal to. Se pueden utilizar contadores de 3 bits aunque los estud ios han demostrado que la mejora que se obtiene en la predicción es muy pequeña con respecto al em pleo de 2 bits. Sin embargo, la mejora que proporciona un Snúth2 es bastante superi or con respecto a un Smith, . 102
2.5. LECTURA DE INSTRUCCIONES
NE Predicción Smith ,: T (Taken): 1
NT (Nol Taken): O Resu ltad o del sa lto: E: Efectivo NE: No Ereclivo
E (a)
NE
NE
NE Predicción Smith ¡ : sr (Slrongly Taken): 11 WT (Weakly Taken): 10 WN (Weakly Nol Taken): 01 SN (Strongly No! Taken): 00
E
E
E
Resu ltado del salto: E: Efectivo NE: No Efectivo
(b)
Figura 2.16: Predictores de Smith de I bit (a) y 2 bits de historial (b).
2.5.4.4.
Predictor de dos niveles basado en el historial global
Debido a los elevados requisitos de los procesadores superescalares, los predictores de un nivel, como el bimodal, no proporcionan una tasa de acierto en las predicciones suficientemente alta. Por esta razón se han desan ollado predictores más complejos, como son los basados en dos niveles de hi stOli al. Estos predictores mantienen en un primer nivel de información un hi storial de los últimos saltos ejecutados (historial global) o de las úl timas ejecuciones de un salto concreto (historia/local). En un segundo nivel , la info nnación del primer nivel en combinación con la dirección de la instrucción de salto se utiliza para acceder a una tabla que almacena contadores de saturación que son los que determinan la predicción. El predictor de dos ni veles de hi stori al global se basa en un registro en el que se alm acena el resultado de los saltos más recientes. El historial de los últimos h sal tos, que no es más que una secuencia de bits, se almacena en un registro de desplazamiento de h bi ts denominado registro del histori al de saltos (BHR - Brancl! HistOly Registel). Cada vez que un salto se ejecuta se introd uce su res ultado por el extremo derecho del registro, se desplaza el contenido una posición y se expulsa el resultado más antiguo por el extremo izquierdo. Si el salto fue efectivo se introduce un I y, en caso contrario, un O. Por ej emplo, si el BHR es de 8 bits y de los últimos 8 saltos los cuatro más antiguos fueron efectivos y los otros cuatro no, el contenido del registro sería BHR= IIIIOOOO; en el supuesto de que el próx imo salto fuese efecti vo el contenido del BHR pasaría a ser 1110000 1. Para poder conocer la predicción para un salto, los h bi ts del BHR se concatenan con un subconj unto 103
INGENIERíA DE COMPUTADORES 11
de m bits obtenido mediante la aplicación de una función has/¡ a la dirección de la instrucción de salto. Un ejemplo básico de hashing para reducir la dirección de la insu'ucción a In bits puede ser el quedarse con los m. bits menos significati vos de la dirección. Esta combinación de h + In bits se utiliza para acceder a una tabla de historial de patrones (PHT Paftel'11 HisfOly Table). Esta tabla almacena en cada una de sus 2"+111 entradas un contador de saturación de 2 bits. Al igual que en el predictor de Smith, el bit más significativo del contador representa la predicción del salto: 1 indica efectuar el salto y O lo contrario. La Figura 2.17 representa un esquema de un predictor de dos niveles basado en hi storial global con h = 5 Y l1l = 3 siendo la longitud de la dirección de la ' insU'ucción de 30 bits. El número total de entradas de la PHT es 2 5+3 = 28 = 256. Una vez que se ha evaluado el salto y se conoce su resultado hay que proceder a la actualización de los dos componentes del predictor: se incrementa/decrementa el contador de la PHT y se actuali za el historial del BHR, quedando así todo dispuesto para la próxima predicción. Es fundamental la aplicación de la función hash para reducir la longitud de la dirección de la instrucción a In bits. En las arquitecturas actuales, en las que se manejan contadores de programa de 30 y 62 bits resulta impensable el concatenar todos los bits de la dirección de la instrucción con el contenido del BHR ya que se obtendría una PHT muy grande. Por ejemplo, si la longitud del BHR fuese de 5 bits y la longitud de la dirección de 30 bits, la tabla tendría 2 35 entradas de 2 bits que equivalen a 8.1 92 Mbytes lo que resulta, hoy en día, inviable. PHT
o Dirección de la instrucción de salto
30 ( )
Hash
h+m=8
BHR
I---r--*
Predicción del sallo
h=5
Actualización con el resultado del salto
Unidad
funcional de salto
Figura 2.17: Esquema de un prediclOr de dos ni veles basado en el historial global. 104
2.5. LECTURA DE INSTRUCCIONES
2.5.4.5.
Predictor de dos niveles basado en el historial local
El predictor de dos ni veles basado en histori al local es muy similar al anterior. La úni ca diferencia es que, en lugar de un único registro con el hi storial de los últimos saltos, ahora se utiliza una tabla en la que se almacena el historial particular de cada sa lto. Es decir, se reemplaza el registro BHR por una tabla de historial de saltos (BHT - Branch Hisrol)' Table) compuesta por varios BHR. Para obtener la predicción de un salto, en primer lugar hay que recuperar el histori al del salto. El acceso a la BHT se reali za mediante un hashing de la dirección de la instrucción de salto que los reduce a k bits ya que el número de entradas de la BHT es 2k • Una vez que se di spone de los h bits del historial, estos se concatenan con los m bits obtenidos mediante otro hashing de la dirección de la instrucción de salto. Con esta secuencia de h + m bits se accede a la PHT para recuperar el estado del contador de saturación de 2 bits. Al igual que en el predictor de historial global, la fu nción hash puede ser mu y básica y consistir en quedarse con los l1Z o k bits menos significati vos de la direcc ión, aunque se puede recunir a funciones más complejas. La Figura 2. 18 presenta un esquema genérico de un predictor de dos niveles
PHT o m
Dirección de la d instrucción de sallo --'7'--r--"¡ Hash 1
h+m
1---7''--
Predicción del sallo
BHT
o k,
h
;
2'-1
Unidad funcional Actualización con el resultado del salto
de sa lto
Figura 2.18: Esquema de un predi clor de dos ni veles basado en el historial local. 105
INGENIERíA DE COMPUTADORES 11
basado en el historial local en donde una función hash reduce los el bits de longitud de la direcc ión de la instrucción a k bits para acceder a la BHT y otra función hash los red uce a 111 bits. Una vez que el salto se ha evaluado y se conoce su resul tado es necesario proceder a actualizar los dos componentes del predictor: la BHT y la PHT. Para ello, primero se accede a la PHT para actualizar el contador de saturación con el resultado (se suma I si fue efecti vo, O en caso contrario). Tras ello, se accede al h.istorial de la BHT paTa introducir el resultado del salto (1 si fu e efecti vo, O si no lo ha sido), desplazando su contenido. De esta forma, los dos niveles del predictor quedan actuali zados para realizar la predicción del siguiente salto.
2.5.4.6.
Predictor de dos niveles de índice compartido gslzare
Una variante del predictor de dos ni veles de ltistorial global es el predictor gsha re. En este predictor, en lugar de concatenar los 111 bits obtenidos de la función hash con los h recuperados del hi storial global, se realiza una XOR entre los h bits superiores de los 111. Los h bits obtenidos de la XOR se concatenan con los /11. - h bits restantes para poder acceder a la PHT. La Figura 2. 19 muestra un esquema genéri co de un predictor gshare.
PHT
o Dirección de la instrucción de sallo
d(
--';;;"-- 1
Hash
m
m·h
'------' h
m
1--+_ Predicción del sallo
XOR )-óh;L-....J
h 2 "'-1
Actualización con el resullado del salto
Unidad funcional de salto
Figura 2.19: Esque ma de un predi ctor gshllre.
106
2.5. LECTURA DE INSTRUCCIONES
2.5.4.7.
Predictores híbridos
Los procesadores superescalares actuales no realizan las predicciones utilizando un único método de predicción sino que recurren a dos predictores que generan un resultado y un selector se ocupa de decidir cuál de las dos pred icciones hay que utilizar. Este mecanismo de predi cción se denomin a predicción híbrida. El PowerPC 970 emplea un predictor híbrido compuesto por un predictor bimodal, un predictor gshare y un selector. El predictor birnodal cuenta con una PHT de 16K entradas de I bit que se indexa con la dirección de la instrucción de salto. El predictor gshare utili za un BHR de II bits de hi storial y una PHT de 16K entradas de I bit. Por último, el selector es una PHT de l 6K entradas de 1 bit que se indexa con la dirección de la instrucción de salto y determina cuál de las dos predicciones hay que utilizar; en función del éx ito de la predicc ión se realiza la actualización de la cOll'espondiente entrada de la tabla del selector.
2.5.5.
Pila de dirección de retorno
Validar una predicción de una instrucción de salto implica no solo comprobar que el resultado del salto coincide con la predicción sino que también es necesario saber si la dirección de destino predicha coincide con la dirección de destino real. La mayor parte de las veces, la predicc ión del destino coincide con el resu ltado real del salto ya que los saltos, normalmente, siempre tienen la misma dirección de destino. Sin embargo, los repertorios de instrucciones suelen disponer de una instrucción especial de salto que no puede predecirse adecuadamente ya que cada vez que se la invoca puede saltar a una dirección completamente diferente. Para esta instrucción la BTB generaría predicciones de la dirección de destino con una elevada tasa de fa llos. Esta instrucción es el reTOrno de subrulina. Tal y como muestra la Figura 2.20, las invocaciones a una subrutina se pueden reali zar desde diferentes lugares de un programa. Por ello, la instrucción de salto que hayal final de la subrutina para devolver el control, no tiene una dirección de destino fija , sino que varía según desde donde se realice la invocación. Esto provoca que esa instrucción de salto nunca obtenga predicciones correctas de la BTB ya que corresponderán a la diJ'ecc ió n de retorno de la invocación previa (debido a la actuali zación de la BTB al detectarse un fal1o). Para manejar estas situaciones, la mayor parte de los procesadores actuales disponen de una pi la de direcciones de retorno (RAS - Relllrn Address Stack) O bufler de pil a de retornos (RSB - Retllm Stack Buffer). Cuando se invoca a una subrutina mediante una instrucción de salto se efectúan tres acciones: • Se accede a la BTB para obtener la predicción de la dirección de destino. • Se especul a el resul tado del salto. • Se almacena en la RAS la dirección de la instrucción siguiente al salto. U na vez procesadas las instrucciones que componen la subrutina, se invoca una instrucc ión de retorno de subrutina. Como con cualquier otra instrucción se accede a la BTB para obtener la predicción de la dirección de destino pero, en el momento en que se detecta que la instrucción es un retorno, se accede 107
INGENIERíA DE COMPUTADORES 11
tamb ién a la RAS para obtener la direcc ión correcta de retorno y se desestima la predicción de la BTB. Las instrucciones que se hayan procesado como consecue ncia de la especu lación incorrecta dada por La BTB serán anuladas . E l principal probLema que presenta La RAS es su desbordamiento cuando se manejan subru tinas con muchos an idamientos y La pila no ha sido dimensionada adecuadamen te. Como ejemplo, e l procesador PowerPC 970 dispone de una RAS de 8 entradas denomi nada link stack O call-retufI1 stack. D ura nte la extracción de La I-caché, e l procesador evalúa si se trata de una instrucción de retorno med iante eLanálisis deLva lor de un campo de 2 bits de la instrucción (campo HB - Hinl Bils); si se trata de un retorno se extrae La direcc ión del link stack sin necesidad de acceder al BTB. Es el compilador, cuando genera el código objeto, quien determina mecuante el campo HB si se trata de un retorno de subruti na o no. Un ejempLo de procesador CIS C que reClUTe a una RAS para optimizar los retornos de subrutina es eLAMD Opteron que incorpora una RAS de 12 entradas
Programa principal
B
Código de la subrutina
Retorno a B
e c;-____~ __~----------~ Retorno a
Fin del programa principal
Figura 2.20: El sa lto que produce la Uamada a la subrutina siempre se diri ge a la mi sma dirección de memoria. Por el contrario, el salto que realiza el retorno de la subrutina puede dirigirse a di stintas direcciones de memoria dependiendo de la instrucción que la invocó.
108
2.5. LECTURA DE INSTRUCCIONES
2.5.6. Tratamiento de los errores en la predicción de los saltos Uno de los problemas que plantea la ejecución especulati va de instrucciones es que puede ser incorrecta, es decir, que el res ultado de la predicción del salto no coincida con el resultado verdadero del sallo. Cuanto esto sucede es necesario deshacer el procesam iento de todas las instrucc iones incorrectamente ejecutadas debido al eITar de predicción y continuar con el procesamiento correcto. Esto se conoce como recuperación de la secuencia correcta. El ejemplo 'de la F igura 2.2 1 muestra la pred icción incorrecta de un salto condicional en sus dos varian tes. Una vez que se conoce el resultado rea l del salto, los bloques de instrucciones incorrectamente especulados deben ser expul sados de la segmentación para proceder a la ejecución correcta de la secuencia de código. En el ejemplo de la Figura 2.2 1, aunque las instrucciones i + 4 e i + 5 se ejecutan siempre, con independencia del resultado del salto, es necesaria su anul ació n ya que puede suceder que se ejecuten antes de tiempo (pred icc ión efecti va inco rrecta) o después (predicción no efecti va incorrecta). Instrucción
j
inicio: Salto condiciona l a fin Instrucción i+2
Instrucción i+3 fin : Instrucción i+4 Instrucción i+5 Predicción efectiva incorrecta
Predicción no efectiva incorrecta
Instrucción i
Instrucción i
Salto condicional a fin : Instrucción i+4 :L _Instrucción i+5 ___________
Salto condicional a fin
, I
------------Bloque
: especulado I
1
Lo correcto
Instrucción i
I
Instrucción i+2
Instrucción i+3 Instrucción i+4
Bloque : especulado
Instrucción i+5
, '. ------------_
1
Lo cm,ecto
Sallo condicional a fin Instrucción i+2
Instrucción i
Instrucción i+3
Sallo condicional a fin
In strucción i+4
Instrucción i+4
In strucción i+5
In strucción i+5
Figura 2.21: Un error de predicción conlleva la ejecución inco rrecta de instrucc iones que es necesario desbacer una vez conocido el resultado de l salto.
109
INGENIERíA DE COMPUTADORES 11
Sin embargo, el problema planteado es más complicado debido a que en la secuencia de instrucciones ejecutadas como resultado de la predicción puede suceder que aparezca otra instrucción de salto y se vuelva a producir la ejecución especulativa de una nueva secuencia de instrucciones. La forma habitual para conocer y validar o anular las secuencias de instrucciones que se están ejecutando de form a especulativa es recurrir a etiquetar las instrucciones durante todo el tiempo que pennanecen en la segmentación, de forma que se puede conocer su estado en c ualquier etapa del cauce. Desde que entran en la fase de di stribución hasta que son terminadas, todas las instrucciones llevan asociadas etiquetas con información de su estado. Dos de estas etiquetas son la especul ativa y la de validez. Las etiquetas son campos de uno o más bits que hay en el buffer de reordenami ento, donde todas las instrucciones tiene n una entrada en la que se actualiza su estado desde que son di stribuidas y hasta que son terminadas arquitectónicamente (se dice que están en vuelo). Si la etiqueta especulativa es de un bit, un valor de 1 identifica a la in strucción como instruccióll especulada. Si el procesador permite que haya varias rutas especulativas ejecutándose en paralelo, lo que se denomina nivel de especulación, la etiqueta di spondrá de más bits para identi fícar cada uno de los bloques de instrucciones especul adas. Antes de continuar, es necesario especificar que la dirección de toda instrucción de salto sobre la que se realiza una especulación se almacena en una tabla j unto con la etiqueta especulativa que se asociará a todas las instrucciones que formen la ruta especulada directa y sus ramificaciones. Posteriormente, esta etiqueta permitirá identificar y validar las instrucciones especuladas si la predicción es correcta o realizar la recuperación de la secuencia correcta en caso de un error de predicción. La etiqueta que se genera para cada nueva ruta especul ada a raíz de un salto tiene que recoger inform ación sobre si provi ene a su vez de otra ruta especulada. Una forma de generar las etiquetas es que cada nueva ruta especulada forme su etiq ueta tomando la etiq ueta de la ruta de que proviene y asignando a I el primer bit más signifi cativo que esté a O. Por ejemplo, si la actual ruta especulada A tiene asignada la etiqueta 100 Y se deriva una nueva ruta B a consecuencia de un salto condicional e n la ruta A, la etiqueta para las instrucciones especuladas en la ruta B pasará a ser 110. La validación de una ruta implica la asignación a O de su bit en las etiquetas especul ativas de sus instrucciones y ramificaciones. En el ejemplo anterior, si la ruta A fuese finalm ente correcta, el bit que tenía as ignado (en este caso, el más signi ficativo) se colocaría a O en todas las instrucciones de la ruta A y en sus ramificaciones, en este caso, la B. Las instrucciones de la ruta B pasarían a te ner como etiqueta especulativa 010 hasta su validación final o expulsión del cauce. La etiqueta validez permite saber si la instrucción debe o no terminarse arquitectónicamente, es decir, si puede escribir sus resultados en un registro arq uitectóni co o en la memoria. Inicialmente, todas las instrucciones son válidas . Aunque una instrucción sea válida, no podrá terminarse arquitectónicamente hasta que la etiqueta que la defin e como especul ativa cambie a no especulativa (todos los bits a O). Mientras esto no suceda, la instrucción especulada y todas las que la suceden, perm anecerán retenidas en el buffer de reordenamiento. Tal y como se ha indicado al explicar los predictores, aunque se inicie el procesamiento de una ruta especul ativa, hay que concluir el procesamiento del salto para conocer su resultado y validar o no la predicción. En el momento en que el salto se evalúa, si la predicción coincide con el resul tado, las etiquetas especul ativas se cambi an de f0l11la que las instrucciones especuladas asociadas a ese salto son 110
2.5. LECTURA DE INSTRUCCIONES
1·00
o r
especulación
1·00
instrucción de salto
Salto
Máscara espec ulati va as ignada
i,
10 - 0 0
bit de validez
11-01
x~xx
L
bits de especulación
1·10
1·10
1·11
1·00 (a) validación
1·00
i,
----------
validación ------ - - -,
1·00
,,
,
especulación
1·01 .. ..
1·00
recuperación
'---------- , (b)
invalidación
0·01
i,
Anular instrucciones en buffer de decodificación, distribución y estaciones de reserva
(e)
Figura 2.22: Secuencia de especulació n, validac ión, inval idac ión y rec uperación de dos rutas especul adas.
111
INGENIERíA DE COMPUTADORES 11
con'ectas y se pueden terminar arquitectón icamente. Si la predicción es incorrecta, hay que realizar dos acciones: • In.validar las instrucciones especuladas. El bit de vaüdez de todas esas instrucciones pasa a indicar invabdez y no son terminadas arquitectónicamente, es decir, no acceden al banco de registros o a la memoria para escribi!" sus resultados. Sus resultados, almacenados temporalmente, se pierden. Por otro lado, todas las instrucciones asociadas a esa ruta especu lada que estén en los buffers de decodificación y distribución y en las estaciones de reserva se eliminan . • Recuperar la ruta correcta. Esto impli ca iniciar la lectura de las instrucciones desde la dirección de salto correcta. Si la predicción incorrecta fue no realizar el sa lto, se utili za el resultado del salto como nuevo valor del PC. Si la predicción incorrecta fue realizar el salto, se accede a la tabla en la que se almacenó la dirección de la instrucción de salto y se utiliza para obtener el nuevo valor del PC , es decir, el de la siguiente instrucción (denominada rutafall-through). La Figura 2.22.a representa una secuencia de instrucciones en la que hay dos rutas especu ladas derivadas de dos sa ltos, el i2 y el i4. Inicialmente, todas las instrucciones son válidas por lo que el bit de validez se establece, por defecto, a 1. Al iniciar el procesamiento de una ruta especulada como consecuencia de la predicción para el salto i2 , en las instrucciones especuladas se asigna el bit más significativo de la etiqueta de especulación a 1 por lo que la etiqueta pm'a la ruta es la 161. Al llegar al salto i4, el siguiente bit menos significativo de la etiqueta de especulación se asigna a 1 pm'a indicar que se inicia otra ruta especulada derivada de este nuevo salto: la etiqueta pasa a ser 11. Una vez que el salto i2 se eva lúa y el resultado coincide con la predicción, la ruta se valida por lo que el bit más significativo de la etiqueta de especu lación pasa a ser 61 en todas las instrucciones de la ruta iniciada por i2 (Figura 2.22.b). La evaluación del salto i4 no coincide con la ruta especulada lo que obliga a invalidar las instrucciones posteriores en vuelo y las que estén en el buffer de reordenamiento, por ejemplo, la i 5. Al mismo tiempo, es necesario iniciar la recuperación de la ruta correcta derivada del salto i4 (Figu ra 2.22 .c). Un ejemplo real de un procesador superescalar con un elevado nivel de especulación es el PowerPC 970. Dispone de una estación de reserva indi vidual dotada de 16 entradas que alimenta exclusivamente a la un idad funciona l de gestión de saltos (BRU) . Esto posibilita que el procesador alcance un nivel de especulación de 16.
2.6.
Decodificación
Tras la extracción simultánea de vm;as instrucciones en la etapa de fetch para poder alimentar de forma sostenida el cauce, el paso siguiente es la decodificación . Como se podrá comprobar, esta etapa es una de las más críticas en un procesador superescalm·. En un procesador escalar segmentado del tipo RISC, en la etapa de decodificación se manipula una ún ica in strucción. En base a la decodificación del código de operación de la instrucción se realiza la extracción de los operandos del banco de registros y se establece el compOltamiento de la unidad 112
2.6. DECODIFICACiÓN
de control para con esa instrucción a lo largo de toda la segmentación. También en esta etapa de decodificación se analizan las dependencias de datos con las instmcciones que ya están ejecutándose en el cauce y, en caso de varias unidades funcionales, se determina la unidad de destino. Sin embargo, en un procesador RISC superescalar una etapa clásica de decodificación como la de un procesador escalar tendría que decodificar varias instrucciones en paralelo, e identificar las dependencias de datos con todas las instrucciones que componen el grupo de lectura y con las que están ejecutándose en las unidades funcionales. Otra tarea que complicaría esta etapa es que ahora serían varias las instrucciones que necesitarían leer todos sus operandos o una parte de ellos (si hubiese dependencia de otra instrucción, solo se leerían los que estuviesen ya disponibles). Además, durante la decodificación se debe confirmar si hay saltos en falso en el grupo de lectura con el fin de poder anular la ruta especulada y minimizar el impacto que tiene su procesamiento erróneo. Por todas estas razones, los procesadores superescalares reparten las tareas que realiza una etapa de decodificación clásica en dos etapas denominadas decodijicación y distribución . Por lo general, la etapa de decodificación detecta los saltos en falso y realiza la adaptación del formato de las instrucciones a la estIUctura interna de control y datos del procesador, mientras que la etapa de distribución se ocupa, entre otras cosas, del renombramiento de los registros, de la lectura de los operandos y del análisis de las dependencias verdaderas . Dependiendo del diseño del procesador, algunas tareas de la etapa de distribución se desplazan a la de decodificación. Una complicación adicional que surge en los procesadores superescalares CISC es que las instrucciones pueden tener longitudes diferentes. En los procesadores RISC, la longitud de la instrucción es fija, y no hay ningún problema en saber dónde empieza y tenruna una instrucción. La extracción del buffer de instrucciones se puede realizar a toda velocidad, ya sean una o varias las instrucciones a decodificar. En un procesador CISC es necesario analizar el código de operación de cada instrucción para conocer su formato y longitud y poder determi.nar dónde termina y dónde comienza la siguiente instrucción y cuáles son los operandos. En el peor de los casos, una instrucción puede comenzar en cualquier byte del grupo de lectura, lo que obliga a introducir hardware adicional para atender cualquier posible situación. Por lo tanto, los factores que determinan la complejidad de la etapa de decodificación son el tipo arquitectónico del procesador (RISC o CISC) y el número de instrucc iones a decodificar en paralelo (ancho de la segmentación). Dada la complejidad de esta etapa las soluciones que se suelen adoptar son tres: • Descomponer la etapa de decodificación en varias subetapas o fases , aumentando el número de ciclos de reloj que se emplean . • Real izar una parte de la decodificación antes incluso que la extracción de las instrucciones de la I-caché. Esto se conoce como elapa de predecodificación o decodijicacion previa. • Traducción de instrucciones. Consiste en descomponer una instrucción en ülstrucciones más básicas, o unir varias instrucciones en una única instrucción interna. El número de etapas fís icas
de que se compone la etapa lógica de decodificación de los procesadores superescalares actuales 113
INGENIERíA DE COMPUTADORES 11
osci la entre dos y tres. Por ejemplo, el PowerPC 970 recurre a tres etapas que se denominan DI , D2 Y D3.
Tras completar la decodificación , las instrucciones ya pasan al buffer de di stribución y a las estaciones de reserva para iniciar su verdadero procesamiento. Desde estos buffers se comenzará el reparto de las instrucciones entre las di stin tas unidades funcionales de que conste el procesador.
2.6.1.
Predecodificación
La etapa de predecodificación o decodificación previa se sitúa, habituaLmente, antes de la ¡-caché, de forma que las instrucciones que recibe la l-caché desde el nivel de memoria superi or (la caché de nivel 2 o la memoria princ ipal) como consecuencia de un fallo de lectura tienen que pasar forzosamente por esta etapa. La etapa de predecodificación está constitu.ida por hardware situado antes de la I-caché que realiza una decodificación parcial de las instrucciones. Este proceso de decodificación parcial analiza cada instrucción y la concatena un pequeño conjunto de bits con in formación sobre ella. En los procesadores RISC, el número de bits que se añaden por instrucción osci la entre 4 (UltraSparc) y 7 (PowerPC 920), mientras que en las arquitecturas CISC esta cifra es mayal". Por ejemplo, en el microprocesador CISC
I
I
Caché L2
,- -
,'- 4- b-ytes x 32 ¡nstr. =128 bytes : _______________ 1
128 by tes/
I
Instr.1
In str. 2
Inslr.3
Instr. 32
4 bytes
4 bytes
4 bytes
4 bytes
[
Etapa de
decodificación previa I
~
-
-
-
- - - - - - - - - - - - - - -- - -- ,
s + 5 bits) x 32 ¡nstr. = 148 bytes : ,1- (4- -byte -148 bytes /
Instr. 1
In s Ir. 2
,
,
I 4 bytes
5 bits
I
4 bytes
5 bits
lnstr.32 4 bytes
I
5 bits
J
I
I-Caché
I
I Buffer de prefetch I - - - - - - - - --- - --, I ,-, (4- --byt-es-+- -5 -b its) x 8 ¡nstr. = 37 bytes :
,- - - --
37 bytes /
In str. 1
I 4 bytes ,
5 bits
Ins Ir. 2 1 4 bytes
t
5 bits
Figura 2.23: Decodifi cación previa en el Powe rPC 970. 114
In str.8 4 bytes
I
5 bits
2.6. DECODIFICACiÓN
AMD 64 se añaden 3 bits por cada byte de la I-caché más otros 4 bits por cada 16 bytes. Para simplificar las operaciones que se reali zan en la etapa de extracción y en la decodifi cación, el powerPC 970 cuenta con una etapa de predecodificación situada delante de la I-caché y del buffer de prefetch (Figura 2.23) . Esta etapa se ocupa de añadir 5 bits de predecodificación a cada instrucción, de fo rma que las instrucciones almacenadas en la ¡-caché y en el buffer de prefetch pasan a tener una longitud de 37 bits. Estos bits de predecodificación se utilizan posteliormente en la etapa de fetch para determinar el tipo de instrucciones de salto (condicional o incondi cional) que hay en el grupo de lectura y proceder o no a su especulación, ye n la etapa de decodificación para determinar la forma en que se agrupan para su posterior di stribución. Además, los bits de predecodificación identifican las instrucc iones
que son susceptibles de provocar una excepción. El procesador AMD Opteron utili za un esq uema de predecodificación similar al del PowerPC 970 con la diferencia de q ue ajiade 3 bits de predecodifi cación por cada byte de instrucción y 4 bits adicio nales por cada 16 bytes (Figura 2.24). Dado que sns instrucciones son ele longitud variabl e, la mi sión de los dos primeros bits del grupo de tres es establecer el comienzo (bit START) y el nnal (bit END) de las instrucciones. Cuando se detecta el final de la instrucción , el tercer bit (bit FUNCTlON) se utili za para indkar si se trata de una instrucción sencilla que puede procesarse directamente por las unidades
64 bytes
Etapa de
decodificación previa
,
+
,
I (1 byte 3 bits) x 64 = 88 bytes I L __________________ 1
88 bytes
1 byte
I
3 bits
1 byte
I
3 bits
1 byte
I
3 bits
1 byte
1
3 bits
xxx L.
j iL.:::::. FUNCTION END START
,
1(1 byte + 3 bits) x 16 = 22 bytes
,
1 L __________________ 1
1 byte
1
3 bits
1 byte
I
3 bits
22 bytes /
xxx J I
L
L:.
FUNcnON END START
Figura 2.24: Decodificación prev ia en e l AM O Opte ron. Por simplifi car, no se re fl ejan los 4 bits qu e se añaden cada 16 bytes.
115
INGENIERíA DE COMPUTADORES 11
funcionales o se trata de una instlUcción compleja que ti ene que descomponerse en varias operaciones senci llas, conocidas como microoperaciones o micro-ops. Pero no todo en la decodificación previa son ventajas. De un rápido estudio de las Figuras 2.23 y 2.24 es fácil percatarse de dos inconvenientes: • La necesidad de un mayor ancho de banda. En el PowerPC , de un ancho de banda de 32 bytes/ciclo sin predecodificación se pasa a necesitar 37 bytes/ciclo, además del coste del hardware adicional que hay que añadir. Sin embargo, la tendencia es inc luir esta etapa debido a que las segmentaciones cada vez son más anc has y complicadas. • El incremento del tamaño de la I-caché. En el caso del PowerPC 970, el almacenamiento de 5 bits por cada 4 bytes de instrucción se traduce en un aumento del tamaño del 15 %, aprollimadamente. En el AMD Opteron, los 64 Kbytes de la ¡-caché se tienen que incrementar con 20 Kbytes adicionales, un 30 % adicional. Otra forma de realizar la predecodificación de instrucciones es situar esta fase entre el bufler intel110 de fetch, que recibe las instrucciones directamente de la I-caché, y e l buffer de instrucciones, que alimenta a la etapa de decodificación. Debido a su situación previa al bufler de instrucciones, esta forma de predecodificación se suele considerar parte de la etapa de fetch y no de la etapa de decodificación como tal. La técnica es propia de arquitecturas CISC donde la finalidad de estos bits de predecodificación es: • Determinar la longitud de las instrucciones. De esta forma , la etapa de decodificación se simpli fica ya que se conoce el comienzo y el final de cada instrucción que forme el grupo de lectura. • Decodificar ciertos prefijos asociados a las instrucciones. • Señalar determinadas propiedades de las instrucc iones a los decodificadores, por ejemplo, el tratarse de instrucciones de salto. Un ejemplo de este tipo de predecodificación lo proporciona la arquitectura Intel Coreo En esta arq uitectura, la I-caché entrega secuencias de 16 bytes que, de media, contienen algo menos de 4 instrucciones (depende del tipo de instrucción y del desa lineamiento dentro del bloque) del repertorio x86 de Intel. Estos 16 bytes se procesan en una etapa de predecodificación que añade bits para marcar el comienzo y final de las instrucciones y otras características. Esta etapa de predecodificación puede sumini strar hasta 6 instrucciones por ciclo al buffer de instrucciones para su posterior decodificación (Figura 2.25). Lo verdaderamente notorio de la predecodificación es que adelanta parte del trabajo que reali za la etapa de decodificación de forma que se reduce la profund idad de su segmentación. Esto es muy importante, ya que una segmentación menos profunda permite que la recuperación de un fa llo en la especu lación de un salto no sea tan costosa en ciclos de reloj. 116
2.6. DECODIFICACiÓN
2.6.2. Traducción de instrucciones Otra tarea que se realiza en la fa se de decodificación es la traducción de una instrucc ión compleja, por ejemplo, de tipo CISC, en un conjunto de instrucciones más básicas de tipo RISC. Estas operaciones básicas se conocen en terminología Intel como lIliclVoperaciones (miclV-ops) , como operaciones i/llernas (IOPs - Internal OPerations) en el ámbito de PowerPC o como ROPs (RIPS Operations) en terminología AMD. Esta técni ca es propia de arquitecturas CISC, aunque también se utiliza en los procesadores RISC para reducir la complejidad de determinadas instrucciones . La aplicación de esta
I
I-Caché
J
, 16 bytes
Buffer de fetch y predecodificación 32 bytes 6 instrucciones x86
/
Cola de instrucciones x86 18 entradas / 1 instr. x86
Generador de microcódigo
1 instr. x86
/
1 instr. x86
/
1 inslr. x86
/
1 inslr. x86
Decodificador generalizado
Decodificador
Decodificador
Decodificador
restringido
restringido
restringido
DO
D1
D2
D3
,[ 11-lops
{
{
~4~ops
{1
¡Jops
11l0 ps
>4ll ops
,
Buffer de J-I0ps
4 ¡Jops
Register Ali as Table 41lops
ReOrder Buffer 96 entradas
f
4
"ops
Figura 2.25: Decodificación en la arq uitec tura lntel eore Microarchitecture.
117
INGENIERíA DE COMPUTADORES 11
técnica en los procesadores CISC viene a signi fi car que e l interior del procesador es, realmente, un núcleo de procesamiento RISC aunque el repertorio de instrucciones ISA que maneje el programador sea CISC. La idea que subyace es simpl ifi car el repertori o original de instrucciones para que su procesamiento hard ware se pueda rea lizar directamente en el procesador. Nótese que la ap licación de esta técnica impli ca que, a partir de la etapa de decodifi cac ión, todas las instrucciones que se ejecutan en el cauce son ya instrucciones básicas tipo RISC (IOPs, micro-ops, ROPS), no las instrucciones originales que se extrajeron de la I-caché. Un ejemplo de arquitectura CISC que emplea la trad ucción de instrucciones es la Intel Core Microarchitecture (ver Fi gura 2.25). La etapa de decodificación consta de cuatro decodificadores (u no general izado y lento y tres restringidos pero rápidos) y un generador de microcódigo (Microcode Engine) que permi ten decodificar cuatro instrucc iones de longitud variable en parale lo. El plimero de los cuatro decodificadores, el DO, puede manipular cualquier instrucción, generando entre una y cuatro micro-ops por ciclo de reloj a partir de una instrucc ión; si se trata de una instrucción muy compleja que requiere de cinco o más micro-ops, entonces el DO la envía al gene rador de microcódigo que produce secuencias de más de cuatro micro-ops a una velocidad de tres micro-ops por cicl o de reloj. Por su parte, los tres decodificado res restringidos están limitados a instrucciones sencill as (por ejemplo, operac iones registroregistro) que generan una única micro-op. La secuencia de micro-ops obtenida se envía, en grupos ordenados de siete, a un buffer de mi cro-ops desde donde pasan en grupos de cuatro al RAT (Regis/er Alias Table) para el renombrado de registros y, posteriormente, al bu ffer de reordenami ento (ROB ReOrder Buffer). Pero, además, la arquitectura lnte l Core se caracteriza por complementar la traducción de instrucciones con dos técnicas adicionales: la macro-fusión y la microJusión. La macro-fusión consiste en fusionar o unir ciertos tipos de instrucciones en la fase de predecodifi cacion (situada a continuación de la I-caché) y enviarlas a uno de los decodifi cadores para producir una única micro-ops, denominada macro-fused micro-op. Esta característica únicamente puede apli carse a ciertos tipos de instrucciones. Por ejemplo, una instrucción de comparación puede unirse con una instrucción de salto condicional si son adyacentes en e l flujo de instrucciones. Cualquiera de los cuatro decod ifi cadores puede produc ir una macro-fused micro-op pero solo se puede produc ir una por ciclo de reloj. Así, el número de instrucciones decodifi cadas por c icl o se incrementa de 4 a 5 por ciclo. La macro-fusión permite a la arquitectura Core reali zar más trabajo con menos recursos hardware puesto que son necesarias menos entradas en el buffer de reordenamiento y en las estaciones de reserva al convertirse dos instrucc iones en una única macro-fused micro-op. E l efecto es un incremento del ancho de banda de decodificación ya que el bu ffer de instrucciones puede vaciarse mucho más rápidamente si un decodificador retira dos instrucciones por ciclo en lugar de una. Fi nalmente, la macro-Fusión produce un incremento virtual de la anchura de la segmentación en lo que respecta al núcleo de ejecución dinámi ca (esto es, el número de unidades func ionales). Esto es debido a que una unidad func ional puede estar ejecutando una macro-fu sed micro-op que corresponde a dos instrucciones. Esto libera unidades func ionales para instrucc iones no-macro-fusionadas y permite que el cauce del procesador aparente ser mucho más ancho. 118
2.6. DECODIFICACiÓN
La micro-fusión es una técnica que consiste en decodificar una instrucción que genera dos microops y fundirlas en una única micro-op. Esta nueva micro-op solo ocupa una entrada en el buffer de reordenamiento (ROB ) pero al emitirse se desdobla en sus dos componentes originales, ejecutándose en paralelo en unidades funciona les diferentes, o en serie si se trata de la mi sma unidad funcional. Cuando ambas micro-ops se tenni nan, se vuel ven a considerar como una única mi cro-op en lo que respecta a su retirada de la segmentación. La aplicación más habitual de la micro-fusión es con las instrucciones de
I
I
I-Caché
8 instrucciones (32 bytes)
{
Buffer de fetch I overflow 16 instrucciones
t
8 instrucciones
Buffer de instrucciones 32 instrucciones 5 instrucciones
{
I In-tine decoding
I I
D1
f
D2
t
D3 {
I
I 5 instrucciones
I 5 Instrucciones
I
I I I I
J.I
código
~
código
p código 11 código
I I I I
Template-based decoding
5 10Ps
I O 1
O 1
2 3
2
2
2
3
3
3
4
4
4
4
O
O 1
1
O 1
{
1 grupo de distribución (5 IOPs)
2
I3 I4
J A las ocho estaciones individuales de reserva
Figura 2.26: Etapa de decodificación del PowerPC 970. 119
INGENIERíA DE COMPUTADORES 11
almacenamiento ya que implica su desdoblamiento en dos micro-ops: una para realizar el cálculo de la dirección de destino y otra para la escritura del dato. Ambas micro-ops son inherentemente paralelas ya que su procesamiento implica a dos unidades funcionales diferentes con dos puertos de emisión diferentes. Una vez que las dos micro-ops se completan, se vuelven a fundir en una única micro-op y, en el momento de su retirada, se realiza la escritura en memoria. Al igual que la macro-fusión, la micro-fusión produce un aumento de la capacidad de decodificación y de la eficiencia energética de la arquitectura Jntel Core al emitir más micro-ops recUlTiendo a menos hardware (menos entradas en el buffer de reordenamiento) . Otro ejemplo de procesador, esta vez RISC, que utiliza traducción de instrucciones es el PowerPC 970 (Figura 2.26). Cada ciclo de reloj extrae cinco instrucciones del buffer de instrucciones y se comienzan a procesar en la etapa de decodificac ión compuesta por las tres etapas 01 , 0 2 y 0 3 y conocida como in-tine decoding. Cuando una instrucción tiene que ser traducida en más de dos IOPs, el procesador recurre a una extensión de la etapa de decodificación compuesta por un cauce de cuatro subetapas y que realiza una decodificación basada en plantillas. Esta etapa se denomina /empla/e-based decoding. Esta extensión es capaz de generar hasta 4 IOPs por ciclo de reloj para emular el comportamiento de una instrucción nOlma] . En terminología PowerPC se denominan instrucciones IV/as (cracked ins/ruc/iOIl) a aqueUas que se decomponen en dos IOPs, e instrucciones microcodificadas (miclVcoded instructions) a las que es necesario descomponer en tres o más IOPs. El objetivo fina l de la etapa de decodificación del PowerPC 970 es producir grupos de distribución (dispatc/¡ glVups) formados por 5 IOPs, los cuales pueden formarse con IOPs obtenidas de instrucciones pertenecientes a grupos de lectura consecutivos. Los bits de predecodificación asociados a cada instrucción ayudan a determinar cómo componer estos grupos para maximizar el rendimiento del núcleo de ejecución fuera de orden.
2.7.
Distribución
La etapa de distribución es la que establece el punto de partida para la ejecución de instrucciones en paralelo y fuera de orden en una segmentación superescalar. A diferencia de lo que sucede en una segmentación escalar, donde todas las instrucciones se ejecutan una tras otra, en un procesador superescalar la etapa de distribución se ocupa de repartir las instrucciones según su tipo entre las distintas unidades funcionales para que se pueda proceder a su ejecución en paralelo. La distribución es el último componente del jront-end de un procesador superescalar tras las etapas de fetch y de decodificación. Es el punto de inflexión entre el procesamiento centralizado de las instrucciones y su procesamiento distribuido. Tras la decod ificación, las instrucciones se depositan temporalmente en dos bufl'ers conocidos como buffer de distribución o ven/allo de instrucciones y buffer de terminación o de reordenamiento. Por el momento, la ventana de instrucciones será la que recibirá más atención en los pálTafos siguientes ya que el buffer de terminación se estudiará posteriormente con mayor deta lle. Aunque el buffer de terminación se sitúa en el camino lógico de la segmentación justo después de la etapa de ejecución, es importante 120
2.7. DISTRIBUCiÓN
empezar a adquirir una visión global del funcionamiento de un procesador superescalar y saber que las instrucciones se almace nan en él al di stribuirse y en el mi smo orden que tienen en el programa. Cuando las instrucciones concluyan su procesamiento fuera de orden, será el buffer de terminación el que permitirá vol ver a reestablecer el orden y garantizar la consistencia del procesador y de la memOlia. Para poder ejecutar una instrucción, esta debe disponer de todos sus operandos fuente y estar libre una de las unidades funcionales que le corresponda según su tip.o (aritmética entera, aritmética coma flotante , salto, etc.) Sin embargo, puede suceder que los operandos fuente no estén di sponibles y haya que esperar por algún resultado de las instruccio nes que están ya ejecutándose. También puede ocurrir que los operandos estén disponibles, pero no así su unidad funcional. O que esté todo di sponible pero no se pueda enviar la instrucción a la unidad funcional debido a que no haya suficientes buses ya que hay un límite en la cantidad de instrucciones por ciclo que se pueden enviar a través de la red de enrutamiento desde la ventana de instrucciones a las unidades funcionales (los ya conocidos riesgos estructu rales). La solución más inmediata a este problema es, simplemente, detener la instrucción en la etapa de decodificación hasta que todo esté listo para poder emi tirla. Pero esto reduce el rendimiento de toda la decodificación y, por ello, de todo el procesador ya que introduce burbujas en la segmentación. La solución por la que se opta es desacoplar la etapa de decodificación de la de ejecución utili zando para ello la ventana de instrucciones . El desacoplo consiste en no detener la instrucción sino decodificar lo que se pueda y hacer que avance hacia la ventana de instrucciones. Para ello, en la ventana de instrucciones se deposita la instrucción con los identificadores de los operandos fuente pero, además, se indica mediante un bit de validez por operando si éste está disponible en ese momento o no. Tras esto, la instrucción permanecerá a la espera en la ventana de instrucciones para poder emitirse a la unidad funcional correspondiente una vez que se cumplan las condiciones necesarias para ello.
2.7.1.
Organización de la ventana de instrucciones
Ex isten varias formas de organizar la ventana de instrucciones:
• Estación de resen /a centralizada (Figura 2.27.a). Es lo que se ha definido hasta ahora como ventana de instrucciones o buffer de distribución. También se conoce con el término ventana de emi sión o cola de emisión. La arquitectura lotel Core utili za esta organización. • Estaciones de rese/va distribuidas o individuales (Figura 2.27. b). Cada unidad funcional dispone de una estación de reserva propia. Existe un buffer de di stribución que recibe las instrucciones de la etapa de decodificación y que se ocupa de distribuirlas a las estaciones de reserva individuales según su tipo. Los procesadores PowerPC 750 utilizan estaciones de reserva particul ares para cada una de las unidades fu ncionales. • Estaciones de reserva en c/LÍsters o compartidas (Figura 2.27.c). Las estaciones de reserva reciben las instrucciones del buffer de distribución pero una estación de reserva puede servil" a varias unidades funcio nales del mismo tipo. Un ejemplo de esta confi guración es el PowerPC 970. 121
INGENIERíA DE COMPUTADORES 11
I
Decodificación
I
~ I
I I
I
I
I
I
---
I
¡
I
(b)
(e)
Figura 2.27: Organizaciones de la ventana de instrucc iones y estaciones de reserva: (a) centra lizada, (b) distribuidas, (e) compartid as. 122
2.7. DISTRIBUCiÓN
110Ps
A los ficheros de registros (VRF, GR, FPR , GPR, LR, eTR, XER, VSCR)
Figura 2.28: Detalles de la etapa de distribución del PowerPC 970.
El PowerPC 970 cuenta con ocho estaciones de reserva individuales, denominadas colas de emisión (isslIe quelles) , que atie nden a doce unidades fun cionales (Figura 2.28). Las colas de emisión reciben e n
cada ciclo reloj un grupo de distribución formado por 5 IOPs que se distribuyen por las colas según su tipo de operación. Las co las se organizan de la siguiente forma: • Una estació n de 18 entradas para las unidades FXUO y la LSUO. • Una estación de 18 e ntradas para las unidades FXUl y la LSUI. • Una estación de 12 eLltradas para la unidad de salto BRU. • Una estación de 10 entradas para la unidad CRU. • Una estación de 10 entradas para la unidad FPUO. • U na estación de 10 entradas pm·a la unidad FPU l . • Una estación de 20 entradas para las unidades de cálc ulo vectori al VF, VX y Ve. • Una estación de 16 entradas para la unidad vectorial de permutación VP. La utili zación de una u otra configuración es pm1e de las decisiones que debe lOmar el equipo de ingeniería que di seña la arquitectura del procesador. Una estación ele reserva centrali zada conlleva un hm·dware de control muy complejo ya que hay que acceder de forma asociati va a un ún.ico buffer 123
INGENIERíA DE COMPUTADORES"
multipuerto con un elevado número de entradas. Recurrir a estaciones de reserva individuales implica que cada buffer dispondrá de un menor número de entradas y de menor longitud ya que cada estación alimenta a una única unidad funcional y no necesita almacenar el tipo de instnIcción. Sin embargo, la estructura distri buida aumenta la complejidad de los buses que hay que utilizar para reenviar los resultados de las distintas unidades funcionales (los operandos fuente pendientes) a las estac iones de reserva y a los bancos de registros y poder emitir así nuevas instrucciones. La organi zación de las estaciones de reserva obliga a matizar el significado de ciertos términos, ya de por sí confusos en la literatura. Se entiende por distribuc ión el asociar una instrucción a una un idad funcional y por emitir el enviar la instrucción a la unidad funcional para comenzar su ejecución. De acuerdo con esto, en una estación de reserva centralizada los términos distribución y emisión significan lo mismo ya que la asociación de la instrucción a la unidad funcional se produce en el momento del envío. En una organización basada en estaciones de reserva individuales, la distribución es el envío desde el buffer de distribución a la estación de reserva indi vidual y la emisión es el envío desde la estación de reserva indi vidual a la unidad funcional para que se ejecute. En una organización basada en estaciones de reserva compartidas ex iste distribución y distribución/emisión: la primera distri bución es el envío desde el buffer de distlibución a una estación de reserva y la distribución/emi sión se produce al enviar la instrucc ión a una de las unidades funcionales que tiene asignada.
2.7.2.
Operativa de una estación de reserva individual
Una estación de reserva es un buffer de almacenamiento con múltiples entradas en donde se almacenan las instrucciones ya decodificadas. Cada entrada del buffer es un conjunto de bits agrupados por campos y representa a una instrucción. Aunque, el número y longitud de los campos que componen cada una de las entradas VIDa en función del diseño del procesador y del tipo de unidad funcional que debe servir, ulla estructura que se puede considerar como genérica para una estación de reserva individual constaría de los siguientes campos: • Ocupado (O): Indi ca que la entrada está ocupada por una instrucc ión válida pendiente de emisión. • Código de operación (CO): Contiene el código de operación de la instrucción. • Operando 1 (Opl ): Si el registro que corresponde al primer operando fuente está disponib le, este campo alm acena el valor del registro o el identificador (aunque, como se verá, esto depende del modo de lectura de los operandos). Si no está di sponible contiene el identi ficador del registro. • Válido J (Vl): Ind ica si el operando fuente está di sponib le o no. • Operando 2 (Op2): Simil ar al Op lo • Válido 2 (V2) : Simil ar al Vlo 124
2.7. DISTRIBUCiÓN
• Destino (D): El identificador del registro destino que almacenará el resultado de la operación de forma temporal. Posteriormente, cuando se explique el renombramiento de registros se entenderá con claridad la razón de que sea un alm acenamiento temporal. • Listo (L): Indica que todos los operandos ya están disponibles y la insb'ucción puede emitirse a la unidad funcional correspondiente.
Cuando una instrucc ión se disbibuye y se almacena en una estación de reserva, el bit O se coloca a 1 para indicar que la instrucción está pendiente de ser ejecutada. Si los dos operandos fuente estuviesen disponibles, los campos Vl y V2 contendrían el valor 1. Que los operandos fuente estén disponibles significa que los campos Opl y Op2 almacenarán el identificador del registro fuente o su contenido según sea la forma en que se proceda a leer los operandos (más adelante se tratará este punto). Si los operandos no están disponibles entonces se almacena el identificador del registro fuente. Una vez que los operandos estén listos, es decir, Vl y V2 a 1, entonces el bit L se coloca a I y la instrucción ya se encuentra preparada para ser emitida en cuanto la unidad fun cional asignada y el bus de enrutamiento estén libres. Observe que el fonnato descrito es para operaciones aritméticas registro-registro. Dependiendo del tipo de instrucción, el formato de las entradas de la estación de reserva variará. Con independencia de la forma de organizar las estaciones de reserva, es decir, individualmente o compartidas, el for mato de las entradas es similar. La diferencia surge en las entradas del buffer de distribución que se ocupa de distribuir las instrucciones a las estaciones individuales o agrupadas. En el caso de estaciones individuales o compartidas, las entradas del buffer de distribución no disponen de bits de vaLidez ya que se asignan cuando las instrucciones son enviadas desde el buffer a las estaciones. Si se Del buffer de distribución
~istribUCión
o
CO Op1
i4
1
ADD
i3
1
i2 i1
V1
Op2
V2
D
L
R3
O
R4
O
R5
O
i4: ADD R5, R3. R4
SUB
R3
O
R1
1
R4
O
i3: SUB R4 , R3. R1
1
ADD
R1
1
R2
1
R3
1
i2: ADD R3. R1 . R2
O
SUB
R7
1
R8
1
R1
1
i1 : SUB R1. R7, R8
O
- --
- --
- -
- --
--
- --
- -
O
---
-
- -
-
--
- --
--
--
--
~miSión A la unidad funcional de suma { resta de enteros
Figura 2.29: Es tados de una instrucción en una estac ión de reserva individual.
125
INGENIERíA DE COMPUTADORES 11
recurre a una única estación de reserva centrali zada, las entradas sí son si milares a la descrita y los bits de validez se estab lecen al salir de la etapa de decodificación. La Figura 2.29 presenta un ejemplo de una estación de reserva indi vidual asociada a una unidad funcional de suma/resta de enteros. La estación cuenta con 6 entradas en la que hay 4 instrucciones en tres situaciones diferentes. La instrucción i 1 ubicada en la primera entrada (de arriba hacia abajo) ya ha sido emitida (L=l) por lo que tiene el bit de ocupado a O; esto indica que la entrada puede ocuparse por una nueva instrucc ión decodificada que venga del buffer de instrucciones. La instrucción i2 tiene todos los operandos disponibles (Vl= l , V2=1) por lo que está en espera de ser enviada a la unidad funcion al (L= 1). La tercera y cuarta instrucc iones tienen parte o todos s us operandos fuente no di sponibl es ya que son resultados de instrucciones prev ias. Las dos últimas entradas contienen informac ión de instrucciones que fue ron emitidas con anterioridad por lo que las entradas puede n ser reuti li zadas. La Figura 2.30 presenta otro ejemplo académico en e l que se aprecia la evolución de un grupo de cinco instrucc iones en el buffer de di stribución yen las estaciones de reserva individuales asociadas a una unidad fun cional de suma/resta y a una de Illultipli cac ión/di visión. Por simplificar el eje mplo, los bits de validez ya vienen establecidos desde la etapa de decodifi cac ión, por lo que el buffer de distIibuc ión cuenta con e ll os . Para poder seguir la evoluc ión del ejemplo, hay que considerar que e l buffer de distribución puede rec ibir y sumini strar hasta 5 instrucciones/cic lo, que la unidad de suma/resta consume 1 ciclo y la de multiplicación/divi sión 2 ciclos estando segmentada, y que, al final de su último cic lo de ejecución, las unidades funcionales com unican a las estaciones de reserva la disponibi lidad de sus resultados. De esta forma, la estación de reserva podría emitir una instrucción en el ciclo de reloj siguiente, ya que la unidad funcional le habrá ya comuni cado la disponibilidad de un resultado y éste podría ser uno de los operandos por los que espera al gun a de sus instrucc iones. También se ha considerado que la lectura de los operandos fuente de l fi chero de regi stros no consume tiempo y se efectúa al emitir la in strucción a la unidad func ional. Teniendo en cue nta estas simplificaciones, la evolución del grupo de in strucciones ciclo a c iclo es la sigui ente: • Ciclo i. Las 5 instrucciones son recibidas por el buffer de di stribución desde la etapa de decodifi cación. • C iclo i + l . De las 5 instrucciones se distribuyen las 4 primeras instrucciones a las estaciones de reserva individuales dado que la capacidad de estas últimas es de 2 instrucciones y ya se han saturado. E ll o provoca que la in strucción i5 permanezca en el buft"er de di stribución a la espera de una entrada libre en la estación de reserva. Las otras entradas del buffer de di stribuc ión se marcan como no ocupadas. • Cicl o i + 2. Las instrucciones i1 e i4 tienen todos sus operandos fu ente di sponibles por lo que son e mitidas a sus respectivas unidades func ional es. En este mi smo c ic lo, el buffer de distribución envía la instrucc ión i5a la estac ión de reserva al quedar una entrada libre tras la emi sión de la i4. • C iclo i+3. La unidad de suma/resta ha conclu ido el procesa mie nto de i 1 al fina l del cicl o anterior y ha comuni cado a las estaciones que el resultado que va al registro Rl está di sponible. Las estaciones 126
2.7. DISTRIBUCiÓN
i1: SUB
R1 . R7 , RO
i2: MULT R5, R1, R7 i3: ADD
R5, R2,R1
i4: DIV
R4 , R3, R7
i5: MULT R6 , R4, R5 (a) Secuencia de instrucciones
Ciclo i: Recepción de la etapa de decodificación de i1, i2 , ¡3, i4 e i5
o
o
CO Op1
V1
Op2
V2
D
L
i5
1
MULT
R4
O
R5
O
R6
O
i4
1
DIV
R3
1
R7
1
R4
1
i3
1
ADD
R2
1
R1
O
R5
O
i2
1
MULT
R1
O
R7
1
R5
O
i1
1
SUB
R7
1
RO
1
R1
1
~
..Js V1
CO Op1
Op2
V2
O
L O C O Op1
V1 Op2
V2
O
L
1:I~~~ I~~~ I~~ I~~~ I~~ I~~~ I~~ I 1:I~~~ I~~~ I~~ I~~~ I~~ I~~~ I ~~ I Ciclo i+1: Distribución a las estaciones de reserva de i1, i2, i3 e i4
CO Op1
O
V1
Op2
V2
O
L
O
R5
O
R6
O
O O O O
i5
MULT
R4
~L-
--LsO
CO Op1
V1
Op2
V2
O
L
O
CO Op1
V1
Op2
V2
O
L
i3
1
ADD
R2
1
R1
O
R5
O
i4
1
DIV
R3
1
R7
1
R4
1
i1
1
SUB
R7
1
RO
1
R1
1
i2
1
MULT
R1
O
R7
1
R5
O
Figura 2.30: Ejemp lo de emi sió n de instrucciones entre estaciones de reserva distribuidas (co ntinúa).
127
INGENIERíA DE COMPUTADORES 11
Ciclo i+2: Emisión de i1 e i4. Distribución de i5
O
CO Op1
V1 Op2
V2
D
L
O
O
o o o
jL,'-------------------~~~ O
i3 1
CO Op1
V1
l ADO 1 R2 1
Op2
V2
D
L O C O Op1
V1
Op2
V2
D
L
i5
1
MULT
R4
O
RS
O
R6
O
1 RI l o 1 RS 1 O 1 i2
1
MULT
Rl
O
R7
1
RS
O
D
L
Ciclo i+3: Fin de ejecución de i1 . Emisión de i2 e i3
O
CO Op1
V1
Op2
V2
D
L
O O O O O
O
CO Op1
V1
Op2
V2
D
L O C O Op1
V1 Op2
V2
~ ~ 1 ~ ~ ~ 1~ ~ ~ 1~ ~ 1~ ~ ~ 1~ ~ 1 ~ ~ ~ 1~ ~ 1 15 1 O1~~:T I-~: 1- ~ I-~; 1- ~ I-~: 1- ~ 1
1
(b) Evolución de las estaciones de reserva
i+2
i+3
1+4
i+5
i1 i2
i3 i4
i5
!-- - - ' - - ---I /
R6
(e) Secuencia temporal de ejecución y reenvfo de operandos
Figura 2.30: ¡Continuación] Ejemplo de emisión de instrucciones entre estaciones de reserva distribuidas,
128
2.7. DISTRIBUCiÓN
han detectado que Rl estaba disponible por lo que, en el siguiente ciclo, ya podrán emitir i3 e i2 al tener todos los operandos disponibles. • Ciclo i + 4. La instrucción i4 ha concluido en el ciclo anterior ya que consume 2 ciclos de reloj. También ha concluido la i 3 al consumir un ciclo. Por ello se produce la emisión de i 5 debido a que los operandos que requiere ya se han generado por parte de i3 e i4. • Ciclo i + 5. Concluye el procesamiento de i4 . • Ciclo i + 6. Concluye el procesamiento de i 5. Observe que, de forma implícita, el mecani smo de las estaciones de reserva resuelve el problema de las dependencias RAW. La solución se obtiene al forzar la espera por la di sponibilidad de los operandos pero permitiendo la ejecución distribuida y fuera de orden de instrucciones no dependientes. Pero el ejemplo anterior presenta el problema de las fal sas dependencias, cuya solución vendrá dada al estudiar el renombramiento de registros y el buffer de terminación. En este caso, observe la existencia de un riesgo WAW entre las instrucciones i 2 e i 3. Aunque el formato de las entradas de la estación de reserva individual sea sencillo, lo verdaderamente complejo es el hardware de cono"ol necesario para la asignación y emisión de las instrucciones. Las fases por las que pasa una instrucción desde que abandona el buffer de instrucciones hasta que se emite desde la estación de reserva individual son tres: distribución, supervisión y emisión (Figura 2.31).
2.7.2.1.
Fase de distribución
Consiste en el envío de una instrucción desde el buffer de instrucciones a la estación de reserva individual que le corresponda según su tipo. La introducción de las instrucciones en la estación de reserva se realjza de forma ordenada por parte del hardware conocido como lógica de asignación. La lógica de asignación se ocupa de ubicar correctamente la in strucción recibida para lo que debe llevar un registro de las instrucciones almacenadas y de las enO'adas que están Jjbres (para ello se di spone de los bits de ocupado en la estación de reserva). Además, también se ocupa se establecer inicialmente los bits de validez. En caso de que se utilice una estación de reserva centrali za, esta fase sería similar con la única diferencia de que el origen de las instrucciones sería la etapa de decodificación. Si la lectura de los operandos fuente se realizase en esta fase, los identificadores de los operandos que estuviesen di sponibles serían sustituidos por los valores obtenidos del fi chero de registros. Si no hubiese lectura, se mantendrían los identificadores con independencia de si el operando estuviese disponible o no. En la Figura 2.3 1 no se contempl a la lectura de los operandos fuente hasta que la instrucción se envía a la unidad fun cional por lo que las entradas de la estación solo aLmacenan los identifi cadores de registros y sus bits de validez. 129
INGENIERíA DE COMPUTADORES 11
Buffer de instrucciones
Lineas de control
Instrucciones Fase de
"'-7
distribución
Lógica de asignación
,
Instrucciones
LIneas de control
~7 Estación de reserva individual
Fase de [ supe,,'¡s;ón
Instrucciones
LIneas de control
,,
Lógica de activación
~ r-----
Buses de reenvlo de resultados e
~ r-----
Buses de reenvlo de resu ltados e identificadores
identificadores
LIneas de control
~7 Lógica de selección Fase de
emisión
lineas de control
Instrucciones
"'- 7 Unidad funcional
~
¡ Operandos
/L
~
Fichero de registros
Buses de reenvro de resullados e
identificadores
Figura 2.31: Fases de ulla instrucc ión en la etapa de distribución.
2.7.2.2.
Fase de supervisión
Una vez que la instrucción se e nc uentra almacenada en la estación de reserva, comjenza su fase de supervisión, que concl uye en el momento en que ti ene los dos operandos fuente di sponi bles y está en condi ciones de ser emitida. Durante la fase de supervisión, las instrucciones que ti enen a lgún opera ndo fuente marcado como no disponj ble se encuentran en una espera acti va, supervisando conti nuamente los buses de reenvío, (también conocido como CDS - COl1lmol7 Dala Bus) que es donde cada unidad funcional , una vez concluida su operac ión, publica el resultado y el identifi cador del registro destino en 130
2.7. DISTRIBUCiÓN
el que almacenar el resultado. El hardwme que realiza la supervisión de los buses se suele denominar lógica de activación. D urante esta espera acti va, la lógica de activación está comparando continuamente los identi fi cadores
de los operandos no disponi bles de todas las instrucciones que hay en la estación de reserva con los identi ficadores que se publican en los buses de reenvío por parte de las unidades funciona les. En el momento en que se produce una coincidencia de identi ficadores. se cambia el bit de validez del operando fuente correspondiente (V I . V2). se lee el valor del operando del 'bus de reenvío (si se realiza la lectura
previa de los operandos disponibles; en caso contrario, solo se cambia el bit de validez) y, si todos los operandos ya están listos, se activa el bit que señala a la instrucción como preparada para ser enliti da (bi t L). La activación de] bit L se conoce como activación de la instrucción. En la F igura 2.3 1 C0 l11 0 no se utiliza lectura de operandos hasta el envío de la instrucc ión a la unidad fun cional, la única modi fi cación que realiza la lógica de asignación en la estac ión de reserva es el cambio de los bits de validez (bi ts VI y
V2) Y de listo (bit L) cuando los operandos f uente están disponi bles. La complej idad de la lógica de ac ti vac ión es e levada y aume nta con el tamaño y e l número de las estadones de reserva. Por una parte , la lógica de ac tivac ión tiene que examinar con tinuame nte la
coincidencia de alguna de las etiquetas que circulan por los buses de reenvío con todos los operandos no dispo ni bles, con lo que a mayor nú mero de entradas, mayor número de operandos a com parar. Por otra parte, a mayor nú mero de unidades func ionales y es taciones de reserva , la complejidad de los buses de reenvío aumenta al igual que la red de enrutamiento necesaria para distribuir las instrucciones a las estaciones de reserva indi viduales.
2.7.2.3.
Fase de emisión
Una vez que la instrucción tiene todos sus operandos dis ponibles comienza la fase de emisión. Al ig ual que la anterio r, esta fase se carac leriza por la espera ac ti va hasta que la lógica de selección determina la instrucción que se puede emitir de entre todas las disponibles. La fase de emis ión da paso a la etapa de ejecución, tal y como se m uestra en la Figura 2.3 1. En el esquema de la Figura 2.3 1 se puede aprec iar que la lectura de los operandos se realiza en el momento e n que la instrucción se em ite a la unidad funcional.
De forma simu ltánea, el códi go de la operación y e l identifi cador del registro destino se envían a la unidad func io nal desde la estación de reserva y los operandos, con la infor mación proporcionada por la
estación de reserva, se leen del fi chero de registros y se remiten a la unidad fu ncional. Por lo general, cuando se emi te una instrucció n se li bera la entrada asociada median te la asignadón
de un O en el bit de ocupado pan'a que se pueda di stribuir una nueva instrucción. Sin embargo, para las instrucciones que pueden provocar algunos ti pos de interrupciones, esto no es asÍ. Estas ins trucciones se mantiene n e n la estació n de reserva hasta que no hayan conc lui do comple tamente su ejecución. Un
ejemplo de este ti po de ins trucciones son las de carga. Si una ins trucción de carga produce un fa llo de lectura en la caché de datos, lo habitual es de tener la segmentación durante muchos ciclos hasta que se obtiene el dato. El rendimi en to puede mejorar si la instrucción de carga es expul sada de la segmentación mientras se ex trae e l da to , no deten ie ndo la mudad fun c io nal y, posteriormente, volver a emitirl a, pero
ya con la seguridad de que el clato está di spon ible y no habrá fa llo. 131
INGENIERíA DE COMPUTADORES 11
Si en una estación de reserva individual solo hay una instrucción en condiciones de ser emitida, no ex iste ningún problema: se envía a la unidad funcional y se marca su entrada como libre para que pueda ser ocupada por una nueva instrucción. El problema surge cuando hay varias instrucciones en condiciones de ser emitidas en el mi smo ciclo de reloj y la lógica de selecc ión debe decidir cuál de entre todas ellas
Estación de reserva
i1 : SUB
R1 , R7, RO
i2: MULT R5, R1, R7 i3: ADD
R5, R2 , R1
i4: DIV
R4,R3,R7
i5: MULT R6, R4 , R5
(a) Secuencia de instrucciones
i+1
i+2
i+3
O
Conclusión de 11 y validación de i2 e i3
i+4
O O
Emisión de 12 e 13, conclusión de 14 y validación de i5
Emisión de i5
(e) Secuencia temporal de ejecución y reenvlo de operandos
(b) Evolución de la estación de reserva
Figura 2.32: Ejemplo de emis ión de una secuenc ia de cinco instrucciones a una estación de reserva individual que ali menta dos unidades fu ncionales.
132
2.7. DISTRIBUCiÓN
i1 : AD D R3. R2 . R1 i2: AD D R8 . R3. R7 i3: MULT R6 . R5, R4 i4: ADD
~ Emisión de 11 e 13
R9, R6, R1
i5: MULT R1 0, R3, R6 i6: ADD
R9 , R2, R1
i7: ADD
R10, R3 , R8
~ Emisión de 16 e i8
i8: MULT R1 0, R2, R1
o;¡t(((~
(a) Secuencia de instru cciones
RAW R3
i2, i5, i7
I
i1
i4, i5
R6
i3
i7
RB
i2
R9
I
R10
i5
i8
R10
i7
3
4
5
~ Emisión de 14
i3
7
,,, ,,
,,, ,, ,
i1
6
I
i2
i4
I i7
Conclusión de 12 e 15 y validación de i7
~ Emisión de i7
,
i5
I
o;¡t((((((;%~
,, , , , , ,
i8
b;tt((((((*~ ~
,, ,,
i6
Emisión de 12 e 15 y
b;tt(((((*í~
(b) Depe nden cias 2
I
~ conclusión de i6 e iB
i4
i7, i8
Conclusión de 11 e 13 y
b;tt(((;%~tt~
WAW i6
I
~ validación de 12, 14 6 15
I
(e) Secuencia temporal de ejecución y reenvío de operandos
bH((((((((iV (d) Evolución de la estación de reserva
Figura 2.33: Ejemplo de emisión de una sec uencia de 8 instrucciones a una es tación de reserva indi vidual que alimenta a 2 unjdades func io nales.
133
INGENIERíA DE COMPUTADORES 11
hay que emi tir. El problema es análogo en las estaciones de reserva centraUzadas o compartidas. Estas estaciones de reserva, que ali mentan a vari as unidades funcionales, pueden emitir valias instrucciones por c iclo de reloj pero el problema se presenta cuando el conj un to de instrucc iones que están listas para emiti rse es mayor que e l número de instrucciones que el hal·dwa re permite e mitir por ciclo. E n este caso ta mbién es necesario seleccionar, no una, pero sí un subconju nto. Centrando la d iscusión en una estac ión de reserva indi vidual, la lógica de selección no es más que un algoritmo de planificación o planificador dinámico. El más ha bitual consiste en seleccionar la instrucc ión más antigua de entre todas las di sponib les, es decir, apliCa!" e l orden de l programa. Una vez que se conoce la in strucción a emitir hay que esperar a que la unidad funcional esté li bre y pueda comenzar a ej ecutar la instrucción. Los prim eros procesadores superescalares se caracteri zaba n por realizal· una emisión COII bloqueo y olTlellada . Esto impl icaba que las instrucciones salían en orden de la estación de reserva y si una instrucción no contaba con sus operandos di sponibles debía esperar, bloqueando la emisión de las instrucc iones posteriores tuviesen o no los operandos listos . Los procesadores actuales ya realizan emisión sin bloqueo y desordenada, lo que mejora notab leme nte su re ndimiento. La Figura 2 .32 presenta un ej emplo de emisión desordenada en el que la política de planifi cación es emitir la instrucción más antigua de e ntre las di sponib les . En el ejemplo se considera que una estación de reserva alimenta una uni dad funcional de suma/ resta ( 1 c iclo) y una de multiplicación/divis ión (2 ciclos y segmentada). Además, se supo ne que en el mi smo ciclo en el que la unidad funcional genera e l operando, la estación de reserva actual iza sus bits de validez; esto perm ite que e n el ciclo sigui ente se pueda emi tir la instrucc ión. Observe que, inicialmente, la instrucción i4 está di sponible y se emite sin esperar a que las instrucc iones i 2 e i 3 lo estén. En caso de recurrir a la emisión con bloqueo, la in strucción i4 tendr ía que esperar a la emi sión de i2 e i 3, una vez conc luida la ejec uc ión de i 1. Esto tendd a como repercusión que la secuencia hab ría tal·dado en ejecutarse en las unidades fu nciona les un c iclo más (5 ciclos) que con respecto a la emi sión sin bloqueo (4 cic los) lo que supone una mejora del rendimiento del 20 %. La Figura 2.33 muestra otro ej emplo de emisión de un grupo de instrucciones por palle de una estación de reserva indi vidual que alimenta una unidad de suma/ resta (2 c ic los) y una unidad de multip licac ión/di visión (2 ciclos). Se puede apreciar con c laridad en el d iagrama de tiempos (Figura 2.33.c) que las instrucc iones se ejecutan de forma totalmente desordenada en las Ultidades funcionales pero respetando las dependencias RAW entre las diferentes instrucciones. La ejecución fuera de orden produce la violación de las dependencias WAW que ex isten entre las instrucciones i 5, i7 e i 8. El renombramiento de registros y el buffer de termi nación será la solución para respetar este tipo de dependencias de datos. La emi sión de instrucciones desde las estac iones de reserva puede reali zarse de forma alineada o no alineada . Alineada signifi ca que la ventana de d istribución no puede enviar nuevas instrucc iones a la estación de reserva hasta que esta no esté completamente vacía. La emisión no ali neada implica que se pueden di stribuir instrucciones desde e l buffer de d i s ~·ibuc i ón siempre que queden entradas libres en las estaciones de reserva. E n los ejemp los que se han estudiado hasta aquí se ha recurrido a la emi sión no alineada de instrucc iones. 134
2.7. DISTRIBUCiÓN
2.7.3.
Lectura de los operandos
Hasta este punto se ha considerado que la lectura de los operandos fuente se realizaba siempre en el momento en que se em.itían las instrucciones desde las estaciones de reserva individuales a las unidades funcionales (ver F igura 2.3 1). Esta forma de organizar la emi sión y ejecución de las instrucciones se denomina planificación sin lectura de operandos (Figura 2.34.a). Ello se debe a que cuando la instrucción se emite por parte del planificador, todavía no se han extraído los valores de los operandos fue nte del fichero de registros. En este esquema, cuando una instrucción se di stribu ye desde la ventana de instrucciones a una estación de reserva individual , las entradas contienen únicamente identificadores de registros fuente (ver Figura 2.29). Buffer de distribución
Buffer de distribución
j'''',u,,'6"
IInstrucción Identificadores
Estación de reserva sin operandos leidos
+
+
g¡ ~~ ~.~
~
~.~
8;
-o~ o ~
Fichero de registros
ü::2
e:.:::
'0 •
.~~ w o~
g
e:;::
:Q
Identificadores
g
registro fuente
Valores +
Identificadores
Fichero de registros
1+-
Valores
Estación de reserva con operandos leidos
1 Codo operación + Valores + Id. destino
Unidad funcional
(a) Planificación sin lectura de operandos
Unidad funcional
(b) Planificación con lectura de operandos
Figura 2.34: Formas de lec tura de los operandos.
Aunque se estudiará posteriormente, hay que precisar que el fichero de registros también cuenta con bits de validez de cada registro. Cuando se distribuyen las insb'ucc iones desde la ventana de instrucciones a las estaciones de reserva se analizan las instrucc iones en busca de dependencias verdaderas, y se marcan en el fi che ro de registros como inválidos (bi t de validez a O) aquellos registros que resulten ser el destino de una operación. La lógica de asignac ión es la que se encarga de asignar los bits de validez ele los operandos fuente med iante una consulta al fi chero de registros. De esta forma, los operandos fuente de una instrucción (instrucción consu midora) se marcarán como di sponibles si el bit de validez en el 135
INGENIERíA DE COMPUTADORES 11
fi chero de registros está a 1 (válido) ya que indi ca que no es el resultado de ninguna instrucción previa (instrucción productora). Observe que en el ejemplo correspondiente a la Fi gura 2.30, por simplificar la explicación, se ha considerado que la asignación de los bits de validez ya veni a dada por la etapa de decodificación. En este texto se considera que la asignación de los bits de validez al fi chero de registros y a las entradas de las estaciones de reserva se realiza en la fase de distribución y no en la de decodificación. Cuando la instrucción se emite, el código de operación y el identifi cador del registro destino se envían directamente a la unidad funcional, mientras que los identificadores de los operandos se envían al fi chero de registros para la lectura de sus valores, desde donde se remiten a la unidad funcional. La unidad funcional , una vez que concluye su operación, coloca el resultado y el identificador del registro destino en los buses de reenvío. Por un lado, el identificador del registro destino se envía a la estación de reserva, la cual reali za las comparaciones oportunas y acti va los bits de validez de aquellos operandos cuyo identifi cador coincida con el que se ha publicado en el bulfer. Por otro lado, el fi chero de registros lee el identificador del registro destino y el resultado y lo escribe en el fi chero actualizando su bit de validez. Una de las ventajas de este modo de organi zación es que el ancho de las estaciones de reserva y de los buses de reenvío se reduce considerablemente. Ello se debe a que las entradas de la estación de reserva solo tienen que alm acenar los identifi cadores de los registros y no sus valores, lo que consume muchos menos bytes. Por otra parte, la reducción de los buses se produce debido a que la estación úni camente necesita leer identificadores, no valores. Un inconveniente de este modo de planificación es que el tiempo que transcurre desde la emisión de la instrucción hasta que comienza su ejecución es mayor debido al tiempo necesario para extraer los operandos. La segunda fo rma de efectuar la lectura de los operandos es cuando la instrucción se distribuye desde el buffer de distribución a las estaciones de reserva. A este estilo de captación de los operandos fuente se le denomina planificación COll lectura de operandos (Figura 2.34.b). El códi go de operación y el identificador del registro destino se copi an directamente en la estación de reserva desde el buffer de distribución mientras que los identificadores de los operandos fuente se envían al fi chero de registros. Si el operando está di sponible en el fi chero de registros, la estación de reserva recibe el valor y coloca el bit de validez de su entrada a 1. Por el contrari o, si el registro no está disponible se reenvía el identificador a la estación y se col oca el bit de validez a O. Ahora, tras la emi sión de una instrucción , cuando la unidad funcional concluye y publica en el bus de reenvío el resultado de su operac ión junto con el identificador del registro destino, el resultado se copia tanto en el fi chero de registros como en algunas entradas de la estación de reserva. En el fi chero de registros no solo se actualiza el valor del registro sino que también se modifica el bit de validez para indi car que ya está di sponibl e y no es el registro destino de ninguna olra instrucción posterior. Por su parte, las entradas de la estación de reserva que presentan alguna coincidencia de los identificadores de los operandos no disponibles con el identificador publi cado en el bus de reenvío, reemplazan el identifi cador por el valor del operando y colocan el bit de validez a l. En la descri pción del fun cionamiento de las estaciones de reserva se ha reclll1'ido al identificador de los registros para delectar la di sponibil idad de un operando y así proceder a la activación de las instrucciones. Esto no es obligatori o y existen otras formas de reali zarlo. Por ejemplo, el algori tmo 136
2.7. DISTRIBUCiÓN
de Tomasulo rec urre a los identificadores de las entradas de las estaciones de reserva. Las entradas de las estac iones de reserva tienen una etiqueta por cada operando fuente que indica si el operando está disponible. Si lo está, la etiqueta se coloca a O y si no lo está, se almacena el identificador de la entrada que almacena la instrucción que producirá el resultado. Tras la ejecución de la instrucc ión en la unidad funcional, se publica el identificador de la entrada en el bus de reenvío para que las estaciones de reserva que detecten coincidencias se actualicen. La Figura 2.35 presenta un ejemplo de planificación con lectura de operandos. Se ha considerado que la estación de reserva centralizada distribu ye 4 instrucciones/ciclo a las dos estaciones de reserva indi viduales que alimentan una unidad funcional de suma/resta (1 ciclo) y una unidad segmentada de mu ltiplicación/divi sión (2 ciclos). Las estaciones de reserva individuales emiten un máximo de una instrucción por ciclo de reloj a la unidad funcional que tienen as ignada. lnicialmente, todos los registros son válidos. La figura no solo detalla el estado de las tres estaciones de reserva y del fi chero de registros al comienzo de cada ciclo, sino también su estado al final de alguno de los ciclos. Esta precisión se realiza dado que, en este ejemplo, cuando una unidad funcional produce el resultado, éste junto con el identificador de su registro destino se publican en el buffer de reenvío y se actualizan las estaciones de reserva y el fichero de registros. De esta forma , las estaciones de reserva son capaces de emi tir una instrucción en el ciclo siguiente a la publicación del resultado en el buffer. A continuación, se analiza ciclo a ciclo lo que sucede en el núcleo del procesador: • Ciclo i. Se reciben las cinco instrucciones desde la etapa de decodificación. • Ciclo i + 1. Se distribuyen las instrucciones i 1, i 2, i3 e i4 a las estaciones de reserva individuales según su tipo, quedando en espera la i 5 para su distribución en el ciclo i + 2. Se establecen los bits de validez de los registros R1 , R4 Y R5 a O en el fichero de registros dado que son destinatarios de los resultados de las instrucciones disu·ibuidas. En las estaciones de reserva se almacenan los valores de los operandos disponibles y se establecen sus bits de validez a 1. Las instrucciones i 1 e i4 se marcan como listas para ser emitidas al tener disponibles todos sus operandos. • Ciclo i + 2 (inic io). Se emiten i1 e i4 ; se recibe i5 de la estación de reserva centralizada y se coloca el bit de validez de R6 a O en el fichero de registros. • Ciclo i + 2 (fi nal). Concluye la ejecución de i 1 en la unidad de suma/ resta y se publica su resultado y el identificador de su registro destino, R1 , en el buffer de reenvío. lnmediatamente, se actualizan el bit de validez de R1 (pasa a 1) y su contenido en el fichero de registros . También se actualizan las entradas de las estaciones de reserva que man tienen el operando R1 marcado como no disponible. Como resultado de esta actualización , las instrucciones i2 e i3 se marcan como li stas para ser emitidas al tener ya disponibles sus dos operandos. • Ciclo i + 3 (inicio). Se emiten i 2 e i3. En la segmentación de la unidad funcional de multiplicación/división coinciden dos instrucc iones: la i4 y la i2. 137
INGENIERíA DE COMPUTADORES 11
i1 : SUB
R1 , R7 , RO
i2: MULT R5 , R1 , R7
i3: ADD i4:
DIV
R5, R2, R1 R4 , R3 , R7
i5: MULT R6 , R4 , R5
(a) Secuencia de instrucciones
Cic lo i:
O i5 i4
1 1
CO MULT
DIV
Op1 R4 R3
Op2 R5 R7
D
i3
1
ADD
R2
R1
R5
i2
1
MULT
R1
R7
R5
i1
1
SUB
R7
RO
CO
Op1
V1
Op2
V2
O
L
CO
Op1
V1
Op2
V2
O
L
O
CO
Op1
V1
Op2
V2
O
L
O
- --
- --
- -
- --
- -
- --
--
O
- --
---
- -
- --
-- --- - -
i3
1
ADD
2
1
R1
O
R5
O
i1
1
SUB
7
1
O
1
R1
1
O
CO
Op1
V1
Op2
V2
D
L
- --
--
- -- --
- --
--
- --
--
- --
--
- --
--
V
RO
O
1
R1
1
1
R2
2
1
R3
35
1
R4
4
1
O
R5
5
1
O
R6
6
1
O
R7
7
1
O
R6 R4
o
Datos
O O O O
R1
O
Ciclo i+1: Distribución de i1, i2, i3 e i4
O
CO
Op1
Op2
D
O O
O O i5
1
MULT
R4
R5
Datos
V
RO
O
1
R1
1
O
R2
2
1
R3
35
1
R4
4
O
R5
5
O
O
- --
R6
6
1
O
- --
R7
7
1
R6
i4
1
DIV
35
1
7
1
R4
1
i2
1
MULT
R1
O
7
1
R5
O
Figura 2.35: Ejemplo de aplicación de la planificación con lectura de operandos a una secuencia de 5 instrucciones (cont inúa).
138
2.7. DISTRIBUCiÓN
Ciclo i+2: Se ejecutan i1 e i4
O
o
CO Op1
Op2
D
O O O O O
Datos
V
O
RO
O
1
O
R1
1
O
O
R2
2
1
R3
35
1
R4
4
O
O
R5
5
O
O
R6
6
O
O
R7
7
1
i3
CO Op1
V1
Op2
V2
D
L
R1
O
R5
O
ADD
2
CO
Op1
V1
Op2
V2
D
L
O
R6
O
R5
O
D
L
i5
MULT
R4
O
R5
i2
MULT
R1
O
7
Fin al cic lo i+2: Finalización de i1. Quedan disponibles i2 e i3
O
O O O O O
CO
Op1
Op2
D
CO
Op1
ADD
2
V1 Op2
V2
Datos
V
O
RO
O
1
O
R1
7
1
O
R2
2
1
R3
35
1
R4
4
O
O
CO
Op1 ---
- -
- --
- -
- --
--
---
- -
- --
- -
- --
--
i3
R5
7
V1 Op2
V2
D
L
R5
5
O
O - --
R6
6
O
O
- --
R7
7
1
i5
1
MULT
R4
O
R5
O
R6
O
i2
1
MULT
7
1
7
1
R5
1
O
Figura 2.35: [Con tinu ación] Ejemplo de aplicación de la plani ficación con lect ura de operandos a una secuencia de 5 in strucciones (continúa).
139
INGENIERíA DE COMPUTADORES 11
Ciclo i+3: Se emiten i2 e i3
o Datos V
O
CO
Op1
Op2
D
O O O O O
CO
Op1
V1
Op2
V2
D
L
CO
Op1
V1
Op2
V2
D
L
MULT
R4
O
R5
O
R6
O
CO
Op1
V1
Op2
V2
D
L
CO
Op1
V1
Op2
V2
D
L
O
RO
O
1
O
R1
7
1
O
R2
2
1
O
R3
35
1
R4
4
O
O
R5
5
O
O
R6
6
O
O
R7
7
1
O
i5
Final ciclo i+3: Finalización de i3 e i4. Queda disponible i5
O
o
CO Op1
Op2
O O O O O
D
Datos V
O
RO
O
1
O
R1
7
1
O
R2
2
1
O
R3
35
1
R4
5
1
O
R5
9
1
O
R6
6
O
O
R7
7
1
O
i5
MULT
5
9
R6
Figura 2.35: [Continuación] Ejemplo de aplicación de la planificación con lectura de operandos a una secuencia de 5 instrucciones (continúa) .
140
2.7. DISTRIBUCiÓN
Ciclo i+4: Se emite i5
o o
CO Op1
Op2
D
O O O O
Datos
V
O
RO
O
1
O
R1
7
1
O
R2
2
1
O
R3
35
1
R4
5
1
O
R5
9
1
O
R6
6
O
O
R7
7
1
O
---
O
CO
Op1
V1
Op2
V2
D
L
CO
Op1
V1
Op2
V2
D
L
CO Op1
V1
Op2
V2
O
L
CO Op1
V1
Op2
V2
D
L
O
Final ciclo i+4: Finalización de i2
O
O O O O O
CO Op1
Op2
D
Datos
V
O
RO
O
1
O
R1
7
1
O
R2
2
1
R3
35
1
R4
5
1
O
R5
49
1
O
R6
6
O
O
R7
7
1
O
O
O
O
Figura 2.35: [Contin uación] Ejemplo de ap Licación de la planifi cación con lectura de operandos a una secuencia de 5 instrucciones (con tinúa).
141
INGENIERíA DE COMPUTADORES 11
Ciclo i+5 : Continúa el procesamiento de i5
O
CO Op1
Op2
O
O O O O
O
Datos
V
RO
O
1
R1
7
1
R2
2
1
R3
35
1
R4
5
1
O
R5
49
1
O
R6
6
O
O
R7
7
1
O
CO Op1
V1
Op2
V2
O
L
CO Op1
V1
Op2
V2
O
L
O O O O
O
O
Fina l ciclo i+5: Finalización de i5
o
CO Op1
O O O O
Op2
O
o
Datos
V
RO
O
1
R1
7
1
R2
2
1
R3
35
1
R4
5
1
O
R5
49
1
O
R6
45
1
O
R7
7
1
O
O
CO
Op1
V1
Op2
V2
O
L
CO Op1
V1
Op2
V2
O
L
O O O O
O
Figura 2.35: [Continuación1 Ejemplo de aplicación de la planificación con lectura de operandos a una secuencia de 5 instrucciones.
142
2.7. DISTRIBUCiÓN
• Ciclo i + 3 (final). Concluye la ejecución de las instrucciones i3 e i4. Como consecuencia de ello se actuali zan los bits de validez y los valores de R4 y R5 en el fi chero de regi stros. También se actuali za la e ntrada de la estación de reserva que corresponde a la instrucción i5 . que queda li sta para ser emitida en el ciclo siguiente. • Ciclo i + 4 (inicio). Se emite la instrucción i5. Las estaciones de reserva quedan vacías. • Ciclo i + 4 (fi nal). Concluye el procesamiento de i2 . Se actualiza el valor y el bit de validez del registro R5 en el fi chero de registros. • Ciclo i + 5 (ini cio). La instrucc ión i5 comienza su procesamiento en la segunda etapa de la segmentación de la unidad de multiplicac ión/d ivisión. • Ciclo i + 5 (final). i 5 concluye su procesamiento en la unidad func ional y se publica el resultado en el buffer de reenvío. Se actualiza el bit de validez y el valor del registro R5. Observe que el registro R5 es el registro destino de las instrucciones i2 e i3 10 que da lugar a la ex istencia de dependencias WAW. Dado que es posible ejecutar instrucciones fuera de orden, la instrucción i2 concluye después que la i3. Esto produce una violación de la dependencia WAW existente entre ellas dos ya que la instrucció n i2 sobrescribe el resultado de la i3. También hay que percatarse que tras la ejecución de i3, el bit de validez de R5 indica que el registro está ya disponible, cuando en realidad no es así ya que i3 también tiene que escribir sus resultados en ese registro. Estos problemas se solucionarán mediante la técnica conocida como re nombramiento de registros.
2.7.4.
Renombramiento de registros
La ejecución fuera de orden de instrucciones es una de las características de los procesadores
superescalares que permiten maximizar su rendimiento, pero introduce nuevos probl emas: la gestión de las depende ncias fal sas WAR (antidependencias) y WAW (dependencias de salida). Las dependencias falsas son consecuencia de la necesidad de reutili zar los registros accesibles por el repertorio de instrucciones para efectuar el almacenamiento temporal de resultados, ya que si el ISA di spusiese de un número infinito de registros, este tipo de dependencias de datos no ex istiría. Sin embargo, los registros accesibles al programador son un recurso limitado y se les conoce como ficllem de registms arquitectónicos o fichem de registros creados. La mayor parte de estos registros son accesibles por el programador a través del repertorio de instrucciones, pero otros no (principalmente, registros que almacenan estados internos del procesador). Para entender la necesidad de reutilizar o reciclar registros hay que conocer cómo el compilador finali za la generación del código ensamblador. Para generar el código objeto, el compilador reCUITe a un número ilimitado de registros simbólicos en los que rea liza alm acenamientos temporales, manteniendo tantos datos como sea posible en los registros, minimi zando así los accesos al sistema de memoria dado que consumen muchos ciclos de máquina. Sin embargo, ya que el número de registros arq uitectónicos está limitado, para generar el código definitivo el compilador tiene que realizar una aSIgnación 143
INGENIERíA DE COMPUTADORES 11
del conjunto in fi nito de registros simbólicos al conjunto finito de registros arquitectónicos (una conespondencia de muchos a uno). Esto obli ga al compil ador a reutilizar registros arqui tectónicos en base a la siguiente regla: se escribe un nuevo valor en un registro cuando se detecta que el valor almacenado en el regi stro ya no es necesario para operaciones futuras, es decir, su vaUdez ha caducado.
El siguiente fragmento de código muestra un ejemplo de reciclaje al detectar el compi lador que, a partir de la lectura de R1 en i 2, el valor almacenado en este registro ya no se utiliza por lo que se reutiliza R1 en i3 para esclibir un nuevo resultado: Rl,R~,#I~
il: ADDI
i2: MULTI R2,Rl,#4® i3: ADDI Rl,R~,#2® i4: MULTI R3 ,Rl ,#8®
El tiempo durante el que un dato almacenado en un registro es válido se denom ina rango de vida del registro . Es el tiempo desde que se almacena el valor en el registro hasta que se hace uso de ese valor por última vez, antes de reemplazarlo mediante una nueva escritura. En el fragmento anterior, hay dos rangos de vida de Rl, el que va desde i1 hasta i2 y el que va desde i3 hasta i4 (Figura 2.36.a). Dentro de un rango de vida se pueden efectuar múltiples lecturas del valor (en el ejemplo, múltiples lecturas de R1) ya que esas operaciones no le quitan validez al dato. E l final de un rango de vida y el comienzo de otro rango de vida del mismo registro se produce debido a que se realiza el reciclaj e de ese registro. Evidentemente, rangos de vida de registros diferentes se pueden intercambiar y mezclar siempre que se respeten las dependencias verdaderas.
J J
Riesgo WAW
¡¡;
i1 : escritura, R1 10 R1
I------
~
ro
i2: lectura, R1 10 -
R1
o
~
o
Riesgo
______ __ __ , ,
W~f!
, i3:
ro
,
escrituraz R 1 I 20 -
'"
R1
~ ~
ro
~
"
,
-
--
--~
escritura2 R1 : 20 -
R1
,
,
: i1 : escritura, R1 ,,
,
10 -
R1
'-- - -- -- -- -- -
¡¡;
i3: escritura, R1 20 R1
I
10-R1
~
"
~ ~
, i3:
i1 : escritura, R1
~
~
i2: lectura, R1 20-R 1 _ _____
-----
, I
,
i4: lectura 2 R1 10-R1
~
~
i4: lectura2 R1 20 R1
o
~
o
ro
'"
(a) Rangos de vida de R1
i4: lecturaz R1 20 R1
(b) Violación de dependencia WAR que provoca que i2 lea un operando incorrecto
i2: lectura, R1 10 -
R1
(c) Violación de dependencia WAW que provoca que i4 lea un operando incorrecto
Figura 2.36: Rangos de vid a de un registro. Los diferentes posibles solapam ientos de dos rangos de vida de un mismo reg istro inducen diferentes tipos de riesgos.
144
2.7. DISTRIBUCiÓN
En el fragmento anterior de código se dan los tres tipos de dependencias de datos. Cada rango de vida conforma por sí mismo una dependencia verdadera RAW ya que i2 e i4 dependen, respectivamente, de i 1 e i3 para leer el valor correcto de Rl. Entre i 1 e i3 existe una dependencia WAW, mientras que entre i2 e i3 existe una dependencia WAR ya que la lectura de Rl por parte de i2 debe realizarse antes que la escritura de i3. En las Figuras 2.36.b y 2.36.c se aprecia que las violaciones de las dependencias falsas se producen por el solapamiento de los rangos de vida de un lT\ismo registro. Estos solapamientos de los rangos de vida se pueden presentar en un procesador superescalar debido a la capacidad de ejecutar instrucciones fuera de orden. La Figura 2.37.a presenta un fragmento de cód igo en el que la ejecución fuera de orden de las instrucciones provoca el solapamiento de los dos rangos de vida del registro Rl. Se considera que hay una unidad funcional de suma/resta ( 1 ciclo) y una unidad de multiplicación/división (2 ciclos) y que en el mismo ciclo en que se obtiene un res ultado se actualizan los bits de validez. Al depender i3 de un operando de i2 , se produce un retraso en su em isión hasta que i2 concl uya y publique el valor de R5. Además, i4 depende de i3 por lo que también queda retenida hasta que el registro Rl se marque como disponible. Esta situación permite que la única instrucción de suma con todos sus operandos disponibles, la i5 , se emita y se ejecute, lo que posi bilita la posterior ejecución de i4 e i6 al validarse Rl. La instrucción i4 se ejecuta antes que i6 ya que el planificador detecta que es más antigua puesto que está antes en la secuencia. La ejecución de la instrucción i 4 dentro del rango de vida definido por i5-i6 introduce un riesgo WAR ya que se produce un solapamiento de los rangos. Además, la ejecución tardía de i3 introduce un riesgo WAW al permanecer el valor escrito por i3 en Rl , cuando lo semánticamente correcto sería que permaneciese el valor de Rl dejado por i6 . Una solución inmediata y sencilla para respetar todas las dependencias de datos es la ejecución secuencial de las instrucciones y la escritura ordenada de los registros que hacen de operandos destino, es decir, el mantenimiento de los rangos de vida. Sin embargo, esto va en contra de una de las señas i+1
i1 : MULT R6, R6, R6
i+2
i+3
i+4
'+5
i2: MULT R5, R6, R6
i3: ADD I R1, R5, #1 ] i4: ADD R2. R1, R1
, • i5 " ---, , WAW ,'
"
i1, i4"
WAR
,
,
Rango de vida
I
R1
i5: ADD I R1. RO, #1 ]
i6
i2
16: ADD R3, R1 , R1
Rango de vida
...............
R1
' . i3
...............
(a)
(b) Secuencia temporal de ejecución
(e) Orden de finalización y
dependencias violadas
Figura 2.37: Violación de dependencias WAR y WAW como consecuencia de la ejecución fuera de orden.
145
INGENI ERíA DE COMPUTADOR ES 11
de identidad de los procesadores superescalares: la ej ecuc ión de instrucciones fuera de orden. Otra soluc ión es detener aquellas instrucciones dependientes hasta que la instrucción ini cial haya terminado de acceder al registro dependiente. La detención de las instrucciones dependi entes es obligada para respetar las dependenc ias verdaderas ya que hay una auté ntica relación productor-consumidor, no así en las dependenc ias fa lsas donde el pro blema original surge po r e l recicl aje de registros, no por la semántica del programa. Es decir, no es necesario detener el cauce para cumplir las dependencias fa lsas de datos ya que el prob lema está ocasionado por la falta de espacio para realizar el almacenamiento temporal de resultados. La solución adoptada para resolver las dependencias fa lsas de datos es el renombramiento din6/11ico de los registms de la arquitectura In.ediante hardware. Hasta ahora, los registros que se han utilizado e n los ej emplos prev ios eran los registros arquitectónicos. E l renomb ra miento de registros consiste en utili zar un conjunto de registros au xili ares, invisibles al programador, de form a que se reestablezca la correspondencia única entre resultados te mporales y registros. Estos registros se conocen como regislms físicos, registros no creados o de renombramiento. Así, las instrucciones escriben sus resultados en los registros no creados para, posteri ormente, deshacer e l renombramiento y proceder a la escritura ordenada de los registros arquitectónicos (los que ve el programador) uti lizando los valores de los registros no creados. Este reestablecimiento de la correspondencia única entre resultados te mporales y registros permite eliminar todas las dependencias falsas entre las instrucciones emitidas. Antes de describir cómo se arti cul a el renombramiento dinámi co de registros mediante hard ware, hay que precisar que el proceso consta de dos pasos: • Paso 1: Resoluci6n de los riesgos WAW y WAR. Se renombran de fOlma única los operandos destino de las instrucciones. Se resuelven así las dependencias WAW y WAR . • Paso 2: Mantenimiento de las dependencias RAW. Se renombran todos los registros fuente que son objeto de una esclitura prev ia uti li zando el mismo nombre que se empleó en e l paso I para renombrar el registro destino de la escritura prev ia. E l objeto de este paso es respetar las dependencias RAW, las cuales quedan determinadas al establecer un especificador de registro común entre las instrucciones que mantienen una relación productor-consumidor. El siguiente fragmento de código muestra la aplicación sucesiva de los dos pasos. E l registro R(\) no necesita renombrarse ya que es un operando fuente que no es objeto de esclitura prev ia. Tras los dos pasos, el reciclaje de l registro Rl rea li zado por el compilador ha quedado deshecho . Ahora, y siempre que se respeten las dependenci as RAW, es factible alterar e l orden de ejecución de las instrucciones sin consecuenc ias. Cód igo oliginal
ADDI MULT ADDI MULTI 146
Rl,RrY, # l R2,Rl ,# 4 Rl,RrY ,# 2 R3 ,Rl , #8
Paso 2
Paso I
ADDI MULTI ADD I MULTI
Rrl,RrY, # l Rr 2 ,Rl , #4 Rr 3 ,RrY, #2 Rr 4 ,Rl ,#8
ADDI MUL TI ADDI MULTI
Rrl,RrY , #l Rr 2 , Rr l , #4 Rr3 , RrY , #2 Rr4 , Rr3 ,#8
2.7. DISTRIBUCiÓN
Esta forma de renombrar los registros mediante dos pasos es ilustrati va y didáctica pero el hardware no la efectúa así. En realidad, el procesador realiza el renombramiento instrucción tras instrucción, anal izando si los dos operandos fuente, renombrados o no, están disponibles y efectuando el renombramiento del registro destino. Para realizar el reno mb rmniento de! registro destino y la lectura de los operandos fuente se reCUlTe a hardware adicional que trabaja en estrecha colaboració n con el trad icional fi chero de registros m·quitectónicos. La fase de renombramiento se puede reali zar e n la etapa de decodificación o en la de distribución. En este texto se considera que es parte de la etapa de d istribución y que se efectúa cuando se di stribu ye una instrucción desde la estación de reserva centrali zada a una estac ión de reserva indi vidual. El renombnuniento dinámico se realiza incl uyendo en el procesador un nuevo fichero de registros,
denominado, fichero de registros de renombramiento (RRP - Rename Register File) o buffer de renombramiento. A p¡u-tir de ahora, el fi chero de regi stros de la arquitectura se denominará ARF (Architected Register File) para diferenciarlo del fi chero de registros renombrados RRF. Ex isten tres formas de organizar el RRF: como un único fichero de registros formado por la suma del RRF y del ARF, como una estructura independiente pero accesible desde e! ARF, o como p¡u-te del bufrer de reordenamiento y accesible desde el ARP.
2.7.4.1.
Organización independiente del RRF con acceso indexado
Un esquema de la implementación del RRF como una estructura independiente del ARF se muestra en la Figura 2.38. Las entradas del ARF se componen de tres campos: el campo Dalas que contiene el valor del registro, el campo Ocupado que indi ca si el registro ha sido renombrado y un campo índice que apunta a la entrada del RRF que corresponde al último renombramiento realizado. ARF
RRF
(16 entradas )
Datos
Válido
Ocupado
RrO
37
1
1
O
Rr1
15
1
O
1
Rr2
10
O
1
,,, ,,
,,, ,
, ,,,
Datos
Indice
Ocupado
RO
45
2
1
R1
15
1
R2
7
O
Rr3
R3
, , , , ,, R15
(8 entradas)
, , , , ,,
, , , , ,,
,
,,
,,
Rr7
Figura 2.38: Organización del RRF como estructura independiente del ARF con acceso indexado.
En lo que respecta a la estructura de los regi stros del RRF, estos constan de un campo Datos, un campo Válido y un campo Ocupado , estos dos últimos de un bit de longitud. En el campo Datos se 147
INGENI ERíA DE COMPUTADORES 11
escribe el resultado de la instrucción que ha causado el renombramiento, va lor que, posteriormente, se utilizará para actualizar el contenido del registro arquitectónico que tiene asociado. El campo Ocupado se emplea para saber si el registro está siendo utilizado todavía por instrucciones pendientes de ejecución y no puede liberarse. El campo Válido indica que todavía no se ha reali zado la escritura en el RRF (es el sustituto del campo Válido utilizado en el fichero de registros de los ejemplos anteriores). Si se opta por lectura de los operandos al distribuir las instrucciones desde la estación de reserva centralizada a las estaciones individuales, la lectura de un reg istro puede encontrarse frente a tres situaciones: • El registro del ARF no está pendiente de ninguna escritura. Su bit de Ocupado permanece a O indicando que no hay renombramiento. Se procede a la lectura del valor almacenado en el campo Datos de su entrada en el ARF . • El registro del ARF es destinatario de una esclitura por lo que ha sido renombrado, su bit de Ocupado está a I y el campo índice contiene un puntero a una entrada del RRF. El puntero no es otra cosa que el identifi cador de uno de los registros de renombramiento del RRF. Una vez que se accede al RRF, se pueden plantear dos situaciones según el estado del registro de renombramiento: • Campo Válido=O. La actualización del contenido del regi stro RRF con el resu ltado de la instrucción que provocó el renombramiento está pendiente. Por lo tanto, el operando no está disponible y se procede a enviar el identificador del registro de renombra miento a la estación de reserva . • Campo Válido=l. El valor del registro de renombram iento con el resultado de la instrucción de esclitura se ha actualizado. El operando está di sponible por lo que se puede extraer su valor del RRF si una instrucción lo necesita como operando fuente. El proceso de renombrar el registro destino de una instrucción cuando ésta se distribuye a la estación de reserva indi vidual es relativamente sencillo. Primero se accede mediante su identificador a la entrada que le cOlTesponde en el ARF, se establece el bit de Ocupado al, se selecciona un registro de renombramiento del RFF que esté libre y se copia el identificador del registro RRF seleccionado en el campo índice. A su vez, el campo Ocupado del registro seleccionado en el RFF se marca a I y el campo Válido se establ ece a O ya que todavía no se ha realizado la escritura (la instrucción se está di stribuyendo, no se ha llegado a emitir) . El identificador del registro del RRF que ha sido seleccionado se utilizará como identificador de registro destino en la entrada de la estación de reserva individual y se almacenará en la entrada que la instrucción tiene en el buffer de terminación, de forma que cuando la instrucción sea terminada se sepa qué registro del RRF hay que liberar. Una vez que una instrucción finali za su ejecución , se produce la escritura del resultado de la operación en el registro RRF y la colocación del campo Válido a 1. Sin embargo, la escritura diferida del valor del RRF al ARF se efectúa cuando la instrucción termina, lo que sucederá cuando lo indique el buffer de terminación, que puede ser en el siguiente ciclo o muchos ciclos después. Como se verá más 148
2.7. DISTRIBUCiÓN
adelante, la terminación de las instrucciones ya se efectúa de fOlm a ordenada puesto que todas las instrucciones al abandonar la etapa de decodificación se insertaron ordenadamente en dos buffers : la estación de reserva centralizada y el buffer de reordenamiento. La Figura 2.38 presenta las situaciones que se pueden plantear al realizar el renombramiento en función del estado de la instrucción de escritura que forzó el renombramiento: • Instrucción pendiente de escritura . El registro R(\) del ARF está marcado como ocupado indicando que el registro se encuentra renombrado como consecuencia de una instrucc ión de escritura y, por ello, el contenido de Datos es información no actuali zada. El valor de su índice apunta al registro Rr2 del RRF que es el identifi cador que estará en las entradas de las estaciones de reserva que corresponden a aquellas instrucciones que tenían R(\) como operando fuente y eran posteriores a la instrucción de escritura que causó el renombramiento de R(\). En el RRF el campo Válido se encuentra a O indicando que el resu ltado de la operación todavía no se ha obtenido y, por ello, el contenido de su campo Datos tampoco es válido. El campo Ocupado está a I indicando que la entrada está en uso. Observe que si ahora una nueva instrucción con R(\) como operando fuente se distribuyese a una estación de reserva individual, el identificador R(\) se reemplazaría por el identificador de Rr2 ya que todav ía no estaría disponible su valor actualizado (la instrucción de escritura se encuentra pendiente de emis ión o está ejecutándose). • Instru cción finalizada. El registro R2 está marcado como ocupado lo que indica que una in strucción de escritura lo renombró, utilizando para ello el Rr(\) del RRF. El registro Rr(\) tiene s u campo Válido a 1 para señalar que la acnIalización del registro se ha realizado, lo que es indicati vo de la finalizac ión de la ejecución de la instrucción de escritura. El campo Ocupado permanece a I ya que la actuali zación del registro R2 del ARF todavía no se ha realizado como consecuencia de que la instrucción de escritura no ha sido terminada. El valor almacenado en el campo Datos del R2 no tiene validez ya que está a falta de actualización, es decir, de la escritura del contenido del campo Datos del Rr(\) en el campo Datos del R2. Si durante el tiempo que R2 permanece en este estado, una nueva instrucción de lectura con R2 como operando fuente es distribuida, el identificador de R2 será sustituido por el valor de Rr(\). • Instrucción terminada. El registro Rl está marcado como no ocupado lo que ind ica que la instrucción de escritura que lo utilizó ya terminó y actualizó el contenido de su campo Datos, deshacie ndo el renombramiento. Aunque el renombramiento de Rl ya no ex ista, es interesante analizar el estado en que quedó el registro de re nombram iento que se le asoció, el Rr l. Como la instrucción de escritura que lo renombró ya terminó, el contenido del campo Datos de Rrl coincide con el de Rl. La indicación de que la instrucción de escritura terminó es que el campo Ocupado quedó marcado como O. El campo Válido quedó a I ya que, previamente, a la terminación, la instrucción finalizó y escribió el resultado en el campo DalOs de Rrl, colocando el bit de válido a l . Cualquier nueva instrucción que se distribuyese a continuación y tuviese como operando fuente el registro Rl, utilizaría el valor del campo Datos del ARF. 149
INGENIERíA DE COMPUTADORES 11
Tras estudiar el proceso de renombramiento de un registro ntili zando un RRF independiente y con acceso indexado, surgen algun as preguntas. La primera de ell as es: ¿qué sucede si al renombrar un registro el campo OCL/pado está ya asignado a l, es decir, e l registro arquitectónico se e ncuentra ya renombrado, tal y como podría ocurrir en el siguiente fragmento de código con e l registro Rl ? i1: i2 : i3 : i4 :
ADDI
R1 , R~, # 1
MU LTI R2 ,R 1 , # 4
ADDI
R 1, R~ , #2
MULTI R3,R1,#8
Si se analiza el funcionamiento del núcleo de l procesador en su conjunto la respuesta es sencilla: simple mente se efectúa un nuevo renombrami ento buscando un registro en el RRF que esté Ubre. Anali zando e l ejemplo anterior se entenderá mejor. En la instrucción i 1, e l registro R1 se renombra a, por ejemplo, Rrl. Una vez que esté disponible el valor de Rr1 debido a que i 1 haya fin alizado su ejecución, la instrucc ión i 2 leerá el campo D alos de Rr1 y estará e n condic iones de ser emitida. Por otro lado, al di stribuir i 3 hay que renombrar nueva mente e l R1 y se le asigna, por ejemplo, e l Rr3. Observe que aunque i3 fin alice antes que i 2, no sucede nada ya que i2 utiliza como fu ente el valor de Rr 1 prod ucido por il , mientras que i3 ha escrito su res ul tado en el registro Rr3 (tras fin ali zar). Además, cualquier instrucción situada entre i2 e i 3 que utili zase R1 como registro fuente tendría como operando fuente el registro de renombra mi ento Rrl. Finalmente, cuando se deshic iese el primer renombramiento de R1 al term inar i 1, el valor de Rr1 se escribiría antes que el de Rr3, con lo que prevalecería la semántica del programa. Al analizar el buffer de termi nación se verá en detalle cómo se deshacen los renombramientos de forma que no se interfiera con la lectura de los operandos. Una segunda pregunta interesante es: ¿qué oc urre si tras terminar una instrucción de escritura y deshacer el renombramiento de su registro destino hay que distribuir un a nueva instrucción cuyo operando fuente coincide con el destino de la escritura termin ada? La instrucción de lectura leerá el valor del operando del ARF ya que en ese momento el registro ya no está renombrado (bi t de ocupado a O). Ade más, en la estaciones de reserva no quedarán instrucciones con e l identifi cador del registro de renombramiento ya que, en e l momento e n que la instrucción de escritura finalizó, se reempl azó el identi ficador por e l val or en las entradas en que hubo coincidencias. Por ell o, e l deshacer el renombramiento no provoca ningún efecto sobre las in strucciones alm acenadas en las estac iones de reserva.
¿ y si la instrucc ión de lectura se distribuye mi entras que la escritura que forzó el renombramiento ha fi na lizado pero no ha terminado? En ese caso, la instrucción de lectura se almacenará en la entrada de la estación de reserva utilizando como operando fuente el valor del registro de renombramiento, no su identifi cador, ya que la escritura fin alizó y actuali zó e l valor del campo D aros del registro de renombramiento. Por tanto, es muy importante comprender que la técni ca del renombrado de registros impU ca que el contenido de los operandos fuente en las estaciones de reserva puede ser de tres tipos: el valor del registro original (no hay escritura pendiente), e l identificador del reg istro de renombramiento (escri tura pendiente de fin alizar) o el valor de l registro de renombramiento (escritura finali zada pero no terminada). 150
2.7. DISTRIBUCiÓN
2.7.4.2.
Organización independiente del RRF con acceso asociativo
Otra forma de organizar el RRF de forma independiente pero que introduce cambios en su estructura eS si se accede de forma asoc iati va, es clecir, mediante una búsqueda en el RRF del identificador del registro ARF que provoca el renombramiento. Ahora, el ARF no necesita disponer de un campo Índice ya que para acceder al registro de renombramiento se utili za el identificador del registro destino ARF que provoca el renomb rado. La Figura 2.39 muestra un esquema de la organización independiente del RRF. El campo Destino del RRF es do nde se almacena el identificador del registro del ARF que provoca el renombra miento y que se utiliza para realizar la búsqueda y validar la coincidencia. Los campos Datos, Válido y Ocupado tienen el mismo significado que en el RRF con acceso indexado. La diferencia fundamental está en el campo de nominado Último. En el acceso indexado al RRF era posible conocer el último renombramiento vigente asociado a un registro del ARF ya que, con independencia de las veces que fuera renombrado, siempre quedaba almacenado en el campo Índice del ARF el identifi cador del último registro de renombramiento. Esta labor ahora la efectúa el campo Último , de forma que si está a I indica que es el último registro de renombramiento asignado al registro del ARF. Cada vez que se hace un nuevo renombramiento del mismo registro destino, el campo Último del último registro de renombra miento asignado a ese regislTO del ARF pasa de I a O y el del nuevo a 1. De esta forma, si llega una instrucción con un registro fu ente que ha sido renombrado, mediante el campo Último del RRF puede detenninar de entre los múltiples renombrarnientos cuál es el más actual asociado a ese registro fu ente. Las tres primeras entradas del ARF y del RRF de la F igura 2.39 replican las situaciones que se daban en la Figura 2.38. La cuarta enu'ada del ARF, la cOlTespondiente al R3, indica que se e ncuentra renombrado por lo que hay que acceder a la RRF. Observe que la cUaJ1a y quintas entradas del RRF son dos renombrami entos del R3 . De los dos registros renombrados, el Rr4 es el que tiene el campo Último a 110 q ue indica que su renombramiento es más actual que el Rr 3, que liene Último a O. Si en la situación ARF Datos
Ocupado
RO
45
1
R1
15
R2
R3
R1 5
RRF
(16 entradas)
(8 entradas)
Destino
Datos
Válido
Último
Ocupado
RrO
2
37
1
1
1
O
Rr1
1
15
1
1
O
7
1
Rr2
O
10
O
1
1
28
1
Rr3
3
35
1
O
1
,,, ,, ,
, , , ,,
Rr4
3
8
O
1
1
,, ,,
, ,, ,
, ,, ,
, ,, ,
, ,, ,
, Rr7
Figura 2.39: Organización del RRF co mo estructura independiente del ARF co n acceso asociati vo.
151
INGENIERíA DE COMPUTADORES 11
actual, una instrucción con operando fuente R3 al distribuirse accediese al ARF para leer el operando, obtendda que el registro está renombrado y al acceder al RRF tendría que emplear como operando fuente el Rr 4, no el Rr3, ya que es el último renombramiento vigente y está pendiente de escritura.
2.7.4.3.
Organización del RRF como parle del buffer de reordenamiento
Otra forma de acomodar el RRF en el núcleo del procesador es como parte del buffer de reordenamiento o terminación. Aunque se anali zará posteriormente con mayor detalle, tras fi nalizar la ejecución de las instrucciones fu era de orde n, el buffer de reordenamiento permite recuperar el orden de las instrucciones y concluir su procesamiento manteniendo la consistencia semántica del programa. Cada instrucción que sale de la etapa de decodificación se almacena simultáneamente en el buffer de distribución y en el buffer de terminación siguiendo el orden secuencial del programa. De esta forma, tras la etapa de ejecución no se pierde el conocim iento relativo al orden en que deben terminarse arquitectónicamente las instrucciones. Para incluir el RRF en el buffer de reordenamiento hay que añadir dos campos a sus entradas: un campo Dalos y un campo Válido, con signifi cado similares a los ya vistos (Figura 2.40). La diferencia estriba en que ahora el campo Ín dice del ARF contiene un puntero a una de las entradas del buffer de reordenamiento, ya que el buffer hace de RRF. No hay que añadir un campo Ocupado ya que ese campo ya existe en el bufrer de terminación puesto que se utiliza para saber si una entrada está libre o no cuando hay que almacenar una nueva instrucción. Buffer de reorden amiento (128 entradas)
ARF (16 entradas)
Dalos
Ocupado
Indice
RO
45
1
2
R1
15
O
1
R2
7
1
O
,,, ,, ,
, , ,
, , , , ,
Dalos
O
2
Válido
.........
........
Ocupado
37
1
1
15
1
O
10
O
1
, ,,,
, ,,,
R3
R1 5
,, ,
,
, ,,,
, ,,,
, ,,,
127
Figura 2.40: Implementación del RRF en el buffer de rcorde namiento. De esta forma, si se produce un renombramiento de un registro por ser el operando desti no de una instrucción, el campo Índice del registro apuntará a la entrada del buffer de reo rdenamiento que ocupa la instrucción causante del renombramiento de su operando destino. Ahora en la entrada de esa instrucción de la estación de reserva se almacenará en el campo de destino el identi ficador de la entrada del bu ffer de reordenamiento. Como en Jos casos anteriores, aunque haya dos o más renombramientos 152
2.7. DISTRIBUCiÓN
de un mismo registro del ARF, la terminación ordenada de las instrucciones garantiza la actualización COlTecta del registro en el ARF. En el instante en que la instrucción termine y se libere su entrada en el bufler de terminación, se accederá con el identificador de esa entrada al ARF y si hubiese coincidencia se actualizaría el campo Datos y el bit de Ocupado se establecería a O, dando por concluido el renombramiento. Si al realizar la distribución de una instrucción se accede al ARF para efectuar la lectura de un operando, las situaciones que se pueden producir son similares a las ya analizadas en la organi zación independiente del RRF con acceso indexado o asociativo: • Si el registro no está renombrado, se lee su valor del campo Datos del ARF y se util iza como operando fuente en la estación de reserva.
• Si está renombrado, se sigue el puntero del campo Índice y se accede a una entrada del buffer de reordenamiento. Pueden acontecer dos situaciones:
• Si el bit de Válido está a O es que se está a la espera de la finali zación de la instrucción que tiene que actualizar el contenido del registro de renombramiento, es decir, el campo Datos de la entrada del buffer. Como operando fue nte en las estaciones de reserva se utiliza el identificador de la entrada del buffer. • Si el bit de Válido está a 1 es que se está pendiente de la terminación de la instrucción. Como operando fuente para la estación de reserva se utiliza el valor almacenado en el campo Datos del buffer de terminación. En el instante en que la instrucción se termine, es decir, se actualice el contenido de Datos en el ARF con la información almacenada en el buffer, el bit de Ocupado se colocará a O tanto en el ARF como en el bufler de reordenamiento para indicar que el renombramiento del registro ha concluido. Aunque la inclusión del RFF en el bu ffer de terminación parece que no aporta nada nuevo, no es así. Por un lado, esta organización provoca que haya que añadir un campo Datos y un campo Válido al buffer de telminación cuando existen instrucciones que no provocan renombramiento de registros (por ejemplo, un salto incondicional). Por otro lado, y debido a las funciones que reali za el buffer de terminación, éste ya dispone del hardware y de los puertos necesarios para intercambiru' información con las unidades funcionales y con el ARF. Sin embargo, una estructura independiente pru'a ubicar el RRF impli ca añadir una nueva unidad hardware al procesador con todo lo que conlleva en el diseño lógico. Lo realmente importante al realizru' el diseño del RRF es alcanzru' una elevada veloc idad de renombramiento. Esto gru'antiza que los renombram ientos de los registros destino y las lecturas de los registros fuente se realicen en el menor tiempo posible, lo que influye de forma notoria en el rendimiento de la etapa di stribución, ejecución y terminación . Recuerde que para poder disuibuÍ.r una in sU'ucción son necesru'ias tres condiciones: una entrada libre en el RRF, una entrada libre en la estación de reserva individual que le corresponda según su tipo y una entrada libre en el bufler de reordenamiento. E n caso de que falle una de las U'es condiciones, el envío de instrucciones desde la estación de reserva centrali zada 153
INGENIERíA DE COMPUTADORES 11
a las estaciones individuales se detiene. Por ello, es fundamenta l que el diseño del RRF sea el más adec uado para las características del procesador.
2,7.5.
Ejemplo de procesamiento de instrucciones con renombramiento
En este apartado se va a describir ciclo a ciclo el procesamiento de un conjunto de instrucciones en un senci llo núcleo de ejecución basado en planificación dinámica con lectura de operandos y renombramiento de registros med iante un RRF independiente con acceso indexado (Figura 2.4 1). La estación de reserva centrali zada puede distribuir un máximo de 4 instrucciones/ciclo a las dos estaciones de reserva individuales que alimentan , respectivamente, una unidad funcional de suma/resta ( l ciclo) y una unidad segmentada de multiplicación/división (2 ciclos). Las estaciones de reserva indi viduales
j Buffer de distribución
,
4 instrucciones I ciclo
Identificadores fuente y destino
I
C6d igo de 000'ación
ARF
H
RRF
I
C6 digo de
operación
Valores + Identificadores fuente y destino
Estación de reserva individual (2 entradas)
Estación de reserva individual (2 entradas)
¡... 1 instrucción I ciclo
1 instrucción I ciclo
Unidad funcional suma I resta 1 ciclo
Unidad funcional multiplicación I división 2 ciclos
Bus de reenvlo (Resultados + Id. registro deslino RRF)
Figura 2.41: Núcleo de ejecución co n planificación dinám ica con lec tura de operandos y RRF independiente con acceso indexado.
154
2.7. DISTRIBUCiÓN
emiten a una velocidad de I instrucción/ciclo a la unidad funcional que tienen asignada. También se ha considerado que los accesos al ARF y al RRF se realizan en el mismo ciclo en que se distribuye la instrucc ión (el renombramie nto no penali za), que se pueden finalizar dos instrucciones simultáneamente y que las instrucciones son termjnadas en el ciclo siguiente a su finalización. El fragmento de código que se va a procesar consta de las siguientes instrucciones: i 1: i2: i3: i4: i5:
MULT ADD SUB MULT MULT
R1,R0,R 3 R2 ,R1 ,R0 R1,R0 , R4 R3,R1,R0 R1,R4,R0
En el código se puede apreciar la existencia de tres rangos de vida para el regi stro Rl: e l definido por i1-i2 , el i3-i4 y el iniciado por la i5. Si no se realizase renombramiento de regiso'os, la ejecución fuera de orden de las instrucciones produciría la violación de las dependencias falsas de datos existentes , como la WAR que hay entre i2 e i3 y la WAW eno'e i1 e i3. Gracias al renombramiento, esto no sucederá aunque, todavía, las instrucc iones seguirán terminando fuera de orden. La Figura 2.42 muestra de forma gráfica la evolución ciclo a ciclo del procesamiento de las cinco instrucciones en el núcleo de ejecución. • Ciclo l . Las cinco instrucciones ll egan de la etapa de decodifi cación y se almacena n en el buffer de distribución. • Ciclo 2. Se produce el renombramiento y diso'ibución de las instrucciones i1 , i2 , i3 e i4 a las dos estaciones de reserva indi viduales. Observe cómo se ha realizado el renombrami e nto de los regiso'os destino, en concreto, preste atenció n al doble re nom bramiento de R1 al ser operando destino en las in strucciones i1 e i3 . La instrucc ión i1 provoca que R1 se renombre como Rr~ , la instrucción i2 fuerza a que R2 se renombre como Rr 1, y la i3 origina el segundo renombramiento de R1 que pasa a apuntar en su campo índice a Rr2. Aunque Rr~ haya perdido su conex ión con R~ en el ARF, esto no tendrá consecuencias ya que el va lor que deberá prevalecer en R1 , según el orden del programa y a falta de procesar i5 , es el generado por i3 . En todos los registros de renomb ramiento los bits de Válido se han fijado a O para indicar que están pendientes de escritura y los bits de Ocupado a 1, al igual que e n los registros del ARF. Tras el renombrarniento, las estaciones de reserva reciben 1as instrucciones con los valores de los operandos fue nte que estén di sponibles o con los identi fi cadores de los registros del RRF. La instrucción i1 ya tiene todos sus operandos di sponibles por lo que podrá e mitirse e n el ciclo siguiente. La i2 está a la espera de valor que se almacenará en el registro Rr~ (el resultado de i 1). La i3 tambié n cuenta con todos los operandos por lo que está en condiciones de emitirse e n el siguiente ciclo, almacenándose su resultado en Rr2. La i4 está a la espera del valor que se almacenará en Rr2 para poder e mitirse. • C iclo 3 (inicio). Ya que ambas unidades funcionales están libres, las instrucciones i1 e i3 se emi ten. La emisión de i1 e i3 provoca que queden entradas libres en las estaciones ele reserva, 155
INGENIERíA DE COMPUTADORES 11
5
4
3
6
i2: ADD
R2, R1 , RO
i3: SUB
R1 , RO, R4
oR1:
i1 i3
7
,
i1 : MULT R1, RO, R3 R
,
R1
i4: MULT R3 , R1 , RO
~ R1
i5: MULT R1, R4,RO
(a) Secuencia de instrucciones
Cic lo 1: Recepción de las instrucciones del decodificador
RRF
ARF O
CO
Op1
Op2
D
i5
1
MULT
R4
RO
R1
RO
5
O
RrO
O
i4
1
MULT
R1
RO
R3
R1
10
O
Rr1
O
i3
1
SUB
RO
R4
R1
R2
20
O
Rr2
O
i2
1
ADD
R1
RO
R2
R3
30
O
Rr3
O
i1
1
MULT
RO
R3
R1
R4
40
O
Rr4
O
CO
Op1
O
v1
Datos
Op2
v2
O
Indice
Datos
Ocupado
LOCO
Op1
v1
Op2
Válido
v2
Ocupado
D
I~ I I I I I I I I I~ I I I I I I
L
I
I
Ciclo 2: Distribución de i1 , i2, 13, i4 Y renombramiento de R1 , R2 Y R3
RRF
ARF
o
i5
CO
Op1
Op2
D
Datos
Indice
O
RO
5
O
R1
10
Rr2
O
R2
20
Rr'
O
R3
30
Rr3
R4
40
O
MULT
R4
RO
o
CO
Op1
R1
v1
Op2
v2
Datos
Ocupado
O
, , ,
O
O
L
i3
,
SUB
5
1
40
,
Rr2
1
i4
i2
1
ADD
RrO
O
5
1
Rr1
O
i1
RrO
O
Rr'
O
Rr2
O
Rr3
O
CO
Op1
v1
Op2
, , , ,
1
MULT
Rr2
O
5
MULT
5
1
30
,
D
L
Rr3
O
1
RrO
1
v2
Figura 2.42: Evolución del procesamiento de instrucciones empleando RRF (co ntinúa).
156
Ocupado
O
Rr4
o
,
Válido
2.7. DISTRIBUCiÓN
Cic lo 3 (inic io): Se emiten i1 e ¡3. Se distribuye i5 y se renombra R1 por tercera vez
ARF
o
CO Op1
Op2
D
Datos
O
RO
5
o o o o
R1
10
R2 R3
CO Op1
v1
Op2
12 1 O 1 ADD 1 RrO 1 O 1 5
v2 1
Datos
Ocupado
Válido
Ocupado
O
RrO
O
1
Rr4
1
Rr1
O
1
20
Rr1
1
Rr2
O
1
30
Rr3
1
Rr3
O
1
Rr4
O
1
O
40
R4
o
Indice
RRF
D
o
L
1 Rr1 1 O 1
CO Op1
i5
1
MULT
i4
1
MULT
v1
Op2
v2
D
L
40
1
5
1
Rr4
1
Rr2
O
5
1
Rr3
O
Ciclo 3 (final) : Concluye i3 y se publica su resultado (-35) y su destino (Rr2)
ARF
o
CO Op1
Op2
D
Datos
O
RO
5
O
R1
10
O
R2
O O
o
CO Op1
v1
Op2
12 1 O 1 ADD 1 RrO 1 O 1 5
Datos
Ocupado
Válido
Ocupado
O
RrO
O
1
Rr4
1
Rr1
O
1
20
Rr 1
1
Rr2
1
1
R3
30
Rr3
1
Rr3
O
1
R4
40
O
Rr4
O
1
v2 1
Indice
RRF
D
o
L
1 Rr1 1 O 1
CO Op1
v1
·35
Op2 v2
D
L
i5
1
MULT
40
1
5
1
Rr4
1
i4
1
MULT
·35
1
5
1
Rr3
1
Figura 2.42: [Continuación] Evolución del procesamiento de instrucciones empleando RRF (continúa).
157
INGENIERíA DE COMPUTADORES 11
Cic lo 4 (inicio): Se emite 14. i1 se encuentra en el 2° ciclo. Se libera Rr2 por terminación de i3
RRF
ARF O
CO Op1
Op2
D
Datos
5 10 20 30 40
RO Rl R2 R3 R4
O
o o o o
o
CO Op1
v1
Op2
v2
Indice
D
Datos
Ocupado
O 1 1 1 O
Rr4 Rrl Rr3
RrO Rrl Rr2 Rr3 Rr4
L O C O Op1
Is l
12 1 O1ADD 1 RrO 1 O 1 5 1 1 Rrl 1 O1
v1
Válido
O O 1 O O
·35
Op2
v2
D
Ocupado
1 1 O 1 1 L
1MULT I 40 1 1 5 1 1 Rr4 1 1
Ciclo 4 (fina l): Finaliza i1. Se publica su resultado (150) y su destino (RrO)
ARF
o
CO Op1
Op2
D
Datos
5 10 20 30 40
RO Rl R2 R3 R4
O O O O O
o
CO Op1
v1
Op2
v2
Indice
D
Rr4 Rrl Rr3
RRF
Isl
Válido
RrO 150 Rrl Rr2 ·35 Rr3 Rr4
O 1 1 1 O
LOCO
12 1 O1ADD 1 150 1 1 5 1 1 Rrl 1 1
Datos
Ocupado
Op1
v1
Op2
1 O 1 O O v2
D
Ocupado
1 1 O 1 1 L
O1MULT 1 40 1 1 5 1 1 Rr4 1 1
Figura 2.42: [Continuac ión] Evolución del procesamiento de instrucciones empleando RRF (co ntinúa).
158
2.7. DISTRIBUCiÓN
Ciclo 5 (inicio): Se emiten [2 e ¡5. [4 se encuentra en el 2° ciclo. Se libera RrO por terminación de i1
ARF
o
CO
Op1
Op2
D
Datos
O
CO Op1
v1
Op2
Datos
Válido
Ocupado
150
1
O
O
1
O·
RrO
10
Rr4
1
Rr1
R2
20
Rr1
1
Rr2
1
O
R3
30
Rr3
1
Rr3
O
1
R4
40
O
Rr4
O
1
R1
o
Ocupado
5
RO
o o o o
Indice
RRF
v2
D
LOCO
I~ I I I I I I I I I~ I
Op1
v1
-35
Op2
v2
D
L
I I I I I I
I
C ic lo 5 (final): Finaliza [4 y se publica su resultado (~175) y su destino (Rr3) Finaliza i2 y se publica su resultado (155) y su destino (Rr1)
ARF O
CO
Op1
Op2
D
Datos
Ocupado
Datos
Válido
Ocupado
O
RrO
150
1
O
Rr4
1
Rr1
155
1
1
20
Rr1
1
Rr2
-35
1
O
R3
30
Rr3
1
Rr3
-175
1
1
R4
40
O
Rr4
O
1
O
RO
5
O
R1
10
O
R2
O O
O
CO Op1
v1
Op2
RRF
v2
D
Indice
LOCO
Op1
v1
Op2
v2
D
L
I I I I I I I I I I I I I I I I I I Figura 2.42: [Con tinu ación] Evolución del procesamiento de in stru cciones e mpleando RRF (co ntinúa).
159
INGENIERíA DE COMPUTADORES 11
Ciclo 6 (inicio): Termina i2, se actualiza R2 y se libera Rr1 Termina i4, se actualiza R3 y se libera Rr3 isse encuentra en el 2° ciclo
RRF
ARF
a
ca
ap1
ap2
D
Datos
o o o o o a
ca
ap1
v1
ap2
Indice
Ocupado
Datos
Válido
Ocupado
O
RrO
150
1
O
Rr4
1
Rr1
155
1
O
155
Rr1
O
Rr2
-35
1
O
R3
- 175
Rr3
O
Rr3
-175
1
O
R4
40
O
Rr4
O
1
RO
5
R1
10
R2
v2
D
L
a
ca
ap1
v1 ap2
v2
o
L
I I I I I I I I I I I I I I I I I I C ic lo 6 (f inal): Finaliza i5, se publica su resultado (200) y su destino (Rr4)
RRF
ARF a
ca
ap1
ap2
o
Datos
O
RO
5
O
R1
10
O
R2
O
O
a
ca
ap1
v1
ap2
Indice
Ocupado
Datos
Válido
Ocupado
O
RrO
150
1
O
Rr4
1
Rr1
155
1
O
155
Rr1
O
Rr2
-35
1
O
R3
- 175
Rr3
O
Rr3
-175
1
O
R4
40
O
Rr4
200
1
1
v2
D
L
a
ca
ap1
v1
ap2
v2
o
L
I I I I I I I I I I I I I I I I I I Figura 2.42: [Continuación] Evoluc ión del procesamiento de instrucciones empleando RRF (continúa).
160
2.7. DISTRIBUCiÓN Ciclo 7 (inicio) : Termina 15, se actualiza R1 y se libera Rr4
ARF
o
CO
Op1
Op2
D
Datos
O
RO
5
O
R1
200
O
R2
O O
o
CO
Op1
v1
Op2
Indice
RRF O cupado
Datos
Válido
Ocupado
O
RrO
150
1
O
Rr4
O
Rr1
155
1
O
155
Rr1
O
Rr2
·35
1
O
R3
·175
Rr3
O
Rr3
·175
1
O
R4
40
O
Rr4
200
1
O
v2
D
LOCO
Op1
v1
Op2
v2
I I I I I I I I I I I I I I I I
D
L
I I
Figura 2.42: [Continuación] Evolución del procesamiento de in strucciones emp leando RRF.
por lo que se distribuye la i5. La distribución de i5 produce un tercer renombramiento de Rl, que ahora se renombra como Rr4 , con lo que ya todos los registros del RRF están en uso: cinco registros destino, cinco entradas del RRF. • Ciclo 3 (final). Finali za la ejecución de i3 y se publica su resultado (5-40 = -35) Yel identificador del registro destino (Rr2) en el buffer de reenvío. Esto provoca la actualización de Rr2 en el RRF: se copia el resultado en el campo Datos y se cambia el bit de Válido a l . Al mismo tiempo, en la entrada de la estación de reserva correspondiente a i4 se produce una coincidencia de operando con Rr2. Esto provoca que se reemplace en el campo Opl el identificador de Rr2 por el resultado publicado y se marque VI con l. Ahora i4 ya tiene los dos operandos disponibles por lo que cuando el planificador lo considere oportuno podrá emitirse. • Ciclo 4 (inicio). Tras finalizar su ejecución, la insu'ucción i3 termina por lo que deshace el renombramiento de Rr2 y lo libera. Observe que deshacer el renombramiento no tiene ninguna consecuencia en el ARP, ya que el Rr2 perdió su conexión con RI debido al renombramiento provocado por i 5 (al inicio del ciclo 3). Además, antes de liberarse, el valor de Rr2 se copió en las entradas en las que había coincidencia de identificador, esto es, en la entrada de la i4 (final del ciclo 3). También se produce la emi sión de i4 al quedar lista al final del ciclo anterior por disponibilidad de operandos y poder admitir la unidad de multiplicación/divisió n una segunda instrucción al encontrarse la instrucción i 1 en su segundo ciclo de procesamiento. • Ciclo 4 (fina l). Finali za el procesamiento de i 1 Y se publica su resultado (5 * 30 = 150) Y el identificador de su regi stro destino (Rrl\l) en el bus de reenvío. Esto provoca cambios en el RRF y en las estaciones de reserva. En el RRF se actualiza el registro Rrl\l con el resultado y se cambia su 161
INGENI ERíA DE COMPUTADORES 11
bit de validez a l . En las entradas de las estac iones de reserva en las que se produce coincidencia de operando con Rrlll se reempl aza el identificador por el resultado (150). Esto sucede únicamente en la i2 , que queda lista para ser emitida. • Ciclo 5 (inicio). Se produce la emi sión de i 2 a la un idad de suma/resta ya que está li bre. Al estar i4 en su segundo ciclo dentro de la unidad de multip licación/di visión, también se emite iS. Simultáneamente se produce la liberación de Rrlll al telminarse la instrucción i 1. Salvo el cambio del bit de Ocupado de I a O en la entrada de Rrlll en el RRF, su liberación no tiene ninguna otra consecuencia ya que su conexión con Rl se perdió tras el renombramiento de i3 (ciclo 2). • Ciclo 5 (final). Se produce la fin alización de i4, la publicac ión de su resultado (-35 • 5 = - 175) Y del identificador de su registro destino (Rr3 ). También fin ali za i2 y se pub lica su resultado ( 155) y el identificador de su destino (Rrl ). La consecuencia de estas dos fin ali zaciones es la actuali zación de las entradas de Rrl y Rr 3 en el RRF, tanto en lo que respecta a sus valores como a sus bits de ocupado. No hay coincidencias en las estaciones de reserva al no haber instrucciones pendientes de emisión. • Ciclo 6 (inicio). Termina la instrucción i2 , se actuali za R2 dado que el renombramiento con Rrl se enc uentra vigente, y tras la escritura diferida se libera Rr1. También termina i4 , actualizándose el valor de R3 y liberándose su registro de renombral1llento Rr3 . La instrucción iS se encuentra en la segunda etapa de la unidad de multiplicación/división. • Ciclo 6 (final) . Finaliza el procesamiento de iS lo que provoca la publicación de su resultado (40 . 5 = 200) Y el identifi cador de su registro destino (Rr4). Consecuencia de eUo es la actuali zación de la entrada de Rr4 en el RRF. • Ciclo 7 (inicio). Termina la instrucción iS , se actuali za el valor de Rl al permanecer vigente el renombramiento con Rr4 y se libera Rr4 . En el ejemplo anterior, pese a la ejecución fuera de orden, ni nguna dependencia de datos ha sido violada pero, sin embm'go, las instrucciones todavía terminan fuera de orden ya que no hay ningún mecanismo que reestablezca el orden original. Por ejemplo, la i3 termina antes que la i1. La operativa establecida por el renombrami ento de registros y las estaciones de reserva garanti zan el cum plimiento de todas las dependencias de datos pero si surgiese una excepción o interrupción no podría tratarse correctamente. Pm'a un correcto tratamiento de estas situac iones anómal as es necesario asegurar que el estado del procesador tras terminar una instrucción in sea el mismo que se tendría si todas las instrucciones anteriores a ella, in_l , in-2, etc. se hubiesen ejecutado orde nadamente una tras otra, incluida in. Una terminación desordenada viola esta condición. 162
2.8. TERMINACiÓN
2.8.
Terminación
Una vez que las instrucciones han completado su etapa de ejecución , estas quedan almacenadas en el buffer de reorclenumiento a la espera de su terminación arquitectónica. Formalmente, una instrucción
se considera terminada arq uitectónicamente cuando acntaliza el estado del procesador manteniendo la consistencia. Se dice que hay consistencia del procesador cuando las instru cciones concluyen su procesamiento e n e l mi smo orden secuenc ial en e l que se e ncüentran en el programa, es decir, en el mismo orden en que iniciaron su procesamie nto. El mantener la consistenc ia del programador es fundamental por dos razon es, íntimamente interrelacionadas:
• Para garantizar el resultado fi nal del programa, es dec ir, respetar la semántica del programa que viene definida por el orden secuencial de las instrucciones . • Para permitir un tratamiento correcto de las intelTupciones. Es necesario conocer con exactitud el estado e n que se encuentra el procesador antes de procesar una instrucción. Para todas aque llas instrucciones cuyo resultado fin al consiste en la escritura de un va lor en un registro arquitectónico (aritmé tico-lógicas, cargas desde memoria, tran sferenc ia e ntre registros, etc.), estar a la espera de su terminación arq uitectónica signifi ca que están a la espera de copiar en un registro arquitectónico el resultado temporal almacenado en un registro de renombramiento. Aunque no escriben en un registro arquitectóni co, las instrucc iones de almacenamiento necesitan pasar por una etapa más, la de retirada, que es cuando escriben sus resultados de forma ordenada en la D -caché. Las instrucc iones de almacenamiento cuando finali zan g uardan los datos a escribir en una parte reservada del buffer de almacenanuento, y cuando terminan ru'quitectónicamente pasan los valores a otra parte del buffer de alm acenamiento en espera de que se realice la escritura en memoria durante la etapa de retirada. Por lo tanto, hay que insistir en qne:
• Una instrucción ha finalizado cuando abandona la unidad funcional y queda a la espera en el buffer de terminación. • Una instrucción ha terminado cuando ha actualizado el estado de la máquina. Solamente se pueden terminar las instrucc iones que han fi nalizado y que no están marcadas como especulativas o como inválidas en el buffer de terminación. • Una instrucción se ha retirado c uando ha escrito su res ultado en la memoria, Este estado solo pueden akanzarlo las instrucciones de almacenruruento. Así, las instrucciones que no necesitan escribir en me moria son terminadas y retiradas al mismo tiempo,
La pieza clave que garantiza la consistencia del procesador es el buffer de reordenamiento o te rminación ya que gestiona la tenninación ordenada de todas las instrucc iones que están en vuelo. La terminación ordenada asegura que las interrupciones se puedan tratar correctamente. En el momento en que una instrucción fu erce una excepción o sufra una inte rrupción, el buffe r de reordenam.iento permitirá expul sar 163
INGENIERíA DE COMPUTADORES 11
del cauce todas las instrucciones posteriores sin que se actualicen los registros arquitectónicos y garanti zar la terminación ordenada de las anteliores. De esta form a, se puede guardar el estado del procesador en el instante previo a la ejecución de la instrucc ión que sufrió la anomalía (excepción o interrupción) para volver a reanudar su ejecución una vez la anomalía sea tratada. El buffer de reordenamiento es la pieza del procesador que pone fin a la ejecución fuera de orden de las instrucciones y forma el back-end de un procesador supe rescalar junto con la etapa de retirada. Este buffer es el elemento que decide cuándo los resultados almacenados temporalmente en el RRF tienen que escribirse en el ARF y una instrucción puede darse por concluida (salvo los almacenamientos). El buffer de reordenamiento es una estructura que mantiene entradas con el estado de todas y cada una de las instrucciones que hay en vuelo: instrucciones que se encuentran en las estaciones de reserva individuales a la espera de emisión, instrucciones en ejecución en las unidades funcion ales o instrucciones ya finali zadas a la espera de su terminación arquitectónica. La Figura 2.43.a muestra la composición de una entrada del buffer de reorde namiento con los campos más habituales si se considera que el RRF es una estructura independi ente. El significado de estos campos es el siguiente: • Ocupada (O): Es un campo de un bit que indica que la instrucción se ha distribuido. Permanece a I hasta que es tenrunada, momento en que se co loca a O. • Emitida (E): Campo de un bit que pasa a valer I cuando la instrucción inicia su ejecución en una urudad funcional. • Finalizada (F): Campo de un bit que indica que la instrucción ha salido de la unidad fun cional y espera ser tenninada arquitectóni camente. • Dirección (D ir): Campo que contiene la dirección de memoria de la instrucción como forma de identificarla. Aunque no se ha indicado explícitamente en las secciones previas, la dirección en memoria de una instrucción la acompaña a lo largo de toda la segmentación como etiqueta identificati va. De esta forma , se puede saber en qué estado de procesamiento se encuentra. • Registro de destino (Rd) : Es el identifi cador del registro de destino asociado a la instrucción. Se actualiza una vez que se tennine la instrucción para garantizar el correcto tratamiento de las excepciones. Se libera cuando no hay renombramientos pendientes. • Registro de renombramiento (Rr ): Es el identificador del registro de renombramiento asociado a la instrucción. De esta forma se sabe el registro de renombrarniento que hay que liberar en el RRF. • Especulativa (Es) : Campo que identifica a la instrucción como parte de una ruta especulativa. No se pueden terminar aquellas instrucciones marcadas como especulativas. • Validez (V): Campo de un bit para saber si la instrucción puede terminarse o hay que ignorarla y no reali zar acción alguna cuando le corresponda su terminación. Desde el instante en que la instrucción entra en el buffer de reordenamiento se considera válida. Sin embargo, posteriormente 164
2.8. TERMINACiÓN
la instrucción puede pasar a ser inválida si se trata de una instrucción especulativa cuya predicción se comprueba que es eITónea. Si el RRF fuese parte del buffer de termi nación habría que añadir a cada entrada los campos Dalas (D) y Validez de los dalOs (Vdatos) y eli minar el campo Rr ya que la propia entrada haría de registro de renomb ramiento. La Figura 2.43. b muestra el formato de una entrada para este tipo de organi zación del
IO I E
F
o: Ocupada
I Di, I Rd I R, IEs I V (a)
E:
Emitida
F:
Finalizada
Dir: Dirección de la instru cción
IO I E
F
Di,
Rd
D
Rd:
IVdatos IEs I vl
Rr: Registro de
V:
E
F
Dir
Rd
Rr
Es
Validez
Vdatos:
O
1
1
i"' l
1
1
1
i.
3
1
1
1
4
1
1
5
1
6
de Rd
o: Datos
V
o o 2
renombramienlo
Es: Especulativa
(b)
o
Registro de destino
R5
Rr5
O
1
Punlero de eola
RO
RrO
O
1
2
in' 1
Rl
Rrl
O
1
O
in' 1
-- -
--
O
1
1
1
in' 3
R2
Rr2
O
1
1
O
O
i~.•
R3
Rr3
O
1
7
1
1
O
in' 5
- --
-- -
O
1
8
1
O
O
in.'
Rl
Rr4
O
1
9
O
10
O
11
O
12
O
13
O
14
O
15
O
-
Validez de los dalos
Punlero de ca becera
9
(e)
Figura 2.43: Entradas y organización del buffer de reordena miento. 165
INGENI ERíA DE COMPUTADORES 11
buffer de terminación . A medida que la instrucción cambi a de etapa y avanza por la segmentación, su estado se modifica y con ello los bits de algunos campos. Si se unen los campos Ocupada , Emitida y Finalizada en un ünico campo de tres bits, denominado Estado, una instrucción pasará sucesivamente por las siguientes situaciones: • Estado = 100: Instrucc ión en espera de emi sión . • Estado = 110: Instrucción en ejecución. • Estado = 111: Instrucción pendiente de terminac ión. El funcionamiento de l buffer de terminación es similar al de una estructura de datos circular tipo anillo con un puntero de cola y un puntero de cabecera. La Figu ra 2.43.c muestra la organi zación del buffer de terminación y el estado de algunas instrucciones si se considera que el RRF es independiente. El puntero de cola apunta a la entrada de la siguiente instrucción a terminar una vez que su estado sea III y e l puntero de cabecera apunta a la siguiente entrada libre e n el buffer. Cada vez que una instrucción se distribuye, el puntero de cabecera se incrementa y se iniciali zan los campos de la entrada; análogamente el puntero de cola se incrementa cuando una instrucción se termina. Una vez que el puntero de cola o el de cabecera Uegan al final del buffer vuelven al comi enzo. Recuerde que para que una instrucción pueda distribuirse, entre otras condi ciones, debe existir una entrada libre en el buffer de reordenamiento. Por lo tanto, cuando una instrucción es terminada arquitectónicamente sucede lo sigui ente: • Su registro de renombram iento asoc iado Rr se libera (si lo tiene y e l RRF es una estructura independiente). • E l registro destino Rd se actuali za con el valor de su registro de renombramiento Rr asociado (el va lor se obtiene de l RRF o del propio buffer si e l RRF está integrado) y se libera si no tiene renombramientos pendientes. Una forma de saber que no hay renombramientos pendientes es comprobando que el contenido del campo Índice del Rd en el ARF coinc ide con el contenido del campo Rr que la instrucción ti ene en el buffer de terminación. Es decir, la instrucción terminada fue la ültima que provocó el renombrami ento del registro destino por lo que se puede liberar. • El campo OCl/pado se fija de nuevo a O. • E l puntero de cola se incrementa para ap untar a la siguiente instmcción a terminar. El nümero de instrucciones que pueden terminarse simultáneamente depende de la capac idad del procesador para transfe rir información desde e l RRF al ARF o desde el buffer de terminación al ARP. Así, el ancho de banda de terminación quedará establec ido por e l número de puertos de escritura del ARF y la capacidad de emutam iento de datos hacia e l ARF. Como minimo será necesari o di sponer de tantos puertos de escritura en e l ARF como instrucciones se qui eran terminru' por cic lo de re loj. La velocidad 166
2.8. TERMINACiÓN
Ciclo 2: Se distribuye i1 , i2, i3 e i4
o E F Dir o
Rd
Rr
Es
V
Puntero de cola
1
O
O
O
i1
R1
RrO
O
1
O
O
i2
R2
Rr1
O
1
2
1
O
O
i3
R1
Rr2
O
1
3
1
O
O
i4
R3
Rr3
O
1
1
Puntero de ca becera
4
4
Cic lo 3 (inicio): Se emiten i1 e ¡3. Se distribuye i5 Punlero de cabecera
o
E
F
Oir
Rd
Rr
Es
1
1
O
i1
R1
RrO
O
1
1
O
O
i2
R2
Rr1
O
1
2
1
1
O
i3
R1
Rr2
O
1
3
1
O
O
i4
R3
Rr3
O
1
4
1
O
O
i5
R1
Rr4
O
1
O
V
------.rGJ ~
Punlero de cola
Ciclo 3 (final): Finaliza 13
O
Puntero de cabecera
o
E
F
Dir
Rd
Rr
Es
1
1
O
i1
R1
RrO
O
1
O
1
V ~
1
O
O
i2
R2
Rr1
2
1
1
1
i3
R1
Rr2
O
1
3
1
O
O
i4
R3
Rr3
O
1
4
1
O
O
i5
R1
Rr4
O
1
~ Punlero de cola
Ciclo 4 (inicio): Se emite i4 Punlero de cabecera
o
E
F
Dir
Rd
Rr
Es
1
1
O
i1
R1
RrO
O
1
1
O
O
i2
R2
Rr1
O
1
2
1
1
1
i3
R1
Rr2
O
1
3
1
1
O
i4
R3
Rr3
O
1
4
1
O
O
i5
R1
Rr4
O
1
O
V~
~
Punlero de cola
Figura 2.44: Evolución del
bl1fl~e r
de lermin ación (con tinúa).
167
INGENIERíA DE COMPUTADORES 11
Ciclo 4 (final): Finaliza i1
o o 2
3 4
,
Punlero de cabecera
E
F
Dir
Rd
Rr
Es
1
1
i,
R'
RrO
O
O
O
i2
R2
Rr'
O
1
i3
R1
Rr2
O
1
O
i4
R3
Rr3
O
O
O
i5
R1
Rr4
O
, , , , ,
V ~
, ,~ , ,
Puntero de cola
,
Ciclo 5 (inicio): Termina i1 , se actualiza R1 y se libera RrO No se libera R1 porque tiene dos renombramientos pendientes (Rr2 y Rr4) Se libera la entrada i 1 del buffer. Se emiten i2 e i5
O
2 3 4
O
E
F
Dir
Rd
Rr
Es
O
1
1
i'
R'
RrO
O
, , ,
1
O
i2
R2
Rr'
O
1
,
i3
R1
Rr2
O
1
O
i4
R3
Rr3
O
1
O
i5
R1
Rr4
,
V
, ,
Puntero de cabecera
,
Puntero de eola
O
,
V
Punlero de cabecera
,-------O
~ ~
1
Cic lo 5 (fin al): Finalizan i2 e i4
O O
O 1
2
1
3
1
4
1
E
,
F
Dir
Rd
Rr
Es
,
1
i'
R'
RrO
O
, , ,
1
i2
R2
Rr'
O
1
i3
R'
Rr2
O
1
i4
R3
Rr3
O
R'
Rr4
O
O
i5
, , , ,
r-O
~
L--
Punlero de eola
1
Figura 2.44: [Con tinuación] Evolución del buffer de terminación (continúa).
168
2.8. TERMINACiÓN
Ciclo 6 (inicio) : Termina i2, se actualiza R2 y se libera Rr1 Termina ¡3, se actualiza R1 y se libera Rr2 No se libera R1 porque tiene un renombra miento pendiente (Rr4) Se liberan las entradas 1 y 2 del buffer
o
E
F
Di,
Rd
R,
Es
V
Punlero de cabecera
o o
1
1
i1
R1
RrO
O
1
O
R2
Rr1
O
1
O
1
1
i2
2
O
1
1
i3
R1
Rr2
O
1
3
1
1
1
i4
R3
Rr3
O
1
4
1
1
O
i5
R1
Rr4
O
1
Puntero de
cola
3
Cic lo 6 (final): Finaliza iS
O
o
E
F
Di,
Rd
R,
Es
V
Punlero de cabecera
O
1
1
i1
R1
RrO
O
1
O
R2
Rr1
O
1
O
1
1
i2
2
O
1
1
i3
R1
Rr2
O
1
Puntero de cola
3
1
1
1
i4
R3
Rr3
O
1
3
4
1
1
1
i5
R1
Rr4
O
1
Ciclo 7 (inicio): Termina i4, se actualiza R3 y se libera Rr3 Termina ¡5, se actualiza R1 y se libera Rr4 Se liberan las entradas 3 y 4 del buffer
o
E
F
D·
Rd
R
,
ES
V
O
1
1
i1
R1
RrO
O
1
O
1
1
i2
R2
Rr1
O
1
2
O
1
1
i3
R1
Rr2
O
1
3
O
1
1
i4
R3
Rr3
O
1
4
O
1
1
i5
R1
Rr4
O
1
O
"
Punlero de cabecera ~
O O
Puntero de cola
Figura 2.44: [Continu ac ión] Evoluc ión del buffer de terminación.
169
INGENIERíA DE COMPUTADORES 11
pico del procesador se puede estimar multiplicando el máximo número de instrucciones telminadas por ciclo por la frecuencia del procesador Vp;co =
Máx. instrucciones terminadas por ciclo
* Frecuencia procesador
Antes de analizar la etapa de retirada, se va a estudiar el ejemplo de la Figura 2.4 1 pero ya aplicando el mecanismo de terminación ordenada que establece el buffer de reordenamiento. El código que se procesa en el ejemplo es: i1: i2: i3: i4: i5:
MULT ADD SUB MULT MULT
R1,R~,R3 R2,R1,R~ R1,R~,R4 R3,R1,R~
R1,R4,R~
y el núcleo de procesamiento mantiene las nusmas condiciones que para la Figura 2.42 con la salvedad de que ahora dispone de un buffer de terminación un ancho de banda de 2 instrucciones/ciclo. Comparando los comentarios de las Figuras 2.42 y 2.44 podrá apreciar que la única diferencia viene dada por la variac ión de la secuencia de terminación. En este ejemplo las instrucciones ya no terminan en el ciclo siguiente a su fin aLización, sino que deben esperar a que les toque su turno que viene establecido por el buffer de terminación. Observe que cuando una entrada del buffer se libera, se mantiene la información en los campos aunque ya no sea válida. Cuando una nueva instrucción se di stribuya, su estado sobresclibirá la información correspondiente a la instrucción que hubiese ocupado esa entrada previamente.
2.9.
Retirada
La etapa de retirada, ubicada tras la etapa de terminac ión, es exclusiva de las instrucciones de almacenamiento y es donde estas reaLi zan el acceso a memoria para la escritura de sus resultados. El objetivo de esta etapa para con los almacenamientos es el mismo que el de la etapa de ternunaci ón para con las instrucciones que escriben en registros: garantizar la consistencia de memoria, es decir, que las instrucciones de almacenamiento se completen en el orden establecido por el programa. En pocas palabras, evil
2.9. RETIRADA
El primer paso, la generac ión de la dirección de memoria, implica acceder al registro base para leer su valor y sumar este valor al desplazamiento. El desplazamiento es un valor entero que se almacena en un campo del formato de la propia instrucción. Las instrucciones de almacenamiento
además deben extraer del registro fue nte el valor a alm acenar. Al igual que las demás instrucciones, las de carga/almacenam iento también sufren el renombrado de sus registros y las esperas en la estaciones de reserva hasta que sus operandos estén di sponibles. Una vez que se di spone de la dirección de memoria, hay que realizar la traducción de memoria virtual a memoria principal. Si el procesador utiliza el modo de direccionamiento real no es necesario realizar este paso ya que e l espac io de direcciones que maneja el procesador se corresponde con el espacio de diTecciones que proporciona la memoria física.
La traducción se realiza consultando la TLB (Translation Lookaside Buffer - Buffer de Traducción Adelantada), que es donde se mantienen las equivalencias entre direcciones virtual es y d ireccio nes físicas. Si al reali zar e l acceso a la TLB , la dirección virtual se encuentra mapeada en la memoria física , la TLB devuelve la dirección fís ica y el acceso se reali zará con normalidad. Si la dirección virtual no se encuentra e n memoria principal, se produce un fallo de página que da pie al levantamiento de una excepción detallo de pógina. Esta excepción es gestionada por el sistema operativo ya que el copiar una página desde los discos duros a la memoria principal consume cientos de miles de ciclos de reloj , lo que obliga al sistema operativo a suspender la ej ecución del proceso que ba provocado la excepción y entregar el procesador a otro proceso hasta que la copia de la página concl uya. Recuperada la página y el estado del procesador previo a la instrucc ión que provocó la excepción , la instrucción de carga/almacenamiento puede volver a emitirse ya que ahora hay seguridad de que no se producirá un fall o de página . Para más detalles sobre el funcionamiento de la memori a virtual, consulte el Apéndice A. En este mismo paso, una vez traducida la dirección se coloca en el bus de direcciones para tener el dato disponible en el siguiente ciclo.
Realizada la traducc ión y el envío de la dirección a la caché de datos, el paso final de una instrucción de carga/almacenamiento es la lectura/escritura de/en memOlia. Es en este paso cuando el procesami ento de las instrucciones de carga y almacenamiento difiere. Las instrucciones de carga realizan los tres pasos en la etapa de ejecución mientras que las instrucc iones de almacenamiento dejan el acceso a memoria
para la etapa de retirada. Al llegar una in strucc ión de carga/almace namien to al tercer paso, no debe producirse ningún fal lo de página ya que la posición de memoria en la que leer/esc ribiJ" ti ene que estar ubi cada en la O-caché o en la memoria física. Si el dato se encuentra en la O-caché, la lectura por parte de la instrucción de carga consume un ciclo de reloj . Si el dato no está, se produce un fallo ele lectura y la instrucción de carga queda detenida en la segmentación hasta que el fallo se resuelva. U na vez que la in strucción ha recuperado el dato, lo coloca en el bus de reenvío junto con el identifi cador del registro destino del RRF para que se actuali cen el.RRF (o la entrada del buffer de terminación si el RRF es parte de él) y las entradas de las estaciones de reserva ind ivid uales que detecten coincidencia de operandos. En la etapa de terminación se realiza la actualización del correspondiente registro ARF, tal y como sucede con cualquier otra instrucción para garan tizar el tratmniento correcto de las interrupciones. Las instru cciones de almacenami ento acceden a memoria en la etapa de retirada , para dar mayor
ptiOlidad al acceso de las instrucciones de carga a la O-caché. Por esta razón, los almacenami entos 171
INGENI ERíA DE COMPUTADORES 11
se consideran finali zados tras reali zar solo dos pasos de la etapa de ejecución, y no tres como las cargas . Una vez que una instrucción de almacenamiento es final izada, el dato a escribir y la dirección de memoria se guardan en la entrada que a la instrucción se le asigna en el buffer de alm acenamiento, y en esa misma entrada se marca la instrucción como finalizada. Esta actualización del buffer de almacenamiento se reali za al mismo tiempo que la actualización del buffer de reordenamiento, es decir, están sincroni zados. Cuando la instrucción es terminada por mandato del buffer de reordenamiento, la instrucción de almacenamiento se marca en e l buffer de almacenamiento como term inada, quedando lista
Estación de reserva individual
Unidad funcional de carga I almacenamiento
Paso 1: Cálculo de la dirección - - - - - - - - - - - - - - - - - - - - - - - - - - - --- - ---- - ------
Paso 2: Traducción de la dirección
---------------------- - ------------------_. Paso 3: Acceso a memoria
(.---
(solo cargas)
~
. .. ~
Solo almacenamientos
.¡j
I
I
(finalizados)
j I
~
o
Buffer de almacenamiento
Buffer de reordenamiento
I
~
u
~
u e
·0
·0 u
e
i5
I
j
Terminación
.¡j
Caché de datos
I
$010 almacenamientos
Buffer de almacenamiento (terminados)
I
Retirada
I I
Dirección de escritura + Dato de escritura
Figura 2.4S: Organi zación de la etapa de ejecución y del back-end de la segmentación para el procesamiento diferenciado de las instrucciones de carga y almacenamiento.
172
2.9. RETIRADA
para escribir en memoria en cuanto el bus de acceso esté libre. La Figura 2.45 muestra un esquema de los pasos de ejecución de las instrucciones de carga y almacenamiento. En el esquema se ha recunido a un buffer de almacenamiento para las instrucc iones finali zadas y otro para las tenninadas aunque en realidad se puede utilizar uno único con solo añadir un campo de un bit para diferenciar entre el estado finali zado y el terminado. La escritura diferida por parte de una instrucción de almacenamiento tras el abandono del buffer de reordenamiento evita una actualización errónea y precipitada de la melIlOlia. Suponga que en el ejempl o de la Figura 2.46 la escritura en memoria de i 3 se ha reali zado en la etapa de ejecución y la instrucción i2 . previa a i3 en el orden del programa pero posterior en su ejecución, provoca una excepción . El tratamiento de la excepción obliga a vaci ar el cauce, anul ar el procesamiento de todas las instrucc iones situadas después en el orden del programa (lo que incluye el almacenamiento i3), y así poder guardar el estado de la máquina en el momento previo a la ejecución de la instrucción que forzó la excepción , la i 2. Una situación como la anterior obligalÍa a acceder a la memoria para deshacer el alInacenamiento anticipado de i 3, con el consiguiente gasto en ciclos de reloj que ello conllevaría. Posteriormente, se abordará con más detalle el tratamiento de las interrupciones y excepciones. Al igual que las restantes instrucciones, una inst.rucción de almacenami ento puede estar marcada como especulativa en el buffer de reordenamiento. Por ello, si se produce una predi cción incorrecta, la instrucción de almacenamiento se invalida en el buffer de reordenamiento y se purga del buffer de alm ace namiento. Como nunca se pueden terminar las instrucciones especulativas, no existe el problema de que existan instrucciones marcadas como terminadas en el buffer de a~nacenamiento . Si están marcadas como terminadas, es que no son especulativas. Si en un instante dado una instrucción que está ejecutándose produce una excepción, las instrucciones de almacenamiento marcadas como terminadas en el buffer de almacenamiento deben retirarse en orden i1 : MULT R1, R1, R1
11 Terminada
i2: DI V
R2, R1, RO
11 Lanza una excepción: división por cero
i3: SD
100(R5 ), RO
11 Terminada con escritura en memoria del contenido de RO
i4:
O
2
o
E
F
Di ,
Rr
Es
V
O
1
1
;1
Rr1
O
1
1
1
O
;2
Rr2
O
1
1
1
1
;3
RrO
O
1
3
Punlero de cola
~
Puntero de cabecera
Buffer de reordenamienlo
Figura 2.46: Ejemplo de situac ión anómala si la escritura en memoria se realizase en la fase de ejecución y se produjese una excepción .
173
INGENIERíA DE COMPUTADORES 11
para asegu rar la consistenc ia de memoria. Las instrucciones de almacenamiento que estén marcadas como finali zadas pero que sean anteriores a la instrucción que lanzó la excepción también se terminarán y retirarán en orden. Las que sean posteriores, se elintinarán de todos los buffers en que se encuentren. Como colofón a este apartado, hay que comprender que el orden en la terminac ión y retirada de las instrucciones de carga/almacenantiento garantiza las depen dencias de memoria tipo WAR y WAW. Los riesgos de memoria WAW se ev itan, claramente, mediante e l buffer de almacenantiento que asegura que las escrituras en la D-caché se realizan respetando el orden en que aparecen en el programa. Los riesgos de memoria WAR se ev itan gracias a que una in strucc ión de a lm acenamiento posteri or a una carga en el orden del programa, nunca podrá escri bir antes que la carga ya que lo evita la escritura diferi da: aunque e l a lmacenamiento vaya por delante en el cauce, no podrá escribir hasta después de que la carga termine, y ésta, llegada a ese punto, ya habrá le ído su operando de la memoria.
2.10.
Mejoras en el procesamiento de las instrucciones de carga/almacenamiento
E n los múltiples análisis realizados por investigadores y di se ñadores de computadores al código que se ejecuta en los procesadores, se ha observado que hay instrucciones de carga que escriben en un registro que constituye e l pu nto de arra nque crítico para un conjunto de instmcciones aritméticológicas que dependen, directa o indirectamente, de ese operando. Por esa razón, una mejora notable en e l rendintiento de los procesadores superesca lares se obtiene permiti endo que esas instmcciones de carga terminen antes que otras instrucciones, sin que se violen dependencias RAW tanto de datos como de memoria. La lectura adelantada del dato por la carga perntite que todas las instrucc iones aritméticológicas dependientes de ella, directa o indirectamente, tengan el camino libre para su ejecución. Otro mecani smo que mejora ligeramente el rendimi ento de un procesador es el reenvío de datos desde una instrucción de almacenam iento hac ia una de carga que tengan operandos destino y fue nte comunes, respectivamente. La aplicación de esta técni ca perntite que la carga no necesite acceder a la D-caché para su lectura ya que el almacenamiento le reenviará e l dato directamente. E l término anglosajón con que se de fine esta técnica es load-and-store fo n vanling. Tanto la tenninación adelantada de las cargas como el reenvío son dos técnicas que se pueden aplicar simultáneamente. En la Figura 2.47 se puede apreciar la razón de ello. S i una carga se puede terminar antes que un almacenam iento es porque no hay dependencia de memoria RAW entre ellas (acceden a direcciones diferentes), y si no se puede es porque ex iste dependencia de memori a RAW (acceden a direcciones iguales) y el almacenamiento puede pasar el dato a la carga ahorrando a esta un acceso a memori a.
2.10.1. Reenvío de datos entre instrucciones de almacenamiento y de carga El reenv ío se puede rea lizar cuando existe una dependencia de memoria RAW e ntre un a instrucción de almacenamiento (productora) y una instrucción de carga (consumidora). Para poder realizar el 174
2.10. MEJORAS EN EL PROCESAMIENTO DE LAS INSTRUCCIONES DE CARGA/ALMACENAMIENTO
SD : O(Ry).: R1 L
_
_
_'
,- - - - ,
Los operandos destino y fuente
SO :O(Rz),: R2
son diferentes (no RAW)
,
,
LO R3 ,; O(Rx) :
(a) Situación que permite terminar una ca rga sin que terminen los adelantamientos
Los operandos destino y fuente son iguales (hay RAW)
(b) Situación que permite que una instrucción de almacenamiento transfiera un dato a una carga pa ra evi tar el acceso a la caché de datos
Figura 2.47: Esque mas de adelantamie nto y reenvío de datos entre instrucc iones de carga y alm acenamien to.
reenvío es necesario comprobar que las direcciones de memoria de una instrucción de carga y de los almacenamie ntos pendie ntes sean coi ncidentes. Se pretende evitar que la carga acceda a la D-caché para leer la misma posición de memoria que va a escribir algunos de los almacenamientos que todavía están pendientes de retirarse. Es decir, el dato que neces ita la carga está en un registro del procesador y no hay que ir a la memoria para obtenerlo. Los riesgos de datos RAW se resuelven en las estacio nes de reserva pero, sin embargo, los riesgos de memoria RAW todavía no han sido tratados y son los que hay que anali zar para reenviar datos y adelantar cargas. Examine con detalle el siguiente fragmento de código i 1:
SD
i 2 : LD
1 ~~CR2) , R1
% i'lem[1 IiIIiI+R2] <= Rl
R 3,5~C R 4)
% R3 <= i'lem[51i1+R4]
En principi o, las direcc iones de memoria de i 1 e i 2 son diferentes y no sería correcto reenviar el contenido de Rl a R3, ya que, aparentemente, no hay depe ndencia de memoria RAW entre i 1 e i 2. El problema es que la coincidencia de direcciones no es pos ible conocerla cuando las instrucciones se encuentran e n la estaciones de reserva. Por ello la comprobación de coincidencias se realiza una vez que las instrucciones de carga y almace namiento han sido emitidas y finali zadas/termi nadas, respecti vamente. 175
INGENIERíA DE COMPUTADORES 11 Paso 1: Cálculo de dirección Paso 2: Traducción de dirección
Estación de reserva individual
Paso 3: Acceso a memoria
Unidad funcional de carga
Unidad funcional de almacenamiento
Paso 1
Dirección de lectura
------- Paso 2
Paso 1
-------- ,
Paso 2 --------
Paso 3
Dalos de
Datos
Dirección
f.--. f.--.
Buffer de almacenamiento (finalizadas)
leclura
f'-'-..
Direedones de Iectura
i---f-------Caché de datos
¿=? Dalos
Dirección
f-------f--------
Buffer de
almacenamiento (terminadas) Rd2
l Rd1
wd
Direcciones de escritura
t::l--(
Dalasde
eseri tura
I I
1 O ¿Hay coincidencia?
1
MUX
sl:o NO: 1
Al bus de reenvio para actualizar las estaciones de reserva y los registros de renombramienlo
Figura 2.48: Esquema de reenvío de datos entre cargas y almacenam ientos en el que se contempla la emisión ordenada de las cargas y los almacenamientos.
En el ejemplo anterior, si R2= 50 Y R4= lOO, las dos direcciones de memoria serían igua les, M[1 51\lJ , y surgida una dependenc ia de memoria tipo RAW. La situación entre il e i2 se denomina dependencia ambigua y es propia de las instrucciones de carga/almacenamiento. La Figura 2.48 muestra UD esquema que permite realizar el reenvío de datos y resolver las dependencias ambiguas. En el esquema hay una unidad funcional de carga y otra de almacenamiento, 176
2.10. MEJORAS EN EL PROCESAMIENTO DE LAS INSTRUCCIONES DE CARGA/ALMACENAMIENTO
ambas atendidas por la misma estación de reserva individual que garantiza la emisión de las instrucciones en orden . Esto asegura que todos los almacenamientos precedentes a una carga ya se encontrarán en el buffer de almacenamiento en espera de tenmnación o retirada al ejecutarse la carga. De acuerdo con el esquema de la figura, cuando una carga ya ha traducido la dirección de memoria virtual en dir'ección física (paso 2), se exami na el campo Dirección de las entradas ocupadas en el buffer de almacenamiento, ya estén las entradas marcadas como finalizadas o terminadas, en busca de una coincidencia con la dirección de la instrucción de carga. En este momento ya se ha eliminado la ambigüedad de las dependencias puesto que los almacenamientos y la carga ya han calculado y traducido sus direcciones de acceso a memoria. En el proceso de búsqueda de direcciones coincidentes pueden plantearse dos situaciones: • Hay coincidencia (hay una dependencia de memoria RAW): Existe en el buffer de almacenamiento una instrucción que va a escribir un dato en la misma posición de memmia que la carga tiene que leer. El valor que hay en el campo Datos de la entrada que presenta la coi ncidencia se coloca en el bus de reenvío junto con el identificador del registro destino RRF de la carga. La carga no necesita acceder a la D-caché . • No hay coincidencia (no hay dependencia de memoria RAW): Se realiza el acceso a la caché de datos de fmma nonna!. Un problema que puede surgir' es la aparición de una carga que presenta varias coincidencias en el buffer de almacenamiento. En ese caso, el procesador debe contar con el hardware adecuado para saber cuál es el almacenamiento más reciente, que es el que hay que utili zar como dato. Para ello es necesario mantener los almacenamientos ordenados según su orden de llegada y utilizar codificadores con primidades para utilizar la dirección más reciente en caso de múltiples coincidencias. Otro aspecto a considerar es el número de puertos necesarios en el buffer de almacenamiento para la lectura de datos. Hasta ahora era necesario un único puerto de lectura (Rd) para enviar los datos a la caché y un puerto de escritura (Wd) para introducir los datos tras la finalización de los almacenamientos. Pero con el reenvío puede ocurrir' que una carga lea el dato en el mismo ciclo de reloj en que se envía el dato a la caché para su escritura, ocurriendo un bloqueo. Es necesario un segundo puerto de lectura para garanti zar la ausencia de bloqueos. En el esquema de la Figura 2.48 se recoge la ex istencia de dos puertos de lectura de datos (Rdl, Rd2).
2.10.2.
Terminación adelantada de las instrucciones de carga
El adelantamiento de las instrucciones aritmético-lógicas respetando las dependencias de datos ya se realiza gracias a los mecanismos con que cuentan los procesadores superescalares: vru1as unidades
funcionales, renombrado de registros, estaciones de reserva individuales, etc. Sin embargo, adelantar la ejecución de una instrucción de carga frente a varias instrucciones de almacenamiento es más compli cado ya que es necesario comprobar que las direcciones de memolia que manejan no son iguales. Es decir, hay que comprobar la ausencia de dependencias de memoria RAW teniendo en cuenta la problemática de las dependencias ambiguas. 177
INGENIERíA DE COMPUTADORES 11
-
Al igual que en el caso anterior, suponga que las instrucciones de carga/almacenamiento fuesen
emitidas en orden por la estac ión de reserva a las unidades funcionales de carga y alm acenamiento. La carga, mientras que reali za el acceso a la caché de datos (tercer paso), podría comprobar la coincidencia de su dirección en el campo Dirección de las entradas del buffer de almacenamiento. Dos son las posibles situaciones que se podrían presentar:
• Hay coincidencia de direcciones (dependencia de memori a RAW): No se puede adelantar la carga. El dato recuperado por la carga de la D-caché se descarta y se utiliza el dato del almacenamiento coincidente (se produce un reenvío de datos). • No hay coincidencia de direcciones (no hay dependencia RAW): E l dato recuperado de la D-caché es válido y se puede almacenar en su regisb'o destino. La carga puede finali zar y terminarse, aunque no lo hayan hecho los almacenamientos (se produce un adelantamiento). La emisión ordenada de las instrucciones de carga/alm acenamiento se utiliza en algunos procesadores ya que reduce la complejidad del hardware que es necesario para resolver las dependencias ambiguas. Pero esta aproximación ofrece un menor rendimiento que si se pelm itiese una ejecución desordenada de estas instrucciones por lo que es deseable perm itir el adelantamiento de cargas con emisión fuera de orden. Una técnica utilizada para real izar el adelantamiento de cargas permitiendo una emisión desordenada de las cargas y de los almacenamientos se basa en el empleo de un bujIer de cargas finalizadas. La Figura 2.49 muestra un esquema con el buffer de cargas en el que la estación de reserva individual emite fuera de orden las instrucciones de carga y de almacenamiento. La idea de esta técnica se basa en permitir que, cuando sea posible, las cargas se ejecuten de forma especulativa sin comprobar la ex istencia de dependencias ambiguas. Las cargas cuando ll egan al segundo paso de su unidad funcional comprueban la existencia de coincidencias de dirección con los almacenamientos que, en ese instante, se encuentren en el bu ffer de almacenamiento. Se plantean dos situaciones : • No hay coincidencia: Se permite que la carga continúe normalmente ya que no hay ningún tipo de dependencia de memoria RAW. • Hay coi ncidencia: Hay una dependencia de memoria RAW con un almacenamiento. Se anula la carga y todas las instrucciones posteriores para su emisión posterior. No se reenvían datos ya que pueden quedar almacenamientos anteri ores pendientes de ejecución. Tras fina li zar, las cargas quedan almacenadas en el bufrer de cargas finalizadas. Ll egados a este punto, se ha comprobado que las cargas no dependen de los almacenamientos que están en el buffer de almacenamiento. Quedan pendientes los almacenamientos que no conocen sus direcciones de acceso a memoria, estos son los pendientes de em isión que se encuentran en las estaciones de reserva individuales y los que hay en ejecución. C uando una insb'ucción de almacenamiento termina tiene que comprobar la existencia de una coi ncidencia con las cargas que estén en el buffer de cargas finalizadas. Pueden darse dos si tuaciones: 178
2.10. MEJORAS EN EL PROCESAMIENTO DE LAS INSTRUCCIONES DE CARGA/ALMACENAMIENTO Paso 1: Cálculo de dirección
Estación de reserva
Paso 2: Traducción de dirección
individual
Paso 3: Acceso a memoria
1 Unidad funcional
U nidad funcional de almacenamiento
de carga
Paso 1
Paso 1
Dirección de lectura
----- ---
- ------ Paso 2
Paso 2
- - - --- - Paso 3
"-
Dirección
Datos
f-¡---. ¡---. ¡---.
Buffer de almacenamiento (finalizadas)
Datos de lectura
Si hay coincidencia: anular carga e instrucciones posteriores
Caché de datos
¿=? Dalos
Dire edones de Iectura
Dirección
¡---.
Buffer de almacenamiento (terminadas )
r---
¡---. f--
Direcciones de escritura
/
Dato s de eseritura
I Dirección de almacenamiento
Datos
-Si hay coincidencia:
a nular carga e instrucciones posleriores
~
¿=?
Buffer de cargas Dir. memoria
Oir. memoria + Id. inslr. Id. instrucción
Al bus de reenvlo para actualizar las estaciones de reserva y los registros de renombramiento
'----Figura 2.49: Esquema para realizar el adelantamiento de las cargas permitiendo la emisión fu era de orden de las cargas y los almacenamiento .
• Hay coincidencia: Esto significa que una instrucción de carga que depende del almacenamiento se ha ejecutado de forma especulativa. Se ha violado una dependencia RAW de memoria ya que la carga ha leído el dato antes de que el almacenamiento lo escribiese. Hay que invalidar esa carga y todas las instrucciones posteriores a ell a para su posterior emisión. Observe que esta técnica de adelantamiento de cargas especulativas no es compatible con el reenvío descrito en el apartado anterior. El campo Id. Instrucción permite identifi car la instrucc ión de carga coincidente 179
INGENI ERíA DE COMPUTADORES 11
y utilizar el identificador para acceder al buffer de reordenamiento y e liminarla a e lla y a todas las posteriores. • No hay coincidencia: La carga y todas las instrucciones posteriores a ella pueden terminarse ya que no hay ningún tipo de dependencia entre el almacenamiento y la carga.
2.11.
Tratamiento de interrupciones
Dada la naturaleza de los procesadores superescalares, el tratamiento de las interrupciones es más complicado que en un procesador con un único cauce segmentado. Ello se debe a que la ejecución de instrucciones fuera de orden en un procesador superescalar puede modificar e l estado de un proceso (programa en ejecución) en un orden diferente al que se obtendría en una ejecución secuencial. Cuando se produce una interrupción, el estado del proceso intenumpido es, por lo general, guardado por el hardware, el software o una combinación de ambos. E l estado del procesador está definido por el contador de programa, los registros arquitectónicos y el espacio de me moria asignado. Si un procesador es capaz de tratar las interrupciones de form a que se respeten las condiciones previas se dice que el procesador tiene precisión de excepción o que manej a interrupciones precisas. Si no se cumple, se dice que las interrupciones son imprecisas . Resumiendo, para poder tener interrupciones precisas es necesario que el procesador mantenga su estado y el de la memoria de forma análoga a como si las instrucciones se ejecutasen en orden y una tras otra (como en los procesadores originales de 8 bits). El estado del procesador debe evolucionar secuencial mente cuando una instrucción termina con independencia de que, previamente, se haya ejecutado fuera de orden. Es habitual clasificar las intenupciones en dos grandes grupos:
• Interrupciones externas producidas por eventos externos a la ejecución del programa (operación de E/S por un di spositivo externo, cambio de contexto, malfunción hardware, fallos de potencia, etc.) Una estrategia habitual de actuación consiste en detener la lectura de nuevas instrucciones, vaciar el cauce terminando arquitectónicamente las instrucciones ya ex istentes y guardar el estado en que quedó el procesador tras telTl1inar la instrucción previa a la que fue intelTUmpida. Una vez que el sistema operativo haya reali zado el tratamiento de la inten·upción, se podrá recuperar el estado del procesador y continuar con la ejecución del programa a partir de la última instrucción que se terminó. • Excepciones, interrupciones de programa o traps causadas, en general , en la etapa IF o por las instrucciones del programa en ejec ución. Los ejemplos más conocidos son los elTores numéricos (div isiones por cero, desbordamientos aritméticos), aunque no hay que olvidar los fallos de página en el sistema de memori a viltual tanto para instrucciones como datos. El tratamiento de las excepciones es similar al de las interrupciones externas aunque en algunos tipos de excepción no se considera la reanudación del programa como, por ejemplo, las divisiones por cero o algunos desbordamientos. Incluso en estas situaciones, en las que el programa no se reanuda, el estado 180
2.11. TRATAMIENTO DE INTERRUPCIONES
Tabla 2.1 : Clasificac ión de las interrupc iones del PowerPC 970. S íNCRONA/AsÍNCRONA
PREClSA/IMPRECISA
TIPOS DE INTERRUPCiÓN
Asíncrona, no enmascarab le Asíncro na, e nmascarab le
Imprecisa Precisa
Reinicialización del computador, test de la máqui na. Interrupc ión ex terna , excepció n térmica, excepción de
Síncrona
Precisa
mantenimiento.
Excepciones ca usadas por in stru ccio nes.
del procesador se puede almacenar para tareas de depuración (debugg ing) que permitan conocer y analizar las causas del problema. Las técnicas para el u'atamiento de intenupciones en un procesador que permite ejecución fuera de orden se pueden agrupar en cuatro categorías: • Ignorar el problema y no garantizar la precisión de excepción. Muy utilizada en los años 60 y principios de Los 70, y todavía empleada por algunos supercomputadores que no permiten ciertas interrupciones o si lo son se tratan vía hardware sin detener la ejecución del proceso. • Permitir que las interrupciones sean "algo" imprecisas pero guardando suficiente información para que la rutina de tratamiento software pueda recrear una secuencia precisa para recuperarse de la interrupción.
• Permitir que una instrucción sea emitida solo cuando se está seguro de que las instrucciones que la preceden terminarán sin causar ninguna interrupción. • Mantener los resultados de las operaciones en un buffer de almacenami ento temporal hasta que todas las operaciones previas hayan terminado correctamente y se puedan actualizar los registros arq uitectónicos sin ningún tipo de riesgo. Entre estas técnicas se encuentran el buffer de historia (histO I}1 buffer) y el ficbero de futuro (fufure file). Esta forma de tratar las excepciones ha ido adaptándose a la evolución que han experimentado los procesadores superescalares hasta llegar al mecanismo actual basado en la combinación del renombramiento de registros, las estaciones de reserva y el buffer de terminación. A continuación, se describen con más detalle las técnicas pertenecientes a esta categoría. Por ejemplo, en el procesador PowerPC 970 las interrupciones pueden ser precisas o imprecisas y síncronas o asíncronas. Por asíncronas se entiende que pueden aparecer en cualquier momento ya que son causadas por eventos externos a la ejecución del procesador y por enmascarables que pueden deshabilitarse por parte del programador. La Tabla 2. 1 presenta una clasificación de algunas de las intenupciones de este procesador.
La precisión de excepción basada en un almacenamiento temporal de los resultados se ideó a mediados de los 80, cuando los resultados se mantenían provisionalmente en el buffer de terminación y 181
INGENIERíA DE COMPUTADORES 11
Valor de registros fuente
ARF
Unidades funcionales
.,,
Valor de registro destino
Si hay interrupción:
,,
Buffer de historia
Resultados
(a) Procesamiento de interrupciones precisas basado en el buffer de historia
o: Ocupada E: Emitida F: Finalizada
F
Dir
Rd
Vp
Dir: Dirección de la instrucción
Int
Rd : Registro de destino Vp: Valor previo
Int: Interrupción (b) Entrada del buffer de historia
Operandos fuente Fichero de futuro
Resultados
Unidades funcionales
t
,, , Si hay inte rrupción : ,, ,
G
Resultados
Buffer de terminación
(c) Procesamiento de interrupciones precisas basado en fichero de futuro
Figura 2.50: Esquemas para el mantenüniento de interrupciones precisas.
182
2.11. TRATAMIENTO DE INTERRUPCIONES
desde alli se copiaba n al ARF y se adelantaban a las unidades funcionales cuando existían dependencias RAW. El control se realizaba mediante una estructura denominada Result Shift Register (RSR) que garantizaba una emisión y terminación ordenada de las instrucciones. Para lograr la precisión de excepción se diseñaron dos técnicas: el bufrer de historia y el fichero de futuro. Para entender correctamente el func ionamiento de ambas técnicas hay que considerar que cuando se idearon, la emisión y terminación de instrucciones era individual y no se disponía de renombrado de registros, ni de estac iones de reserva. Durante 1983 y 1984 ya se utilizaba el ténnino superescalar pero todavía la decodificación y emisió n de múltiples instrucciones era un tema en pura efervescencia. La primera de las dos técnicas se basa en utilizar un buffer de historia, muy similar en su estructura y funcionamiento al buffer de reordenamiento, ya que permite una terminación desordenada de las instrucc iones (Figura 2.50.a). La diferencia radi ca en que en sus eno'adas (Figura 2.50.b) se almacena el valor de los registros destino al comienzo de la ejec ución de las instrucciones (campo Vp), no al finali zar. De esta forma , cuando una inso'ucción es interrumpida, parte del contenido del ARF se recupera de la in formación mantenida en las entradas del bufrer de hi storia que corresponden a la instrucción interrumpida y a las posteriores. Así, si una instrucción hubiese finalizado antes que la interrumpida pese a ser posterior en el orden secuencial, el estado de su registro destino se sacaría del campo Vp de su entrada en el buffer de historia y se copiaría en el ARF. De esta forma el registro quedaría en el estado previo a cuando comenzó el procesamiento de la instrucción interrumpida. La segunda técnica combina un fichero de registros de futuro con el buffer de reordenamiento (Figura 2.50.c). Los operandos fue nte se leen del fichero de futuro y al finalizar las instrucciones los resultados se escriben en dos ubicaciones: en el fichero de futuro y en el buffer de tenninación. Cuando las instrucciones terminan, el ARF se actualiza con la información del buffer de terminación. Si una instrucción es interrumpida, el fi chero de futuro recupera los valores originales de los registros destino de la instrucción interrumpida y de las posteriores desde el ARF. La Figura 2.5 I presenta un ejemplo de aplicación de la técnica del buffer de historia para gestionar de forma precisa una interrupción que aparece durante la ejecución de la instrucción i4. La secuencia de cód igo está formada por 6 instrucciones que lo único que hacen es multiplicar por 100 el contenido de su registro destino:
i 1 : MULTI Rl,Rl,#l®® i2: MULTI R2,R2,#1®®
B: MULTI
R3,R3,#1~~
i4: MULTI R4 ,R4 ,#1®® i 5 : MULTI RS,RS,#l®® i6: MULTI R6,R6,#1~® El ejemplo comienza presentando el estado del ARF y del buffer de historia con las instrucciones i 1 e i2 ya terminadas, las instrucciones i3 e i4 en ejecución, la iS en espera de ser emitida y la i6 finalizada (ciclo 1). El contenido del campo Vp del buffer de hi storia contiene al valor inicial que tenían los registros destino en el ARF al iniciarse el procesam iento de las instrucciones. Por otra parte, el contenido de los regiso'os Rl , R2 Y R6 en el ARF ya contiene el resultado de las instrucciones que han fin alizado, esto es, 183
INGENIERíA DE COMPUTADORES 11
i 1, i2 e i6, esta última fuera de orden (antes que i3 , i4 e i 5). Cuando fi naliza i3 se esclibe su resultado en el registro R3 del ARF, terminándose en el siguiente ciclo. Análogamente, cuando la instlUcción Estado inicial del ARF RO
O
Rl
1
R2
2
R3
3
R4
4
R5
5
R6
6
Ciclo 1:
A medida que se han ido distribuyendo las seis instrucciones se han copiado los valores de sus registros destino
,,
,
i3 e i4 se encuentran en ejecución
ARF
o
E
F
Di,
Rd
Vp
Int
--
.- ---
RO
O
Rl
100
O
1
1
il
Rl
1
O
R2
200
O
1
1
i2
R2
2
O
R3
3
1
1
O
i3
R3
3
O
R4
4
1
1
O
i4
R4
4
O
R5
5
1
O
O
i5
R5
5
O
R6
600
1
1
1
i6
R6
6
O
-
,,
Punlero
de cola
Puntero de
¡.- cabecera Ciclo 2: Finaliza i3 y aparece interrupción
ARF
o
E
F
Di,
Rd
Vp
Int
RO
O
Rl
100
O
1
1
il
Rl
1
O
R2
200
.0
1
1
i2
R2
2
O
R3
300
1
1
1
i3
R3
3
O
R4
4
1
1
O
i4
R4
4
1
R5
5
1
O
O
i5
R5
5
O
R6
600
1
1
1
i6
R6
6
O
"- 300
_
Puntero de cola
Puntero de -
cabecera
Figura 2.51: Ejemplo de fun cionamiento del buffer de histOlia (contin úa). 184
2.11. TRATAMIENTO DE INTERRUPCIONES Ciclo 3: i3 termina e i4 finaliza
ARF
o
E
F
Dir
Rd
Vp
In !
RO
O
Rl
100
O
1
1
il
Rl
1
O
R2
200
O
1
1
i2
R2
2
O
300
O
1
1
i3
R3
3
O
1
1
1
i4
R4
4
1
R3
-
400
R4
400
R5
5
1
O
O
i5
R5
5
O
600
1
1
1
i6
R6
6
O
R6
Puntero
1-- de cola
-
Puntero de
cabecera
Ciclo 4: i4 termina y se trata la interrupción
ARF
o
E
F
Dir
Rd
Vp
In !
RO
O
Rl
100
O
1
1
il
Rl
1
O
R2
200
O
1
1
i2
R2
2
O
R3
300
O
1
1
i3
R3
3
O
R4
4
O
1
1
i4
R4
4
1
R5
5
O
O
O
i5
R5
5
O
6
O
1
1
i6
R6
6
O
R6
.
, ,
-
Puntero de cola
1---Puntero de cabecera
,, Se restaura el ARF con la información del buffer de historia
-------
Figura 2.51: [Continuación) Ejemplo de funcionami ento del buffer de historia.
i4 finaliza , escribe su resultado en el ARP, y queda li sta para ser terminada en el ciclo siguiente. Sin embargo, durante la etapa de ejecución de i4 apareció una interrupción que quedó marcada en su campo Int del buf!'er de historia, lo que modifica su terminación. Ahora, al term inar i4 y detectar que se trata de una instrucción interrumpida, se anula su resultado yel de las siguientes instrucciones. Esto consiste en reestablecer los valores de los registros R4, RS y R6 utili zando la información almacenada en sus respectivas entradas del buffer de historia. Una vez recuperado el contenido de los registros del ARF con su valor previo a la ejecución de i4, se guarda el estado del procesador y se da paso a la rutina de u'atamiento de la interrupción. 185
INGENIERíA DE COMPUTADORES 11
Ciclo 1:
i3 e i4 se encllijn~ran en ejecución
o
E
100
o
R2
Va
F
Di,
Rd
1
1
il
Rl
100
1
200
O
1
1
i2
R2
200
R3
3
1
1
O
i3
R3
R4
4
1
1
O
i4
R5
5
1
O
O
R6
600
1
1
1
FRF
In!
ARF
O
RO Rl
Ciclo 2:
V
RO
O
O
Rl
100
1
O
R2
200
3
1
O
R3
3
R4
4
1
O
R4
4
i5
R5
5
1
O
R5
5
i6
R6
600
1
O
R6
6
-
-
Puntero de cola
_
Punlero de cabecera
Finaliza i3 y aparece interrupción
FRF
o
E
F
Di,
Rd
Va
V
In!
RO
O
Rl
100
O
1
1
il
Rl
100
1
O
200
300
O
1
1
i2
R2
200
1
O
R3
300
+--!--
1
1
1
i3
R3
300
1
O
R4
4
1
1
O
i4
R4
4
1
R5
5
1
O
O
i5
R5
5
R6
600
1
1
1
i6
R6
600
R2
.
ARF RO
O
Rl
100
R2
200
R3
3
1
R4
4
1
O
R5
5
1
O
R6
6
-
Punlero de cola
Punlero de -
Ciclo 3:
cabecera
13 termina e i4 finaliza
FRF RO
o
E
1
1
il
Rl
100
1
O
1
1
i2
R2
200
1
O
i3
R3
Di,
Rd
Va
V
In!
ARF
O
Rl
100
O
R2
200
O
R3
F
300
400
--. .
O
1
1
300
1
O
1
1
1
14
R4
400
1
1
5
1
O
O
i5
R5
5
1
O
600
1
1
1
i6
R6
600
1
O
R4
400
R5 R6
--
300 Punlero
-de cola
RO
O
Rl
100
R2
200
R3
300
R4
4
R5
5
R6
6
Puntero de -
cabecera
Figura 2.52: Ejemplo de funcionamiento del fi chero de futuro (continúa).
186
Se copian al ARF solo cuando se terminan
2.11. TRATAMIENTO DE INTERRUPCION ES
i4 termina y se trata la interrupción
Ciclo 4:
o
FRF
E
F
Dir
Rd
Va
V
RO
O
R1
100
o
1
1
i1
R1
100
1
R2
200
O
1
1
i2
R2
200
R3
300
O
1
1
i3
R3
R4
4
1
1
1
i4
R4 R5 R6
R5 R6
5
1
O
O
i5
.6
1
1
1
i6
Inl
ARF
RO
O
O
R1
100
1
O
R2
200
300
1
O
R3
300
400
1
1
R4
4
5
1
O
R5
5
600
1
O
R6
6
-Pu ntero de cola
_
Puntero de cabecera ..
Se actualiza el FRF con los valores del ARF
Figura 2.52: [Continuación] Ejemplo de funcionamiento del fichero de futuro .
En la Figura 2.52 se plantea el mismo ejemplo que con el buffer de historia pero apl icando la técnica del fichero de futuro con el buft"er de reordenamiento. El estado de las instrucciones al comenzar el ejemplo es el mismo que en el caso al1telior. La principal diferencia es que al finalizar i1 . i2 e i6, sus resultados se almacenan temporalmente en las entradas del buffer de terminación y en el fichero de registros de futuro (FullIre Register File - FRF). Como el ejemplo se inicia con las instrucciones i 1 e i2 terminadas, sus resul tados ya se encuentran en el ARF. Al finali zar la ejecución de i3, su resultado se almacena en el FRF y en el buffer de reordenamiento para, una vez terminada, copiarlo al ARF. La instrucción i4 cuando finali za también copia su resultado al buft"er de terminación y al FRF. Al ir a terminarla, ya que se trata de una instrucción marcada, es necesario anular su procesamiento y el de las instrucciones siguientes. Ello se consigue reestableciendo el contenido del FRF al estado previo a iniciar la ejecución de i4 , es decir, el estado en que quedaría el procesador tras ejecutar ordenamente las instrucciones que componen el programa hasta i3. Para ello hay que recuperar los valores de los registros R4 , RS y R6 del ARF y copiarlos al FRF. Tras esto, se guarda el estado del procesador y se trata la interrupción ,
Las técnicas basadas en el buffer de histOlia y en el regi stro de fut uro proporcionan precisión de excepción retrasando el almacenamiento definüivo de los resultados mientras que las instrucciones no sean tenrunadas arquitectónicamente y dadas por vál idas. Actualmente, la mayor parte de los procesadores superesca lares basan la precisión de excepción en el empleo del mecanismo constituido por la combinación del renombramiento, las estaciones de re serva y los buffers de terminación, almacenamientos y cargas. En el apartado sigluente se anali za con mayor detalle este esq uema. 187
INGENIERíA DE COMPUTADORES 11
2011.1.
Excepciones precisas con buffer de loeordenamiento
El elemento clave que permite mantener la consistencia del procesador es el buffer de reordena miento o de terminación, ya que posibilita que las instrucciones no interrumpidas terminen en el mismo orden en que se sitúan en el programa, almacenando sus resultados definitivos de forma ordenada. Para conocer si una instrucción ha sufrido una interrupción durante su etapa de ejecución , las entradas del buffer de reordena miento cuentan con un campo Int . Inicialmente a O, este campo pasa a valer 1 para indicar que una instrucc ión ha sido interrumpida, de forma que cuando haya que terminarla se sepa que hay que anular su procesamiento y el de las siguientes. i1:
LO
R1.100(RO)
11 R1 renombrado como Rr1
i2:
ADD
R3 , R2, R1
11 R3 renombrado como Rr3
i3:
DIV
R4 , R4,R3
11 R4 renombrado como Rr4
i4:
MULT R6 . R5 . R5
11 R6 renombrado como Rr5
i5:
SD
100(R1), R4
11 No hay registro destino
i6:
ADD
R4 , R4 , R3
11 R4 renombrado como Rr6
O
E
F
Di,
Rd
R,
Es
V
Inl
o
1
1
i1
R1
Rr1
O
1
O
O
1
1
i2
R3
Rr3
O
1
O
1
1
O
i3
R4
Rr4
O
1
O
1
1
1
i4
R6
Rr5
O
1
1
.....
O
1
O
Rr6
O
1
O
1
O
O
i5
.....
1
O
1
i6
R4
-
-
Punlero de cola
Se anula su procesamiento
Puntero de
cabecera
Figura 2.53: Estado del buffer de reordenamiento al producirse una interrupción. La Figura 2.53 muestra el estado del buffer de reordenarniento durante el procesamiento de una secuencia de seis instrucciones . La situación de las instrucciones es la sigui ente: i 1 e i2 ya han finali zado mientras que D se encuentra todavía en ejecución; la instrucción i4 también ha finalizado pero recibió una intelTupción durante su etapa de ejecución, por eso mantiene el campo Int= 1 en el buffer de reordenarniento; finalmente, las instrucciones i5 e i6 se encuentran a la espera de poder ser emitidas ya que dependen del resultado de D. En el momento en que el puntero de cola llegue a la entrada correspondiente a la instrucc ión i4 y compruebe que se puede terminar pero que el campo Int está a l , se iniciará el tratamiento de la excepción. Este consistiría en: • Expulsar del cauce a i4 y a todas las instrucciones posteriores a ell a. Aunque en el ejemplo solo 188
2.11. TRATAMIENTO DE INTERRUPCIONES
son iS e i6, esta acción afectaría a todas las instrucciones que estuviesen leídas, decodificadas, distribuidas, en vuelo o finalizadas. También se eliminan los almacenamientos que estuviesen marcados como finalizados en el buffer de almacenamiento y, en caso de existir, las cargas que hubiese en el buffer de cargas especulativas. Es decir, todas las instrucciones sin terminar.
• Almacenar el estado del procesador, es decir, guardar el estado de los registros arquitectónicos y del contador de programa. El estado debe corresponder a la situac ión del procesador tras completar la ejecución secuencial del programa hasta la instrucción i3 , ell a incluida .
• Tratar la intelTupción según del tipo que sea.
En el ejemplo de la Figura 2.53, una vez que la interrupción sea tratada, el estado de la máqui na podrá reestablecerse en el punto previo a la ejecución de i4, es decir, tras la conclusión de i3 que fue la última instrucción que se terminó. La ejecución del programa se reiniciaría desde la i4, extrayendo las instrucciones de la ¡-caché. Aunque no se ha hecho mucho hincapié hasta ahora, observe la importancia que tiene para logrru' interrupciones precisas que al terminar una instrucción se actualice su registro arquitectónico con el valor del registro de renombramiento que se le asignó al distribuirla, aunque el renombramiento ya no esté refl ejado en el ARF. Esta situación se plantea si el acceso al RRF es indexado ya que el renombramiento puede desapru'ecer del ARF al ser sobrescrito por otro posterior. Por esa razó n se mantiene un campo Rr en el ROB aunque si el acceso al RRF es asociativo no sería necesario ya que en el RRF están reflejados todos los renombramientos. Si la actualización del ARF solo se realizase para aquell as instrucciones con registros destino renombrados reflej ados en el ARP, el tratamiento de los riesgos WAR y WAW seguiría siendo correcto pero, sin embargo, no habría interrupciones precisas. Si no hubiese interrupciones ni actualización del ARF en el ejemplo de la Figura 2.53, el valor que permanecería en R4 tras concl uir la ejecución del programa sería el producido por i6 , no el de i3 , lo cual es correcto. Pero si hubiese una interrupción en i4, como es el caso, no podría recuperarse el estado ya que el valor de R4 no habría sido actualizado por i 3 sino por i6. La actualización es posible gracias a que la correspondencia entre registro destino y registro de renombramiento siempre se mantiene en el ROB. Cuando no es una instrucción del programa durante la ejecución la que lanza la interrupción es posible reali zar un tratam iento del problema ligeramente diferente en función de dónde suceda la interrupción. Si la interrupción ocurriese en la etapa IF por un fallo de página de memoria virtual al intentar leer una instrucción, no se leerían nuevas instrucciones y se terminarían todas las instrucciones ya existentes en el cauce. Si la interrupción se produjese en la etapa de decodificación debido a un código de operación ilegal o indefinido , se terminru'ía la ejecución de las instrucciones alojadas en e l buffer de di stribución y siguientes. 189
INGENIERíA DE COMPUTADORES 11
2.12.
Limitaciones de los procesadores superescalares
El aumento de prestaciones que se puede obtener en un procesador superescalar explotando exclusivamente e l paralelismo a nivel de instrucción está restringido, principalmente, por dos factores: • La complej idad y coste de la fase de distribución de las instrucciones y el análi sis de las dependencias ex istentes entre ellas . • El grado de parale lismo illtrÍnseco existente en e l flujo de instrucciones de un programa. Los programas presentan distintos grados de paralelismo intrínseco. En muchos casos, las instrucciones no dependen unas de otras y pueden ejecutarse simultáneamente sin ninguna restricción. En otros casos, ex isten restricciones entre e ll as: una instrucción afecta al resultado de otra instrucción (dependencias RAW de datos) o al número de recursos disponibles con que cuenta (dependencias estructurales), lo que restri nge el paraleli smo entre ellas. Pero, además, a medida que e l número de instrucciones que pueden emitirse simultáneamente se incrementa, e l coste de la gestión de las dependencias de datos se incrementa rápidamente, y se agrava por el hecho de tener que reali zarlo e n tiempo de ejecución y a la velocidad que marca la CPU. Este coste no solo viene dado por la complejidad de la lógica necesruia para realizar el análisis de las dependencias, sino también por el hru·dware para implementru-Ja y los cons iguientes retardos de comunicación. Se ha demostrado matemáticamente que en un procesador superescalar Con recursos hardware limitados y un ancho de em isión de k instrucc iones, la comp lej idad de la lógica de di stribución/emisión de instrucciones es de orden I1 k y el retardo es de orden lag 11, donde n es el número de instrucc iones del repertorio. Debido a los cientos o miles de millones de transistores que contienen los procesadores actuales en un único chip, los problemas de los retru·dos de comunicac ión son críticos. Como forma de paliar esos retardos ya hay procesadores que incorporan etapas en su segmentación exclusivamente dedicadas a tru·eas de sincroni zación. Aunque un programa no contenga dependenc ias entre las in strucciones que lo componen, un procesador superescalar siempre tiene que comprobar su existencia. No hacerlo conduciría a una posible generación de resultados incorrectos ante la apari ción de una única dependencia. Con independencia de la velocidad del reloj o de la tecnología de fabricación, el examen obbgado de las dependencias establece un límite práctico en e l número de instrucciones que pueden ser s imultáneamente emitidas. Sin embargo, aunque la lógica para examinru· las dependencias fuese infinitamente rápida, el fluj o de instrucciones siempre tie ne dependencias lo cual limita e l número de instrucc iones a emit ir. Es decir, el grado de pru·alelismo intrínseco a nivel de instrucc iones constituye una limitación. Estos dos límites en el rendimiento de los procesadores s uperescalru·es, unidos a la crec iente necesidad de mayor potencia de procesamiento, impulsan la investi gac ión y el desarrollo de nuevas arq uitecturas ele procesadores . En la actualidad , se pueden diferenciar dos grandes Líneas ele trabajo en e l diseño de nuevos procesadores: una e nfocada a aumentar el paraleli smo a nive l de instrucción (lLP) y otra orientada a incrementar el parale li smo a ni vel de hilo (Thread-Level ParalelislI1 - TLP). Existe una tercera línea de trabajo, e l aumento de l pru·ale li smo a nivel de proceso, pero se puede considerar
e
190
2.13. RESUMEN: UNA VISiÓN GLOBAL DEL NÚCLEO DE EJECUCiÓN DINÁMICA
como más orientada al desarrollo de multicomputadores. Los multiprocesadores mejoran el rendimiento explotando tanto el paralelismo a nivel de hilo como el paraleli smo a ni vel de programa. Entre las arqu itecturas de computador basadas en explotar el ILP destacan las VLIW (Ver)' Long Instructiol1 Word), las EPrC (Explicitly Parallelln strnction Compnting), los procesadores mulliescalares o las mejoras introducidas en los procesadores superescalares. Actualmente, la tendencia para mejo rar las prestaciones de un procesador superescalar pasa por su escalabilidad: aumento del ancho y profundidad de las segmentaciones, aumento del tamaño y niveles de las memoria caché, aumento de la frecuencia de reloj , todo ello unido a avanzadas técnicas especul ativas que mejoren el flujo de control (por eje mplo, predictores de saltos híbridos) y que permitan superar el límite del fluj o de datos que imponen las dependencias RAW (por ejemplo, mediante la ejecución de instrucciones utilizando valores especulativos de los operandos). Otra mejora por la que optan muchos procesadores superescalares es el procesamiento vectorial , es decir, la inclusión dentro del procesador de una o vari as unidades funcionales para el procesamiento de instrucciones STMD . Para aumentar el paralelismo a nivel de hilo se trabaja en procesadores SMT (Silllultaneons MultiThreading) y CMT (Chip MuITipracessors) . Estos dos tipos de procesadores permiten aprovechar el paraleli smo a nivel de hilos de dos formas di stintas pero no excluyentes . Un procesador SMT di spone de recursos que permiten la ejecución en paralelo de instrucciones pertenecientes a hilos diferentes. Un procesador CMT consiste en colocar varios procesadores similares o núcleos en un úni co circuito integrado pudiéndose ser estos procesadores a su vez procesadores superescalares, procesadores S MT o procesadores VLIW.
2.13.
Resumen: Una visión global del núcleo de ejecución dinámica
En este capítulo se ha estudiado el funcionamiento de un procesador superescalar describiendo las diferentes etapas por las que una instrucción transcune hasta que completa su procesamie nto y, simultáneamente, analizando las técnicas que se pueden aplicar para resolver los diferentes problemas que se plantean en cada etapa. A lo largo todo el capítulo se ha realizado una descripción incremental, casi segmentada, describiendo los problemas que se resuelven en cada etapa e indicando mediante ejemplos los que han quedado pendientes de resolver en las siguientes. Con este enfoque se ha pretendido que el lector se haya ido percatando por sí mi smo de los problemas a los que han tenido que enfre ntarse los ingenieros de computadores en estas últimas décadas hasta dar lugar a los procesadores actuales que implementan los computadores como el que se ha utilizado para escribir este libro de tex to (un lnte l Core 2 Duo a 2.2 GHz). Es cierto que los procesadores reales son infinitamente más complicados ya que contienen y gestionan mucha más información de estado que la utili zada en las explicaciones de este texto, en donde se pretende ofrecer una visión didáctica y comprensible. Sin embargo, no es menos cierto, que esta visión simplificada, moti vada porque se utiliza una imagen de baja resolución del procesador, permite conocer con claridad las principales tareas que reali za cualqui er procesador superescal ar. Pueden existir y existirán procesadores superescalares que cambien la forma en que se implementa una u otra etapa, que 191
INGENIERíA DE COMPUTADORES"
incluyan una u otra técnica para afrontar los riesgos, que se organicen internamente de forma diferente, pero en la actualidad, los procesadores superescalares responden al modo de funcionamiento descrito en este texto. Puede que un procesador lea los operandos en la etapa de decodificación, otro en la de distribución pero la lectura del operando hay que realizarla y, por el momento, hay que renombrar los registros para respetar las dependencias de datos falsas. Para fina lizar el capítulo, se plantea un resumen de los pasos que se dan en cada etapa considerando que el procesador realiza planificación dinámica con lectura de operandos al distribuir las instrucciones: • Lectura. • Se extrae el grupo de lectura de la [-caché. • Si es un salto, se especula el resultado y la dirección de destino y se cambia el contador de programa según la especulación . • Decodificación. • Se decodifican las instrucciones en paralelo. • Se envían al buffer de distribución. • Distribución. • Si hay espac io en las estaciones de trabajo, en el buffer de terminación y en el RRF se distribuye la instrucción. • Se leen los operandos (identificadores o valores) desde el ARF o el RRF. • Se introduce la instrucción en el buffer de reordenamiento. • Se renombra el registro destino de la instrucción. • Se introduce la instrucción en la estación de reserva que corresponda. • Las estaciones de reserva examinan los buses de reenvío en busca de coincidencias de identificadores de registro destino. • Si todo los operandos fuente se encuentran disponibles, se emite la instrucción a la unidad funcional. Por lo general, se libera la entrada que ocupaba en la estación de reserva. • Ejecución. • Se cambia el estado de la instrucción en el buffer de reordenamiento. • Si hay una interrupción, se marca el campo correspondiente en el buffer de terminación. • Si es una instrucción de salto se complUeba que la especulación coincida con el resultado del salto. Si es así, se vaüdan las instrucciones especuladas; en caso contrario, se invalidan. 192
2.14. REFERENCIAS
• Cuando finaliza la ejecución, se publica el resultado de la instrucción y el identificador del registro destino en los buses de reenvío para permitir las actualizaciones del RRF, de las entradas de las estaciones de reserva y del buffer de reordenamiento. Si es un almacenamiento, se introduce en el bufler de almacenamiento y se marca como finali zado . • Terminación. • Se cambia el estado de la instrucción en el buffer de reordenamiento. • Si no es una instrucción interrumpida, se libera su e ntrada del bufler de reorde namiento y se da por terminada arquitectónicamente. • Se actualiza el ARF desde el RRF y se libera el registro de renombramiento. • Si es un almacenamiento, se marca en el bufrer de almacenamiento como terminado. • Si es una instrucción interrumpida, se eliminan ell a y todas las siguientes del buffer sin actualizar el ARF, estén o no fin alizadas. Tambié n se eliminan los almacenamientos del buffer de almacenamiento y las cargas del bufler de cargas especuladas (en caso de que ex ista) que sean posteriores a la instrucción interrumpida. • Si es una instrucción especulada, queda en espera de terminación. • Si es una instrucción invalidada, se termina sin actualizar el ARF . • Retirada (solo almacenamientos). • Es perar a que el bus de acceso a memoria esté libre y reali zar la escritura. • La instrucción se retira del buffer de almacenamiento.
2.14.
Referencias
AMD AMD64 Architecture Progre/mmer's Manual Volume 1: Application Programming, 2007. Cotofana S., Vassiliadi s S. , On the Design Complexity of the Issue Logic of Superscalar Machines, Proceedings ofthe 24th Conference on EUROMICRO, Vasteras, Suecia, pp. 10277- 10284, 1998 . Hellnessy J.L., Patterson O.A. Computer Architecture. A Quantirative Approach, 4" edición, Morgan Kaufmann, San Francisco, California, 2007. IBM Corporation User Manuals for Power PC 970FX & 970MP processors, 2008. Keltcher C.N. et al. The AMO Opteron processor for multiprocessor servers, IEEE Micro, vol. 23, nO2, pp. 66-76, 2003. Kessler R. E. The Alpha 2 1264 Microprocessor, IEEE Micro , vol. 19, nO 2, pp. 24-36, 1999. 193
INGENIERíA DE COMPUTADORES 11
McFarling S. Combining branch predictors , Technical Note-36, Compaq Computer Corporation Western Research Laboratory, 1993. Oltega l , Anguita M. , Prieto A. Arquitectura de computadores, Thomson Paraninfo. 2005. Sandon P. PowerPC 970: First in a New Family of 64-bit High Performance PowerPC Processors, Microprocessor Forwn, San José, California, 2002. Shen J. P, Lipasti M. H. Arquitectura de Computadores: Fundam.elltos de los procesadores superescalares, McOraw-Hill , Madrid, 2006. Smith, lE., Pleszkun A.R. Implementation of Precise Interrupts in Pipelined Processors, Proc. af the 12th Sympasium 011 Computer Architecture , Boston, Massachusetts, pp. 34-44, 1985. Smith J.E., Sohi O.S. The microarchitecture of superscalar processors, Proceedings of ¡he IEEE, vol. 83, na 12, pp. 1609-1624, 1995. Smotherman M. Understanding EPlC Architectures and lmplementations, Proceedil1gs afthe 40th Al1l1ual ACM SOlltheast COl1ference, Raleigh, Nort Cmoline, pp. 71-78, 2002. Song P.S. et al. The PowerPC 604 RISC Microprocessor, IEEE Micro, vol. 14, nO 5, pp. 8- 17, 1994.
2.15.
Preguntas de autoevaluación
P2.1 ¿Qué impide que la profundidad de una segmentación escalar no se pueda aumentar más allá de ciertos límites? Un aumento del número de etapas se traduce en un aumento de las dependencias entre instrucciones al haber un mayor número de instrucciones en la segmentación en cada ciclo de reloj . Además, un aumento del número de etapas implica un aumento de los bulfers de contención entre etapas y, en general, un aumento de la electrónica necesalia; todo ell o se traduce en un aumento del consumo de energía y del calor a disipar. Por otro lado, segmentaciones muy profundas provocan la aparición de grandes penalizaciones por predicciones erróneas en los saltos cond icionales. P2.2 ¿Cuáles son las diferencias más importantes entre una segmentación escalar y una superescalar? La segmentación es más ancha y las instrucciones se pueden ejecutar fuera de orden. P2.3 ¿Qué tres atributos caracterizan una segmentación superescalar? Las segmentaciones superescalares se caracterizan por tres atributos: paraleli smo, diversificación y dinami smo. 194
2.15. PREGUNTAS DE AUTO EVALUACiÓN
P2.4 ¿Es suficiente con replicar una segmentación escalar superescalar de ancho 11?
11
veces para obtener un segmentación
No. Por citar algunas complicaciones, hay que considerar la posibilidad de ejecutar instrucciones fuera de orden y en paralelo lo que conlleva la necesidad de lógica adicional como, por ejemplo, un incremento en el número de puertos de lectura/escritura del fichero de registros, de las memorias cachés, o la neces idad de redes de interconexión entre las salidas y las entradas de las múltiples unidades funcionales para contribuir a minimizar los impaCtos de las dependencias de datos. P2.5 ¿Por qué es conveniente diversificar las unidades funcionales que forman la etapa de ejecución? Para conseguir un mayor aprovechamiento de los recursos al poder emitir hacia las unidades varias instrucciones de forma simultánea.
P2.6 ¿Por qué es conveniente ejecutar las instrucciones fuera de orden? Se intenta aprovechar al máximo el paraleli smo que permiten las instrucciones y el que permite el hardware al di sponer de múltiples unidades fu ncionales. P2.7 ¿Qué significa que una instrucción ha sido distribuida" Que sido enviada a una estación de reserva. P2.8 ¿Qué significa que una instrucción ha sido emitida? Qué saje de la estación de reserva hacia una unidad funciona l. P2.9 ¿Qué significa que una instrucción ha sido finalizada? Que abandona la unidad funcional y pasa al buffer de reordenamiento. Los resultados se encuentran almacenados temporalmente en registros no accesibles al programador. P2.1O ¿Qué significa que una instrucción ha sido terminada? Que realizado la escritura de los resultados desde los registros de renombramiento a los registros arquitectónicos.
P2.11 ¿Qué significa que una instrucción ha sido retirada? Que ha reali zado la escritura en memoria. P2.12 ¿Una instrucción finalizada está terminada arquitectónicamente? No. P2.13 ¿Cuándo la distribución y la emisión se realizan en la misma fase? Cuando se utiliza un úni co buffer de distribución desde e l que se emiten las instrucc iones a las un idades funcionales. 195
INGENIERíA DE COMPUTADORES 11
P2.14 ¿Qué técnica se utiliza para resolver las dependencias WAW y WAR en los procesadores superescalares? El renombrantiento de registros.
P2.15 ¿En qué consiste la cousistencia del procesador y de la memoria? La consistencia del procesador consiste en que las instrucciones concluyan su procesamiento en el mi smo orden secuencial en el que se encuentran en el programa, es decir, en el mismo orden en que inici aron su procesamiento. La consistencia de memoria es un concepto simi lar pero aplicado a las instrucc iones que modifican la memoria, esto es, los almacenamientos.
P2.16 ¿Qué garantiza la consistencia del procesador y de la memoria? Se garanti za mediante el buffer de terminación que establece la escritura ordenada de los registros arquitectónicos y el buffer de retirada que posibilita la escritura ordenada de las posiciones de memoria por parte de las instrucciones de almacenamiento.
P2.17 ¿Por qué no se pueden terminar arquitectónicamente las instrucciones especuladas? Porque no han sido validadas y puede que su ejecución sea incorrecta. Si se terminasen y luego fuesen dadas como inválidas por un salto mal predicho sería necesario deshacer su ejecución, reestableciendo el estado del procesador y de la memoda con la consiguiente pérdida de rendimiento.
P2.18 ¿Qué es un grupo de lectura? Es el conju nto de instrucciones que se extraen de la I-caché en un ciclo de reloj.
P2.19 ¿Qué problemas surgen en la fase de lectura de un procesador superescalar que detraen su rendimiento? La falta de alineamiento del grupo de lectura y la rotura de la secuencialidad del flujo de instrucciones.
P2.20 ¿Qué técnicas se aplican cuando no se restringe el alineamiento de las instrucciones? Hay dos posible soluciones. Una consiste en recurrir a una red de alineación compuesta por tantos multiplexores como instrucciones tenga el grupo de lectura. La segunda solución es colocar una red de desplazamiento basada en registros de desplazamiento a la salida de la I-caché.
P2.21 ¿Qué es el coste mínimo de la oportunidad perdida? Es la cantidad mínima de ciclos que se desperdician como consecuencia de una rotura en la secuencia del código ejecutado y que obli ga a anu lar el procesamiento de las instrucciones que hay en la segmentación. Se expresa en ciclos de reloj. 196
2.15. PREGUNTAS DE AUTOEVALUACIÓN
P2.22 ¿Por qué no se puede aplicar la técnica de salto retardado en un procesador superescalar para rellenar huecos en la segmentación? Por la capacidad que tienen los procesadores superescalares para ejecutar instrucciones fuera de orden cuando no existen dependencias que lo impidan.
P2.23 ¿Qué tipo de instrucción introduce ineficiencias en la etapa de lectura de un procesador superescalar? Las instrucciones de salto que son efectivas ya que producen una rotura en la secuencialidad del flujo de instrucciones.
P2.24 ¿Qué es una BTAC y para qué se utiliza? U n BTAC es una memoria caché asociativa en la que se almacenan las direcciones de las instrucciones de saltos efectivos ya ejecutados o BIAs (Branch In sfrucf;oll Address) y las direcciones de destino de esos saltos o BTAs (Branch Targef Address). Se utiliza C0l110 técnica de predicción dinámica de saltos.
P2.25 ¿Qué son los saltos fantasmas o saltos en falso? Son instrucciones que el predictor de destinos identifica inicialmente como saltos aunque realmente no lo sean, produciendo una pequeña penalización al tener que ser expul sada del cauce la instrucción de destino especulada.
P2.26 ¿Cómo se minimiza la aparición de los saltos fantasma? Los saltos fantasma se minimizan aumentando el número de bits que componen el campo BTA de forma que haya mayor coincidencia con la dirección de la instrucción que se busca en la tabla. Si la longitud del BIA llega a igualarse a la longitud de las direcciones, el problema de los falsos positivos deja de existir.
P2.27 ¿Qué es una BTB con historial de salto? Es una técnica de predicción dinámica similar a la BTAC pero se diferencia en que junto con la dirección de destino predicha, la BTAC almacena un conjunto de bits que representan el historial del salto y predicen la efecti vidad del mismo.
P2.28 ¿Qué es el predictor de Smith? El predictor de Smith es una técnica de predicción dinámica de saltos. Se basa en asociar un contador de saturación de k bits a cada salto de forma que el bit más significativo del contador indica la predicción para el salto: si el bit es cero, el salto se predice como no efectivo; si el bit es uno, el salto se predice como efectivo.
P2.29 ¿Qué es un predictor de dos niveles? 197
INGENIERíA DE COMPUTADORES 11
Es un predictor que mantiene en un primer nivel de información un historial común de los últimos saltos ejecutados (historial global) o de las últimas ejecuciones de un salto concreto (historial local). En un segundo nivel, la información del Plimer nivel en combinación con un hash de la dirección de la instrucción de sal to se utili za para acceder a una tabla que almacena contadores de saturación que son los que determinan el resultado final de la predicción, P2.30 ¿Cuál es la principal diferencia entre el predictor de dos niveles basado en historial global y el basado en historial local? La principal diferencia es que el predictor basado en historial local utili za una tabla, BHT, en la que se almacena el hi storial concreto de cada salto, en lugar de un único registro BHR que mantiene un hi storial común para todos los saltos. El funcionamie nto de la PHT en el segundo nivel es similar en ambos predictores. P2.31 ¿Cómo se realiza el tratamiento correcto de los retornos de subrutina? Se realiza mediante la pil a de direcciones de retorno o RAS. Una instrucción de retorno de subrutina extrae su dirección de retorno de la RAS y no de la BTB. La dirección de retorno previamente se apiló en la RAS en el momento en que la subrutina se invocó. P2.32 ¿Qué son las etiquetas de especulación y para qué se utilizan? Son un campo que cada instrucción tiene asignada en su entrada del buffer de reordenamiento. Se utilizan para saber que una instrucción es el resultado de una especu lación y evitar que sea terminada arquitectónicamente hasta que no se compruebe que la especulación realizada es correcta. P2.33 ¿Qué son los bits de predecodificación? Son un conjunto de bits que se añaden a cada instrucción cuando son enviadas a la l-caché para simplificar las tareas de decodificación y di stribución. P2.34 ¿Qué es una cola de prefeclh o de prelectura? Es una estructura de datos que se utiliza para minimi zar el impacto de los fall os de lectura en la caché de instrucciones Cuando sucede un fallo de lectura en la caché de instrucciones se busca la instrucción en la co la de prefetch. Si las instrucciones se encuentran en la cola de prefetch , estas se introducen en la segmentación de forma sim ilar a co mo si hubieran sido extraídas de la l-caché. P2.35 ¿Qué es la traducción de instrucciones? Es el proceso por el que una instrucción compleja CICS o RISC se convierte en un grupo equivalente de instrucciones básicas RISC. P2.36 ¿Qué es la macro·fusión de la arquitectura Intel-Core? Es la fusión de ciertos tipos de in strucc iones en la fase de predecodificacion para enviarlas a uno de los decodificadores y que prod uzcan una única micro-op. 198
2.15. PREGUNTAS DE AUTOEVALUACIÓN
P2.37 ¿Qué es la micro-fusión en la arquitectura Intel-Core? Es una técnica que consiste en decodificar una instrucción que genera dos micro-ops y fundirlas en una única micro-op. P2.38 ¿Qué es una instrucción microcodificada en el PowerPC 970? Es una instrucción que se descompone en tres o más JOPs mediante un cauce auxiliar con que cuenta la etapa de decodificación del procesador. P2.39 ¿Qué etapa constituye el paso del procesamiento centralizado al distribuido en un procesador superescalar? La etapa de di stribución. P2.40 ¿Qué mecanismo permite la ejecución fuera de orden y el mantenimiento del procesador en un estado especulativo? El buffer de terminación, reordenamiento
O ROB.
P2.41 ¿Qué mecanismo posibilita distribuir y emitir las instrucciones de forma que se respeten las dependencias verdaderas? Las estaciones de reserva. P2.42 ¿Cómo se pueden organizar las estaciones de reserva? De forma centrali zada, de fOlma distribuida o indi vidual y de forma compartida. P2.43 ¿Cuáles son las fases por las que pasa una instrucción en la etapa de distribución? Distribución, supervisión y emisión. P2.44 ¿Qué es la activación de la instrucción? Es cuando el bit L de la entrada de una estación de reserva se asigna a 1 para indicar que la instrucción tiene todos sus operandos di sponibles y puede emitirse. P2.45 ¿Qué condiciones son necesarias para poder emitir una instrucción? Los operandos fuente están disponibles, la unidad funcional está libre y la red de elll'utamiento no está ocupada. P2.46 ¿Qué tipo de emisión realizan los procesadores superescalares actuales? Emi sión sin bloqueo y desordenada. P2.47 ¿Qué es la planificación con lectura de operandos? Es cuando las instrucciones se distribuyen a las estaciones de reserva y los valores de los operandos fuente disponibles en el fichero de registros son leídos y copiados en la estación de reser va. 199
INGENIERíA DE COMPUTADORES 11
P2.48 ¿Qué es el fichel'o de registros creados? Son los registros accesibles al programador y que pueden utilizarse por el ISA. También se conoce como fichero de registros arquitectónicos. P2.49 ¿Qué es el rango de vida de un registro? Es el tiempo durante el que el dato almacenado en un registro es válido, es deci.r, el tiempo entre dos escrituras consecutivas del mismo registro. P2.S0 ¿A qué se deben las dependencias de datos falsas? Son consecuencia de la necesidad de reutilizar los registros accesibles por el repertorio de instrucciones para efectuar el almacenamiento temporal de resultados. P2.S1 ¿Qué problemas soluciona el renombramiento de registros? Las dependencias de salida y las antidependencias. P2.S2 ¿Cómo se puede organizar el RRF? Como un único fichero de registros formado por la suma del RRF y del ARF, como una estructura separada pero accesible desde el ARF, o como parte del buffer de reordenamiento y accesible desde el ARF. P2.S3 ¿Qué condiciones son necesarias para poder distribuir una instrucción? Son necesarias tres condiciones: una entrada libre en el RRF, una entrada libre en la estación de reserva individual que le cOlTesponda según su tipo y una entrada libre en el buffer de reordenamiento. P2.S4 ¿Qué estados de una instrucción se almacenan en el buffer de terminación? Distribuida, en ejecución y finalizada. También se almacena infonuación relativa a si se trata de una instrucción especulada, si es válida y si ha sido intelTumpida. P2.SS ¿De cuántas partes consta el buffer de almacenamiento? De dos: finali zación y tenninación. P2.S6 ¿Cómo se estima la velocidad pico del procesador? Se puede estimar multiplicando el máximo número de instrucciones terminadas por ciclo por la frecuencia del procesador. P2.S7 ¿Qué instrucciones hacen uso de la etapa de retirada? Únicamente las instrucciones de almacenamiento. 200
2.16. ACTIVIDADES
P2.58 ¿Por qué las instrucciones de almacenamiento realizan una escritura diferida en memoria? Para evitar una actualización enónea y precipitada de la memoria en caso de que la instrucción sufra una intelTupción. También permite dar mayor plioridad a las instrucciones de carga para acceder a la D-caché. P2.59 ¿Cómo se evitan los riesgos de memoria WAW entre instrucciones de almacenamiento? Mediante el buffer de almacenamiento ya que impone el orden del programa en las escrituras en memoria.
P2.60 ¿Qué técnicas se utilizan para mejorar el procesamiento de cargas y almacenamientos? E l adelantamiento de carga y el reenvío de datos. P2.61 ¿Qué permite el buffer de cargas finalizadas? Es una estructura que posibilita que las instrucciones de carga se emitan de fo rma especulativa sin resolver las dependencias ambiguas que puedan existir con almacenamientos pendientes de ejecución pero previos a la carga en el orden del programa. P2.62 ¿Qué es la precisión de excepción? Es cuando un procesador es capaz de tratar las interrupciones de forma que se pueda reanudar la ejecución de un programa en las mismas condiciones que había antes de producirse la interrupción. P2.63 ¿Qué esquemas se idearon en los años 80 parar proporcionar interrupciones precisas? El buffer de histolia y el fichero de registros de futuro. P2.64 ¿Cómo consiguen precisión de excepción los procesadores superescalares actuales? Añadiendo un campo Int en las entradas del buffer de terminación de forma que cuando una instrucción va a ser tenrunada primero se consulta si ha sido interrumpida. En caso afirmativo, se eliminan del cauce la instrucción intelTumpida y todas las posteriores; solo se terminan aquellas que hayan finalizado antes que la interrumpida. P2.65 ¿Qué faclores limitan el rendimiento de los procesadores superescalares? El grado de paralelismo intrínseco en el flujo de instrucciones del programa y la complejidad yel coste de la etapa de distribución.
2.16.
Actividades
A2.1 Suponga que un compilador es capaz de generar código objeto para un procesador superescalar, carente de una red hardware de alineación, de forma que las instrucciones destino de los saltos estén alineadas para que siempre sean las primeras en los grupos de lectura. La alineación del grupo de lectura 201
INGENIERíA DE COMPUTADORES 11
permite así maximizar el número de instl"Ucciones captadas de la I-caché dado que no hay huecos en el grupo de lectura. Por ejemplo, en la Figura 2.11 , si la instrucción destino fuese la i + 43, esto implicaría que el grupo de lectura solo aprovecharía una de las cuaU·o instrucciones, por lo que quedarían 3 huecos en el grupo de lectura. Analice el impacto que tiene el tamaño del gl"Upo de lectura en el rendimiento de la etapa de Fetch como consecuencia de la existencia de saltos efectivos. ¿Cuán importante es el tamaño del grupo de lectura con respecto al alineamiento de las instrucciones que son destino de saltos? A2.2 Considere el sigu iente fragmento de pseudocódigo: ~x~~~~~~
x:=(1,2,S,8,9,1S,22,2S,26.3~);
h~~~1~~
Desde i: =1 hasta 1~ hacer { Si (x es impar)
~x~~1~~~
a:=a+l;
~x~~l1~~
Si (x es multiplo de S)
~x~1~~~~
a:=a-l ;
~x~1~1~~ ~x~11~~~
% % % %
Sal to_l Sal to_l es efectivo Salto2 Salto2 es efectivo
}
Utilizando un predictor de un nivel basado en una PHT de dos entradas que almacena la predicción para cada salto realizada mediante un contador de Smith de I bit como el de la Figura 2. 16.a, dibuje una tabla en la que se muestre el resultado real de los dos saltos y las predicciones realizadas para la secuencia de valores de x. El valor inicial de las dos entradas de la PHT es O. ¿Cuál es la tasa de predicción del predictor para cada salto? ¿Y la tasa de predicción global? A2.3 Con el pseudocódigo del ejercicio A2.2 y utilizando un predictor de un nivel basado en una PHT de dos entradas que almacena la predicción para cada sa lto realizada mediante un contador de Smith de 2 bit como el de la Figura 2. 16.b, dibuje una tabla es la que se muestre el resultado real de los dos saltos y las predicciones realizadas para la secuencia de valores de x. ¿Cuál es el porcentaje de acierto del predictor para cada salto? ¿Y el porcentaje de acierto global del predictor? A2.4 En un procesador superescalar que dispone de un predictor de saltos de dos niveles basado en historial global se ejecuta una secuencia de instrucciones con las siguientes direcciones y resultados: i1: i2: i3: i4: iS: i6: i7: i8: i9: i1&:
202
~x~~~~1
E ~x~~~1~ NE ~x~~~l1 NE ~x~~1~~ NE ~x~~1~1 E ~x~~l1& E ~x~~ 111 NE ~x&1~&~ NE ~x~1&&1 E ~x~1&1& NE
i11 : i12: i13: i14: i15 :
i16: i17: i18: i19: i2~:
E E ~x~11~1 NE ~x~ 111~ NE ~x~l1l1 E ~x1~&~~ E &x1&&~1 NE ~x1~&1~ NE &x1&&11 NE ~x1&1&& E ~x~1~11
~x~l1~~
2.16. ACTIVIDADES
La longitud del registro BHR es de 2 bits. La función hasl! que se utiliza para reducir el número de bits de la dirección de memoria de la instrucción consiste en quedarse con el bit menos significativo de la diJección. El BHR Y todos los contadores de la PHT se encuentran inicialmente en el estado OO. Dibuje una tabla en la que se muestre la evolución del BHR y de los contadores de la PHT. ¿Cuál es el porcentaje de acierto global del predictor? A2.5 Un procesador superescalar dispone de un predictor de saltos de dos niveles basado en hi storial local compuesto por una BHT de dos entradas de 2 bits de longitud y una PHT dotado de contadores de saturación de 2 bits. Las dos funciones hash que se utilizan para reduciJ el número de bits de que consta la di rección de una instrucción son iguales y consisten en quedaJse con el bit menos significativo de la diJección. Uti lizando la siguiente secuencia de 20 instrucciones con direcciones y resultados:
i 1: i2 : i3: i4: i5: i6 : i7: i8: i9: i1&:
h&&&&l h&&&l& h&&&l1 h&&l&& h&&l&l &x&&l1& h&&111 h&l&&& h&l&&l &x&l&l&
E NE NE NE E E NE NE E NE
i 11: i12: i 13 : i14 : i15: i16: i17: i18: i19: i2&:
&x&l&l1 &x&ll&& &x&ll&l &x&l11& &x&1111 &x1&&&& &x1&&&1 &x1&&1& &x1&&11 &x1&1&&
E E NE NE E E NE NE NE E
rell ene una tabla en la que se muestre la evolución del estado del BHT y de la PHT, indicando e l resu ltado de la predicción. Todas las entradas de las dos tablas se encuentran inicialmente en el estado OO. ¿Cuál es el porcentaje de acierto global del predictor? A2.6 Un procesador superescalar utiliza un predictor de saltos gshare compuesto por un BHR de 2 bits de longitud y una PHT con contadores de saturación de 2 bits. La función hasl! para reducir el número de bits de que consta la dirección de la instrucción consiste en quedarse con los tres bits menos significativos de la dirección. Utilizando la siguiente secuencia de 20 instrucciones con direcciones y resultados:
i1: i2: i3: i4 : i5: i6: i7: i8: i9: i1&:
&x&&&&l &x&&&l& h&&&l1 &x&&l&& h&&l&l h&&l1& h&&111 h&l&&& h&l&&l h&l&l&
E NE NE NE E E NE NE E NE
i 11: i12: i 13 : i14: i 15 : i16 : i17: i18: i19 : i2&:
&x&l&l1 &x&ll&& &x&ll&l &x&l11& &x&lll1 &x1&&&& &x1&&&1 &x1&&1& &x1&&11 &x1&1&&
E E NE NE E E NE NE NE E 203
INGENIERíA DE COMPUTADORES 11
rellene una tabla en la que se muestre la evolución del estado del BHR y de la PHT, indicando el resultado de la predicción en cada salto. Tanto el BHR como las entradas de la PHT se encuentran inicialmente en el estado OO. ¿Cuál es el porcentaje de acierto global del predictor? A2.7 Otra forma de especular el resul tado de un salto es mediante un predictor hfbrido que recurre a combinar varios al goritmos de predicción. Uno de los más conocidos es el predictor de torneo formado por dos predictores, PO y PI , Y un mecanismo de selección o selector, denominado M. La Figura 2.54 muestra un esquema de esta clase de predictores hfbridos.
Predicción
Fignra 2.54: Esquema de un predictor hfbrido. En cada salto, ambos pred ictores generan su predicción yel selector decide cuá l de los dos ofrece la mejor pred icción en base a los resultados obtenidos con anteri oridad. El selector es una PHT con contadores de saturación de 2 bits a la que se accede con el último bit de la dirección de la instrucción de salto. Las reglas de actualización de los contadores del selector son las siguientes: • Si en la última predicción PO y PI fa llaron, el contador no se modifica. • Si PO falló y PI acertó el contador se incrementa. • Si PO acertó y PI fa lló el contador se decrementa. • Si los dos acertaron, el contador no se modifica. • Con el bit de más peso del contador se elige PO (si vale O) o PI (si vale 1) Con un predictor de torneo con las siguientes características: • M utiliza una PHT de dos entradas, todas ellas a OO. • PO es un gshare con BHR de 2 bits y PHT de 4 entradas de 2 bits. La fun ción h.ash produce los 2 bits menos signifi cativos de la dirección. • PI es un predictor de historial global con BHR de 1 bit y PHT de 4 entradas de 2 bits. La función hash. produce el bit menos significativo de la dirección. 204
2.16. ACTIVIDADES
• Los BHRs de PO y PI están inicialmente a OO. • Para PO y PI , PHTO= 00, PHTI=01 , PHT2=10, PHT3= 11. • PO Y PI se actualizan según sus respectivas reglas de actualización. y dada la siguiente secuencia de direcciones de instrucciones de salto y sus resultados: i 1: i2: i3: i4: i5: i6: i7: i8: i9: il~:
576 NI I 599 I 6~4 I · 599 NI 6~4 I 599 NI 6~4 I 599 NI 6~4 I 6~4
rellene una tabla con la evolución del estado de M, PO Y PI. Calcu le el porcentaje de acierto de los predictores individuales y dellubrido. A2.8 La Figura 2.55 muestra la ejecución de un conj unto de instrucciones, incluyendo las rutas especuladas que han sido invalidadas y las que no lo han sido.
T ,..----7'E----< s1 T
NT
>-----..., T
s2
Figura 2.55: Rutas especuladas. Dibuje la evolución paso a paso de los bits de validez y de especu lación de cada instrucción según se hayan ido especu lando, validando, invalidando y recuperando. Considere que: • El campo de especu lación tiene una longitud de 3 bits. • E l procesador siempre especula que los saltos son efectivos. 205
INGENIERíA DE COMPUTADORES 11
• El ancho de la segmentación es l .
• Las ci nco etapas IF, ID, n, EX, WB son de un ciclo de duración.
• EL resultado real del salto se conoce al final de la etapa EX.
A2.9 ¿Cómo modificaría el formato de la entrada de la estación de reserva para operaciones aritméticas si uno de los operandos fuente fuese un valor inmediato y no el identificadOlj valor de un registro? ¿Cómo sería el formato de de las entradas de una estación de reserva indi vidual que alimenta la unidad funcional de carga/almacenamiento? A2.10 El siguiente fragmento de código:
il : i2: i3: i4: i5: i6: i7: i8:
ADD ADD MULT ADD MULT ADD ADD MULT
R3,R2,Rl R8,R3,R7 R6,R5 ,R4 R9,R6,Rl Rl~,R3,R6
Rll ,R2 ,Rl R12 , R3,R8 R13 ,R2 ,Rl
se encuentra ubicado en una ventana de instrucciones de 10 entradas desde la que se distribuye a una estación de reserva de 6 entradas que alimenta a una unidad fun cional de suma/resta (l cicl o) ya una de multiplicación/división (2 ciclos y segmentada). Se considera que en el mismo ciclo en que las unidades funciona les generan el resultado, la estación de reserva actuali za sus bits de validez; esto permite que en el ciclo siguiente se pueda emitir la instrucción. Se pueden e mitir un máximo de dos instrucciones/ciclo, una a cada unidad fun cional. ¿Cuál es la secuencia temporal de ejecución y la evolución de la estación de reserva si se realiza emisión alineada ordenada? ¿Cuál sería la mejora en el rendimie nto que se obtendría si se reali zase emisión no alineada y desordenada? A2.11 En la secuencia de código del ejercicio anterior, ¿cuál es el límite del flujo de datos? A2.12 Dadas las siguientes secuencias de cód igo:
206
2.16. ACTIVIDADES
LD MULTD LD ADDD SD ADDI ADDI SGT BEQZ
i 1: i2: i3: i4: i 5: i6: i7: iS: i9:
ADDI SUBD SD i3: i4: DIVD i5: SUBI i6: DIVD i7: MULTD iS: SUBD i9: LD i1@: ADDD i 11: BNEQZ i 1: i2:
F2,@(R1) F4,F2,F@ F6,@(R2) F6,F4,F6 @(R2),F6 R1,R1,#S R2,R2,#S R3,R1,#S@@ R3,i1
R1,R@,#3 F4,FS,F6 @(R1),F4 F2,F4,FS R1,R1,#1 F6,F4,FS F5,F2,F6 F1@,F2,F6 F4,@(R1) F@,F4,F2 R1,i2
Calcule los límites del flujo de datos para las dos secuencias. Las operaciones enteras consumen 1 ciclo, las cargas 3 ciclos, los almacenamientos 2 ciclos, las sumas/restas en coma flotante 2 c iclos y las multiplicaciones/divisiones 3 ciclos. A2.13 Dados los siguientes fragmentos de código:
DIV ADD ADD ADD
i1: i2 : i3: i4:
i 1: i2: i 3: i4: i5: i6: i7: iS: i9:
R1,R2,R3 R4,R1,R5 R5,R6,R7 R1,RS,R9
LD MULTD LD ADDD SD ADDI ADDI SGT BEQZ
F2,@(Rl) F4,F2,F@ F6,~(R2)
F6,F4,F6 @(R2),F6 R1,R1,#S R2 ,R2 ,#S R3,R1,#S@@ R3,i1
• Señale las dependencias de datos y de memOlia existentes. • Renombre el código e indique qué dependencias permanecen. • Analice lo que sucede con el registro R1 en sucesivas iteraciones de la segunda secuencia de código. A2.14 El siguiente conjunto de operaciones: R1 R4 R6 R7
<<<<-
R2+R3 R1-F5 R4*R7 R2+RS
%1 %1 %2 %1
ciclo de latencia ciclo de latencia ciclos de latencia ciclo de latencia 207
INGENIERíA DE COMPUTADORES 11
está ubicado en un buffer de distribución que alimenta a dos estaciones de reserva individuales asignadas cada una de ellas a una unidad funci onal de suma/resta (1 ciclo) y a una de mu ltiplicación/división (2 cicl os y segmentada). Dibuje la evolución del estado del bu ffer de di stribución, de las estaciones de reserva, del ARP, del RRF y del buffer de terminación. Tenga en cuenta que: • Se utiliza planificación con lectura de operandos. • El ARF consta de 8 registros, Rl a R8, con valores iniciales de JO a 80, respectivamente. • El RRF consta de 4 registros Rrl, Rr2, Rr 3 y Rr4. • El buffer de distribución distribuye 4 instrucciones/ciclo. • Las estaciones de reserva individuales disponen de 2 entradas. • En el mismo ciclo en que una unidad funcional genera el resultado, la estación de reserva actuali za sus bits de va lidez; esto permite que en el ciclo siguiente se pueda emitir otra instrucción y terminar la fin ali zada. A2.15 Considere un esquema de planifi cación dinámica con lectura de operandos que utiliza renombramiento basado en un RRF independ iente y con acceso asociativo. En el esquema propuesto, los valores de los operandos fuente que no tienen escrituras pendientes se leen directamente del ARF sin sufrir ningún tipo de renombramiento. Describa un pos ible proceso de renombramiento si se considerase que todos los operandos tienen que ser renombrados ¿Sobraría o faltaría algún campo en el ARF y en el RRF?
208
Capítulo 3
PROCESADORES VLIW V PROCESADORES VECTORIALES
3.1.
Guión-esquema
Los contenidos que se tratan a lo largo del tema se resumen en los siguientes puntos: • Características y arquitectura de un procesador VLIW (Vely Long Instruction Word). • Ve ntajas e inconvenientes con respecto a los procesadores superescalares. • Técnicas de planificación estática: DesenrolJamiento de bucles, segmentación software y planifi cación de trazas. • E l estilo arquitectónico EPIC (Explicity ParaUe! Instructiol! Computing). • Arquitectura básica de un procesador vectorial gené rico. Procesador matricial. • Características de las unidades vectoriales aritméticas. Registros vectoriales. • Repertorio de instrucciones vectoriales. • Vectorización de bucles de longitud desconocida med iante seccionamiento. • Manipul ación de vectores a lmacenados no consecuti va mente en memoria. Vectorización de bucles con instrucc iones condicionales. • Medida de l rendimie nto de un bucle vectOlizado. • Características de una unidad de carga/almacenamiento vec torial.
INGENIERíA DE COMPUTADORES 11
3.2.
Introducción
Desde el momento en que se construyó el primer computador electrónico digital , los esfuerzos en pro de obtener computadores con mayor capacidad de procesamiento que sus predecesores no han parado, ni es previsible que se detengan, ya sea profundizando e n el paradigma de la computación clásica o mediante los avances que proporcionará la investigación en otras formas de computación (como, por ejemplo, la cuántica) a lo largo de los próximos años. En las últimas décadas, los continuos avances en arquitectura de computadores han dado lugar a la aparición de toda una plétora de nuevas ideas, conceptos y técnicas. Si , inicialmente, se perseguía la mejora de prestaciones mediante un incre mento de la frecuen cia de reloj con el fin de procesar más instrucc iones por segundo, posteriormente se Uegó al convencimiento de que lo mejor era una aprox imación combinada, es decir, reducir la duración del ciclo de reloj pero intentando, simultáneamente, aumentar el paralelismo en todo lo relativo al procesamiento. Los estudios iniciales pusieron de manifiesto la existencia de dos vías para incrementar la potencia de un computador recurriendo al paraleli smo: el paralelismo funcio nal y el paralelismo de datos. El paralelislIlo funcio nal se obtiene mediante la replicación de las funciones de procesamiento que realiza el computador, pudiendo variar desde el procesamiento paralelo a nivel de instrucciones (granularidad fina) hasta llegar al procesamiento paralelo a nivel de programas (granularidad gruesa). Los procesadores segmentados, los procesadores superescal ares y los procesadores VLIW representan la aproximación de más bajo nivel al paralelismo funcional, basada en el aumento del paraleli smo a nivel de instrucciones. Otras aproximaciones al paralelismo funcional son los multiprocesadores y los multicomputadores, que se apoyan en el aumento del paralelismo a nivel de programas, funciones, bloques, etc., pudiendo a su vez recurrir para ello a distintos tipos de procesadores: superescalares, vectoriales, VLIW, etc. Aunque, en la actualidad, se prevé que los procesadores superescalares sean la plataforma sobre la que construir computadores de mayores prestaciones, a lo largo de las (Iltimas dos décadas ya se observó que, por su propia concepción, un procesador superescalar planteaba límites al rendimiento que podría alcanzar como unidad de procesamiento aislada. De form a muy resumida, la mejora del rendimiento de los procesadores superescalares se logra, principalmente, aumentando el número de instrucciones e mitidas por ciclo de reloj. Ello se consigue gracias a un incremento en el número y complej idad de los recursos hardware de que consta el procesador: unidades funcionales, etapa de emisión, estaciones de reserva, buffer de terminación, múltiples fi cheros de registros, etc. Todo esto provoca que estos procesadores consuman grandes cantidades de energía y produzcan mucho calor, pese a los mecanismos con que se les dota para minimizar estos inconvenientes . Cualquier intento de extraer mayor paralelismo a nivel de instrucción se traduce en un incremento de la complejidad hard ware y del coste económ ico. Por esta razón, con el fin de extraer mayor paralelismo a nivel de instrucción sin que ello repercutiese en la complejidad del procesador, en la década de los 80 aparece por primera vez el término VLlW (Very Long In slru clion Word - Palabra de Instrucción Muy Larga). Aunque la idea de los procesadores VLIW comienza a frag uarse en la década prev ia con las arquitecturas LIW (Long Inslrucliol1 Word), no es hasta medi ados de los 80 cuando surgen los primeros computadores comerciales basados en el concepto 21 0
3.2. INTRODUCCiÓN
VLIW. Aunque en los siguientes apartados se estud iará con mayor detaUe, un procesador VLIW se caracteri za por emitir en cada ciclo de reloj una única instrucción pero que contiene varias operaciones o mini-in strucciones tipo RISC (enteras, fl otantes, accesos a memoria, saltos, etc.) que se pueden ejecutar en paralelo en las diferentes unidades fun cionales segmentadas de que consta el procesador. La responsabilidad de encontrar y plani ficar con'ectamente las instrucciones del código fuente para que se puedan codificar como instrucciones VLIW y ejecutar en paralelo es responsabilidad excl usiva del compilador, y no del hardware como sucede en los procesadores superescalares. El hard ware de los procesadores superescalares se ocupa de detectar en tiempo de ejecución las instrucciones que no son dependientes y que se pueden emitir en paralelo a las un idades funcionales. Para ell o utilizan múltiples recursos hardware (buffers y estaciones de reserva) pero que proporcionan una visión limitada y parcial de las inso'ucciones que componen el cód igo ensamblador. El aumento de la visi bilidad por hard ware está limitado por la complejidad y los consabidos problemas que se deri van de ello. Por el contrario, un compi lado r di spone de una visión completa de todas las instrucciones que constitu ye n el código fuente: una ventana software de instrucciones il imi tada. Su capacidad para detectar en tiempo de co mpilación el paralelismo ino'ínseco existente entre las instruccio nes del código fu ente es mucho mayor q ue la del hardware, pero no solo por la ventana de visibilidad de que dispone sino porque no hay restricciones temporales, sencillamente tiene más tiempo para anali zar el códi go y tomar decisiones. Además, el tener acceso a todo el código fuente proporciona mucba infonnación sobre el comportamiento dinámico del programa (bucles, saltos, condiciones), que puede utilizarse para aumentar al máximo el paralelismo a ni vel de instrucción. La altemativa al paraleli smo funcional lo constituye el paralelismo de datos representado, fundamentalmente, por los computadores vectoriales. El origen de este tipo de computadores está en la década de los 60, cuando se comienza a comprende r que el incremento de las prestaciones de un procesador segmentado mediante un aumento de la frecuencia de reloj y de la profundidad de su cauce planteaba muchos problemas, bien causados por la imposibilidad para di sminuir el ciclo de reloj o por la incapacidad para la búsqueda y emisión de varias instrucciones por ciclo de reloj. Res umiendo, resultaba tan complicado gestionar un procesador con una segmentación de 11 etapas como em itir 11 instrucciones simultáneamente. En aquellos momentos, la solución a esos problemas vino dada por el empl eo de procesadores vectoriales, los cuales se caracteri zan por proporcion ar operadores de alto nivel que trabajan sobre vectores. Así, una operación vectori al tomaría dos vectores de /J e lementos, realizaría la correspondiente operación aritmética con ellos y genera.ia como resul tado un vector de otros /J elementos. Por lo tanto, una instrucción vectorial es equivalente a un bucle constituido por instrucciones secuenciales, donde en cada iteración se reali za una operación aritmética y se genera uno de los elementos del resultado. Hasta la aparición de nuevos conceptos de computación paralela, como son el procesamiento distri buido, el multiprocesamiento simétrico o el procesamiento masivamente paralelo, un computador vectorial era sinónimo de supercomputación y de computació n de altas prestaciones. Hoy en día, au nque se siguen comercializando y utili zando en aplicaciones científicas (por ejemplo, predicción atmosférica, física de partículas), los computadores vectoriales han quedado desbancados por la relación coste/rendimiento que ofertan los multiprocesadores y multicomputadores. 211
INGENIERíA DE COMPUTADORES 11
De acuerdo con esto, los objetivos que se pretenden alcanzar con el estudio de este capítulo son: • Conocer otras arquitecturas de computador di stintas al concepto de segmentación superescalar. • Entender otras formas de explotar el paralelismo a nivel de instrucción, como son las aproximaciones VLIW y EPIC. • Conocer las características de un procesador VLIW junto con sus ventajas, sus inconvenientes, sus otigenes y su proyección de futuro . • Conocer las técnicas de planificacion estática que se uti li zan para evitar la problemática que conlleva el procesamiento VLIW: desenrroll amiento de bucles, segmentación soft ware y plani ficación de trazas. • Entender las aportaciones del concepto EPIC para ev itar los inconvenientes de los procesadores VLIW. • Conocer las características básicas de los procesadores vectoriales, su evolución y sus perspectivas de futuro. • Entender las diferencias entre procesadores vectoriales y matriciales. • Comprender cómo funcionan las unidades vectoria les aritmético-lógicas y de acceso a memoria para poder conseguir un flujo de datos muy elevado. • Conocer un repertorio genérico de instrucciones vectoriales y las técnicas que se uti lizan para resolver determinados inconvenientes como son el almacenamiento de datos en memoria con separación superior a la unidad, los bucles con instrucciones ejecutadas condicionalmente o el procesamiento de vectores con UDa longitud superior a la de los registros vectoriales. • Saber estimar el tiempo de ejecución de un conj unto de instrucciones vectoriales y de un bucle escalar vectorizado mediante la técnica de seccionamiento.
3.3.
El concepto arquitectónico VLIW
Un procesador VLIW es similar a un procesador superescalar en cuanto que puede emitir y terminar varias operaciones en paralelo. La diferencia es que el hardware no tiene que intervenir para descubrir el para leli smo entre instrucciones, ya que es responsabilidad excl usiva del compil ador el generar un código binario formado por instrucciones que comporten operaciones paralelas. El hardware se limitará a emitir una instrucción por ciclo de reloj , sin preocuparse de la existencia de dependencias de datos. Esto implica que el paraleli smo que puede proporcionar el hardware gracias a sus múltiples unidades funcio nales debe ser conocido por el creador del compilador (o el programador en ensambl ador) de forma que se pueda obtener un mayor aprovechamiento del hardware. 212
3.3. EL CONCEPTO ARQUITECTÓNICO VLIW
Por lo tanto, la diferencia clave entre el enfoque superescalar, ya sea CISC o RISC, y el VLIW es cómo se realiza la planificación de las instrucciones. En una arq uitectura superescalar la planificación se realiza vía hardware y se adjetiva como dinámica , y en la VLIW se realiza vía software y se denomina planificación estática. Se define como estática ya que es el compilador el que establece la secuencia paralela de instrucciones de forma que las dependencias entre las operaciones que componen una instrucción VLlW no sean violadas y se reduzcan las detenciones de la segmentación . En un procesador VLIW se emite una instrucción por ciclo y una detención de una unidad funcional implica detener todas las unidades funcionales para mantener la sincronía en la emisión. Extrema
Moderada
Simple o
ausente
+ Superescalar tipo CISC
Superescalar tipo RISC
VLl W
Figura 3.1: Evoluc ión de la complejidad de los buffer de in strucciones, distribución , terminación y estaciones de
reserva según el tipo de arqu itectura.
La idea inmediata que se deriva de la aproximación VLlW es que la complejidad hardware, teóricamente, se reduce considerablemente y se desplaza hacia el software. Ya no son necesarios todos los recursos asociados a las etapas de decodificación, distribución y terminación de un procesador superescalar (Figura 3. 1) pues la planificación de instrucciones viene dada por el compilador. Esto se traduce en una reducción de la cantidad de transistores necesarios, de la energía consumida, del calor disipado y, lógicamente, de la inversión económica a realizar en horas de ingeniería (por ejempl o, en horas de depuración). Otra ventaja de la aproximación VLIW es que la complejidad que impli ca el desarrollo del compilador se paga una sola vez, cuando se escribe el compilador, y no cada vez que se fabrica un chip. Además, nuevas mejoras en el compilador pueden introducirse una vez que los procesadores ya están en fase de producción. Por el contrario, en un procesador superescalar una mejora en el hardware dedicado a la distribución y emisión de las instrucciones implica modi ficac iones hardware, lo que incurre en todos los gastos asociados a la construcción de un nuevo circuito. Pese a las evidentes ventajas del enfoque VLIW, la paradoja es que los procesadores superescalares triunfan comercialmente mientras que los VLIW han fracasado, por el momento. La explicación se encuentra en el análi sis de las dos razones siguientes : • La incapacidad para desarrollar compiladores que aprovechen al máximo las características del enfoque VLIW. Uno de los principales problemas es que el tamaño del códi go objeto para un procesador VLIW, en general, es mayor que para un procesador superescalar. Ello se debe a que no siempre es posible conseguir que el compilador rellene todas las operaciones de una instrucción VLIW con instrucciones del código fuente, estando forzado a completar instrucciones VLlW con operaciones NOP. Ello implica un uso inadecuado de los recursos del computador: espacio desaprovechado de la memoria principal y de la ¡-caché, unidades funcionales ociosas, aumento del tráfico de los buses, etc. Por ello se dice que el códi go VLIW es código de baja densidad. 213
INGENIERíA DE COMPUTADORES 11
• Los problemas de compatibilidad entre generaciones de procesadores VLIW. Procesadores VLIW con el m.ismo repertorio de instrucciones pero con una arquitectura diferente no son compatibles a efectos de código objeto. Por ejemplo, si las unidades funcionales tienen distintas latencias el código objeto no es compatible ya que el compilador ha planificado el código incluyendo las operaciones NOP adecuadas para que no haya vio laciones de dependencias RAW en una arquitectura con unas latencias concretas . Además, dado que la emisión de una instrucción VLIW hacia las unidades funcionales es síncrona, es fundamental que no se produzcan detenciones en espera de resultados de instrucciones previas pues ello impli ca la detención de todas las unidades funciona les para asegurar la emisión simultánea de operaciones. Los primeros computadores comerciales VLTW se produjeron a mediados de los años 80. Aunque algunos años antes ya se desarrollaron algunos prototipos, la primera máquina comerciali zada fue el computador Trace producido por la compañía Multiflow Computer creada por Joseph A. Fisher, profesor en la Universidad de Yale en el periodo 1979-198 1, y primera persona en publicar un trabajo en el que aparece el término VLIW. La segunda compañía que puso en venta una máquina VLlW fue Cydrome con el computador Cydra-5. Aunque científicamente triunfaron por sus aportaciones, el éxi to empresarial de estas dos compañías fue efímero ya que ambas cerraron a finales de los 80 (Multiflow en 1990 y Cydrome en 1988) por di versas razones. Por un lado, eran compañías pequeñas y desconocidas que vendían un producto completamente nuevo, incompatible con la base de computadores instalada, de precio elevado y sin un gran soporte comercial. Aunque hoy en día se considera que se adelantaron a su tiempo en un década, lo cierto es que la razón fundamental de su fracaso fue que no pudieron hacer frente a la revolución imparable que se produjo en el desan·ollo de microprocesadores escalares y superescalares. Los notables avances producidos por estas empresas no cayeron en el olvido. En el año 1989, lntel presenta el procesador RISC i860 (también conocido como 80860) que se caracterizaba por tener dos modos de operación: uno escalar y otro VLTW. Una instrucc ión VLIW del i860 podía contener hasta dos operaciones: una entera y una de coma fl otante. La razón de su completo fracaso fue la ausencia de compiladores adecuados que aprovechasen al máximo sus características, lo que lo inhabilitaba como un procesador de propósito general. Sin embargo, en el ámbito de aplicaciones empotradas dedicadas al procesado digital de señal consiguió un relativo éxito ya que alcanzaba un rendimiento de entre 20 y 40 MFLOPS , algo muy elevado en su momento y, especialmente, para un procesador trabajando a una velocidad de 25-50 Mhz. El testigo VLTW fue tomado por la compañía Transmeta en el año 1995, fabricando hasta su cierre, en el año 2009, los procesadores Crusoe y Affineon de 128 y 256 bits de tamaño de instmcción, respectivamente. Estos procesadores se caracteri zaban por su compatibi lidad con el repertorio de instrucciones x86, lo que lograban traduciendo las instrucc iones CISC a instrucciones VLTW mediante una capa de abstracción de software o máquina virtual, conocida como Code Morphing Software (CMS). Esta aplicación nativa VLTW se ejecutaba directamente en el núcleo VLIW y convertía el flujo entrante de instrucciones x86 en instrucciones VLTW. A fina les de los 90, Intel reconsideró nuevamente las pos ibilidades de la alternativa VLIW diseñando la arquitectura IA64 en colaboración con Hewlett-Packard . Esta arquitectura, vigente hoy en día, trata de resolver algunos de los problemas de dependencia hardware que plantea el enfoq ue VLIW y por ello recibe el nombre 214
3.4. ARQUITECTURA DE UN PROCESADOR VLlW GENÉRICO
de EPIC (Explicity ParaUel Illstructioll Computing - Computación de Instrucciones Explícitamente Paralelas). Modelos de procesadores de propósito general desarrollados por lntel basándose en el concepto EPlC son los Itanium (producido en 200 1 Y 2002), Itanium 2 (lanzado el 2002) e Itanium 9300 (anunciado el 2010).
3.4.
Arquitectura de un procesador VLIW genérico
La arquitectura de un procesador VLIW genérico se muestra en la Figura 3.2. La principal diferencia con respecto a un procesador superescalar es la ausencia de los elementos necesarios para la distribución, emisión y reordenación de las instrucc iones, es decir, para su planificación dinámica. Estos e lementos hardware no son necesarios dado que es el compilador quién reali za el trabajo de planifi cación gracias a un conocimiento preci so de las características del procesador. Aunque la Figura 3.2 no los recoge, todos aq uellos mecanismos que utilizan los procesadores superescalares para garantizar el flujo continuo de instrucciones al procesador desde memoria, evitando así detener el cauce, son perfectamente válidos para un procesador VLIW. Algunos de estos mecani smos son las colas de prefetch o el buffer de fetch/overflow. La lógica de decodificación se utili za para realizar la extracción de las operaciones de la instrucción VLIW y enviarlas a las con espondientes unidades funcionale s junto con los valores de los operandos fuente y el identificador del registro destino. En las ventanas de emi sión quedan preparados
I
I-Caché
..¿~
I
Buffer de instrucciones
I
Lógica de decodificación
j
..¿~
""
j
I Emisión I I Emisión I I
D-caChé
1==1
UF1
I
I
j
UF2
I I Op1
Fichero de
Op2
registros
7-
Opd
j --- - --- - -
---------
I Emisión I j
UFn
j
F igura 3.2: Arq uitectu ra básica de un procesador VL IW ge néri co.
215
INGENI ERíA DE COMPUTADOR ES 11
los códigos de operación y los valores de los operandos fuente para proceder a su emisión simultánea a las unidades funcionales. Observe que el fi chero de registros debe disponer de los suficientes puertos de lectura para suministrar los operandos a todas las unidades funcionales en un único ciclo de reloj . Análogamente sucede con el número de puertos necesarios para la escritura de los resultados en el fi chero de registros. Por lo tanto, a mayor número de unidades funcionales, mayor es la complej idad asociada al fi chero de registros y a la red de interconexión. En esta arquitectura genérica la unidad funcional UF I es la que se ocupa de las instrucciones de acceso a memoria, de ahí su conexión con la caché de datos, mientras que las restantes son unidades para la realización de operaciones aritméticoflógicas, considerando a los saltos y bifurcaciones como operaciones enteras. Al igual que en los procesadores superescalares, las unidades funcionales están segmentadas y presentan diferentes latencias. Los repertorios de instrucciones de las arquitecturas VLlW siguen una fil osofía RISC con la excepción de que el tamaño de instrucción es mucho mayor ya que contienen múltiples operaciones o mini-instrucciones. Una instrucción VLTW equivale a la concatenación de varias instrucciones RISC que se pueden ejecutar en paralelo, es decir, son implícitamente paralelas. Ello es posible dado que las operaciones recogidas dentro de una instrucción VLTW no presentan dependencias de datos, de memoria y/o de control entre ellas. Aunque varía según el diseño, el tamaño de instrucción VLTW más habitual es de 256 bits, si bi en se han diseñado computadores con longitudes de hasta 5 12 bits (por ejemplo, la serie Multiflow Trace 14). La Figura 3.3 muestra el formato de instrucción del MultiF low Trace 7. La instrucción tiene una longitud de 256 bits y consta de 7 operaciones de 32 bits y un campo de utilidad de 32 bits para fines diversos. De esta forma, el Trace 7 era capaz de iniciar simultáneamente siete instrucciones en cada ciclo de reloj. 256 bits
Sa lto
Carga I almace namie nto
r--
Carga I 1 1 , 1 Coma 1 Coma 1 . . almacenamie nto Entera Entera flota nte flotante Utlhdad
32 bits -----;;
Figura 3.3: Formato de instrucción de l computador Multift ow Trace 7.
Por lo general, el número y tipo de operaciones que contiene una instrucc ión VLTW se corresponde con el número y tipo de unidades funcionales ex istentes en el procesador. Si el fo rmato de la instrucción VLTW admite una operación entera y una operación en coma fl otante, el procesador debe contar con una un idad funcional entera y una unidad funcional de coma fl otante. Una instrucción VLlW con menor número de operaciones que unidades funcionales prohibiría al compilador el extraer el máx imo rendimiento del procesador al dejar unidades ociosas. Otro aspecto que debe tener en cuenta el compilador es si las operaciones que fo rman una instrucció n pueden situarse en cualquier posición denU'o de la instrucción. Si es así, la red de interconexión que comunica la lógica de decodifi cación con las ventanas de emi sión se complica ya que debe contempl ar cualquier posibilidad. Si por el contrario, cada operación tiene una posición fija asignada denu'o de la instrucción, la red de interconexión necesaria 216
3.4. ARQUITECTURA DE UN PROCESADOR VLlW GENÉRICO
se simplifica al máximo ya que basta con una conexión directa entre el campo o slot asignado a una operación y la ventana de emisión asociada a la unidad funcional. Debido a la ausencia de hardware para la planificación, los procesadores VLIW no detienen las unidades funcionales en espera de resultados. No existen interbloqueos por dependencias de datos ni hardware para detectarlas ya que el compilador se encarga de generar el código objeto para evitar estas situaciones. Para ello reClllTe a la inserción de operaciones NOP que fuerzan el avance del contenido del cauce de las unidades funcionales , evitando así su detención. Considere un sencillo procesador VLIW con un fOlmato de instrucc ión que admite una operación entera y una operación en coma flotante; las latencias de las unidades entera y de coma flotante son 1 y 2 ciclos, respectivamente. Se pretende ejecutar el siguiente código: i 1 : ADD
i2: i3: i4: i5:
MULTD MULT DIVD ADD
Rl,R2,R3 Fl,F2,F3 R4,Rl,Rl F4,F1,F1 R5,Rl,Rl
donde se aprecian dos dependencias de datos RAW entre las instrucciones il-i3 e il-iS por el contenido del registro Rl y otra dependencia RAW entre i2-i4 por el valor de F1. En un procesador superescalar, la instrucción i4 quedatía en la estación de reserva en espera de que la instrucción i2 finali zase su ejecución y publicase el valor de F1 en el bus. Análogamente, las instrucciones i3 e i S tendrían que esperar en su conespondiente estación por el resultado de i 1. En un procesador VLIW, el compilador conoce las unidades funcionales con que cuenta el procesador y sus respectivas latencias. De acuerdo con esto, las instrucciones VLIW que produciría el compilador serían las siguientes: I1:il+i2 I2: i3 + NOP 13: i 5 + i4 La dos primeras operaciones (o instrucciones RISC) se pueden colocar en la misma instrucción I1 ya que se pueden ejecutat· en pat'alelo al no tener ningún tipo de dependencia entre ellas. Ya que la latencia de la unidad entera es de un ciclo, la instrucción 12 puede contener la operación entera i3. Sin embat'go, el slot correspondiente a la operación en coma flotante debe quedar vacío ya que hay que esperar un ciclo por el resultado de i2. La instrucción 13 está formada por la operación en coma flotante i4junto con la siguiente operación entera, la conespondiente a i 5. Del antelior ejemplo se puede deducir uno de los grandes problemas que pl antea el enfoque VLlW: la necesidad de que el compilador encuentre instrucciones fuente independientes para poder rellenar todas las operaciones de que consta una instrucción VLTW. El no poder rellenar completamente una instrucción VLIW tiene dos consecuencias: • El código objeto de un procesador VLTW es de mayor tamaño que el equivalente para un procesador superescalar. Aunque el compilador deje vació el sial correspondiente a la operación, el espacio que ocupa la instrucción en memoria no se reduce, permanece igual. Simplemente, se coloca como código de operación el de no operación, NOP. 217
INGENIERíA DE COMPUTADORES 11
• No se aprovechan al máximo los recursos del procesador ya que se tienen unidades funcionales ociosas, los buses transmiten información carente de valor y las memorias cachés pierden parte de su eficiencia. Pero, además, aunque un compilador pueda ser capaz de evitar la detención de las unidades funcionales mediante una adecuada planificación de las operaciones, predecir qué accesos a memoria producirán fallos de caché es muy complicado. Esto condiciona a que las memorias caché sean bloqueantes, es decir, que tengan la capacidad de poder detener todas las unidades funcionales ante la aparición de un fal lo de caché. A medida que el ancho de la instrucción VLTW es mayor y aumenta el número de referencias a memoria, la detención de todas las unidades funcionales ll ega a ser inaceptable, limitando gravemente el rendimiento del procesador. Con el fin de incrementar el número de instrucciones independientes que se puedan utilizar para explotar al máximo el paraleli smo de un procesador VLIW, limitando el número de huecos, se han desarrollado di ferentes técnicas basadas en la manipulación de los bucles. Sin embargo, un efecto colateral de estas técnicas es que, pese a aumentar el paraleli smo entre instrucciones, producen un aumento del tamaño del código objeto.
3.5.
Planificación estática o basada en el compilador
Cuando un compilador VLTW recibe como entrada el códi go fu ente de una aplicación, antes de producir como salida el código objeto, realiza una serie de tareas encaminadas a optimizar el código para aprovechar al máximo el paraleli smo del procesador. Estas tareas pasan por producir tres elementos: un código intermedio, un grafo del flujo de control y un grafo del flujo de datos. Las principales caractelisticas del código intermedio es que está fOffilado por sencillas instrucciones tipo RISC y las únicas dependencias de datos que permanecen en él son las verdaderas, las RAW. Las dependencias de salida WAW y las antidependenc ias WAR se han eliminado dado que el compilador dispone de un número infinito de registros simbólicos. Al reas ignar los registros simbólicos en registros arqu itectónicos aparecerán dependencias fal sas pero el compilador las resolverá al generar el código VLTW mediante una adecuada política de planificación de las instrucciones que componen el código inteffiledio. El principal problema para el compilador es encontrar un número suficiente de operaciones e n el código intermedio para formar instrucciones VLTW de forma que se maximi ce el rendimiento del procesador, es decir, que trabajen todas las unidades funcional es en paralelo y que no se produzcan paradas en la segmentación por dependencias. Un problema adicional con el que se encuentra el procesador es la necesidad de extraer el máximo paraleli smo posible en tiempo de compi lación, cuando todavía no se conoce con total seguridad la secuencia de ejecución del código. Para poder generar un grafo de flujo de control es necesario, en primer lugar, conocer los bloques básicos de que consta el código intermedio. Un bloque básico se compone de un grupo de instrucciones que forman una linea de ejecución secuencial por lo que en su interior no existen instrucciones de salto con la salvedad de la última: no hay puntos intermedios de entrada y salida. Para obtener los bloques básicos se anali za el códi go intermedio teniendo en cuenta que: 216
3.5. PLANIFICACiÓN ESTÁTICA O BASADA EN EL COMPILADOR
• Una instrucción etiquetada (es decir, que es posible destino de un salto) o la siguiente instrucción a una instrucción de salto establecen el comienzo de un bloque básico o instrucción inicial. • El bloque básico se compone por todas las instrucciones que hay desde la instrucción inicial hasta la siguiente instrucción de salto que se detecte. • Los bloques se numeran de forma secuencial. La interconexión de las entradas y salidas de los diferentes bloques básicos conforma el diagrama de flujo de control. Una vez que se conocen los bloques básicos que hay en el programa, las instrucciones de cada bloque se combinan para formar instrucciones VLIW. Para ello se recurre al grafo de flujo de datos que tiene asociado cada bloque. Un grafo de flujo de datos es un grafo dirigido en el que los nodos son las instrucciones de un bloque básico, y los arcos se inician en una instrucción de escritura en un registro (instrucción productora) y tienen como destino una instrucción que lee el valor de ese registro (instrucción consumidora). De esta forma , el grafo de flujo de datos muestra las secuencias de instrucciones que no presentan dependencias entre ellas y, por lo tanto, son susceptibles de combinar para formar instrucciones VLIW. A la combinación de instrucciones de un único bloque básico para producir instrucciones VLIW se le denomina planificación local. Algunas técnicas basadas en la planificación local son el desenrollamiel1fO de bucles y la segmentación software. Sin embargo, en los numerosos estudios realizados se ha observado que el número medio de instrucc iones que forman un bloque básico oscila entre cinco y seis, por lo que la cantidad de paralelismo que se puede extraer mediante técnicas de planificación local está limitada. Para superar estos inconvenientes se recurre a la planificación global consistente en combinar instrucciones de diferentes bloques básicos con el fin de producir una planificación con mayor grado de paralelismo. Una técnica que se apoya en la planificación global es la planificación de trazas. La Figura 3.4.a muestra una secuencia de código intermedio en la que se han delimitado con cajas los bloques básicos que la componen. Los inicios de los bloques quedan determinados por las instrucciones etiquetadas y por las instrucciones situadas a continuación de un salto condicional o incondicional. La Figura 3.4.b corresponde al diagrama de flujo de control en el que la interconexiones de los bloques básicos, atendiendo a las posibles direcciones que puede seguir la ejecución del código, permiten visualizar los bucles existentes y las interrelaciones entre bloques. De cada bloque, el compilador i_ntentará extraer el máximo paralelismo existente entre sus instrucciones tenjendo en cuenta el diagrama
de flujo de datos de cada bloque, las unidades funcionales del procesador y las latencias que presentan. La Figura 3.5.a corresponde a la secuencia de instrucciones que forma el primer bloque básico de la fi g ura previa. En la Figura 3.5.b se muestra el diagrama de nujo de datos de esa secuencia en el que se puede apreciar la existencia de tres líneas paralelas de ejecución que el compilador utili zará para componer las instrucciones VLIW. Los números colocados junto a cada arco representan los ciclos de reloj que consume la unidad funcional en que se ejecuta cada operación y que el compilador utili zará para reali zar la planificación de la secuencia de instrucciones VLIW. Para completar un ejemplo de planificación local recurriendo a la secuencia de insb'ucciones del bloque básico de la Figura 3.5 .a, considere que di spone de un procesador VLIW con un formato 219
INGENIERíA DE COMPUTADORES 11
inicio:
AOO
R1,R2, R3
LO
R4,100(RO)
SUB
R5, R4,R3
MULT R6 , R2, R3 OIV
R7 , R1, R3
SO
100(RO), R7
AOO
R8, R4 , R3
SUB
R9 , R6,R4
Bloque básico 1
BNEZ R9, inicio AOO
R10 , R2 , R1
SUB
R10 , R10 , R9
Bloque básico 2
BNEZ R10 , etiqueta1 AOO
R11 , R10 , #0
JMP
final
etiqueta1: l ADO final:
I SO
R11, R9, #0 100(RO), R11
Bloque básico 3 Bloque básico 4 Bloque básico 5
(a)
(b)
Figura 3,4: Ejemplo de secuencia de cód igo intermed io con delimitación de los bloques básicos (a) y diagrama de flujo de control en el que se muestra la secuencia de ejecución de los bloques y la existencia de bucles (b). i1 : AOO
R1 , R2 , R3
i2: LO
R4 , 100(RO)
i3: SUB
R5 , R4 , R3
i4: MULT R6 , R2, R3 i5: OIV
R7 , R1, R3
i6: SO
100(RO), R7
i7:AOO
R8 , R4 , R3
i8: SUB
R9,R6,R4
2
2
i9: BNEZ R9, i1 (a)
r
i2
(b)
r
Figura 3.5: Secuencia de operaciones de un bloque básico (a) y diagrama de flujo de datos de la secuencia de instrucciones (b).
220
3.6. DESENROLLAMIENTO DE BUCLES
de instrucción que admite dos operaciones de suma/resta (un ciclo de latencia). una operacIOn de multiplicación/división (tres ciclos de latencia), una operación de carga (dos ciclos de latencia) y otra de almacenamiento (dos ciclos de latencia). Por simplicidad, las instrucciones de salto son consideradas como instrucciones de suma/resta que escriben en el registro contador de programa, por lo que consumen un ciclo. La Figura 3.6 representa la secuencia planificada de insoucciones VLIW generada por el compilador utilizando como información las latencias de las unidades funcionales y las relaciones productor-consumidor entre instrucciones dadas por el diagrama de flujo de datos. En cada ciclo de reloj se emite una instrucción VLIW hacia las unidades funcionales pero la COlTecta planificación permite que no se produzcan detenciones. En el ejemplo se aprecia que no es posible ocupar todas las operaciones de una instrucción VLIW por 10 que algunas unidades funcionales quedarán ociosas durante la ejecución del código. Además, si se considera que las instrucciones VLIW tienen una longitud de 20 bytes y que cada operación básica ocupa 4 bytes, el desaprovechamiento del código VLIW es del 64 % ya que el programa consume 100 bytes de almacenamiento en memoria pero solo un 36 % está ocupado por operaciones útiles. Operaciones Suma I Resta 1
inicio
AOO
R1 , R2 , R3 ------
SUB SUB
R5 , R4,R3 R9, R6 , R4
BNEZ
R9 , inicio
Operaciones Suma f Resta 2
Operaciones Multl Div
---- --
MULT
----- -
OIV
R6 ,R2, R3
de ca rga
Operaciones de almacenamiento
R4, 100(RO )
----- -
Operaciones
LO
R7 , R1, R3
--- - - -
------
-- - - --
------
--- - - -
----- -
- - -- --
-- ----
------
------
------
------
AOO
RB , R4 , R3
SO
100(RO), R7
Figura 3.6: Codificación de las operaciones del bloque básico en instrucciones VLIW.
3.6.
DesenroUamiento de bucles
El desenrollamiento de bucles (loop unrolling) es una técnica de planificación local que permite aprovechar el paraleli smo existente entre las instrucciones que componen el cuerpo de un bucle. Básicamente, la técnica consiste en replicar múltiples veces el cuerpo del bucle utilizando diferentes registros en cada réplica y ajustar el código de terminación en función de las veces que se replique el cuerpo, Tres son las ventajas que se derivan de esta operación. La primera de ellas es que se reduce el número de iteraciones del bucle, lo que implica una reducción de las dependencias de control al ejecutarse menos instrucciones de salto. La segunda ventaja es que el total de instrucciones ejecutadas es menor ya que no soJo se eliminan saltos sino que se reduce el número de insttucciones de incremento/decremento de los índices que se utilicen en el bucle, La tercera ventaja es que se proporciona al compilador un mayor número de oportunidades para planificar las instrucciones ya que al desenrollar el bucle queda mucho más cálculo al descubierto al incrementarse el tamaño de los fragmentos de código lineal. De esta forma, el compilador puede realizar una planificación más efectiva y generar código VLIW más compacto. 221
INGENIERíA DE COMPUTADORES 11
Para entender con claridad en qué consiste el desenro llamiento de un bucle aplicado a los procesadores VLIW se recurrirá a un ejemplo. Observe el siguiente fragmento de código intermedio generado por el compil ador: inicio : LD
ADDD SD SUB! BNEZ
F~,~(R1 ) F4,F~,F2
~(Rl),F4
R1,R1,#8
Rl,inicio
El código representa un bucle en el que se realiza la suma de una constante, almacenada en el registro F2, a todos los elementos de un vector almacenado en memoria cuyos elementos son de dobl e precisión, es decir, tienen una longitud de 8 bytes. El índice que permite acceder a los elementos del bucle se aLmacena en el registro entero Rl , que inicialmente contiene la posición en memoria que ocupa el último elemento del vector. Si, por ejemplo, se desenrolla el cuerpo de l bucle cuatro veces se obtiene la siguiente secuencia de instrucc iones: ini cio: LD
ADDD SD LD ADDD SD LD ADDD SD LD ADD D SD SUB! BNEZ
F~,~(R1 )
% Iteración i
F4,F~ , F2 ~(R1 ) ,F4 F6, -8(R 1) F8,F6,F2 -8( R1 ),F8 F1~, - 16(R1)
% Iteración i +l
% Iteración i+2
F12,F1~,F2
- 16(R1) , F12 F14, - 24(R1) % Iteración i+3 F16,F14,F2 - 24(R1 ) , F1 6 R1,R1,#32 % Decremento en 4 elementos Rl, ini cio
La secuencia de códi go generada contiene cuatro copias o réplicas del cuerpo original del bucle con sus correspondientes registros. Además, observe que el Índice se decrementa de cuatro en cuatro elementos, que son los elementos de l vector que se procesan en cada iteración del nuevo bucle desenrrollado. El desenrollamiento ha permitido que el número de iterac iones necesarias para recorrer todo el bucl e se haya dividido por cuatro y el total de instrucc iones ejecutadas sea inferior ya que se han eliminado dos instrucciones por cada nuevo desenrolJ amiento (u na de salto y otra para decrementar el Índi ce), lo que representa un ahorro de seis instrucciones e n cada iteración del bucle desemrolJado. La secuencia desenroll ada se puede reorgani za r con el fin de ilustrar la ex istencia de un mayor paral eli smo entre las instrucc iones. Esta reorganización consiste en agrupa r las instrucc iones por tipo: inicio: LD
LD LD 222
F~,~(R1)
F6,-8(R1) F1~, - 16(R1)
% i1 % i2 % i3
3.6. DESENROLLAMIENTO DE BUCLES
LO AOOO AOOO AODO AODO SO SO SO SO SUBr BNEZ
F14, -24(Rl) F4,F&,F2 F8,F6,F2 FI2,F1&,F2 F16,F14,F2 &(Rl),F4 -8(Rl),F8 -16(Rl), F12 -24(Rl), F16 Rl,Rl,#32 Rl,inicio
% % % % % % % % % % %
i4 i5 i6 i7 i8 i9 il& i11 i12 i13 i14
Considere que dispone de un procesador VLIW dotado de tres unidades funcionales: una para operaciones enteras (un ciclo de latencia), una para operaciones en coma flotante (tres ciclos de latencia) y otra para operaciones de carga/almacenamiento (dos ciclos de latencia). Las operaciones de salto se ejecutan en la unidad entera con un hueco de retardo de un ciclo por lo que penniten la planificación de una instrucción a continuación. De acuerdo con esta información, una posible planificación del código desemollado para el procesador VLIW se recoge en la Figura 3.7. En cada ciclo de reloj , la lógica de emisión del procesador emite una instrucción del código VLIW de
Operaciones Carga I Almacenamiento
inicio:
LO LO LO
Operaciones Coma flotante
Operaciones Enteras y Saltos
FO.O(R1)
--- - - -
------
F6. ·8(R1)
------
------
F10. ·16(R1)
LD F14, -24(R1) ---- --
SD SD SD
32(R1). F4
SD
ADDD ADDD ADDD ADDD
F4 . FO, F2 F8.F6. F2
- - ----
SUBI
R1.R1.#32
F12. F10.F2
------
F16. F14. F2
------
24(R1). F8
------
16(R1). F12
------
8(R1). F16
------
(a)
2
------
---- -BNEZ R1, inicio
(b)
Figura 3.7 : Instrucciones VLlW (a) y diagrama de flujo de datos (b ) ge nerado a partir de la secuenc ia de código desenrollada.
223
INGENIERíA DE COM PUTADORES 11
la Figura 3.7 hacia las unidades funcionales, no deteniéndose en ningún momento el proceso de emisión como consecuencia de una dependencia de datos entre instrucciones (salvo por fall os en el acceso a la caché de datos). Esta emisión continua de instrucciones se consigue gracias a la planifi cación estática que realiza e l compilador y que asegura que las dependencias se satisfacen al mantener la separación necesaria en ciclos de reloj entre parejas de operaciones que plantean riesgos. Esta es la razón por la que las operaciones de suma en coma flotante no se inician en el primer ciclo sino en e l tercero ya que es necesario tener en cuenta el retardo asociado a las instrucciones de carga, esto es, dos ciclos ; análogamente sucede con las instrucciones de almacenamiento que deben esperar a que los resultados de las operaciones de suma en coma flotante estén di sponibles. Por otro lado, la dependencia WAR existente entre la lectura del registro Rl por las instrucciones de almacenamiento y su escritura por la instrucción SUBI se ha resuelto teniendo en cuenta el efecto que produce el decremento adelantado del índice. Por ese motivo, las cuatro instrucciones de almacenamiento se modifican para recoger el decremento adelantado del registro Rl : como se decrementa por adel antado en 32, se suma un valor de 32 a los desplazamientos de los almacenamientos, O, -8, -16 Y -24, dando como resultado que el adelanto en la escritura de Rl provoque que los nuevos desplazamientos tengan que pasar a ser 32, 24, 16 Y 8. En este ejemplo se vuelve a poner de manifiesto el problema que plantea el tamaño del código VLlW. Si la instrucción VLJW y cada operación escalar necesitan un tamaño de 12 y 4 bytes, respectivamente, el espacio de almacenamiento desaprovechado es, aproximadamente, del 50 %. Las instrucciones VLJW ocupan 108 bytes (9 instrucciones· 12 bytes) mi entras que las operaciones originales consumen únicamente 56 bytes (14 instrucciones *4 bytes) en el caso del bucle deseru-ollado y 20 bytes (5 instrucciones *4 bytes) en el bucle original. Donde sí se aprecia una mejora es en el rendimiento. Si el vector constase de 1000 elementos, el cuerpo del bucle desenrollado cuatro veces y planificado consumil·ía, en el mejor de los casos, un total de 3500 ciclos (250 iteraciones· 14 instrucciones) mientras que el VLJW únicamente necesitaría 2250 ciclos (250 iteraciones*9 instrucciones). En este caso, el enfoque VLJW es un 55 % más rápido que la aproximación escalar deseru-ollada y planifi cada. Una vez que se conoce la versión VLJW del bucle original que se obtiene tras aplicar la técnica de deseru-ollamiento de bucles, es interesante compararla con la versión VLJW que se obtendría del bucle original sin recurrir a ninguna técnica de planificac ión local. La Figura 3.8 muestra el código VLJW que consta de seis instrucciones y tiene un tamaño de 72 bytes, de los cuales solo 20 bytes están ocupados con operaciones. E n lo que respecta a la ve locidad de ejecución del código VLJW de la fi gura, si el vector constase de 1000 elementos se tardaría en procesarlo 6000 ciclos de reloj , c ifra muy superi or al tiempo de ejecución de 2250 ciclos obtenido tras aplicar desenroJlamiento. Por lo tanto, la utilización de esta técnica de plan ifi cación local en este senc illo ejemplo como paso previo a la generación del código VLJW permite acelerar la ejecución un 166 %.
3.7.
Segmentación software
La segmentación software es otra técnica que se utili za para intentar aprovechar al máx imo el paralelismo a nivel de instrucción existente en el cuerpo de algunos bucles. La técnica consiste en 224
3.7. SEGMENTACiÓN SOFTWARE Operaciones Coma flotante
Operaciones Carga I Almacenamiento
inicio:
Operaciones Enteras y Saltos
LD FO.O(R1 )
------
------
------
------
------
ADDD F4. FO. F2
----- -
---- --
----- -
----- -
---- --
-- ----
SUBI R1.R1.#8
SD 8(R1). F4
------
BNEZ
------
R1, inicio
Figura 3.8: Instru cciones VLJW generadas a partir de la secuencia original del bucle sin aplicar ningu na técnica
de planificación local.
producir un nuevo cuerpo del bucle compuesto por la intercalación de instrucciones correspondientes a diferentes iteraciones del bucle original. Al reorganizar un bucle mediante segmentación software, siempre es necesario añadir unas instrucciones de arranque (el prólogo) antes del cuerpo del bucle y otras de terminación tras su finalización (el epuogo). Una vez que se dispone del nuevo bucle ya reorganizado, y dado que las operaciones que lo forman pertenecen a diferentes iteraciones del bucle original y son dependientes, es posible planificarlas y emitirlas en paralelo bajo la forma de instrucciones VLIW. A diferencia de lo que sucede con el desenrollamiento de bucles, un bucle escalar reordenado mediante esta técnica no consta de más instrucciones que el bucle original salvo en lo que se refiere a las instrucciones que forman el prólogo y el epuogo. La Figura 3.9 presenta un esquema de la aplicación de esta técnica a un bucle compuesto por cuatro Iteraciones 2
3
4
5
6 I
ero~1
,_""I
del bucle segmentado
A, B, A,
e, B, A, D,
e, B, A.I I D, e, ~ ~I -------------- ' I I D,
c.
B,
Patrón o núcleo
de ejecución
~I
"'-1 Figura 3.9: Aplicación de la segmentación software al cuerpo de un bucle genéri co.
225
INGENIERíA DE COMPUTADORES 11
instrucciones genéricas, A, B, e y D , donde cada una de ell as consume un ciclo de reloj y presenta una dependencia RAW con la instrucción que la precede, esto es, la D depende del resultado de la e, la e del de la B y la B del de la A. En la Figura 3.9 se puede apreciar que tras seis iteraciones del bucle original aparece un patrón de ejecución compuesto por instrucciones pertenecientes a cuatro iteraciones diferentes del bucle original y que ya no presentan dependenci as RAW entre ellas. Este patrón de ejecución o núcleo constituye el cuerpo del nuevo bucle reorganizado. También se puede observa.r que la.s instrucciones que ha.y a.ntes de la. aparición del primer patró n forma.n el prólogo del nuevo bucle y las que se encuentran tras el último patrón constituyen el epílogo. Ta.nto prólogo como epílogo están constituidos por las instrucciones que son necesarias para completar las iteraciones afectadas por las instrucciones que conforman el patrón de ejecución . En el ejemplo de la Fi gura 3.9, el prólogo consta de las instrucciones necesari as para completar las tres primeras ite raciones del bucle original y el epilogo está formado por las instrucciones que quedan pendientes para. completar la.s tres últimas iteraciones. Dado que medi ante esta técnica se ejecutan al mismo tiempo instrucciones prove nientes de múltiples iteraciones se la conoce también como plan ificación policíclica. Una. vez que se aplica la técnica de segmentación software a un bucle, las instrucciones que componen el prólogo, el patrón y el epílogo se utilizan para generar la versión VLIW del bucle original. A continuación, se presenta otro ejemplo en el que la técnica se aplica al ya conocido bucle consistente en sumar una constante a todos los elementos de un vector donde el contenido del registro Rl ma.rca la posición del último elemento del vector: i nic i o : LD ADDD SD SUB! BN EZ
FI\l , I\l ( Rl ) F4 , FI\l,F 2 I\l(Rl ) ,F4 Rl,Rl ,# 8
Rl , ini c io
E n la Figura 3. 10 se puede observar el patrón de ejecución que se obtiene tras iterar el bucle seis veces y teniendo en cuenta las latencias de las unidades fun cionales: dos ciclos para los accesos a memoria, tres ciclos para las operaci ones en coma fiotante. No se han incluido las instrucciones que decre mentan el va lor de Rl aunque sí se ha refi ejado el necesario decremento en los desplazamientos de las instrucciones de carga y almacenamiento. Además del patrón, se pueden observar las instrucciones que forman el prólogo y el epílogo y que no son más que las instrucciones necesarias para iniciar y completa.r las iteraciones del bucle que se recogen en el patrón . Una vez que se dispone del patrón, el compilador debe proceder a generar el código VLIW. Una secuencia de código VLIW genéri co correspondi ente al bucle segmentado se muestra en la Figura 3. 11 e incluye tanto el prólogo como el epílogo. Se puede aprecia.r que las instrucciones VLIW se obti enen prácticamente de forma directa del patrón. Su adaptación a un procesador VLIW específi co impli caría generar el patrón teni endo en cuenta el número de unidades fun cionales disponibles y sus latencias. Si en este ejemplo se considera que las instrucciones VLIW son de 16 bytes, el tamaño total del cód igo es de 176 bytes. En lo referente al tiempo pa.ra procesar un vector de 1000 elementos, la aproximac ión VLIW empl earía 1010 ciclos de los cuales S corresponderían al prólogo, 4 al epíJogo 226
3.7. SEGMENTACiÓN SOFTWAR E
y 1000 a las iteraciones del bucle. Aunque el concepto en que se basa es sencillo, la segmentación software puede llegar a ser extremadamente complicada de aplicar en un procesador VLIW cuando hay instrucciones condicionales en el cuerpo del bucle que impiden la aparición de un patrón de comportamiento reg ular, cuando el número de iteraciones no se conoce a priori o cuando el número y tipo de operaciones que forman el patrón de ejecución no se ajusta al formato de la instrucción VLIW. En este último ejemplo ha quedado reflejado la necesidad de recurrir a técnicas de planificac ión que permitan reubicar operaciones de diferentes bloques básicos con el fin de intentar ocupar aquellos huecos que quedan libres en el código VLlW cuando se recurre únicamente a la planificación local y aislada de Ileración 2
Iteración 1
LD FO.O(R1)
,,
Iteración 3
LD FO. ·8(R1)
Iteración 4
, , ,,,
,, ,, ,
LD FO. ·16(R1)
ADDD F4. FO. F2
Iteración 5
, , ,
LD FO. ·32(R1)
ADDD F4. FO. F2 ADDD F4. FO. F2
SD O(R1). F4
Iteraci ón 6
,, , ,, ,
LD FO. ·24(R1)
ADDD F4. FO. F2
,, ,,
LD FO. ·40(R1) ADDD F4, FO, F2
SD ·8(R1), F4 SD ·16(R1 ), F4
ADDD F4, FO, F2 SD -24(R1), F4 SD -32(R1 ), F4
D
SD -40(R1), F4
Patrón
Figura 3.10: Esquema del patrón de ejecuc ión obtenido al aplicar la técnica de segmentación software. LD FO, O(R1) LD FO, -8(R1) prólogo
patrónI
epilogo
LD FO , -16(R1)
ADDD F4, FO, F2
LD FO,·24(R1)
ADDD F4 , FO, F2
LD FO, -32(R1)
ADDD F4 , FO , F2
inicio: SD O(R1), F4
LD
FO, ·40(R1)
SD -8(R1), F4
ADDD F4, FO, F2
SD -16(R1), F4
ADDD F4 , FO, F2
ADDD F4, FO, F2
if (R1:;t: 48) 90 lo inicio
SD -24(R1), F4 SD -32(R1) , F4 SD -40(R1), F4
Figura 3.11: In struccjones VLlW genéricas obtenidas a partir de la secuenc ia del bucle seg men tado.
227
INGENIERíA DE COMPUTADOR ES 11
cada bloque básico. Este es el objetivo de las técnicas de planificación global , entre las que se encuentran la planificación de hiperbloques, la planificación de superbloques y la pl anificación de trazas, objetivo del siguiente apartado.
3.8.
Planificación de trazas
La planificación de trazas (trace scheduling) es una técnica de planificación global que permite tratar una secuencia de bloques básicos como si Fuese uno único y, a partir de ese nuevo bloque extendido dolado de un mayor número de operaciones, produci.r códi go VLlW más óptimo medi ante una adecuada planificación de las operaciones. La diferencia de unas técnicas de planificación global con otras (trazas, hiperbloques, superbloques, etc.) recae en cómo manipulan diferentes estructuras de bloques básicos para generar bloques básicos de mayor tamaño. En el caso de la plani ficación de trazas, ésta se aplica a secuencias de bloques básicos donde cualquier bloque puede tener varias entradas y salidas. Sin embargo, la plani ficac ión de hi perbloq ues se orienta hacia el tratamiento de secuencias de bloques básicos con una única entrada pero cuyos bloques intermedios pueden presentar múltiples salidas. La planifi cación de trazas es una combinación de dos pasos que se efectúan de forma consecutiva: la selección de la traza y la compactación o compresión de la traza. La selección de la traza consiste en encontrar un conjunto de bloques básicos que formen una secuencia de código sin bucles. A ese conjunto de bloques básicos es a lo que se le denomina traza. La selección de los bloques básicos dentro del grafo de fiuj o de control se realiza especulando sobre cuáles son las rutas o caminos de ejecución considerados como más probables. Para conocer cuáles serán las rutas de ejecución más probables, el compilador recurre a un grafo de fI/(io de con.trol con pesos o ponderado, que es similar al grafo de flujo de control pero asignando a cada bl oque básico una etiqueta o peso que indica la probabilidad o frecuencia de ejecución. La obtención de los pesos se puede reali zar de diferentes formas: perfi les de ejecución del programa, estimaciones software, pl anifi cación estática de saltos, etc. Por ello, una traza representa el camino de ejecución más probable. El siguiente código corresponde a un bucle en el que se recorre un vector de números enteros, A, y dos vectores de valores en coma fi otante, X e Y. En cada iteración del bucle, y en función del contenido de A[i] , se incrementa X[i] o se decrementa Y[i] con una constante almacenada en F2: f or
( i =~ ;i < n ; i ++)
if
( A[ i ] = = ~ ) th e n Xl i ] := X[i]+ a;
else Y[ i ] := Y[i] - a; e n d if; e nd f or ;
La representación en forma de código intelmedi o del cuerpo del bucle cOlTesponde al siguiente fragmento de código intermedio:
228
3.8. PLANIFICACiÓN DE TRAZAS
i n ici o: LO
BNE Z then: LO
RS, ~ (Rl) RS,else F4 ,~( R2 )
AOOO SO
F4,F4,F2
JMP
final
e lse: LO
SUBO SO final : SUB! SUB! SUB! BNEZ
~(R2),F4
F4,~(R3)
F4,F4,F2 ~(R3),F4
R2,R2,#B R3,R3,#B Rl ,Rl, #4 Rl, ini c io
% Cargar A[i] % Si (A[i ] <>~) ir a else % Cargar X[i] % X[i] : =X[i] +a % Almacenar X[i] % Cargar Y[i] % Y[i] : =Y[i] -a % Almacenar Y[i]
%Decrementar en 8 bytes % Decrementar en 8 bytes % Decrementar en 4 bytes
% Nueva iteración
La anterior secuencia de código intermedio da lugar al diagrama de fluj o de control de la Figura 3. l 2.a compuesto por cuatro bloques básicos. El compilador, en base a una técnica cualquiera, ha considerado que la secuencia de ejecución más probable es la que corresponde a que A[i] sea igual a cero lo que implica ejecutar la rama que produce el incremento de los elementos de X. La Figura 3. 12.b muestra el programa VLIW que se obtendría de codificar el código intermedio recurriendo a un procesador con las mi smas características que el utilizado en los ejemplos anteriores: tres unidades funcionales de las cuales una para operaciones enteras (un ciclo de latencia), una para operaciones en coma flotante (tres ciclos de latencia) y otra para operaciones de carga/almacenamiento (dos ciclos de latencia), las operaciones de salto se ejecutan en la unidad entera con un hueco de retardo de un ciclo. La única mejora que se ha introducido para optimizar el código ha sido aprovechar los huecos de retardo que presentan las instrucciones de salto para ubicar los incrementos de los índices . Una vez que se ha realizado la selección de la traza el compilador debe proceder a su compactación para generar cód igo en el que se minimice el número de operaciones vacías en las instrucciones VLIW y se reduzcan los ciclos de ejecución en benefi cio de las rutas de ejecución más probables. Para ello, el compilador efectúa desplazamientos de las operaciones siendo los saltos los que introducen los mayores impedimentos ya que constituyen puntos de entrada y de salida de la traza. Sin embargo, la reorganización de operaciones dentro de la traza no es una tarea trivial ya que hay que garanti zar que se preserva la corrección del programa con independencia de cuál sea la ruta más probable de ejecución. En el ejemplo de la Figura 3. 12, por muy probable que sea la ruta decidida por el compilador, siempre se puede presentar la otra alternativa, A[i] <>1\1 , por lo que será necesario tenerlo en cuenta al reorganizar el código. Antes de proseguir y para facilitar la posterior comparación del código sin plani fi car de la Figura 3. 12 con el planificado hay que analizar el comportamiento de la ejecución del código original en las dos situaciones posibles, es decir, contando los ciclos de ejecución de ambas ramas de la sentencia if. En el listado de la Figura 3.l2.b se aprecia que la ejecución de la rama supuestamente más probable del if (caso A[i] ==1\1) conlleva la ejecución de las instrucciones 1,2,3, 4,5, 6,7,8, 9, 10, 16, 17, mientras que la menos probable, (caso A[i] <>1\1) provocaría la ejecución de las instrucciones 1,2, 3,4, 10, 11 , 12, 13, 14, 15, 16, 17. En resumen, la ejecución de una iteración del bucle consumiría siempre 12 ciclos con 229
INGENIERíA DE COMPUTADORES"
inicio:
LD R5,0(R1) BNEZ R5, else
A[i] == O then:
A[i] '" O
LO F4, 0(R2)
else:
LO F4,0(R3)
AOOO F4, F4, F2
SUBO F4, F4, F2
SO 0(R2), F4
SO 0(R3), F4
JMP final
final :
SUBI R3 , R3 , #8 SUBI R2, R2 , #8 SUBI R1,R1 , #4 BNEZ R1 , inicio (a)
Operaciones Carga I Almacenamiento inicio:
then:
------
------
------
------
------
----- -
------
BNEZ R5 , else
LO F4,0(R2)
------
SUBI R1 , R1,#4
------
------
AOOO F4, F4, F2
2 3 4
------
5
------
6
------
-- - - - -
------
7
------
- - - - --
------
8
SO 0(R2), R4
------
JMP final
9
-- - - - -
SUBI R2, R2 , #8
10
LO F4 , 0(R3) ------
final:
Operaciones Enteras y Saltos
LO R5,0(R1)
------
else:
Operaciones Coma flotante
------
------
11
- - ----
SUBO F4, F4, F2
------
12
------
----- -
------
13
------
------
------
14
SO 0(R3), F4
------
------
15
------
--- ---
BNEZ R1 , inicio
16
-- ----
------
SUBI R3 , R3 , #8
17
(b)
Figura 3.12: Ejemplo de diagrama de Aujo de control en e l que se Illuestran las dos posib les secuencias de
ejecución Ca) y el cód igo VLlW generado Cb). 230
r
3.8. PLANIFICACiÓN DE TRAZAS
(a)
(b)
(e)
(d)
Figura 3.13: Posibles si tuaciones e n las que se pueden plantear des pla za mientos de operacion es entre bloques.
231
INGENIERíA DE COMPUTADORES"
independencia de cuál fuese la rama del if que tuviese mayor probabilidad de ser ejecutada. La Figura 3. 13 presenta algunos de los posibles desplazamientos de operaciones que se pueden realizar dentro de una traza. La situación correspondiente a la Figura 3.13.a implica que las operaciones representadas en el bloque B 1, que se encuentra en la secuencia de ejecución más probable, se podrían desplazar antes de la condición lo que obligaría a anular sus efectos mediante un códi go de compensación en caso de que no fuese necesaria su ejecución. Esto se ha representado en la fi gura medi ante el bloque etiquetado como - B 1 que indica que es necesario realizar las operaciones que anulen el efecto de la ejecución del contenido de B l. Los otros tres casos recogidos en la Figura 3.1 3 corresponden a situaciones en las que un bloque que se encuentra en un punto de ejecución común puede desplazarse con el objetivo de producir código más compacto. Las consideraciones que debe reali zar el compilador para desplazar operaciones dentro de una traza son las siguientes: • Conocer cuál es la secuencia de ejecución más probable. • Conocer las dependencias de datos existentes para garantizar su mantenimiento. Evidentemente, cualquier desplazamiento de operaciones no debe provocru· la violación de ninguna dependencia de datos y si se da el caso sería necesario contemplarlo en el código de compensación. • La cantidad de cód igo de compensación que es necesario añadir. • Saber si compensa el desplazamiento de operaciones dentro de la traza, midiéndose el coste tanto en ciclos de ejecución como en espacio de almacenamiento. En el ejemplo de la Figura 3. 12 se puede apreciru· que es posible aplicar el desplazamiento de operaciones correspondiente al bloque B I de la Fi gura 3.13.a. En este ejemplo, el desplazamiento conespondería a las operaciones relacionadas con la expresión X[i] : =X[i] +a por considerarse la ruta de ejecución más probable. Por lo tanto, el código de compensación necesario, bloque - B 1, sería la expresión contraria, es decir, Xli] : =X[i] -a. Aplicando esta transformación al código original , el nuevo cód igo intermedio tendría el siguiente aspecto:
inicio : LO AOOO SO LO SNEZ then: JMP e l se : LD SUSO SO LO SUSO SD final: SUS ! SUS! 232
F4,~(R2)
F4,F4,F2 ~(R2),F4
RS ,~(R l ) RS,else final F4,~(R2)
F4,F4,F2 ~(R2),F4 F4,~(R3)
F4,F4,F2 ~(R3),F4
R2 ,R 2,#8 R3,R3,#8
% Despl azami ento : % Desplazamiento: % Desplazamiento: % Cargar A[i] % Si (A [i] <>IY) ir
Cargar XCi] X[i] :=X[i]+a Almacenar XCi]
a else
% Compen sación: Cargar X[i] % Compensación: XCi] : =X[i] - a % Compensación: Almacenar XCi] % Cargar Y[i] % Y[i] : =Y[i] - a % Almacenar Y[i] % Decrementar índice de X % Decrementar índi ce de Y
3.8. PLANIFICACiÓN DE TRAZAS
SUBI BNEZ
R 1, R 1 ,#4 Rl, inicio
% Decrementar índice de A % Nueva iteración
En la Figura 3.14 se muestra el nuevo código VLIW generado a partir del código intermedio ya planificado. Al igual que en el código VLIW original, se han aprovechado los huecos de retardo que presentan las instrucciones de salto para ubicar las instrucciones de incremento de los índices. Operaciones Carga I Almacenamiento inicio
else
final.
Operaciones Enteras y Saltos
LO F4.0(R2)
------
------
LO R5,0(Rl)
------
------
2 3 4
AOOO F4. F4, F2
------
-- -- --
------
--- -- -
-- ----
--- ---
BNEZ
SO 0(R2) , F4
- - ----
SUBI Rl , Rl ,#4
6
------
----- -
JMP final
7
LO F4,0( R2)
-- ----
SUBI R2. R2. #8
8
LO F4.0(R3)
--- ---
- - - - --
then .
Operaciones Coma flotante
R5, else
5
-- ----
9
-- - -- -
SUBO F4, F4. F2
------
10
---- - -
SUBO F4, F4, F2
------
11
--- ---
---- --
- -----
12
SO 8(R2), F4
------
------
13
SO 0(R3). F4
------
------
14
- -----
---- --
BNEZ R1,
---- --
------
SUBI R3 , R3. #8
inicio
15 16
Figura 3.14: Código VLlW generado tras la planificación de traza. La secuencia de ejecución de las instrucciones del código planificado considerando la ruta de ejecución más probable ha pasado a ser 1, 2,3 , 4,5 , 6, 7,8, 15, 16, lo que implica un consumo de 10 ciclos y un decremento de 2 ciclos con respecto a la secuencia sin planificar. Si se recorre la ruta menos probable, las instrucciones ejecutadas pasan a ser 1, 2,3,4,5,6,8,9, 10, 11, 12, 13, 14, 15, 16, que equivale a uo consumo de 15 ciclos y un incremento de 3 ciclos si se compara con la ejecución de la ruta menos probable en la secuencia no planificada. Aunque la reducción no es muy elevada, el tiempo medio de ejecución del código planificado será mejor que el código original siempre que se cumpla la siguiente expresión [lO ciclos * p + 15 ciclos * (1 - p) < 12 ciclos * p + 12 ciclos * (1 - p)], donde p es la probabilidad de que la rama (A [iJ ==('i)) sea la ejecutada. En este ejemplo, siempre que p > 0, 6 la secuencia de código planificado ya consumiría un número menor de ciclos. Aunque se ha recurrido a un sencillo ejemplo académico en el que el ahorro en ciclos no es sustancial dado el reducido número de operaciones que se realiza, en él se aprecia con claridad uno de los problemas que presenta la 233
INGENIERíA DE COMPUTADORES 11
planificación de trazas: a mayor cantidad de operaciones desplazadas, mayor es la penalización en que se incurre cuando se realiza una predicción errónea. En el ejemplo previo, la penalización por predicción errónea que hay que pagar es de 3 ciclos ya que se ha pasado de consumir 12 ciclos a 15 en la rama considerada como menos probable.
Operaciones Carga I Almacenamiento inicio
Operaciones Coma flotante
Operaciones Enteras y Saltos
LO F4, 0(R2)
------
------
LO RS , 0(R1)
----- -
------
2
------
3
LO F6, 0(R3) ------
-- -- --
AOOO F4,F4, F2 ------
SUBO F6, F6, F2
BNEZ -R5; el5e
4
SUBI R1,R1 , #4
5
JMP final
6
SUBI R2 , R2, #8
7
then
SO 0(R2), F4
------
else
------
- --- - -
------
------
------
8
SO 0(R3), F6
- - ----
- - - - --
9
final
------
------
BNEZ R1 . inicio
10
------
------
SUBI R3, R3 , #8
11
Figura 3.15: Código VLlW con planificación óptima.
En el ejemplo que se ha tratado se pueden incluir diferentes optimizaciones encaminadas a reducir el número de instrucciones, generando un código más compacto. Así, el compilador podIla no incluir el código de compensación sino evitar almacenar el resultado de la operación adelantada, X[i] : =X[i] +a, si no se cumple la predicción, decidir adelantar todas las cargas recurriendo al renombrado de registros, o ubicar la operación Y[i]: =Y [i] - a en algún hueco de retardo de salto. El resultado de estas optimi zaciones se presenta en la Figura 3. 15. Ahora, las instrucciones VLIW ejecutadas por cada rama del i f son 9 (instrucciones L, 2, 3, 4, 5, 6, 7, lO, 11) Y 10 ciclos (instrucciones 1,2, 3, 4, 5, 7,8, 9, !O, 11) Y el tamaño del cód igo ha pasado de 16 a ll instrucciones. Sin embargo, muchas de las optimizaciones que se pueden aplicar de forma manual no se realizan de forma automática por el compilador ya que requieren técnicas muy complejas de implementar y que pueden producir grandes penali zaciones si la traza seleccionada no constituye la ruta más frecuente. Lo que sí resulta evidente es que cuando el tamaño de los bloques que se pueden desplazar es mayor, mayor es la capacidad que tiene el compilador para combinar operaciones básicas en instrucciones VLIW y obtener un código más compacto. Aunque la penali zac ión por predicción errónea en que se incurra sea grande, debido a que el compilador introduce código de compensación sin optimi zación alguna, si la traza seleccionada es correcta, las mejoras son notables.
234
3.9. OPERACIONES CON PREDICADO
3.9.
Operaciones con predicado
Como se ha podido apreciar, las técnicas de planificación local y global funcionan pero son difíciles de aplicar por parte del compilador, especialmente debido a las instrucciones de salto condicional , que rompen la ejecución secuencial del programa con puntos de entrada y salida. Con el objetivo de poder tratar las instrucciones condkionales como cualquier otra instrucción se idearon las operaciones con predicado (predica/ed operations), también conocidas como operaciones condicionadas (colldirioned operariolls) u operaciones con gua rda (guarded operariolls) . La utilización de operaciones con predicado permite al compilador reducir el número de saltos condicionales que hay en el código de forma que un diagrama de flujo de control compuesto por diferentes ram as con pequeños bloques básicos pueda transformarse en un único bloque básico extendido y aplicarle técnicas de planifi cación local. Al proceso de eliminar los saltos condicionales de un programa y reemplazarlos por instrucciones con predicados se conoce habitualmente en la literatura con el término ij~cm/.Version .
Una operación con predicado no es más que un a instrucción en la que su resultado se almacena o se descarta dependiendo del valor de un operando que tiene asociado. Este operando recibe el nombre de predicado y se implementa como un registro de un bit que se añade como un nuevo operando de lectura en cada una de las operaciones que conforman una instrucción VLIW. Según el valor de este registro de 1 bit, cada una de las operaciones que forman la instrucción VLIW almacenará su resultado (escritura en memOlia o escritura en registro) o lo abandonará. Por lo tanto, es la condición que determina el que una operación tenga efecto o no sobre el estado del procesador y de la memoria. Una representación habitual para indicar que una instrucción de código intermedio tiene asociado un predicado es Instrucción (p ) donde si p vale 1 indica que el resultado de la operación que realice la instrucción se almacenará y lo contrario en caso de que valga O. Por ejemplo, ADDD
F4,F2,F~
(p I)
significa que el resultado de sumar los registros F2 y F~ solo se almacenará en F4 si el predicado pI es igual a 1. Si el predicado se aplica a una instrucción de carga LD
RI,I~~ (R2)
( p 2)
quiere decir que el contenido de la posición de memoria M [1~~ +R2 l solo se almacenará en el registro RI si p 2 vale 1. Un formato para las in strucciones de manipulación de pred icados podría ser el siguiente: PRED_CLEAR
pI,p2
PRED _ EQ
pI,p2,reg,valor
PRED_NE
pl,p2,r eg,va lor
% pl:= false % p2 := false % pl:=(reg==valor) % p2 : =NOT(pl) % pI :=(reg<>valor) % p2 : =NOT(pl )
235
INGENIERíA DE COMPUTADORES 11
pl,p2,reg,valor
P 1, p2 ,reg , valor
% p1:=(reg<=valor) % p2 :=NOT(pl ) % pI :=(reg>=valor) % p2:=NOT(pl)
donde la utili zación del segundo predicado, p2 , es opcional. Si se utilizan los dos predjcados en las instrucciones de manjpulación, nunca ambos predicados podrán tener el valor true/true, solo está permitido true/false, fa lse/true y fa lse/false. La opción false/false está contemplada ya que es útil en estructuras condicionales tipo if-fhen.-e/se anidadas en donde instrucciones de ambas ramas puede que no tengan que ser ejecutadas. Es posible incluso asignar un predicado a las operaciones de manjpul ación de predicados de forma que se ejecuten en función de una condici ón previamente establecida. Por ejemplo,
PRED_EQ
pl,p2,Rl,#1~~
(p3)
indica que la instrucción solo se ejecutará si el predicado p3 es I y, en caso de que sea así, pI y p2 se asignarán a I y O, respectivamente, si el contenido de Rl es igual a 100 y a O y 1 en caso contrario. Ya que un predicado es un operando origen o destino, está sujeto a las dependencias de datos al igual que sucede con los operandos fuentes y destino de cualquier instrucción. La Figura 3.16 muestra un ejemplo de aplicación de operaciones con predicado a un bucle en cuyo interior hay una estructura if-fhen.. La Figura 3. 16.b corresponde al código intermed io cOlTespondjente al bucle genérico y la Figura 3.16.c presenta el código con instrucciones condicionadas. Mientras que el cód igo intermedio consta de cuatro bloques básicos , el código intelTIledio condicionado está formado por un solo bloque. La Figura 3.1 7 presenta la transformación de ambos fragmentos de código intermedio en instrucciones VLIW considerando un procesador con las mismas características que en los ejemplos anteriores (una unidad funcional para operaciones enteras con I ciclo de latencia, una unidad para operaciones en coma flotante con 3 ciclos de latencia, una unidad para cargas/almacenamientos que consume 2 ciclos, los sa ltos se ejecutan en la unidad entera y tienen un hueco de retardo) y ubicando las
for (i = O; i<100; i++) il (Alil == 50) then
inicio: LD
R1.0(R2)
inicio: LO
R1 , 0(R2)
SUBI R3, R1 , #50
PRED_EQ P1 , P2, R1, #50
BNEZ R3 , else
ADDI
R5, R5, #2 (P1)
11 then
ADD I
R5 , R5, #1
11 else
SUBI
R2. R2 . #4
BNEZ
R2 , inicio
j = j+2; then : ADDI R5, R5 , #2 else
JMP
j = j+1 ;
end if;
final
else: ADDt R5, R5, #1
(P2)
final : SUBI R2 . R2. #4
BNEZ R2, inicio
end for; (a)
(b)
(e)
Figura 3.16: Código fuente de un bucle genérico (a). Código intermedio (b). Código intermedio aplicando operaciones con predicado (e).
236
3.9. OPERACIONES CON PREDICADO
instrucciones para manipulación de predicados en la posición asignada a saltos y operaciones enteras. Mientras que el código VLIW si n operaciones condicionadas consume II y 9 ciclos según sea la rama de la estructura if-then que se ejecute, el código VLIW con operaciones condicionadas consume únicamente 8 ciclos con independencia de la resolución del ij~then. En ambos casos, no se ha aplicado ninguna optimización al código intentando aprovechar los huecos de retardo de los saltos. La aplicación de la técnica if-col1versiol1 a un conjunto de bloques básicos que contienen varias rutas de ejecución condicionales tiene por objetivo generar un único bloque con instrucciones condic ionadas. Un ejemplo de aplicación de esta técnica a una diagrama de flujo de control perteneciente a un bucle con
Operaciones Carga ' Almacenamiento inicio
Operaciones Coma flotante
Operaciones Enteras y Saltos
------
LO R1 , 0(R2)
------
SUBI R3, R1. #50
3
BNEZ R3. else
4
------
then ·
final ·
5
AOO I R5 , R5, #2
6
JMP final
7
------
else
2
AOOI R5. R5, #1
~--------~-----------+------~--~
8 9
SUBI R2, R2. #4 10 ~-------4--------~--~~--~ BNEZ R2 , inicio 11 ------
12
(a) inicio
LO R1 . 0(R2) ------
2
PREO EQ P1, P2. R1, #50
3
AOOI R5, R5, #2 (P1)
4
AOOI R5 , R5, #1 (P2)
5
SUBI R2, R2. #4
6
BNEZ R2 , inicio
7
------
8
(b)
Figura 3.17: lnstrucciones VLlW derivadas del cód igo intermedio
237
INGENIERíA DE COMPUTADORES 11
varias estructuras if-Ihen en su inte¡;or se presenta en la Figura 3.18. En este ejemplo se puede apreciar con total claridad cómo la utilización de instrucciones con predicado permite agrupar varios bloques básicos en un único bloque formado por un mayor número de in strucciones. Las operaciones con predicado son adec uadas para elimi nar saltos condicionales difíciles de predecir, especialmente aquellos que no forman parte de un bucle como las estructuras de tipo if-Ihen. Pero, hay que tener en cuenta que este tipo de operaciones condicionadas no se expulsan cuando entran en la segmentación si no se cumple su condición de guarda. Las operaciones condicionadas sie mpre se ejecutan, pero si su predicado sigue sin cumplirse al concl uir su procesamiento, el resultado se deshecha, es decir, pasan a ser equivalentes a instrucciones NOP. Por lo tanto, una instrucción con predicado es una forma de especulación y un uso exces ivo de este tipo de operaciones puede producir una degradac ión en el rendimiento del procesador ya que consumen recursos pero puede que no cambien el estado de la máqui na. Si todas las rutas de ejecución que hay en una región de código tienen aproximadamente e l mi smo tamaño en número de instrucciones y la mi sma frecuencia de ejecución, la eliminac ión de las estructuras if-Ihell mediante instrucciones condicionadas es una técnica muy efectiva. Sin embargo, si las diferentes rutas de ejecución presentan grandes diferenc ias en c uanto a tamaño y frecuen cia,
L1 : LD
R1 , 0(R5)
BNEZ R1, L3 L2:ADDI R1=0
R4;é
o
R1;é O
R4=O
R4;é O
R1 , 0(R5)
PRED_NE P1, P2, R1, #0
R2 , R1 , #1
ADDI
R2 , R1, #1
LD
R3,0(R6)
LD
R3 ,O(R6) (P2)
LD
R4 , 0(R7)
LD
R4,O(R7) (P2)
ADD
R4,R4,R2
ADD
R4 ,R4.R2 (P2)
JMP
L4
ADD I
R4, R4, #1
(P1)
L3 : ADDI
R4 , R4, #1
ADD I
R2 , R1 , #1
(P1)
ADDI
R2 , R1 , #1
PRED_ NE P3. P4 , R4,#O
L4 : BNEZ R4 , L6
(P2)
ADD I
R4, R4. #1
R4 . R4 , #1
SD
O(R4), R2 (P4)
SD
O(R4), R2
SUBI
R4, R4, #1
JMP
L7
SD
O(R4), R2 (P3)
R4 , R4,#1
BNEZ
R4 , L1
L5:ADDI
L6 : SUBI R4=O
L1 : LD
SD
(P4)
(P3)
O(R4), R2
L7 : BNEZ R4, L 1 (a)
(b)
(e)
Figura 3.18: Ejemplo de agrupam iento de bloques básicos mediante la transformación de esu'ucturas if-Ihell en operac iones con predicado.
238
3.10. TRATAMIENTO DE EXCEPCIONES
el rendimiento que se obtiene se reduce ya que todas las instrucciones condicionadas tienen que ser procesadas aunque solo el predicado asociado a una ruta concreta sea válido. Por otra parte, la aplicación de predicados a las instrucciones implica transformar dependencias de control en dependencias de datos por lo que resulta clave el tener en cuenta las nuevas dependencias de datos RAW que pueden surgir a la hora de desplazar las instrucciones.
3.10.
Tratamiento de excepciones
Como se ha podido apreciar, muchas de las técnicas aplicadas para aumentar el paralelismo a nivel de instrucción se basan en el desplazamiento de operaciones con el fin de generar un cód igo VLIW más compacto y que aproveche mejor los recursos del procesador. Parte de estos desplazamientos de código se realizan en base a predicciones de los resultados de los saltos condicionales de forma que cuando la predicción falla hay que ejecutar un cierto código de compensación para deshacer los efectos del bloque de operaciones ejecutadas especulativamente. Todo ello obliga a habilitar mecanismos para el tratamiento de las excepciones de forma que se garantice la consistencia del procesador y de la memoria frente a la ejecución especulativa de operaciones, de forma análoga a como se realiza en los procesadores
superescalares. Una de las estrategias aplicadas en los procesadores VLIW es la utili zación de centinelas, que es una técnica análoga al buffer de reordenamiento de los procesadores superescalares. El uso de centinelas consiste en que el compilador marca las operaciones especulativas con una etiqueta y en el lugar del programa en el que estaba el código especulado que ha sido desplazado sitúa un centinela vinc ulado a esa etiqueta. El centinela no es más que un fragmento de código que indica que la operación ejecutada de forma especulativa con la que está relacionado ha dejado de serlo. Cuando una operación marcada como especulativa se ejecuta, su resultado se almacena o marca como temporal . La ejecución del código de centinela es lo que determina que los resultados temporales se pueden escribir en sus ubicaciones definitivas: fichero de registro o memoria. Al estar el código del centinela en la posición del código especulado, la ejecución del centinela indica que las operaciones ya no son especulativas. Esta estrategia se implementa mediante una especie de buffer de terminación en el que las inso·ucciones se retiran cuando les corresponde sal vo las marcadas como especulativas, que se retiTarán cuando lo señale la ejecución del centinela que tienen asociado. De esta forma, la ejecución especu lativa de operaciones no tendrá impacto en el estado del procesador ni de la memoria, por lo que si una instrucción posterior lanza una excepción no habrá que deshacer el resu ltado de ninguna operación especulada sino eliminarla del buffer.
3.11.
El enfoque EPIC
E l aumento del nivel de lLP mediante un enfoque VLIW puro presenta una serie de problemas que constituyen un impedimento para que procesadores de propósito general basados en esta concepc ión 239
INGENIERíA DE COMPUTADORES 11
arquitectónica representen una opción alternativa a los actuales procesadores superescalares . Algunos de estos problemas son: • Los repertorios de instrucciones VLIW no son compatibles entre diferentes implementaciones. Nuevos procesadores VLIW con un mayor número de unidades funcionales implican nuevos repertorios de instrucciones VLIW más anchas, con más operaciones o con una disposición distinta en la instrucción. Por otra parte, código VLIW generado para un procesador determinado puede no funcionar en otro procesador con las mismas unidades funcionales pero latencias diferentes debido a la planificación reali zada por el compilador. • Las instrucciones de carga presentan comportamientos no determinísticos por la propi a naturaleza de sistema de memori a. Ello implica que la plan ifi cación estática de las instrucciones de carga por parte del compilador resulte muy complicada. • La importancia de disponer de un compil ador que garantice una planificación óptima del código de forma que se maximice el rendimiento del computador y se minimi ce el tamaño del cód igo. La abundancia de operaciones vacías en las instrucciones VLIW implica un rendimiento inadecuado de la I-caché y un aumento del tráfico de los buses en movimientos inútiles. Para superar tales inconvenientes surgió el esti lo de arquitectura EPIC (Explicitly Paral/el Illstrllction Computing), concepto acuñado por primera vez en 1997 por la ali anza Intel-HP aunque el proyecto de investi gación en que se sustenta se remonta a 1989 y es originario de HP. EPIC constituye una evolución del enfoque VLIW en el que se han absorbido varios conceptos del ámbito de los procesadores superescalares. Aunque muchas veces se asocia exclusivamente el concepto EPIC a la familia de procesadores Intel Itanium , EPIC representa una fil osofía para construir procesadores que se apoya en ciertas características arquitectóni cas. Al igual que los conceptos RISC o VLIW aglutinan conjuntos de características que dan lugar a diferentes arquitecturas, es posible tener diferentes arquitecturas basadas en la filosofía EPIC. Dependiendo de qué características del EPIC se usen o potencien, un procesador EPIC estará optimizado para dominios diferentes: propósito general o mercado embebido . Actualmente, los únicos procesadores comerciales basados en el concepto EPIC son los ltanium, ltanium 2 e Itanium 9300 que corresponden a sucesivas generaciones de procesadores derivados de la arquitectura lA-64 o Tntel Itanium , desarroll ada por lntel en colaboración con HP. El principal objeti vo de EPIC es retener la planificación estática del código pero mejorarla con características arquitectónicas que permitan hacer frente dinámicamente a diferentes situaciones, tales como retardos en las cargas o unidades funcionales nuevas o con diferentes latencias. La Tabla 3.1 representa de forma resumida las diferencias entre un procesador superescalar, un procesador VLIW y un procesador EPIC. En un procesador superescalar todo lo relativo a analizar las dependencias entre instrucciones, distribuirlas por tipo a las unidades funcionales y planifi car su emisión según disponibilidad de operandos y unidad funcional se reali za mediante mecanismos hardware. En el extremo opuesto se sitúa el enfoque VLIW, donde todas las responsabilidades del hardware las asume el software, esto es, el compilador. 240
3.11. EL ENFOQUE EPIC Tabla 3.1 : Diferencias principales entre las arquitecturas superescalar.
YLIW y EPre. AGRUPAMIENTO
ASIGNAC iÓN DE
SECUENCI A DE EMISiÓN
DE
UNIDAD
A LAS UNIDADES
OPERACIONES
FUNCIONAL
FUNCIONALES
Superescalar
Hard ware
EPIC VLIW
Compilador
Hard ware Hardware
Hardware Hard ware
Compilador
Compilador
Compilador
En un enfoque VLIW es el compilador el encargado de realizar el agrupamiento de operaciones básicas en instrucciones, estando la operación asignada a la unidad funcional según la posición que ocupe en la instrucción y quedando preestablecido el instante de emisión por la posición que la instrucción ocupa en el código, dado que en cada ciclo se emite una instrucción. El enfoq ue EPIC se sitúa en un punto intermedio pues es el compilador el que determina al agrupamiento de instrucciones pero, a la vez, comunica de forma explícita en el propio código cómo se ha realizado el agrupamiento. De esta forma, EPrC posibilita la compatibilidad a través de diferentes implementaciones sin necesidad de recurrir a los complicados mecanismos hardware de los procesadores superescalares. El siguiente ejemplo de código permitirá entender las diferencias con el enfoque VLIW. Considere el siguiente fragmento de código intermedio que corresponde a la operación A: =B+C:
LD LD ADDD SD
F2 , ~(Rl) F4, &(R2) F6,F4,F2 ~(R3),F6
% Carga de B en F2 desde
H[~+R l]
% Carga de C en F4 desde % Suma en F6 % Almacenamiento de A en
H[~+R2] H [~ +R3]
y que dispone de un procesador VLIW con dos unidades de carga/almacenamiento (2 ciclos de latencia), una unidad funciona l para operaciones en coma flotante (2 ciclos de latencia) y una unidad para operaciones enteras y saltos (l ciclo de latencia). La Figura 3. 19.a muestra el fragmento de código que produciría el compilador VLIW y que, claramente, ilustra el problema de ocupación de los campos de operación en formatos de instrucciones muy largos: de las 20 operaciones, 16 corresponden a NOPS y solo 4 contienen operaciones útiles. Por otra parte, el código generado no sería válido para otro procesador VLIW con las mismas latencias pero una única unidad de carga/almacenamiento. Sin embargo, el código intermedio original sí podría ejecutarse en cualquier procesador superescalar, con independencia del número y tipo de las unidades funcionales que tuviese. La Figura 3. 19.b es un ejemplo de aplicación del concepto EPlC en el que se incluye información explícita del número de operaciones que se pueden emitir en paralelo dada su independencia; mediante la información contenida entre los corchetes se puede saber cuántas operaciones consecutivas se pueden emitir en paralelo sin necesidad de conocer las características del procesador en el momento de compilar. En el ejemplo de la Figura 3. 19.b, el valor [2] ubicado a la izquierda de la priirnera instrucción de carga indica que se puede emitir en paralelo con ella la sigu iente instrucc ión que aparezca en el código; las siguientes instrucciones llevan 241
INGENI ERíA DE COMPUTADORES" Operaciones
Operaciones
Operaciones
Carga I Almacenamiento
Carga I Almacenamiento
Coma flotante
LO F2, O(R1)
Operaciones Enteras
LO F4,O(R2 )
AOOO F6, F4, F2
SO O(R3), F6 (a)
[21 LO
F2,O(R1)
[11 LO
F4,O(R2)
[11 AOOO
F6, F4, F2
[11 SO
O(R3), F6 (b)
Figura 3.19: Ejemplo de código VLlW (a) y de apEcación de información explícita sobre el agrupamiento de instrucciones independientes (b).
asociado el valor [1] que explicita que la instrucción no puede emitirse en paralelo con ninguna de las instrucciones que la preceden. A continuación, se enumeran las características arquitectónicas más destacadas del esti lo EPIC: • Planificación estática con paraleli smo explícito. • Operaciones con pred icado. • Descomposición o factorización de las instrucciones de salto condicional . • Especulación de control. • Especulación de datos. • Control de la jerarquía de memoria.
3.12.
Procesadores vectoriales
Los procesadores vectoriales son máquinas di señadas en base a una arquitectura que pennite la manipulac ión de vectores (arrays unidimensionales). Este tipo de arquitecturas se conoce como arquitecturas vectoriales, en contraposición a las arquitecturas escalares en que se basan los procesadores clásicos, los segmentados, los superescalares o los YLIWs. Para poder manipular vectores, los 242
3.1 2. PROCESADORES VECTORIALES
procesadores vectoriales cuentan con un repertorio de instrucciones en el que los operadores fuente y destino de las instrucciones no son valores escalares almacenados e n los tradic ionales registros sino que son vectores almacenados en unos registros especiales denominados registros vec toriales. Típicas operac iones vec toriales son la suma, resta, multiplicación y di visión de dos vectores, la suma o multip licación de todos los e le me ntos de un vec tor por Ull escalar, etc. Por lo tanto, e n un procesador vectorial existe n dos tipos de operandos, los operandos vectoria les y los operandos escalares, y las operaciones vec toriales pueden te ner como fuente dos operandos vectoriales o uno vec tori al y otro escalar pero el res ultado siempre será un operando vectorial. Una ventaja de este tipo de procesadores es que pueden utili zar unidades funcionales vectoria les con segmentaciones mu y profundas sin tener que preocuparse por la ex iste ncia de dependenc ias de datos. E llo se debe a que una operación vectorial implica procesar de fonna independiente pero continua cada uno de los e lementos de que constan los operandos fu ente vectoriales: para sum ar dos vec tores A y B de 64 ele mentos, la suma de l elemento A[i] al B[i] no implica ningún tipo de dependencia con la operación previa, es decir, la suma del e lemento A[i - l ] al B[i - l] , o con la suma de l A[i -2 ] al B[i -2 ] , etc. A l igual que sucede en e l enfoq ue VLlW, el encargado de generar código formad o por instrucciones vectoriales a partir del aná li sis de las operac iones que se realizan en e l códi go original es e l compilador. Otra ventaja de los procesadores vectoriales es que una única instrucción vec toria l equivale a un buc le completo de instrucciones escalares. Un ejemplo permite ilustrar esta afirmación. En la tabla ubicada a continuac ión, en la parte izquierda se indican las acciones que habría que realizar e n un procesador escalar para, por eje mplo, programar un bucle con el que sumar los elementos de dos vectores almacenados e n memori a; e n la parte derecha se presenta la equi valencia en un procesador vecto ri al. 1. Inic iali zación de los índices. 2 . Cálculo escalar (por ejemplo, una suma). 3. Ac tua Lización de los índices. 4. Comparación. 5. Salto a la instrucción 2.
l . Cálculo vectorial.
E l que una única insu'ucción vec torial equi valga a un bucle escalar completo tiene dos consecue ncias inmediatas. Por un lado, e l ancho de banda de instrucciones es menor ya que el tamaño del código es más reduc ido y no es necesario extraer tantas instrucciones de la I-caché y, por otro lado, no existen riesgos de control al e liminarse las instrucciones de salto condicional que conll eva todo bucle. El que los procesadores vec tori ales fuesen diseñados pensando en el ámbito de las apli caciones científicas les añade una ventaja adicional para manipular vectores. Las aplicaciones c ientíficas e ingeni eriles, a menudo, manipul an grandes volúmenes de datos con una baja latenc ia te mporal y es pacial lo que provoca que un sistema de jerarquía tradicional con memoria caché no sea mu y e fi caz. Pero, ade más, estos grandes volúmenes de datos, que se organi zan de forma lógica en vectores y matri ces, se ubican en me moria principal siguiendo unos patrones conocidos (el más habitual es ubicar los e le mentos consecuti va mente, fila tras fil a, o columna tras columna) con lo que es posible amOlti zar e l coste de acceso directo a la memori a princ ipal distribuyendo el espacio de direccionamiento e ntre varios bancos 243
INGENIERíA DE COMPUTADORES 11
de memoria. De esta form a, el elevado coste que hay que pagar por acceder directamente a la memoria principal en comparación con el que tiene la O-caché se paga una única vez para todos los elementos de un vector en lugar de tener que pagar el coste de acceso a la O-caché por cada elemento. Al igual que sucede con los procesadores VLIW, el compilador es el encargado de detectar y extraer el paraleli smo intrínseco que existe entre las instrucciones que componen el códi go fuente. Por lo tanto, el éx ito con que un programa puede aprovechar las características de un procesador vectorial viene determinado por la estructura del flujo de datos y de control del programa y por la capacidad del compilador. Según el método aplicado para detectar bucles escalares que puedan ser vectorizados y, una vez detectados, según el algoritmo utilizado para vectori zar el bucle, los resultados obtenidos serán muy diferentes. Sin embargo, la capacidad de este tipo de procesadores para manipular vectores es i'ligualable por lo que su uso se ha desplazado desde los grandes centros de supercomputación a los computadores de uso genérico medi ante extensiones vectoriales añadidas a los procesadores superescalares.
3.13. Arquitectura vectorial básica Al igual que los procesadores escalares, los procesadores vectoriales pueden estar basados en una arquitectura de carga-almacenamiento, con todos los operandos ubicados en los registros vectoriales, o en una arquitectura memoria-memoria, con los operandos almacenados en la memori a. Dado que todos los supercomputadores vectoriales actnales así como las extensiones vectoriales de los procesadores superescalares son del tipo carga-almacenamiento con repertorios de instrucciones tipo RISC, el contenido de este tema se centrará en ellos . Queda como curiosidad que las primeras máquinas · vectoriales, los computadores COC-Star 100 Y el Texas lnstruments ASC , eran del tipo memori amemoria.
Un procesador vectorial básico consta de una unidad de procesamiento escalar y de una unidad de procesamiento escalar (Figura 3.20). La razón de ello es que el código objeto de un programa vectori zado se compone de una combinación de instrucciones escalares e instrucciones vectoriales, en mayor o menor proporción en función de la capacidad de vectori zación del compilador. La unidad de procesamiento escalar se ocupa de atender las instrucciones escalares y las unidad vectorial las instrucciones vectori ales. Curiosamente, si en los grandes supercomputadores vectoriales la unidad de procesamiento escalar se consideraba como el hermano menor, en los actuales procesadores superescalares, la unidad vectorial se considera como un añadido a la unidad escalar que es la que constituye el núcleo fuerte de procesamiento. Las etapas IF e ID del esquema de la Figura 3.20 podrían organizarse mediante mecanismos similares a los ya descritos en los dos primeros capítulos pero con la diferencia de que, según el código de operación de la instrucción indique si se trata de una operación escalar o vectorial, se activarían unas unidades funcionale s u otras. La unidad de procesamiento escalar está compuesta por el fi chero de registros escalares y por las unidades fun cionales en las que se ejecutan las instrucciones escalares . Su organización y fun cionamiento es similar al de cualquier procesador escalar, es decir, dispondrá de unidades segmentadas para reali zar operaciones enteras, en coma fl otante, saltos, cargas/almacenamientos, etc. que trabajarán con valores del fi chero de registros escalares o leyendo y 244
3.13. ARQUITECTURA VECTORIAL BÁSICA Unidad de procesamiento escalar Fichero de registros escalares
R1 R2 R3
,
ro
Q.
'ü C
.§. ro 'C o E
"
::¡
I I
O·Caché
i
I I
I-Caché
I I
,
, , , ,, ,
,.-
,, ,,
-1 '
I
I
UF1
' 1-
UF21 ,
,,
--1 '
Rn
~----------------
- - - --
I
UFnl
¡
' 1-
-----------------
IF I ID
,,,--------------------------- ------ --- -Fichero de ,, registros vectoriales V1 V2 V3 Unidad de carga I almacenamiento
- - --
---1 ' UFV1
,,, , ,,, ,,
'--
Unidad de procesamiento vectorial ----------- ------
' r-
, UFV2 , r,,
-->1 ' UFVn
~
I
Vm
Figura 3.20: Esquema de un procesador vectorial básico.
escribiendo datos en memoria a través de la O-caché. La unidad de procesamiento vectorial consta de un fiche ro de registros vectoriales, unidades funcionales vectoriales y una unidad de carga/almacenamiento vectorial. El fichero de registros vectoriales está compuesto por un conjunto de entradas en donde cada entrada almacena los e lementos de que consta un vector. Unas especificaciones técnicas muy impOltantes en un procesador vectorial son las características del fichero de registros vectoriales ya que son fundamentales para los algoritmos de vectorización. Estos parámetros son el número de regi stros vectori ales, el número de e lementos por registro y el tamaño en bytes de cada elemento. Al número de elementos por registro se le suele identificar por las siglas MVL (Maximwn Vector Lenglh - Máxima Longitud del Vector). El número de registros vectoriales oscil a de los 64 a los 256, el número de elementos por registro de 8 a 256 y el 245
INGENIERíA DE COMPUTADORES 11
tamaño de cada elemento suele ser de 8 bytes para poder almacenar valores en coma flotante en doble precisión. Por lo tanto, la cantidad de información que puede llegar a contener un fi chero de registros vectoriales es considerable en comparación con un fichero escalar. Por ejemplo, un fichero vectorial de 256 registros de 64 elementos de 8 bytes puede almacenar hasta 128 Kbytes. Algunos procesadores vectoriales, principalmente de fabricantes japoneses como Fujitsu o NEC, tienen ficheros de regi stros vectori ales de geometría variable, aumentando o di sminuyendo el número de registros mediante una reducción o un aumento del número de elementos por registro. Otra característica a destacar de los ficheros de registros vectoriales es la necesidad de disponer de multitud de puertos de lectura y de escritura, como múümo de dos puertos de lectura y de uno de escritura por registro. El motivo de ello es poder mantener el suministro continuo de datos a todas las unidades fun cionales vectoriales cuando operan simultáneamente. La conexión de todos los puertos de lectura y de escritura con las unidades Funcionales vectoriales se realiza med iante una red de interconexión total de tipo crossbar (ver Capítulo 4). Al igual que las escalares, las unidades funcionales vectoriales están , por lo general, segmentadas y pueden iniciar una operación en cada ciclo de reloj . Las unidades vectoriales se alimentan con los elementos provenientes de los registros vectoriales pero tambié n pueden rec ibir datos de los escalares para ejecutar operaciones de vectores con escalares (por ejemplo, sumar una constante a un vector). Aunque no se ha recogido en el esquema de la Figura 3.20, y al igual en que en los procesadores superescalares, son necesaJ"ios mecanismos hardware que detecten los riesgos estructurales y los riesgos de datos que pueden aparecer entre las instrucciones vectoriales y escalares que componen un programa. Al igual que sucede en los procesadores escalares, el número de unidades vectoria les vruía según el modelo y fabricante del computador vectorial aunque siempre hay unidades para aJ"itméti ca con enteros, sumas, multiplicaciones y divisiones en coma flotante, e incluso para calcul ar raíces cuadradas. Una característica que presentan las unidades funcionales vectoriales de algunos procesadores es que pueden estar internamente organizadas en varios Ion es o carriles con el objeto de aumentar el número de operaciones que pueden procesar en paralelo por ciclo de reloj. Básicamente, una unidad fun cional con n can·iles implica que, internamente, el hardware necesario para realizar la operación se ha replicado 11 veces de forma que el número de ciclos que se e mplea en procesar un vector se reduce por un factor de 11 . La Figura 3.21 muestra la diferencia existente al realizar la operación C:=A+B, donde A, B Y C son registros vectoriales de 20 elementos, en una unidad fun cional de 4 etapas con un único carril y en otra de similar profundidad de segmentación pero con 4 carri les. Si la unidad funcional con un único cruTil genera un resultado por ciclo y tarda 20 ciclos en generar el vector resultado, la unidad con 4 cruTiles produce 4 resultados por ciclo, reduciendo el tiempo de procesamiento del vector en un factor de 4. Un problema que conlleva el empleo de un.idades segmentadas organizadas internamente en vru·ios carri les es que hay que incrementru· el número de puertos de lectura y escJitura de todos los registros vectoriales para poder suministrar en cada ciclo de reloj elementos a los cruTiles. En el caso de la Figura 3.2 1, solo para operar con la unidad de suma con cuatro carriles son necesarios cuatro puertos de lectura/escri tura por registro vectorial. Una posible organización es especializar los carriles de forma que solo tengan acceso a un subconjunto de los elementos de cada registro vectorial. La Figura 3.22
246
3.13. ARQUITECTURA VECTORIAL BÁSICA
A[19[
B [19[
, ,
,,
A[19[
B [191
A[ 141
B [14[
,, ,, ,,
,, ,,
A[ 131
B [1 3[
A[121
B [12[
A [41
B [41
",
A[3[
B [31
A [8[ + B [8[
l'
{1
,r
, ,
A[2[ + B [2[ ---------A[1[+B[1[
{1 [ C [01 [
,r
4
4
I
{1
----------
A[4[ + B [4[
{1
1
1
{ 1
{1
A[10[ + B [10[
A [9[ + B [9[ - - -------A [51 + B [5[
----------
{1
{1
A[6[+B[6[
1
{1
A[11[ + B [11[ ---------A[7[ + B [7[
{1
{4
C[3[ C[2[ C [1[ C [O[
(a)
(b)
Figura 3.21: Diferencia enlre real izar la suma de 2 vectores de 20 elementos en una unidad funcional con 2 etapas y un (mico carril (a) y en olra unjdad funcional de 2 etapas pero con 4 carriles (b).
representa la organización interna de una unidad vectorial de suma y multiplicación con cuatro carriles en donde cada carril únicamente tiene acceso a la cuarta parte de los elementos de cada registro vectorial. La unidad funcional de carga/almacenamiento vectorial se ocupa de cargar los registros vectoriales con datos extraídos de la memoria y de almacenar en ella el contenido de los mismos. Al igual que las restantes unidades funcionales también puede estar segmentada, pero su principal característica es que, tras la latencia de acceso inicial , es capaz de mantener un ancho de banda sostenido de una palabra por ciclo de reloj. El número de unidades funcionales de carga/almacenamiento de un procesador vectorial es más reducido que el de las aritméticas y suele ser de una o dos. La Tabla 3.2 recoge ciertas características de los procesadores vectoriales de supercomputadores comercializados durante las últimas décadas. Dentro de la categoría de arquitecturas de computador basadas en aprovechar el paralelismo de [os datos, existe otro tipo de procesador que, en algunas ocas iones, se califica erróneamente corno vectorial: el plVcesador matricial. Este tipo de procesador junto con el vectorial son los dos únicos representantes que se engloban dentro de la categoría STMD (Single lnstruction-Multiple Data). Al igual que un procesador vectorial, un procesador matricial cuenta con una unidad de procesamiento vectorial, una unidad esca lar y una unidad de control que discrimina según el tipo de instrucción. 247
INGENIERíA DE COMPUTADORES 11
Unidad funcional de multiplicación
,-----
,-----
,-----
,-----
Carril
Carril
Carril
Carril
O
1
2
3
Reg ¡siros vecto riales
Elemento
Elemento
El emento
Elemento
0.4.8 •...• 60
1.5.9 ..... 61
2.6. 10 . .... 62
3.7.1 1..... 63
Unidad fu ncional de su ma
Carril
Carril
Carril
Carril
O
1
2
3
'--
'--
'--
'--
Figura 3.22: Esquema de unidades vectoriales de suma y multiplicación en coma flotante con cuatro carriles y distribución de los elementos de los registros vectoriales entre ellas.
La diferencia surge en la organi zación de la unidad vectorial. En un procesador vectorial, la unidad vectorial se compone de I! unidades funcionales especializadas. En un procesador matricial, la unidad vectorial consta de I! elementos de procesamiento o EPs, constituidos por una unidad aritmético-lógica de propósito general o ALU, un conjunto de registros o REP y una memoria local o MEP. Todos los EPs se encuentran comunicados a través de una red de interconexión y pueden funcionar de forma independiente o sincronizada. La principal diferencia con respecto a un procesador vectorial es que un procesador matricial con I! elementos de procesamiento puede procesar de forma simultánea en el mismo cicl o de reloj un vector de I! elementos. En un procesador matricial , la distribución de los elementos de un vector entre las MEPs es el factor clave para aprovechar al máx.imo el paralelismo que brindan los EPs. En condiciones ideales, un procesador matricial con 11 EPs podría producir I! resultados simultáneamente al reali zar una operación vectori al y, en el peor de los casos, todos los resu ltados podrían llegar a generarse por un único EP (en este caso, la vectorización sería inexistente). Por lo tanto, un vector de m. elementos que actúe como operando fuente de una operación vectorial podría estar distribuido entre todas las MEP si m S I! y, en caso contrario, habría que distribuir los In elementos del vector de fOlma cíclica entre las I! MEPs para para lelizar la operación correctamente. En el ejemplo de la Fig ura 3.23, si la longitud de los vectores fuese superior a ocho habría que distribuirlos de forma cíclica entre las ocho MEPs con el fin de balancear 248
3.13. ARQUITECTURA VECTORIAL BÁSICA
Tabla 3.2: Características de los procesadores vectoriales de supercomputadores comerciali zados durante las últimas décadas. Se muestran las características de un único procesador vectorial aunque el comp utador pueda estm formando por varias unidades. PROCESADO R VECTORIAL
Cray- I Cray-2 Cray Y-MP Cray C-90 Convex C-4 Cray T-90 NEC SX(5 Fujitsu VPP500 Cray SV I Cray SV lex VMTPS NECSX(6 Cray X I NECSX(8 NEC SX(9
AÑo ANUNCIO
1976 1985 1988 1991 1994 1996 1998 1999 1998 2001 2001 200 1 2002 2004 2008
RELOJ
TOTAL DE
ELEMENTOS DE
UN IDADES
LANES
UNIDADES
(MHZ.)
REG ISTROS
8 BYTES POR
"FUNCIONALES
POR U.F.
DEe(A
VECTORIALES
REG ISTROS
8 8 8 8 16 8 8-64 8-256 8 8 8 72 32 72 72
64 64 64 128 128 128 512 4096-128 64
80 244 166 240 135 460 3 12 300 300 500 500 500 800 2200 3300
6 5 8 8 3 8 4 3 8 8-2 5 5 4 5 6
64 64
32 64
64 64
2 2 16 16 2-8 1 1 2
2 e., 1 a. 4 4 4 1 e., 1 a. 1+1 a. 1+ 1 a. 1
?
2
ALU j 8
ALU1
ALU 3 ALU.
8
ALU§ 8
ALU, ALU, ALU e
Figura 3.23: Ejemplo simpli ticado de la reali zación de una operación sobre dos vectores en un procesador matricial compuesto por ocho EPs.
249
INGENIERíA DE COMPUTADORES"
correctamente la carga de trabajo de los EPs y aprovechar al máximo su paralelismo. Hoy en día no se fabrican computadores comerciales basados en procesadores de este tipo. Computadores basados en una arquitectura mauicial que alcanzaron cierta notoriedad fueron elliliac IV y las supercomputadoras CM-I, CM-2 y CM-200. El llliac IV comenzó a desruTOllarse a mediados de los años 60 en la Urnversidad de lllinois y fue terminado por la NASA en el año 1974. Aunque originalmente fue diseñado para contener 256 EPs de 64 bits y alcanzru' uoa velocidad teórica de I GFLOPS , el sistema final contó únicamente con 64 EPs y una velocidad teórica máxima de 200 MFLOPS. La serie de supercomputadores Connection Machine 1,2 Y200 fueron fabricadas por la empresa Thinking Machines Corporation durante los años 80. Las CM-I, CM-2 y CM-200 originales podían configurarse con hasta 65.536 EPs de un bit aunque, posteriormente, se comercializó el modelo CM-2a con configuraciones más reducidas de 16.384 y 4.096 procesadores.
3.14.
Repertorio genérico de instrucciones vectoriales
Aunque existen diferencias, el repertorio de instrucciones vectoriales ru'itmético-Iógicas y de acceso a memoria es muy similar al de las operaciones escalares y por cada operación escalar suele existir su equivalente vectorial. Pru'a distinguir en los pán-afos siguientes a las instrucciones vectoriales de las escalru'es y evitru' así confusiones, se concatenará el sufijo V a su código de operación y los registros vectoriales se denotarán como Vi. Aunque el repertorio de instrucciones varía mucho dependiendo del fabricante y del procesador, un subconjunto de instrucciones vectoriales que está presente de uno u otro modo en cualquier repertorio comercial se presenta a continuación.
ADDV Vi,Vj,Vk ADDSV Vi,Vj,Fi SUBV Vi,Vj,Vk SUBSV Vi,Vj,Fi SUBSV Vi,Fi,Vj MULTV Vi,Vj,Vk MULTSV Vi,Vj,Fi Drvv Vi,Vj,Vk DrVSV Vi,Vj,Fi Drvsv Vi,Fi,Vj LV Vi,Ri SV Ri,Vi
Almacena en Vi el resultado de sumar los elementos de Vj y Vk. Almacena en Vi el resultado de sumar Fi a cada elemento de Vj . Almacena en Vi el resultado de restar los elementos de Vk a los de Vj. Almacena en Vi el resultado de restar Fi a cada elemento de Vj. Almacena en Vi el resultado de restru' cada elemento de Vj a Fi. Almacena en Vi el resultado de multiplicar los elementos de Vj y Vk. Almacena en Vi el resultado de multiplicar Fi por cada elemento de Vj . Almacena en Vi el resultado de dividir los elementos de Vj por los de Vk. Almacena en Vi el resultado de dividir los elementos de Vj por Fi. Almacena en Vi el resultado de dividir Fi por los elementos de Vj. Carga en Vi los elementos ubicados en memoria a partir de la posición M[Rij. Almacena los elementos de Vi a prutir de la posición de memoria M[RiJ .
Aunque con otros nombres y formatos , en cualquier repertorio de instrucciones vectoriales ex isten instrucciones para realizru' distintos tipos de operaciones aritméticas entre escalares y vectores. Análogamente, hay instrucciones de acceso a memoria que permiten cargar y almacenar todos los elementos de un registro vectorial. A continuación, se recurre al ejemplo del bucle DAXPY (Double Precision A Times X Plus Y) pru'a 250
3.14. REPERTORIO GENÉRICO DE INSTRUCCIONES VECTORIALES
mostrar con mayor detalle las diferencias entre el código escalar y el vectOlial utilizando para e llo el repeltorio genérico de instrucciones vectoriales. El código escalar que se muestra realiza la operación vectorial Y(i) = a • Xci) + Y(i) con vectores de 64 elementos de 8 bytes:
LO AOOI bucle: LO MULTO LO AOOO SO AOO I AOOI SUB BNZ
FI~,~(R5)
% Carga valor de a desde
R3,RI , #5I2
% Cálculo posición del último elemento
H[~+R5]
F2,~(Rl)
% Carga de XCi) desde
F4,F2 , FI~
% a*X(i) % Carga de Y(i ) desde H[~+R2] % Y(i) :;a "X(i )+Y(i) % Almacenamiento de Y(i) en H[~+R2] % Sumar 1 al indi ce de X % Sumar I al indice de Y % Comparar Rl con posición del último % Si no último, repetir bucle
F6,~(R2)
F6,F4 , F6 ~(R2),F6
RI,RI,#8 R2,R2 , #8 R4 , R3,RI R4, bucle
H[~+Rl]
Dado que se considera q ue la longitud de los vectores es de 64 elementos, en la aproximac ió n escalar se ejecutan 578 instrucciones (2 + 9 • 64). E l código vectorial equi valente al escalar es:
LO LV MULTSV LV AOOV SV
FI~,~(R5)
% Carga valor de a desde
VI, RI
% Carga vector X desde H[RI]
V2,VI,FI~
% a *X
V3,R2 V4,V3,V2 R2,V4
% Y: ; Y+a"X % Almacenamiento vector Y en H[R2]
H[~+R5]
% Carga vector Y desde H[R2]
A primera vista se aprecia que el número de instrucciones ejecutadas es mucho menor, solo 6 instrucciones, que en comparación con las casi 600 elel código escalar significan una reducción notable del ancho de banda dinámico. Además, el cócligo vectorial no necesita instrucciones de sobrecarga como sucede en el bucle escalar con las instrucciones para incrementar los índices o para comprobar el fina l del bucle. Otra ventaja adicional es que el código vectorial sufre menos detencio nes ya que solo se detiene una vez por operación y no una vez por cada elemento del vector, como sucede en el código escalar (si no se consideran téc nicas de planificación como el desenrollado de bucles). En el código vectorial, la instrucción MULTSVespera una única vez por la finali zación de la instrucción LV, la ADDV una vez por la fina lización de MULTSV, y la SV una vez por la ADDV. En el código escalar, las esperas son similares pero se repiten para cada uno de los elementos del vector. Tras analizar el código vectorial anterior y refl ex ionar sobre la vectorización de otros bucles surgen inmed iatamente algunas cuestiones: ¿cómo proceder cuando la long itud del vector es diferente al número de elementos de un registro vectorial?, ¿qué sucede cuando los elementos del vector se almace nan de forma uniforme pero no consecutiva en memoria? O ¿cómo se vectOliza el cuerpo de un bucle
que contiene instrucciones ejecutadas cond icionalmente? Como se verá a conti nuación, dos registros esca lares especiales tienen un papel determin ante para responder a estas tres preguntas: el reg istro de longitud vectorial VLR (Vector Length Register) y el registro de máscara VM (Vector Ma sk). El VLR cont rola la long itud de cualqu ier operación vectorial, ya sean cargas, alm acenamientos 1I 251
INGENIERíA DE COMPUTADORES 11
operaciones aritméticas. Si el tamaño del vector a procesar es menor que el valor de MVL (Maximwn Vector Lel1gth), entonces basta con almacenar en el registro VLR la longitud del vector. Si el tamaño del vector a procesar es mayor que el valor MVL, el compilador reculTe a una técnica denominada strip mil1ing y que se traduce como U'oceado del vector o seccionamiento. El seccionarniento consiste en procesar un vector de longitud mayor al valor MVL en secciones de longitud igual o inferior al MVL. Para ello, el compilador genera un bucle con insU'ucciones escalares y vectoriales que se ocupa de procesar el vector en secciones de longitud MVL (y una de longitud menor si el tamaño del vector no es múltiplo de MVL). La Figura 3.24 ilustra de fo rma gráfica el seccionamiento de un vector genérico en secciones de MVL y un ejemplo de aplicación a un vector de 200 elementos Elementos del vector = n > MVL MVL elementos
I
I
MVL elementos I
MVL elementos
m elementos m=(n mod MVL)
YLR=(n mod MYL) -,
YLR= MYL (a)
Elementos del vector = 200 > MVL = 64
4
64~-_6-4
jl----64-----'---YL: -=
-=:J-YL- :=---1J (200 mod 64)
(b)
Figura 3.24: Seccionamiento de un vector genérico en secciones de MVL elementos (a) y de un vector de 200 elementos en secciones de 64 (b). Para ello, en cada iteración se ajusta el valor del registro VLR y se cargan los registros vectoriales con la sección que corresponda. Si el tamaño del vector es de 11 elementos, en la primera iteración se procesan (11 mod MVL) elementos y en las siguientes ya se procesan secciones de longitud MVL. Para ello, en la primera iteración se asigna el valor (11 mod MVL) al registro VLR y en las siguientes el yalor MVL. Para poder manipul ar el registro VLR, los procesadores vectoriales cuentan con algún tipo de instrucciones especiales análogas a las dos siguientes: MOVI2S VLR,Ri MOVS2I Ri, VLR
Almacena en VLRel contenido del regisu'o escalar Ri. Almacena en el registro escalar Ri el contenido de VLR.
El problema de ubicar en memoria los elementos de un vector de forma no consecutiva surge cuando hay que almacenar estructuras de datos que presentan dimensiones superiores a la unidad, tal y como sucede, por ejemplo, con los arrays bidimensionales. Un ejemplo de esta problemática aparece al multiplicar dos matrices de JOOx I 00 almacenadas en los arrays A y B:
252
3.14. REPERTORIO GENÉRICO DE INSTRUCCIONES VECTORIALES
for
(i=~;
for
i < l~~;
(j=~;
C[i,j]:=
for
i++) j++ )
j
~ .~;
(k=~;
k
end for; end for; end for;
Así, dependiendo de si el almacenamiento se realiza por filas o columnas, el patrón de ubicación de los elementos de los alTays bidimensionales A, B Y e variará. La Figura 3.25 ilustra las diferencias que existen entre almacenar un aHay bidimensional de 100xlOO por filas o por columnas . Según el tipo de operación a realizar con el array, puede ser necesario acceder a los elementos que componen una fila o una columna, los cuales, según la forma de ubicación , tendrán una separación unitruia o de cien elementos. Por filas -
Por columnas -
adyacentes B(i, j) B(i , j+1 )
adyacentes B(i,
n B{i+1, j)
Figura 3.25: Almacenamiento unidimensional por filas o por columnas de una estructura bidimensional de 100x1OO.
Para poder solucionar el problema de cargru' y almacenar datos que se encuentran ubicados en memoria de forma no consecutiva pero siguiendo un patrón uniforme, los procesadores vectoriales disponen de instrucciones especiales de cru'ga y almacenamiento con indicación de la separac ión entre datos: LVWS Vi,(Ri,Rj) SVWS (Ri,Rj),Vi
Carga Vi comenzando desde la posicion H[Ri] con una separación de Rj. Almacena Vi a partir de la posición H[Ril con una separación de Rj .
En estas instrucciones, el contenido del registro Ri es la posición del primer dato y Rj mantiene la separación en memoria que existe entre los datos restantes. El sufijo WS conesponde a la expresión inglesa wilh stride que puede traducirse como con distancia de separación. Al igual que las instrucciones de carga y almacenamiento clásicas, estas instrucciones están también afectadas por el valor del registro especial VLR. Otra forma de manejru' este tipo de cru'gas y almacenamientos es mantener instrucciones únicas de cargas y almacenamiento pero que utilizan un registro de propósito especial en el que se indica la separación que debe aplicarse en los accesos a memoria. 253
INGENIERíA DE COMPUTADORES 11
El tercer inten'ogante al que tiene que dar repuesta el repertorio de instrucciones de un procesador vectorial es el que se plantea cuando hay que vectorizar bucles en c uyo cuerpo hay instrucciones ejecutadas condicionalmente. Esto provoca que, dependiendo de la condición, ciertos elementos de un vector no tengan que ser manipulados. Para ello se recurre a una máscara de MVL bits de longitud almacenada en el registro especial VM. El valor del bit que ocupa la posición i en la máscara determina si se reali zarán (bit a l) o no (bit a O) las operaciones sobre los elementos que ocupan la posición i en los registros vectoriales . Al igual que sucede con el regist.ro VLR, existen instrucciones especiales para gestionar el contenido de este registro:
LV Vi,Vj
S__ SV Fi, Vi RVM MOVF2S VM,Fi MOVS2F Fi,VM
Compara (EQ, NE, GT, LT, GE, LE) elemento a elemento el conten ido de Vi y Vj . El resultado de la comparación de cada elemento es un bit (c ierto= 1, fa lso=O) que se almacena en el regi stro VM para formar una máscara. Simil ar a la anterior pero utili zando un valor escalar en la comparación. Iniciali za a I todos los bits del registro VM. Almacena en VM el contenido del registro en coma flotante Fi. Almacena en el registro Fi el contenido del registro VM.
Un ejemplo habitual en el que es necesario recunir a la utilización del registro VM es en la vectorizac ión de bucles como el que se muestra a continuación: Ci=~;
for
if
i<64; i+ +)
CA[i]!=~)
then
B[i] : =B[i]/A[i]; end if; end for;
Dado que ex iste una instrucción con ejecución condicionada, es necesario reculTir a la utili zación del registro de máscara vectori al, colocando prev iamente a O en el VM los bits cOITespondientes a los elementos de A[i] que son iguales a O. Una posible codificación del bucle anterior con instrucciones vectori ales podría ser:
LV LV SNESV
VI, RI V2,R2
Drvv
V2,V2,Vl
RVM SV
R2,V2
F~,VI
% Carga en VI el vector A % Carga en V2 el vector B % Compara cada elemento de A con i\l % Operación con control de máscara % Inicializa a 1 la máscara % Almacena todos los elementos de B
La mayor parte de los procesadores vectoriales incluyen vm'ios registros de máscm'a para contro lar las operaciones que se real izan sobre los registros vectori ales. Sin embargo, según cómo esté implementado el control de operac iones mediante máscm'a pueden surgir algunos inconvenientes. Por un lado, puede suceder que el tiempo de procesamiento no se red uzca pese a que no se realicen las operaciones, es
254
3.15. MEDIDA DEL RENDIMIENTO DE UN FRAGMENTO DE CÓDIGO VECTORIAL
decir, que las no operaciones indicadas por la máscara se reemplacen por operaciones tipo NOP. Por otro lado, puede ocurrir que el enmascaramiento afecte únicamente al almacenamiento del resultado pero no evite la operación con lo que se podría dar lugar a la aparición de excepciones. En el ejemplo del bucle anterior, si se realizase una operación de divi sión por cero se produciría una excepción pese al control de la máscara ya que la máscara evita el almacenamiento del resultado de la división , no la operación en sí mi sma.
3.15.
Medida del rendimiento de un fragmento de código vectorial
Para poder calcular la cantidad de ciclos de reloj que consume la ejecución de un fragmento de códi go vectori al es necesario, en primer lugar, entender cómo calcular el tiempo de ejecución de una única instrucción vectorial . Tras esto, y en función de las mejoras que se apliquen, como son el encadenamiento de resultados o el solapamiento de paquetes de instrucciones, podrá estimarse el tiempo total de ejecución de un fragmento de código vectorial o el cuerpo de un bucle vectorizado. Tres son los factores que afectan al tiempo de ejecución de una única instrucción vectori al: la latencia en producir el primer resultado o tiempo de arranque, el número de elementos a procesar por la unidad funci onal y el tiempo que se tarda en completar cada resultado o tiempo por elemento. La expresión que indica el número de ciclos que se tarda en completar una instrucción vectorial que procesa un vector de n elementos es
Con la excepción de la unidad funcional de carga/almacenamiento, en las restantes unidades funcio nal es vectoriales el tiempo de arranque es similar al número de segmentos de que constan. Es decir, si una unidad vectorial está compuesta por 6 etapas y se considera que cada etapa consume un ciclo, el tiempo de arranque es equi valente a la latencia inicial de la unidad, es decir, 6 ciclos. Tras esto, el Te/emeH,o que se tarda en completar cada uno de los restantes 11 resu ltados es un ciclo. Esto es así gracias a que la unidad funcional vectorial se encuentra segmentada y a que las operaciones que reali za sobre los elementos de un vector son independientes unas de otras. Esto permite un aprovechamiento muy eficaz de su cauce ya que tras la latencia inicial , correspondiente al tiempo de alTanque, es posible tener en un instante dado ocupadas todas las etapas con elementos del vector. La F igura 3.26 ilustra el tiempo, expresado en ciclos de reloj, que tarda en procesarse una multiplicación de dos vectores de 64 elementos en una unidad funcional compuesta de 10 etapas donde cada etapa consume un ciclo de reloj. Cuando se trata de calcular el tiempo de ejecució n de una secuencia de instrucciones vectoriales es necesa¡;o tener en cuenta si las instrucciones vectorial es afectan o no a diferentes unidades funcionales
y si ex isten dependencias verdaderas entre ell as, es decir, si son operaciones independi entes. Si no ex isten dependencias verdaderas y no hay riesgos estructurales, vari as instrucciones pueden planificarse y ejecutarse sin ningún tipo de penalización formando lo que se conoce como convoy o paquete. En principio, solo se puede emitir un nuevo convoy cuando todas las instrucciones del convoy antelior han 255
INGENIERíA DE COMPUTADORES 11 V2
V3
: : : :Multiplicación PF : : : :
MULTV V3 , V2, V1
l.
I
I
I
,
I
I
,
,
I
I
I
I
•
I
I
1-- - - -
I
V1
T_
= 10 ciclos
T_
= 1 ciclo
T~ =
10 ciclos + 64 elementos * 1 ciclo = 74 ciclos
Figura 3,26: Tiempo de ejecución de una operación de multiplicación sobre 2 vectores de 64 elementos,
finalizado su ejecución. A lo largo del capítulo se considerará que la velocidad de emis ión es de un convoy por ciclo de reloj . En caso de que existan dependencias verdaderas o estructurales entre instrucciones será necesario esperar a que los operandos estén disponibles o a que la unidad fun cional se encuentre libre para poder formar varios convoyes. La Figura 3.27 ilustra estas dos posibles situaciones utilizando una unidad de suma y otra de multiplicación con tiempos de arranque de 6 y 7 ciclos, respectivamente, y una longitud de vector de 64. Evidentemente, cuando ya se trata de una secuencia de instrucciones vectoriales, el tiempo por elemento es equivalente al tiempo promedio que emplean el conjunto de un..idades fu ncionales implicadas en generar un nuevo resultado. Análogamente sucede con el tiempo de a!Tanque, es decir, es la suma total de los ciclos de reloj que se consumen sin que las unidades produzcan resultados. En la Figura 3.27 se ilustra cómo se calcula el tiempo de arranque y el tiempo por elemento en ambas situaciones. Lo habitual para obtener el T eleme,,'o es obtener el tiempo total de ejecución de toda la secuencia, descontar los ciclos no productivos por inicialización de las unidades y dividir el valor final por el número de elementos del vector. Por lo general, el tiempo por elemento expresado en ciclos es igual al número de convoyes. Además del T", otra medida que permite expresar el rendimiento de un procesador vectOJia! es el número de operaciones en coma flotante (FLOP) realizadas por ciclo de reloj : R,,= (Operaciones en coma flotante
* n elementos) / T"
En los ejemplos de la Figura 3.27, las operaciones en coma flotante que se realizan sobre los 64 elementos son dos (una suma y un producto), por lo que el total de FLOP es 128. A mayor valor de R", mejor será el rendimiento obten ido a! ejecutar el códi go vectorial. Una técnica que permite mejorar el rendimiento de un procesador vectorial es el encadenamiento de resultados entre unidades fu ncionales (chaining). El encadenamiento permite que una unidad funcional pueda comenzar a operar tan pronto como los resultados de la unidad funcional de que depende estén di sponibles. Este concepto es similar a! mecanismo de adelantamiento de la etapa EX en las segmentaciones escalares si se considera que un registro vectorial de 11 elementos está fOJmado por un conjunto de n registros individuales independientes. De esta forma , aunque dos operaciones sean 256
3.15. MEDIDA DEL RENDIMIENTO DE UN FRAGMENTO DE CÓDIGO VECTORIAL ADDV
V1, V2, V3
MULTV V4, V5, V6
ADDV
6 I
64
7
64
MULTV I
l ,'
T54 = 7 + 64 = 71 ciclos T"""""",= 7 ciclos
T.......,10 =
R.. =
64 elementos · 1 ciclo
---=---=-===--'.-"''''-64 elementos
= 1 ciclo
----===:::--=--::..::.::::..::=== 64 elementos * 2 FLOP/elemento 71 ciclos
= 1,8 FLOP I ciclo
(a) ADDV
V1, V2, V3
MULTV V4, V5, V1
ADDV
/
T~ =
7
I
6+7
= 13
ciclos
64 elementos· 1 ciclo + 64 elementos· 1 ciclo
64 elementos R~
/
64
(6 + 64) + (7 + 64) = 141 ciclos
_=
T....
MULTV
;'
64
6
= 2 ciclos
64 elementos * 2 FLOP/elemento
= ....::..:..::==~:-=":--'====::.. =0,9 FLOP I ciclo 141 ciclos
(b)
Figura 3.27: Ejecución de un convoy de 2 instrucciones (a) y de 2 convoyes de una única instrucc ión (b).
dependientes, el encadenamiento pennite que se realicen en paralelo sobre elementos diferentes de un vector y formen parte del mismo convoy. Si se permite encadenamiento, dentro de un convoy pueden existir instrucciones dependientes pero nunca deben existir riesgos estructurales entre ellas. La Figura 3.28 presenta un ejemplo de encadenamiento en el que la unidad de multiplicación puede comenzar a operar en cuanto el primer resultado de la unidad de suma está di sponible. El encadenamiento permite 257
INGENIERíA DE COMPUTADORES 11
reducir el tiempo por elemento gracias al solapam iento pero no así los tiempos de arranque. Como se ha indicado previamente, no podrá emitirse otro convoy hasta que todas las instmcciones que componen el convoy que se ha emitido no concluyan su ejecución. Otra posibilidad es permitir la ejecución solapada de diferentes convoyes. Esto implica que una instrucción vectoJial pueda comenzar a uti li zar la un.idad fun.c ional antes de que una operación previa haya conclu ido. El permitir el solapamiento de convoyes complica mucho la lógica de emi sión pero permite ocultar los tiempos de arranque para todos los convoyes excepto para el primero. La Figura 3.29.a presenta un ejemplo de 2 convoyes con encadenamiento entre unidades funcionales y sin solapamiento por lo que hasta que la última inslmcción del primer convoy no se complete no se podrá emitir el siguiente convoy (ciclo 77). La Figura 3.29.b corresponde a la ejecución de los 2 convoyes pero con encadenamiento y solapamiento. Ahora, antes de que se completen las primeras instrucciones de suma y multiplicación se in icia la ejecución de las segundas de forma que los tiempos de arranq ue quedan ocultos.
3.16.
La unidad funcional de carga/almacenamiento vectorial
El elemento hardware más crítico en un procesador vectorial para poder alcanzar un rendimiento óptimo es la unidad de carga/almacenam iento. La razón de ello es que debe ser capaz de poder intercambiar datos con los registros vectoriales de forma sostenida y a una velocidad igualo superior a la que las unidades funcionales aritméticas consumen o producen nuevos elementos, esto es, a ADDV
V1, V2, V3
MULTV V4, V5, V1
¡¡
Q
ADDV
13
70
, , ,, ~1~ 6 +(__~_______6~4~________~ ,,,
7,7 ciclos
MULTV ~1~74-__________~64~________~
T~=
T_
(6 + 7) + 64 = 77 ciclos
= 6 + 7;; 13 ciclos
To I t _ ;;
64 elementos" 1 ciclo ---'----'--:.......:......."---'-'-'---
64 elementos R ;; 64
;; 1 ciclo
64 elementos" 2 FLOP/elemento 77 ciclos
= 1,66 FLOP I ciclo
Figura 3.28: Ejecución de dos instrucciones con encadenam ien to en tre las unidades funciona les.
258
3.16. LA UNIDAD FUNCIONAL DE CARGA/ALMACENAMIENTO VECTORIAL
ADDV
V1. V2. V3
1
Convoy 1
MULTV V4. V5. V1
ADDV
V6. V7. V 1
Q
~
70
1,3
1
Convoy 2
MULTV VB. V6. V4
83
7.7
~o
147 1~4
ciclos
: ADDV 64
ADDV
1
6 I
64
7
MULTV
T~ =
64
MULTV
1
I 7
64
(6 + 7) + 64 + (6 + 7) + 64 = 154 ciclos
T ""_ = 26 ciclos
T_"", =
64 elementos· 2 ciclos
= 2 ciclos
64 elementos
64 elementos· 4 FLOP/elemento
154 ciclos
= 1.66 FLOP I ciclo
(a) Q
~
I
I
64 7,0
13
7,7 ciclos
ADDV
I
6
64
I
6 , __~________~____~A~D~D~V~I==tl--:---------~~----------~ 1.:' ~~ 1 64 I ,
MULTV
:' 27~____________~~~__~M~U:LTV~~;=7~1'.¡------------~~------------~
l·
Tr..= (6 + 7) + 64 + 64 = 141 ciclos T ...._ = 13 ciclos
T_
=
64 elementos * 2 ciclos
= 2 ciclos
64 elementos
R64 =
_"6"4..::e:::le"m"e",n,,l,,os,,-·.::4.::F.::L"O"-P.::/" e:::le:::m.::e,,n...lo=,141 ciclos
= 1,81
FLOP ' ciclo
(b)
Figura 3.29: Ejecució n de dos co nvoyes de in strucc iones con encadenamien to e ntre unidades. Sin so lapa mie nto entre co nvoyes (a)
y co n solapamien to ( b) .
259
INGENIERíA DE COMPUTADORES 11
T.
TeJ.mImIo * n elementos (a)
ToIemento * n elementos
T.
(b)
Figura 3.30: Diferencias entre instrucciones de carga (a) y almacenamiento (b) en la visibilidad de los tiempos de acceso y por elemento.
T elemento. Esta alta velocidad de transferencia se consigue organizando físicamente la memoria en varios
bancos o módulos y di su·ibuyendo el espacio de direccionamiento de forma uniforme entre todos ellos. Dimensionando adecuadamente el número de bancos de memoria en función del tiempo de acceso a un banco, T a , se consigue que la latencia para extraer/almacenar un dato de/en memoria quede ocu.lta mientras se transfieren los demás elementos que componen un vector a/desde un registro vectorial. Por dato o elemento se entiende una palabra que en el caso de un procesador vectorial suele tener una longitud de 8 bytes. Aunque la Uludad de carga/almacenantiento difiere en su organización y funcionantiento de las aritmético-lógicas, también se puede caracterizar por un tiempo de alTanque y un tiempo por elemento, aunq ue su significado fís ico sea diferente. En una operación de carga de un registro vectorial, el tiempo de alTanque es igual a T a ya que es el tiempo que transcurre desde que se solicita el primer elemento del vector al sistema de memoria hasta que está disponible en el puerto de lectura del banco pal·a su posterior transferencia al registro vectorial. El tiempo por elemento se considera como el número de ciclos que se consumen en transferir el dato ya disponible en el banco de memori a al registro vectorial (por lo general, inferior a un ciclo pero se iguala a uno para equiparal'lo al T elemento de las unidades funcionales). Análogamente, en una operación de escritura en memoria, el tiempo por elemento se considera como el tiempo que se emplea en transferir un elemento desde un registro vectorial al puerto de escritura del banco de memoria y el tiempo de arranque se puede ver como el tiempo que emplea el banco en escribir el último elemento del vector en una posición del banco de memori a. Por lo tanto, el tiempo de arranque y el tiempo por elemento se ven de forma opuesta según se trate de una operación de carga o de almacenamiento (Figura 3.30) aunque, en ambos casos, el tiempo que consume una operación de acceso a memoria para un vector de n elementos es similar, esto es, (T a + n ' T elemen,o) ciclos. Dado que cada vez que se solicita un dato de un vector al sistema de memori a hay que pagar siempre la latencia de acceso T a , la lectura de los" elementos de que consta un vector supondría un coste de n*Ta ciclos, lo que es totalmente inadmisible si se pretende mantener un ancho de banda sostenido igua l a T elemento. Para poder ocu 1tal· toda esta latencia es fundamental dimensional· correctamente el número de bancos de memoria de forma que solo se vea el tiempo de acceso correspondiente al primer elemento del vector y que los tiempos de acceso de los demás elementos queden ocul tos. Esto se consigue distribuyendo los" elementos de un vector entre 111 bancos de memoria pal·a que se solapen los (n- 1)*T a 260
3.16. LA UNIDAD FUNCIONAL DE CARGA/ALMACENAMI ENTO VECTORIAL
ciclos de acceso de n - 1 elementos del vector con los n* T ef,memo ciclos que se emplean en enviar los n elementos a un registro vectOlial. Esta latencia inicial es lo que se considera como el tiempo de arranque de la unidad de carga/almacenamiento. Un dimensionamiento conecto siempre tiene que cum plir que el número de bancos de memoria m sea mayor o igual que la latencia de acceso al banco de memoria expresada en ciclos de reloj , es decir, m ~ T a . Aunque el resultado fin al es similar, ex isten dos fonnas de realizar el solapamiento de las latencias de acceso a los n datos de un vector: de fonn a síncrolla y de forma asíncroll a. Por simplicidad, al describir las dos fonnas de acceso se considerará que T a es igual a m y que se está realizando una operación de carga vectorial. La aproximación síncrona implica solicitar simultáneamente un dato a los 111. bancos cada T a ciclos. Reali zada la primera petición y transcUlTidos T a ciclos estarán disponibles los m primeros elementos del vector para ser transferidos al registro vectori al, lo que consume m.* T t.dell/emo ciclos. Ahora, cada T a ciclos se realizan dos acciones : (1 ) se efectúa una nueva petición simultánea a todos los bancos
para extraer los m elementos siguientes del vector y (2) se comienza a tra nsferir ciclo a ciclo los 111 elementos ya disponibles y que fueron solicitados en la petición anterior. La Figura 3.3 1.a ilustra de forma gráfica esta forma de solapar los tiempos de acceso al realizar la carga vectori al. El acceso asíncrono implica solicitar los elementos de que consta el vector a cada uno de los 171 bancos de forma periódica con periodo T a con un des fase entre bancos consecutivos de T elememo ciclos. De esta forma, comenzando en el ciclo O y cada T a ciclos el banco O solicita un dato, en el ciclo I y cada T a ciclos el banco I solicita un nuevo dato, y así sucesivamente hasta el banco 11! - l . En el momento en que un banco tiene el dato disponible realiza dos acciones: ( 1) efectúa la nueva solicitud de dato y (2) tra nsfiere el dato ya disponible al registro vectorial. La Figura 3.3 1.b muestra cómo se realiza el acceso asíncrono a los bancos. El mismo razonamiento se aplicaría para las escri turas pero de forma inversa: primero se transfieren los elementos y luego se realizan los accesos al banco. Evidentemente, para que todo funcion e correctamente las palabras que componen un vector deben estar distribuidas correctamente entre los bancos de memoria. Los bancos de memori a, por lo general, tienen un ancho de palabra de 8 bytes, se direccionan por bytes y son un número que es potenc ia de 2 (para simplificar el direccionamiento). La di stribución de los elementos de un vector en los bancos de memOlia se rea li za de fOlma consecutiva y cíclica a partir de una posición de memori a inicial que es múltiplo del ancho de palabra en bytes (en este caso, 8 bytes). Cuando se va a leer un vector de memoria, se analiza la posición de memoria del primer elemento para así conocer el número del banco en que se encuentra, tras lo que se inicia la lectura de todo el vector tal y como se ha indicado anterionnente. La Figura 3.32 muestra un ejemplo en el que se distribu yen las pal abras entre 8 bancos de memoria direccionados por bytes. Dada una dirección de memoria, el número de banco en que se encuentra está determinado por los bits de orden inferior de la dirección de memoria teniendo en cuenta que la distancia entre datos es de 8 bytes. Para entender cómo se realiza, a continuación se muestran en binario algunas de las direcc iones de memoria tratadas en el ejemplo de la Figura 3.32. 136: Ox 10001000 (banco 1) 144: Ox L0010000 (banco 2) 261
INGENIERíA DE COMPUTADORES 11
Número de banco
~
T. ciclos
O el- - - - - +-,--:,----11 - r -r - - 1
Solicitud del dato
2
I
1
1
1
1
1
1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1-1- - - - - - 1
"
,
1 1 111 1 1 1
1 1 1
~ -:- - -- -:- - - - - -- - - - - - -- - - - - - - e-----~,
m-1 1 1 1
1 1 1'/ 1
1 ciclo '
f.:
1 I I
H -:- - -- -H - ~ - - - -:- -- - - - - - - - -- - - - -- - - - - -- - - -- - -H -.- - - -~ - - - - - - - -1 - H - - - - -: - ·H - - - - ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - -: 2 ~ - - - - - - - -i - ~ -~ - - -:- -i - t-J-- -~ - - -- - - - - - - - - - - - - - - - - - - - - - - --:- f - ~ - --
O ~- -- - - - Envio del dato al registro vectorial
-1- -
1
r-,- ---- ,-- --- -- -- --- --- ----- el-------1 1- T - :- - - - -:- - - - - - - - - - - - - - - - - - - - el-----__1
1 I
t--+ ----
1
1
1
1
1
1
, 1
m-1
I
I
1
I
I
1
1
I
,
, ,
,
,;- - - - - - - - ~ -~ -:-- - t-i -~ -~ --
I
r---l- __ __ -- - - ____ __ -- - - - _ - ___ _ __ J _ l _ '_ - - t-t I
,
1
,
ciclos
O
T,
T. -+2m
T..-+m
(a) Número de banco
~
Ta ciclos
O el- -----1f-r-'-r-----lI Solicitud del dalo
1 2
f -,- - - - - ,- - - - - - - - - - - - - - - -
:---1
el------1
--- -i------ - -- ------ ----- --- >I-- -+-_i___1 ,,
, m-1 ~
- - - - - - el--7--7--7---1--",: -'-'----11 ,
• , 1 ciclo ,
I
'1/
,
1 /.:
,
l
-
- -
- - -
-
- -
- -
-
-
- -
- -
-
- -
-
- -
-
- -
If-:--:---:---~
,
, , , - - - - - - - H -:- - - ~ -H - ~ -- ~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - H -:- - - -1 ~ - - - - - - - -i - H - - - ~ -:- H -- - ~ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -:- H - - - - 2 ~ - - - - -- - -i - i- -t-J -~ -:- -i - ~- ~- - - - - - - - - - - - - - - - - - - - - - - - - - - - -: - 1- - ~ - --
O~ Envio del dalo al registro veclorial
- - - -
~ ----~- - - --- ----- - -- -- ----- >I----_i___1
t-
,
I
I
I
:
:
:
I
,
1
I
,'11 ," I
,
,
1
1
1
\~
,
1
t
,1
1
1
' I
,
1
, - - - - - - - ~ -~ -:- - - t-i- ~ - ~ --
m-1 ~
O
-
, ,, ,
\:
~ - - - - - - - - - - - - - - - - - - - - - - - - - - - ~ - } -:- - - t-t
-I-I-I--t--+t-'---t -- - - -- -- -Ta
:
T,,+2 :
T..-+1 T. -+3
T.-+m-+1
.
H--'--+tT.+(n-m)
T¡¡+m:
T.-+(n-m-+1)
ciclos
,' T +n T.+n-1
(b)
Figura 3.31: AcceSo síncrono (a) y asíncrono (b) a los bancos de memoria para transferir un vecto r a un reg istro vectorial mediante una operación de carga. Se considera T u = 111 .
262
3.16. LA UNIDAD FUNCIONAL DE CARGA/ALMACENAMIENTO VECTORIAL Bancos de memoria
o ro
'§ E ID E ID
"O
w ID
e
o
ií ~
i5
o 64 128 192 256 320 384 448
o 8 16 24 32 40 48 56
8 72
136 200 264 328 392 456
1 9 17 25 33 41 49 57
16 80 144 208
272 336 400 464
2 10 18 26 34 42 50 58
4
3
2
24 88 152 216 280 344 408 472
3 11 19 27 35 43 51 59
32 96 160 224 288 352 416 480
4 12 20 28 36 44 52 60
5
40 104 168 232 296 360 424 488
5 13 21 29 37 45 53 61
6
6 14 22 30 38 46 54 62
48 112 176
240 304 368
432 496
7
56 120 184 248 312 376 440 504
7 15 23 31 39 47 55 63
I 8 bytes
8 bytes
8 bytes
8 bytes
8 bytes
8 bytes
8 bytes
8 bytes
Figura 3.32: Almacenamiento en 8 bancos de un vec tor de 64 elementos de doble precisión a partir de la direcc ión de memoria O. Los números co ntenidos en las celdas represe ntan el orden del elemento en el vector. no su valor.
152: Ox 10011000 (banco 3) 160: Ox10100000 (banco 4) 168: Ox 10101000 (banco 5) 176: Ox 10110000 (banco 6) 184: Ox 10111000 (banco 7) 192: Ox 11000000 (banco O) Despreciando los tres bits de orden inferior al direccionar datos de 8 bytes, los tres bits siguientes determinan el banco de memoria en que se encuentra la dirección de memoria que se pretende leer. En este caso, los bits que determinan el banco de memoria son 3 ya que hay 8 bancos de memoria, es decir, log2(8) = 3. Evidentemente, aunque en los ejemplos anteriores el primer elemento de un vector se ubicaba en el banco O, el segundo elemento en el banco 1 y así sucesivamente, lo habitual es que el primer elemento del vector se ubique en cualquier otro banco. Si , por ejemplo, el acceso a los bancos fuese asínc rono con T" de 6 ciclos y el primer elemento del vector se ubicase en la dirección 80, la plimera petición se reaUzaría al banco 2 (80=OxO I010000), la segunda al banco 3 (88=OxO I011000), la tercera al banco 4 (96=OxO I100000), y así suces ivamente. En lo que respecta al banco 2 y una vez solicitado el contenido de la dirección 80 en el ciclo O, en el ciclo 6 ya se dispondría del dato y se enviaría al registro vectorial , en el ciclo 8 se solicitaría la dirección 144 y así sucesivamente. La Figura 3.33 ilustra el proceso de solicitud y transferencia de los datos. 263
INGENIERíA DE COMPUTADORES 11
Bancos de memoria
o
1
2
3
4
6
5
80
O
88
1
96
2
104
3
112
4
120
5
6 Ciclo
128
Envio
136
7
Envio
144
6
Envio
152
9
Envio
160
O
Envio
168
1 2
7
Envio
176
Envio
184
Envío
3
Envio
4
5 ;
,
Envio
,
; (a)
80 al 136 1144 al 200 1208 al 264 1272 al 328 1336 al392 1400 al 456 1464 al 520 1528 al 584 1 Djrecd~nes de . memoria accedIdas 1
o
6
14
22
3.
30
46
54
62
70 Ciclos
(b)
Figura 3.33: Esquema de la transferencia de un vector de 64 elementos ubicado a partir de la posición de memoria 80 en un sistema de memoria organizado en 8 bancos con acceso asíncrono y con Tu de 6 ciclos (a). Relación temporal entre los accesos a los bancos y las palabras enviadas (b).
3.17.
Medida del rendimiento de un bucle vectorizado
En los apartados anteriores se ha descrito cómo calcular el rendimiento de un conjunto de instrucciones vectoriales organi zadas en uno o dos convoyes. Sin embargo, la estimación del tiempo de ejecución en un procesador vectorial de un bucle que ha sido vectorizado implica tener en cuenta factores adicionales. Como ya se ha indicado, para vectorizar un bucle, un compi lador aplica la técnica strip mining y prod uce una mezcla de cócligo escalar y vectorial en el que el procesamiento del bucle se realiza por secciones o trozos. El sigui ente pseudo-código muestra las operaciones que son necesarias para vectorizar el bucle DAXPY de n elementos con la técnica strip mining: 1: primero: = 1; 2: secc ion es:= n /MV L;
264
% Primer elemento de la sección % Secciones de ffVL elementos
3.17. MEDIDA DEL RENDIMIENTO DE UN BUCLE VECTORIZADO
3: VLR:=n med MVL; for (i=®;i<=secciones;i++) 5: ültimo: =primero +VLR - l;
4:
6: 7: 8:
fer (j=primere; j <=últime;j ++) Y[i) :=a*X[i)+Y[i); end fer;
9:
primero: =pri mero+ VLR;
VLR:=MVL; 11 : end fer; 1~:
% Longitud de la primera sección % Bucle exterior % Último elemento de la sección % Bucle interior % Operaciones vectoriales % Primer elemento de la nueva sección % Inicio longitud de la nueva s ección
donde n contiene el número de elementos del vector, primero indica la posición en el vector del primer elemento de la sección a procesar, secciones es el número total de secciones de MVL elementos que hay en el vector, VLR indica la longitud de la sección del vector a procesar en cada iteración del bucle interior (la primera vez será menor o igual que MVL) y úl timo es la posición en el vector del último elemento de la sección que se procesa. Mediante el bucle exterior (líneas 4 a 11 ), el pseudocódigo descompone el procesamiento del vector de n elementos en secciones de una longitud máxima de MYL elementos, con la salvedad de la primera sección que puede tener una longitud inferior si n no es múltiplo de MVL (línea 3). Por esa razón, tras la primera iteración del bucle interior es necesario reiniciar el valor de VLR a MVL (línea 10). Con la salvedad del bucle interior (líneas 6, 7 Y 8), que el compilador traduce en instrucciones vectoriales, el resto de las operaciones es código escalar con sus costes adicionales. Los costes de ejecución de las instrucciones vectoriales y escalares obtenidas de la vectorización del bucle se pueden desglosar en cuatro componentes: • T ba ,,: Es el tiempo que consumen las instrucciones escalares de preparación antes de abordar el
bucle exterior. Corresponderían a las instrucciones escalares generadas para las líneas 1,2 Y 3. En los procesadores vectoriales actuales este tiempo se ha reducido mucho pudiendo incluso llegar a ser despreciable con respecto a los demás factores. •
Tbuc/e: Son los costes derivados de ejecutar en cada iteración del bucle exterior las instrucciones escalares necesarias para realizar el seccionamiento. Son los tiempos de ejec ución de las instrucciones escalares derivadas de las líneas 4, 5, 9, 10 Y 1l.
•
TmTauque : Es
•
T efemellfo :
la suma de los tiempos de a!Tanque visibles de las unidades funcionales que se utilizan en cada convoy de instrucciones . Es igual al número de convoyes en que se organizan las instru cciones vectOliales que se
delivan del bucle interior (líneas 6, 7 Y 8). Su valor depende fuertemente de las características de la unidad vectorial: encadenamiento y número de unidades funcionales. En base a estos tiempos, la expresión que permite determinar el tiempo total de ejecución en ciclos de reloj de un bucle vectorizado que reali za operaciones sobre vectores de longitud n es
265
INGENIERíA DE COMPUTADORES 11
TI! = Tbase
+
rM~L 1* (Tblfc/e + T(ll'rllll(J/le ) + n * T eleme1l1o
r
donde e l operador ceiling x1 representa el siguiente valor entero superior a x. En la expresión de Tn , este operador obtiene el número total de secciones en que se ctividen los vectores a procesar, con independencia de que haya una sección de longitud inferior a MVL. El resultado del operador se multiplica por los costes asociados al procesamiento de cada sección, Tb"c/e Y Ta rranq" .. ya que ambos dependen del número de secciones en que se descompone el vector. Finalmente, para obtener el número total de ciclos hay que añader el T elemento que consumen los n elementos del vector y los costes adicionales que introducen las instrucciones escalares iniciales, es declr, el Tblt se' Otra medida del rendimiento de un bucle vectorizado es la velocidad de procesamiento de un bucle de longitud infinita expresada en FLOP por ciclo de reloj . Se expresa como
Roo
, = hm
(OperaCiones vectoriales 11 --+00 Tu
* n)
Si se desease expresar el rendimiento en FLOPS (FLOP por segundo) habría que multiplicar el resultado de la expresión previa por la frecuencia de reloj del procesador vectorial. Para concluir este apartado, se va a realizar un ejemplo del análisis del rendimiento de un procesador vectorial al ejecutar el código obtenido de vectorizar el conocido bucle DAXPY para vectores de 11 elementos. El procesador vectorial consta de una unidad de suma (6 ciclos de latencia), una unidad de multiplicación (7 ciclos de latenc ia), una unidad de carga/almacenamiento (12 ciclos de latencia), MVL es 64 y la frecuencia de reloj es 500 MHz. El fragmento de código vectorial que se genera para realizar las operaciones Y(i) : =a*X(i)+Y(i) es:
LV MULTSV LV ADDV SV
VI, RI
% Carga de una sección de X
V2,VI,F~
% Operación vectorial
V3,R2 V4,V3,V2 R2,V4
% Carga de una sección de Y % Operación vectorial
a'~X a'~X+Y
% Almacenamiento sección de Y
y los costes debidos a las instrucciones escalares son T base = 10 ciclos y Tbnc/e = 15 ciclos. Inicialmente, se considera que solo se emite un nuevo convoy cuando las instrucciones de l convoy anterior han terminado.
Caso 1: Sin encadenamiento de resultados entre unidades Analizando los liesgos estructurales y de datos existentes entre las cinco instrucciones vectoriales, los convoyes existentes son cuatro:
266
3.17. MEDIDA DEL RENDIMIENTO DE UN BUCLE VECTORIZADO
Convoy 1: Convoy 2: Convoy 3: Convoy 4:
LV MULTSV LV ADDV SV
VI,RI V2 , VI , F~ V3,R2 V4 , V3 , V2 R2,V4
La secuencia de ejecución de los cuatro convoyes, si se considera que VLR es 64, es la que se muestra en la Figura 3.34.
LV I
12
Teku"Bl1to
64 MULTSV
I,
,
LV ,
,
7
, , "
64 64
12
=4 ciclos
ADDV ,I
,
6
,
64
I
SV
64
12
Figura 3.34: Secuencia de ejecución de los cuatro convoyes con VLR = 64.
Dado que hay cuatro convoyes, Teleml!lIfo es 4 ciclos y el tiempos de arranq ue visibles de los cuatro convoyes. Esto es
T l//TclIIqlle
total es igual a la suma de los
2 * T llrral1qucLV + T arrallqlleADDV + T U/,/'{/lIqll eSV
Tarranqtut =
T""""uque
= (2 * 12 + 6 + 12) ciclos = 42 ciclos
Sustituyendo los valores conocidos de
Y T elem cl/fo en la expresión que detenruna el tiempo
Tarrallqlle
de ejecución de un bucle vectorizado para vectores de longitud
Tu = 10 +
¿1*
r
11
se tiene
(15 + 42) + 4 * 11
que para el caso particular de 11 = 1000 es
TIOOO
10001 = 10 + 64
r
T lOoo = 10 + 16
* (15 + 42) + 4 * 1000
* (15 + 42) + 4 * 1000
T 1000 = 4922 ciclos 267
INGENIERíA DE COMPUTADORES 11
El rend imiento expresado en FLOP/ciclo es
2*,, ) Roo = lím ( II-too TII 2 * 11
Roo = lím [ 10 +
"-' 00
r~~ 1.(15 + 42) + 4 • n
)
Para simplificar los cálculos, la expresión rl1 /641 se puede reemplazar por una cota superior dada por (/1 /64 + 1). Sustituyendo esta cota en Roo y teniendo en cuenta que el número de operaciones vectoriales que se reali zan en el bucle DAXPY son dos, una multiplicación y una suma, se tiene
Roo = lím I I -HJO
n + 1) • (15 + 42) + 4. 10 + ( 64
Roo
/1
2. n ) = "-'00 lím ( 67 + 4, 89 * n
Roo = 0,409 FLOP/ciclo Para expresar Roo en FLOPS habría que multiplicar el valor en procesador. Se tendría así
Roo
FLa p/c iclo
por la frecuencia del
= 0,409 FLap/ciclo * (500 * 106) Hz Roo = 204, 5 MFLOPS
Caso 2: Con encadenamiento de resultados entre unidades Dado que ahora es posible encadenar los resultados de las unidades, la organ ización del código vectori al en convoyes quedaría de la siguiente forma: Convoy 1: Convoy 2: Convoy 3:
268
LV MU LT SV LV ADDV SV
VI,RI V2 , VI, Hl V3, R2 V4,V3,V2 R2,V4
3.17. MEDIDA DEL RENDIMIENTO DE UN BUCLE VECTORIZADO
El tercer convoy se mantiene debido a que no se permite que en un mi smo convoy haya instrucciones que presenten riesgos estructurales . Por esa razón, en el segundo convoy no pueden coexistir dos instrucciones con acceso a la única unidad de carga/almacenamiento disponible. La secuencia de ejecución de los tres convoyes se muestra en la Figura 3.35. LV
12
T~'e"",nIO
64
= 3 ciclos
,....:.::....,~----'-'----~
MULTSV
7 _
~I--'--
_ _64 ::..c.._ _
,
64
LV , 12
6
64
ADDV~I--'--~--2~--
SV
I
64
12
~,------~.::....
Figura 3.35: Secuenc ia de ejecución de los tres con voyes con VLR = 64
El T elemel110 ha pasado a ser de 3 ciclos dado que ahora se tienen 3 convoyes. El
T arrallque
total se
obtiene de sumar los tiempos de arranque visibles de las unidades funcionales. Si se analiza la Figura 3.35 se tiene T arrall ljue =
2
* Ta rntllqlfeLV + T arrallqueMULTSV + Tarral1queA DDV + T arrallqueSV
Tao.,.,,,,,,,,e = (2 * 12 + 7 + 6 +
12) ciclos
= 49 ciclos
Con estos valores la ex presión del tiempo total de ejecución queda
r~~ 1*(15+49) +3*17
T" = 10 +
que para el caso particular de n = 1000 TlOoo = 10 + TIOOO
10001 * ( 15 + 49) + 3 * 1000 64"
r
= 10 + 16*(15+49)+3 * 1000 T 1000 = 4034 ciclos
Con respecto al caso 1, el permitir encadenamiento de resultados entre unidades funcionales ba reducido el tiempo de ejecución un 18 %, pasando de 4922 a 4034 ciclos. En lo que respecta al rendimiento expresado en FLOP por cic lo
269
INGENIERíA DE COMPUTADORES 11
2 *"
Roo = lím 11 -+00
Roo
= lim ( 74 2+*4"* 11 ) /1 --+00
Roo
= 0,5 FLOP/ciclo
Para ex presar Roo en FLOPS hay que multiplicar el valor anterior por la frecuencia del procesador. Se tiene así
Roo = 0, 5 FLOP/ciclo
* (500 * 106 ) Hz
Roo = 250MFLOPS Claramente se aprecia la mejora en el rendimiento del procesador gracias al encadenamiento de los resultados entre las unidades fun cionales .
Caso 3: Con encadenamiento y dos unidades de carga/almacenamiento Si se permite el encadenamiento y el número de unidades de carga/almacenamiento se duplica se obtiene la siguiente secuencia de convoyes:
Convoy 1: Convoy 2:
LV MULT SV LV ADDV SV
Vl,Rl V2,Vl, F ~
V3, R2 V4 ,V 3, V2 R2,V 4
Ahora el primer y el segundo convoy del caso 2 se pueden unir gracias a que la existencia de una segunda unidad de acceso a memori a permite colocar dos instrucciones de carga e n el mismo convoy sin que existan riesgos estructurales. La Figura 3.36 muestra la secuencia de ejecución. Dado que bay dos convoyes, el T eleme,,'o es de 2 cicl os y del análisis de la Figura 3.36 se obtiene que
270
3.17. MEDIDA DEL RENDIMIENTO DE UN BUCLE VECTORIZADO T elemenlo = 2 ciclos LV I
64
12
MULTSV 1 12 LV I
7
64
,6
64
ADDV 1
64
I
12
64
SV 1
Figura 3.36: Secuencia de ejecución de los dos convoyes con VLR = 64.
el tiempo de arranque tota l de las unidades funcionales es T arrallqlle = TarranqueLV
T w.,.m"I'"
+
TarrmuJlleMULTS V
= (12 + 7 + 6 +
+ T arrllllqlleADDV + Tarral1qlleSV
12) ciclos
= 37 ciclos
Se tiene ahora
y para n = 1000 T 1000 = 10 +
r1~~01 * ( 15 + 37) + 2 * 1000
T 1000 = 10 + 16 * (15 +37)+2 * 1000 T1000
= 2842 ciclos
Con respecto al caso I la mejora es del 73 % ya que el total de ciclos consumidos para procesar el bucle DAXPY con 1000 elementos se ha reducido de 4922 a 2842. El rendimiento en FLOP/c;clo es
n)
R= = lím ( -2 *I/ -HX) T"
R= = II-HXl lím
(
2 *n n. 10 + r641 - (I5 + 37) + Z. n
J
Roo = lím II -HXJ
271
INGENIERíA DE COMPUTADORES 11
2*n ) = lI~oo lim ( 62 + 2,8 125 * n
R oo
= 0,7 11 FLOP/ciclo
R oo
Si se expresa en FLOPS , se obtiene
Roo
= 0,71 I FLOP/ciclo * (500 * 106 ) Hz Roo = 355,55 MFLOPS
Caso 4: Con encadenamiento, dos unidades de carga/almacenamiento y solapamiento entre convoyes dentro de la misma iteración El último caso contempla que se puedan solapar convoyes en una misma iteración del bucle perm itiendo as í que una unidad funcional pueda ser utilizada por otra instrucción antes de que abandone la unidad la instrucción actual: Además, se considerará que las instrucciones escalares se pueden ejecutar en paralelo a las instrucciones vectoriales, por lo que Tbuc/e desaparece al quedar oculto tras los tiempos de ejecución de las instrucciones vectoriales. E n el bucle DAXPY, el número de convoyes contin úa siendo dos. Sin embargo, es posible solapar en una unidad de cru'ga/almacenamiento una de las dos instrucciones LV del primer convoy y la instrucción SV del segundo convoy. De esta fOlma , la ejecución de los dos convoyes se superpone dando lugar a un Teleme"'o inferior al número de convoyes. En el diagrama de la Figura 3.37 se aprecia esta situación. T.......nto = 1,6 ciclos LV 1
12
MULTSV LV 1
, I
12 '
I
64
,
64 ,
7
,,, 64 6 , ,I
ADDV I
, , SV I ,
1
' 64 12
64
I
_ -+_-;---'-_-;-_;-___ --;..._--;-___ , 12
19
25
64
76
128
ciclos
140
Figura 3.37: Secuencia de ejecución de los dos convoyes con VLR = 64. Pru'a calcular el T elemelllo en situaciones con solapamiento, hay que recordar que para un fragmento de código vectorial se tiene que 272
3.17. MEDIDA DEL RENDIMIENTO DE UN BUCLE VECTORIZADO
Telemen'o :::: (Tn -
T Ol'l'ollq//e )
In
Dado que para un valor de VL de 64, el tiempo de ejecución de las instrucciones vectoriales en este caso es de 140 ciclos (Figura 3.37) y los tiempos de arranque son T arranquc :::: Tarrallqll eLV TmToaqae
+ TarrallqucMULTSV + T al'l'wlljl/eADDV + T a/"n/JIqueSV
= (12 + 7 + 6 + 12) ciclos = 37 ciclos
Se tiene así T elcmellfO :::: (T64 - T arrallq//c)
T ele",,,,,o
/64
= (140 - 37) /64
Te/cmcllfo ::::
1,6 ciclos
Como T bac/e es cero dado su solapamiento con el código vectorial , el tiempo de ejecución del bucle vectorizado para 11 elementos es
T a = 10 + [ ~:
1* 37 + 1, 6 * 11
y particularizando para un vector de 1000 elementos
T] ()(){)= IO +
10001 *37+ 1,6* 64
r
1000
T lOoo = 10 + 16 * 37 + 1600 T 1000 = 2202 ciclos
La mejora que se obtiene con respecto al caso I es del 123 % al reducirse el total de ciclos consumidos de 4922 a 2202. El rendimiento en FLOP/, ido es /1. ) 2 *Roo = lím ( 11-+00 Tu
Roo = lím
11_00
(
11.
2*11
J
10 +[641<37+ 1, 6 */1. 273
INGENIERíA DE COMPUTADORES 11
Roo
=
lím II -HX'J
2*11 ) Roo = lím ( II~OO 47 + 2, L8 * 11
Roo = 0,9 18 FLOP/cido y si se expresa Roo en FLOPS se obtiene
Roo = 0, 9 18 FLOP/ciclo * (500
* 106 ) Hz
Roo = 459 MFLOPS
3.18.
Resumen: Visión global y perspectivas de futuro
A lo largo de este capítu lo se han descrito en profundidad dos estilos arq uitectónicos que persiguen la mejora de las prestaciones de un procesador individual de formas completamente di stintas. Por un lado, un procesador VLfW busca un incremento del rendimiento aprovechando el paral e li smo a nive l de instrucc ión mediante la emisión de una instrucción por ciclo de reloj compuesta por varias operaciones o microinstrucc iones que pueden ejecutarse en paralelo. Por o tro lado, los procesadores vectoriales persiguen la mejora recurriendo al paral elismo a nivel de datos para lo que disponen de instrucciones capaces de procesar un conjunto de datos de form a contin ua y sin detenciones. En ambos casos, el factor determinante para extraer el máximo rendimiento de estos procesadores es el compilador. En las arq uitecturas VLrw, el compil ador debe ser capaz de formru· y planificar las in strucciones utili zando para eUo las instrucciones básicas del cód igo intermedio y las características del procesador. E n un procesador vectorial , el compil ador extrae el máx imo rendimiento mediante una detección y vectori zación de los bucles presentes en el código original. Sin embargo, un computador construido en base a un procesador individual, ya sea VLlW o vectorial, no es rival ho)' en día pru·a un procesador superesca lar dado el enorme rendimiento que este último es capaz de obtener. Pero, como ya se ha señalado, los procesadores superescalares tambi én ti enen sus li mitaciones. Por esa razón, la tendencia actual y futura para poder construir computadores cada vez más potentes es la replicación de procesadores indi viduales, obviamente sin abandonar la investigación en posibles mejoras que se puedan introducir a nive l de procesador individual ya sea mediante hardware o so ftw are. Si a nivel de computador personal se avanza mediante la combinación de varios núc leos (proce274
3.18. RESUMEN: VISiÓN GLOBAL Y PERSPECTIVAS DE FUTURO
sadores superescalares con extensiones vectoriales) en un único crup, a nivel de supercomputación la
evol ución consiste en la construcción de multicomputadores y multiprocesadores mediante la replicación masiva de componentes disponibles comercialmente o mediante diseños a medida. En el ámbi to de los computadores personales y pequeños servidores, ya se pueden adquirir máquinas con has ta 8 núcleos)
mientras que ya se encuentran operativos supercomputadores constitu idos por más de 200.000 núcleos. E n el caso de los supercomputadores, la evo lución se realiza de dos fon11as: mediante la replicación de ullidades superescalares con extensiones vectOliales 0, al contrruio, mediante la replicación de unidades vectoriales con ex tensiones superescalares. En el plimer caso lo habitual es utilizar procesadores disponibles comercialmente (AMO Opteron, PowerPC, [ntel Xeon , IBM PowerXCell , IBM PowerPC 450, etc.) y conectarlos mediante redes comerciales (G igabit Ethernet, Tnfiniband, Myrinet, etc.), propietruias o diseñadas a med ida. Si se anali za la confi guración de los computadores que forman el ranking de supercomputadores TOP500 (hrrp://www.rop500.o rg), claramente, la primera líJlea es la predomin ante. En noviembre de 2010, de los 500 supercomputadores que formaban el ranking, 497 eran sistemas escalares y solo había uno vectolial. Ejemplos de supercomputadores construidos mediante replicación de uni dades vectoriales y redes propietru'ias son los basados en la arquitectu ra SX de NEC Corporation, siendo la serie SX-9 su representante más moderno. La arquitectura SX se basa en replicar nodos de procesamiento compuestos por procesadores vectoriales NEC y comunicarlos mediante una red de interconellión total NEC IXS. En concreto, la serie SX-9 pennite construir desde computadores constituidos por un nodo con cuatro procesadores vectoriales, 256 Gbytes de espacio de almacenami ento y un rend imiento p ico de 409,6 GFLOPS hasta llegar a sistemas compuestos por 512 nodos de 16 procesadores vectOliales, 512 TBytes de memoria y un rendimiento máximo de 839 TFLOPS. Los procesadores vectoriales SX-9 se basan en una versión mejorada del procesador vectolial que inu'od ujo NEC en la seri e SX-6 y Llegan a alcanzar un rendimiento mállimo de 102 GFLOPS. Cada procesador vectorial SX-9 consta de 8 unidades vectoriales y una escalar (Figura 3.38). La uni dad vectorial corre a una velocidad de 3,2 GHz y se compone de siete unidades fu ncionales y una de carga/almacenamiento todas eLlas con acceso a 72 registros vectoriales de 64 elementos de 8 bytes y 16 regisu'os de máscru'a de 64 bits. El número de instrucciones vectorial es que se pueden emitir de forma simultánea es siete. Por su parte, la unidad escalar fun ciona a la mitad de velocidad que la vectorial, consta de J 28 registros de 64 bits, seis unidades funcional es segmentadas y permite la ejecución de instrucciones fuera de orden. Otra forma de utili zación de la aproximación vectorial es la replicación de vru-ias unidades escalares en coma Aotante para formar unidades vectoriales virtuales. IBM desarroLló e implementó la tecnología ViVA (Virtual Vector Architecture) en el proyecto BluePlanet de forma que 8 procesadores IBM Power5 de doble núcleo trabajaban C0 l11 0 un procesador vectorial logrando un rendimiento de entre 60 y 80 GFLOPS. Actualmente, la tecnología ViVA-2 está incorporada en los procesadores IBM Power6. Paradójicamen te, do nde más se encuentra en vigor el concepto de procesamiento vectolial es actualmente en el mercado de los computadores de propósito general ya que la mayor parte de los procesadores superesca lares incorporan una o varias unidades funcionales para realizar operac iones
vectoriales . Ejemplos de repertorios de instrucciones para procesami ento vectorial que incorporan los 275
INGENIERíA DE COMPUTADORES 11
Unidad vectorial x8
--1
Carga o almacenamiento
1-
~
Máscara
I
-1
Booleana
I
--1
Mult
--1
Mull
--1
Add
--1 -1
Add
Registro de máscara
Registros vectoriales
Div/Mult
I I I I I
"----J Unidad escalar Caché
I
I
Mult I Add
I
Mulll Add I Div
Registros escalares
ALU
I
ALU
I
Figura 3.38: Configuración del procesador veclorial NEC SX-9.
procesadores superescalares actuales son los SSE2, SSE3, SSSE3, SSE4, FMA3, AVE, XOP, FMA4, CVT 16 en procesadores de lntel y/o AMD o el AltiVec presente en los procesadores PowerPC. Otro ámbito en el que el procesamiento vectorial ha encontrado un campo de aplicación muy prometedor es el de las consolas de videojuegos y las tmjetas gráficas. Un ejemplo de ello es el procesador CeU, desmTOllado por lBM, Sony y Toshiba, y que consta de un procesador escalar y ocho procesadores vectoriales. En la actualidad, este procesador se utili za en tarjetas para el procesa miento de vídeo, consolas de videojuegos (Sony Pl ayStation 3) y sistemas de cine para el hogar (home-cinema). Curiosamente, tanto el Cell como su evol ución, el mM PowerXCeU 8i, son utili zados actualmente por mM en algunos de sus computadores de altas prestaciones (por ejemplo, el supercomputador híbrido mM Roadrunner compuesto por procesadores AMD Opteron e mM PowerXCell) y en sus mainframes. En lo que respecta al futuro de los procesadores VLlW, con la salvedad de los procesadores lntel Itanium , el concepto VLfW todavía permanece en el ámbito de los procesadores empotrados o embebidos de alto rendimi ento. ¿Cuál es la razón de ello? Los procesadores superescalm'es surgieron como consecuencia de la necesidad de desaITollar procesadores escalares más potentes pero capaces de mantener la compatibilidad hacia atrás que siempre demanda el mercado. Los usuarios y empresas a 276
3.19. REFERENCIAS
,livel mundi al invierten ingentes cantidades de dinero en la compra de software por lo que elligen que las nuevas máquinas que adqu ieran sean capaces de ejecutar el software de que ya disponen. Se podría argumentar que el probl ema se soluciona recompilando el cód igo fu ente de las aplicaciones pero la inmensa mayoría del software se compra como códi go binario, directamente ejecutable en el procesador y sin acceso al código fuente. Este problema se conoce como inercia del repertorio de instrucciones. Esta inercia provoca que los nuevos procesadores superescalares que se diseñan tengan que seguir siendo capaces de ejecutar repertorios de instrucciones ideados hace décadas (por ejemplo, el x86 es del año 1986) y que, hoy en día, se sabe que son inefi cientes. Sin embargo, el mercado de la electrónica de consumo (teléfonos móviles, POAs , reproductores portátil es MP3 y MP4, reproductores de libros electrónicos, receptores de GPS , etc.) se cru'acteri za por su baja inercia puesto que en él se comerciali zan productos que ya contienen el software in stalado de fábri ca y que ejecutan un reducido número de aplicaciones softwru·e. Dado que estos dispositivos no son programables por el usuru'io final, la necesidad de mantener compatibilidad hacia atrás en nuevas versiones no es nada acuciante. Hay mayor libertad para que el fabr icante recurra a procesadores más modernos y con mejores prestaciones pese a que no exista compatibi lidad con el software que ya tiene desalTollado. Las perspectivas de producir mejores productores con mejor relació n cali dadprecio compensan el esfuerzo de la mi gración software. Por otro lado, por sus características, estos dispositivos necesitan reducir el consumo de energía al máximo lo que les convierten en el nicho de mercado ideal para los procesadores VUW. Un ejemplo de la baja inercia de este mercado es que la mayor parte de los procesadores que utiljzan en sus desarrollos son de tipo RISC, no dejándose arrastrar por la arquitectura lA-32 como la inmensa mayoría de los computadores de propósito general. Al gunas familias de procesadores VLlW para sistemas empotrados y el procesanliellto digital de señales son la FR-V de Fujitsu, la CEVA-X de CEVA, la Trimedi a de NX P Semiconductor, la SHARC ADSP-2 136x de Analog Dev ices, la línea de procesadores OPS TMS320C6x de Texas Instruments y la ST200 de STMi croelectronics. Otro nicho de mercado en donde es posible encontrru' diseños VLIW es en e l campo de los procesadores gráficos. Un ejemplo de ello son las líneas de procesadores gráficos desruTollados por AMO.
3.19.
Referencias
Evans J .S. , Trimper G.L. Itanium archifeclllre for programmers: Understalldillg 64-bit processors Qnd EPIC principIes, Prentíce Hall PTR, Upper Sadd le Ri ver, New Jersey, 2003. F isher J .A. Trace Scheduling : A Technique for Global Microcode Compaction, IEEE Transa ctions Oll Computers, vol. 30, nO7, pp. 478-490, 198 1. F isher J.A., Faraboschi P. , Young C. Embedded Computing: A VL/W Approach ro Archirecture, Compilers Clnd Too/s, Morgan Kaufmalln, San Francisco, Ca liforni a, 2004. Hennessy J.L., Patterson O.A. Computer Architecture. A Quantirative Approach, 4" edición, 277
INGENIERíA DE COMPUTADORES 11
Morgan Kaufmann, San Francisco, California, 2007. lntel Iraniul11 Processor Microarchirecture
R~t"ere/1.ce,
2000.
Tntel Iralliul/1 ArcJ¡itecture Software Deve/opers Manua/, 20 I O. Mahlke S.A., Lin D .C., Chen, W. Y., Hank R.E. , BIingmann R.A. Elfective Compiler Support for Predicated Execution Using the Hyperblock Proc. ofthe 25th Allnuallnternationa/ SymposiulII Oll Microarchitecture (M ICRO-25) , Portland, Oregon, pp. 45-54, 1992. McNairy c., So ltis D. Ttaruulll 2 processor microarchitecture, IEEE Micro, vol. 23, nO2, pp. 44-55, 2003. Ortega l , Anguita M. , Prieto A. Arquitectura de computadores, Thomson Paran.info. 2005 . Ramakrishna Rau B. , Fisher lA . Instruction-leveJ parallel processing: History, overv iew, and perspective, The Journal of Supercolllpurillg , vol. 7, nO 1, pp. 9-50, 1993. Schlansker M.S., Ramakrishna Rau B. EPIC: Expl icitl y Parallel Tnstruction Computing, IEEE Computer, vol. 33, nO 2, pp. 37-45,2000. Zomaya A.Y. Parcd/el alld Distributed Computillg Handbook, McGraw-Hi ll Professional, New York C ity, New York, 1996.
3.20.
Preguntas de auto evaluación
P3.1 ¿Qué tipo de procesadores aprovechan el paralelismo funcional? ¿Y el de datos? Los procesadores superescalares y VLfW son claros ejemplos de aprovechamiento del paralelismo fu ncional basado en. la ejecución de múltiples instrucciones en para lelo. Un ejemplo de paralel ismo de datos lo representan los procesadores vectoriales .
P3.2 ¿Por qué se caracteriza un procesador VLIW? Se caracteriza por emitir en cada ciclo de reloj una única instrucción compuesta de varias mini. instrucciones tipo RISC (enteras, flotantes, accesos a memoria, etc.) que se ejecutan en paralelo en la unidades funcionales de que consta el procesador.
P3.3 ¿Quién realiza la planificación de las instrucciones en un procesador VLlW? Es responsabilidad exclusiva del compilador.
P3.4 ¿Cuántas instrucciones emite un procesador VLIW por ciclo de reloj? Una única instrucción . 278
3.20. PREGUNTAS DE AUTOEVALUACIÓN
P3.5 ¿Qué calificativo recibe la planificación que realiza el compilador de un computador VLIW? Se denomina planificación estática, en contraposició n a la planificación dinámica que se realiza vía hardware en los procesadores superescalares. P3.6 ¿Qué caracteriza a la planificación estática que realiza el compilador VLlW? El compilador debe generar un código objeto VLlW en el' que las dependencias de datos y de memoria no sean violadas y se pueda emitir una instrucción por ciclo de reloj sin neces idad de detener la segmentación . P3.7 ¿Qué implica detener una unidad funcional en un procesador VLIW? Implica la detención de todas las unidades funcionales y de la segmentación. El código VLlW se genera teniendo en cuenta las dependencias de datos y de memoria existentes por lo que f renar una unidad funcional y dejar avanzar a las res tantes puede provocar que no se respete la semán tica del program a. P3.8 ¿Por qué dos razones han fracasado los procesadores VLIW en el ámbito de los computadores de propósito general? Por la incapacidad para desanollar compiladores que aprovec hen al máximo las características de este estilo arquitectónico y por los problemas de compatibilidad entre procesadores. P3.9 ¿Por qué el tamaño del código objeto generado para un procesador VLlW es mayor que el generado para un procesador superescalar? Se debe a que el compilador VLlW no siempre es capaz de rellenar todas las operaciones de que consta una instrucción VLlW con instrucciones orig inales del código fuente. P3.10 ¿Qué inconvenientes ocasiona la existencia de operaciones NOP en las instrucciones VLIW? Espacio desaprovechado en el almace namiento del programa, uso inadec uado de la I·caché, unidades funcionales ociosas y un aumento innecesario del tráfico en los buses. P3.1l ¿Por qué hay problemas de compatibilidad entre diferentes generaciones de un procesador VLIW? Es debido a que el compilador genera código objeto teniendo en consideración las características específicas de un procesador en cuanto a número de unidades funcionales y latencias. Por ejemplo, el mismo código objeto generado para un procesador A no será válido en un procesador B, si este último c uenta con unidades fun cionales con mayor late ncia. P3.12 ¿Qué es la inercia del repertorio de instrucciones? Es la actitud negativa o reticente para migrar las aplicaciones software disponibles para una arquitecnlra dada a otro tipo de computadores. 279
INGENIERíA DE COMPUTADORES 11
P3.13 ¿Qué provoca la inercia del repertorio de instrucciones? Provoca el tener que seguir diseñando procesadores que sean capaces de mantener la compatibilidad hacia atrás.
P3.14 ¿En qué nichos de mercado se siguen utilizando procesadores VLIW? En el mercado de los procesadores embebidos orientados a la electrónica de consumo y en el de los procesadores gráficos.
P3.1S ¿Qué elementos característicos de un procesador superescalar no están presentes en un procesador VLIW? La lógica de distribución, emisión y reordenación, es decir, aquellos elementos que posibilitan la plani ficación di námica de las instrucciones.
P3.16 Las instrucciones VLIW, ¿siguen la filosofía RISC o CISC? La RISC.
P3.17 ¿Qué implica una instrucción VLIW con menos campos de operación que unidades funcionales haya disponibles en el procesador? Implica limitar el rendimiento que se puede extraer ya que no se aprovecha todo el paralelismo que proporciona el procesador.
P3.18 ¿Qué relación tiene que existir entre el formato de una instrucción VLIW y las unidades funcionales para que la lógica de decodificación se simplifique más? Que el número y ti po de las operaciones que se pueden situ ar en una instrucc ión VLlW coincidan con el número y ti po de tas unidades funcionales.
P3.19 ¿Qué es una memoria caché bloqueante? Es una memoria caché que tiene la capacidad de poder detener todas las unidades funcionales ante la aparición de un fa llo.
P3.20 ¿Por qué son necesarias memorias cachés bloqueantes en un procesador VLIW? El compilador no puede predecir la aparición de fa llos de lectura/escritura en la caché de datos por lo que no puede generar una plani ficación que oculte las latencias derivadas de estos fallos.
P3.21 ¿Qué es un bloque básico? Un bloque básico es un conjunto de instrucc iones que fo rman una línea de ejecución secuencial por lo que en su interior no ex isten instrucciones de saltos con la salvedad de la última.
280
3.20. PREGUNTAS DE AUTOEVALUACIÓN
P3.22 ¿Qué es un diagrama de fiujo de control? Es el diagrama que se obtiene de interconectar las entradas y saLidas de los diferentes bloques básicos que existen en un programa.
P3.23 ¿Qué es un grafo de flujo de datos? Es un grafo dirigido en el que los nodos son las instrucciones de un bloque básico, y los arcos se inician en una instrucción de escritura en un registro (instrucción productora) y tienen como destino una insb'ucción que lee el valor de ese registro (instrucción consumidora) .
P3.24 ¿Qué es la planificación local? Es la combinación de instrucciones procedentes de un único bloque básico para producir instrucciones VLlW.
P3.25 Indique dos técnicas de planificación local. El desenrollamiento de bucles y la segmentación software.
P3.26 ¿Qué es la planificación global? Es la combinación de instrucciones de diferentes bloques básicos para producir instrucciones VLlW con mayor grado de paralelismo. Al poder exb'aer instrucciones de diferentes bloques es posible combinarlas de fonna que se minimicen los huecos en las instrucciones VLlW.
P3.27 Indique tres técnicas de planificación global. La planificación de trazas, la planificación de superbloques y la planificación de hiperbloques.
P3.28 ¿Qué técnica permite aprovechar el paralelismo existente en el cuerpo de un bucle replicando el contenido del mismo? El desenrollamiento de bucles.
P3.29 ¿Qué tres ventajas aporta el desenrolla miento de bucles? Se reduce el nllmero de iteraciones del bucle, lo que imp~ca una reducción de las instrucciones de salto, el total de instrucciones ejecutadas es menor ya que se eliminan instrucciones de salto y de incremento/decremento de los índices y se posibilita el mejorar la planificación de las instrucciones pues al desenrollar el bucle queda mucho más cálculo al descubierto al incrementarse el tamaño de los fragme ntos de código lineal.
P3.30 ¿Qué es la segmentación software? Es una técnica de planificación local consistente en producir un nuevo cuerpo del bucle compuesto por la intercalación de instrucciones extraídas de diferentes iteraciones del bucle original. 281
INGENIERíA DE COMPUTADORES 11
P3.31 ¿Qué instrucciones del bucle original constituyen el prólogo y el epílogo cuando se aplica segmentación software? El prólogo y el epílogo están constituidos por las instrucciones que son necesarias para compl etar las iteraciones afectadas por las instrucciones que conforman el patrón de ejecución o núcleo.
P3.32 ¿Con qué otro nombre se conoce a la segmentación software? Planificación policíclica.
P3.33 ¿Qué es una traza? Se trata de un conjunto de bloques básicos que fonnan una secuencia de código sin bucles. En realidad, representa el cami no de ejecución más probable ante una bifurcación.
P3.34 ¿Qué es la planificación de tI'azas? Es una técnica de planificación global que perm.i te tratar una secuencia de bloques básicos como si fuese uno único y, a partir de ese nuevo bloque, dotado de un mayor número de operaciones, producir código VLlW más óptimo medi ante una adecuada planifi cación de las operaciones.
P3.35 ¿Cuál es la diferencia entre la planificación de trazas y la planificación de hiperbloques? La diferencia está en las estructuras de bloques básicos que pueden manejar. La planificación de trazas se apl ica a secuencias de bloques bás icos donde c ualquier bloque puede tener vari as entradas y salidas. La planificación de hiperbloques se ori enta hacia secuencias de bloques básicos con una única entrada pero cuyos bloques intermedios pueden presentar múltiples salidas.
P3.36 ¿De qué dos pasos consta la planificación de trazas? De la selección de la traza y de la compactación o compresión de la traza.
P3.37 ¿Qué es la selección de la traza? Es la búsqueda de un conjunto de bloques básicos para formar una secuencia de códi go sin bucles, es decir, una traza.
P3.38 ¿Cómo se realiza la selección de una traza? La selección de los bloques básicos que forman una traza se rea li za especulando sobre cuáles son las rutas o caminos de ejecución considerados como más probables.
P3.39 ¿Cómo puede conocer el compilador cuales son las rutas de ejecución más probables? Mediante un grafo de fiuj o de control con pesos o ponderado que es similar al grafo de fiujo de control pero as ignando a cada bloq ue básico una etiqueta o peso que indi ca la probabilidad o frecue ncia de ejecución. La obtención de los pesos se puede realizar de difere ntes formas: perfiles de ejecución del programa, estimaciones software, pl anificación estática de saltos, etc.
282
3.20. PREGUNTAS DE AUTOEVALUACIÓN
P3.40 ¿Por qué es necesario colocar código de compensación cuando se realiza planificación de trazas? Es necesario para deshacer los efectos producidos al ejecutar incolTectamen te las operaciones que han sido desplazadas al considerar que su ejecución es altamente probable. E l código de compensación se coloca en la ruta de ejecución que se considera que tiene me nos probabilidad de ser ejecutada y elimina (compensa) los efectos de las instrucciones que se han ejecutado de forma especulativa. P3.41 ¿Cuál es la expresión genérica que dete"mina cuándo el código planificado es mejor que la secuencia de código original al desplazar parte de las operaciones que componen una de las ramas de una bifurcación condicional? La expresión genérica es a * p + b * (1 - p) < e * p + d * (1 - p) donde p represen ta la frec uencia de ejecución de la rama más probable, a los ciclos de ejecución de la rama más probable de la secuencia planificada , b los ciclos de ejecución de la rama menos probable de la secuencia plani ficada, e los ciclos de ejecución de la ram a más probable de la secuencia original y dios ciclos de ejecución de la rama menos probable de la secuencia original. P3.42 ¿Cuál es uno de los problemas que presenta la planificación de trazas? A mayor can tidad de operaciones desplazadas, mayo r es la penali zación en que se incurre cuando se rea liza una predicción elTónea. P3.43 ¿Cuándo la planificación de trazas proporciona mejores resultados? Cuanclo la traza seleccionada es cOlTecta, es decir, cuando se cumple la pred icción q ue se ha reali zado sobre cuál es la ruta de ejecución más probab le. P3.44 ¿Qué es una operación con predicado? Es una instrucc ión en la que su resultado se almacena o se descal1a dependiendo del valor de un operando que tiene asociado. Este operando rec ibe el nombre de predicado. P3.45 ¿Cuál es la finalidad de las operaciones con predicado? El perm.itir al compilador reducir el número de saltos condicionales que hay en el cód igo de forma que un diagrama de flujo de control compuesto por diferentes ramas con pequeños bloq ues básicos pueda transformarse en un único bloque extend ido y aplicarle técnicas de planificación local. P3.46 ¿En qué consiste la técnica if-cotlversiotl? Al proceso de eli minar los saltos condicionales de un progra ma y reemplazarlos por instrucciones con predicados. P3.47 ¿Cómo se implementa un predicado en una instrucción VLIW? 283
INGENIERíA DE COMPUTADORES 11
Mediante un nuevo operando de lectura en cada una de las operaciones que conforman una instrucción VLIW.
P3.48 ¿De qué depende el tamaño en bits que tiene el identificador de un predicado? Del número de entradas del fichero de registros de predicados de que conste e l procesador.
P3.49 ¿Cuál es la sintaxis para representar una instrucción con predicado? Por lo general, colocado delante o detrás de la instrucción el identificador del predicado entre paréntesis . Por ejemplo, instrucción (p) o (p) instrucción.
P3.S0 ¿Un predicado está sometido a dependencias de datos? Sí ya que se trata de un operando de lectura o de escritu ra.
P3.S1 ¿Qué sucede cuando las operaciones condicionadas no cumplen su condición de guarda? Se ejecutan como cua lquier otra pero el resultado no se a lmacena en ningún registro por lo que vienen a equivaler a instrucciones NOP.
P3.S2 ¿Cuándo es muy efectiva la aplicación de la técnica if-conversion? Cuando todas las rutas de ejecución que hay en una región de código tienen aproximadamente el mismo tamaño en número de instrucciones y la mi sma frecuencia de ejecución.
P3.S3 ¿Cómo se garantiza el tratamiento correcto de las excepciones en un procesador VLIW? Mediante un buffer similar al de term inación en el que las instrucciones especu ladas se mantienen marcadas hasta que se llega al punto del programa en que se considera que ya no son instrucciones especu lativas. Mientras permanezcan marcadas en el buffer, sus resultados no se almacenan de forma definitiva, sino temporal.
P3.S4 ¿Qué es un centinela? Es un fragmento de código que indica que una operación o varias operaciones ejecutadas de forma especulativa han dejado ya de serlo.
P3.SS ¿Dónde se ubica un centinela? Se ubica en la posición del código en que se encontraba originalmente la o las in strucciones especu ladas.
P3.S6 ¿Por qué surge el concepto EPIC? Para resolver algunos de los problemas que plantea el enfoque VLIW puro como, por ejemplo, los problemas de compatibilidad de código por una dependencia exces iva de las características del procesador.
284
3.20. PREGUNTAS DE AUTOEVALUACIÓN
P3.57 ¿Qué relación hay entre EPIC e Itanium? ¿Son sinónimos? EPIC representa un conjunto de principios arquitectónicos en base a los que diseñar diferentes arquitecturas y procesadores. Al igual que existen muchas arquitecturas RISC y diferentes implementaciones de una misma arquitecnn'a RISC, pueden existir múltiples arqu itecturas EPrC (por ejemplo, IA-64) y de cada arq uitectura desarrollar diferentes implememaciones (ltanium, ltanium-2). P3.58 ¿Cuál es el principal diferencia entre el trabajo que realiza un compilador para un procesador VLIW y para un EPIC? En VLIW, el compilador planifica y agru pa cód igo considerando, básicamente, las características del hardware. En EPIC, el compilador agrupa las instrucciones pero comun ica en el propio cód.igo qué grupos de instrucciones se pueden ejecutar en paralelo y cuáles no. P3.59 ¿Qué son los procesadores vectoriales? Son procesadores diseñados según una arq uitectura que permite el procesamiento de vectores (an'ays unidimensionales). Están en contraposición a las arq uitecturas escalares en que se basan los procesadores superescalares o VLIW. P3.60 ¿Qué tipos de operandos maneja un procesador vectorial? Tanto operandos escalares como operandos vectoriales. P3.61 ¿Por qué los procesadores vectoriales pueden utilizar unidades funcionales vectoriales con segmentaciones muy profundas? Debido a que no hay que preocuparse por la ex istencia de dependencias de datos entre los elementos que forman los operandos de una operación vectorial. Una operación vectorial implica procesar de forma independiente pero continua cada uno de los elementos de que constan los operandos fuente vectoriales. P3.62 ¿Qué dos consecuencias tiene que una única instrucción vectorial equivalga a un bucle escalar completo? Primera, el ancho de banda de instrucciones es menor ya que el tamaño del código es más reducido y, segunda, no existen riesgos de control al eli minarse las instrucciones de salto condicional que conlleva todo bucle. P3.63 ¿Qué tres factores determinan el que un programa se pueda aprovechar de las características de un procesador vectorial? La estructura de flujo de datos del programa, la estructura de fluj o de control del programa y la capacidad del compi lador para detectar las estructuras de datos y de control susceptibles de ser vectorizadas.
285
INGENIERíA DE COMPUTADORES 11
P3.64 ¿De qué unidades de procesamiento consta un procesador vectorial genérico? ¿Cuál es la razón de esta organización? Consta de una unidad de procesami ento esca lar, con características si mil ares a las de un procesador superescalar, y de una unidad de procesamiento vectorial. La razón de ell o es que todo programa se compone de una porc ión de instrucciones escalares y de otra porción de instrucc iones vectoriales de forma que cada unidad se ocupa de procesar las instrucciones de su misma naturaleza .
P3.65 ¿En qué tipo de arquitectura se basan los procesadores vectoriales actuales? E n una arquitectura carga-alm acenamiento con repertOlio de in strucc iones tipo RISC.
P3.66 ¿De qué elementos consta la unidad de pl"Ocesamiento vectorial? De un fichero de registros vectoriales, de unidades fu ncionales vectoriales y de una unidad de carga/al macenami ento vectoria l. Tambi én tiene acceso al fichero de registros de la uni dad de procesamiento escalar.
P3.67 ¿Qué parámetros caracterizan al fichel"O de registl"Os vectoriales? El número de registros vectoriales, el número de elementos por registro y el tamaño en bytes de los elementos. Otro parámetro fundamental es el número de puertos de lectura/escritura necesarios para poder intercamb iar datos con las unidades funcionales vectori ales sin provocar detenciones por riesgos estructurales.
P3.68 ¿Son necesarios mecanismos para detectar la existencia de los riesgos estructurales datos que puedan aparecer al ejecutar un programa en un procesador vectorial?
y
de
Sí. Puede ocurrir que las instrucciones vectoriales tengan que esperar a que una unidad funcional vectori al quede libre (dependencias estructurales) o a que una unidad escalm o vectorial genere un res ultado (dependencias de datos). Lo mi smo puede suceder con las in strucciones esca lares.
P3.69 ¿Qué significa que una unidad funcional vectorial se organice internamente en varios ca.... i1es? U na unidad fu ncional vectori al con n carriles o lanes implica que, internamente, el hardware necesario pma reali zar la operación se ha repli cado n veces de fo rma que el número de ciclos que se e mplea en procesar UD vector se reduce por un factor de n..
P3.70 ¿Qué problema conlleva organizar una unidad funcional vectorial con varios carriles? La necesidad de tener que increme ntar el número de puertos de lectura y escritura de todos los registros vectoriales para poder sumini strar elementos a todos los carriles en cada cicl o de reloj .
P3.71 ¿Qué solución se utiliza para resolver el pl"Oblema que se plantea con los puertos de lectura/escritura al organizar una unidad funcional vectorial con varios carriles? 286
3.20. PREGUNTAS DE AUTOEVALUACIÓN
La solución es especial izar los carriles de forma que solo tengan acceso a un subconjunto de elementos de cada registro vectorial.
P3.72 ¿Cuál es la principal característica de la unidad de carga/almacenamiento vectorial? La unidad de carga/almacenamiento vectorial es capaz de mantener un ancho de banda sostenido de una palabra por ciclo reloj tras la latencia de acceso in icial.
P3.73 ¿Qué procesadores se enmarcan dentro de la categoría SIMD? Los procesadores vectori ales y los procesadores mauiciales.
P3.74 ¿De qué elementos consta un procesador matricial? Consta de una unidad de procesamie nto vectorial, una unidad escalar y una unidad de control que discrimina según el tipo de instrucción.
P3.75 ¿Qué diferencia existe entre la unidad de procesamiento vectorial de un procesador vectorial y de un procesador matricial? En un procesador vectorial, la unidad vectori al consta de f1 unidad funciona1es especializadas. Sin embargo, en un procesador matricial, la un idad vectorial consta de 11 elementos de procesamiento o EPs, constituidos por una unidad ari tmético- lógica de propósito general o ALU , un co njun to de registros o REP y una memoria local o MEP.
P3.76 ¿Qué diferencia existe en relación al tiempo de procesamiento de procesador vectorial y un procesador matricial?
11
elementos entre un
El procesador matricial con 11 elementos de procesamiento puede procesar de forma simultánea e n el mi smo ciclo de reloj un vector de 11 elementos. El procesador vectorial neces ita 11 ciclos de reloj para que su unidad funcional consuma los 11 elementos.
P3.77 ¿Qué función tiene el registro escalar VLR? El registro VLR controla la longitud de cualquier operación vectorial, ya sean cargas, almacenami entos 1I operaciones aritméticas.
P3.78 ¿Cómo se denomina la técnica mediante la que se procesan vectores de un tamaño superior
a MVL? El compilador recurre a una técnica denominada strip mil1ing y que se traduce como troceado de l vector o seccionam iento.
P3.79 ¿Qué es el secciona miento o strip mitzillg? Consiste en procesar un vector de longitud mayor al valor MVL en secciones de longin.d igual o inferior a MVL. Para reali zarlo, el compilador genera un bucle con instrucciones escalares y vectoriales que se ocupa de procesar el vector original en varias secciones de longitud MVL y una de long itud menor si el tamaño del vector no es múltiplo de MVL.
287
INGENIERíA DE COMPUTADORES 11
P3.80 ¿Cómo gestionan los procesadores vectoriales la carga y el almacenamiento de datos que se encuentran ubicados en memoria de forma no consecutiva pero siguiendo un patrón uniforme? Mediante instrucciones especiales de carga y almacenamiento que permiten indicar la separación entre datos con un operando adicional. Otra fonna es utilizar las instrucciones genéricas de carga y almacenamiento en conjunción con un registro de propósito especial que establece la distancia de separación que debe aplicarse en los accesos.
P3.81 ¿Cómo se soluciona el problema de vectorizar un bucle en cuyo cuerpo hay instrucciones que se ejecutan condicionalmente? Se recurre a una máscara, almacenada en un registro especial VM, que establece qué elementos de un vector tienen que ser manipulados por la unidad funcional al realizarse la operación.
P3.82 ¿Qué representa cada uno de los bits que componen el registro VM? Cada bit del registro VM representa a un elemento del vector y especifica si se hacen efectivas las siguientes operaciones sobre él o no.
P3.83 ¿Por qué en el procesador vectorial genérico el registro VM es de 8 bytes de longitud? 8 bytes de longitud son 64 bits, que es el número de elementos de un registro vectorial.
P3.84 ¿Qué inconvenientes pueden surgir según cómo se haya implementado el control de operaciones vectoriales mediaute máscara? Puede suceder que el tiempo de procesamiento no se reduzca pese a que no se realicen las operaciones, es decir, que las no operaciones indicadas por la máscara se reemplacen por operaciones lipo NOP. También puede ocurrir que el enmascaramiento afecte únicamente al almacenamiento del resultado pero no ev ite la operación con lo que podrían surgir excepciones.
P3.85 ¿Qué factores determinan el tiempo de ejecución de una instrucción vectorial? La latencia en producir el primer resu ltado o tiempo de arranque, el número de elementos 17 a procesar por la un idad funcional y el tiempo que se tarda en generar cada resultado o tiempo por elemento.
P3.86 ¿Cuál es la expreslOn matemática que determina el número de ciclos que se tarda en completar una instrucción vectorial? T" == Tll /"mlll/lle + n
* Telemellfo
P3.87 ¿Qué hay que tener en cuenta cuando se trata de calcular el tiempo de ejecución de una secuencia de instrucciones vectoriales? 288
3.20. PREGUNTAS DE AUTOEVALUACIÓN
Si las instrucciones vectoriales afectan o no a diferentes unidades funcionales (riesgos estructurales) y si ex isten dependencias verdaderas entre ellas, es decir, si son operaciones independientes. P3.88 ¿Qué es un convoyo paquete de instrucciones vectol'iales? Es un conjunto de instrucciones vectoriales que se pueden emitir simultáneamente debido a que no existen dependencias verdaderas entre ellas ni riesgos estructurales . P3.89 ¿Cómo se expresa el rendimiento de un procesador vectorial al ejecutar un programa? Por el tiempo de ejecución que se ha consumido y por el número de operaciones en coma flotante reali zadas por unidad de tiempo. Ambas medidas pueden expresarse en ciclos, aunque lo correcto es darlas en segundos. P3.90 ¿Cómo se denomina la técnica que se emplea en los procesadores vectoriales y que consiste en reenviar el resultado de una unidad funcional a otra sin esperar a que se complete la operación sobre un registro vectorial? Encadenamiento de resultados o chaining. P3.91 ¿En qué afecta el adelantamiento a la formación de convoyes de instrucciones? Si se permite adelantamiento es posible que varias instrucciones con dependencias verdaderas de datos formen parte del mismo convoy. P3.92 ¿Qué tipo de riesgo no se permite que exista entre las instrucciones que forman un convoy? Los riesgos estructurales. P3.93 ¿Qué dos consecuencias positiva y negativa tiene permitir la ejecución solapada de convoyes? La consecuencia negativa es que se complica la lógica de emisión de instrucciones. La consecuencia positiva es que se pueden llegar a ocultar los tiempos de ananque de todos los convoyes con la excepción del primero. P3.94 ¿Qué representa el tiempo de arranque en una unidad de carga/almacenamiento vectorial? Se corresponde con la latencia de acceso a la memoria. P3.95 ¿Qué representa el tiempo por elemento en una unidad de carga/almacenamiento vectorial? Es el tiempo que se emplea en transferir un elemento desde un banco de memoria hasta un regi stro vectorial o viceversa. Suele ser inferior a un ciclo de reloj aunque se iguala a un ciclo. P3.96 ¿Cómo se consigue en un pl'Ocesador vectorial que las latencias de acceso a memoria de los elementos de un vector de longitud 11 queden ocultas de forma que solo sea visible la latencia de acceso al primer elemento?
289
INGENIERíA DE COMPUTADORES 11
Por un lado, distribu yendo los 11 elementos de un vector entre In bancos de memoria para que se solapen los (n - 1) * T" c iclos de acceso de 11 - 1 elementos del vector con los H * T e/emenlo ciclos que se emplean en enviar los H elementos a un registro vectorial. Por otro lado, real izando un dimensionamiento correcto del nú mero de bancos de memori a de forma que sean una potencia de dos mayor o igual que el tiempo de acceso expresado en ciclos.
P3.97 ¿Qué dos formas existen para realizar el solapamiento de las latencias de acceso a memoria de los 11 elementos de un vector? De forma síncrona y de forma asíncrona.
P3.98 ¿En qué consiste el acceso síncrono a los bancos de memoria de un procesador vectorial? En solicitar simu ltáneamente un dato a los 111 bancos cada T" cic los. Así, cada T" c iclos se reali zan dos acciones: se efectúa una nueva petición sim ultánea a todos los bancos para extraer los 111 elementos sigui entes y se comienza a transferir c iclo a c iclo los 111 e lementos ya disponibles y que fueron solicitados en la petición anterior.
P3.99 ¿En qué consiste el acceso asíncrono a los bancos de memoria de un procesador vectorial? Implica solic itar los elementos de que consta el vector a cada uno de los 111 bancos de forma periódica con periodo T " y con un desfase entre bancos consecutivos de T elemeHlo ciclos. En el momento en que un banco tiene ya el dato disponi ble realiza dos acciones : efectúa una nueva solic itud de dato y transfi ere el dato ya disponi ble al registro vectorial.
P3.100 ¿Qué factores determinan el número de bancos de memoria que son necesarios en un procesadores vectorial? El número tota l de bancos de memoria siempre tiene que ser una potencia de dos igual o superior al tiempo de acceso expresado en c iclos.
P3.101 ¿Cómo se conoce el banco de memoria en que se almacena una dirección? El número de banco está determi nado por los logz
P3.102 ¿Qué representa el T"as, en el cálculo del rendimiento de un bucle vectorizado? Es el tiempo que consumen las instrucciones escalares de preparación antes de abordar el bucle que secciona el vector en secc iones de longitud igual o infedor a MVL.
P3.103 ¿Qué representa el T¡,nele al calcular el rendimiento de un bucle vectorizado'! El coste de ejecutar las instrucciones escalares necesari as para realizar el seccionam iento en cada iteración del bucle medi ante e l que se procesa e l vector sección a sección.
290
3.21. ACTIVIDADES
P3.104 ¿Qué representa el
Tmnmqu e
en el cálculo del rendimiento de un bucle vectorizado?
Es la suma de los tiempos de arranque visibles de las unidades fun cionales que se utili zan en los convoyes de instrucciones que se ejecutan en cada iteración del bucle que secciona el vector.
P3.lOS ¿Qué representa el
T e/emeuto
al calcular el rendimiento de un bucle vectorizado?
El número de convoyes en que se organi zan las instrucciones vectoriales que se derivan de vectorizar el bucle.
P3.106 ¿Qué expresión permite determinar el tiempo total de ejecución en ciclos de reloj de un bucle vectorizado que realiza operaciones sobre vectores de longitud n? T" =
Tbase
1
+ rM~L * (Tbll cle + Tarra/lq/le) + 11 * Telcmemo
P3.107 ¿Es posible que Telemeu'o sea inferior al número de convoyes? ¿Cuándo puede suceder? Sí. Puede sucede cuando se permite el solapamiento de instrucciones vectori ales en las unidades funcionales.
3.21.
Actividades
A3.1 Considere un procesador VLIW con un formato de instrucción que permite em itir simultáneamente operaciones a 2 unidades funcionales para el acceso a memoria (2 ciclos de latencia), a 2 unidades funcionales para operaciones en coma flotante (3 ciclos de latencia) y a una unidad fun c ional para operaciones en teras y de sa lto (1 ciclo de latencia donde el salto tiene un hueco de retardo de 1 ciclo). Dado el siguiente fragmento de código intermedio:
inicio: LO MU LTO LO AOOO SO SUB! SUB! BNEZ
F2,&(Rl) F2,F2,F& F4, &(R2) F4,F2,F4 &(R2),F4 Rl , Rl , #8 R2,R2,#8 Rl,inicio
• Desenrolle la secuencia cuatro veces y plani fi que el bucle desenrollado agrupando las instrucciones por su tipo . • P lanifique el bucle desenroUado en el apartado anterior en forma de instrucciones VLIW teniendo en cuen ta las características del procesador para ev itar cualquier detención del cauce. 291
INGENIERíA DE COMPUTADORES 11
• Si el tamaño de una inSU"ucc ión de código intermedio es 4 bytes, calcule el tamaño del código VLIW resultante y el espacio de almacenamiento que se desaprovecha. • Considerando que el bucle ori ginal y el desenrollado y planificado se ejecuta sin detenciones , esto es, un ciclo por instrucc ión, calcule los ciclos consumidos al ejecutar 1000 veces el código original, el desenrollado planificado y el VUw. A3.2 Considere el siguiente bucle: in i c i o : LD
ADD D SD SUBr BNEZ
F~ , ~ ( Rl ) F4 , F~ ,F 2
~ ( Rl ) ,F 4
Rl,Rl ,# 8 Rl, i ni c io
mediante el que se suma una constante, almacenada en F2, a los elementos de un aHay. • Genere el código intermedio aplicando segmentación softwm'e pero ev ite la utili zación de desplazamientos negati vos en los accesos a memoria del patrón y considere que la latencia de las instrucciones es de I ciclo. • Utili zando el códi go obtenido en el apartado antelior, escriba el código VLIW teniendo en cuenta que el fo rmato de instrucción admite una operación de carga/almacenallÚento (2 ciclos de latencia), una operación de coma fl otante (3 ciclos de latencia) y una operación entera/salto (1 ciclo de latencia y el salto consume un hueco de retm·do). • ¿Por qué si se apli ca la técnica de segmentación softwm'e al bucle original sin considerar las latencias verdaderas no se aprovecha realmente la segmentación hardwm'e de las unidades fun cionales ? A3.3 Dado el siguiente fragmento ele código: ini c io: LO
MUL TO LD ADDD SD SU Br SU Br BNE Z
F2
,~ (R l)
F 4,F 2, F l ~ F6, ~(R2)
F8, F6 ,F 4 ~(R 2) ,F 8
Rl, Rl, #8 R2 ,R2 , #8 Rl, i nic i o
donde F6 Y Fli'l contienen valores previamente cargados. Se pide que : • Aplique segmentación software y obtenga el patrón de comportamiento considerando que los accesos a memoria consumen dos cicl os y las operaciones de coma fl otante tres ciclos.
292
3.21. ACTIVIDADES
• Genere el correspondi ente pseudocódigo VLTW para un procesador VLTW genérico en el que la unidad de salto consume un ciclo. A3.4 Un procesador VLTW cuenta con un formato de instrucción que admite una operaclOn de carga/almacenamiento (2 ciclos de latencia), una unidad de coma flotante (3 ciclos de latencia) y unidad para operaciones enteras y de salto (1 ciclos de latencia y una hueco de retardo). Aplique segmentació n software al siguiente bucle y genere el correspondiente cód igo VLTW: inicio: LO AOOO SO SUBI BNEZ
F~,~(Rl) F4,F~,F2
~(Rl),F4
Rl,Rl,#8 Rl,inicio
A3.S Dado el siguiente bucle escrito en pseudocódigo: (i=~ ;
for
if
i
i++) then X[i]: = X[i] + a; (A[i]= = ~)
el se Y[i] : =Y[i] -a ; end if; end for;
• ESCliba el código intermedio genérico. • Escriba el código intermedio aplicando la técnica if-collversiol1. • Escliba el código VLIW de los apartados anteriores teniendo en cuenta que el formato de instrucción ad mite una operación de carga/almace namiento (2 ciclos de latencia), una operación de coma flotante (3 ciclos de latencia) y una operación entera/salto (1 ciclo de latencia y el salto consume un hueco de retardo). Compare los tiempos de ejecución para procesar un vector de 1000 elementos suponiendo que la probabilidad de ambas ramas del if es la mi sma. A3.6 Considerando el bucle del ejercicio anterior, genere código VLTW aplicando predicación y realizando la carga especulati va de los datos. A3.7 Dado el siguiente fragmento de pseudocódigo: if
(a > ~)
then
a:;;a+a;
else if
(b<~) then b:=b+b;
else 293
INGENIERíA DE COMPUTADORES 11
c:=c+c;
end if; a :=b;
end if; escriba e l código intermedio utilizando instrucciones cond icionadas con el fin de reducir al mínimo las sentencias de sa lto condicional. Las direcciones de memoria de las variables enteras a , b y e se encuentran almacenadas en M[R5] , M[R6] Y M[R7], respectivamente. A3.S Dado el siguiente fragmento de pseudocódigo:
if (a==®) then a:=b;
el se a:=a+l;
end if; y asumiendo que la rama then es la que tiene mayor probabi lidad de ser ejecutada, genere el cód igo intermed io apucando planificación de trazas. A3.9 Dado los dos ejemplos de código de la Figura 3.1 7, intente reducir el número de ciclos de ejecución mediante una adecuada reorgani zación de las instrucc iones. A3.10 La veloc idad pico o rendimiento máximo de un procesador vectorial se alcanza cuando todas las un idades func ionales ari tméticas se encuentran funcionando a pleno rendimiento una vez superadas las etapas de ¡manque. Por lo general, esta medida se expresa en MFLOPS. Suponiendo que di spone de un procesador vectoria l con una unidad de suma vectorial, una unidad de multipbcación y una de división que funcionan a una frecuencia de reloj de 500 MH z, escriba una secuencia de código vectoria l que alcance e l rendimiento máximo y ca lcule su valor en MFLOPS. A3.11 En un procesador vectori al con las siguientes características: • Longitud vectorial máxima 64 elementos. • Una unidad de suma vectorial con tiempo de arranque de 6 ciclos. • Una unidad de multiplicación con tiempo de a!Tanque de 7 ciclos. • U na unidad de carga/almacenamiento con tiempo de arranque de 12 ciclos. • La frecuencia de u'abajo del procesador es 500 MHz. se pretende ejecutar e l siguiente fragmento de cód igo vectorial : 294
3.21. ACTIVIDADES
LV MULTSV ADDSV SV SV
Calcule
T M. Telemelllo
V1,R1 V2,V 1, F1 V3,V 1 ,F1 R2 , V2 R3,V3
Y R 64 bajo las siguien tes condiciones:
• Si n encadenamiento e ntre unidades. • Con encadenamiento entre unidades.
• Con e ncadenamie nto y tres unidades de carga/alm.ace namiento. A3.12 En un procesador vectorial con las siguientes características : • Registros con una long itud vec torial máxima de 64 ele mentos. • Una unidad de suma vectOlial con tiempo de arranque de 6 ciclos. • Una unidad de multiplicación con tie mpo de arranque de 7 ciclos. • Una unidad de carga/almacenamiento con tiempo de a!Ta nque de 12 ciclos. • La frecue ncia de trabajo del procesador es 500 MHz.
• ha" de 10 ciclos y Tbuc/e de 15 ciclos. se pretende ejecutar el siguiente bucle: for (i=1; i <= n; i++) A[i] :=A[i ]+B[i]; B[i] :=a"B[i]; end for;
• Escriba el código vectorial que realizaría las operaciones ubicadas en el interior del bucle considerado la posibil idad de encadenamiento de resultados. • Calc ule Tu , T ]()Qo , R IOOO Y Roo . • Calcule T,,, T1000, R1 000 Y Roo pero ahora considerando encadenamientos y dos unidades de carga/al macenamiento. • ¿Qué ocurre si se considera e ncadenamientos, dos unidades de carga/almacena mie nto y se perm ite el solapamiento entre convoyes?
295
INGENIERíA DE COMPUTADORES 11
A3.13 Dispone de un procesador vectolial en el que el tiempo de acceso a los bancos de memoria es de 6 ciclos y el tiempo por elemento es de I ciclo. Los bancos de memoria tienen un ancho de una palabra de 8 bytes y se direccionan por bytes. En base a estos datos, • ¿Cuál es el núnimo número de bancos de memoria que hay que utilizar para que el tiempo de acceso a la memori a pelmanezca oculto salvo en lo que respecta al primer acceso? • Suponiendo que el procesador vectorial cuenta con el número mínimo de bancos de memoria, ¿cuántos ciclos tardará en completarse la carga de un vector de longitud 64 con una separación entre elementos de 20 palabras? • ¿Qué porcentaje de ancho de banda de memOlla se conseguirá con una carga de 64 elementos si se mantiene una separación entre elementos de I en comparación con una separación de 20?
A3.14 En un procesador vectorial dotado de una unidad funcional de suma y otra de multipli cación se ejecuta el siguiente programa en C: for
(i=~;
i < l~~~~;
i++) {
s[iJ :=a[iJ+b[iJ; t[iJ :=a[iJ"s[iJ; }
Las características del procesador vectorial son las siguientes: • La latencia de la unidad de memoria es de 14 ciclos de reloj . • El tiempo de arranque de la unidad de suma es de 8 ciclos de reloj . • E l tiempo de arranque de la unidad de multiplicación es de 10 ciclos de reloj. •
Tbllcle :;::;
•
Tbase
2S.
se considera que no existe.
• Frecuencia de reloj = 800M IIz. • MVL= 64.
Se pide que: • Escriba una secuencia de instrucc iones vectoriales que sustituya a la parte interior del bucle del programa C. Considere que las direcciones de a, b, S Y t están almacenadas respectivamente en Ra, Rb , Rs y Rt, respeti vamente. • Calcu le el tiempo de ejecución siguiente precondiciones:
296
TIOOOO
Y el rendimiento teórico máximo Roo en MFLOPS bajo las
3.21. ACTIVIDADES
• Sin encadenamiento. • Con encadenamiento.
• Con encadenamiento y 2 unidades de carga/a lmacenamiento. A3.15 Aplicando la técnica de seccionamiento de bucles, escriba el código escalar y vectOlial necesario para rea li zar la operación vectori al Y: =Y +X,'rs, donde s es un escalar "en coma flotante y X e Y son vectores
de 150 elementos con una longitud de 8 bytes. Considere que s, X e Y se encuentran almacenados en la direcciones de memoria M[Rl ], M[R2] Y M[R3] , respectivamente. El direccionamiento de memoria se reali za por bytes y MVL es 64. ¿Qué cambios habría que realizar en el código si la longitud de l vector no se conociese en tiempo de compilación sino en tiempo de ejecución? A3.16 Dado el siguiente bucle: for (i=0; i<256; i++) if ( i mod 2) t h en B[ i] := B[i] +A [i] ;
end if; e nd for ;
genere el conespondiente código vectori al y calcu le el tiempo de ejecución del bucle vectorizado considerando que MVL es 64, T ¡",cle es de IO ciclos y T bau de 5 ciclos. El coste de arranque de la unidad de sum a vectorial es de 6 ciclos y el de la unidad de carga/almacenamiento de 12 ciclos y ambas se pueden encadenar. Las direcciones de A y B se encuentran ubicadas en los registros Rl y R2.
297
Capítulo 4
PROCESAMIENTO PARALELO
4.1.
Guión-Esquema
Los contenidos que se tratan a lo largo del tema se resumen en los siguientes puntos: • Organización y principales características de las di ferentes plataformas de computación paralela. • Paradi gmas de programación paralela, detallando dos casos: cli ente/servidor y SPMD (S ingle Program Multiple Data).
• Descripción de las arquitecturas basadas en comunicaciones mediante espacio de memoria compartido. • Descri pción del sistema de comuni cación mediante paso de mensajes. • Tipos de redes de intercomunicación en sistemas paralelos: estáticas y dinámicas. • Análjsis del problema de coherencia de caché en sistemas multiprocesador y sus pos ibles soluciones. • Estudi o de los cllIsrers como principales representantes de los sistemas de memoria di stribuida. • Análi sis del rendimiento y costes de computación en sistemas paralelos.
INGENIERíA DE COMPUTADORES 11
4.2.
Introducción
Hasta lJ egar a este punto, todo lo que se ha estudiado en los tres temas previos estaba orientado a la mejora de las prestaciones de computadores construidos con un único procesador. Sin embargo, hoy en día se sabe que los sistemas basados en un único procesador presentan límites en el rendimiento que se pueden alcanzar, por lo que la tendencia que se ha establecido es la de construir máquinas dotadas de vari os procesadores, pudiendo oscil ar el número de procesadores desde unos pocos, como sucede en los computadores orientados al ámbito doméstico O empresari al, hasta alcanzar los cientos de miles en sistemas orientados a la computación de alto rendimiento. Evidentemente, esta tendencia, basada en el incremento de rendimiento en base a la suma de procesadores, va unida a toda la investigac ión que se continúa realizando para mejorar las características de los procesadores a ni vel individual (con sumo de energía, di sipación de calor, tamaño, velocidad, etc.), ya se trate de procesadores superescal ares, vectoriales o VLIWs. E n este capítulo se presentan las arquitecturas más relevantes para construir computadores dotados de varios procesadores, es decir, sistemas de procesamiento paralelo. El procesamiento paralelo es el método de organi zac ión de las operaciones en un sistema de computación donde más de una operación es reali zada de manera simultánea (o concurrente). La fin alidad inicial del procesami ento paralelo es obtener una mayor capacidad de cómputo. Para ell o se intenta di vidir el problema en múltiples tareas que se ejecutarán de manera paralela. De esta manera, para poder reali zar varias tareas de manera s iml~ tánea es necesario disponer de múltiples procesadores. La evolución de los sistemas paralelos ha sido constante desde sus inicios . Los primeros multiprocesadores datan de mediados del siglo XX, como por ejemplo el 704 de mM que fue el primer sistema en incluir un sistema de cá lculo en coma fl otante o el sistema D 825 de la Burroughs Corporati on que incluía hasta 4 procesadores y L6 módulos de memoria, conectados por un sw itch crossbar. También cabe mencionar los siste mas Multics desarrollados por Honeywell a partir de 1969, el C. mmp desalTollado por la Universidad Carnegie Mellon en 1970 y el Synapse N+ 1 desalTollado en 1984, que fue el primer computador basado en bu s que incluía un sistema snoopy para solucionar el problema de coherencia de cachés. Aún así, hoy en día la investigación en el campo de la computación paralela sigue siendo un campo muy activo. Aunque no existe un consenso sobre la defini ción de un multi procesador, las siguientes propiedades corresponden a una de las primeras caracterizaciones de sistemas multiprocesador, que fu e realizada por P.H. E nslow en 1977: • Debe estar compuesto por dos o más procesadores. • Los procesadores deben compartir el acceso a una memori a común. • Los procesadores deben compartir acceso a canales de E/S, unidades de control y dispositivos. • El sistema es controlado por un úni co sistema operativo. 300
4.3. TIPOS DE PLATAFORMAS DE COMPUTACiÓN PARALELA
A continuación, se describen las características, estructura, organizac ión y djseño de las diferentes
plataformas de computación paralela que ex isten en la actualidad.
4.3.
Tipos de plataformas de computación paralela
La estructu ra de los tipos de plataformas de computación paralela depende de su organización lógica y física: • La organización lógica se refi ere a la visión que el programador ti ene de la plata forma, es decir, las capacidades para expresar tareas paralelas (la estructura de contlVl) y los métodos de comu nicación entre dichas tareas (el modelo de cOlllunicación) . • La OIganización física se refiere a la estructura del hardwa re que compone la platafo rma. Como ya se ha comentado, una de las características principales de un sistema multiprocesador es el acceso compartido a una región de memoria com ún a todos los procesadores. Existen dos modelos para imp lementar este espacio de direcciones común: • Sistemas de memoria compartida, en los que un único sistema de memoria física es
compartido por todos los procesadores . • Sistemas de memoria distribuida , en los que cada procesador tiene su propia memoria física, a la que el resto de procesadores no tiene acceso directo.
En esta sección se describe la organización lógica de las plataformas de computación paralela, relati va a la estructura de control y al modelo de comu nicación. En sucesivas secciones se detall ará la organización física, describiendo las plataformas de memoria compartida y di stribuida.
4.3.1.
Organización basada en la estructura de control
Las aplkaciones paralelas se pueden clasificar en algunos parad igmas de programación claramente
establecidos. Basta con unos pocos paradigmas para, uti li zándolos repetidamente, poder desarrol lar la mayoría de los programas paralelos. En este contexto, por parad igma se entiende una clase de algoritmos que tienen la misma estructura de control. La elección del paradigma a util izar depende de la disponjbi lidad de los recursos computacio nales paralelos que se tengan y del tipo de paralelismo inherente al problema. Los recursos computaciona les defi nen el grado de acoplamiento o ni vel de granularidad que puede soportar el sistema de forma eficiente, por ejemplo, un programa paralelo con granularidad gruesa se corresponde con un programa con muchas instrucciones secuenciales, lo que equivale a un grado de acoplamiento bajo. El tipo de paralelismo refl ej a la estructma de la apli cación y/o de los da tos. El paralelismo debido a la estructura de la aplicación se denom ina paralelismo fi/llcio nal. En este caso, las diferentes partes de un programa pueden realizar distintas tareas de una manera conCUITente y cooperativa. Pero el paralelismo se puede encontra r también en la estructura de los datos; esta clase de paraleli smo permitirá la ejecuóón de procesos paralelos con 301
/
INGENIERíA DE COMPUTADORES 11
idéntico modo de operación pero sobre di stintas partes de los datos. A este segundo tipo de paralelismo se le denomi na paralelismo estructural o paralelismo a nivel de datos . En el área de la computación paralela diferentes autores presentan distintas clasificaciones de parad igmas. La mayoría de estas clasi fi caciones se basan en los siguientes criterios: • propiedades del proceso (estructura, topología y ejecución). • propiedades de interacción. • propiedades de los datos (d ivisión y loca lización). Aunque no todos los autores proponen exactamente la misma clasificac ión, realizando la unión de todas ellas se puede crear un ampli o conjunto de los paradigmas que se utili zan en las apl icaciones paralelas. Los más comunes son: • Descolllposición iTerativa: Algunas apli caciones están basadas en la ejecución de un lazo donde cada ite ración se puede realizar de form a independiente. Esta técni ca se imp lementa a través de una cola central de tareas ejecutab les, y se corresponde con el paradigma de descomposición en grupos de tareas. • Paralelismo algorítmico : el cual se centra en paralelizar el flujo de los datos de entrada. • Descomposición geométrica : El dom inio del prob lema se divide en peq ueños subdominios y cada procesador ejec uta el algoritmo en la parte del subdomini o que le cOlTesponde. • Descomposición especulativa: Se intentan N técnicas de solución simultáneamente, y (N- l ) de ellas se eli minan tan pronto como una de ellas dev uelve una respuesta correcta. • Descomposición f uncional: La aplicac ión se di vide en di stintas fases, y cada fase ejecuta una parte diferente del algoritmo para resolver el problema. Tambie n puede denominarse segmentación de datos. • Maestm/Esc/avo: El proceso maestro es el responsable de descomponer el problema entre sus procesos esclavos y de, posteriormente, recoger los resultados que le envían los esclavos para ordenarlos y obtener el resu ltado fin al. • SPMD (Single Pmgram Multiple Data): En este paradigma cada procesador ejecuta el mi smo código pero sobre di stintas partes de los datos. • DescomposiciólI recursiva a divide y vencerás: El problema se divide en subprob lemas que se resuelven de forma independiente para, posteri ormente, combinar sus resultados parciales y obtener el resultado fina l. A continuación se comentan con mayor detalle únicamente los dos parad igmas más extendidos: Maestro/Esclavo y SPMD.
302
4.3. TIPOS DE PLATAFORMAS DE COMPUTACiÓN PARALELA
4.3.1.1.
Paradigma M aestro/ Esclavo
El paradi gma Maes trofEsclavo es el más utili zado e n las apl icaciones paralelas y en la mayo ría de los casos, como el propio nombre indica, consta de dos lipos de entidades: un maestro y varios esclavos. El maestro es el responsable de la descompos ició n del problema en pequeñas tareas, de distribuir estas tareas entre el conjunto de procesadores esclavos y de recoger los resultados parciales obte nidos de cada procesador esclavo para ordenarlos y obtener el resultado final del problema. Los procesadores esclavos reciben un mensaj e con la tarea a realizar, realizan la tarea y envían el resultado al maestro. N01111almente, la comunicación tiene lugar lll1icam en te entre el maestro y los esclavos. El paradigma MaestrofEsclavo puede utili zar un balal1ce de carga estático o un balal1ce de cOIga dil1álllico (que serán descritos e n la Secc ió n 4. 6. 1.7). E n el primer caso, la distribución de las tareas se
realiza al comienzo de la computación, lo cual permite al maestro participar e n la computación una vez que haya as ignado ulla fracción del trabaj o a cada esclavo. L a as ignación de tareas se puede reali zar de una sola vez O de manera cíclica. L a Figura 4. 1 muestra una representación esquemática de una est.ructura
Maestro/Esclavo estática. (
Maestro
)
Distribución de tareas
( Esclavo 1 ) i
( Esclavo 3 )
( Esclavo 2 ) i
Recogida de
Comunicaciones
resultados
Finalización
Figura 4.1: Estru ctura Maes lro/ Esclavo estálica.
La otra forma es utiLi zar el paradi gma MaestrofEsclavo con balance de carga dinámico, el c ual es mu y útil cuando el número de tareas es mayor que el núme ro de procesadores di sponibles o cuando el número de tareas es desconoc ido al comienzo de la aplicación. Una característica importante del balance de carga dinámico es la capacidad que lie ne la apli cación de adaptarse a los posibles cambios del sistema, no so lo 303
INGENIERíA DE COMPUTADORES 11
a la carga de los procesadores sino también a posi bles reconfiguraciones de los recursos del sistema. Debido a esta característica, este paradigma puede responder bastante bien cuando se produce el fallo de algún procesador, lo cual ·simplifica la creación de aplicaciones tolerantes a fallos que sean capaces de sobrevi vir cuando se pierde algún esclavo o incluso el maestro. Este pamdigma puede alcanzar elevadas aceleraciones computacionales y un interesante grado de escalabilidad l . Sin embargo, para UD gran número de procesadores el control centrali zado del proceso maestro puede llegar a ser el cuello de botella de las aplicaciones. Pero a pesar de ello, es posible mejorar la escalabi lidad del paradigma pasando de un procesador maestro a un conjunto de procesadores maestros, controlando a su vez cada uno de ellos a un conjunto de procesadores esclavos. 4.3.1.2.
Paradigma SPMD (Single Program Multiple Data)
En el paradigma SPMD cada procesador ejecuta básicamente el mismo código pero sobre distintas partes de los datos. Esto supone dividir los datos de la aplicación entre los procesadores disponibles. A diferencia del paradigma Maestro/Esclavo, en este modelo la comunicación se estab lece entre esclavos. A este tipo de paralelismo también se le denomina paralelismo geométrico, estructural o paralelismo a nivel de datos. La Figura 4.2 muestra un esquema de esta clase de paradigma.
Distribución de datos
Cálcu lo Intercambio Cálculo
Cálculo In tercambio Cálculo
Cálculo Intercambio Cálcu lo
Cálculo Intercambio Cálculo
Recogida de resultados
Figura 4.2: Estructura básica de un programa SPMD. En un caso extremo, este paradigma también engloba aquell as aplicaciones donde un algoritmo secuencial se ejecuta simultáneamente en diferentes procesadores pero con diferentes datos de entrada. En estas aplicaciones no hay dependencias entre las tareas de los distintos procesadores esclavos por lo que no se necesita la comu nicación ni la coordinación entre ellos. I L a escalabilidad puede entenderse como la capacidad del sistema para mejorar la pOlencia de cálcu lo cuando el número de compone ntes del sistema aumenta.
304
4.3. TIPOS DE PLATAFORMAS DE COMPUTACiÓN PARALELA
Muchos problemas físicos tienen una estructura geométrica regular, homogeneidad que permite distribuir los datos uniformemente e ntre los procesadores. Los procesadores se comunican entre sí, donde la carga de comunicac ión será proporcional al tamaño de la información enviada y la carga compu tacional será proporcional al volumen de los elementos. Este paradigma se puede utilizar para realizar alguna sincronización global periódica entre todos los procesadores. Normalmente, los esquemas de comunicación son muy estructurados y extremadamente predecibles. Los datos iniciales pueden ser generados por cada procesador o pueden ser leídos de memoria secundaria o distribuidos por uno de los procesadores. En este último caso se puede presuponer la existencia de un procesador maestro en la fase inicial. Las aplicaciones SPMD pueden ser muy eficientes si los datos están bien distribuidos entre los procesadores y el sistema es homogéneo. Si los procesadores presentan distintas cargas de trabajo o capacidades, el paradigma neces itará algún mecani smo de planificación de balance de carga centralizado, completamente distribuido o parcialmente distribuido para distribuir los datos durante el tiempo de ejecución. Sin embargo, este paradigma es muy sensible a la pérdida de algún procesador. Normalmente, el fal lo de un único procesador es suficiente para bloquear la aplicación, debido a que entonces mngún procesador podrá avanzar más allá del punto de sincronización global.
4.3.2.
Organización basada en el modelo de comunicación
Existen principalmente dos modelos de comunicac ión de información entre tareas pru'alelas: • E l espacio de direcciones único y compartido (memoria compartida). • El paso de mensajes.
4.3.2.1.
Espacio de direcciones compartido
Los procesadores de los sistemas con memOlia compartida se caracterizan por compru·tir físicamente la memoria, es decir, todos acceden al mismo espacio de direcciones . Un valor escrito en memoria por un procesador puede ser leído directamente por cualquier otro. En principio, en esta ru'quitectura la memoria es igualmente accesible por todos los procesadores a través de la red de interconexión. La Figura 4.3 muestra el esquema básico de la ru'quitectura de memoria compartida. En este contexto, en el que la red de interconexión es determinante para la eficacia del sistema, son fundamentales dos parámetros que caracterizan la velocidad de transferencia entre elementos del sistema pru'alelo: • Latencia de red, es el tiempo que se tru'da en enviar un mensaje a través de la red de interconexión del si stema paralelo. • Ancho de banda, definido como el número de bits que se pueden enviar por unidad de tiempo.
305
INGENIERíA DE COMPUTADORES 11
p M p
Red de Interconexión
M
M
0-
L -_ _----'
P: Procesador
M: Memoria
Figura 4.3: Esquema de la arqu itectu ra de memoria compartida.
Para garanti zar la eficacia de esta arquitectu ra es fundamental que el ancho de banda sea elevado, ya que en cada ciclo de instrucción cada procesador puede necesitar acceder a la memoria a través de la red de interconexión. Este acceso a memoria puede ser lento debido a que las solicitudes de lectura o de escritura pueden tener que pasar por varias etapas en la red. En la arquitectura de memoria compartida se satisface que la latencia de red es baja y e l ancho de banda alto, solo si no se encuentran varios procesadores tratando de acceder al medio utili zado para la transmisión de datos simultáneamente. Por este hecho y otros problemas relac ionados con el mismo, el número de procesadores en este tipo de sistemas suele ser pequeño y la arqui tectura más común para la comunicación es la de bus, en la cual todos los procesadores y módulos de memoria se conectan a un único bus, tal como muestra la Figura 4.4. En esta arqu itectura el tiempo de acceso a memoria es el mismo para cualquier palabra acced ida por un procesador, por lo que se denomina arqu itectura de acceso uniforme a memoria (UMA - Unifonn Memory Access). La mayoría de los sistemas de memori a compartida incorporan una me moria caché local en cada procesador y, del mismo modo que en los computadores secuenciales, sirve para aumentar e l ancho de banda entre el procesador y la memoria local. Aná logamente, puede existir una memoria caché para
,
[
.
,
,
E/S
.
Módulo de memoria
Módulo de memoria
E/S
,
,.
·11
,
Procesador
,
,
11
,
11
,
Procesador
1 Figura 4.4: Organizac ión multiprocesador de bus común.
306
11
,
,
,
4.3. TIPOS DE PLATAFORMAS DE COMPUTACiÓN PARALELA
la memoria global. Cuando se utilizan memorias caché es fundamental asegurar la coherencia de la información en la memoria caché, de modo que cuando un procesador modifique el valor de una variable
compartida los demás procesadores no consideren su valor antelior. ya que es incOlTecto desde ese momento. S in embargo, existe otro factor fundamental en sistema parale los que limita a la arquitectura
UMA: la escalabilidad. De forma genérica puede entenderse como la capacidad del sistema para mejorar la potencia de cálculo cuando el número de componentes del sistema aumenta. En el caso ideal sería lineal, de manera que al tener dos procesadores se dispondría del doble de potencia de cá lculo, con cuatro el cuádrupl e, y con cien tendríamos cien veces más. Sin embargo, debido a facto res como los ti empos de comuni cación, la escalabilidad no suele ser lineal y, además, llega a sanlrarse. La saluración indica que por muc hos componentes más que se incorporen, no se consigue ninguna mejora. Ac tualmente, los
sistemas UMA se utili zan para la construcción de arquitecturas multiprocesador de bus compartido con un reducido número de procesadores, ya que con un mayor número de procesadores los probl emas de acceso a la memoria remota se incrementan . I ncluso incorporan do mecal'u smos de memoria caché, los sistemas UMA presentan una escalabilidad lim.itada. Normalmente, e n la actualidad su número máximo
de procesadores está entre 16 y 32. Sin embargo, algunas mejoras pueden realizarse dotando a cada procesador de una memOlia local, en la que se almacena el código que se está ejecutando en el procesador y aquel los datos que DO tengan que ser compartidos por los otros procesadores y, por tanto, son locales a ese procesador. Med iante esta estrategia se ev itan accesos a memoria a través de la red de interconexión relacionados con búsquedas
Red de Interconexión
M
(a)
Red de Interconexión
(b)
Figura 4.5: a) A rquitectura de memoria co mpartida con acceso no uniforme a memoria, b) memoria compart ida con acceso no uniforme a memoria solo con memoria local.
307
INGENIERíA DE COMPUTADORES 11
de código y datos locales, lo que mejora la eficacia del sistema. Esta modificación de la arquitectura es conocida como memoria compartida con acceso no uniforme a me mori a (NUMA - Non Unifor/1/ MemO/y A ccess) y se ilustra en la Figura 4.5. a. El tiempo de acceso a memori a es no uniforme dependiendo de si el acceso se realiza a la memoria local del procesador o a algun a otra memoria remota. Los sistemas NUMA son también conocidos como sistemas de memoria compartida distribuida (DSM - Dislribuled Shared MeIl1O/Y) . La idea de di stribuir la memoria compartida puede llevarse al limite elimi nando completamente el bloque de memoria compartida común, la global, tal y como se muestra en la Figura 4.5.b, siempre y cuando los tiempos de acceso a las me morias locales sean muy inferiores al tiempo de acceso por la red ele interconexión. En este di seño los accesos de un procesador a las memOiias loca les de los otros se rea li zan medi ante el control de un hardware específi co. En general, el esquema de la arquitectura NUMA no requiere del empleo de mecani smos especiales que aseguren que todos los nodos tienen un conocimiento coherente del espac io de direcciones global. Es posible manejar un espacio común de diJ'ecciones y que sea el programador el encargado de manipu lar el contenido de esas direcciones de memoria ev itando cualquier fa lta de coherencia. Por otro lado, el mantenimi ento de la coherencia de las cachés de los diferentes procesadores de manera transparente al programador supone una gran ventaja. Las arquitecturas NUMA que incluyen mecani smos hardware dedicados a mantener la coherencia de caché son: ccNUMA (caché-coheren/ NUMA) y COMA (Caché-Only Memol y Access). En los sistemas ccNUMA cada nodo contiene una porción de la memoria total del sistema (ver Figu ra 4.6). Las variabl es compartidas se reparten directamente por el programador o por la máquina haciendo uso del sistema operativo, de manera que solo existe una única copia de cada variable en la memoria principal. Cada nodo puede constar de uno o varios procesadores con sus cachés y una memoria principal. Los diferentes procesadores pueden almacenar múltiples copias de los mismos datos en sus cachés locales, por lo que es necesaIio mantener la cohe rencia de los datos a través de todo el sistema. La coherencia se mantiene normalmente med iante el escaneo de las operaciones que real izan los procesadores y se transmiten por la red (protocolos snoopy) o manteniendo un registro de la loca lización
Red de Interconexión
$ P
p
P
$ : Protocolo de Coherencia de Cache
Figura 4.6: Arquitectura ccNUMA . 308
$
$
P
P
4.3. TIPOS DE PLATAFORMAS DE COMPUTACiÓN PARALELA
de las va riables en cada procesador (directorios). Ambas técnicas se detallarán en la Sección 4.4.2. En el caso de la arqu itectura COMA, los procesadores que componen cada nodo no incluyen memoria local sino que so lo poseen caché. La idea básica es emplear la memoria local de cada nodo del Illultiprocesador como si fuese una caché del resto del sistema, transfi riendo los datos de cada nodo en fun ción de las necesidades del código en ejecución. Esta idea es análoga a la de caché de un sistema monoprocesador, de modo que la memoria local de un nodo actúa como caché y el conjunto de la memoria loca l de los otros nodos sería el eq ui valente a la memoria principal. Si un procesador ti ene que acceder repetidam ente a una posición de memoria que se encuentra en un nodo remoto se puede copi ar la poskión de memoria remota en la memoria loca l, y en los siguientes accesos no habrá que reali zar un
acceso remoto para acceder al dato. El esquema de esta arqu itectura se muestra en la Fi gura 4.7. Co mo ya se ha comentado, los esquemas de coherencia de caché más utilizados se detallarán en la Sección 4.4.2. Red de Interconexión
c: Memoria caché Figura 4.7: Arqu itectura COMA. La ventaja fundamental de los sistemas COMA es que son capaces de tratar los fallos de acceso remoto distribu ye ndo los datos que está utili zando la aplicación automáticamente por el sistema. La principal desventaja es la complejidad para mantener la coherencia de las copias de las variables a lo largo de todo el sistema, ya que no existe una única copi a segura, como sucede en el caso ccNUMA. 4.3.2.2.
Paso de mensajes
El paso de mensajes consiste en el intercambio de información, en forma de mensajes, entre los diferentes procesadores que componen el sistema. Cada uno de estos procesadores puede estar compuesto por un único procesador, o un sistema multiprocesador con emoria compartida. Esta última opción está ganando fu erza en las plataformas modernas de computación paralela. Los elementos necesari os para describir el sistema de comuni cación por medio de mensajes son los siguientes: emisor, recepror, canal de comunicaci6n y el mensaje. El emi sor y el receptor están representados por el procesador que ini cia la cot11unicación y el que la recibe, respectivamente. El canal de comunicac ión lo compone la red de interconex ión existente entre los diferentes procesadores. Las diferentes tipologías de red que se pueden encontrar son descritas más adelante en este capítulo.
309
INGENI ERíA DE COMPUTADOR ES 11
El mensaje está compuesto por la información enviada, ya sean datos, trabaj os o información de sincroni zacjón de tareas.
Existen cuatro operaciones bás icas necesarias para establecer un mecanismo de paso de mensajes: • Envío: Usada para envim el mensaje. • Rece pción : Usada para recibir el mensaje. • Identific ac ión: Usada para identifi car cada uno de los procesadores del sistema, medimlte un identifi cador único. Este identifi cador debe acompañm· a las operaciones de envío y recepción para poder identi fi car al emi sor y el receptor. • Número de participant es : Usada pm·a identifi car el número de procesadores que participan en la com unicación. Med iante estas cuatro operaciones es pos ible escri bir cualquier tipo de programa por medio de paso de mensajes. D iferentes implementaciones de mecanismos de paso de mensajes, tales como Parallel Virlual Machi/1e (PVM) y Message Passing Inle/face (MPI), incluyen estas cuatro operaciones así como otras operaciones de más alto nivel. En un sistema con el espacio de di recciones compartido es relati vamente sencillo emul ar un sistema de comunicación por paso de mensajes . Simplemente dividiendo el espacio de direcciones en fracciones iguales, cada una asignada a un procesador, las acciones de envío y recepción de mensajes estmÍan representadas por la escri tura y lectura de información en dichas fracciones de memoria. Por ejemplo, un procesador PI podrá envim un mensaje al procesador P2 escribi endo la información del mensaje en la parte del espac io de direcciones asignada a éste. Sin embargo, e n un sistema de paso de mensajes se hace muy costoso emular un sistema con espacio de direcciones único. Esto es porque los accesos a la memoria cOlTespondiente a otros procesadores requieren del envío y recepción de múltiples mensajes.
4.4.
Sistemas de memoria compartida
Cuando se quiere realizm· el diseño de un sistema de memod a compartida se deben tener en cuenta tres aspectos básicos: • La organización de la memOli a principal. • El diseño de la red de interconexión. • El diseño del protoco lo de coherencia de la caché. El primer aspecto sobre la organi zación de la memoria principal ha sido descrito previamente en la Sección 4. 3.2.1 por lo que no se tendrá en cuenta a lo lm·go de esta sección. A continuac ión se introducirán y se acl ararán los conceptos relacionados con la red de interconexión y los mecani smos de coherencia de caché. 310
4.4. SISTEMAS DE MEMORIA COMPARTIDA
4.4.1.
Redes de interconexión
Independientemente del mecanismo usado para com unicar los procesadores, las operac iones deben ser tra nsmi tidas por medio de una red de interconexión. Esta red puede utilizarse para acceder a memoria remota o para transportar mensajes entre los diferentes procesadores. En esta sección se analizan las diferentes topologías de redes que se pueden encontrar en computadores paralelos, y principalmente en sistemas de memoria compartida. Estas se dividen e n dos clases principales: las redes estáticas, definidas durante la construcción de la máquina y las redes dinámicas, que pueden adaptarse a los requisitos de comunicación de los programas que se ejecuten.
4.4.1.1.
Redes estáticas
Una red estática, también denominada red directa, es una red cuya topología queda definida de rnanera definitiva y estable durante la construcción de la máquina paralela. Como se puede apreciar, el papel de la red de interconexión es tanto más importante cuanto mayor sea el número de e lementos físicos que se deben unir y el flujo de información que se desee intercambiar. En general, las redes estáticas pueden presentar di stintas topologías en función de las conexiones punto a punto que se establezcan eno'e sus procesadores. Se pueden dividir en cuatro tipos básicos: redes unidimensionales, bidimensionales, tridimensionales e hipercubos. Las redes u11idimensionales son las más sencillas de rea lizar. La idea más inmediata es conectar cada procesador a dos procesadores vecinos, uno a la derecha y 00'0 a la izquierda. La Figura 4.8.a muestra esta disposición, conocida como red lineal , en la que todos los procesadores salvo los extremos están enlazados a otros dos procesadores.
-0-----0-0-0-
(al
(b)
Figura 4.8: Topologías de red unidimensionales: a) lineal, b) anillo.
La diferencia fundamental de las redes lineales con el bus radica e n el hecho de que en un mo mento dado puede reali zarse más de una transferen cia simu lt,lneamente siempre que sea a través de e nl aces diferentes. Por ejemplo, un procesador puede enviar un mensaje simultáneamente a un procesador situado a su izquie rda y a otro a su derecha. Esta topolog ía es muy simple pero presenta problemas de comunicac ión cuando el número de procesadores es elevado. 311
INGENIERíA DE COMPUTADORES 11
Una pequeña modificación de esta estructura, en la que se enlazan los extremos final es, permite notables mejoras en la comunicaci ón ya que cada procesador enviará los mensajes por su izquierda o por su derecha, dependiendo de cual sea e l camino más corto. Esta red, también unidimensional, es denominada anillo, y se muestra en la Figura 4.8.b. Una primera estrategia bidimensional puede obtenerse a partir de un anillo incre mentando el número de enlaces por nodo, con lo cual disminuyen los tiempos de transferencia entre los nodos de la red. Esta topología denominada ele anillo cordal, se ilustra en la Figura 4.9 .a. Otros esquemas intuitivos son la malla (véase la Figura 4.9.b) y la red sistólica O arra)' sistólico (Figura 4.9.c). Obsérvese que la red sistólica es una malla con conexión en una diagonal entre los procesadores de un cuadrado.
(a)
(b)
(e)
Figura 4.9: Topologías de red bidimensionales: a) anillo cordal, b) malla, c) red sistólica.
(a)
(b)
Figura 4.10: Topologías de red bidimensionales: a) red completamente conectada, b) red en estrella.
El esquema bidimensional ideal es la red completamente conectada, en la que cada procesador se comunica directamente con cualquier otro, de manera que los mensajes se envían en una única etapa o paso. La Figura 4. 1O.a muestra la estructura de esta red. Obsérvese que una red completamente conectada no es más que un anill o cordal llevado a su máx im a ex presión. Sin e mbargo, al incrementarse el númerO de enlaces, se incrementa el coste de la red. Estas 312
4.4. SISTEMAS DE MEMORIA COMPARTIDA
redes son la equivalencia estática a las redes dinánucas clVssbar, que se describirán más adelante. Ambas son redes no-bloqueantes, ya que una conexión dada entre dos elementos de la red no puede ser bloqueada por otra conexión previa entre otros dos elementos diferentes de la red. Una estrategia que alivia el coste de las conexiones al aumentar el número de procesadores consiste en disponer de un procesador que actúe como procesador central, de manera que para cada uno de los demás procesadores se establece un camino de comunicación con él. La Figura 4.1 O.b muestra esta topología, denonunada en estrella. Como puede observarse, esta eso'ategia es también simi lar a la del bus común, ya que las com unicaciones entre dos procesadores se establecen a través del procesador central. En estas redes dicho procesador es fundamental. Como aplicación directa de las estructuras de datos tipo árbol surgen las redes árbol. En ellas hay un procesador en cada nodo del árbol y solo un camino de conexión entre cualquier par de procesadores. En la Figura 4.11 se muestran dos redes de árboles binarios. En la Figura 4.ll.a todos los nodos son procesadores mientras que en la Figura 4.ll.b solo las hojas del árbol son procesadores siendo el resto elementos de conmutación (que no procesan infoffilación, solo la reenvían).
~)
~)
O
Procesadores
O
Elementos de conmutación
Figura 4.11: Topología de red bidimensional: red de árboles bi.narios.
Las redes lineales y las redes en estrella son casos particulares de la topología en árbol. El camino de comunicación se reali za de la sigu iente forma: cuando un procesador envía un mensaje lo transmite
hacia arri ba en el árbol hasta que encuentra el procesador destino o llega al nodo raíz del menor subárbol que contiene tanto al procesador Oligen como al destino. En este caso una vez alcanzado este nodo raíz, el mensaje desciende por el árbol hasta encontrar el destino. Las redes de árboles tienen la desventaja de que las comunicaciones pueden verse comprometidas en un nodo c uando el número de procesadores es grande y se realizan comunkaciones entre procesadores situados en los niveles superiores. Así por ejemplo, si muchos procesadores del subárbol izqui erdo requieren comunicarse con muchos procesadores del derecho, entonces el nodo raíz debe manejar todos los mensajes, con lo que la eficacia del sistema di snunuye significativamente ya que aumenta el tiempo empleado para las comunicaciones. 313
INGENIERíA DE COMPUTADORES 11
Figura 4.12: Topología de red bidimensional: fall ree.
Una estrategia comúnmente usada para ali viar esta desventaja consiste en aumentar el número de conexiones de comun icac ión entre los procesadores de menor nivel , es decir, los cercanos al nodo raíz. Esta red, que se muestra en la F igura 4. 12, es conoc ida como red de árbol grueso (fattree). Las redes en árbol tienen una equivale ncia dinámica, realizada de manera que los nodos intermedios son e lementos de conmutación mientras que las hojas son procesadores. Por último, las redes bidimensionales ti po lI1esh surgen como una extensión de las redes lineales. En las redes mesh bidimensionales cada procesador se conecta directamente con otros cuatro procesadores salvo en los extremos, ta l y como se muestra en la Figura 4. 13.a. Cuando los procesadores forman un a estructura cuadrada con igual número de procesadores en cada dimensión se denomina lI1esh cl/adrado, y si e l número de procesadores es diferente en las dos dimensiones se denomina mesh rectangular. Como es natural los procesadores extre mos pueden conectarse entre ellos, como se hace con las redes lineales para formar un ani llo, tal y como se muestra en la Figura 4. l 3. b. A esta topología se le denom ina mesh cerrada o fOlv. En estas topologías mesh la ruta de comunicac ión puede reali zarse a través de una dimensión y seguidamente a través de la otra. Una extensión inmed iata de los mesh bidimensionales es la topología mesh tridimensional, que de nuevo puede establecerse con los procesadores periféri cos conectados o no conectados. La Figura 4.14 muestra esta topología. Más a ll á de las tres dimensiones aparecen las redes hipercubo. Estas redes son mesh mul tidimensionales con dos procesadores en cada dimensión , de manera que un hipercubo de dimensión d está constitui do por p = 2d procesadores. Los hipercubos pueden construirse de forma rec ursiva teniendo en cuenta que un hipercubo de dimensión cero consta de un único procesador, uno de dimensión uno se forma conectando dos hipercubos de dimensión cero, y así suces ivamente, de manera que un hipercubo de dimensión 1se forma 314
4.4. SISTEMAS DE MEMORIA COMPARTIDA
P,
P, (a)
(b)
Figura 4.13: Topo logías de red bidimensionales: a) mesh cuadrada , b) mesh cerrada o toro .
Figura 4.14: Topología de red tridime nsional : mesh tridimension al.
conectando los procesadores correspondientes a dos hipercubos de dimensión [- 1. En la Figura 4.15 se muestran los hi percubos de dimensión cero, uno. dos, tres y cuatro. Los hipercubos presentan propiedades espec ialmente interesantes, entre las que destacan las siguientes: • Dos procesadores se conectan entre sí, si y solo si sus etiquetas, en binario, tienen exactamente un
bit distinto en una posición determinada, tal y como se muestra en la Figura 4. 15. • Un procesador de un hipercubo de dimensión d se conecta directamente a d procesadores. • Todo hipercubo de dime nsión d puede dividirse en dos de dimensión d - 1. Para ello se selecciona la posición de un bit y se ag rupan todos los procesadores que tengan un cero en esa posición. Todos elJos forman una partición y el resto fOlma la segunda partición. La Figura 4. 16 muestra las tres particiones de un hipercubo tIidimensional. Las líneas gruesas conectan los procesadores que pertenecen a una misma partición. Las etiquetas que identifican un procesador en un hi percubo de dimensión d constan de d bits. Para cualq uier grupo de k bits fijo , los procesadores que difieren en los demás d - k bits forman un subcubo de dimensión d - k formado por 2 d - k procesadores. Dado que con k bits se pueden obtener 2k combinaciones diferentes, se tendrán 2 1 subcubos distintos. En la Figura 4.17 se ilustra este hecho, para k = 2 Y d = 4. En la Figura 4.17.a se muestran los 315
INGENIERíA DE COMPUTADORES 11
110
O
00
10
111
O 01 (a) Hipercu bo O-O
00 1
11
(b) Hipercubo 0-1
(e) Hipercubo 0-2
011
/
(d) Hipercubo 0 -3
1000
0001
--- ---------
---
(e) Hipercubo 0 -4
Figura 4.15: Hipercubos de dimensión: a) cero. b) uno, e) dos, d) tres, e) cuatro.
110
100
000
010
101 001
000
111 011
110
100
010
010
101 00 1
111 011
Figura 4.16: Particiones de un hipercubo tridimension al.
316
110
100
011
4.4. SISTEMAS DE MEMORIA COMPARTIDA
cuatro subcubos, cada uno de ellos formado por cuatro procesadores, cuando los bits fijados son los dos más signifi cativos, yen la Figura 4.17.b los obtenidos cuando se fijan los dos bits menos significativos.
0000
1000
0001
(a)
0000
0001
U------=.::..:.:.(T-
(b)
Figura 4.17: Divisiones de la red hipercubo .
• Un parámetro de especial interés es la denominada distancia de Hammin g, que se define como el número total de posiciones de bits para los que las etiquetas de dos procesadores son diferentes. Por ejemplo, la distancia de Hamming para los procesadores 011 y 101 es dos, y entre 111 y 000 es tres. Con todo ello, la distancia de Hamming entre dos procesadores de etiquetas a y b es el número de bits a I que hay tras el resultado de la operación a El) b, donde El) es la or-exclusiva. El número de enlaces por el camino más corto entre dos procesadores viene dado por la distancia 317
INGENIERíA DE COMPUTADORES 11
de Hamm ing. La Figura 4.15.e muestra la ruta de un mensaje desde el procesador a = 0 10 1 al procesador b = 101 l . La di stancia de Hamming en este caso es tres, ya que a El) b = I 110. El mensaj e se transmite por las dimensiones para las que la posición de a El) b vale 1, comenzando por e l bit menos significativo. En el nodo origen nos fijamos en el segundo bit menos significativo (OJO 1), correspondi ente al primer I de la distancia Hamming situado en el segundo bit menos significativo, y nos movemos al nodo adyacente que en esa posición tiene un bit di stinto del bit del nodo origen (es decir, al nodo 0 11 1). Repetimos la operación fijándonos en el tercer bit menos significati vo del nodo actua l (011 1), correspOlldiente al sig uiente I en la distancia Hamming, y nos movemos al noclo adyacente que tenga un bit distinto en esa posición (es decir, al nodo 00 11 ). Desde el nodo actual repetimos la operac ión, fijándonos en el cuarto bit menos signifi cativo (00 11), correspondiente al último l de la di stanc ia Hamming, y nos movemos al nodo adyacente que tenga un bit distinto en esa posición (el nodo 1011 ). Obsérvese que debido a que a El) b tiene como máximo d bits que valen 1, el camino más corto entre dos procesadores de un hipercubo consta como máxi mo de d enlaces. General iza ndo la nomenclatura de las topologías se de finen las redes d-c ubo k-arias. En e ll as, d es la dimensión de la red y k es e l número de procesadores en cada dimensión. A este factor, k, se le denomina radio. Así por ejemplo, un hipercubo de dimensión d, que no es sino un mesh d-dimensional con dos procesadores en cada dimensión, sería un d-cubo 2-at·io. Por otro lado, un anillo sería un ¡ -cubo p-atio. Ambas topologías serían los extremos de la topo logía general d-c ubo k-arias. Finalmente, obsérvese que en las redes d-cubo k-at"ias e l número total de procesadores será kil.
4,4,1.2.
Caracterización de redes estáticas
En general son cuatro los pat'ámetros que cmacterizan una red estática: el diámetro, la conectividad , el ancho de banda de bi secc ión yel coste. La Tabla 4. 1 muestra el valor de los parámetros para diferentes redes estáti cas . El diám etlV de la red se defi ne como la máxima distancia entre dos procesadores cualesquiera, entendiéndose por distancia el mínimo cami no entre ell os, es decir, el camino que los une con el menor número de e nl aces. Cuanto menor sea la distancia, más rápidas serán las com uni caciones ya que a mayor distancia se necesita más tiempo de comunicac ión. E n este sentido, el diámetro determina el peor de los casos. La conectividad de una red es una medida de la mu ltiplicidad de caminos entre dos procesadores. Cuanto mayor sea mejores prestaciones se obtienen ya que es menor la contención en las comunicaciones. Como med ida de la conecti vidad se suele tomat' la conectividad de arco , que es el menor número de arcos que deben elimi nat'se para obtener dos redes di sjuntas. Los pat'ámetros tmís inmediatos para establecer la rapidez de las comunicaciones son: el ancho de canal, la velocidad de callal y el ancho de banda. Se defi ne el ancho de canal como e l número de bits que pueden transmitirse simultáneamente por el canal que comunica dos procesadores, que es igual al número de cables fís icos del enlace. La velocidad máxima con que se puede emitir por cada cabl e físico 318
4.4. SISTEMAS DE MEMORIA COMPARTIDA
Tabla 4.1: Características de las redes estáticas.
RED
DI ÁMETRO
1'- 1 1
Completamente conectad a
2
Estre ll a Árbol binario Array lineal
Anillo Mesh bidi mensional
2 10g
CONECT TVLDAD DE ARCO
ANCHO DE
f' J
NÚMERO
¿
(I(,,- I )
4
2
1
1'- 1 1'- 1 1'- 1
1'- 1
LIJ
=
DE ENLACES
JI;]
2( yp-1)
COSTE
BISECC iÓN
2
2
2
yp 2#
e2
--o;-
dI'
dI'
Mesh bidime nsional cerrado
2L
Hipercubo
lag p
4 lagp
k-a ri a el-cubo cerrad a
dL~J
2d
l' 2(1' -
yp)
21' plogp
se conoce C0 l110 veloddad del conol. Con todo e lJo se define e l allcho de banda del canal como la velocidad máxi ma con la que los datos pueden e nviarse entre dos enlaces de comunicación y es, evidentemente, e l producto de la velocidad del canal y e l ancho de canal. Sin embargo, con este parámetro no se carac teriza toda la red. Para ello se define el ancho de bisección COIllO el mínimo número de enlaces de comunicación que deben elilninarse para que la red quede dividida en dos partes iguales. Con ello, se define el ancho de banda de bisección como el menor volumen de comunicaciones permitidas entre dos mitades c ualesquie ra de la red con igual número de procesadores. Así, el ancho de banda de bi sección es e l prod ucto de l ancho de bi sección y del ancho de banda del canal. Por último, el coste puede medirse de muy diversas fo rm as. La más genera l consiste en contar el número de e nlaces de comunicación o la cantidad de cableado necesario en la red. Por otro lado, e l ancho de banda de bisecció n tambié n suele utili zarse como medida de coste ya que establece e l menor número de comunicaciones.
4.4.1.3.
Redes dinámicas
Como hemos visto, las redes de interconexión estáticas pueden proporcionar soluciones a proble mas específicos en el diseño de computadores parale los. Sin embargo, cuando se quiere di señar un sistema paralelo de propósito general la opc ión más recomendable es utili zar ulla red de interconexión dinámica. Este tipo de redes de interconexión pueden adaptarse para las necesidades de com unicación de mandadas por los procesadores del sistema en diferentes ámbitos. Las redes dinámicas pueden clas ificarse e n los siguientes tipos: • Redes basadas en bus . • Redes crossbar (o ma triciales). 319
INGENI ERíA DE COM PUTADORES "
• Redes multietapa. A continuación, se detaUan las características de cada uno de éstos tipos de red y su método de funcionamiento.
Redes basadas en bus Las redes basadas en bus son quizá la topología de red más sencilla. En ella todos los nodos comparten un único medio de comunicación, el bus. El bus está compuesto por un conj unto de lineas de conex ión y conectores a cada procesador. La Figura 4. 18 muestra la arquitectura de un sistema multiprocesador conectado por medio de un bus. E n un cierto instante de tiempo solo un único procesador puede transmitir información por el bus. La colisión de peticiones de acceso al bus se soluciona usando una lógica de arbitraje o módulo de aJ"bitraje. Este módulo se encarga de asignar el acceso al bus a los diferentes procesadores que lo soliciten siguiendo un a politica de asignación previamente determinada. Entre las po líticas más usadas podemos encontrar, entre otras, la prioridad fij a, FIFO (First /n First Out - Primero en Entrar Primero el! Salir), Round Robin y LRU (Least Recently Used - Mellas Usando Recientemente). El ancho de banda del bus es limitado, resultando del producto de su frecuencia de reloj por el número de lineas de comunicación existentes. Este ancho de banda debe ser adecuado para atender las necesidades de los procesadores que se conectan a él. Dado que e l ancho de banda es limitado,
Dirección
Memoria compartida
Datos
Procesador O
I
I
Procesador 1
I
.
(a) Dirección
Memoria compartida
Datos
I I
Memoria local Caché
t Procesador O
I
I
I
I
Memoria local Caché
t Procesador 1
I I
(b)
Figura 4.18: Sistema mu lti procesador con conexión median te bus.
320
4.4. SISTEMAS DE MEMORIA COMPARTIDA
el rendimiento de la comunicación por medio de un bus se ve afectado a medida que el número de procesadores conectados a él se incrementa. El rendimiento se puede mejorar incluyendo una caché en cada procesador (tal como se muestra en la Figura 4.18.b), ya que la mayoría de accesos de un procesador se realizan a su memoria local. De esta manera, solo se transmitirían por el bus los datos remotos necesarios para el procesador, usando la caché para datos locales.
Redes crossbar Otra manera sencilla de conectar múltiples procesadores y elementos de memoria es utilizar una red tipo crossbar. Una red crossbar permite conectar p procesadores con q elementos de memOlia utilizando una matriz de conmutadores, tal y como se muestra en la Figura 4.19. De manera similar también se puede utilizar una red crossbar para conectar procesadores entre si . El número de conmutadores necesarios para realizar una red crossbar es " x q, asumiendo que q es al menos igual que p (es decir, hayal menos tantos elementos de memoria como procesadores). De lo contrario, podría darse la situación de que algún procesador no pueda utilizar ninguno de los elementos de memoria. La complejidad y el coste de la red aumentan en un orden aproximado igualo mayor que O(p2), es decir, el número de corunutadores necesarios para una red con 4 procesadores serían 16 (42 ) , con 8 procesadores serían 64 (8 2 ) , con 16 procesadores serían 256 (16 2 ) , etc. El número de conmutadores
Elemento de Conmutación
P, P,
,
,
P, P,
)'
"
P,
P, P, -¡-----t- -
Pp. ,
Figura 4.19: Red crossbar que conecta p procesadores con q elementos de me moria.
321
INGENIERíA DE COMPUTADORES 11
y sus conexiones crecen a un ritmo cuadrático según aumenta el número de procesadores, lo que supone una clara desventaja para este tipo de redes y reduce su escalabilidad. Por otro lado, las redes crossbar son de tipo no-bloqueantes, ya que el acceso de un procesador a un elemento de memoria no interfiere en la conexión de otro procesador con otro elemento de memoria. La latenc ia de comunicación entre elementos en una red crossbar es constante, ya que la cOllluni cación entre e lementos se puede considerar como un bus punto-a-punto.
Redes multietapa Las redes basadas en bus son escalables en coste pero no escalab les en rendimi ento. Las redes crossbar son escalables en rendimiento pero no esca lables en coste. Las redes mul tietapa suponen un compromi so intermedio entre las dos opciones anteriores. La estructura general de una red multietapa de p procesadores y q elementos de memoria se muestra en la Figura 4.20. Básicamente, se componen de una seri e de etapas (G i ) compueslas de corunutadores conectados a las etapas adyacentes mediante conexiones estáticas (C j ). E l número de etapas y el tipo de
'---'U',
~---'IQj ' ,
'
I
I
,
I
,
~
,, ,, ,,
I
"
,
I
,
I
,, ,,
~
'"l'
I
IQj :
:, I, ,
I
---;..1: ~
,, ,, ,, , ,
,, ,, ,,
,,
~
~
----,
ro
"g E ID E
o
"O
ro
l'l'"
ID
"O
8'"<=
K
ro
.c
o , , , ,
~
~
1
,, - -L.. ___
" "
I
C,
G,
,
I
,,
I
L _ _ . '
c,
G,.,
G,
1
,
I
I
I
"
I
,... -- .,"- -
c,
Figura 4.20: Red multietapa generalizada formada por 8 etapas y 8 + 1 conexiones.
(a)
(b)
(e)
(d)
Figura 4.21: Modos de un conmulador binario: a) direelo, b) cruzado, e) difusión superior, d) difusión inferior.
322
4.4. SISTEMAS DE MEMORIA COMPARTIDA
conexiones depende de la implementación concreta de la arquitectura. Un conmutador a x b es un dispositivo con a entradas y b salidas (normalmente tanto a como b suele ser una potencia de 2). Los conmutadores con igual número de entradas y salidas se dice que tienen un orden = a = b. Por ejemplo, un conmutador binario sería un cOfllllutador 2 x 2, con orden = 2 Y sus posibles modos de conmutación se muesb'an en la Figura 4.2 1. Como podemos observar en la figu ra, se permite conectar una entrada con varias salidas pero no la operación contraria ya que daría como resultado ulla colisión en la comunicación.
La flexibil idad de las redes multietapa viene de la posibi li dad de reconfi gurar dinámicamente los modos de conmutació n de sus diferentes etapas. La principal diferencia entre las di stintas redes multi etapa recae en el tipo de conmutadores uti li zados y el patrón de conexión enb'e etapas, G y e respectivamente en la F igura 4.20. Una propiedad importante de las redes multietapa es que son redes bloquean/es. Esto signifi ca que ciertas permutaciones, o conex iones a través de la red , pueden a su vez bloquear otras conex iones. En la Figura 4.23 se muestra un ejemplo de esta situación. La conexión entre el procesador dos (O IO) y el elemento de memoria siete (111) bloquea la conexión entre el procesador seis (110) Y el elemento de memoria cuatro (100). Algunos ejemplos de las redes multietapa más comunes son:
• Red Oll/ega, se basa en la utilización de una permutación por barajamiento perfecto entre sus etapas. Estas etapas están compuestas por conmutadores binarios. La permutación por barajam iento pelfecto (pelfec/ su.ffle), (Tk, cuyo dominio es el conjunto de enteros [O , n - 1), se define como c1(X III -IXm -2 ..
000
o
. x¡xo):;;::
o
XII/-2··· X¡XQXm-l
000 = rotación a izquierdas (000)
001 = rotación a izquierdas (100)
001 010
2
2
010 = rotación a izquierdas (001)
011
3
3
011 = rotación a izquierdas (101)
100
4
4
100 = rolación a izquierdas (O10)
101
5
5
101
110
6
6
110 = rotación a izquierdas (011)
111
7
7
111 = rolación a izquierdas (111)
= rotación a izquierdas (110)
F igura 4.22: Barajallliento perfecto en una conex ión de ocho e ntradas y ocho salidas.
323
INGENIERíA DE COMPUTADORES 11
siendo k e l orden del cOlUllutador utili zado y X",_IX",_2 ... XI Xo la representaci ón binaria del entero x. Esta pellllutación supone un despl azamiento a la izquierda de los bits que representan el número X, tal y como se muestra en la Figura 4.22. También existe un barajamiento perfecto inverso, en el que se efectúa la misma operación pero con un desplazamiento a la derecha. La red omega está compuesta de p nodos de entrada, normalmente procesadores, y p nodos de salida, normalmente elementos de memoria, habiendo un total de log2 p etapas entre ambos. Las conexiones de barajamiento perfecto entre etapas proporcionan una única conexión entre cada par de componentes. La Figura 4.23 muestra un ejemplo ele una red omega que conecta ocho procesadores con ocho elementos ele memoria. Dadas las características de la red omega, el número de conmutadores necesarios para construir la red es } log 2 p, s iendo el coste de la red de orden O(p log2 p). Para una red omega con 4 procesadores el número de conmutadores necesarios será 4 (~ log2 4 = 2 x 2) , para 8 procesadores será 12 (~ log2 8 = 4 x 3), para 16 procesadores será 32 (126 log2 16 = 8 x 4), etc. Este ratio de crecimiento, y por tanto Su coste, es menor que el de una red crossbar, que como vimos anteriormente crece con orden O(p2). E l algoritmo ele encaminamiento usado para comun icar nodos en una red omega resulta bastante senc illo. Cada paquete transmitido va precedido de la dirección del nodo destino en binario. Los conmutadores de cada etapa deciden el camino por el que transmitir el paquete dependiendo del
e,
G,
e,
G,
e,
G,
e,
000 001
000 001
010 011
010 011
100 101
100 101
110 111
110 111 Figura 4.23: Red omega de 8 entradas y 8 salidas.
324
4.4. SISTEMAS DE MEMORIA COMPARTIDA
valor del bit de la dirección destino correspondie nte a la e tapa acnml. Si el bit es O, se encamina por la salida supe rior, y si es 1, se utili za la salida in fe rior. Por ejemplo, en la red de la Figura 4.23, supongamos que el procesador 110 quiere enviar un paquete al elemento de me moria 100. El conmutador de la primera etapa, marcado con una A en la fi gura, ve que el bit que le corresponde de la dirección destino es un I (100), por lo que encamina el paquete por la salida inferior hacia el conmutador marcado con una B en la figura. El comnUlador B observa que el bit que le corresponde es un O ( 100), por lo que encamina el paquete por su salida superior. Finalmente, el último conmutador también observa su bit cOITespondiente es O (100) Y encamina el paquete por su salida superior, llegando éste a su destino correcto .
• Red Baseline, se construye recursivamente por bloques, conectando los conmutadores de la etapa i con ambos sub-bloques de la etapa i + 1. Así, la primera etapa se construye con un bloque que tendrá un tamaiio Il x n, siendo 11 el número de entradas. La segunda etapa se constru ye con dos sub-bloques de tamaño (~) x (~) , y así recursivamente hasta llegar en la última e tapa a ~ subbloques de tamaño 2 X 2. La Figura 4.24 muestra un ejemplo de red baseline. Observe los bloques Co
Go
C,
G,
C,
G,
G, C,
0000 0001
0000 0001
0010 0011
00 10 001 1
0100 0101
0 100 0 101
0110 0111
0 11 0 011 1
1000 1001
1000 1001
1010 1011
1010 1011
11 00 11 01
1100 1101
11 10 1111
1110 1111
Figura 4.24: Red baseline de 16 entradas y 16 salidas.
325
INGENIERíA DE COMPUTADORES 11
y sub-b loques destacados en la figura . El encaminamiento de paquetes en una red baseline es análogo al de la red omega .
• Red Bulle/ji)', se construye usando el modelo de permutación básico mostrado en la Figura 4.25.a. Este modelo se puede extender a una red más amplia aplicando sistemáticamente los cruces de entradas y sa lidas de sus conmutadores (tal y como se detalla e n la Figura 4.25.b). De manera general, en la construcción de una red butterfty, las sal idas de un conmutador j en la etapa i (identificado como [i, jJ) se conectarán a los conmutadores [i + 1, j) e [i + 1, j El) i) (es deci,., difieren en e l i-ésimo bit). La Figura 4.25 .b muestra un ejemplo de red butterAy con 16 entradas y 16 sa lidas. El encaminamiento de paquetes en una red butterfty se reali za de la sigui ente manera. Siendo A el conmutador conectado al nodo de origen y B el conmutador conectado al nodo destino, ambos
D-
D
0000 _ _ o 0001 _ _ o
B
",--;;C~--;Q----P
000
001 o"----"<:);--*"--o- \--+_O 001
o1Oo.:----;oy(---\~-'H-o O1O 'C:J--
011 100 <>-101
--tl-HH..,O 011
--,C);--- -o-H 'R:> 100
CY---'Orlf;----¡~_t_I_-o
"O!--*--'cl--/-~O
111
101 110
' 0-- -"(:1 - - -'0 111 (e)
-
0010 0011 -
(a)
000
• 0000 0001 .0010 ·0011
0100 _ _ o 0101 0110 0111
:~~ ~: ~
1010 1011 -
1100 1101 _ _ 1110 1111
be
--
!
:--D
1010 1011
-+11+-1
-
n -.l'--
1100 . 1101 1110
--.U(b)
Figura 4.25: Red buuerfly: a) modelo básico de permutación , b) red butterfl y de 16 ent radas y 16 salidas, e) diag rama de conmutadores de la red bUllerfl y.
326
4.4. SISTEMAS DE MEMORIA COMPARTIDA
representados e n binario, se calcula la ruta R = A El) B . La ru ta entre A y B se defin e eligiendo el cantino directo e n el conmutador de la etapa i si el bit R¡ = O, o el cru zado si el bit R¡ = I (s iendo Ro el bit menos signifi cati vo). Por ejemplo, los conmutadores de la red de la Figura 4.25.b se pueden representar y nombrar tal y como muestra la Fi gura 4.25.c. Q ueremos enviar un paquete desde el nodo 0 100 al nodo LODO. E l co nmu tador conectado al nodo O100 es el OIO Y el conmutador conectado al nodo de ll egada 1000 es el 100. Se calcula la ru ta e ntre conmutadores R = 010 El) 100 = 110. Con esto se tiene que desde el comllutador 010 se de be tomar la conex ión directa al conm utador A. Desde A se toma la conexión cru zada al conmutador B . Finalmente, desde B se toma tambié n la conex ión cruzada para llegar al conmu tador 100, que conecta con el destino final. 4.4.1.4.
Comparación del rendimiento de redes diná micas
A pesar de ser redes bloqueantes, las redes muItietapa son una solución ace ptabl e te niendo en cue nta el coste y las prestaciones de las arquitecturas bus y crossbar. En la Figura 4. 26 se muestra el coste y las prestaciones e n fun ción del núme ro de procesadores para las Ires arquitecturas. Multietapa
Crossbar
,/
I
'"" o
/
,, ' Bus
/
,/ /
.9 e
•E
Ü
'6 e
ID
o:
/ /
Mu llietapa
/"-~-
...-:;::: ......
~~:--- - -- - --- - - - -- - - - -_ . Numero de procesadores
(a)
Bus
Numero de procesadores
(b)
Figura 4.26: Comparativa de las arquit ecturas crossbar, bu s y multi elapa : a) Coste, b) Prestac iones .
Como puede observarse, la arquitectura muItietapa se encuentra en un lugar intermedio en c uanto al coste, y lo que es más importante, c rece casi linealmente en vez de cuadráticame nte como en la red crossbar. Análogamente, e n relación con las prestaciones también se encue ntra en una situación intermedia, pero con la ve ntaja de que no se produce la drástica saturación del caso del bus.
4.4.2.
Protocolos de coherencia de caché
Cuando se trata con sistemas mu ltiprocesado r se puede comprobar que el uso de las me mo rias cachés para mejorar el re ndimi ento del sistema es gene ralizado. Con la utili zación de las cachés se pretende conseguir, en definitiva, reducir el tie mpo de late ncia de la memoria. Ev idente me nte, e n los siste mas multiprocesador, donde cada procesado r puede necesitar una copi a del mismo bloque de memoria, surgen problemas nuevos, en concreto el proble ma de consistencia y
327
INGENIERíA DE COMPUTADORES 11
coherencia entre las distintas copias utilizadas. Es decir, varios procesadores pueden guardar en sus respectivas cachés locales una copia de un mismo bloque de memoria. Este bloque es modificado por cada procesador, por lo que es necesario que los cambios reali zados se comun iquen al resto de procesadores, actualizando las diferentes copias de las cachés locales. Este problema se denomina problema de coherencia de caché. Un sistema de memoria es coherente si el va lor devuelto por una operación de lectura sobre una dirección de memoria es siempre el mismo valor que el almacenado por la última operación de escritura realizada sobre esa mi sma dirección , independientemente de qué procesador real ice las operaciones. La solución más sencilla para el problema de coherencia de caché en sistemas de memoria compartida es, simplemente, no incorporar un protocolo de coherencia de caché y centrarse en la escalabi lidad del sistema . De esta manera, solo se permiten dos tipos de accesos a memoria:
• Local, en el que el procesador accede a datos privados y puede utili zar una caché local. • Remoto, en el que el procesador accede a datos externos que no se almacenan en caché. En este caso dichos datos pueden ser acced idos utili zando, por ejemplo, la técnica de paso de mensajes. Los problemas de coherencia de caché están provocados en la práctica básicamente por tres factores: • Por modificar datos compartidos. En un sistema multiprocesador donde cada procesador tiene una caché local puede darse la situación de que dos o más procesadores estén accediendo simultáneamente a la mi sma estructura de datos. En esta situación los datos se encontrarán en la memoria principal compartida y en las cachés de cada procesador. Si un procesador modifica su caché local, el contenido de la memoria principal y las copias de las cachés no serán coherentes. Si el sistema utili za una política de escritura directa, la memoria principal se actualizará pero no así las copias de caché del resto de procesadores. Si el sistema utiliza una política de post-escritura, la memoria principal no se actualizará hasta que se reemplace el bloque de caché modificado. Ambas situaciones llevan a un problema de incoherencia de memoria.
• Por m.igración de procesos. En algunos sistemas multiprocesador se permite la migración de procesos, es dec ir, un proceso puede ser planificado en diferentes procesadores durante su tiempo de vida. Durante el tiempo de ejecución en un procesador dicho proceso realiza modificaciones en los datos que usa. Estas modificaciones son almacenadas en la caché local del procesador. Si por alguna razón, el proceso es intercam bi ado a otro procesador antes de que las modificaciones rea li zadas se actua licen e n la memoria principal , los datos que cargue el proceso en la caché del nuevo procesador serán incoherentes con las modificaciones reali zadas en el anterior procesador. Por ejemplo, si el proceso A se está ejecutando en el procesador P I y asigna la variable V = 10 (suponiendo que su valor anterior fuese O) y por algun a razón es intercambi ado a otro procesador P2 antes de que la memoria princ ipal se actualice, el valor de V que obtiene A será O ya que el valor 10 solo está almacenado en la caché de PI. 328
4.4. SISTEMAS DE MEMORIA COMPARTIDA • Por el uso de Entrada/Salida mediante Acceso Directo a Memoria. Mediante el uso de la técnica de Acceso Directo a Memoria (DMA - Direct Me/no/)' Access) el procesador de E/S a través del controlador de DMA transporta datos desde los periféricos a la memoria principal del sistema. En el caso de la entrada de datos, los datos escri tos por el procesador de E/S en la memoria principal pueden ser inconsistentes con las copias ex istentes en las cachés locales de los procesadores del sistema.
En el caso de la salida de datos, si se utiliza una política de post-escritura se puede generar inconsistencia ya que el procesador de E/S estaría leyendo datos que puede que toda vía no haya n sido actuali zados desde las cachés locales. Una pos ible solución a este problema sería confi gurar los procesadores de E/S para que actuase n directamente sobre las cachés locales de los procesadores, en lugar de sobre la memoria principal. De esta manera las operaciones de E/S no generarían inconsistencias, aunque la coherencia de las cachés se debería seguir garanti zando a través del bus del sistema. El inconveniente de esta solución es la pobre localidad de los datos de E/S en las cachés, lo que incrementa la tasa de fa llos de las mismas. Existen principalmente dos opciones para sol ucionar los problemas de incoherencia de caché en sistemas multiprocesador: • Invalida r, que consiste en invalidar las copias en las cachés del dato modificado (ver Figura 4.27.a). PO
PI
carga x
ca rga x
LP LP
PO
P1
escribe #3, x carga x
~!
B
Invalidar
Memoria
~
Memoria
(a)
PO
P1
carga x
carga x
LP Le
PO
P1
escribe #3, x carga x
§t §t
B
Actualizar
B
Memoria
Memoria
(b)
F igura 4.27: Protoco los de coherenc ia de caché en sistemas mult iprocesado r: a) invalidación, b) ac tu ali zació n.
329
INGENIERíA DE COMPUTADORES 11
• Actualizar, que consiste en actualizar todas las copias en las cachés del dato que se acaba de modifi car (ver Figura 4.27.b). Las principales desventajas de estas dos técnicas son que la primera requiere la espera de acceso al dato causada por la carga del va lor correcto de la variable invalidada (que se realiza desde la caché que contiene el dato correcto) y la segunda provoca un mayor tráfico de datos entre los procesadores debido a las operaciones de actualización de las cachés. En la actual idad la mayoría de los protocolos y políticas de coherencia de caché utilizan un esquema basado en inval idar datos. ( lectura)
,,
lectura
,
escritura
,
e- lectura \,
" e_escritura "
escritura
,,~, ~
~
~
~
"
,/
, "
--~
-
lectura / escritura
~
vaciado
Figura 4.28: Di agrama de estados de
UD
protoco lo si mple de coherencia de caché basado en invalidac ión.
U n posible método para mantener la coherencia de las diferentes copias de caché podría ser la monitori zac ión del número de copias existentes y el estado de cada copia. La Figura 4.28 muestra un posible conjunto de estados y transiciones para los datos almacenados en caché. Las lineas sóli das representan acciones de los procesadores y las discontinuas representan acciones para asegurar la coherencia de caché. El estado compartido corresponde a una variable que ha sido cargada en las cachés de varios procesadores (por ejemplo, cuando se carga la vruiable al inicio de un programa). Cuando un procesador modifica una variable compartida ésta pasa al estado sucio, y todas las copias de esa vari ab le en las cachés de otros procesadores pasan al estado inválido. Para garanti zru' la coherencia, todos los accesos sobre una vru'iable inválida deberán ser servidos por e l procesador que tiene dicha vru'iab le en e l estado sucio, en lugru' de ser servidos por la memoria principal. A su vez, las lecturas y escrituras real izadas por los procesadores generan acc iones de coherencia (e_lecturas y e _escrituras). Si un procesador rea liza una lectura sobre una vru'iable inválida se propaga una acción e _lectura que actua li za el resto de copias, además de la memoria princ ipal, y las devuelve al estado compartido. Si un procesador realiza una escritura sobre una variable inválida se propaga una acción e_escritura 330
4.4. SISTEMAS DE MEMORIA COMPARTIDA
para invalidar el resto de copias y posteriormente pasar dicha variable al estado sucio. De la misma manera, como ya se ha mencionado, si un procesador realiza una esctitura sobre un bloque compartido se generará una acción e_escritura para invaJidar el resto de copias en las cachés, pasando la variable
modificada al estado sucio. Finalmen te, cuando un procesador vacía su caché todos los bloques pasan al estado il/válido. Por ejemplo, siguiendo el sistema mostrado en la F igura 4.27.a, cuando PI acceda a la variable x tras haber sido modificada por Po , deberá ser Po el que actualice el valor en la caché de P I yen la memoria principal. A su vez, la variable x en PI pasaría del estado inllálido al cOll1partido ya que su valor actual es coherente. Diferentes mecanismos hardware implementan el protocolo de coherencia de caché basado en invalidación descrito anteriormente: • S istemas snoopy o de vigilancia de l bus. Este mecanismo es muy común en sistemas multiprocesador que lIsall una red de difu sión, tales como un bus o un anill o. Su fu ncionamiento se basa en que
cada procesador monitoriza el tráfico de la red en busca de transacciones, para poder actualizar el estado de sus bloques de caché. La F igura 4 .29 muestra un esquema simple para un sistema snoopy. La caché de cada procesador tiene asociadas unas etiquetas que usa para determinar el estado de sus bloques de caché. Por ejemplo, si el procesador detecta una escritura en un bloque del cual mantie ne una copia, éste invalida su copia siguiendo el protocolo descrito. Si, por el contrario, detecta una lectura en un bloque que ti ene marcado como sucio, el procesador solicita el control del bus y envía el bloque para que el valor pueda ser leído por el otro procesador. Procesador
Procesador
Procesador
l
j
r-
r-
;:, I
~
o
o e
'-
• loJl
cr
tu
;:, I
Caché
~
o
o e
r-
• lJol
cr
;:, I
Caché
~
o
o e
tu
• loJl
cr
Caché
tu
'-
'-
Sucio
I Memoria
Dirección I Dalos
I
Figura 4.29: Sistema snoopy. La principal limitación de los sistemas snoopy es la limitación de ancho de banda del bus. Si varios procesadores reali zan operaciones sobre Jos Inismos datos, las acciones de coherencja necesarias se di stribui rá n por el bus a todos los procesadores del sistema. Dado que el ancho de banda del bus 331
INGENIERíA DE COMPUTADORES 11
es finito , solo un nú mero constante de acciones de coherencia puede ser transmitido por unidad de tiempo. Una posible soluc ión sería propagar acciones de coherencia solo a los procesadores afectados (q ue tengan una copia de la v3Iiable acced ida). Esta solución la proporcionan los sistemas basados en directorios . • Sistemas basados en directorios. Los sistemas basados en directorios usan un mapa de bits (o bits de presencia) para aLmacenar la localización de las copias de caché que tiene cada procesador en su caché. Este mapa de bits puede incluirse en la memori a pri ncipa l (con un sistema de directorio centralizado tal como muestra la Figu ra 4.30.a) o en el caso de sistemas escalables de memoria distribuida puede incluirse en las memorias loca les de cada procesador (obteniendo un sistema de directorio distribuido como se muestra en la Figura 4.30.b). Este tipo de sistemas usa el conteni do del mapa de bits para propagar las acciones de coherencia del protocolo únicamente a los procesadores que mantienen una cop ia del bloque afectado. Otras acciones pueden afectar únicamente a los datos loca les de un procesador y generar cambios de estado en el mapa de bits. Por ejemplo, si dos procesadores acceden a l mismo bloque de datos, su estado pasa a compartido y su bit de presencia es activado para ambos procesadores (indi cando que los dos procesadores guardan
I Procesador I
I
I Caché
I
r--
I
I
Caché
Directorio
I Procesador I
I
I Caché
I
.~ ,~
.oc
e
I
Memoria
'0
.~
-~ 0
e
0
"O~
!!la o
'0 .~
~
~
e
,, ,, ,, ,
o
~
.!!
,, ,, , ,,
-
Procesador
.= ~
"C "C ~
o::
~
~"O
e o
,, ,,
u ~
.!!
.= ~
Procesador
"C "C
I
o::
~
Caché
I Procesador I
bits de presencia
I
I
Caché
I
I
estado
datos o m
i5 'g Memoria
-~ 0 0
"O~
~a. o
~
-
~"O
'--
(a)
(b)
Figura 4.30: Sistema basado en directorios: a) directorio centralizado, b) di rectori o distribuido.
332
4.5. SISTEMAS DE MEMORIA DISTRIBUIDA
una copia del bloque). Si uno de los procesadores modifica el bloque, su estado pasa a sucio y el bit de presencia correspondiente al otro procesador se desacti va. De esta manera, el sistema mantiene el bit de presencia para el procesador que modificó el bloque. Posteriores modi ficac iones del bloque por parte del mi smo procesador se resuelven loca lmente. Cualquier acceso posterior a ese bloque por parte de otro procesador, dado que está en estado sucio, deberá ser servido por el procesador que tiene el bit de presencia activo. En los sistemas de directorio centrali zado el principal cuello de botell a está en la memoria, ya que todas las acciones de coherencia representan accesos a la mj sma. La memoria del
sistema solo puede servir un número fi nito de peticiones por unidad de tiempo, pudiendo reducir considerablemente el rendimiento del sistema. También hay que considerar en este caso el coste del mapa de bits en memoria, ya que crece con orden O(mp), siendo m el tamaño de la memoria y p el número de procesadores. Los sistemas de directorio distribuido permiten p acciones de coherencia simultáneas. Sin embargo, dado que los accesos a memorias remotas se realizan a través de la red de interconexión,
la latencia y el ancho de banda de dicha red representan partes fundamenta les del rendimiento general del sistema.
4.5.
Sistemas de memoria distribuida
En los sistemas de memoria distribuida cada procesador dispone de su propia memoria, denominada local o privada, independi ente del resto y acces ible solo por su procesador. La comunicación se reali za por paso de mensajes, es decir, para que un dato que res ide en la memoria de un procesador pase a la de otro, el primero debe construir un mensaje por software, enviarl o a través de una red de interconexión
y el segundo debe recibirlo. Como puede observarse es un mecani smo más complejo que con memori a compaltida. La Figura 4.31 .a muestra el esq uema básico de la arquitectu ra di stribuida. Esta arquitectura es también conocida como arquitectura de memoria privada O arqu;leclura de paso de mensajes. La misión de la red de interconex ión es facilitar el paso de mensajes entre los procesadores nodo. La F igura 4.3 1.b muestra un ejemplo real, en el que los nodos son procesadores IBM SP-2, y la conex ión entre ellos se reali za mediante un S I vi/eh (conmutador) de ocho puertos. El concepto de paso de mensajes parece ser la estrategia dominante en los sistemas con gran nlrmero de procesadores (mayor que 100), y es especialmente lrtil en entornos donde la ejecución de los programas puede dividirse en pequeños subprogramas independ ientes. La latencia de red puede ser alta, pero para anali zar el ancho de banda es necesario atender a otro factor de eficiencia de los sistemas paralelos conocido como granul aJidad del computador paralelo. En general, se entiende por granularidad del computador paralelo el cociente entre el tiempo requerido para realizar una operación básica de comunicación y el tiempo requerido para rea li zar una operación básica de cálculo de los procesos. Para un tiempo dado de operación básica de cálculo ofrece una medida del nlrmero y del tamaño de los paquetes de infolmación utilizados en las com unicaciones. En los sistemas de paso de mensajes para 333
INGENIERíA DE COMPUTADORES"
Red de Interconexión
(a)
~
Red de Interconexión formada por swilches de B puertos
Nodo IBM SP-2
@!J DRAM Intercalada
Adaptador de
comunicaciones
:, El El I I DMA
:~
:
[iJ ,, ~:
;;:'
L _______________ •
8 bits 40MHz
(b)
Figura 4.31: al Arq uitectura de memoria distribuida, bl IBM SP-2.
lograr un uso adecuado del ancho de banda es necesario reali zar un cu idadoso reparto de los datos sobre los procesadores con el fin de disminuir la granularidad de las comunicaciones. Por di sminui r la granu laridad de las comunicaciones se entiende minimizar el número de mensajes y maximizar su tamaño. Evidentemente, aunque el concepto genérico puede aplicarse a sistemas SIMD, tambi én es aplicab le a sistemas MIMD. A la combinación de sistema MIMD con arquitectura de paso de mensajes se le conoce cama multicomputadores. Los sistemas con memoria di stribuida o multicomputadores pueden , a su vez, ser un único computador con múltiples CPU s comunicadas por un bus de datos o bie n mú ltiples computadores, cada uno con su propio procesador, enlazados por una red de interconexión más o menos rápida. En el primer caso se habla de plVce.mdores masivamente paralelos (MPPs - Massively Parallel Processors) , como 334
4.5. SISTEMAS DE MEMORIA DISTRIBUIDA
los Fujitsu VPP, IBM SP2 o
sal T3E; y en el
segundo se conocen de form a genérica como e/uster . pes interconectados mediante algún sistema de red de comunicaciones. En la literatura ex istente de arquitecturas paral elas se utilizan Un cl uster, a nivel básico, es una colección de es tacion es de trabajo o
numerosos nombres para referirse a un cluster, entre los que destacan:
• Redes de estaciones de trabajo (NOWs . Nenvo rk of Workstatiol1s). • Redes de PCs (NO PCs· NelWork of PCs). • Cluster de estaciones de trabajo (COWs . Cluster of Workstatiolls). • Cluster de PCs (COPCs · Cluster of PCs). Realizando una clasificac ión estricta, los clusters pueden ser de dos tipos dependi endo de si cada computador del cluster está o no exclusivamente ded icado a él. Si es así, se habla de un cluster de clase BeolV/llf. En cualquier otro caso se suele definir al cluster como NOW. En muchas ocasiones los términos cluster y Beowulf se confunden y se utili zan indi stintamente. E l término Beowulf lo utilizó la NASA para dar nombre a un proyecto que pretendía construir un ordenador capaz de alcanzar el gigaftops a partir de componentes asequibles. Y lo consiguieron, el Beowulf original de 1994, con 16 procesadores 486 DX4 ej ecutando Linux, fue capaz de alcanzar 1,25 Oigaflops. E l término no se debe a razones técnicas. Beowul f era un guerrero escandinavo del siglo VI cuyas aventuras se relatan en el pri mer texto conocido en lengua inglesa (similar al Cantar del Mío C id en la lengua española). Las características más relevantes de los sistemas Beowulf son las siguientes : • Un sistema Beowulf es un conjunto de nodos min.imalistas2 conectados por un medio de comunicación barato, en el que la topología de la red se ha di señado para resolver un tipo de problema específico. • Cada nodo de un Beowulf se dedica exclusivamente a procesos del supercomputador. • En una red de estaciones de trabajo (NOWs) suele existir un sw itch central para real izar las comunicaciones. mientras que en un Beowulf el mecanj smo es más rudimentario : conexiones placa
a placa por cable RJ·45 cruzado. • La programación de un Beowulf es fu ertemente dependiente de la arquitectura y siempre se reali za por paso de mensajes. • Para programar un Beowulf en primer luga r se diseña el modelo de paralelismo, se observan cómo son las comuni caciones entre los nodos y se implementan físicamente. De esta forma se evita el hardware innecesario a cambio de una fuerte dependencia entre el software y la topología de la red. En caso de que cambie el problema hay que recablear el sistema. 2Los nodos minirnali stas, habitu almente, constan solamente de un a pl aca madre, unu CPU, las memorias y algún dispositivo de comuni cac iones.
335
INGENIERíA DE COMPUTADORES 11
4.5.1.
Consideraciones generales sobre los c1usters
Tal y como se ha comentado, un cluster a nivel básico es un conjunto de estaciones de trabajo o PCs interconectados mediante algún sistema de red de comunicaciones. Teni endo presentes las diferencias anteriormente comentadas, para los objetivos que se pretenden res ulta irrelevante la distinción entre las dos clases de sistemas: cluster y Beowulf, por ello se ha optado por utili zar el término cluster para hacer referencia a ambos . Las arquitecturas paralelas en general, y los clusters en particul ar, pueden presentar distintas topologías en función de las conexiones punto a punto que se establezcan entre sus procesadores. Las topologías pueden ser muy sencillas, como las redes lineales, de anillo o en estrella, pero también pueden realizarse redes más complejas como los hipercubos . La implementación más natural y habitual de los clusters es como parte de una red de área local , en la que las máquinas que forman el cluster se conectan a una red de alta velocidad y la máquina que actúa como servidor se conecta además a la red exterior. En este contexto debe tenerse en cuenta un factor adicional que afecta significativamente al rendimiento final del cluster: el dispositivo de conex ión a la red o adaptador. Como adaptador se puede utilizar un hub o UD sw itch, siendo este último el más habitual. Con un switch la u·ansmisión de datos entre dos procesadores sol o genera tráfico en el segmento cOlTespondiente. El ancho de banda no es compartido entre todos los procesadores conectados al switch por lo que cada procesador dispone del 100 % del ancho de banda. E l switch permite establecer cualquier número de interconex iones simultáneas entre sus puertos siempre y cuando no coincida el receptor. Con un hub la u·ansmi sión de datos entre dos procesadores genera tráfico por toda la red, consumiendo el ancho de banda compartido entre todos los demás, lo que tiene como consecuencia una saturación rápida y unas comunicaciones lentas.
4.5.2.
¿Por qué c1usters?
Las exigencias de cálcu lo de las aplicaciones comerciales y científi cas crecen día a día. Para hacer frente a esta demanda es preciso aumentar la capacidad de la unidad de procesamiento, o bien hacer que varias unidades colaboren para la resolución conjunta de una tarea. La primera alternativa es fáci l de ll evar a la práctica, basta con au mentar la memoria o sustituir el procesador por otro de tecnología superior y/o. de mayor velocidad de reloj. Pero esto a menudo es insuficiente: ¿qué CPU se tendría que utili zar si la necesidad de potencia de cálculo se multiplicase por cien? La segunda opción, el procesamiento en paralelo, no es de implantación tan inmediata, pero escala mucho mejor con las neces idades del problema. Recuérdese que el procesamiento paralelo consiste en acelerar la ejecución de un programa mediante su descomposición en fragmentos que puedan ejecutarse de fOfma paralela, cada uno en su propia unidad de proceso. La mayoría de los procesadores modernos incorporan en su diseño unidades que trabajan de forma paralela, como los que emplean la tecnología de l pipelining (operar a la vez sobre las distintas fases que requiere la ejecución de una instrucción del procesador, como en una cadena de 336
4.5. SISTEMAS DE MEMORIA DISTRIBUIDA
montaje), o el procesamiento superescalar (la ejecución en paralelo de instrucciones independientes). Los denominados procesadores vectoriales que forman parte de los supercomputadores tradicionales, como el eray e90, son capaces de operar simultáneame nte sobre varios elementos de un vector. Más recientem en te toma cuerpo el concepto de paralelismo sobre un registro, como el que implementan las
extensiones multimedia de Intel MMX. No obstante, desde comienzos de la década de los 90 ha existido una tendencia creciente a alejarse de los supercomputadores especiali zados paralelos (supercomputadores vectoriales y procesadores masivamente paralelos, MPPs), debido a sus e levados costes en hardware, mantenimiento y programac ión. En este contexto los c1usters constituyen una alternativa de mellor coste amp liame nte utili zada y
consolidada. Entre los motivos que han hecho posible este hecho cabe destacar el gran progreso en la disponibi lidad de componentes de un alto rendimiento para PCs/estaciones de trabajo y redes de interconexión. Gracias a estos avances, se ha logrado que un clu ster sea hoy día un sistema muy atracti vo en cuanto
a su relación coste/ rendimiento para el procesamiento paralelo. Se puede decir que los c1 usters de computadores se han convertido en la opción más sencilla y extendida en computación paralela. Ofrecen a cualquier institución académica ulla atractiva oportunidad para utilizar y enseñar computación de altas prestaciones (HPC - High Pe/formance Compu/ing)3 sin requerir el acceso a equipam.ientos costosos. Las principales características de estos sistemas, que les hacen te ner algunas ventajas sobre otros
tipos de arquitecturas paralelas, son las siguientes: • Se pueden construir con un esfuerzo relativamente moderado.
• Son sistemas de bajo coste. • Utili zan hardware convencional y accesib le (el di sponible en el mercado de consumo). • Utili zan un sistema de comunicación basado en una red de área local rápida como Myrinet o Fast Ethernet. • Uti lizan un software de libre distribución, como Linux, y algún entorno de programación paralelo como pueden ser PVM (Parallel Virtua l Machine) o MPI (Message Passing In/e/face). • Son sistemas escalables, es decir, se pueden ajustar a las necesidades computacionales y permitir una ejecución eficiente teniendo en cuenta las demandas de las aplicaciones secuenc iales y paralelas. JSe aplica este ca lifi cati vo a las aplicac iones de cómputo que requi eren mayores prestac iones que las normalmente di sponibl es con una estación de trabajo o compu tador personal. Por extens ión, a equ ipos que pos ibilitan la realización de dichas apl icac iones: estaciones de trabajo científi cas, supe rco mputadores, redes de altas prestaciones, etc. Las apli cac iones típi camente HPC se suelen denominar "Grand Challenges" (Graneles Retos). Ejemplos de ellos son las predicciones meteorológicas, la supercooducti vidad, la biología estructu ral, la voz y vis ión por com put ador, etc. Al ava nzar la tecnología, algunas apli caciones dejan de ser consideradas como grandes retos.
337
INGENIERíA DE COMPUTADORES 11
• Cada máquina de un cluster puede ser un sistema completo utilizable o aprovechable para otros propósitos. • Reemplazar un computador defectuoso de un cluster es trivial , incluso es posible diseñar el cluster de tal forma que si un nodo falJa, el resto continúe trabajando. • El rendimiento y los recursos del cluster pueden crecer con el tiempo beneficiándose de las últimas tecnologías computacionales y de redes. • Además, debido a la estandarización se tiene la garantía de que los programas escritos para un cluster funcionarán en cualquier otro con independencia del tipo de procesador de cada nodo sin más que recompi lar el código para esa arquitectura. Pero a pesar de estas ventajas los clusters también presentan algunas desventajas: • Las redes ordinarias no están diseñadas para el procesamiento paralelo. La latencia de red es alta y el ancho de banda relativamente bajo si se comparan con los de un sistema SMp4 (Symmetric MultiProcessors). Además, si el cluster no está aislado del resto de la red de la institución, la situación es aún peor. • En los sistemas operati vos monoprocesador existe muy poco software para tratar un cluster como un único sistema. Por ejemplo, el comando ps solo li sta los procesos de un sistema Linux, no los de todo el cluster. Indudablemente existen y han existido plataformas más potentes, más costosas y más difícilmente accesibles que los clusters de computadores. El desarrollo de software para estas plataformas es costoso, dado que debe ser programado o comprado por un reducido número de usuarios. Su vida útil suele acabar cuando aparece un nuevo tipo de supercomputador con arqu itectura y procesadores superiores, lo cual obliga a iniciar de nuevo el costoso proceso de adq uirir el hardware y el software. En comparación, los c1usters pueden ir incorporando computadores cada vez más potentes conforme vayan estando disponibles comercialmente, equilibrando la carga de trabajo según las prestaciones de cada computador, retirando eventualmente los computadores más antiguos si fuera convenien te, y utili zando siempre no solo el software previamente existente sino también el nuevo software que previsiblemente irá apareciendo, desarrollado por una base de usuarios cada vez más extensa (atraídos por el bajo costo del hardware y del software), con menor costo, menor esfuerzo y mayor utili zac ión. Por tanto, debido a la Oexibilidad que ofrece este tipo de arquitectura, cada día aparecen sistemas más potentes y con mayor número de procesadores. <1 Recuérdese que los sistemas SMP suelen tener de 2 a 64 procesadores, y se les conoce como la arquitectura que comparte lodo, es dec ir, los procesado res utilizan conjun tamente la totalidad de los recursos que tenga disponible el sistema (bus,
memoria, módulos de E/S, etc.). Además. en este tipo de sistemas úni ca mente se ejecuta una copia del sistema operativo.
338
4.5. SISTEMAS DE MEMORIA DISTRIBUIDA
4.5.3.
¿ Cuándo y cómo utilizar un cluster?
La razón de ser del procesamiento paralelo es acelerar la resolución de un problema. La aceleración (speedup) que puede alcanzarse depende tanto del problema en sí como de la arquitectura del computador
paralelo. Las aplicaciones que se benefician de una aceleración más significativa son aquellas que describen procesos intrínsecamente paralelos. En cualquier caso debe tenerse en cuenta el hardware de la máquina ya que es preciso maximizar la relación entre el tie mpo de cálculo útil y el "perdido" en el paso de mensajes. parámetros que dependen de la capacidad de proceso de las CPUs y de la velocidad de la red de comunicaciones respectivamente. La clave consiste en descomponer el problema de tal forma que cada procesador pueda operar el mayor tiempo posible sobre su fragmento de los datos, sin tener que recurrir a los de los demás procesadores. Por ejemplo, el cálculo del área bajo una curva por integración numérica es un ejemplo de aplicación completamente paralelizable. Basta con dividir el intervalo de integración entre todos los procesadores disponibles y que cada uno resuelva su fragmento sin preocuparse de qué hacen los demás. Al final , los resultados parciales se recolectan y se suman convenientemente.
Con 11 procesadores es posible resol ver el problema n veces más rápido que haciendo LI SO de uno solo (salvo por el mínimo retraso que supone el reparto de trabajo inicial y la recolección de datos final), consiguiendo una aceleración lineal con el número de procesadores. La Figura 4.32 muestra la curva de aceleración frente al número de procesadores para di stintos casos de aplicaciones paralelas. Si las condiciones son muy favorables es incluso posible alcanzar la aceleración superlineal, donde el programa se ejecuta aún más rápido que en régimen lineal. La aparente paradoja se entiende recordando que cada procesador cuenta con su propia memoria principal y su memoria caché, que pueden ser utilizadas de forma más eficiente con un subconjunto de los datos. De hecho, es posible que el problema no se pueda resolver en un único procesador pero sí sobre un cluster, simplemente por cuestión de tamaño de los datos. En el ejemplo de la Figura 4.32 se ha conseguido que un cluster de seis nodos haga el trabajo de siete computadores independientes. En el extremo opuesto se encuentran los problemas que se paraleli zan muy mal , es decir, necesitan estar continuamente compartiendo datos entre procesadores para obtener el resultado final . Las comunicaciones determinan el avance del programa y es posible encontrar que su ejecución en un cluster sea más lenta que en un único computador. Este caso canes pon de a la curva etiquetada como "Deceleración" en la Figura 4.32. Los programas que se ejecutan sobre arquitecturas paralelas consisten, a menudo, en un algoritmo básico que se repite muchas veces y donde entre paso y paso los procesadores intercambian infOlmación con sus vecinos. Por ejemplo, en el clásico juego de la vida en dos dimensiones cada celda sobrevive en la próxima generación si en la actual tiene exactamente dos vecinos vivos. Si se programa el juego en un cluster y se decide que cada procesador va a encargarse de una única celda, cada computador en cada paso precisa conocer el estado de sus ocho celdas vecinas, lo que supone un intercambio de mensajes con los ocho computadores correspondientes. Otros problemas requieren que cada procesador conozca, tras cada paso, el estado del sistema completo, con lo que todos los datos deben propagarse a todos los computadores . Es el caso de las simulaciones que involucran interacciones de largo alcance, como la gravitatoria o la culombiana. Todas estas aplicaciones ofrecen un grado de paralelismo intermedio entre 339
INGENIERíA DE COMPUTADORES 11
7
1;"
Superlineal
,
___ r~-'---' r
I
/
e
al
.
5
, /
/ ' / '
4
~/
a;
"
I
3
-
- -/
-' I
/ , /
,
. ...
,
.. ~" I
'
¡, .. l. .. I
!
1-
,,"
.. ...... /
2
1:
'1'
'o '¡¡
i"
Lineal
/
6
¿
I
_ .
_
__
I
I
I
I
- ~ - -+ -
rcc-~'----,~__,
I Deceleración ___ -_ -... __ __ I
'1
2
3
4
5
-
6
7
- - .-
B
9
Número de procesadores
Figura 4.32: Curva de aceleración frente al número de procesadores para di stintos casos de aplicac iones paralelas.
el régi men lineal y el de deceleración, La c urva de aceleración resultante se asemeja a la etiquetada como "Típica" en la Figura 4.32. La aceleración es prácticamente lineal cuando el número de computadores en el cluster es pequeño, pero al ir añadiendo nodos el tiempo de distribución de los datos comienza a ser significativo y la ejecución ya no se ace lera tanto. En el ejemplo de la Figura 4.32 es preciso utilizar nueve nodos para hacer que el programa se ejec ute aprox imadamente seis veces más rápido que en un sistema monoprocesador; esta es una cifra habitual en c1usters reales, Por ello, es interesante utilizar un cluster si la aplicación es suficientemente paralela y/o ha sido ya paraleli zada (reescrita para hacer uso de procesamiento paralelo) o se está en disposición de hacerlo. Cada vez es posible encontrar más paquetes de software que han sido adaptados para su ejecución en un cluster. Red Hat y NASA han organizado una distribución de Linux orientada al aprovecham iento de c1usters llamada Ex treme Linux que contiene un conj unto de tales aplicaciones paralelizadas, como el generador de imágenes POV (Persislence 01 Vision). Pero a menudo se está interesado en adaptar una apl icación propia de cálcu lo intensivo para sacar provecho de un cluster, y para ello no hay más remedio que recurrir a Su paraleli zación. Existen dos opciones para hacer que la aplicación sea capaz de usar los computadores de un cluster: programar explícitamente el paso de mensajes o utilizar herramientas que lo hagan. El segundo caso abarca las herramientas de para lelización automática y los lenguajes de programación paralelos. Desde luego, lo más sencillo es proporcionar el código fuente a un programa paralelizador y dejar que este produzca código p¡mtlelo. El problema es que estos paralelizadores suelen ser muy caros y, lo que es peor, funcionan realmente mal. Aunque e n la actualidad muchos grupos de investigación están dedicando un gra n esfuerzo al desarrollo y mejora de herrami entas de paralelización automática, lo cierto
340
4.5. SISTEMAS DE MEMORIA DISTRIBUIDA
es que por el momento no son muy útiles. En los años 80 se diseñaron un gran número de le nguajes explícitamente paralelos, como por ejemplo Orca3 o ParaIlaxis4, pero últimamente los desarrolladores se han dado cuenta de que los usuarios no van a usar su nuevo lenguaj e, pese a lo bueno que sea, si no es compatible con Fortran o C . Por ello, hoy en día los esfuerzos se dirigen al desarrollo de extensiones paralelas para estos lenguajes . El ej emplo más notable es HPF (High Pe/formal/ ce Fortran) . HPF es fundamentalmente Fortran 90 estándar al que se le han añadido una serie de directi vas. que se introducen como comentarios en el código fuente para informar al compilador, por ejemplo, sobre cómo distribuir los datos entre los procesadores o qué bucles se puede n ejecutar en paralelo sin preocuparse por las dependencias de las ex pres iones. Sin embargo, habitualmente se obtiene un mayor rendimiento programando explícitamente el paso de mensajes entre procesadores. Es posible optimizar hasta el último microsegundo utilizando la red a bajo ni vel, usando sockets o el dispositivo de red directamente, pero al precio de una programac ión compleja, susceptible de e rrores y, lo que es peor, no transportable. El mejor compromiso e ntre eficiencia, facilidad de uso y portabilidad lo dan las bibliotecas de paso de mensaj es, en las que el programador constru ye explícitamente el mensaj e entre dos procesadores, o las de función colecti va, modelo intrinsecamente paralelo en el que un grupo de procesadores se comunica a la vez. Entre las primeras destacan PVM (Pa rallel Vir/ual Machine ) y MPl (Message Passil1.g Ime/ j ace) y el ejemplo más signifi cati vo de las segundas es AFAPI (A gg regate Fune/ion A PI). Todas estas bibliotecas, que se encuentran di sponibles en Linux, se pueden utilizar en cualquier arquitectura paralela a la que se hayan transportado, no solamente e n clusters de computadores.
4.5.4.
Programación de c1usters
Desde hace varios años se puede observar que ha habido un incremento soste nido e n la aceptación y utilización del procesamiento paralelo. Este crecimie nto se debe principalmente al diseño y utilización de los clusters, tal y como ya se ha detallado en las secciones anteriores. En c ualquier aplicación que implique procesamiento paralelo, los datos se tienen que intercambiar e ntre las tareas que cooperan para resolver el problema planteado. Para ll evar a cabo esta tarea, como ya se ha indicado, ex isten dos paradigmas de programación: la m emoria compartida y el paso de mensajes. Conviene tener presente las siguientes consideraciones sobre ambos paradigmas : • El modelo de me moria compartida es similar al de un tablón de anuncios con acceso restringido, donde el que tiene permi so pone una noticia con lo que le interesa, y el que tiene permiso lee el tablón . A pesar de que este mecanismo parece sencillo, y de hecho es el más intuiti vo que se puede emplear para comparlir información , presenta un prob1e ma: el control de acceso a la infonnac ión . Dicho de otro modo, hay que tener la seguridad de que la información que un procesador lee es semánticame nte válida, y no son datos inválidos, debido a que uno de los procesadores que está escribie ndo los mismos datos con los que otro procesador está reali zando una operación de lectura. Este proble ma tiene unos mecanismos de resolución elaborados (semáforos, monitores, regiones c ríticas, etc.). Por estas razones, hoy e[] día la memoria comprutida solo se e mplea si el 341
INGENIERíA DE COMPUTADORES 11
grado de acoplamient05 es tan alto que un mecanismo de paso de mensajes puede llegru' a ser muy poco eficaz . • El modelo de paso de mensajes es un mecanismo menos intuitivo pero más cómodo para transmitir información. Un proceso envía a otro proceso un mensaje que contiene la información que debe conocer. Por ello, no existe el problema que se señaló anteriormente del control de acceso a la in formación , ya que si a un proceso le llega un mensaje, este mensaje ya es correcto salvo errores de transmisión . Por lo tanto, la programación y verificación de un programa pru'a1elo con comunicación por paso de mensajes es más sencilla que empleando memoria compartida . Sin embargo, si el grado de acoplamiento es alto, el trasiego de mensajes es desmesurado y este sistema queda totalmente descrutado . En la actualidad el modelo de paso de mensajes es el más aceptado, desde el punto de vista del número y variedad de procesadores que lo soportan, así como por los lenguajes y sistemas software que lo utilizan.
4.6.
Rendimiento y costes en sistemas paralelos
En esta sección se describen en primer lugar los pri ncipales factores que influyen en la velocidad computacional de un sistema paralelo. En segundo lugar, dado que uno de los factores más importantes para calculru' el rendimiento de un sistema paralelo está en la efici encia del sistema de comunicación, se eva lúan los costes de la comunicación mediante el uso de paso de mensajes y memoria compartida.
4.6.1.
Factores que influyen en la velocidad computacional
Son muchos los facto res que están directamente ligados con la velocidad computacional de un sistema paralelo. A continuación , se estudian los más destacables.
4.6.1.1.
Granularidad de los procesos
Independientemente de la arquitectura pru'alela de que se disponga, para lograr una mejora en la velocidad haciendo uso del paralelismo es necesru'io dividuoel cálculo en tareas o procesos que se puedan ejecutar de forma simultánea. El tamaño de un proceso se puede describu' por su granul aridad. Se dice que un proceso tiene granularidad gruesa cuando está compuesto por un gran número de in strucciones secuenciales, es decu', instrucciones que no necesitan de la comunicación con otros procesos para ser ejecutadas. Y se dice que el proceso tiene granularidad fin a cuando dispone de pocas instrucciones secuenciales. Normalmente, es deseable incrementar la granulru'idad para reducir los costes de la creación SEI grado de acoplamiento es sinónimo de granuralid,¡d. Es lino de los faclOres crít icos a la hora de diseñar apli cac iones paralelas. Un grado de acoplamiento alto signi fica que los distingos procesos co mparten mucha información. Desde el pun ID de vista práctico, mayor acoplamiento signi fi ca mayor trasiego de in formación entre procesadores.
342
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
y comunicación de procesos, pero probablemente esto reducirá el número de procesos concurrentes y la cantidad de paralelismo. Por tanto, es necesario encontrar un compromiso. Para el modelo de paso de mensajes es particularmente deseable reducir la sobrecarga en la comunicación, sobre todo en los clusters donde la latencia de comunicación puede llegar a ser importante. A medida que se divide el problema en partes paralelas se llegará a un punto en el que el tiempo de comunicación domine sobre el tiempo total de ejecución. Se puede utilizar la raZÓn:
tiempo de comuniCación
lcom
como medida de la granu laridad. Es muy importante tratar de maximizar esa razón, siempre y cuando se mantenga el paralelismo suficiente. También hay que decir que la granularidad está relacionada con el número de procesadores que se utilicen . Por ejemplo, a la hora de repartir los datos, el tamaño de un bloque de datos utilizado por un procesador se podría aumentar, incrementando de esta forma la granularidad. Sin embargo, si el problema a resolver tiene un tamaño fijo de datos, para incrementar la granularidad habría que disminuir el número de procesadores. En general es conveniente diseñar programas paralelos en los que se pueda variar la granularidad, es decir, conseguir un diseño de programa escalable.
4.6.1.2.
Factor de aceleración (speedllp)
Una medida del rendimiento relativo eno'e un sistema multiprocesador y un sistema con un (mico procesador es el factor de aceleración denominado speedup, S(M) , que se define como: S (M) =
'.!. tI'
donde t, es el tiempo de ejecución de un programa en un único procesador y tp es el tiempo de ejecución en un sistema paralelo con M procesadores. El parámetro S (M) da el incremento de velocidad que se obtiene cuando se utili za un sistema con M procesadores en lugar de un único procesador. Para comparar una solución paralela con una solución secuencial, se utilizará el algoritmo secuencial más rápido para ejecutarlo en un único procesador. En un análisis teórico el factor de aceleración se puede dar también en términos de pasos o etapas computaciol1ales. Recuérdese que se entiende por paso o etapa computacional a las operaciones que en su conjunto permiten obtener un resultado parcial completo de la tarea a realizar. Normalmente se componen de tareas repetitivas independientes entre sí. Por ejemplo, una misma operación que debe realizarse sobre un gran número de datos diferentes se podría realizar secuencialmente con una iteración sobre los datos. Cada vez que se calcula un resultado parcial completo se realiza una etapa computacional. En un sistema paralelo, se pueden obtener varios resultados al realizar los cálculos paralelamente sobre diferentes datos, obten iéndose así varios resultados en una etapa. Así, el speedup será: 343
INGENIERíA DE COMPUTADORES 11
S (M )
=
,Número de pasos computacionales utili zando un procesador Numero de pasos computacIOnal es paral elos con M procesadores
es decir, el cociente entre la suma de los pasos computacionales que se neces itan para ejecutar el algoritmo e n un único procesador y la suma de los pasos comp utac ionales que son necesarios para ejecutar ese mi smo algoritmo en un sistema con M procesadores. Recuérdese que todos aquellos pasos computacionales que se reali zan en paralelo contabili zan solo como uno. La máxima aceleración que se puede lograr con M procesadores es M (aceleración lineal). La aceleración máx ima absoluta de M se debería alcanzar cuando: la computación se puede dividir en procesos de igual duración, cada proceso se loca liza en un procesador y no hay sobrecarga (overhead), es decir: fs
S(M) = - = M " M
Una aceleración superlineal, donde S(M) > M , se puede encontrar excepcionalmente en alguna ocasión, pero debe recordarse que normalmente se debe a una utili zación subóptima del al goritmo secuencial o a alguna característica de la arquitectura que favorece la programación paralela del proble ma. Ex isten varios factores que aparecen como sobrecarga en los programas paralelos y que limitan la aceleración. Muy especialmente deben tenerse en cuenta los siguie ntes: • Los periodos en los que no todos los procesadores están reali zando un trabajo útil , es decir, cuando en el programa ex isten partes secuenciales que no se puede n di vidi.r y las ti ene que ejecutar un único procesador. • Los cálcul os adicionales que apar·ecen en el programa parale lo y que no apar·ecen en el secuencial.
Tiempo de espera para enviar un mensaje Mensaje Tiempo que se larda en enviar un mensaje
Figura 4.33: Diagra ma es pacio-temporal de un programa de paso de mensajes. 344
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
• El tiempo de comunicación para e nviar mensajes.
En la Figura 4.33 se pueden observar las sobrecargas y retrasos que se producen en la ejecuc ión de un programa paralelo por paso de mensajes. Parece también razonable, como se observa en la Figura 4.33 , esperar que exista alguna parte del programa que no se pueda di vidir en procesos paralelos y se tengan que ejecutar de forma secuencial. Por ejemplo, en el periodo inicial , antes del arranque de los procesos parale los, úni came nte un procesador está haciendo un trabajo útil , mi entras que durante e l resto de la computación los procesadores restantes estarán ejecutando procesos. 4.6.1.3.
Ley de Amdahl
De los factores limitadores de la aceleración, la cantidad de parte secuencial existente en un programa paralelo fue considerada por Amdahl como el fac tor más determinante en la aceleración , es decir, la parte secuencial de un programa deterrnina una cota inferior para el tiempo de ejecución , aún cuando se utilicen al máximo las técnicas de paralelismo. Si se llama f a la fracción del programa que no se puede dividir en tareas paralelas, O ~ f ~ 1, Y se considera que no hay sobrecarga cuando el programa se divide en tareas parale las , el tiempo de computación necesario para ejecutar el programa en M procesadores (t,,(M) vendrá dado por la sigui ente expresión: ( l -f)· , ',l M) = f . " + M -' En la Figura 4. 34 se muestra gráfi camente la paralelización en M procesadores de un programa /,
1/,
(1·n /,
fracción secuencial
Un procesador
fracción paralela
1
1
1---- ---- 1
1
1
j M procesadores
I , , , , ,, ,
/,
~ M procesadores
(1·n ', 1M
Figura 4.34: Progra ma secuencia1 paraJeli zado. Ley de Amdahl.
345
INGENIERíA DE COMPUTADORES 11
secuencial. Se observa que la parte secuencial está locali zada al comienzo del programa, pero hay que hacer notar que podría estar distribuida a lo largo de toda la aplicación paralela. Por lo tanto, la ley de Amdahl expresa que el factor de aceleración viene dado por:
s (M) =
fs
f· fs + (1 - f) .
= .,------:-:--,M_:-:---::
t
-¡¡
1 + (M - 1) . f
:7,
En la ecuación anterior se observa que el factor de aceleración nunca puede ser mayor que es decir, no importa lo grande que sea M (número de procesadores), la máxima aceleración que se puede conseguir para un determinado problema está acotada.
Ejemplo: Suponer que se quiere lograr una aceleración lineal con 100 procesadores. ¿Qué fracción del cálculo original puede ser secuencial? La ley de Amdahl es: S(M) =
.
1
f +
(l:fl M
Sustituyendo el objetivo de aceleración lineal con 100 procesadores se obtiene: 1 100 =
(In
f+ 100 despejando el porcentaje mejorado, se obtiene f = O. Por tanto, para conseguir' una aceleración lineal con 100 procesadores, ningún cálcu lo original puede ser secuencial. Dicho de otra forma, para obtener una aceleración de 99 a partir de 100 procesadores significa que la fracción secuencial del programa original (f) debe de ser aproximadamente 0,0001. La ley de Amdahl expresa que el tiempo de ejecución de la parte paralelizable de un programa es independiente del número de procesadores. Aunque esto es verdad cuando se ejecuta un problema de tamaño fijo en diferentes números de procesadores, no lo es tanto cuando el tamaño del problema se escala con el número de procesadores disponibles. En la práctica, el número de procesadores se suele ajustar al tamaño del problema para mantener el tiempo total de computación en un valor deseado. Por tanto, según Amdahlla razón para aumentar' el número de procesadores debe ser para resolver problemas de tamaño mayor, y no para resolver más rápidamente un problema de tamaño fijo . En la Figura 4.35 se puede observar' la variación del factor de aceleración en función del número de procesadores y de la fracción secuenc ial del programa. Por ejemplo, siendo el 5 % de la computación total la parte secuencial , la máxima aceleración que se puede conseguir es de 20, independientemente del número de procesadores. Amdahl utilizó este argumento para promover en los años 60 el empleo de los s istemas monoprocesadores. Esta afirmación hoy en día no es totalmente cierta ya que en algunas situaciones un factor de aceleración de 20 puede resultar impresionante. 346
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS f= 0%
20
20 M= 256
~
Ui
'"
Ui
16
¿ -o
'0
'ü
~
'ü
~ 12
12
~
1iro -1l
16
¿
(=
5%
~
ro
-1l
8 f = 10% ( =
20%
4 8 12 16 Número de procesadores, M
20
4
8
~
~
4
0.2
0.4 0.8 0.6 Fracción secuencial, f
1.0
Figura 4.35: Gráficas del factor de aceleración, S CM).
Del estudio de la ley de Amdahl, se podría definir el límite de Amdahl (7) como el mayo r factor de aceleración posible cuando el número de procesadores disponibles tiende a infinito. Por ejemplo, si un programa contiene un 10 % de código no paraleli zable (f = 0, 1), el límite de Amdahl sería 10 (t.T), independientemente del número de procesadores del sistema. Conviene recordar que en los resultados de Arndahl se supone que no hay sobrecarga, es decir, el tiempo de comunicación no se tiene en cuenta; en la práctica no se puede obviar. 4.6.1.4.
Eficiencia
Si se normaliza la aceleración de un programa paralelo dividiéndola entre el número de procesadores se obtiene la eficiencia E de un sistema : Tiempo de ejecución utilizando un único procesador E==:-----,-----,---,':---:::'--:------:-.,--------,---'-;---.,------:--= Tiempo de ejecución utilizando un multiprocesador X número de procesadores tp
X
M
Si se tiene en cuenta la ecuación anterior se puede expresar la efi ciencia E en función del factor de aceleración S CM) mediante la siguiente expresión: S(M) . I E = - - x I 00 % = -:---::-:--,-:--:: M I +(M - I )·J
X
l 00 %
donde E se expresa en porcentaje. La efi ciencia da la fracción de tiempo que se utilizan los procesadores durante la computación, es decir, da una medida de lo adecuadamente que han sido utilizados los procesadores. Así por ejemplo, si la efi ciencia E es del 50 % se puede afirmar que, en promedio, los procesadores se utilizan la mitad del tiempo de lo que dura la computación. Por tanto, para un mismo 347
INGENIERíA DE COMPUTADORES 11
programa, un incremento en el número de procesadores del sistema supond rá un decremento en la efi ciencia, ya que el trabajo realizado por cada uno se reparte y el tiempo de uso de cada procesador disminuye. 4.6.1.5.
Coste
El coste C (o trabajo) de una computación, se defin e como: C
= Tiempo de ejecución x Nú mero de procesadores utilizados
El coste de una computación secuenc ia l es simplemente s u ti empo de ejecuc ión ' s , Y el de una computac ión paralela es '" X M. El tiempo de ejecuc ión paralelo, 1", vie ne dado por stA'/)' Por lo tanto, el coste de una computación paralela se puede ex presar como: l ., . M Is C=--=S(M) E
Un coste óptimo de un algoritmo paralelo es aquel que es proporcional al coste (t iempo de ejecución) que tiene e n un sistema con un único procesador. 4.6.1.6.
Escalabilidad
La escalabilidad se suele utilizar para indicar un diseño hard ware que permite ampliar su tamaño para obtener una mejora en el rendimiento. A este tipo de escalabilidad se le denomina escalabilidad hardware. Tambi én se uti liza el término esca lab ilidad para indi car que un algoritmo paralelo puede soportar un incremento grande de datos con un incremento bajo y acotado de pasos computac ionales. A este otro tipo de escalabilidad se le denomina escalabilidad algorílmica. La definición más simple de escalabilidad es que un sistema es escalab le si e l rendimi ento del mi smo se incrementa linealmente con relac ión al número de procesadores usados para una cierta apli cación. El rendimiento de un sistema depende de un gran número de fac tores que influ yen e n la esca labilidad de la arquitectura de l sistema y en el programa de apli cación que se ejecute. El análisis de la escalabilidad de un siste ma debe realizarse para una cierta aplicación y bajo diferentes restri cciones en el crecimiento del tamaño del problema (carga de trabajo) y el tamaño del sistema (número de procesadores). Los estudios de escalabilidad determinan e l grado de afinid ad entre una arqu itectura dete rminada y una aplicación. Para diferentes pares (arquitectura, algoritmo) , el anális is puede obtener diferentes resultados ya que una máquina puede ser muy esca lable para UD algoritmo y muy poco para otro. Los principales parámetros que afectan a la escalabilidad de un sistema para una determinada aplicación son:
• Tamal'io del sislema : El número de procesadores uti li za dos en el sistema. Un tamaño grande implica más recursos y más potenc ia de procesamiento. 348
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
• Frecuencia de reloj: La frec uencia de reloj determina e l cic lo de máq uina básico. Es deseable un sistema cuyos componentes (procesadores, memorias, buses, etc.) estén controlados por un re loj cuya frecuencia pueda incrementarse cuando la tecnología mejore. • Twnoí1o del plvblema: La can Lidad de trabajo computacional necesaria para reso lver un determinado problema. • Tielnpo de CPU: E l tiempo de CPU real usado en la ejecuc ión de un dete rmi nado programa en un sistema con M procesadores. • Capacidad de memoria: La cantidad de memoria princ ipa l utili zada para la ejecuc ión de l programa. Hay que tene r e n c uenta que la demanda de memoria viene afectada por e l tamaño de l problema, el ta maño del programa, los algoritmos y las eso'ucturas de datos usadas. Puesto que la dema nda de memoria puede vari ar en tiempo de ejecución, este parámetro se refiere a la máxima canlidad de memoria so li citada durante la ejecución del programa. • Pérdidas (overhead) de c0l/1111licaci6n: La cantidad de tiempo gastada en la comunicación eno'e procesadores, sincroni zación, etc. • Coste del sistema: E l coste total económico de los recursos hardware y software necesarios para llevar a cabo la ejecución de un programa.
E n función de los objetivos establec idos y las restricciones de recursos impuestas, se pueden fijar algunos de los p¡U'ámetros anterio res y optimizar los restantes para conseguir el mayor rendimie nto con el coste menor. La noción de escalab il idad está ligada a las nociones de incremento de ve locidad y eficiencia que se han discutido en esta sección. Una buena expresión de la esca labilidad debe ser capaz de inc luir los efectos de la red de interconexión de la arquitectura, de los patrones de comunicación inhe rentes a los algoritmos empleados, de las restricciones físicas impuestas por la tec nología y de la eficiencia del sistema. 4.6.1.7.
Balance de carga
El balance de carga consi ste en di stribuir de una f01111a equitativa la carga computacional entre todos los procesadores disponib les y con ello conseguir la máxima veloc idad de ejec uc ión. Se considera que el problema a resolver se divide en un número fijo de procesos que pueden ejecutarse en paralelo. Cada proceso realiza una cantidad conoc ida de o·abajo. Además, se supone que los procesos se distribu yen entre las máquinas dispon ibles sin tener en cuenta e l tipo de procesador y su velocidad. S in embargo, puede ocurrir que algu nos procesadores fi nal icen sus tareas antes que e l resto y queden libres debido a que el trabajo no se haya repartido de una forma equitat iva o porque algunos procesadores sean más rápidos que otros, o por ambas situaciones. La situación ideal es que todos los procesadores
349
INGENIERíA DE COMPUTADORES 11
trabajen de una forma continuada sobre las tareas disponibles para conseguir el mínimo tiempo de ejecución. A la consecución de este objetivo dividiendo las tareas equitativamente entre los procesadores es a lo que se le denomina balance de carga. La Figura 4.36 muestra como el balance de carga produce el mínimo tiempo de ejecuci ón. En la Figura 4.36.a, el procesador PI está calculando durante un periodo de tiempo mayor que el resto y el P4 completa su trabajo en menos tiempo que los demás . El tiempo de ejecución final viene dado por el tiempo del procesador PI. Lo ideal sería que parte del trabajo del procesador PI lo hiciera P4 para igualar las cargas de trabajo. En la Figura 4.36. b, todos los procesadores están calculando durante todo el tiempo, t segundos, consiguiéndose un balance de carga pelfecto, con 10 que se di sminuye el tiempo de ejecución. Otra forma de ver este problema es la siguiente: para resolver la aplicación en un único procesador se requi eren k ciclos de reloj con p procesadores . Sin considerar sobrecargas adicionales (tiempo de comunicación) para la implementación paralela, el tiempo de ejecución se reduciría a ~ ciclos de reloj. P,
p. P, P, P,
I
P,
~
p.
I
P,
P, P, P,
-1
P,
tiempo
(a) Desbalanceo de carga,
aumenta el tiempo de ejecución
(b) Balance de carga perteclo, disminuye el tiempo de ejecución
Figura 4.36: Balance de carga. El balance de carga se puede tratar de forma estática, antes de la ejecución de cualquier proceso, y de forma dinámica, durante la ejecución de procesos. Al balance de carga estático se le suele denominar mapeado del problema o planificación del problema. El bal ance de carga estático tiene serios inconvenientes que lo sitúan en desventaja sobre el balance de carga dinámico. Entre ellos caben destacar los siguientes: • Es muy difícil estimar de forma precisa el tiempo de ejec ución de todas las partes en las que se di vide un programa sin ejecutarlas. • Algunos sistemas pueden tener retardos en las comunicaciones que pueden vari ar bajo diferentes circunstancias, lo que difi culta incorporar la variable retardo de comunicación en el balance de
350
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
carga estático . • A veces los problemas necesitan un número indeterminado de pasos computacionales para alcanzar la solución. Por ejemplo, los algoritmos de búsqueda normalmente atraviesan un grafo buscando la solución y, a priori, no se sabe cuántos caminos hay que probar, independientemente de que la programación sea secuencial o paralel a. Con el balance de carga dinámico todos los inconvenientes que presenta el bal ance de carga estático se tienen en cuenta. Esto es posible porque la di visión de la carga computacional depende de las tareas que se están ejecutando y no de la estimación del tiempo que pueden tardar en ejecutarse. Aunque el balance de carga dinámico lleva consigo una cierta sobrecarga durante la ejecución del programa, resulta una alternati va mucho más efi ciente que el balance de carga estático. En el balance de carga dinámico, las tareas se reparten entre los procesadores durante la ejecución del programa . Dependiendo de dónde y cómo se almacenen y repru1an las tareas el balance de carga dinámi co se di vide en: • Balance de carga din ámico centralizado. Se corresponde con la estructura típica de M aestrofEsclavo. El proceso maestro es el que tiene la colección completa de tareas a realizru·. Las tareas son enviadas a los procesos esclavos . Cuando un proceso esclavo finaliza una tarea, solicita una nueva al maestro. Esta técnica también se denomina programación por demanda o bolsa de trabajo , y no solo es aplicable a problemas que tengan tareas de un mismo tamaño. Proceso Maestro Tareas:
Env¡o·~==='l-';i{-11'---------\~:--' de tarea
Petición de larea
Procesos Esclavos
Figura 4.37 : Balance de carga dinám ico centra lizado.
En problemas con tareas de distintos tamaños es mejor repartir primero aquellas que tengan una mayor carga computac ional. Si la tarea más compleja se dejase para el final, las tareas más pequeñas serían reali zadas por esclavos que después estmian esperando sin hacer nada hasta que alguno completara la tarea más comp leja. También se puede utilizm' esta técnica para problemas donde el número de tm'eas pueda vari ar durante la ejecución . En algunas aplicaciones, especialmente en algoritmos de búsqueda, la ej ecución de una tarea puede generar nuevas tareas, aunque al final el número de tareas se debe de reducir a cero pm'a alcanzar la finali zación del programa. En este contexto se puede uti lizar una col a para mantener las tareas pendientes tal y como muestra la Figura 4.37. Si todas las tareas son del mismo tamaño y de la 351
INGENIERíA DE COMPUTADORES 11
misma importancia o prioridad , una cola FTFO (First /n First Out - Primen; en Entrar Prime m en Salir) puede ser más que sufi ciente, en otro caso debe analizarse la estructura más adecuada . • Ba lance de carga dinámico distribu.ido o descentralizado. Se utilizan varios maestros y cada uno controla a un grupo de esclavos. Una gran desventaja del balance de carga dinámico central izado es que e l proceso maestro úni cameLlte puede reparti r una tarea cada vez, y después de que haya enviado las tareas inic iales solo podrá responder a nuevas petic iones de una en una. Por tanto, se pueden producir colisiones si varios esclavos solicitan petic iones de tareas de manera simultánea. La estructura centralizada únicamente será recomendab le si no hay muchos esclavos y las tareas son intensivas computacionalmente. Para tareas de grano fino (tareas con muy poca carga computacional) y muchos esc lavos es aprop iado di stribu ir las tareas en más de un sitio. La Figura 4.38 muestra el esquema de un balance de carga dinámico distribuido. El maestro divide su trabajo inicial en varias partes y envía una a cada máquina que actúa como mini-maestro (de Mo a M,,_I). Cada mini-maestro controla un conjunto de máquinas esclavas. Así por ej emplo, para un problema de optimización, las máquinas que actúan como mi ni -maestros podrían encontrar un óptimo local y enviárselo a l maestro para que seleccione la mejor solución. Proceso Maestro Tareas inicia les:
~,-~~~~~~
Proceso Mo
Proceso M,~ ,
I- -I
1---1
Procesos Esclavos
Figura 4.38: Balance de carga dinánuco disb"ibuido.
4.6.2.
Costes de la comunicación mediante paso de mensajes
E l tiempo empleado en transmitir un mensaj e entre dos componentes de un sistema paralelo es la suma entre el tiempo necesario para preparar el mensaje y e l tiempo que éste emplea en atravesar la red de comuni cación hasta su destino. Este tiempo se denom.i na latencia de comunicación y sus principales parámetros son los siguientes :
• Tiempo de inicialización (l., ) : Este tiempo incluye el ti empo e n preparar el mensaje, el tiempo de 352
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
ejecución del algoritmo de enrutamiento y el tiempo de conexión entre el emisor y el enrutador. Este tiempo se contabiliza una vez por cada mensaje transmitido. • Tiempo de salla (1,,): Es el tiempo que tarda la cabecera de un mensaje en viajar entre dos nodos directamente conectados en la red (también se suele denominar latencia de nodo). Este tiempo está ligado con el tiempo que tarda un ern'utador en decidir e l siguiente salto del mensaje. • Tiempo de lransferencia por palabra (1,,): Si el ancho de banda de un canal es r palabras por segundo, su tiempo de transferencia por palabra es Es el tiempo que tarda una palabra en ser transmitida por el canal.
+.
El coste de la comunicación varía dependiendo del tiempo del algoritmo de enrutamiento utili zado. A continuación, se describen dos algoritmos de enrutamiento ampliamente utilizados en sistemas paralelos. • Almacenamienlo y reenvío (slore·and-jorward)
En este algoritmo de enrutamiento cada nodo intermedio entre el emisor y el receptor reenvía el mensaje únicamente cuando lo ha recibido y almacenado completamente. Se supone un mensaje de tamaño m que se transmite a través de I enlaces intermedios. Donde en cada enlace el mensaje tarda ," para la cabecera y (,,111 para el resto del mensaje. El tiempo total para el mensaje sería: l.,
+ (mI" + 1,,)1
Teniendo en cuenta que el tiempo de salto en los sistemas paralelos actuales es mucho menor que el tiempo de transferencia del mensaje (mI,,), incluso para un número reducido de palabras, éste puede ser ignorado. Por tanto tendríamos que: tcom =
1.~
+ mlt w
La Figura 4.39.a muestra un ejemplo de transferencia de un mensaje a través de una red que usa el enrutamiento mediante almacenamiento y reenvío. Observe cómo cada uno de los nodos (PO, PI , P2 Y P3) espera a recibir todo el mensaje antes de reenviarlo al próximo nodo. • Carie y continuación (cut-Ihrough)
Dado que el anterior algoritmo hace un uso pobre de los recursos de comu nicación del sistema, el algoritmo cut-tlll'ough se basa en los sistemas de enrutamienlo de paquetes (normalmente utitizados en sistemas grandes y muy distribuidos, como Tnternet) para mejorar los costes de comunicación en sistemas paralelos. El algoritmo cut-through divide cada mensaje en un número fijo de unidades llamados dígitos de cOlllrol de flujo (flow control digils o flils). Los fiits son más pequeños que los paquetes porque no incluyen información de enrutamiento y la información para la corrección ele errores es más 353
INGENIERíA DE COMPUTADORES"
sencilla (aprovechando que las redes de comlllucación en sistemas paralelos son poco propensas a la transmisión con errores). Antes de enviar el primer Hit el emisor estab lece un camino hasta el receptor mediante el envío de un paquete especial llamado trace/". Una vez se ha establecido la conexión se e nvían los flits uno tras otro, sigui endo todos la misma ruta. Los nodos intermedios no esperan a recibir todo el mensaje, sino que reenvían los liits según los van recibiendo. De esta manera se red ucen, o casi se eliminan, los buffers de almacenamiento en cada nodo, El algoritmo cut-through requiere menos memoria y es más rápido que el algoritmo de almacenanuento y reenvío. Se supone un mensaje de rrl palabras que viaja a través de una red con I enlaces . Si t" es el tiempo de salto, la cabecera del mensaje tardará un ti empo Ir" en llegar al receptor. El conten ido del mensaje tardará un tiempo mt", en ser transnutido. Por tanto se tiene: ' CO /JI
= 1.\, + Itl¡
+ mfll'
que supone una mejora respecto del algoritmo de almacenamiento y reenvío, ya que los térm inos correspondientes al número de saltos y el tamaño del mensaje son sumados en lugar de tiempo
P, P, P, P, (a) tiempo
P, P, P, P,
(b)
Figura 4.39 : Tran sferencja de un mensaje: a) enrutamiento mediante almacenamiento y reenvío (store-alltlfO ll vard) , b) e nrutamiento mediante clIf-lh rough.
354
4.6. RENDIMIENTO Y COSTES EN SISTEMAS PARALELOS
mul tiplicarse. Ambos algolitmos se comportan de manera aproximada en los casos en los que la comun icación sea entre nodos cercanos (1 = 1) o con tamaños de mensaje pequeños (m = 1). La Figura 4.39.b muestra un ejemplo de tra nsferencia de un mensaje, dividido en 4 Hi ts, a b'avés de una red que usa el elU'lltamiento med iante cut-ttu·ough. En este caso, el tiempo de transferencia se red uce, en comparación con la versión que usa almacenamiento y reenvío, ya que cada uno de los nodos transmite las partes del mensaje tan rápido como puede sin esperar a recibir la siguiente parte o el mensaje completo. El tamaño del Hit es un panímetro bás ico en el diseño de un sistema de enrutamiento basado en el algori tmo cut-through. Si el nit es demasiado pequeño, la lógica de control de los emutadores deberá trabaj m' demasiado depri sa para poder cubrir la tasa de envío de Hi ts. Por e l contrario, si el nit es demasiado grande, el tamaiio de los buH'ers de los en mtadores se debe incrementar red uciendo así la latencia de transferencia de mensajes. En la actual idad el tamaño más usado suele estar entre 4 y 32 bytes.
4.6.3.
Costes de la comunicación mediante memoria compartida
Encon trar un a unidad de medida para el coste de la comunicación de un programa paralelo mediante paso de mensajes es mucho más sencillo que med iante el uso de memoria compartida. Las siguientes razones lo expl ican: • La disposición de los datos en memolia está determinada por el sistema. El programador tiene un control red ucido sobre la local ización de los objetos en memolia. Esto hace mu y d ifíc il la distinción entre el acceso a datos loca les y remotos, dificultando en gran medida el cálculo del tiempo de acceso a dichos datos. • La li mi tación en el tamaño de las caché puede provocar un problema de hi perpaginación (Ihrashing) . Si el tamaño de los datos que necesita un nodo para reali zm' su trabajo es mayor que el tamaño disponible de la caché local , pmte de dichos datos deberá sobreescribir Ob'a porción de los mi smos en la caché pm'a que puedan ser uti li zados. La sobreescritu ra de los datos provoca múltiples accesos a caché y una degradación en el rendimiento de la misma conforme el tamaño del problema se incrementa. Este problema se agudiza en mu ltiprocesadores ya que cada fa llo de la caché puede provocar operaciones de coherencia de caché y comun icaciones eno'e procesadores. • La sobrecm'ga (overhead) incluida por las operaciones de coherencia de caché (invalidar y actuali zar) es difíc il de cuantificar. Dependiendo de la configuración de los datos en las caché y el número de copias ex istentes, los diferentes accesos pueden provocar múltiples acciones de coherencia. Por ejem plo, un procesador que esté trabaj ando con un dato en su caché podrá rea lizar algunas operaciones directamente con la caché, pero sin emb¡u'go otras operac iones generarán un fallo. Estos faUos generan la transferencia de l dato desde el procesador que mantiene la copia modificada hasta el procesador que necesita el dato. El número de copias de los datos en las diferentes cachés y la secuencia de accesos a los mismos están fuera del alcance del programador. 355
INGENIERíA DE COMPUTADORES 11
• La localidad espacial es un fenómeno difícil de modelar. La latencia de acceso a las diferentes palabras de una caché puede variar, incluso para los primeros accesos. Si se accede a una pal abra " vecina" de un acceso previo, la lectura res ulta muy rápida so lo en el caso que la caché no se haya tenido que sobreescribir. • La lectura-anticipada de palabras juega un papel importante en la reducción de los tiempos de acceso a los datos. Los compiladores pueden rea lizar es te tipo de acciones para reducir los ti empos de acceso. Sin embargo, dado que esto solo depende del compil ador y la disponi bili dad de recursos, reali zar un modelo preciso resulta realmente difícil. • El fe nómeno de false-sharing puede incluir una sobrecarga (ol'erhead) importante en muchos programas. Se considera fa lse-sharing cuando diferentes procesadores acceden a diferentes datos que están almacenados en el mismo bloque de caché. Esta situación puede provocar acciones de coherencia incl uso cuando en rea li dad ambos procesadores no están comparti endo ningún dato. • La competi ción por los recursos del sistema normalmente supone una de las mayores sobrecargas (overheads) en sistemas de memoria compartida. Desafortunadamente, dado que la competición por los recursos depende de la ejecución del programa también es un fenómeno muy difícil de modelar. C ualquier modelo de coste para sistemas de emoria compartid a debe tener en cuenta las razones mencionadas anteriormente. De todas maneras, los modelos de dichas características son normalmente muy complejos y poco útiles . En lineas generales se puede ver que el acceso a datos remotos provoca la lectura de dichos datos para escribirlos en la caché local. Esto implica un tiempo para las acciones de coherencia, la red de interconexión y el acceso a memoria. Por simi litud con los modelos de aso de mensajes , se puede denominar a este tiempo como t, (que supone un acceso inicial a un bloque de datos compartidos de 111 palabras). Por otro lado, se puede asumir que el acceso a los datos locales es menos costoso que el acceso a datos remotos. El tiempo de acceso a una palabra remota se denomina como t,,,. El coste de compartir un bloque de datos de m. palabras será t., + m/"" que es análogo al caso de paso de mensajes (teniendo en cuenta que t, será mucho más pequeño que t", en un sistema de memoria compartida). Esta aproximación de coste asume un acceso de solo-escritura sin tener competición por los recurSOS del sistema. Si múltiples procesadores acceden a los mismos datos, el coste se multiplica por el número de procesadores , de manera análoga al paso de men sajes donde el procesador que tiene los datos envía mensajes a los otros procesadores. Si el acceso es en modo lectura-escritura, el coste se incremen ta en los accesos de los procesadores posteriores al que escribe. Este comportamiento también es análogo al paso de mensajes, donde el procesador que modifica los datos tiene que enviar un mensaje para actuali zar los datos locales del resto de procesadores. El modelo descrito proporciona una aproximación para el coste de acceso a datos compartidos. Sin embargo, no se tiene en cuenta la competición por los recursos de la máquina, la posibilidad de que los tamaño~ de las caché de los procesadores 11 0 sea el mi smo, la localidad espacial de los datos en caché, 356
4.7. RESUMEN
el fa lse-sharing, ni las posibles colisiones en las comunicaciones. Ex isten otros modelos más complejos que incluyen algunos de estos parámetros, pero como ya se ha comentado su resultado es poco útil como apoyo para el desarrollo de programas paralelos.
4.7.
Resumen
El procesamiento paralelo trata de mejorar las capacidades de resolución de problemas de los sistemas actuales mediante la distribución del trabajo entre múltiples procesadores. Dichos procesadores trabajan en paralelo, de manera simu ltánea, para ejecutar las tareas de cómputo de un problema. Dependiendo de l punto de vista desde el que se observe el sistema paralelo, pueden ser organizados en diferentes plataformas. Así, si se observa desde el punto de vista de un programador, los sistemas paralelos estanín organizados desde su estructura de control o desde el modelo de comunicación utilizado para transmitir in form ación entre procesadores. La estructura de control se refiere al paradigma de programación utilizado para distribuir los trabajos entre los componentes del sistema. Existen mul tiples paradig mas entre los que cabe destacar el Maestro/ Esclavo y el SPMD (Single Progra111 Multiple Data). El modelo de comunicación hace referencia al método usado para compartir datos entre los componentes: memori a cOlnpal1ida o paso de mensajes. Si se toma el punto de vista físico, o del hardware, los sistemas paralelos se organi zan en: sistemas de memoria compartida o sistemas de memoria distIibuida. En los sistemas de memoria compartida existen tres parámetros fundamentales: la organización de la memoria principal, tenie ndo en cuenta la distribución de memoria y cachés entre procesadores (ya sean locales o remotas a cada uno), la red de interconex.ión y sus diferentes topologías (ya sean estáticas O dinámicas), y por último el sistema de coherencia de caché (que asegura una coherencia de datos entre las cachés de los procesadores del sistema). Los sistemas de memOlia di stribuida están representados principalmente por los clusters, que son sistemas compuestos por varios computadores interconectados que interactúan para resolver problemas de manera más efi ciente. Dado que el plincipal objetivo del procesamiento paralelo es mejorar el rendimiento de cómputo, se han descrito los principales factores con los que medir dicho rendimien to. Entre ellos se puede mencionar la granularidad de los procesos, el speedup, la ley de Amdahl , la eficiencia, el coste, la escalabilidad y el balance de carga. Muchos de estos factores están relacionados entre sÍ. También cabe tener en cuenta los costes relacionados con la com unicación entre procesadores, ya sea para el caso de sistemas que utilizan paso de mensajes como para los sistemas de memoria compartida. Para el caso del paso de mensajes, el modelo de coste es relativamente factib le de obtener, pero para el caso del sistema de memoria compartida obtener un modelo útil que sirva para mejorar la programación de l s istema es mu y complejo y difícil. 357
INGENIERíA DE COMPUTADORES 11
4.8.
Referencias BlIyya R. High Pelfonnance Clusler Computil1g, vols. 1 y 2, Prentice Hall, NJ, USA, 1999. Codenotti B., Leollcini M. Il1lroduclion lo ParaUel Processing. Addisoll-Wesley, Readillg, MA, USA, 1993. ClIller O.E., Siling J.P., GlIpta A. Parallel Cornpuler A rchitecture. A Hardwa re/Software Approach, Morgan Kall fma nn, San Francisco, CA, USA, 1999. Ooa llo R. , Carneiro V.M. , F raguela B.B ., TOllriño J. Multiprocesadores: Eslructura y Programación.. Tórcul o Ediciones, Universidad de La Coruña, 1995. Enslow P.H. MlIlti processor Organization - A Survey. ACM Compuling Sl.Irveys, 9(1), pp. 103-129, 1977. Grama A., GlIpta A., Karypis G., KlImar V. lntrodllcrion to Parallel Computing, 2" ed., PearsoD Edllcation Limited, England, 2003. Leighton F.T. Inlroduction ro ParaUel Algorithms and Architeclures. Morgan Kaufmann , San Maleo, CA, USA, 1992. Pritchard O. Matl1ematical Models of Oistributed Complltation, ProC. of OUG-7, ParaUel Programming on Transpule r Based Machine, TOS Press, pp. 25-36, 1988. Quinn M.J. Parallel Compuling: Theoly and Praclice. McGraw-H ill , New York, NY, USA, 1994. Roosta S.H. Paredlel Processing anc! ParaLlel Algorithms: Theroy and Compulation. SpringerVerl ag, New York, NY, USA, 2000. Tabak O. Multiprocessors. Prentice-Hali, Englewood Clilfs, NI, USA, 1990. Tabak O. Advanced MlIltiprocessors. McGraw-Hi ll , New York, NY, USA, 1991. Wilson G. Parallel Programmingfor Scientisls and Engineers. MIT Press, Cambridge, MA, USA, 1995.
4.9.
Preguntas de autoevaluación
P4.1 ¿Qué se entiende por procesamiento paralelo? El procesamiento paralelo es el método de organización de las operaciones en un sistema de computación donde más de una operación es realizada de manera sim ultánea.
P4.2 ¿Cuáles son las características principales de un sistema multiprocesador? 358
4.9. PREGUNTAS DE AUTOEVALUACIÓN
• Debe estar compuesto por dos
O
más procesadores.
• Los procesadores deben compartir el acceso a una memoria común. • Los procesadores deben compartir acceso a canales de E/S, unidades de control y di spositivos.
• El sistema es con trolado por un único sistema operatiyo. P4.3 ¿Qué tipos de plataformas de computación paralela se contemplan teniendo en cuenta su organización física? Sistemas de memoria compartida y sistemas de memoria distribuida. P4.4 ¿Que se entiende por paralelismo estructural? El paralelismo que se puede encontrar en la estructura de los datos. Esta clase de paralelismo permitirá la ejecución de procesos paralelos con idéntico modo de operación pero sobre distintas partes de los datos. P4.5 ¿En qué consiste la descomposición recursiva? El prob lema se divide en subproblemas que se resuelven de forma independi ente para, posteriormente, combinar sus resultados parcia les y obtener el resu ltado final. P4.6 ¿A qué se refiere la segmentación de datos como paradigma de programación paralela? Está basado en el paraleli smo funcional donde las diferentes partes de un programa pueden realizar distintas tareas de una manera COI1 CUlTente y cooperati va. P4.7 ¿Qué tareas se atribuyen al maestro en el paradigma Maestro/Esclavo? El maestro es el responsable de la descomposición del problema en pequeñas tareas, de di stribuir estas tareas entre el conjunto de procesadores esclavos y de recoger los resultados parciales obtenidos de cada esclavo para ordenarlos y obtener el resultado fi nal del problema. P4.8 ¿Cuándo conviene utilizar un balance de carga dinámico en un sistema Maestro/Esclavo? Cuando el número de tareas es mayor que el número de procesadores disponibles o cuando el número de tareas es desconocido al comienzo de la aplicación . P4.9 ¿En qué consiste el paradigma SPMD? Cada procesador ejecuta básicamente el mi smo código pero sobre distintas partes de los datos. P4.10 ¿Qué consecuencias tiene el fallo de un procesador en un sistema SPDM? Normalmente, el fa llo de un único procesador es sufi ciente para bloquear la aplicación, debido a que entonces ninglm procesador podrá avanzar más allá del punto de sincroni zación global. 359
INGENIERíA DE COMPUTADORES 11
P4.11 ¿Cuáles son los principales modelos de comunicación en sistemas paralelos? El espacio de direcciones único y compattido, y el paso de mensajes.
P4.12 ¿Qué parámetros caracterizan la velocidad de transferencia entre elementos de un sistema paralelo? La latencia de la red de interconexión y el ancho de banda.
P4.13 ¿Por qué está limitado el número de procesadores en sistemas de memoria compartida? Para gat'antizar la eficacia de esta at'quitectura es fundamenta l que el ancho de banda sea elevado, ya que en cada ciclo de instrucción cada procesador puede necesitar acceder a la memoria a través de la red de interconexión. Este hecho solo se satisface si no se encuentran vat'ios procesadores tratando de acceder al medio utilizado para la transmisión de datos simultáneamente, y por tanto se limita el número de los mismos.
P4.14 ¿Qué significado tienen las siglas UMA? Uniform Memory Access, es una at'quitectura donde el ti empo de acceso a memoria es el mismo para cualquier palabra accedida por un procesador.
P4.15 ¿Qué se entiende por escalabilidad? Es la capacidad del sistema para mejorar la potencia de cálculo cuando el número de componentes del mismo aumenta.
P4.16 ¿Qué propósito busca la incorporación de una memoria caché en un procesador? Incrementar el ancho de banda entre el procesador y su memoria local.
P4.17 ¿Cuál es la principal diferencia entre las arquitecturas UMA y NUMA? En la UMA el tiempo de acceso es uniforme, mientras que en la NUMA el tiempo de acceso a memoda es no uniforme dependiendo de si el acceso se reali za a la memoria local del procesador o a alguna memori a remota.
P4.18 ¿Cuáles son las operaciones básicas necesarias para comunicarse mediante paso de mensajes? Envío, recepción, identificación y número de patticipantes.
P4.19 ¿Puede emularse un sistema de paso de mensajes en un sistema de memoria compartida? Sí. Simplemente dividiendo el espacio de direcciones en fracc iones iguales, cada una asignada aun procesador, las acciones de envío y recepción de mensajes estarían representadas por la escritura y lectura de información en dichas fracc iones de memoria. 360
4.9. PREGUNTAS DE AUTOEVALUACIÓN
P4.20 ¿Qué es una red de interconexión estática? Es una red cuya topología queda definida de manera definitiva y estable durante la construcción de la máquina paralela. P4.21 ¿Qué diferencia una red lineal de un bus? El hecho de que en un momento dado puede realizarse más de una transferencia simu ltáneamente siempre que sea a través de enlaces diferentes (por ejemplo, uno a la izquierda y otro a la derecha). P4.22 ¿Cuál es el esquema de interconexión ideal para una red estática? La red completamente conectada, en la que cada procesador se comunica directamente con cualqu ier otro, de manera que los mensajes se envían en una única etapa o paso. P4.23 ¿Cuál es la principal desventaja de las topologías de red en árbol? Que las comunicaciones pueden verse comprometidas en un nodo cuando el número de procesadores es grande y se realizan comunicaciones entre procesadores situados en los ni veles superiores. P4.24 ¿Qué es la distancia de Hamming? Es el número total de posiciones de bits para los que las etiquetas de dos procesadores son diferentes. P4.25 ¿Cómo se define el ancho de banda de bisección? Es el menor volumen de comunicaciones pellnitidas entre dos ¡nitades cualesquiera de la red con igual número de procesadores. Así, es el producto del ancho de bisección y el ancho de banda del canal. P4.26 ¿A qué factor deben las redes multietapa su gran flexibilidad? La flexibilidad de las redes multietapa viene de la posibilidad de reconfigurar dinámicamente los modos de conmutación de sus diferentes etapas. P4.27 ¿Qué significa que una red sea bloqueante? Significa que ciertas permutaciones, o conexiones a través de la red, pueden a su vez bloquear otras conexiones. P4.28 ¿Qué tipo de permutación se usa en la red omega? La perm utación por barajamiento pedecto. P4.29 ¿Qué se entiende por sistema de memoria coherente? Vn sistema de memoria es coherente si el valor devue1to por una operación de lectura sobre una dirección de memoria es siempre el mismo valor que el almacenado por la última operación de escritura realizada sobre esa misma dirección, independientemente de qué procesador realice las operaciones. 361
INGENIERíA DE COMPUTADORES 11
P4.31 ¿Por qué la migración de procesos puede provocar incoherencia de memoria? Si por algu na razón el proceso es intercambiado a otro procesador antes de que las modificaciones realizadas se actualicen en la memori a pri ncipal, los datos q ue carg ue el proceso en la caché del nuevo procesador serán incoherentes con las modificaciones realizadas en el anterior procesador.
P4.32 ¿En qué se basa un sistema snoopy de coherencia de caché? Se basa en q ue cada procesador monitori za el tráfico de la re d en busca de transacciones para poder actualizar el estado de sus bloques de caché.
P4.33 ¿Qué condición debe tener un cluster para que sea denominado Beowulf? Que cada uno de sus componentes esté exclusivamente dedicado al cl uster.
P4.34 ¿Qué ventajas ofrece un switch frente a un hub para conectar los componentes de un cluster? Con un switch la transm isión de datos entre dos procesadores solo genera tráfico en el segmento correspondiente. E l ancho de banda no es compartido entre todos los procesadores conectados al switch por lo que cada procesadores dispone del 100 % del ancho de banda. El switch permite establecer cualquier número de interconexiones simul táneas entre sus puertos siempre y cuando no coincida el receptor.
P4.35 ¿Qué se entiende por deceleración en la ejecución de un programa sobre un cluster? Cuando el tiempo de ejecución del programa sobre el cluster se incrementa a medida que se aumenta el número de procesadores del mismo. Esto es deb ido a la mala parale li zació n de l programa, posiblemente por la gran cantidad de datos comprutidos entre procesadores.
P4.36 ¿Cuales son las dos principales bibliotecas de paso de mensajes? PVM (Parallel Virtual Machine) y MPI (Message Passing [nte/lace ).
P4.37 ¿A qué se denomina granuralidad gruesa? C uando un proceso está compuesto por un gran número de instrucciones secuenciales, es decir, instrucciones que no necesitan de la comunicación con otros procesos para ser ejecutadas.
P4.38 ¿Qué es el límite de Amdahl?
7'
El lím ite de Amdahl es siendo f la fracción de código no pru'alelizable del programa, y se define como el mayor factor de aceleración posible cuando el número de procesadores di sponibles tiende a infinito.
P4.39 ¿Qué define la eficiencia de un sistema paralelo? La fracción de ti empo que se utilizan los procesadores durante la computación, es decir, da una medida de lo adecuadamente que ban sido uti lizados los procesadores.
362
4.10. ACTIVIDADES
P4.40 ¿En qué consiste el balance de carga? En distribuir de una forma eq uitati va la carga computacional entre todos los procesadores disponibles y con e llo conseguir la máxima veloc idad de ejecución. P4.41 ¿Qué sistema de balance de carga ofrece mejores resultados? Aunque el balance de carga dinámico lleva consigo un a cierta sobrecarga durante la ejecución del programa, resulta un a alternativa mucho m ás efi ciente que el balance de carga estático. P4.42 ¿ Cnáles son los principales parámetros de la latencia de comunicación, es decir, del tiempo
empleado en transmitir un mensaje entre dos componentes de un sistema paralelo? El tiempo de inicialización, el tiempo de salto y el tiempo de transferencia por palabra. P4.43 ¿ Cómo afecta al coste de comunicación mediante memol'ia compartida el fenómeno de
hiperpaginación de caché en un sistema paralelo? Este problema se agudi za e n multiprocesadores ya que cada fallo de la caché puede provocar operaciones de coherencia de caché y comun icaciones entre procesadores.
4.10.
Actividades
A4.1 N ormalmente cuando se eval ua el rendimiento evalua mos la diferencia de rendimiento debido a un a mejora introducida. De manera más formal: Speedup debido a la mejora E =
TiempOúlIE
RendirnienfOcol/E
TlempOconE
RendinzientosinE
.
.-
En particular, nos referimos al speedup como una funcion del paralelismo de la máquina. Suponga que tiene un programa que reali za una cantidad fija de [¡'abajo, del que una fracción s debe rea li zarse de manera secuencial. El resto del trabajo puede ser paralelizado so bre P procesadores. Asu miendo que TI es el tiempo que tarda en ejecutar el programa en un único procesador, encontrar una fórmula para describir TI" como el tiempo que tarda en ejecutar e n P procesadores. Usar esto para encontrar una fórmu la para el límite s upe ri or del speedup potencial sobre P procesadores (esto es una variante de la Ley de Amdahl ). Explicar este límite superior. A4.2 D ibuje un a red baseline de 8 entradas y 8 salidas. Ex plique detallada mente el proceso de conso'ucción de la red. A4.3 Defina qué e ntie nde por una red o mega y dibuje una para 16 procesadores. Explique razonadamente la conmutación de cada conmutador de la red que ha dibujado para enviar un m ensaje del procesador 110 1 al banco de memoria 1000.
363
INGENIERíA DE COMPUTADORES 11
A4.4 A partir de la red estática de la siguiente fi gura:
1000
0001
l . ¿Qué tipo de red es? 2. Se desea transmitir un mensaje desde el procesador a = OI O1 al procesador b = 1100. Si se comienza a buscar el camino por el bit menos signifi cativo, exp lique razonadamente cuál es el camino que debe seguir el mensaje. 3. Defina que entiende por conectividad de arco y por ancho de bisección . Calcu le la conectividad de arco y el ancho de bi sección de la red de la fi gura.
A4.S Se di spone de un procesador que tarda 6 segundos en ejec utar un determinado programa . Sea = 0,3, donde f representa la fracción del programa que no puede dividirse en tareas paralelas. Si se considera que no hay sobrecarga cuando el programa se divide en tareas paralelas, ¿cuál es el tiempo de computación necesario para ejecutar el programa en 12 procesadores de las mi smas prestaciones que el original ?
f
A4.6 Para transmitir un mensaje de n bytes a través de H en laces de una red sin saturaci ón, que utili za el protocolo de almacenamiento y reenvío, el enrutamiento tarda H W+ (H - I )R , donde W es el ancho de banda del enlace y R es el tiempo de salto. En una red que utili ce el algoritmo clIl-Ihrough el tiempo sería W+ (H - 1)R. Si consideramos una red de tipo mesh cuadradada de 8 x 8 (ver figura adjunta), cada procesador con un retraso de 250 ns y con enl aces de 40 MB/s ¿cual es el tiempo de transferencia mínimo, máx imo y medio para un mensaje de 64 bytes? ¿y para un o de 256 bytes? Calcule los mismos tiempos para el caso del enrutami ento mediante el algoritmo cut-through.
364
4.10. AC TIVIDADES
D :Procesador
-
: Enl ace
A4.7 Con sidere un simple esquema de diferencias finitas en dos dimensiones en el que en cada paso cada punto de la matriz es actuali zado con la media ponderada de sus cuatro vecinos:
A [i, j] = A[i, j] - w(A[i - l ,j] + A[i + l , j ] + A[i, j - 1] + A[i, j + 1])
Todos los valores son números en coma flotante de 64 bits. Asumiendo que cada procesador calcula un elemento y la mauiz tiene tamaño 1024 X 1024, ¿qué cantidad de datos debe u'ansmitirse entre procesadores en cada paso? Explicar cómo se puede dividir este cálculo entre 64 procesadores para poder minimizar la cantidad de datos transmitidos, y calcular cuantos datos se deberían transmitir en cada paso. A4.8 Considere un multiprocesador de memOlia compartida distribuida. Considere un modelo simple de coste donde los accesos a la caché local tardan 10 ns, los accesos a memoria local tardan 100 ns y los accesos a memoria remota tardan 400 ns. Si ejecutamos en este sistema un programa paralelo correctamente balanceado con un 80 % de accesos a caché, 10 % de accesos a memoria local y 10 % de accesos remotos, ¿cuál será el tiempo efectivo de acceso a memoria? Si el cálculo tiene un límite de memoria, ¿cuál será la máxima tasa de cálculo? Considere el mismo programa ejecutándose en un sistema uniprocesador. Ahora el procesador tiene un ratio de acierto de caché del 70 % Yel 30 % de accesos a memoria local. ¿Cuál será la tasa efecti va de cálculo para un procesador? ¿Cuál será la tasa de cálculo? A4.9 Considere el enrotamiento de mensajes en un sistema paralelo que utiliza el algoritmo de aLInacenamiento y reenvío. En este sistema, e l coste de envío de un mensaje de tamaño In desde Porigell hasta P de.\·/il1o a través de un camino de longitud d es fs + /11' x d x 11'1.. Un método alternati vo para el e nvío de 365
INGENIERíA DE COMPUTADORES 11
un mensaje de tamaño 1/1 sería e l siguiente. El us uario divide e l mensaje en k partes, cada uno de tamaño y envía las distintas prutes una por una desde P origell hasta Pdeslillo' Para este lluevo método, encontrar una expres ión para el tie mpo de transferenc ia del mensaje de tamaño 111 hasta un destino situado a una di stancia de d sa ltos, teniendo en cuenta los sigui entes casos:
r.
• AsumiT que un mensaje puede enviarse desde P o";ge" tan pronto como e l mensaje an teri or ha alcanzado el sigui ente nodo en el camino . • Asumir que un mensaje puede e nviarse desde P a.-;ge" ún icamente cuando e l mensaje anterior ha alcanzado Pdesfillo, Para cada caso, analizar el comportamiento de la expresión cuando k varía entre l y 111 . A su vez, calcul ar el va lor óptimo de k si t, es muy grande, y si 1, = O.
A4.10 Calcular el d iámetro, número de enlaces y ancho de bisección de un d-cubo k-ario con fJ nodos. Defin.ir 1"" como la distancia media enu'e dos nodos de la red. Ca lcular 1"" para el d-cubo k-ario . A4.11 Las etiquetas de los nodos de un hipercubo d-dimensiona l utili zan d bits. Fij ando un bit k cualquiera de la etiqueta, demostrar que los nodos cuyas etiquetas difieren en los d - k bits restantes forman un subc ubo (d - k)-dimensional co mpuesto por 2(d-k) nodos. A4.12 Dibuje una red estática con los siguientes valores en sus parámetros: diámetro = 2, conectividad de arco = 4 Y ancho de bisección = 8. ¿Cuál selÍa e l coste de la red que ha dibujado? A4.13 Defina los siguientes conceptos de redes estáticas: distancia de Hamming y ancho de banda del canal. A4.14 Dibuj e una red butterfiy de 8 x 8 y describa el enrutamiento desde el procesado r 011 hasta el 101 y desde el procesador 000 hasta el 1 10.
366
Apéndice A
MEMORIA VIRTUAL
El sistema de memoria de los procesadores acnlales no está constituido únicamente por memOlia física, esto es, los registros, los niveles de memoria caché y la memoria RAM del procesador. Cuando un programa se ejecuta en un procesador, lo que realmente visualiza es la ex istencia de un espacio de direccionamiento muchísimo mayor que el proporc ionado por la memoria RAM. Es un espacio de direccionamiento lógico, físicamente inex istente, que se denomina memoria virtual. Hoy en el día, los procesadores se diseñan para trabajar con memoria virtual. La memoria virtual es un mecanismo por el que un procesador puede b'abajar con un espacio de direccionamiento mu y superior al ofertado por la memoria principal instalada físicamente junto al procesador. Gracias a ello, los programas se pueden ejecutar casi sin limitaciones en lo referente al espacio de direcc ionamiento con que cuentan ya que e l procesador percibe que todo el espacio de direccionamiento virtual de que di spone se encuentra residente en la parte de la memoria física asignada a ese programa y que el acceso es transparente. Esta ilusjón se genera mediante mecanismos de traducción de {a s direcciones de memoria virtual en direcciones reales y mecanismos de paginación bajo demanda que aseguran que la porción del espacio de direcciones virtuales que maneja el programa en un instante dado se encuentra alojado en la memoria principal y si no lo está, se le proporciona. De esta form a, cuando un programa se está ejecutando en el procesador, la memoria principal constitu ye solo una parte del espacio privado de direcciones virtuales de que di spone, estando el resto almacenado en los discos duros. En muchos aspectos, el funcionamiento de la memoria virtual es similar a la memori a caché ya que cuando se inlenta acceder a una direcc ión virtual que no está conten ida en
la memOlia principal se producen fa llos y es necesru'io reemplazar una parte del espacio de direcciones virtuales por otro almacenado en los discos duros. Por ejemplo, la aparición de arqu itecturas de 64 bits ha incrementado el espacio de direccionamiento virtual a 264 direcciones, lo que equivale a 17. 179.869. 184 Gbytes o 16 Ebytes de memoria RAM, algo mu y di fícil de alcanzar utili zando la tecnología di sponib le actualmente para construir la memoria
INGENIERíA DE COMPUTADORES 11
principal. Un ordenador personal dotado de un procesador de 32 bits y 4 Mbytes de memoria principal cuenta con un espacio de direcciones virtuales que es 1000 mayor que el espacio de direcciones físicas. Por ejemplo, el PowerPC 970 que soporta direcciones virtuales de 65 bits y maneja direcciones reales de 42 bits. Cuando se emplea memoria virtual, el procesador maneja direcciones virtuales que tiene que traducir para convertirlas en direcciones físicas y poder operar con la memoria principal. La traducción puede producir dos tipos de resultados: una dirección real de memoria (es decir, una dirección fís ica) si se encuentra esa parte del espacio de direccionamiento virtual ubicado en la memoria principal , o una indicación de que la dirección de memoria vi rtual no se encuentra en la memori.a principal. En este último caso se dice que se ha producido un fallo de página ya que la memoria virtual se organiza en bloques de tamaño fijo denominados páginas (observe la similitud con la memoria caché que se organiza en bloques). Si el sistema de memoria virtual utiliza bloques de longitud variable, los bloques pasan a denominarse segmentos y se habla de memoria segmentada. Hoy en día, la utilización de memorias segmentadas está en desuso debido a los problemas que plantea el reemplazo de bloques y cuando se habla de memoria virtual se entiende que se trata de una organización basada en páginas. El mecanismo de traducción de direcciones y protección de memoria se gestiona por una unidad hardware denominada Unidad de Manejo de Memoria o MMU (Memory Mallagement Un;t). Para acelerar todo este proceso de gestión de memoria, la mayoría de los procesadores ya incluyen una MMU en el mi smo chip, Como ya se ha indi cado, si la dirección de memoria vi.rtual se encuentra ubicada en la memoria principal, la MMU entrega una dirección física yel acceso a memoria se reali za de forma completamente normal. Por el contrario, si la dirección de memoria vi lt ual no se encuentra en la memoria principal entonces se genera un fallo de página. Los fallos de página disparan una excepción de fallo de página que provoca que el sistema operativo tome el control para resolver la situación. Debido a que el fall o de página provoca el acceso a los discos duros para transferir una página, esto da lugar a una penalización de cientos de miles de ciclos de reloj. Por este motivo, el sistema operativo suspende la ejecución del programa causante del fallo y entrega el procesador a otro proceso para que se ejecute mientras se realiza la lectura de la página. La traducción de direcciones se efectúa med iante una estructma de almacenamiento que contiene las equivalencias entre las direcciones virtuales y reales. Esta estructura se denomina rabia de páginas (pTE - Page Table EnlJy) y se almacena en la memoria principa l (Figura A. l). Ya que la memOlia virtual y la memoria principal se organ izan en páginas (de igual forma que la caché y la memoria principal se organizan en bloques), la traducción consiste, de forma simplificada, en obtener el número de página física que cOlTesponde a la página virt ual en que se encuentra la dirección virtual. Por ello, una diJ'ección virtual consta de dos partes o campos: el Número de página virtual y el Despla zamiento dentro de la página, siendo la longitud de este campo lo que detenl1Ína el tamaño de la página. Un campo Desplazamie/Uo de 10 bits de longitud indica que el tamaño de la página es de 1024 bytes o 1 Kbyte. En cada entrada de la PTE se almacena el número de la pági na de memoria física asociado a la pági na vutual y un conjunto de bits con información sobre el estado de la página en memolia principal. Algunos de estos bits son el de presencia (P) que indica si la página está en memoria principal , el bit 368
Dirección de memoria virtual
I
Número de págIna virtual
¡
Desplazam iento
I
Tabla de páginas
Dirección de memoria fisica
1
Número de página fisica
I
Desplazamiento _
j
j Memoria caché
1 Memoria principal
Figura A.l: Traducción de una dirección de memoria virtual en una dirección física.
de modificada (M) que especifica si la página ha sido escrita desde que fue traída y debe volcarse en el disco cuando sea reemplazada, el bit de referencia (R) que se utili za para saber qué página es la menos utilizada y, por tanto, la mejor candidata para cuando sea necesario sustituir una página de la memOlia principal ante un fallo de página, el bit de permiso de lectura (L), el bit de permiso de escritura (E) o el bit de inhibición (1) que pelmite evitar que las direcciones de esa página no se almacenen en caché por razones de rendimiento. Cuando se accede a la PTE para reali zar la traducc ión de una dirección virtual y en la entrada la página está marcada como no presente (bit P) en la memoria principal se produce el fallo de página y la consabida excepción de fallo de página. Solventar el problema implica buscar una página a reemplazar en la memoria principal (bit R) y si la página selecciona fue escrita (bit M) actualizarla en el di sco duro; tras esto ya se puede reemplazar la página seleccionada en memoria principal con la página de memoria virtual ubicada en el di sco duro. El proceso finaliza con la actualización de la PTE para reflejar el nuevo estado de la memoria principal.
Figura A.2: ESlruclura de una entrada en la tabla de páginas.
El problema que surge al almacenar la tabla de páginas en la memoria principal es que la necesidad de realizar dos accesos a memoria para las instrucciones de carga y almacenamiento. Un primer acceso
369
INGENIERíA DE COMPUTADORES 11
es a la memoria principal para consultar la PTE y reali zar la traducción y un segundo acceso, ya con la dirección física para la lectura o escritura del dato, se realiza a la caché. La solución adoptada por los procesadores actuales para reducir el tiempo de traducción es aplicar un mecanismo de memoria caché a la tabla de páginas. Esta memoria caché es palte de la MMU y se denomina TLB (Translalion Lookaside Bufl er - BujIer de Tradu cción Anticipada). Dirección de m emoria virtual
I
Etiqueta
1
Indice
1
Desplazamiento
I
I
Conjunto O Etiqueta
-
/1-1-1--
I
~
- -
ND pagina fís ica
- r-
1--
~ j
(0 Conjunto 1
/¡----.
-
.
¡--1--
I
--
--
~¡----.
1 N° página fislca
Desplazamiento Dirección de memori a flslca
Figura A.3: TLB asociati va por conjuntos de dos vías. La TLB, al igual que la memoria caché cl ásica, se puede organizar de varias formas: correspondencia directa, asoc iativa y asociati va por conjuntos. La Figura A.3 muesll'a un esquema de organi zación de la TLB asociati va por conjuntos de dos vías. Ahora, para acceder a la TLB , la diJ"ección de página de memoria virtual se di vide e n Eliqueta e Índice. El resultado dev uelto por la TLB es el número de página
370
fís ica y se concate na con el despl azamiento para completar la direcc ión de memoria física. Rec uerde que una organizac ión de la TLB con asociati vidad tota l im plica que el campo Índice desaparece queda ndo únicamente Ílldice y Desplazall1iento. Dado que la TLB es una memoria caché de la tabla de páginas que se almacena en la memoria principal, también pueden aparecer fallos de TLB. Un fallo de TLB se produce cuando la eq uivalencia entre el número de página de memori a vi.rtual y el de memoria física no está almacenada en la TLB y hay que rec uperar otra parte de la tabla de páginas que se' encuentra en la memoria principal. Esto provocará una detención de varios ciclos de reloj ya que la TLB debe acceder a memoria princi pal para reemplazar una parte de ell a y recomenzar la traducción.
Otro fa llo que se puede producir en la TLB es el ya conocido fallo de página. En este caso, no es que la equivalencia entre d irecciones virtuales y físicas no esté en la TLB sino que la equi valencia entre página virtual y pág ina física no elliste en la tab la de páginas. Esto signifi ca que la pági na virtual referenciada forma parte del espacio de direcciones virtuales que no está ubicado en la memoria plincipal , sino en los d iscos. Esto provoca la intervenció n del sistema operativo y su tratamiento implica: • Decidir qué página de las compre ndidas en la TLB hay que reemplazar. • Si la pági na a reemplazar f ue modificada, escribirla en el disco duro. • Copiar la nueva página desde el d isco duro a la memoria principal. • Actualizar la tabl a de páginas y la TLB. • Recomenzar de nuevo el acceso a la TLB para obtener la traducción. El res ultado de la trad ucción med iante TLB es una direcció n de memoria física que se emplea para acceder a la memoria caché. Por lo tanto, cualquier operació n de memoria en un computador dotado de memoria virtual impli ca, como mínimo, dos accesos a caché: uno a la TLB para realizar la traducción de virtual a física y un segundo acceso a la caché de datos o instrucciones utili zando el resultado de la TLB. La relación entre la TLB y la memoria caché se muestra en la Fi gura AA. En este ejemplo, la d irección de memori a virtual tiene una long itud de (v + g) bits, de los cuaJes v bits corresponden a la página de memoria virt ual y g bits establecen el desplazamiento dentro de la página. De ac uerdo con esto, el espacio de direcc ionamiento virt ual constaría de 2" páginas de 2c bytes de longitud . En la Figura AA, la TLB es asociativa por conjuntos por lo que el campo correspondi ente al número de página virtual se divide en Etiqueta (v - k bits) e Índice (k bits). E l acceso a la TLB ti ene como resultado un número de págin a fís ica de f bits que concatenados a los g bits del desplazamiento de página forman la dirección de memoria fís ica. Por lo tanto, el espacio de direccionamiento físico está fornlado por 2/ páginas de 28 bytes de longitud. Dado que el espacio virtual es muy superior al físico se cumple que 2/ < 2". La direcc ión de memoria física de (f + g) bits se emplea para acceder a la caché. El desglose de esta dirección en los campos Índice, Etiqueta y Desplazamiento para acceder a la caché depende de la organización de la memoria caché que se utilice. En el ejemplo de la Fi gura AA, la caché es asociativa por conjuntos con un tamaño del bloq ue de 2b bytes. 371
INGENIERíA DE COMPUTADORES 11 Dirección de memoria virtual N° pag ina virtual (v bits) Desplazamiento en pagina Etiqueta
Longitud: (v+g) bits
Indice
,
v· k
k
TLB
/
/
9
f Dirección de memoria física
N° página físical (f bits)
Desplazamiento en página Longitud : (f+9) bits
Etiqueta
/
e
Indice
Desplazamiento en bloque
i
b
Caché
Dalo ¡ Instrucción
Figura AA: Relación entre la TLB y la memoria caché. Para entender mejora la relación e ntre memoria virtual, memoria física y memoria caché, lo mejor es un sencillo ejemplo como el que refleja la Figura AS Suponga un procesador superescalar con Ull espacio de direccionamiento virtual de 32 bits (4 Gbytes) y un espacio de direccionamiento físico de 23 bits que equ ivale a una memoria principal de 8 Mbytes. Si se utiliza un tamaño de página de 2 Kbytes, esto significa que la longitud del desplazamiento debe ser g = 11 bits, lo que deja v = 2 1 bits de la dirección virtual para referenciar una página. Por lo tanto, el total de páginas de que consta el espacio de direccionamiento virtual es 2 21 = 2,097,152 páginas. Dado que se conoce el desplazamiento de página, g = 11 bits, y la longitud de una dirección fís ica, 23 bits, el número de páginas de que consta el espacio de direccionamiento físico es 2(23- 11) = 2 12 = 4096 páginas. Para almacenar la TLB el procesador utiliza una memoria caché de 8 Kbytes con asociativ idad por conjuntos de 2 vías y un tamaño de bloque de 2 bytes, suficiente para almacenar los f = 12 bits de longitud del número de página física y 4 bits con información de estado. Acceder a este tipo de memoria caché implica dividir los v = 21 bits del número de página viltual en Etiqueta e índice ya que el desplazamiento dentro del bloque se cons idera O. De acuerdo con estos datos, ya que cada conjunto de 2 vías ocupa 4 bytes, la caché tendrá 2 11 conjuntos por lo que el tamaño del índice será k = 11 bits y la Etiqueta (v - k)= 10 bits. La memoria caché del procesador también es asociativa por conjuntos de 2 vías con un tamaño de 128 Kbytes y bloq ues de 128 bytes. Esto implica un campo Desplazamiento en bloque de b = 7 bits, dejando para los campos Etiqueta
372
Dirección de memoria virtual Na página virtual (21 bits)
, Desplazamiento en pagina
Etiqueta
indice
'0
11
,,.
TLB Cache 8Kbytes Asociativa por conjuntos 2 Conjuntos de 2 bytes
{,
Dirección de memori a fisica
Na página físical (12 bits) [ Etiqueta
,
7
Longitud : 32 bits
Indice
,
Desplazamiento en página Desplazamiento en bloque
9
Longitud : 23 bits
7
Caché 128Kbytes Asociativa por conjuntos 2 Conjuntos de 2' bytes
Dato I Instrucción
Figura A.S: Ejemplo de dime nsionamie nto de la TLB y la memoria caché.
e Índice un total de 23 -7 = 16 bits. Dado que la caché tiene 128 Kbytes (2'7 ) y la asociati vidad es de 2 bloques de 128 bytes por conj unto (lo que im plica 2 8 bytes por conjunto), habrá 2(f7-8) = 2 9 conjuntos de 2 8 bytes, por lo que tamaño del Índice será i = 9 bits lo que dej a e = 16 - 9 = 7 bits para el campo Etiqueta. El esquema de la Figura AA corresponde a las etapas segunda y tercera de la unidad fun cional de cm·ga de un procesador superescalm·. En una unidad funcional de carga, en el segundo paso o segmento se realiza la traducción mediante TLB y en el tercer paso se accede a la memoria caché. Si no existen fa llos de TLB , fallos de página y fal los de bloque, el proceso de (raducción consume un ciclo y el acceso a la caché para la lectura de un dato otro ciclo. Para finalizar este apénd ice, se describe de fonTIa simplificada cómo funciona el sistema de memoria vi rtual del PowerPC 970. El PowerPC 970 utiliza un mecani smo de traducción de dos pasos basado en pági nas segmentadas. En el primer paso, una dirección efectiva de 64 bits, generada por software, se traduce en una dirección virtual de 65 bits mediante una tabla de segmentos almacenada en memori a principal. Las entradas de la tabla de segmentos, denominadas STEs (Segment Table E'lliY), contienen descri ptores de segmentos que definen las direcciones virtuales de los segmentos. En e l segundo paso, la dirección virtual de 65 bi ts se traduce en una dirección física de 42 bits mediante una tabla de páginas, 373
INGENIERíA DE COMPUTADORES 11
también residente en me moria pri ncipal y formada por PTEs (Page Table Enrl) /). Tanto la tabla de segmentos como la de páginas son utili zadas indistintamente para traducir direcciones de instrucciones y direcciones de datos. El tamaño de un segmento es de 256 Mbytes y el tamaño de la página puede oscilar entre los 4 Kbytes y los 16 Mbytes. Para reducir el impacto en e l rendimiento que producirían los accesos a me moria para consultar la tabla de segmentos y la de páginas, e l PowerPC 970 incluye dentro del chip del procesador dos memorias cachés para la tabla de segmentos y la tabla de páginas, denom.inadas SLB (Segmel'll Looka.l'ide Buffer) y TLB (Trallslaliol7 Lookaside BujIer), respectivamente. La SLB es una memoria caché de 64 entradas completamente asociativa, mientras que la TLB cuenta con 1024 e ntradas y es asociati va por conjuntos de 4 vías. La TLB es gestionada por hardware mientras que la SLB es gestionada por el sistema operativo.
o
}- 36 bits ~36 , I
,
16 bits
,
Número de página (dentro del segmento)
ESID
12 bits Desplazamiento (dentro de la pági na)
, 1
Dirección efectiva 64 bits
36 bits
~
16 bits
12 bits
V
37 bits 64 bits
64 bits,!
O } - 37 bits
1
VS ID
:}37 ,
5:~53 16 bits
64 12 bits Desplazamiento (dentro de la página)
Número de página (dentro del seg mento)
I
L
" 1
Dirección virtual 65 bits
I VPN
53 bilS1 1
D-ERAT
11
I-ERAT
1
~
12 bits
30 bits
42 bits
V
42 bits
V
O
{
30 bits
2~1,30 ,
.1 Número de página real
41 12 bits Desplazamiento (dentro de la página)
~
~
I
Dirección física 42 bits
RPN
Figura A.6: Esq uema de traducción de la MMU del PowePC 970.
La Figura A.6 corresponde al esquema de traducc ión de dü"ecciones efect ivas (65 bits) en físicas 374
(32 bits) que realiza la MMU del PowerPC 970. Una prute de la dirección efectiva, el ESID (Effeclil'e Segmenl lD) se emplea para acceder a las entradas STE de la SLB. Si se produce un fallo en la búsqueda en la SLB, la MMU accede a la tabla de segmentos almacenada en la memoria principal, y si se sigue produciendo un fa llo, se produce un fallo de acceso a memoria que gestiona el sistema operativo. Si la STE necesru·ia se locali za en la tabla de segmentos, se copia en la SLB y continúa el proceso de traducción. Cada STE de la SLB contiene un descriptor de un segmento y se uti liza prua generru· una dirección virtual de 65 bits. La diJ·ección virtual consta de un identifi cador de segmento virtual de 37 bits (Virf¡tal SeglllenllD - YSID). La concatenac ión del YSID y del índi ce de página, obtenido de la dirección efecti va, forma el número de página virtual (Virll/CII Page NUlllber - YPN) que se utili za pru·a acceder a la TLB que, como resultado, produce un número de página real (Real Page Number - RPN). Si se produce un faUo de TLB , se accede a la tabla de páginas en memoria principal prua recuperar la entrada que contenga Ull número de página real. La unión del número de página real junto con el despl azamiento obten ido de la dirección efectiva forma la dirección física de 42 bits. Con el fin de maximizru el rendimiento del mecanismo de trad ucción de direcciones, prute de la información contenida en la SLB y en la TLB se encuentra almacenada en un nuevo nivel de caché compuesto por dos pequeñas memorias: la I-ERAT (ln slru clion Ejjective-to-Real Address Tral1slation) y la D-ERAT (Data Effectil'e-to-Reol Address Tran slalion). Ambas memorias constan de 128 entradas y su organización es asociativa por conjuntos de dos vías. En la Figura A.6 se puede apreciar que las ERATs constituyen un mecani smo rápido de traducción cuando la dirección efecti va se encuentra almacena en una de las ERATs, evitando la penalización de acceso a la SLB y TLB. Las dos ERATs se rellenan a pruti r de las traducciones realizadas mediante la SLB y la TLB y son gestionadas por hardwrue. A diferencia del esquema secuencial de acceso TLB-memoria caché-memoria principal descrito previamente, el PowerPC 970 utiliza una vru·iante en la que la TLB y la SLB se encuentran por encim a de la caché Ll. Esto se debe a que el direccionamiento de la caché L l se basa en índi ces derivados de direcciones efectivas y de etiquetas derivadas de direcciones fís icas mientras que la caché de nivel 2 se dil·ecciona únicamente mediante direcciones físicas. Por esta razón, el procesador se comunica directamente con la caché L 1, la cual accede a la TLB y a la SLB cuando le es necesario.
375
,
Indice
CPE,14 CPI , I4 IPE, I4 MFLOPS, 16 MIPS, 16
Tcpu , 14 riesgo WAW, 35 acceso no uniforme a memoria, 308 acceso uniforme a memoria, 306 acoplamiento, 342 actualizar, 330 adelantamiento, 36, 80, 85 , 87, 177-179 AFAPr, 34 1 algOlitmo de planifi cación, 134 algoritmo de Tomas ulo, 50 alineamiento, 89 almacenamiento y reenvío, 353 Alpha 21264, 75 AMD Opteron, 76, 108, 11 5, 116 ancho de banda, 305, 318, 333 ancho de banda de bisección, 3 19 ancho de banda del canal, 3 19 ancho de bisección, 3 19 ancho de la segmentación, 74
ancho del canal, 3 18 anillo, 3 12, 33 1 an illo cordal , 312 antidependencia, 34 Architected Register File, 147 ARF, 147-153, 155, 161 , 164, 166, 171 , 183- 185, 187, 189, 192, 193 arquitectura de memoria privada, 333 arquitectura de paso de mensajes, 333 arquitectura lA-64, 214, 240 arquitectura segmentada genérica, 21 arquitectura SX, 275 ASG, 21 atajo, 40 back-end, 72, 77, 164,172 balance de carga, 349, 350 dinámico, 35 1 dinámico distribuido; 352 estático, 350 balance de carga descentralizado, 352 balance de carga dinámico, 303, 35 1 balance de carga dinámico centrali zado , 35 1 balance de carga dinámico distribuido, 352 balance de carga estático, 303, 350 bancos de memoria, 244, 260-263
INGENIERíA DE COMPUTADORES 11
bru'ajamiento perfecto, 323 barajam iento perfecto inverso, 324 beow ulf, 335 BH, 100, 102 BtuR, 103-105, 107 BHT, 105, 106 BIA , 98 bib liotecas de paso de mensajes, 34 1 bifurcación,24 bloque bás ico, 2 18-22 1, 227-229, 235-238 Branch History, 100 Branch History Register, 103 Branch History Table, 105 Branch Instruction Address, 95 Branch Tru'get Address, 95 Branch Target Address Cache, 95 Branch Target Buffer, 100 Branch Target Instruction, 98 B ranch Tru'get Tnstruction Buffer, 98 BTA,98- 100 BTAC, 95-98, LOO BTB, LOO- 102, 107, 108 BTI,98 BTTB,98 buffer de almacenamiento, 78 , 84, 124, 163, 170, 172- 174, 177, 178, 18 1, 189, 193 bufl'er de cargas, 178, 189, 193 buffer de distribución, 120, L21, 124-126, 134, 136, 152, 1SS, 189, 192 buffer de historia, 181, 183- 185, 187 buffer de pil a de retornos, 107 bufl'er de renombramiento, 147 buffer de reordenamiento, 78, 80, 84, 87, 110, 1 L8120, 147, 149, 152, 153, 163-166, 170, 172, 173, 183, L87 , 188, 192, 193 buffer de retirada, 170 buffer de terminación, 120, 12 1, 129, L34, 148, 152, 153, 163, L65-17I , L8 1, L83, 187, 192 378
buffers de almacenamiento de datos, SO buffers de coma flotante, SO bus, 306, 3 19, 320, 327, 331 , 334 bus de datos común , 52 bus de reenvío, 85, 13 1, 136, 137, 161 , 17 1, 177 código de baja densidad , 213 cód igo escalar, 25 1, 264, 265 código intermedio, 2 18-220, 222, 228, 229, 232, 233,236,237,241 ,274 código vectoria l, 25 1,255,266,268 ,272,273 caché de datos, 80, 13 1, 17 1, 177, 178 caché de instrucciones, 80,87,89 caché-coherent NUMA, 308 caché-only memory access, 308 camino de bypass, 40 carriles, 246-24 8 cauce Linea l, 20 ccNUMA,308 CDB,52 centinelas, 239 chaining, 256 ciclo de instrucción lógico, 25 Ciclos por Emi sión , L4 CISC, 1-6, 16, 58 cluster, 335 coherencia de caché, 308, 310, 327, 328 cola de emi sión, 12 1 cola de prefetch, 89, 90 COMA, 308, 309 Common Data Bus, 52 compresión de La traza, 228 computación de altas prestaciones, 337 computación paralela, 30 L Computadores MIMD, 7 Computadores M1SD, 7 Computadores SIMO, 7 Computadores SISO , 7 conecti vidacl , 3 18 conectividad de arco, 3 18
íNDICE
conmutador, 32 1, 323 consistencia de memoria, 170, 174 consistencia del procesador, 82, 87, 163, 188 contador de saturación, 102, 105 convoy, 255-259, 264-272 corte y continuación, 353 coste, 3 19, 348 coste mínimo, 91 ,92 cracked in stnlctions, 120 crossbar, 3 13, 3 19, 32 1,327 cut-through, 353
di vide y vencerás, 302 DSM , 308 Eficiencia, 13 efi ciencia, 347 ej ecución especu lativa, 46
Emisión, 48 . emisión con bloqueo, 134 emisión sin bloq ueo, 134 encadenamiento, 255-259,265,266,268-270, 272 epílogo, 225, 226 Escalabi li dad, 13 O-caché, 163,171, 174, 175, 177, 178 escalabilidad, 304, 307, 348 dígitos de control de fluj o, 353 escalabilidad algorítmica, 348 Decod ificación, 48 escalabilidad hardware, 348 decodificación, 72,78,83-85,87-89, 92,93, 11 2- esclitura directa, 328 12 1, 126, 129, 136, 137, 147, 149, 152, estación de reserva, 78, 80, 11 2, 12 1, 123- 126, 155, 183, 189, 192 129, 131, 132, 134- 137, 143, 147- 150, delayed branch, 46 152-154, 161, 177 dependencia de saliela, 35 estac iones de reserva, 52 dependencia verdadera, 34 estrella, 3 13 dependencias fal sas, 35 estructura de control , 301 descomposic ión especul ativa, 302 etapas básicas, 25 descomposición funcional, 302 etapas computacionales, 343 descomposición geométrica, 302 etiqueta especulativa, 110 descomposición iterati va, 302 EX, 25 descomposición rec ursiva, 302 excepción, 216, 239, 255 desemoUami ento de bucles, 219, 22 1, 222, 224, Execution, 25 225 Expans ibilidad, 13 diámetro, 3 18 fal se-shrui ng, 356 diagrama de segmentación, 26 fal sos positivos, 98 directorio centralizado, 332 fat tree, 3 14 directorio distlibuido, 332 fi chero de fut uro, 181 directOlios, 309, 332 fi chero de registros vectori ales, 245, 246 di stancia ele Hamming, 317 fi chero de registros de futuro, 183, 187 distancia de separación, 253 distribución, 72, 73, 78, 80, 84, 86, 92, 110, 11 2- fichero ele registros de renombrami ento, 147 11 5, 120, 12 1, 123- 126, 129,130, 134, Floating Point Operation Stack, 52 136, 137, 147, 152, 153, 155, 161 , 189, Floating Point Unit, 50 190, 192,378,380 Floating Registers, 50 379
INGENIERíA DE COMPUTADORES 11
FLOPS, 266, 268, 270, 272, 274 FLOS , 52 F lynn ,7 FPU, 50 FR , 50 FRF, 187 front-end , 72, 77, 120 Funcionalidad, 13 Futllre Register Fi le, 187 grado de acoplamiento, 30 I grado de la segmentación, 74 grafo de flujo de control , 2 18, 228 grafo de precedencia, 20 grafo de precedencia lineal, 20 granularidad, 30 1, 333, 342 gru po de lectura, 88, 89, 9 1, 93- 95 , 101 , 113, 11 5, 116,192 grupos de distribución, 84, 120
TLP,72, 190, 191 in-line decoding, 120 inercia del repertorio de instrucciones, 277 instrucción compleja, 11 6, 117 instrucción consumidora, 135, 2 19 instrucci ón especulada, 110, 193 instrucción productora, 136, 2 19 Jnstrucciones por Emisión, 14 instrucciones rotas, 120 Jnstruction Decoding, 25, 48 lnstruction Fetch, 25 lnstruction Jssue, 48 Instruction-Level Paralelism, 72 ¡ntel Core, 3, 11 6-1 18, 120,1 2 1, 19 1 interbloqueo entre etapas, 36 interrupciones precisas, 73 , 180, 182, 189 invalidar, 329 ltanium , 2 15, 240, 276 Kogge,2
hash, 104 Hennessy,4 historial de salto, 100- 102 historial global, 95, 103- 106 histori al local, 95, 103, 105 HPC,337 HPF, 34 1
límite de la ganancia, 17 lógica de activación , 13 1 lógica de asignación, 129, 131 , 135 lógica de atajo, 40 lógica de bypass, 40 Lógica de condición, 43 lógica de di stribución/emisión, 190 J-caché, 78, 8 1, 88-90, 93-95, 98, 99, 101 , 108, lógica de selecc ión, 13 1, 132 11 3- 11 6, 118, 189, 192 lanes, 246 IBM 360/9 1, 50 latencia, 26, 305, 333, 338, 352 IBM 7030, 2 latencia de nodo, 353 IBM 7030 Stretch, 2 ley de Amdahl , 17,345 IBM 704, 2 loop unrolling, 22 1 IBM 709, 2 IBM 70941, 2 máquinas de carga/almacenamiento, 21 1D, 25 , 48 máq uinas regi stro-registro, 2 1 IF, 25 Máxima Longitud del Vector, 245 macro-fusión, 11 8, 120 if-conversion, 235, 237 11, 48 MaestrofEsdavo, 302, 303 380
íNDICE
malla, 3 12 MEM ,25 memoria compartida, 30 1, 305 , 307, 3 10, 341 memoria compartida distribuida, 308 memoria de control, 4 memoria distribuida, 30 1, 333, 334 Memory access, 25 mesh, 3 14 mesh bidimensionales, 3 14
operaciones condicionadas, 235 , 237 , 238 operaciones internas, 11 7 orden, 323 organizac ión física, 30 I organi zación lógica, 30 l
paq uete, 255 paradigma, 302 paradigmas, 30 I paralelismo a nive l de datos, 302, 304 mesh cerrada, 3 14 paraleli smo algorítmico, 302 mesh cuadrado, 3 14 paraleli smo de datos, 11 mesh rectangular, 3 14 paralelismo de máqu ina, 74 mesh tridimensional , 3 14 paralelismo estructural, 302 micro-fusión, 11 8- 120 paralelismo fu ncional , I 1, 30 I m icrocoded instructions, 120 paraleli smo intrínseco, 190 microoperaciones, 11 6, 11 7 paso de mensajes, 305, 309, 3 10, 333, 340, 342, Millones de In strucciones por Segundo, 16 352 Mi lIones de Operaciones en Coma Flotante por patrón, 226, 227, 253 Segundo, 16 Partern History Table, 104 MTPS , 4 Patterson, 4 modelo de comunicación, 301, 305 Pentium 4,3 modo de direccionam iento, 2 1 Pentium m, 3 MPI , 3 10, 337, 34 1 PHT, 104- 107 MPPs,334 pila de direcciones de retorno, 107 multicomputadores, 334 pila de operaciones de coma fl otante, 52 multietapa, 320, 322 pipelining, 6, 18 multiprocesador, 300, 306, 320 planifi cación con lectura de operandos, 136, 138 MVL,245, 252, 254, 265, 266 planifi cación de cód igo, 33 planificación de hiperbloques, 228 núcl eo de ejecución dinámica, 77, 11 8, 191 planificación de superbloques, 228 número med io de instrucciones que se emiten, 14 planifi cación de trazas, 2 12, 2 19, 228, 234 Nivel de bucle, 11 planificación dinámica, 48 nivel de especulación, 11 0, 11 2 planificación estática, 47, 213, 224, 228, 240 Nivel de funciones, II planificación global , 219, 228 Nivel de instrucciones u operaciones, II planificación local, 219, 22 1, 224, 225 , 227, 235 Nivel de programas, I I planificación policíclica, 226 NUMA, 308 planificación sin lectura de operandos, 135 planificador dinámico, 134, 135, 145, 161 operaciones con guarda, 235 operaciones con predicado, 235, 236, 238 plataformas de computación paralela, 301 381
INGENIERíA DE COMPUTADORES 11
post-escritura, 328, 329 PowerPC 604, 76 PowerPC 970, 75 , 76, 83, 85, 87-89, 94, 107, 108, 11 2, 114- 116, 119-121,123 , 18 1 prólogo, 225 , 226 precisión de excepc ión, 180, 18 1, 183, 187 predecod ifi cación, 73, 89, 94, 113-116, 120 pred icción d inámica, 94, 95, 102 predicción estática, 95 pred icción híbrida, 107 pred ictor bimodal, 102, 107 predictor de Smith, 95 , 10 1, 102, 104 predictor gshare, 95 , 106, 107 prefetching, 89 prelectura, 73, 89 principios de localidad espacial y temporal, 6 procesador matricia l, 247- 249 procesador vectori al, 21 1, 212,242-249,253,254, 256,258,264- 266,274-276 procesadores encauzados, I8 procesadores masivamente paralelos, 334 procesamiento paralelo, 300, 340 Productividad , 13 profundidad de la segmentación , 19 programa paralelizador, 340 proyecto Stretch, 2 PVM, 310, 337, 341 rango de vida, 144, 145 RAR,35 RAS, 107, 108 Read After Read, 35 Read After Wri te, 34 rec ursos computac ionales, 301 red baseline, 325 red butterfl y, 326 red completamente conectada, 3 12 red de árbol grueso, 3 14 red de alineamiento, 89, 91 red de desplazami ento, 89, 9 1 382
red de interconexión , 3 11 red lineal, 3 11 red omega, 323 red sistólica, 3 12 redes {u"bol, 313 redes bloqueantes, 323 redes dinámicas, 311, 3 19 redes estáticas, 3 1I redes hipercubo, 314 redes no-bloqueantes, 3 13 redes un idimensionales, 3 11 registro de longi tud vectorial , 251 registro de máscara, 25 1, 254 registro del h.istori al de sa ltos, 103 registros arquitectóni cos, 80, 86, 87, 143, 144, 146, 147, 164, 181, 189 registros creados, 143 registros de coma flotante, 50 registros de renombramiento, 80, 146, 148, 155 registros físicos , 146 registros no creados, 146 relación de precedencia, 19 Rename register File, 147 rendimiento de un bucle, 264, 266 reorganización de código, 36 replicación de elementos, 6 Reservation Stations, 52 retorno de subrutina, 107, 108 riesgo, 30 riesgo de control , 42 riesgo de salto, 42 Riesgo de tipo RAW, 34 Riesgo de tipo WAR, 34 Riesgo de tipo WAW, 35 ri esgo esD"uctural, 31 Riesgos de control , 31 riesgos de segmentación, 30 Riesgos estructurales, 30 Riesgos por dependencia de datos, 30
íNDICE
riesgos por depe ndencias de da tos, 34 riesgos por depende ncias de datos en memoria, 35 riesgos por dependencias de datos en regiso'os, 35 RISC, 1-6, 16, 20, 58 RISC 1, 3 RISC-I,4 ROB , I18, 11 9, 189 RRF, 147- 162, 164-166, 171 , 177, 189, 192, 193 RS , 52 RSB , I07
tiempo de manque, 255, 256, 260, 26 1, 27 1 tiempo de CPU de un programa, 14 Tiempo de respuesta, 13 tiempo por elemento, 256, 260 tipo de para lelismo, 30 I TLP, 190 toro, 3 14 trace schedu ling, 228 UMA,306 unidad de carga/a lm acenamiento, 24 1, 245, 258, 260, 26 1,266,269,272 unidad de procesamiento esca lar, 244 unidad de procesam iento vectorial , 245 unidad funcional , 2 I 0-2 19, 22 1, 226, 236, 240, 24 1, 244-248, 255, 256, 258, 260, 265, 269-272, 275
salto, 24 salto retardado, 46 sa ltos en fal so, 11 3 sa ltos fantasma, 98 SOB,50 seccionamiento, 212, 252, 265 segmentación, 6, 18 VAX , 2 segmentación de cauce, 6 Vector Length Register, 25 I segmentación de datos, 302 Vector Mask, 251 segmentación dinámica, 76 veloc idad computacional, 342 segmentación rígida, 76 velocidad de emisión de tareas, 19 segmentación software, 2 12, 224-227 velocidad eJel canal, 3 I8 segmentación superescalar, 74, 76, 78-83, 120, 170 ventana eJe instrucciones, 120- I22, 135 selección de la traza, 228, 229 VLR, 25 1-254, 265 , 267, 269, 27 1, 272 Simple Program Mul tiple Data, 10 VM , 251 , 254 snoopy, 308, 33 1 solapamiento, 255,258 , 259,26 1,272, 273 WB,25 speedup, 16, 339, 343 Write After Read, 34 SPMD, 302, 304 Write After Write, 35 Store Data Bufrers, 50 Write-Back results, 25 store-and- forward, 353 strip mi ni ng, 252, 264 tab la de historial de pao'ones, 104 tabla de historial de sal tos, 105 taxonomía de Flynn, 7, 10 template-based decod ing, 120 Thread-Level Paralelism, 190 throughput, 13
383