Ingeniería de Computadores II
 8492948604, 9788492948604

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

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 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 :=(regvalor) % p2 : =NOT(pl )

235

INGENIERíA DE COMPUTADORES 11

pl,p2,reg,valor

P 1, p2 ,reg , valor

% p1:=(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