Your SlideShare is downloading. ×
Integración a muy gran escala y paralelismo VLSI
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Integración a muy gran escala y paralelismo VLSI

468
views

Published on

La tecnología VLSI (Very Large Scale Integration) integración en escala muy grande, ha tenido gran impacto en el diseño de circuitos tolerantes a fallos.

La tecnología VLSI (Very Large Scale Integration) integración en escala muy grande, ha tenido gran impacto en el diseño de circuitos tolerantes a fallos.

Published in: Devices & Hardware

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
468
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Integración a muy gran escala y paralelismo Ms. Ing. Jairo E. Márquez D. Introducción La tecnología VLSI (Very Large Scale Integration) integración en escala muy grande, ha tenido gran impacto en el diseño de circuitos tolerantes a fallos. Las ventajas introducidas son:  Incremento en la densidad de integración, con reducción de tamaño y peso de circuitos.  Reducción de la potencia consumida.  Reducción de coste en los circuitos integrados (CI). Todo esto ha hecho posible implementar propuestas redundantes en computación tolerante a fallos. “La integración en escala muy grande de sistemas de circuitos basados en transistores en circuitos integrados comenzó en los años 1980, como parte de las tecnologías de semiconductores y comunicación que se estaban desarrollando. Los primeros chips semiconductores contenían sólo un transistor cada uno. A medida que la tecnología de fabricación fue avanzando, se agregaron más y más transistores, y en consecuencia más y más funciones fueron integradas en un mismo chip. El microprocesador es un dispositivo VLSI. La primera generación de computadoras dependía de válvulas de vacío. Luego vinieron los semiconductores discretos, seguidos de circuitos integrados. Los primeros Chips contenían un pequeño número de dispositivos, como diodos, transistores, resistencias y condensadores (aunque no inductores), haciendo posible la fabricación de compuertas lógicas en un solo chip. La cuarta generación (LSI) consistía de sistemas con al menos mil compuertas lógicas. El sucesor natural del LSI fue VLSI (varias decenas de miles de compuertas en un solo chip). Hoy en día, los microprocesadores tienen varios millones de compuertas en el mismo chip.
  • 2. Hacia principios de 2006 se comercializaban microprocesadores con tecnología de hasta 65 nm, en 2010 se comercializan chipsets con tecnología de 32 nm.” [1] en la actualidad el tamaño se ha reducido en 27 nm aproximadamente. Sistema VLSI Actualmente, microprocesadores y otros dispositivos digitales son suficientemente compactos para implementar las técnicas redundantes vistas, incluso integradas en el propio CI [Circuito Integrado]. Sin embargo, existen también algunas desventajas:  Los errores predominantes están en el propio CI y no en los pins o el soporte como ocurría con SSI, MSI o LSI.  No se pueden asumir fallos simples, ya que una pequeña imperfección puede provocar fallos en una gran área del circuito.
  • 3.  Debido a la gran complejidad, se dan fallos de modo común, es decir, dos dispositivos idénticos pueden fallar a la vez y de la misma forma. Ej. Sistemas de duplicación con comparación. TECNOLOGÍA VLSI Recordemos que un CI implica que más de un componente se dispone sobre un material semiconductor, implementando las conexiones entre estos componentes sobre el propio material. La clasificación de los CI según la densidad de integración sería:  SSI (Small Scale Integration): Menos de 10 puertas lógicas o 30 transistores.  MSI (Medium Scale Integration): Entre 10-100 puertas lógicas o 30-300 transistores.  LSI (Large Scale Integration): Entre 100-10000 puertas lógicas o 300-30000 transistores.  VLSI (Very Large Scale Integration): Más de 10000 puertas lógicas o 30000 transistores. Las mayores ventajas de usar CI-VLSI son: Reducción del consumo. La mayoría de las conexiones se hacen en un solo chip con lo que se reducen las señales y perdidas por capacitancias parásitas. Fiabilidad. Al hacer las conexiones internas es más difícil que se rompan o deterioren, por lo que el ratio de averías es más bajo. Los fallos se detectan antes y se evita la propagación de estos. Reducción de peso y tamaño. La integración provoca una reducción de tamaño y peso físico en el circuito. Por lo que se puede poner más circuitería para implementar redundancia en menos espacio de manera más fiable y barata. Formalización del proceso de diseño. Se puede formalizar el proceso de diseño tolerante a fallos. Creando un conjunto de reglas y usando un
  • 4. estándar de construcción de bloques basado en VLSI. TIPOS DE AVERÍAS EN TECNOLOGÍA VLSI En una primera clasificación, los fallos en CI VLSI pueden dividirse en:  Debidos al proceso de fabricación: partículas extrañas, empaquetamiento inadecuado.  Debidos a perturbaciones externas: Campos electromagnéticos que pueden corromper el metal o romper conexiones. Se consideran 6 categorías. 1. SISTEMAS DE METAL Estos sistemas son las finas capas de metal (normalmente aluminio), que hay en los CI para interconectar los dispositivos que contiene. Debido al incremento en densidad y complejidad de los circuitos, es necesario disponer múltiples capas de este tipo para realizar las conexiones. Estas capas se separan mediante material aislante, con contactos para permitir al metal fluir entre las capas, permitiendo conexiones entre ellas. Las formas más comunes en que se producen fallos en estas son:  Roturas en láminas de metal debido a altas corrientes, que provocan conexiones abiertas.  Uniones de 2 o más líneas adyacentes que provocan resultados erróneos.  Corrosiones en el metal que degradan la conductividad del material. 2. DIFUSIÓN Es el proceso por el que ciertos tipos de impurezas se propagan hacia determinadas regiones. Por ej. En dispositivos MOS hacia el drenaje o surtidor. Este proceso puede introducir fallos en el CI:  Si las cantidades de impurezas no son correctas, puede afectar al comportamiento del dispositivo.  Si estas son implantadas en zonas erróneas del substrato.
  • 5. Este tipo de fallos puede provocar que la distribución de corrientes no sea uniforme a lo largo del conductor. 3. MATERIALES EXTRAÑOS Aunque en los procesos de fabricación se guardan grandes medidas de seguridad para que no se introduzcan partículas extrañas. Sin embargo, las altísimas densidades de integración provocan que sea imposible evitar intrusiones accidentales de partículas que provoquen fallos en la producción. 4. ÓXIDO Las partículas de óxido se usan en la fabricación de semiconductores como barrera para los dopantes en el proceso de difusión y como aislante. Posteriormente estas películas se retiran en el proceso de difusión. Tanto al aplicarlo como al retirarlo se pueden producir fallos por la alteración de impurezas. 5. EMPAQUETAMIENTO Empaquetar es el proceso de conectar las líneas del semiconductor con los pines del soporte que aloja el dispositivo. Este soporte suele ser: metálico, cerámico, plástico o de vidrio. Debe proteger al semiconductor de humedad y contaminantes, así como de golpes y vibraciones. De igual manera, los fallos que suelen darse son por: rotura de líneas, corrosión o degradación que degeneran en una pobre conductividad. 6. MONTAJE Antes de empaquetar el semiconductor, ha de montarse sobre un substrato metálico o cerámico para protegerlo. Pueden ocurrir fallos debido a la expansión del material del montaje por la aplicación de grandes temperaturas. Otro elemento atener en cuenta, es la DISTRIBUCIÓN DE FALLOS Mientras en SSI y MSI la mayor parte de los fallos son debidos a: empaquetamiento, montajes defectuosos o uniones del CI, LSI y VLSI los factores más importantes son el óxido y los fallos eléctricos
  • 6. Tabla 1. Distribución de fallos en MOS LSI. PROBLEMAS DE LA TECNOLOGÍA VLSI El principal problema radica en que los fallos son completamente distintos a los de los sistemas SSI, MSI y LSI. Centrándose más en el material semiconductor que en el encapsulado o pines. Debido a la complejidad se darán más errores en la etapa de diseño. Por otra parte al disminuir la tensión de alimentación se reduce el margen de ruido y se incrementan los fallos transitorios. En concreto los problemas específicos de esta tecnología son: - Averías en modo común: En general, una avería en modo común se produce cuando 2 o más dispositivos idénticos fallan de la misma forma y en el mismo instante de tiempo. Los fallos de este tipo hacen inoperativos sistemas redundantes o esquemas como sustitución con comparación. Existen múltiples razones que pueden provocarlo, como: fallos en la alimentación común a la que se conectan, alteraciones electromagnéticas o fallos de diseño. La tecnología VLSI potencia estas averías debido a:  Su complejidad, que provoca muchos errores de diseño.
  • 7.  La alta densidad de integración que provoca que módulos que se hallen físicamente muy cerca, por lo que un mismo fallo puede afectar a varios dispositivos.  La baja tensión de alimentación provoca que pequeñas alteraciones externas puedan afectar al sistema. En resumen una avería de modo común es aquella en la que un fallo simple afecta a 2 o más dispositivos, o distintos fallos afecten a la vez a 2 dispositivos de forma que el funcionamiento erróneo no pueda detectarse con métodos redundantes tradicionales. Más formalmente, si A y B son funciones implementadas por 2 módulos idénticos, y Z la función que deben producir ambos. Para la entrada I; A(I)=B(I)=Z(I), puede darse que un mismo fallo afecte a los dos módulos: Af(I)=Bf(I)<>Z(I) o distintos fallos: Af1(I)=Bf2(I)<>Z(I). - Incremento de los errores de diseño: Recordemos que existen 4 causas primarias de fallo:  Errores de implementación.  Errores de diseño.  Interacciones externas.  Defectos aleatorios en componentes. Hasta ahora habíamos considerado, que los errores de diseño se trataban con técnicas de evitación. Pero esto es factible solo en circuitos simples. Para circuito VLSI es necesaria la utilización de herramientas específicas de diseño. - Incremento de susceptibilidad a interferencias externas: Debido a las reducidas dimensiones de los circuitos VLSI, las líneas adyacentes pueden verse afectadas por el efecto de partículas. Igualmente las bajas tensiones de alimentación provocan que fluctuaciones en esta afecten en gran manera a los circuitos. TÉCNICAS REDUNDANTES EN ENTORNOS DE DISEÑO VLSI Se dividen estás técnicas en 4 categorías principales:  Duplicación con lógica complementaria.  Circuitos de autochequeo.  Arrays reconfigurables.
  • 8.  Aumento de rendimiento. Duplicación con lógica complementaria En las técnicas de duplicación con comparación, se duplican los módulos y comparan resultados. Esto presenta 2 problemas principales: a. El comparador puede averiarse. b. No podemos asegurar que no sucedan fallos del mismo tipo en el mismo instante de tiempo. Una solución a estos problemas puede ser la técnica que nos ocupa. Se basa en la implementación de un módulo con entradas de lógica positiva (es decir nivel alto +5V) y otro con lógica negativa (nivel alto 0V). Por otro lado se basa en la dualidad de las funciones booleanas. Si tenemos la función: 32 ' 1321 ),,( xxxxxxf  , Su función dual será: 32 ' 1321 )().,( xxxxxxfd  . Es decir, en álgebra booleana, la función dual se calcula intercambiando puertas AND por OR y 1s por 0s. También, se puede obtener fácilmente la función complementaria fd. Complementando f y sustituyendo cada variable por su complementaria Por ejemplo, para la función f: ' 32 ' 1321 ' )(),,( xxxxxxf  y por tanto: 32 ' 1 ' 3 ' 2 ' 1 ' 321 )().,().,( xxxxxxfxxxfd  Esta técnica puede usarse para implementar esquemas como duplicación con comparación, aplicando a un módulo las señales de lógica positiva y complementaría las de lógica negativa. Las ventajas son:  Los módulos son distintos, por lo tanto se reduce la posibilidad de un fallo en modo común.  Las tensiones son opuestas en cada módulo, por lo que un pegado de línea solo afectaría a uno de ellos. Por ejemplo de implementación, podemos ver la función: 3 ' 2 ' 1 ' 321321 ),,( xxxxxxxxxf 
  • 9. Con ))((),,( 3 ' 2 ' 1 ' 321321 xxxxxxxxxfd  Fig. 1. Duplicación con comparación usando lógica complementaria. Problemas que surgen:  El proceso de conversión de lógica positiva a negativa es muy complejo.  La implementación de la función dual dentro del mismo dispositivo puede ser inviable. Circuitos de autochequeo Como se ha visto, en esquemas como duplicación con comparación, un fallo en el comparador provocará que el circuito completo falle. Existen sistemas que no pueden permitir estos fallos. De ahí la importancia de diseñar comparadores y chequeadores de códigos capaces de detectar sus propios fallos sin la necesidad de estímulos externos. Conceptos de lógica de autochequeo Fallo seguro: Son circuitos que ante un fallo simple, producen el código correcto o un código no aceptable.
  • 10. Autochequeable: Son aquellos circuitos que contienen al menos un código de entrada válido, que produciría un código no aceptable a la salida si hay fallo en el circuito. Totalmente autochequeable: Son aquellos circuitos de fallo seguro y autotesteables. La estructura general de un circuito totalmente autochequeable (TSC) , sería: Fig. 2. Estructura básica de un circuito totalmente autochequeable. La función del chequeador es indicar si la salida del circuito es un código válido, además este se autochequea a si mismo. Debe ofrecer salidas complementadas de 2 bits si todo va bien y no complementadas si existe fallo. Esto detectaría los fallos por pegados a línea. Esta forma de salida se dice que posee la propiedad de código disjunto. El chequeador TSC más habitual es el de 2 carriles. Fig. 3. Diagrama de bloques básico de un chequeador de 2 carriles.
  • 11. Las salidas del circuito serán complementarias, si lo son las palabras de entrada y no hay fallos. Un ejemplo, es la implementación para entradas de dos bits sería: Fig. 4. Chequeador de 2 carriles totalmente autochequeable de 2 bits. Los códigos de entrada para este circuito deben tener ' 1100 y yxyx '  . Es fácil obtener las salidas: 10102 10101 yyxxe xyyxe   y si suponemos una entrada correcta con ' 1100 y yxyx '  . Las salidas serán: ' 10 ' 1 ' 0102 101 ' 0 ' 101 )( xxxxxxe xxxxxxe   Que como puede observarse son complementarias. Con la misma técnica puede comprobarse, como cuando las entradas no son complementadas, tampoco lo serán las salidas. Comprobemos que es TSC, demostrando que es de fallo seguro y autochequeable. Al estar separados los circuitos que generan las señales de error, cualquier fallo en las entradas provoca que las señales de error no sean complementarias, por lo que es de fallo seguro.
  • 12. Al ser el circuito no redundante, cualquier fallo en una línea afectará la salida al menos para un código de entrada, por lo que es autochequeable. Estos dispositivos se pueden conectar en cascada para construir comparadores de más bits. Fig. 5. Chequeador totalmente autochequeable de 8 bits con bloques de 2 bits. Arrays reconfigurables El desarrollo de la tecnología VLSI ha permitido la implementación eficiente de estructuras de tipo array para la computación paralela. Un solo chip puede contener miles de elementos de proceso conectados en forma de array. Sin embargo se plantean 2 problemas que resolver con técnicas de tolerancia fallos: 1. Un chip puede contener elementos erróneos, que necesariamente tienen que poder puentearse, para poder obtener resultados correctos en las operaciones paralelas. 2. Existen aplicaciones que necesitan que el array de elementos de proceso, se reconfigure caso de ocurrir un fallo.
  • 13. Existen 3 tipos de reconfiguración: a. Reconfiguración en tiempo de fabricación. b. Reconfiguración en tiempo de compilación. c. Reconfiguración en tiempo real. Reconfiguración en tiempo de fabricación y compilación. Ambas reconfiguraciones tienen atributos similares: - No requieren la interrupción del sistema para realizarse. - El tiempo de reconfiguración no esta limitado. La diferencia entre ambos sería el momento en el que se realizan las acciones de reconfiguración. En tiempo de fabricación se realiza después del proceso de fabricación y en principio es permanente. En tiempo de compilación se realiza cuando el sistema ya lleva un tiempo funcionando y puede repetirse, al no ser permanente. Los dispositivos con arrays como memorias, se pueden diseñar con numerosas técnicas de reconfiguración en tiempos de fabricación y compilación. Consideraremos 3 de ellos: a. El uso de repuestos de columnas o filas simple y la estrategia de sustitución en rizo. b. El uso de repuesto de filas y de columnas y la técnica de robo de fallo. c. El uso de múltiples repuestos de filas y columnas y el algoritmo de máxima reparación. Estrategia de sustitución en rizo El procedimiento redundante más simple es añadir una columna al array original. Sirviendo los elementos de este de repuesto para reemplazar los elementos de proceso erróneos del array original. El proceso consiste en el reemplazo de un elemento erróneo por su vecino. Repitiendo este proceso hasta la fila o columna de repuesto.
  • 14. Fig. 6. Ejemplo de un array de 4x4 reconfigurado con estrategia de sustitución en rizo. Como puede extraerse del ejemplo, para realizar el proceso de reconfiguración, un elemento (i, j), debe ser capaz de recibir información desde (i,j-2), (i-1,j-1) y (i-1,j+1) y proporcionarla a (i,j+2), (i+1,j-1) y (i+1,j+1).
  • 15. Fig.7. Elemento básico de interconexión para soportar sustitución en rizo. Una forma de implementar este esquema sería conectar entradas y salidas a multiplexores que puedan configurarse para encaminar la información. Estrategia de sustitución por robo de fallo El mayor problema de la estrategia anterior es que no puede manejar más que un fallo por fila o columna. En este caso se añade una fila y una columna de repuesto, luego en un array de NxN se pasaría a dimensiones (N+1)x(N+1). El algorítmo comienza en la posición (1,1) y rastrea filas de arriba a bajo de la misma manera que hacia la sustitución en rizo. Si una fila contiene más de un error, el fallo más a la derecha se reemplaza utilizando sustitución en rizo. El resto de fallos se sustituye por los elementos inmediatamente por debajo en el array.
  • 16. Fig. 8. Ejemplo de array 4x4 reconfigurado con robo de fallo. Estrategia de sustitución con máxima reparación Esta estrategia requiere disponer de múltiples filas y columnas de sustitutos. Se trata de intentar reemplazar fila y columnas, con elementos erróneos, por completo por las de repuesto. El algoritmo se basa en construir un grafo cuyos nodos son número de filas y columnas, y cuyas aristas unen columnas y filas que denoten una posición de elemento erróneo.
  • 17. Fig. 9. Array con elementos erróneos y su grafo. Se tratará de sustituir el nodo con mayor número de conexiones, es decir la columna o fila con más elementos erróneos, por una sustituta y así sucesivamente. La desventaja de este algoritmo es que no siempre es posible encontrar la solución para reparar el array.
  • 18. Reconfiguración en tiempo real Es la más complicada de las reconfiguraciones, ya que debe realizarse con el sistema en funcionamiento. Por tanto el tiempo que tarde en realizarse es un factor crítico. Hay dos tipos de técnicas: a. Basadas en eliminación sucesiva de filas y/o columnas, una vez detectado el fallo.  Eliminación sucesiva de filas.  Eliminación sucesiva de columnas  Eliminación alternada de filas y columnas. b. Basados en la corrección de información errónea.  Algoritmo basado en Tolerancia a fallos. Eliminación sucesiva de filas/columnas La idea básica es eliminar la fila donde se detecte el fallo. Luego el array tendrá una fila o columna de menos. Esta técnica es aplicable en arrays de tamaño variable y se implementa mediante switches programables que realizan el proceso de puenteo de filas o columnas. La ventaja de esta técnica es su simplicidad, por el contrario al eliminar filas o columnas enteras se desperdician muchos elementos de proceso útiles. Cuando
  • 19. es necesario que las dimensiones del array permanezcan fijas, puede combinarse esta técnica con la de introducción de filas/columnas de repuesto. Fig. 10. Reconfiguración de Array 4x4 utilizando eliminación sucesiva de filas.
  • 20. Eliminación alternada de filas y columnas La idea básica es alternar la eliminación de filas y columnas. Si el fallo anterior se había manejado con la eliminación de una fila, en el actual se usará la eliminación de columnas y viceversa. La ventaja sería la tolerancia a múltiples fallos y la desventaja, la complejidad que implica. Por ejemplo, sea un array de 3x3, que incluye también fila y columna de repuesto. Fig. 11. Reconfiguración con alternación y sustitutos.
  • 21. Algoritmo basado en Tolerancia a Fallos Esta técnica es usada en particular, para la comprobación de multiplicaciones de matrices y se basa en el uso de los checksums. Supóngase el desarrollo de la multiplicación de matrices AB=C con              2221 1211 2221 1211 y bb bb B aa aa A se trataría de añadir una fila con los checksums de A; 221232 211131 aaa aaa   y una columna a B: 222123 121113 bab bbb   Con lo que A’B’=C’ quedaría:                           333231 232221 131211 232221 131211 3231 2221 1211 ccc ccc ccc bbb bbb aa aa aa Siendo        2221 1211 cc cc C la matriz resultado y 323133221232211131222123121113 ,,,, ccccccccccccccc   Por lo que será sencillo detectar un fallo en un elemento de proceso gracias a los checksums. AUMENTO DE RENDIMIENTO Una aplicación importante de las técnicas redundantes en el diseño en entornos VLSI es el aumento del rendimiento de estos CI. Definiendo rendimiento como la cantidad de dispositivos fabricados que funcionan bien respecto al total. En algunos casos es de solo el 90%. Debido a este habitual malfuncionamiento de un porcentaje considerable de dispositivos, es importante la inclusión de redundancia en estos. Se han desarrollado múltiples modelos, pero la mayor parte coinciden en: a. Las averías en CI son el resultado de los llamados defectos puntuales. Estos se localizan en áreas del CI que solo suelen afectar a un módulo de este. b. Un defecto puntual simple hará el chip inoperativo, a menos que se incluya algún tipo de redundancia.
  • 22. c. Los defectos puntuales siguen una distribución aleatoria en sentido físico. Es decir, el número de defectos en un área del dispositivo es una variable aleatoria. Los modelos más simples asumen que la probabilidad p de que un chip este libre de defectos es DA ep   , siendo A el área del chip y D el número de defectos esperado por unidad de área. Gracias a la modelización puede estudiarse de que forma aumenta el rendimiento de los CI la inclusión de determinados tipos de redundancia. Pudiendo así elegir la técnica adecuada. Computación paralela [2] La computación paralela es una técnica de programación en la que muchas instrucciones se ejecutan simultáneamente. [2] Se basa en el principio de que los problemas grandes se pueden dividir en partes más pequeñas que pueden resolverse de forma paralela (no es lo mismo que concurrente). Existen varios tipos de computación paralela: paralelismo a nivel de bit, paralelismo a nivel de instrucción, paralelismo de datos1 y paralelismo de tareas2 . Durante muchos años, la computación paralela se ha aplicado en la computación de altas prestaciones, pero el interés en ella ha aumentado en los últimos años debido a las restricciones físicas que impiden el escalado en frecuencia. La 1 Paralelismo de datos es un paradigma de la programación concurrente que consiste en subdividir el conjunto de datos de entrada a un programa, de manera que a cada procesador le corresponda un subconjunto de esos datos. Cada procesador efectuará la misma secuencia de operaciones que los otros procesadores sobre su subconjunto de datos asignado. En resumen: se distribuyen los datos y se replican las tareas. Idealmente, esta ejecución simultánea de operaciones, resulta en una aceleración neta global del cómputo. El paralelismo de datos es un paradigma suficientemente adecuado para operaciones sobre vectores y matrices, dado que muchas de ellas consisten en aplicar la misma operación sobre cada uno de sus elementos. 2 Paralelismo de tareas es un paradigma de la programación concurrente que consiste en asignar distintas tareas a cada uno de los procesadores de un sistema de cómputo. En consecuencia, cada procesador efectuará su propia secuencia de operaciones. En su modo más general, el paralelismo de tareas se representa mediante un grafo de tareas, el cual es subdividido en subgrafos que son luego asignados a diferentes procesadores. De la forma como se corte el grafo, depende la eficiencia de paralelismo resultante. La partición y asignación óptima de un grafo de tareas para ejecución concurrente es un problema NP-completo, por lo cual en la práctica se dispone de métodos heurísticos aproximados para lograr una asignación cercana a la óptima. Sin embargo, existen ejemplos de paralelismo de tareas restringido que son de interés en programación concurrente. Tal es el caso del paralelismo encauzado, en el cual el grafo tiene forma de cadena, donde cada nodo recibe datos del nodo previo y sus resultados son enviados al nodo siguiente. El carácter simplificado de este modelo permite obtener paralelismo de eficiencia óptima. Recuperado el 29 de septiembre de 2012. http://es.wikipedia.org/wiki/Paralelismo_de_
  • 23. computación paralela se ha convertido en el paradigma dominante en la arquitectura de computadores, principalmente en los procesadores multinúcleo. [3] Sin embargo, recientemente, el consumo de energía de los ordenadores paralelos se ha convertido en una preocupación. [4] Fig. 12. La supercomputadora Cray-2 fue la más rápida del mundo desde 1985 hasta 1989. Los ordenadores paralelos se pueden clasificar según el nivel de paralelismo que admite su hardware: los ordenadores multinúcleo y multiproceso tienen varios elementos de procesamiento en una sola máquina, mientras que los clusters, los MPPy los grids emplean varios ordenadores para trabajar en la misma tarea. Los programas de ordenador paralelos son más difíciles de escribir que los secuenciales [5] porque el paralelismo introduce nuevos tipos de errores de software, siendo las condiciones de carrera los más comunes. La comunicación y la sincronización entre las diferentes subtareas son típicamente las grandes barreras para conseguir un buen rendimiento de los programas paralelos. El incremento de velocidad que consigue un programa como resultado de la paralelización viene dado por la ley de Amdahl.[6]. Nota1: La computación concurrente es la simultaneidad en la ejecución de múltiples tareas interactivas. Estas tareas pueden ser un conjunto de procesos o hilos de ejecución creados por un único programa. Las tareas se pueden ejecutar en una sola unidad central de proceso (multiprogramación), en varios procesadores o en una red de computadores distribuidos. La
  • 24. programación concurrente está relacionada con la programación paralela, pero enfatiza más la interacción entre tareas. Así, la correcta secuencia de interacciones o comunicaciones entre los procesos y el acceso coordinado de recursos que se comparten por todos los procesos o tareas son las claves de esta disciplina. Nota 2: “En teoría de la complejidad computacional, la clase de complejidad NP- completo [nondeterministic polynomial time ("tiempo polinomial no determinista")] es el subconjunto de los problemas de decisión en NP tal que todo problema en NP se puede reducir en cada uno de los problemas de NP-completo. Se puede decir que los problemas de NP-completo son los problemas más difíciles de NP y muy probablemente no formen parte de la clase de complejidad P. La razón es que de tenerse una solución polinómica para un problema NP-completo, todos los problemas de NP tendrían también una solución en tiempo polinómico. Si se demostrase que un problema NP-completo, llamémoslo A, no se pudiese resolver en tiempo polinómico, el resto de los problemas NP-completos tampoco se podrían resolver en tiempo polinómico. Esto se debe a que si uno de los problemas NP-completos distintos de A, digamos X, se pudiese resolver en tiempo polinómico, entonces A se podría resolver en tiempo polinómico, por definición de NP-completo. Ahora, pueden existir problemas en NP y que no sean NP- completos para los cuales exista solución polinómica aun no existiendo solución para A. Como ejemplo de un problema NP-completo encontramos el problema de la suma de subconjuntos que se puede enunciar como sigue: dado un conjunto S de enteros, ¿existe un subconjunto no vacío de S cuyos elementos sumen cero? Es
  • 25. fácil verificar si una respuesta es correcta, pero no se conoce mejor solución que explorar todos los 2n -1 subconjuntos posibles hasta encontrar uno que cumpla con la condición.” [7] Algoritmo paralelo [8] En las ciencias de la computación, un algoritmo paralelo, en oposición a los algoritmos clásicos o algoritmos secuenciales, es un algoritmo que puede ser ejecutado por partes en el mismo instante de tiempo por varias unidades de procesamiento, para finalmente unir todas las partes y obtener el resultado correcto. Algunos algoritmos son fácilmente divisibles en partes; como por ejemplo, un algoritmo que calcule todos los números primos entre 1 y 100, donde se podría dividir los números originales en subconjuntos y calcular los primos para cada uno de los subconjuntos de los números originales; al final, uniríamos todos los resultados y tendríamos la solución final del algoritmo. Otro ejemplo, puede ser el cálculo de Pi en paralelo. Por el contrario, a veces los problemas no son tan fácilmente paralelizables, de ahí que estos problemas se conozcan como problemas inherentemente secuenciales. Como ejemplo de estos métodos tendríamos los métodos numéricos iterativos como el método de Newton o el problema de los tres cuerpos. Por otro lado, algunos problemas son difícilmente paralelizables, aunque tengan una
  • 26. estructura recursiva. Como ejemplo de esto último tendríamos la búsqueda primero en profundidad en un grafo. Los algoritmos paralelos son importantes porque es más rápido tratar grandes tareas de computación mediante la paralelización que mediante técnicas secuenciales. Esta es la forma en que se trabaja en el desarrollo de los procesadores modernos, ya que es más difícil incrementar la capacidad de procesamiento con un único procesador que aumentar su capacidad de cómputo mediante la inclusión de unidades en paralelo, logrando así la ejecución de varios flujos de instrucciones dentro del procesador. Pero hay que ser cauto con la excesiva paralelización de los algoritmos ya que cada algoritmo paralelo tiene una parte secuencial y debido a esto, los algoritmos paralelos puedes llegar a un punto de saturación (ver Ley de Amdahl, esta se explica en clase). Por todo esto, a partir de cierto nivel de paralelismo, añadir más unidades de procesamiento puede sólo incrementar el coste y la disipación de calor. El coste o complejidad de los algoritmos secuenciales se estima en términos del espacio (memoria) y tiempo (ciclos de procesador) que requiera. Los algoritmos paralelos también necesitan optimizar la comunicación entre diferentes unidades de procesamiento. Esto se consigue mediante la aplicación de dos paradigmas de programación y diseño de procesadores distintos: memoria compartida o paso de mensajes. La técnica memoria compartida necesita del uso de cerrojos en los datos para impedir que se modifique simultáneamente por dos procesadores, por lo que se
  • 27. produce un coste extra en ciclos de CPU desperdiciados y ciclos de bus. También obliga a serializar alguna parte del algoritmo. La técnica paso de mensajes usa canales y mensajes pero esta comunicación añade un coste al bus, memoria adicional para las colar y los mensajes y latencia en el mensaje. Los diseñadores de procesadores paralelos usan buses especiales para que el coste de la comunicación sea pequeño pero siendo el algoritmo paralelo el que decide el volumen del tráfico. Finalmente, una subclase de los algoritmos paralelos, los algoritmos distribuidos son algoritmos diseñados para trabajar en entornos tipo clusters y de computación distribuida3 , donde se usan otras técnicas, fuera del alcance de los algoritmos paralelos clásicos. Procesamiento secuencial y paralelo. Tareas, ordenadores y cerebro [9]4 3 La computación distribuida o informática en malla, es un modelo para resolver problemas de computación masiva utilizando un gran número de ordenadores organizados en racimos incrustados en una infraestructura de telecomunicaciones distribuida. Un sistema distribuido se define como: una colección de computadoras separadas físicamente y conectadas entre sí por una red de comunicaciones distribuida; cada máquina posee sus componentes de hardware y software que el usuario percibe como un solo sistema (no necesita saber qué cosas están en qué máquinas). El usuario accede a los recursos remotos (RPC) de la misma manera en que accede a recursos locales, o un grupo de computadores que usan un software para conseguir un objetivo en común. Los sistemas distribuidos deben ser muy confiables, ya que si un componente del sistema se descompone otro componente debe ser capaz de reemplazarlo, esto se denomina tolerancia a fallos. Características 1. Para cada uno de los usuarios debe ser similar al trabajo en el Sistema Centralizado. 2. Seguridad interna en el sistema distribuido. 3. Se ejecuta en múltiples Computadoras. 4. Tiene varias copias del mismo Sistema Operativo o de diferentes Sistemas Operativos que proveen los mismos servicios. 5. Entorno de trabajo cómodo. 6. Dependiente de redes (LAN, MAN, WAN, etc.). 7. Compatibilidad entre los dispositivos conectados. 8. Transparencia (El uso de múltiples procesadores y el acceso remoto debe ser invisible).2 9. Interacción entre los equipos. 10. Diseño de software compatible con varios usuarios y sistemas operativos. El tamaño de un sistema distribuido puede ser muy variado, ya sean decenas de hosts (red de área local), centenas de hosts (red de área metropolitana), y miles o millones de hosts (Internet); esto se denomina escalabilidad. Fuente de consulta. Computación distribuida. http://es.wikipedia.org/wiki/Computaci%C3%B3n_distribuida 4 Con permiso del autor para modificación del contenido.
  • 28. El procesamiento secuencial o paralelo tiene una importancia trascendental en la eficiencia de los procesos que se realizan. Esto incluye los procesos realizados por el cerebro, por los ordenadores o por distintas organizaciones. Pero es importante fijarse en las tareas. Unas se pueden paralelizar y otras no. Fig. 13. Representación de tareas en procesamiento. Se produce un procesamiento secuencial cuando una tarea va después de otra. Es un proceso lento en el que si una tarea se retrasa, el sistema completo debe esperar. La ventaja es que es fácil de entender y de implementar. En el procesamiento paralelo, varios procesos ocurren al mismo tiempo mejorando el rendimiento general del sistema. Su contrapartida es la complejidad. No siempre se puede paralelizar una tarea. Aunque se pueda, no siempre es fácil hacerlo. En principio, cuantos más nodos actúen en paralelo, más rápido ira el sistema. Hasta cierto punto. Lo común es que haya un límite en que añadir más nodos no aumente la eficiencia, sino que incluso la reduzca. Normalmente las tareas en paralelo tienen una fase secuencial al principio en la que se dividen las tareas y otra al final en la que consolidan resultados. Tareas secuenciales.
  • 29.  Leer una novela (obligatoriamente una página detrás de otra, si no, el resultado varía).  Consultar el saldo, dar dinero, actualizar el saldo (en un cajero automático)  Ver a alguien, reconocerle, preguntarle por su familia. Tareas paralelas  Consultar entra varias personas palabras en la enciclopedia (personas en paralelo)  Contar los votos en un proceso electoral (mesas en paralelo).  Buscar los “López” en una base de datos. (se divide la base de datos en trozos y se busca en paralelo).  Reconocer a una persona. Se analizan los rasgos faciales, el movimiento, los gestos, la voz, la entonación en paralelo. Ordenadores Haciendo de la necesidad virtud, los ordenadores se han movido del procesamiento secuencial al paralelo. Hace tiempo que la miniaturización de los componentes HW está llegando a su fin. Cuanto más pequeños los chips, más rápidos y fiables. Pero también se calientan más. Si no puedo fabricar procesadores más rápidos ¿qué puedo hacer? La respuesta es: poner más. Así, los chips actuales han pasado de ser de 1 core a multicore (procesador se entiende a veces como core o unidad de proceso CPU y a veces como chip o pieza de HW visible que con patillas se engancha a la placa base). Los actuales chips son de 2, 4 u 8 cores. Pero hacer trabajar a 8 cores supone ejecutar tareas en paralelo. Existen dos tipos de soluciones: trabajar con varias tareas distintas en paralelo: una busca en internet, otra dibuja en la pantalla, otra calcula un gráfico… La otra posibilidad es que una tarea se descomponga en pasos paralelos que se ejecuten simultáneamente. Que como se sabe esto es difícil. La programación paralela puede ser muy compleja, muchas tareas no lo permiten y los resultados no siempre son buenos (no escalan bien, es decir, a partir de cierto punto, a más cores, no hay más rendimiento). Así que es muy posible que
  • 30. un flamante chip de 8 procesadores tenga inactivos muchos de ellos la mayor parte del tiempo. Los superordenadores son ordenadores con decenas de miles de procesadores en paralelo que procesan petaflops y consumen megavatios. Cerebro El cerebro es un órgano de procesamiento de información masivamente paralelo. Cientos de miles de millones de neuronas actúan simultáneamente de una forma en la que cualquier producto humano (superordenadores) palidece en comparación. Cada retina tiene millones de conos y bastoncillos que perciben la luz, la procesan y la envían a través del nervio óptico de forma simultánea. La corteza visual procesa de forma paralela esta información para reconocer puntos, rayas, rayas orientadas, rayas orientadas en movimiento, objetos, caras… Sin perjuicio de que otras áreas y neuronas puedan mantener el equilibrio corporal, escuchar una conversación. El cerebro también procesa la información en serie puesto que hay tareas que deben de procesarse en serie. Así, primero se percibe, luego se decide y luego se ejecuta. Es muy notable que somos conscientes algunos milisegundos después de haber tomado una decisión de modo que un observador con el debido aparataje puede conocer nuestra decisión antes que nosotros. Cuando llegamos al pensamiento lógico, este es estrictamente secuencial, convirtiéndose en un cuello de botella. Por ejemplo al realizar una operación
  • 31. matemática. Así mientras podemos reconocer una cara en milisegundos, invertimos muchos segundos en realizar una multiplicación compleja o fracasamos por completo. El proceso secuencial del cerebro es más evidente aún en el paradigma de interferencia de tareas donde una tarea dificulta o impide la realización de otra, porque querámoslo o no, sólo podemos tomar una decisión al tiempo. Arquitectura en pipeline Unidades centrales de procesamiento (CPU) son impulsadas por un reloj. Cada pulso de reloj no es necesario hacer la misma cosa, sino la lógica de la CPU dirige pulsos sucesivos a diferentes lugares para realizar una secuencia útil. Hay muchas razones que la ejecución completa de una instrucción de máquina no puede suceder al mismo tiempo. Por ejemplo, si un pulso de reloj gestiona un registro o comienza un cálculo, será necesario algún tiempo para que el valor sea estable a las salidas del registro o para que el cálculo sea completo. Es importante anotar, que una instrucción de lectura de una unidad de memoria no puede realizarse al mismo tiempo que una instrucción que se ejecuta en la misma unidad de memoria. Con base en lo anterior, se establece un número de pasos relacionados a la arquitectura del sistema. Por ejemplo, para un pipeline RISC, comprende: 1. Recuperación de instrucciones 2. Instrucción, descifrado y busca de registros 3. Ejecutar 4. Acceso a la memoria 5. Registrarse y escribir de nuevo Como la tubería se hace "más compleja" (con un mayor número de pasos dependientes), un paso dado puede ser implementado con un circuito simple, que puede hacer que el reloj del procesador funcione más rápido. Nota: Un procesador se dice que es de plena conexión si se puede obtener una instrucción en cada ciclo. En la medida en que algunas instrucciones o condiciones requieren algunos retrasos que impiden ir a buscar nuevas instrucciones, el procesador no está totalmente canalizado. La arquitectura en pipeline (basada en filtros) consiste en ir transformando un flujo de datos en un proceso5 comprendido por varias fases secuenciales, siendo la entrada de cada una la salida de la anterior. 5 Un proceso es un programa en ejecución, donde la unidad de actividad se caracteriza por la ejecución de una secuencia de instrucciones, un estado actual, y un conjunto de recursos del sistema asociados.
  • 32. Esta arquitectura es muy común en el desarrollo de programas para el intérprete de comandos, ya que se pueden concatenar comandos fácilmente con tuberías (pipe). También es una arquitectura muy natural en el paradigma de programación funcional, ya que equivale a la composición de funciones matemáticas. “Una tubería (pipe, cauce o '|') consiste en una cadena de procesos conectados de forma tal que la salida de cada elemento de la cadena es la entrada del próximo. Permiten la comunicación y sincronización entre procesos. Es común el uso de buffer de datos6 entre elementos consecutivos. 6 Un buffer (o búfer), es un espacio de memoria, en el que se almacenan datos para evitar que el programa o recurso que los requiere, ya sea hardware o software, se quede sin datos durante una transferencia. Normalmente los datos se almacenan en un buffer mientras son transferidos desde un dispositivo de entrada (como un ratón) o justo antes de enviarlos a un dispositivo de salida (como unos altavoces). También puede utilizarse para transferir datos entre procesos, de una forma parecida a los bufferes utilizados en telecomunicaciones. Un ejemplo de esto último ocurre en una comunicación telefónica, en la que al realizar una llamada esta se almacena, se disminuye su calidad y el número de bytes a ser transferidos, y luego se envían estos datos modificados al receptor. Los buffers se utilizan, a menudo, conjuntamente con E/S de hardware, tal como unidades de disco, enviar o recibir datos a/o desde una red, o reproducción de sonido. Una línea a una montaña rusa en un parque de atracciones comparte muchas similitudes. Las personas que viajan en la montaña llegan, a menudo, a un ritmo desconocido y variable, pero la montaña rusa será capaz de cargar personas de golpe (tal como llegan se van montando). La zona de la cola actúa como un buffer: un espacio temporal donde los que deseen viajar deben esperar a que el viaje esté disponible. Los buffers utilizan generalmente un método FIFO (primero en entrar, primero en salir), es decir, la salida de datos se produce en el orden en que llegaron... Diferencias con la caché: Una caché puede ser usada a veces como un buffer, y viceversa. Sin embargo, una caché opera con el supuesto de que los mismos datos van a ser utilizados múltiples veces, que los datos escritos serán leídos en un periodo corto de tiempo, o teniendo en cuenta la posibilidad de múltiples lecturas o escrituras para formar un único bloque más grande. Su premisa básica es reducir los accesos a los almacenamientos de nivel más bajo, los cuales son bastante lentos. La caché también es normalmente una capa de abstracción que está diseñada para ser invisible. Una caché de disco o archivo de caché guarda las estadísticas de los datos almacenados en él y proporciona datos con un tiempo máximo de espera en modos de escritura en diferido. Un buffer, por el contrario, no hace nada de esto, sino que es utilizado normalmente en entrada, salida y a veces, almacenamiento temporal de datos que se enrutan entre distintos dispositivos o que van a ser modificados de manera no secuencial antes de ser escritos o leídos de manera secuencial. Ejemplos:  Los buffers comando/orden en CONFIG.SYS de DOS.  El buffer entre un puerto serie (UART) y un módem. La velocidad del puerto COM puede ser de 38400 bps, mientras que el módem puede soportar sólo 14400 bps.  El buffer integrado en un disco duro, una impresora o cualquier otro dispositivo de hardware.  El buffer de una tarjeta de vídeo donde se van almacenando cada fotograma. Fuente: Buffer. Recuperado el 29 de septiembre de 2012. http://es.wikipedia.org/wiki/Buffer_de_datos
  • 33. Fig. 14. Estructura general de un pipeline. Consiste de cuatro etapas, las cajas de colores representan instrucciones independientes el uno del otro La gráfica 14 muestra una tubería genérica con cuatro etapas: 1. Ir a buscar 2. Decodificar 3. Ejecutar 4. Write-back El cuadro gris de arriba es la lista de instrucciones en espera de ser ejecutado, el cuadro gris de abajo es la lista de instrucciones que se han completado, y la mitad de caja blanca es la tubería. Ejecución es el siguiente:
  • 34. Tiempo Ejecución 0 Cuatro instrucciones están en espera de ser ejecutado 1  la instrucción verde se recupera de la memoria 2  la instrucción se decodifica verde  la instrucción púrpura se recuperan de la memoria 3  la instrucción se ejecuta verde (operación real se lleva a cabo)  la instrucción se decodifica púrpura  la instrucción azul se recupera 4  los resultados de la instrucción verde se vuelve a escribir en el archivo de registro o memoria  la instrucción se ejecuta púrpura  la instrucción azul se decodifica  la instrucción rojo se recupera 5  la instrucción verde se completa  la instrucción púrpura se escribe de nuevo  la instrucción azul se ejecuta  la instrucción se decodifica rojo 6  La instrucción púrpura se completa  la instrucción azul se escribe de nuevo  la instrucción rojo se ejecuta 7  la instrucción azul se completa  la instrucción rojo se escribe de nuevo 8  la instrucción rojo se completa 9 Los cuatro instrucciones se ejecutan La comunicación por medio de tuberías se basa en la interacción productor/consumidor, los procesos productores (aquellos que envían datos) se comunican con los procesos consumidores (que reciben datos)
  • 35. siguiendo un orden FIFO. Una vez que el proceso consumidor recibe un dato, este se elimina de la tubería. Las tuberías (pipes) están implementadas en forma muy eficiente en los sistemas operativos multitarea, iniciando todos los procesos al mismo tiempo, y atendiendo automáticamente los requerimientos de lectura de datos para cada proceso cuando los datos son escritos por el proceso anterior. De esta manera el planificador de corto plazo va a dar el uso de la CPU a cada proceso a medida que pueda ejecutarse minimizando los tiempos muertos. Para mejorar el rendimiento, la mayoría de los sistemas operativos implementan las tuberías usando buffers, lo que permite al proceso proveedor generar más datos que lo que el proceso consumidor puede atender inmediatamente. Podemos distinguir dos tipos de tuberías:  Tubería sin nombre: Las tuberías sin nombre tienen asociado un fichero en memoria principal, por lo tanto, son temporales y se eliminan cuando no están siendo usados ni por productores ni por consumidores. Permiten la comunicación entre el proceso que crea un cauce y procesos hijos tras las creación de la tubería.  Tubería con nombre: Su diferencia respecto a las tuberías sin nombre radica en que el cauce se crea en el sistema de archivos7 , y por lo tanto no 7 Los sistemas de archivos o ficheros (filesystem), estructuran la información guardada en una unidad de almacenamiento (normalmente un disco duro de una computadora), que luego será representada ya sea textual o gráficamente utilizando un gestor de archivos. La mayoría de los sistemas operativos manejan su propio sistema de archivos. Lo habitual es utilizar dispositivos de almacenamiento de datos que permiten el acceso a los datos como una cadena de bloques de un mismo tamaño, a veces llamados sectores, usualmente de 512 bytes de longitud (o clústers). El software del sistema de archivos es responsable de la organización de estos sectores en archivos y directorios y mantiene un registro de qué sectores pertenecen a qué archivos y cuáles no han sido utilizados. En la práctica, un sistema de archivos también puede ser utilizado para acceder a datos generados
  • 36. tienen carácter temporal. Se mediante llamadas al sistema8 (open , close, read y write) como el resto de ficheros del sistema. Permiten la comunicación entre los procesos que usen dicha tubería, aunque no exista una conexión jerarquica entre ellos.” Otro aspecto a tener en cuenta de las pipelines, son las arquitecturas Pipeline (Segmentadas), que surgen por la necesidad de aumentar la velocidad de procesamiento. Es decir, la velocidad, en un sistema secuencial síncrono, está limitada, entre otros factores, por aspectos de tipo tecnológicos, de consumo, de restricciones algorítmicas y arquitecturales entre otros aspectos. Fig. 15. Arquitectura segmentada de n segmentos o etapas. dinámicamente, como los recibidos a través de una conexión de red (sin la intervención de un dispositivo de almacenamiento). Los sistemas de archivos tradicionales proveen métodos para crear, mover, renombrar y eliminar tanto archivos como directorios, pero carecen de métodos para crear, por ejemplo, enlaces adicionales a un directorio o archivo (enlace duro en Unix) o renombrar enlaces padres (".." en Unix). 8 La llamada al sistema es el mecanismo usado por una aplicación para solicitar un servicio al sistema operativo. Comúnmente usan una instrucción especial de la CPU que causa que el procesador transfiera el control a un código privilegiado, previamente especificado por el mismo código. Esto permite al código privilegiado especificar donde va a ser conectado así como el estado del procesador. Cuando una llamada al sistema es invocada, la ejecución del programa que invoca es interrumpida y sus datos son guardados, normalmente en su PCB (Bloque de Control de Proceso, Process Control Block), para poder continuar ejecutándose luego. El procesador entonces comienza a ejecutar las instrucciones de código de alto nivel de privilegio, para realizar la tarea requerida. Cuando esta finaliza, se retorna al proceso original, y continúa su ejecución. El retorno al proceso demandante no obligatoriamente es inmediato, depende del tiempo de ejecución de la llamada al sistema y del algoritmo de planificación de CPU.
  • 37. Segmentar una arquitectura es dividirla en segmentos o etapas, en al que cada uno está definido por un registro que almacena los datos a procesar y otro que almacena los resultados. Clasificación - Lineal: Está formado por un conjunto de etapas conectadas en cascada, sin bucles de realimentación de datos. - No lineal: Pueden existir bucles hacia delante o hacia atrás (Feedback, feedforward) Atendiendo a la función que realizan se pueden clasificar en: - Estáticos: Realizan una función fija sobre un conjunto de datos de entrada. - Dinámicos: Realizan diferentes funciones sobre un conjunto de datos de entrada. Se habla de una tabla de reserva de un pipeline lineal estático de K etapas, que se puede entender fácilmente en la siguiente figura. Fig. 16. Tiempo de ciclos de Clk
  • 38. Se define el THROUGHPUT como el nº de datos procesados por unidad de tiempo: TH=f ⇒ Siempre que se mantenga un flujo constante de datos de entrada. SPEEDUP (SK): En un pipeline lineal estático de K etapas y n datos a procesar, el número de ciclos de reloj necesario es: K+(n-1) En una arquitectura no pipeline será: n.K Luego el Speedup (SK), es: Si el número de datos, n, es muy grande: Eficiencia: Throughput (TH ): Instrucción de Pipeline9 Una tubería de instrucción es una técnica utilizada en el diseño de equipos para aumentar su rendimiento de instrucción (el número de instrucciones que se puede ejecutar en una unidad de tiempo). El Pipeline no reduce el tiempo para completar una instrucción, pero aumenta el número de instrucciones que pueden ser procesados a la vez. 9 NA
  • 39. Cada instrucción se divide en una secuencia de pasos dependientes. El primer paso es siempre ir a buscar la instrucción de memoria, el paso final es generalmente escribir los resultados de la instrucción en los registros del procesador o de memoria. El pipeline busca utilizar cada porción del procesador ocupado con alguna instrucción, donde deja que el ciclo de tiempo del ordenador sea el tiempo de la etapa más lenta, e idealmente permite una instrucción completa en cada ciclo.” La tubería como tal se deriva del hecho que cada parte del procesador está haciendo un trabajo, de manera análoga a lo que hace una tubería de agua en cada enlace de ésta. Fig. 17. Esquema general de un sistema RISC, donde IF =Instrucción principal, ID= Decodificador de instrucciones, MEM = Acceso a memoria, WB = Registro de nueva escritura. En el cuarto ciclo de reloj (columna verde), la primera instrucción está en la etapa MEM, y la última instrucción aún no ha entrado en la tubería. Fuente. http://en.wikipedia.org/wiki/Instruction_pipeline El pipeline del núcleo SPARC. [11] Hay seis etapas en el pipeline del núcleo SPARC: 1. Búsqueda – Etapa F 2. Selección de hilo – Etapa S 3. De-codificación - Etapa D 4. Ejecución – Etapa E 5. Memoria – Etapa M 6. Contestación – Etapa W
  • 40. El acceso de la caché de Instrucción y el acceso ITLB tienen lugar en la etapa F. La selección del hilo (hardware) se realiza en la etapa S. La decodificación de la instrucción y el acceso a los registros suceden en la etapa D. La evaluación de la rama se hace en la etapa E. El acceso a memoria y la respuesta se realiza en las etapas M y W. La figura siguiente ilustra el pipeline y las estructuras involucradas. Fig. 18. Core Pipeline. La Cola de Llenado de Instrucción (IFQ) alimenta la caché de instrucción. La Lista de Instrucciones perdidas (MIL) guarda las direcciones que fallaron la caché de instrucción (I-Cache) y la ITLB, y la MIL alimenta la Unidad de Almacén de Carga (LSU) para futuros procesamientos. El búfer de instrucción es de dos niveles de profundidad, e incluye la Unidad de Instrucción de Hilo (TIR) y la de Próxima Instrucción (NIR). La Selección del Hilo y el Planificador (etapa S) resuelve el arbitraje entre el TIR, el NIR, el PC de la rama, el PC de interrupciones para coger un hilo y mandarlo a la etapa de decodificación (D). La siguiente figura muestra la porción del pipeline del hilo:
  • 41. Fig. 19. 2. Búsqueda de Instrucción La Unidad de Búsqueda de Instrucción (IFU) mantiene los contadores de programa (PC) y los próximos contadores de programa (NPC) de todas las instrucciones vivas ejecutadas en el procesador. Por cada ciclo de reloj del núcleo, dos instrucciones son buscadas por cada instrucción usada. Esta relación de dos búsquedas por cada uso tiene la intención de reducir el acceso a la I-Cache para llenar la I-Cache de forma oportunista. A cada hilo le está permitido tener un fallo de I-Cache pendiente, y el núcleo SPARC permite un total de cuatro fallos de I- cache. Fallos duplicados de I-cache no inducen la carga redundante al nivel 2 de caché (L2-caché). 3. Registros de instrucción y registros de Contador de Programa En el búfer de instrucción, hay dos registros de instrucción por hilo: el registro de instrucción del hilo (TIR) y el registro de próxima instrucción del hilo (NIR). El TIR contiene el la instrucción actual del hilo el la etapa de selección del hilo (etapa S), y el NIR contiene la siguiente instrucción. Un fallo en la carga de la I-cache, evita la I-cache y escribe directamente a la TIR, pero nunca escribe en la NIR. El planificador de hilos selecciona una instrucción válida del TIR. Después de la selección de una instrucción válida, ésta será movida del NIR al TIR. Si no hay una instrucción válida en el TIR, una instrucción de No Operación (NOP) es insertada.
  • 42. Hay un registro de contador de programa (PC) por hilo. El contador de próximo programa (NPC) puede venir de una de las siguientes fuentes: 1. Rama 2. PC de interrupción 3. NPC de interrupción 4. Rollback (un hilo revertido debido a un fallo de carga) 5. PC + 4 La IFU rastrea el PC y el NPC a través de la etapa W. El último PC retirado es guardado in la unidad lógica de interrupción (TLU), y si ocurre una interrupción, también será guardado en la pila de la interrupción. 4. La caché de instrucción de nivel 1 La caché de instrucción es nombrada comúnmente como caché de instrucción de nivel 1 (L1I). El núcleo o “core” OpenSPARC T1 forma parte del procesador OpenSPARC T1. El núcleo OpenSPARC contiene el hardware necesario para soportar cuatro hilos de ejecución. Este soporte consiste en un conjunto de todos los registros (con ventanas de 8 registros) por hilo, con la mayoría de los identificadores de espacio de direcciones (ASI), registros de estado auxiliares (ASR) y registros privilegiados replicados por hilo. Los cuatro hilos comparten las cachés de instrucción y de datos y los TLBs. Cada caché de instrucción es de 16 Kbytes con un tamaño de 32 bits por línea. Los TLB incluyen una funcionalidad de automapeo que permite a los múltiples hilos actualizar la TLB sin bloquear. Cada núcleo SPARC tiene solo un tipo de pipeline de seis fases o etapas. También dispone de las siguientes unidades: 1. La unidad Fech-Instruction (lectura de instrucción) (IFU), que incluye un sistema de cache de instrucción (Se encarga de gestionar los computadores de los procesos, la cache L1). 2. La unidad de ejecución (EXU) incluye las fases de ejecución del pipeline.
  • 43. 3. La unidad Load/store (LSU) incluye etapas de memoria, write-back, y un sistema de cache de datos. 4. La unidad lógica Trap (TLU). 5. La unidad de procesamiento de flujo (o “stream”) (SPU) es usada para funciones de aritmética modular para criptografía. 6. La unidad de gestión de memoria (MMU). 7. La unidad frontend Floating- point (FFU). Fig. 20. Diagrama de bloques de alto nivel del núcleo
  • 44. Aquí se explicará cada una de ellas. 1. IFU – Unidad de búsqueda de instrucción (Instruction Fetch Unit) La política de selección de hilos (o “threads”) es como sigue: una elección entre los hilos disponibles cada ciclo siguiendo la prioridad del hilo menos reciente ejecutado. Los hilos se vuelven no disponibles debido a las largas latencias de operaciones como cargas, multiplicaciones, divisiones, ramas, fallos de caché, excepciones y conflictos. Las cargas son estimadas como fallos de caché y los hilos pasan a tener baja prioridad. La Unidad de búsqueda de instrucción tiene una matriz de la caché de instrucción tiene 16Kb, 4 vías, líneas de 32 bytes de tamaño con un solo tag de instrucción portado. También tiene un vector dual (1R/ 1W) de bit de validez para mantener la línea de validez de la caché con su estado (válido / inválido). La invalidación accede a este vector y no al tag de instrucción. Un algoritmo pseudo-aleatorio es el encargado de elegir las instrucciones inválidas para reemplazarlas. Hay una TLB asociativa total de instrucción con 64 entradas. El buffer soporta los siguientes tamaños de página: 8K, 64K, 4M y 256M La TLB usa un algoritmo de tipo pseudo LRU (primero el menos recientemente usado) para los reemplazos. Dos instrucciones son buscadas en cada ciclo, aunque sólo una es usada, lo que reduce la actividad en la caché. Sólo puede haber un fallo por hilo y 4 por núcleo. Fallos duplicados no cusan búsquedas en la caché de nivel 2. El fichero de registros de enteros (IRF – “Integer Register File”) del núcleo, tiene 5K con 3 puertos de lectura, 2 de escritura y 1 de transporte. Hay 640 registros de 64 bits con código de corrección de errores (ECC). Sólo 32 registros de la ventana actual pueden ser vistos por el hilo. La ventana cambia en segundo plano mientras se hace la selección del hilo. El IRF proporciona un acceso de lectura / escritura por ciclo. 2. EXU – Unidad de Ejecución (Execution Unit) Esta unidad tiene una unidad aritmética lógica (ALU) simple y un cambiador. La ALU es reutilizada para el cálculo de las direcciones de rama y virtuales. Hay un multiplicador de enteros por núcleo. El multiplicador de enteros es compartido por el EXU y el SPU basándose en el algoritmo de round-robin. Hay un divisor simple (sin resto) por núcleo. Un hilo usando MUL / DIV será desecha su operación (roll- back) y desactivado si otro hilo está ocupando las unidades de MUL / DIV.
  • 45. 3. LSU – Unidad de carga / almacén (Load / Store Unit) La caché de datos tiene 8K de datos, 4 vías y un tamaño de línea de 16 bits. También se almacena la validación de los datos con un vector dual 1R/1W. Un algoritmo pseudoaleatorio es usado para el reemplazar los datos. El TLB de datos opera como el TLB de instrucción. La LSU tiene 8 búferes de entrada para almacén, uniéndose en un array de 32 entradas. Sólo una carga es permitida por hilo. Cargas de líneas duplicadas no son enviadas a la caché de nivel 2. La LSU tiene un interfaz lógico con el crossbar de la caché de la CPU (CCX). Este interfaz permite:  priorizar las peticiones de operaciones en coma flotante, de streaming, salvados (stores) e interrupciones.  pedir prioridad  ensamblar paquetes provenientes de la caché del procesador (PCX) La LSU mantiene los retornos de la PCX y el orden de las actualizaciones y las invalidaciones de la caché. 4. FFU – Unidad frontend de coma flotante (Floating-point Frontend Unit) Esta unidad decodifica las instrucciones de coma flotante e incluye un fichero de registros de coma flotante (FRF). Algunas operaciones de coma flotante como “mover”, “valor absoluto” y “negativo” están implementadas aquí, mientras otras lo están en la FPU. Cuando la FFU detecta una operación de coma flotante (Fpop) hace lo siguiente:  El hilo se desactiva.  La Fpop es decodificada y leído el FRF.  Se empaqueta la operación y los operandos y se envía a la FPU a través del crossbar.  La computación se termina cuando el resultado es retornado a través del crossbar.  Se actualiza el FRF y se reinicia el hilo. 5. TLU – Unidad Lógica de Interrupcioes (Trap Logic Unit) Soporta seis niveles de interrupciones. Las interrupciones causan el flush del pipeline y el thread cambia hasta que el contador de programa de interrupción está
  • 46. disponible. La TLU también tiene capacidad hasta 64 interrupciones pendientes por hilo. 6. SPU – Unidad de Procesamiento de Cadenas (Stream Processing Unit) La SPU incluye una unidad aritmética modular (MAU) para criptografía (una por núcleo), y soporta criptografía asimétrica (RSA de clave pública) de clave de hasta 2048 bytes. Comparte un multiplicador de enteros para las operaciones aritméticas modulares. La MAU pues ser usada sólo por un hilo a la vez. La operación de la MAU es configurada por lo guardado en el registro de control, y el hilo retorna al procesamiento normal. La MAU inicia operaciones de lectura y guardado de cadenas en la caché de nivel 2 a través del crossbar, y computa operaciones en el multiplicador. La finalización de la MAU puede ser comprobada por votación o usando una interrupción. Ventajas de la canalización [12] La principal ventaja de la canalización o tunelización, es que mantiene todas las partes del procesador ocupado y aumenta la cantidad de trabajo útil que el procesador puede hacer en un momento dado.  Reducción del tiempo de ciclo del procesador, que por lo general aumenta el rendimiento de instrucciones.  Al hacer que cada paso sea más simple, la canalización puede habilitar operaciones complejas más económicas que la adición de circuitos complejos, por ejemplo para los cálculos numéricos. Las ventajas de un procesador segmentado se disminuyen en la medida en que la ejecución se encuentra con los peligros que requieren ejecución para retardar debajo de su tasa ideal. Ventajas del procesador sin pipeline Un procesador sin pipeline sólo ejecuta una sola instrucción a la vez. La disminución de perseguir a mayor velocidad con pipelining puede hacer que el diseño resultante sea más simple y barato de fabricar.  Un procesador sin pipeline nunca encuentra un peligro. Por ejemplo, nunca hay retrasos derivados. Las consecuencias de esto son las siguientes:  Los sistemas de programación son más fáciles.  Es más fácil predecir el momento exacto de una determinada secuencia de instrucciones.
  • 47.  Necesita un procesador segmentado de organizar todo su trabajo en pasos modulares que pueden requerir la duplicación de registros que aumenta la latencia de algunas instrucciones. VLIW [13] Del inglés Very Long Instruction Word. Esta arquitectura de CPU implementa una forma de paralelismo a nivel de instrucción. Es similar a las arquitecturas superescalares, ambas usan varias unidades funcionales (por ejemplo varias ALUs, varios multiplicadores, etc) para lograr ese paralelismo. Los procesadores con arquitecturas VLIW se caracterizan, como su nombre indica, por tener juegos de instrucciones muy simples en cuanto a número de instrucciones diferentes, pero muy grandes en cuanto al tamaño de cada instrucción. Esto es así porque en cada instrucción se especifica el estado de todas y cada una de las unidades funcionales del sistema, con el objetivo de simplificar el diseño del hardware al dejar todo el trabajo de planificar el código en manos del programador/compilador, en oposición a un procesador superescalar, en el que es el hardware en tiempo de ejecución el que planifica las instrucciones. Planificación Por ejemplo, sea el siguiente programa para una máquina superescalar "normal": 1 Multiplicar R1 por R2 y guardarlo en R3 2 Sumar R3 con R4 y guardarlo en R5 3 Restar R1 de R4 y guardarlo en R6 En este programa, el planificador de código vería que la segunda instrucción depende de la primera (hasta que no esté calculado R3 no se puede ejecutar la suma), y que en cambio la tercera instrucción es independiente de las otras dos. Por tanto, probablemente iniciaría simultáneamente la multiplicación y la resta en unidades diferentes y, una vez acabada la multiplicación, ejecutaría la suma. Todo este trabajo de planificación lo llevaría a cabo la circuitería interna del microprocesador. En una máquina VLIW, toda la planificación anterior la haría el compilador (o el propio programador si programa en ensamblador), y el código resultante sería algo así: 1 MULT(R1,R2,R3) - REST(R1,R4,R6) 2 - SUM(R3,R4,R5) -
  • 48. Se puede ver como en cada instrucción se especifica el estado de cada unidad funcional, de modo que en la primera instrucción se activan el multiplicador y el restador, dejando el sumador ocioso al no poder calcular aún la suma, y en la siguiente instrucción se hace la suma que faltaba. Ventajas  Simplificación de la arquitectura hardware al no tener que planificar el código.  Menor potencia y consumo. Inconvenientes  Requiere compiladores mucho más complejos.  Cualquier mejora en la arquitectura hardware implica un cambio en el juego de instrucciones (compatibilidad hacia atrás nula). Aunque los inconvenientes hacen las arquitecturas VLIW poco adecuadas para la computación de propósito general, dichos inconvenientes son irrelevantes en la computación empotrada. El menor consumo y bajo coste del hardware los hace muy adecuados para dichos sistemas. Podemos encontrar VLIW en TVs HD, discos duros multimedia, reproductores blueray, etc. Procesadores Superescalares Superescalar es el término utilizado para designar un tipo de microarquitectura de procesador capaz de ejecutar más de una instrucción por ciclo de reloj10 . El término se emplea por oposición a la microarquitectura escalar que sólo es capaz de ejecutar una instrucción por ciclo de reloj. En 10 Bajo el término frecuencia de reloj se da a entender el ritmo con el que se tramitan los datos en un ordenador, y se especifica en hercios. Dado que la frecuencia de los procesadores modernos alcanza los miles de millones de hercios, las cantidades suelen representarse con la ayuda de prefijos como giga (G) para miles de millones y mega (M) para millones (mientras que para los sistemas embebidos aún es frecuente hablar de kHz). Por ejemplo, una frecuencia de reloj de 1 GHz significa un período de reloj de un nanosegundo. El flujo de datos de un procesador resulta de la frecuencia de reloj y del flujo de datos en su conexión con la memoria principal. Las prestaciones de cálculo (medidas por ejemplo en MIPS o en FLOPS) no sólo depende de la frecuencia de reloj, sino también de la arquitectura de todo el procesador. Incluso aquellos procesadores que utilizan el mismo conjunto de instrucciones, pueden contar con prestaciones muy diferentes a pesar de tener la misma frecuencia de reloj, motivadas, por ejemplo, por la cantidad de IPC (instrucciones por ciclo), por características propias del fabricante (por ejemplo, ampliaciones de SIMD) o por el ya mencionado flujo de la memoria. El flujo de IPC especifica cuantas instrucciones puede ejecutar un procesador gracias a hacerlas en paralelo. Un procesador con un flujo de IPC mayor, consigue por ello más operaciones de cálculo por cada ciclo de reloj y calcula de forma más rápida.
  • 49. la clasificación de Flynn, un procesador (mononúcleo) superescalar es un procesador de tipo SISD (single instruction single data), en cambio un procesador (multinúcleo) superescalar es un procesador de tipo MIMD (multiple instruction multiple data). Es importante anotar tal como se citó en clase, las cuatro clasificaciones definidas por Flynn se basan en el número de instrucciones concurrentes (control) y en los flujos de datos disponibles en la arquitectura: [14] - Una instrucción, un dato (SISD, Single Instruction, Single Data): Computador secuencial que no explota el paralelismo en las instrucciones ni en flujos de datos. Ejemplos de arquitecturas SISD son las máquinas con uni-procesador o monoprocesador tradicionales como el PC o los antiguos mainframe. - Múltiples instrucciones, un dato (MISD, Multiple Instruction, Single Data): Poco común debido al hecho de que la efectividad de los múltiples flujos de instrucciones suele precisar de múltiples flujos de datos. Sin embargo, este tipo se usa en situaciones de paralelismo redundante, como por ejemplo en navegación aérea, donde se necesitan varios sistemas de respaldo en caso de que uno falle. También se han propuesto algunas arquitecturas teóricas que hacen uso de MISD, pero ninguna llegó a producirse en masa. - Una instrucción, múltiples datos (SIMD, Single Instruction, Multiple Data): Un computador que explota varios flujos de datos dentro de un único flujo de instrucciones para realizar operaciones que pueden ser paralelizadas de manera natural. Por ejemplo, un procesador vectorial. - Múltiples instrucciones, múltiples datos (MIMD, Multiple Instruction, Múltiple Data): Varios procesadores autónomos que ejecutan simultáneamente instrucciones diferentes sobre datos diferentes. Los sistemas distribuidos suelen clasificarse como arquitecturas MIMD; bien sea explotando un único espacio compartido de memoria, o uno distribuido. Diagrama de comparación de las clasificaciones Esas cuatro arquitecturas son mostradas visualmente a continuación en donde cada "PU" (Processing Unit) es una unidad de procesamiento:
  • 50. SISD MISD SIMD MIMD Clasificaciones adicionales También existe una extensión común a esta taxonomía que es:  Un programa, múltiples datos (SPMD) - múltiples procesadores autónomos que trabajan simultáneamente sobre el mismo conjunto de instrucciones
  • 51. (aunque en puntos independientes) sobre datos diferentes. También se le llama 'un proceso, múltiples datos'.  Múltiples programas, múltiples datos (MPMD) - múltiples procesadores autónomos que trabajan simultáneamente sobre al menos dos programas independientes. Normalmente este sistema elige a un nodo para ser el host o administrador, que corre el programa y otorga los datos a todos los demás nodos que ejecutan un segundo programa. Esos demás nodos devuelven sus resultados directamente al administrador. Un ejemplo podría ser la consola de Sony PlayStation 3, que tiene la arquitectura de procesador SPU/PPU. Nota: La unidad de proceso o unidad de procesamiento es uno de los tres bloques funcionales principales en los que se divide una unidad central de procesamiento (CPU). Los otros dos bloques son la unidad de control y el bus de entrada/salida. [15] La función de la unidad de proceso es ejecutar las tareas que le encomienda la unidad de control. Para esto, la unidad de proceso emplea los siguientes elementos:  Unidad aritmético lógica, para llevar a cabo operaciones aritméticas básicas como suma, resta, multiplicación, cambio de signo, etc, funciones lógicas bitwise [opera sobre números binarios a nivel de sus bits individuales], como NOT, AND, OR, XOR, comparaciones, desplazamientos y rotaciones de bits, y otras.  Unidad de coma flotante, para realizar eficientemente operaciones matemáticas con números reales que no pueden ser realizadas directamente mediante la unidad aritmético lógica, salvo mediante emulación por software.  El registro acumulador, que guarda los operandos y los resultados de las operaciones.  El registro de estado, que guarda determinados indicadores acerca del resultado de las operaciones realizadas. La microarquitectura superescalar utiliza el paralelismo de instrucciones además del paralelismo de flujo, éste último gracias a la estructura en pipeline. La estructura típica de un procesador superescalar consta de un pipeline con las siguientes etapas: [16]  Lectura (fetch).  Decodificación (decode).  Lanzamiento (dispatch).  Ejecución (execute).  Escritura (writeback).  Finalización (retirement).
  • 52. En un procesador superescalar, el procesador maneja más de una instrucción en cada etapa. El número máximo de instrucciones en una etapa concreta del pipeline se denomina grado, así un procesador superescalar de grado 4 en lectura (fetch) es capaz de leer como máximo cuatro instrucciones por ciclo. El grado de la etapa de ejecución depende del número y del tipo de las unidades funcionales. Un procesador superescalar suele tener unidades funcionales independientes de los tipos siguientes:  Unidad aritmético lógica (ALU)  Unidad de lectura/escritura en memoria (Load/Store Unit)  Unidad de coma flotante (Floating Point Unit)  Unidad de salto (Branch unit) Un procesador superescalar es capaz de ejecutar más de una instrucción simultáneamente únicamente si las instrucciones no presentan algún tipo de dependencia (hazard). Los tipos de dependencia entre instrucciones son:  Dependencia estructural, esta ocurre cuando dos instrucciones requieren el mismo tipo unidad funcional y su número no es suficiente.  Dependencia de datos, esta ocurre cuando una instrucción necesita del resultado de otra instrucción para ejecutarse, por ejemplo R1<=R2+R3 y R4<=R1+5.  Dependencia de escritura o falsa dependencia o nombre, esta ocurre cuando dos instrucciones necesitan escribir en la misma memoria, por ejemplo R1<=R2+R3 y R1<=R1+5.  Dependencia de control, esta ocurre cuando una instrucción depende de una estructura de control y no se puede determinar el flujo correcto hasta la evaluación de la estructura de control, por ejemplo, if R1<R2 then R3<=R4+R5 else R6<=R7+5. La detección y resolución de las dependencias entre instrucciones puede ser estática (durante la compilación) o dinámica, es decir, a medida que se ejecuta un programa, generalmente durante las etapas de codificación y lanzamiento de las instrucciones. La detección y resolución dinámica de las dependencias entre instrucciones suele realizarse mediante alguna variante del algoritmo de Tomasulo11 que permite la 11 El algoritmo de Tomasulo es un algoritmo de planificación dinámica desarrollado por Robert Tomasulo, de IBM. Se diseñó para permitir a un procesador ejecutar instrucciones fuera de orden. Este algoritmo difiere del algoritmo de marcador (Scoreboard) en que este último no dispone de renombrado de registros. En su lugar, el algoritmo de Scoreboard (scoreboarding) resuelve los riesgos Escritura Después de Escritura (EDE o WAW) y Escritura Después de Lectura (EDL o WAR) deteniendo la ejecución, mientras que el algoritmo de
  • 53. ejecución de instrucciones en un orden distinto al del programa también llamada ejecución en desorden. La eficacia de un procesador superescalar viene limitada por un lado por la dificultad en suministrar al procesador suficientes instrucciones que puedan ser ejecutadas en paralelo y por otro lado por las prestaciones de la jerarquía de memorias. Si las instrucciones de salto son un problema para los procesadores con pipeline en general, en el caso de los procesadores superescalares, el problema se multiplica ya que un parón en el pipeline tiene consecuencias en un número mayor de instrucciones. Por esta razón, los fabricantes de procesadores recurren a técnicas de ejecución especulativa12 y diseñan algoritmos de predicción de saltos cada vez más sofisticados así como sistemas de almacenamiento de instrucciones por trazas (trace caches). Las arquitecturas superescalares adolecen de una estructura compleja y de un mal aprovechamiento de sus recursos debido en parte a la dificultad en encontrar suficientes instrucciones paralelizables. Una forma de obtener un mayor número de instrucciones paralelizables es aumentar la ventana de instrucciones, es decir el conjunto de instrucciones que la unidad de lanzamiento considera como candidatas a ser lanzadas en un momento dado. Desafortunadamente la complejidad del procesador superescalar aumenta desproporcionadamente con respecto al tamaño de dicha ventana lo que se traduce por un ralentizamiento general del circuito. Otra forma de obtener más instrucciones paralelizables es manipulando instrucciones de más de un programa a la vez, lo que se conoce bajo el nombre de multitarea simultánea o multihilo13 simultáneo. Tomasulo permite el lanzamiento de dichas instrucciones. Además, el algoritmo de Tomasulo utiliza un bus de datos común en el que los valores calculados son enviados a todas las estaciones de reserva que los necesite. Esto permite mejorar la ejecución paralela de instrucciones en situaciones en las que el scoreboarding fallaría y provocaría la parada. En la actualidad, gran parte de los procesadores hacen uso de variaciones de este algoritmo para la planificación dinámica de instrucciones. 12 La ejecución especulativa es la ejecución de código por parte del procesador que no tiene por qué ser necesaria a priori. En la programación funcional, suele usarse el término "evaluación especulativa". La ejecución especulativa no es más que una optimización. Obviamente, sólo es útil cuando la ejecución previa requiere menos tiempo y espacio que el que requeriría la ejecución posterior, siendo este ahorro lo suficientemente importante como para compensar el esfuerzo gastado en caso de que el resultado de la operación nunca llegue a usarse. 13 Las unidades centrales de procesamiento con capacidad para multithilo (multithreading) tienen soporte en hardware para ejecutar eficientemente múltiples hilos de ejecución. El paradigma de multihilo ha llegado a ser más popular a medida que los esfuerzos para llevar más adelante el paralelismo a nivel de instrucción se han atascado desde finales de los años 1990. Esto permitió que reemergiera a una posición destacada el
  • 54. Mientras las primeras CPUs superescalares disponían de dos ALUs y una sola FPU14 , un procesador moderno como el PowerPC 970 incluye cuatro ALUs y dos FPUs, además de dos unidades SIMD. Si el despachador no es eficiente haciendo trabajar lo máximo posible a estas unidades, el rendimiento global del procesador se verá mermado. Conclusiones Los sistemas de computación actuales, maneja una arquitectura bastante compleja en cuanto a la gestión de información que fluye entre los procesadores y las memorias, caché y memoria principal. concepto del computación de rendimiento a partir del más especializado campo del procesamiento transaccional:  Aunque es muy difícil acelerar un solo hilo o un solo programa, la mayoría de los sistemas de computadores son realmente multitarea entre múltiples hilos o programas.  Las técnicas que permitirían acelerar el rendimiento total del procesamiento del sistema en todas las tareas (tasks) darían como resultado un aumento significativo del rendimiento. Las dos principales técnicas para computación de rendimiento son el multiproceso y el multihilo. Una cierta crítica del multihilo incluye:  Los múltiples hilos pueden interferir uno con el otro al compartir recursos de hardware como cachés o Translation Lookaside Buffer (TLB).  Los tiempos de ejecución de un solo hilo no son mejorados, sino por el contrario, pueden ser degradados.  El soporte de hardware para multihilo es más visible al software que el multiprocesamiento, por lo tanto requiriendo más cambios tanto a las aplicaciones como el sistema operativo. Las técnicas de hardware usadas para soportar multihilo a menudo paralelizan las técnicas de software usadas para la multitarea de los programas de computadora. 14 Una unidad de coma flotante (floating-point unit) o, también conocido como coprocesador matemático, es un componente de la unidad central de procesamiento especializado en el cálculo de operaciones en coma flotante. Las operaciones básicas que toda FPU puede realizar son la suma y multiplicación usuales, si bien algunos sistemas más complejos son capaces también de realizar cálculos trigonométricos o exponenciales. No todas las unidades centrales de procesamiento tienen una FPU dedicada. En ausencia de FPU, la CPU puede utilizar programas en microcódigo para emular una función en coma flotante a través de la unidad aritmético lógica (ALU), la cual reduce el coste del hardwarea cambio de una sensible pérdida de velocidad. En algunas arquitecturas, las operaciones en coma flotante se tratan de forma completamente distinta a las operaciones enteras, con registros dedicados y tiempo de ciclo diferentes. Incluso para operaciones complejas, como la división, podrían tener un circuito dedicado a dicha operación.
  • 55. Las arquitecturas que se manejan son dinámicas y escalares, lo que permite el desarrollo de sistemas computacionales cada vez más robustos en cuanto a procesamiento y almacenamiento de información. Lo que se espera a un futuro no muy lejano es: - Integración en la planificación del consumo de los hilos. - Sistemas de memoria: Nuevas jerarquías de memoria. - Compiladores que generen código que evite necesidades hardware. - Paralelización automática de aplicaciones secuenciales. - Optimización dinámica del código. En cuanto a los procesadores superescalares son una extensión de la arquitectura pipeline simple que emiten y pueden ejecutar varias instrucciones a la vez. Producen más peligros y requieren soluciones más sofisticadas que el pipeline simple. Referencias [1] Integración a muy gran escala. Recuperado el 20 de septiembre de 2012. http://es.wikipedia.org/wiki/Integraci%C3%B3n_a_muy_gran_escala [2] G.S. Almasi and A. Gottlieb. Highly Parallel Computing. Benjamin-Cummings publishers, Redwood city, CA, 1989. [3] Krste Asanovic et al. The Landscape of Parallel Computing Research: A View from Berkeley (PDF). University of California, Berkeley. Technical Report No. UCB/EECS-2006-183. December 18, 2006: "Old [conventional wisdom]: Increasing clock frequency is the primary method of improving processor performance. New [conventional wisdom]: Increasing parallelism is the primary method of improving processor performance ... Even representatives from Intel, a company generally associated with the 'higher clock-speed is better' position, warned that traditional approaches to maximizing performance through maximizing clock speed have been pushed to their limit." [4] Asanovic et al. Old [conventional wisdom]: Power is free, but transistors are expensive. New [conventional wisdom] is [that] power is expensive, but transistors are "free". [5] Patterson, David A. and John L. Hennessy (1998). Computer Organization and Design, Second Edition, Morgan Kaufmann Publishers, p. 715. ISBN 1-55860-428- 6. [6] Computación paralela. Recuperado el 29 de septiembre de 2012 http://es.wikipedia.org/wiki/Programaci%C3%B3n_paralela
  • 56. [7] NP-completo. Recuperado el 29 de septiembre de 2012. http://es.wikipedia.org/wiki/NP-completo [8] Algoritmo paralelo. Recuperado el 29 de septiembre de 2012. http://es.wikipedia.org/wiki/Algoritmo_paralelo [9] Procesamiento secuencial y paralelo. Recuperado el 30 de septiembre de 2012. http://sinapsis-aom.blogspot.com/2011/01/procesamiento-secuencial-y- paralelo.html [10] Tubería. Recuperado el 29 de septiembre de 2012. http://es.wikipedia.org/wiki/Tuber%C3%ADa_(inform%C3%A1tica) [11] IFU. Unidad de búsqueda y control. Recuperado el 7 de octubre de 2012. http://www.mifergo.es/category/general/ [12] Pipeline Instruction. Recuperado el 9 de octubre de 2012. http://en.wikipedia.org/wiki/Instruction_pipeline [13] VLIW. Recuperado el 9 de octubre de 2012. http://es.wikipedia.org/wiki/VLIW [14] Clasificación de Flynn. Recuperado el 9 de octubre de 2012. http://es.wikipedia.org/wiki/Clasificaci%C3%B3n_de_Flynn [15] Unidad de Proceso. Recuperado el 9 de octubre de 2012. http://es.wikipedia.org/wiki/Unidad_de_proceso [16] Superescalar. Recuperado el 9 de octubre de 2012. http://es.wikipedia.org/wiki/Unidad_de_proceso

×