stringtranslate.com

RISC de Berkeley

Berkeley RISC es uno de los dos proyectos de investigación fundamentales en el diseño de microprocesadores basados ​​en computadoras con conjunto de instrucciones reducido (RISC) que se llevan a cabo en el marco del Proyecto VLSI de la Agencia de Proyectos de Investigación Avanzada de Defensa . RISC fue dirigido por David Patterson (quien acuñó el término RISC) en la Universidad de California, Berkeley entre 1980 y 1984. [1] El otro proyecto se llevó a cabo a poca distancia en la Universidad de Stanford en el marco de su iniciativa MIPS que comenzó en 1981 y duró hasta 1984.

El proyecto de Berkeley tuvo tanto éxito que se convirtió en el nombre que adoptaron todos los diseños similares que siguieron; incluso el MIPS llegaría a ser conocido como "procesador RISC". El diseño RISC de Berkeley fue comercializado posteriormente por Sun Microsystems como arquitectura SPARC e inspiró la arquitectura ARM . [2]

El concepto RISC

Tanto RISC como MIPS se desarrollaron a partir de la constatación de que la gran mayoría de los programas utilizaban solo una pequeña minoría del conjunto de instrucciones disponible de un procesador. En un famoso artículo de 1978, Andrew S. Tanenbaum demostró que un programa complejo de alto nivel de 10.000 líneas podía representarse utilizando una arquitectura de conjunto de instrucciones simplificada utilizando un código de operación de longitud fija de 8 bits. [3] Esta fue aproximadamente la misma conclusión a la que llegó IBM , cuyos estudios de su propio código ejecutándose en mainframes como el IBM 360 utilizaron solo un pequeño subconjunto de todas las instrucciones disponibles. Ambos estudios sugirieron que se podría producir una CPU mucho más simple que aún ejecutaría la mayor parte del código del mundo real. Otro hallazgo, no explorado por completo en ese momento, fue la nota de Tanenbaum de que el 81% de las constantes eran 0, 1 o 2. [3]

Estas realizaciones se estaban produciendo a medida que el mercado de microprocesadores estaba pasando de 8 a 16 bits y estaban a punto de aparecer diseños de 32 bits. Esos diseños se basaban en el objetivo de replicar algunas de las ISA existentes más respetadas del mundo de los mainframes y minicomputadoras. Por ejemplo, el National Semiconductor NS32000 comenzó como un esfuerzo por producir una implementación de un solo chip del VAX-11 , que tenía un rico conjunto de instrucciones con una amplia variedad de modos de direccionamiento . El Motorola 68000 era similar en diseño general. Para proporcionar este rico conjunto de instrucciones, las CPU usaban microcódigo para decodificar la instrucción visible para el usuario en una serie de operaciones internas. Este microcódigo representaba quizás entre 14 y 13 de los transistores del diseño general.

Si, como sugerían estos otros artículos, la mayoría de estos códigos de operación nunca se utilizarían en la práctica, entonces se estaría desperdiciando este importante recurso. Si uno simplemente construyera el mismo procesador eliminando las instrucciones no utilizadas, sería más pequeño y, por lo tanto, menos costoso, mientras que si en cambio uno usara esos transistores para mejorar el rendimiento en lugar de decodificar instrucciones que no se utilizarían, sería posible tener un procesador más rápido. El concepto RISC consistía en aprovechar ambas ventajas, produciendo una CPU que tuviera el mismo nivel de complejidad que el 68000, pero mucho más rápida.

Para lograrlo, RISC se concentró en agregar muchos más registros , pequeños fragmentos de memoria que contienen valores temporales a los que se puede acceder muy rápidamente. Esto contrasta con la memoria principal normal , a la que se puede acceder mediante varios ciclos. Al proporcionar más registros y asegurarse de que los compiladores realmente los usaran, los programas deberían ejecutarse mucho más rápido. Además, la velocidad del procesador estaría más definida por su velocidad de reloj, porque se dedicaría menos tiempo a esperar accesos a la memoria. Transistor por transistor, un diseño RISC superaría a una CPU convencional.

En el lado negativo, las instrucciones que se eliminaban generalmente realizaban varias "subinstrucciones". Por ejemplo, la ADDinstrucción de un diseño tradicional generalmente venía en varios sabores, uno que sumaba los números en dos registros y los colocaba en un tercero, otro que sumaba los números encontrados en la memoria principal y colocaba el resultado en un registro, etc. Los diseños RISC, por otro lado, incluían solo un sabor de cada instrucción en particular, el ADD, por ejemplo, siempre usaba registros para todos los operandos. Esto obligaba al programador a escribir instrucciones adicionales para cargar los valores de la memoria, si era necesario, lo que hacía que un programa RISC fuera "menos denso".

En la era de las memorias caras, esto era un problema real, sobre todo porque la memoria también era mucho más lenta que la CPU. Dado que un diseño RISC ADDen realidad requeriría cuatro instrucciones (dos cargas, una adición y una copia de seguridad), la máquina tendría que hacer mucho más acceso a la memoria para leer las instrucciones adicionales, lo que potencialmente la ralentizaría considerablemente. Esto se compensaba en cierta medida con el hecho de que los nuevos diseños usaban lo que entonces era una palabra de instrucción muy grande de 32 bits , lo que permitía que pequeñas constantes se incorporaran directamente a la instrucción en lugar de tener que cargarse por separado. Además, los resultados de una operación suelen usarse poco después en otra, por lo que al omitir la escritura en la memoria y almacenar el resultado en un registro, el programa no terminaba siendo mucho más grande y, en teoría, podía ejecutarse mucho más rápido. Por ejemplo, una cadena de instrucciones que realiza una serie de operaciones matemáticas podría requerir solo unas pocas cargas de la memoria, mientras que la mayoría de los números que se usaran serían constantes en las instrucciones o valores intermedios que quedaban en los registros de cálculos anteriores. En cierto sentido, en esta técnica se utilizan algunos registros para hacer sombra a las ubicaciones de la memoria, de modo que los registros se utilizan como representantes de las ubicaciones de la memoria hasta que se hayan determinado sus valores finales después de un grupo de instrucciones.

Para el observador casual, no estaba claro que el concepto RISC mejorara el rendimiento, e incluso podía empeorarlo. La única forma de estar seguro era simularlo. Los resultados de dichas simulaciones fueron claros; prueba tras prueba, cada simulación mostró un enorme beneficio general en el rendimiento con este diseño.

En lo que se diferenciaban los dos proyectos, RISC y MIPS, era en el manejo de los registros. MIPS simplemente añadía muchos registros y dejaba que los compiladores (o programadores de lenguaje ensamblador ) hicieran uso de ellos. RISC, por otro lado, añadía circuitos a la CPU para ayudar al compilador. RISC utilizaba el concepto de ventanas de registro , en las que todo el "archivo de registro" se dividía en bloques, lo que permitía al compilador "ver" un bloque para las variables globales y otro para las variables locales.

La idea era hacer que una instrucción particularmente común, la llamada a un procedimiento , fuera extremadamente fácil de implementar. Casi todos los lenguajes de programación utilizan un sistema conocido como registro de activación o marco de pila para cada procedimiento que contiene la dirección desde la que se llamó al procedimiento, los datos (parámetros) que se pasaron y el espacio para los valores de los resultados que se deben devolver. En la gran mayoría de los casos, estos marcos son pequeños, normalmente con tres o menos entradas y una o ninguna salida (y, a veces, una entrada se reutiliza como salida). En el diseño de Berkeley, entonces, una ventana de registro era un conjunto de varios registros, suficientes para que todo el marco de pila del procedimiento probablemente encajara completamente dentro de la ventana de registro.

En este caso, la llamada a un procedimiento y el retorno desde él son simples y extremadamente rápidos. Se llama a una sola instrucción para configurar un nuevo bloque de registros (una nueva ventana de registros) y luego, con los operandos pasados ​​al procedimiento en el "extremo inferior" de la nueva ventana, el programa salta al procedimiento. Al regresar, los resultados se colocan en la ventana en el mismo extremo y el procedimiento sale. Las ventanas de registros están configuradas para superponerse en los extremos, de modo que los resultados de la llamada simplemente "aparecen" en la ventana del llamador, sin que sea necesario copiar datos . Por lo tanto, la llamada al procedimiento común no tiene que interactuar con la memoria principal, lo que la acelera enormemente.

En el lado negativo, este enfoque significa que los procedimientos con un gran número de variables locales son problemáticos, y los que tienen menos hacen que se desperdicien registros (un recurso costoso). Hay un número finito de ventanas de registro en el diseño, por ejemplo, ocho, por lo que los procedimientos solo se pueden anidar a esa cantidad de niveles de profundidad antes de que el mecanismo de ventanas de registro alcance su límite; una vez que se alcanza la última ventana, no se puede configurar una nueva ventana para otra llamada anidada. Y si los procedimientos solo se anidan a unos pocos niveles de profundidad, nunca se puede acceder a los registros en las ventanas por encima del nivel de anidación de llamadas más profundo, por lo que se desperdician por completo. Fue el trabajo de Stanford sobre compiladores lo que los llevó a ignorar el concepto de ventana de registro, creyendo que un compilador eficiente podría hacer un mejor uso de los registros que un sistema fijo en hardware. (El mismo razonamiento se aplicaría a un programador inteligente de lenguaje ensamblador).

RISCO I

RISC I die shot. La mayor parte del chip está ocupada por el archivo de registros (área inferior izquierda). La lógica de control solo ocupa la pequeña esquina superior derecha.

El primer intento de implementar el concepto RISC se denominó originalmente Gold . El trabajo en el diseño comenzó en 1980 como parte de un curso de diseño VLSI, pero el diseño, por aquel entonces complicado, hizo que casi todas las herramientas de diseño existentes colapsaran. El equipo tuvo que dedicar una cantidad considerable de tiempo a mejorar o reescribir las herramientas, e incluso con estas nuevas herramientas se tardó poco menos de una hora en extraer el diseño en un VAX-11/780 .

El diseño final, llamado RISC I , fue publicado en el Simposio Internacional de Arquitectura de Computadores (ISCA) de la Association for Computing Machinery (ACM ) en 1981. Tenía 44.500 transistores que implementaban 31 instrucciones y un archivo de registros que contenía 78 registros de 32 bits. Esto permitió seis ventanas de registros que contenían 14 registros. De esos 14 registros, 4 se superponían a la ventana anterior. El total es entonces: 10*6 registros en ventanas + 18 globales = 78 registros en total. La sección de control y decodificación de instrucciones ocupaba solo el 6% del chip, mientras que el diseño típico de la época usaba alrededor del 50% para la misma función. El archivo de registros ocupaba la mayor parte de ese espacio. [4]

RISC I también incluía una secuencia de instrucciones de dos etapas para lograr mayor velocidad, pero sin la compleja reordenación de instrucciones de los diseños más modernos. Esto hace que las bifurcaciones condicionales sean un problema, porque el compilador tiene que llenar la instrucción que sigue a una bifurcación condicional (la llamada ranura de retardo de bifurcación ), con algo seleccionado como "seguro" (es decir, que no dependa del resultado de la condicional). A veces, la única instrucción adecuada en este caso es NOP. Una cantidad notable de diseños posteriores de estilo RISC aún requieren la consideración del retardo de bifurcación.

Después de un mes de validación y depuración, el diseño se envió al innovador servicio MOSIS para su producción el 22 de junio de 1981, utilizando un proceso de 2 μm (2000 nm). Una serie de retrasos los obligaron a abandonar sus máscaras cuatro veces distintas, y las obleas con ejemplos de funcionamiento no llegaron a Berkeley hasta mayo de 1982. El primer "ordenador" RISC I funcional (en realidad una placa de verificación) funcionó el 11 de junio. En las pruebas, los chips demostraron tener un rendimiento menor del esperado. En general, una instrucción tardaba 2 μs en completarse, mientras que el diseño original asignaba unos 0,4 μs (cinco veces más rápido). Las razones precisas de este problema nunca se explicaron por completo. Sin embargo, a lo largo de las pruebas quedó claro que ciertas instrucciones se ejecutaban a la velocidad esperada, lo que sugería que el problema era físico, no lógico.

Si el diseño hubiera funcionado a toda velocidad, el rendimiento habría sido excelente. Las simulaciones realizadas con una variedad de pequeños programas compararon el RISC I de 4 MHz con el VAX 11/780 de 32 bits de 5 MHz y el Zilog Z8000 de 16 bits de 5 MHz . El tamaño del programa era aproximadamente un 30% mayor que el del VAX, pero muy cercano al del Z8000, lo que valida el argumento de que la mayor densidad de código de los diseños CISC no era tan impresionante en realidad. En términos de rendimiento general, el RISC I era el doble de rápido que el VAX y aproximadamente cuatro veces más rápido que el Z8000. Los programas terminaron realizando aproximadamente la misma cantidad total de accesos a la memoria porque el gran archivo de registros mejoró drásticamente las probabilidades de que el operando necesario ya estuviera en el chip.

Es importante poner este desempeño en contexto. Aunque el diseño RISC había funcionado más lento que el VAX, no hizo ninguna diferencia en la importancia del diseño. RISC permitió la producción de un verdadero procesador de 32 bits en una matriz de chip real utilizando lo que ya era una fábrica más antigua. Los diseños tradicionales simplemente no podían hacer esto; con tanta superficie del chip dedicada a la lógica del decodificador, un verdadero diseño de 32 bits como el Motorola 68020 requería fábricas más nuevas antes de volverse práctico. Usando las mismas fábricas, RISC I podría haber superado ampliamente a la competencia.

El 12 de febrero de 2015, el IEEE instaló una placa en la Universidad de California en Berkeley para conmemorar la contribución de RISC-I. [5] La placa dice:

RISC II

Matriz de disparos RISC II

Mientras que el diseño de RISC I se vio demorado, el trabajo en Berkeley ya se había centrado en el nuevo diseño de Blue . El trabajo en Blue avanzó más lentamente que en Gold, debido tanto a la falta de una necesidad apremiante ahora que Gold iba a fabricarse, como a los cambios en las clases y los estudiantes que participaban en el proyecto. Este ritmo también les permitió agregar varias características nuevas que terminarían mejorando considerablemente el diseño.

La diferencia clave fue un circuito de caché más simple que eliminó una línea por bit (de tres a dos), lo que redujo drásticamente el tamaño del archivo de registro. El cambio también requirió una sincronización de bus mucho más estricta, pero este fue un pequeño precio a pagar y, para satisfacer las necesidades, también se aceleraron otras partes del diseño.

Los ahorros gracias al nuevo diseño fueron enormes. Mientras que Gold contenía un total de 78 registros en 6 ventanas, Blue contenía 138 registros divididos en 8 ventanas de 16 registros cada una, con otros 10 registros globales. Esta expansión del archivo de registros aumenta la posibilidad de que un procedimiento determinado pueda incluir todo su almacenamiento local en registros y aumenta la profundidad de anidamiento. Sin embargo, el archivo de registros más grande requería menos transistores, y el diseño final de Blue, conocido como RISC II , implementó todo el conjunto de instrucciones RISC con solo 40.760 transistores. [6]

El otro cambio importante fue incluir un expansor de formato de instrucciones , que "convertía" de forma invisible las instrucciones de 16 bits a un formato de 32 bits. [ cita requerida ] Esto permitió que las instrucciones más pequeñas, normalmente cosas con uno o ningún operando, como NOP, se almacenaran en la memoria en un formato más pequeño de 16 bits, y que dos de esas instrucciones se empaquetaran en una sola palabra de máquina. Las instrucciones se expandirían de forma invisible a versiones de 32 bits antes de que alcanzaran la unidad lógica aritmética (ALU), lo que significa que no se necesitaron cambios en la lógica central. Esta sencilla técnica produjo una sorprendente mejora del 30% en la densidad del código, lo que hizo que un programa idéntico en Blue se ejecutara más rápido que en Gold debido a la menor cantidad de accesos a la memoria.

El RISC II demostró ser mucho más exitoso en silicio y en las pruebas superó a casi todos los miniordenadores en casi todas las tareas. Por ejemplo, el rendimiento varió desde el 85% de la velocidad VAX hasta el 256% en una variedad de cargas. El RISC II también se comparó con el famoso Motorola 68000 , considerado entonces la mejor implementación de chip comercial, y lo superó en un 140% frente a un 420%.

Seguimientos

El trabajo sobre los diseños RISC originales terminó con RISC II, pero el concepto sobrevivió en Berkeley. El núcleo básico fue reutilizado en SOAR en 1984, básicamente un RISC convertido para ejecutar Smalltalk (de la misma manera que se podría afirmar que RISC ejecutaba C ), y más tarde en el VLSI-BAM similar que ejecutaba Prolog en lugar de Smalltalk. Otro esfuerzo fue SPUR , que era un conjunto completo de chips necesarios para construir una estación de trabajo completa de 32 bits .

RISC es menos famoso, pero más influyente, por ser la base del diseño del procesador comercial SPARC de Sun Microsystems . Fue SPARC el que primero demostró claramente el poder del concepto RISC; cuando enviaron los primeros Sun-4 superaron a todo lo que había en el mercado. Esto llevó a que prácticamente todos los proveedores de Unix se apresuraran a tener un diseño RISC propio, lo que llevó a diseños como DEC Alpha y PA-RISC , mientras que Silicon Graphics (SGI) compró MIPS Computer Systems . En 1986, la mayoría de los grandes proveedores de chips siguieron su ejemplo, trabajando en iniciativas como Motorola 88000 , Fairchild Clipper , AMD 29000 y PowerPC . El 13 de febrero de 2015, IEEE instaló una placa en Oracle Corporation en Santa Clara. [7] Dice

Las técnicas desarrolladas para y junto con la idea del conjunto de instrucciones reducido también se han adoptado en implementaciones y extensiones cada vez más potentes de la arquitectura x86 "compleja" tradicional . Gran parte del recuento de transistores de un microprocesador moderno se dedica a grandes cachés, muchas etapas de canalización , envío de instrucciones superescalares , predicción de bifurcaciones y otras técnicas modernas que son aplicables independientemente de la arquitectura de instrucciones. La cantidad de silicio dedicada a la decodificación de instrucciones en una implementación x86 moderna es proporcionalmente bastante pequeña, por lo que la distinción entre implementaciones de procesadores "complejos" y RISC se ha vuelto borrosa.

Véase también

Referencias

Citas

  1. ^ Reilly, Edwin D. (2003). Hitos en la informática y la tecnología de la información . p. 50. ISBN 1573565210.
  2. ^ Chisnal, David (23 de agosto de 2010). "Understanding ARM Architectures" (Comprensión de las arquitecturas ARM). Informit . Consultado el 13 de octubre de 2015 .
  3. ^ ab Tanenbaum, Andrew (marzo de 1978). "Implicaciones de la programación estructurada para la arquitectura de máquinas". Comunicaciones de la ACM . 21 (3): 237–246. doi : 10.1145/359361.359454 . S2CID  3261560.
  4. ^ Peek, James B. (2 de junio de 1983). Circuito VLSI de RISC I (PDF) (Informe técnico). Berkeley, CA, EE. UU.: Universidad de California en Berkeley. pp. 13, 59. CSD-83-135.
  5. ^ "Recuerdos [de la reunión de RISC-I]". risc.berkeley.edu . Consultado el 19 de marzo de 2020 .
  6. ^ "Prototipos de hardware de Berkeley". people.eecs.berkeley.edu . Consultado el 6 de noviembre de 2021 .
  7. ^ Gee, Kelvin. "Oracle recibirá el premio IEEE Milestone Award por la arquitectura SPARC RISC". blogs.oracle.com . Consultado el 19 de marzo de 2020 .

Bibliografía