next up previous contents
Next: 2.3 Sistemas multiprocesador Up: 2. Teoría Previous: 2.1.1 La necesidad de   Índice General

2.2 Diferentes enfoques para incrementar el rendimiento

A lo largo de la historia de las computadoras se han desarrollado y refinado técnicas para obtener un mayor rendimiento; es decir, realizar un mayor número de cálculos en el mismo tiempo. Dichas técnicas son de diversas índoles, algunas complejas, otras relativamente sencillas, algunas son diseños basados en tecnología existente mientras que otras se basan en la introducción de tecnología novedosa.

El primer salto tecnológico para mejorar el desempeño se dio con el advenimiento de las computadoras electrónicas, que gracias a su tecnología básica eran inherentemente mucho más rápidas que las mecánicas. Similarmente, al comenzar a utilizarse semiconductores y, posteriormente, circuitos integrados, se ha obtenido mayor velocidad.

La evolución en tecnología semiconductora y de circuitos integrados ha sido el vehículo para incrementar el rendimiento de la manera más obvia posible: aumentando la frecuencia de operación de las computadoras. Esto naturalmente tiene el efecto de realizar mayor número de operaciones en el mismo tiempo, y ha sido posibilitado por el desarrollo de tecnologías y elementos capaces a operar a frecuencias cada vez mayores.

Sin embargo los desarrollos más obvios suelen resultar también costosos y complicados; a medida que se incrementa la frecuencia de operación se introducen mayores problemas eléctricos y térmicos en el circuito. La tecnología requerida para resolver estos problemas es costosa, de modo que en ocasiones se obtiene un incremento de rendimiento mínimo por un precio bastante elevado.

A raíz de esto se comenzaron a desarrollar otras técnicas que permitieran obtener un mayor rendimiento con menor costo y complicación.

Se han creado técnicas como la memoria de modo página, que explota el hecho de que las lecturas a memoria suelen ser lineales, reorganizando la memoria de forma que páginas que lógicamente están contiguas se encuentren físicamente en elementos separados, evitando así el efecto de latencia de lectura de la memoria; y las memorias caché, que aprovechan la propiedad de localidad de los programas, la cual indica que la mayoría del tiempo se emplea ejecutando ciertas porciones pequeñas del programa. Estas técnicas son relativamente simples de implementar y basan su funcionamiento en premisas que pueden no cumplirse en todos los casos; sin embargo son de costo relativamente bajo de modo que la relación costo/beneficio es grande y en la práctica redundan en incrementos de desempeño considerables.

La creación de arquitecturas o paradigmas de diseño nuevos también ha proporcionado mayor desempeño utilizando elementos tecnológicos existentes. La arquitectura RISC2.3plantea ciertas modificaciones a la manera tradicional como se hacían los microprocesadores. Estos incluyen la reducción del juego de instrucciones y el uso de instrucciones de longitud fija. Esto permite ejecutar el código a mucho mayor velocidad, de forma que una cantidad mayor de instrucciones se ejecuta en un tiempo menor que el equivalente en un procesador CISC 2.4. A cambio de este mayor rendimiento, es más complejo escribir código para procesadores RISC y dicho código suele ocupar más espacio de almacenamiento. Similarmente al enfoque tomado por las memorias caché, el enfoque RISC asume que el costo del almacenamiento es menor que el costo de un procesador más rápido.

El uso de pipelines2.5 para aprovechar todas las etapas de un procesador (fetch, decode, execute) simultáneamente y procesar un promedio de una instrucción por ciclo de reloj (a diferencia del enfoque anterior que plantea utilizar sólo una etapa a la vez y, en un procesador de tres etapas, ejecutaría una instrucción en tres ciclos de reloj) es una técnica muy simple y que también proporciona una mejora de desempeño sustancial. Esta medida condujo directamente al desarrollo de procesadores con múltiples unidades funcionales (por ejemplo, un procesador con dos unidades lógico-aritméticas) y al uso de superpipelining, con el cual el procesador es capaz de ejecutar más de una instrucción por ciclo de reloj. Desde luego esto requiere ``cooperación'' de parte del código que se va a ejecutar; se necesita que el código esté organizado de manera que instrucciones contiguas se puedan ejecutar simultáneamente. Esto a su vez ha llevado a desarrollar varias sub-técnicas para reorganizar el código: se tienen procesadores que pueden reorganizar ``al vuelo'' el código existente, sin requerir modificaciones a los programas actuales, sin embargo este enfoque incrementa notablemente la complejidad de la electrónica de decodificación de instrucciones del procesador; también se han desarrollado nuevas arquitecturas como la VLIW2.6, en las cuales el código se entrega al procesador en ``paquetes'' o bundles que el compilador ha identificado como ejecutables en paralelo. Esto reduce significativamente la complejidad de la electrónica y deja el trabajo ``pesado'' al compilador.

Otro enfoque ha sido el de crear hardware o unidades funcionales de propósito específico. Algunos de los primeros ejemplos fueron los procesadores vectoriales, hechos para operar simultáneamente en vectores y que se emplean primordialmente para cálculos físicos y matemáticos. Originalmente empleados en supercomputadoras como las Cray, en la actualidad se encuentran unidades de proceso vectorial en procesadores comerciales como el PowerPC G4, y versiones reducidas para cálculos SIMD (Single Instruction on Multiple Data) en casi cualquier procesador comercial actual (las extensiones MMX de Intel y 3DNow de AMD están basadas en tecnología de proceso vectorial).


next up previous contents
Next: 2.3 Sistemas multiprocesador Up: 2. Teoría Previous: 2.1.1 La necesidad de   Índice General
2002-05-15