stringtranslate.com

Berkeley RISC

Berkeley RISC es uno de los dos proyectos de investigación fundamentales sobre 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 tuvo lugar a poca distancia, en la Universidad de Stanford, bajo su esfuerzo MIPS que comenzó en 1981 y se desarrolló hasta 1984.

El proyecto de Berkeley tuvo tanto éxito que se convirtió en el nombre de todos los diseños similares posteriores; incluso el MIPS pasaría a ser conocido como "procesador RISC". El diseño de Berkeley RISC fue posteriormente comercializado 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 sólo 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 se podía representar 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 alcanzada en 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 completamente en ese momento, fue la nota de Tanenbaum de que el 81% de las constantes eran 0, 1 o 2. [3]

Estos descubrimientos se produjeron cuando el mercado de microprocesadores estaba pasando de 8 a 16 bits con diseños de 32 bits a punto de aparecer. Esos diseños se basaron en el objetivo de replicar algunas de las ISA existentes más respetadas del mundo de las 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 utilizaron microcódigo para decodificar las instrucciones visibles 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 sugirieron estos otros artículos, la mayoría de estos códigos de operación nunca se usarían en la práctica, entonces este importante recurso se estaba desperdiciando. Si simplemente se construyera el mismo procesador sin las instrucciones no utilizadas, sería más pequeño y, por lo tanto, menos costoso, mientras que si se usaran esos transistores para mejorar el rendimiento en lugar de decodificar instrucciones que no se usarían, sería posible un procesador más rápido. El concepto RISC era aprovechar ambos, produciendo una CPU con el mismo nivel de complejidad que el 68000, pero mucho más rápida.

Para hacer esto, RISC se concentró en agregar muchos más registros , pequeños bits de memoria que contienen valores temporales a los que se puede acceder muy rápidamente. Esto contrasta con la memoria principal normal , cuyo acceso puede tardar varios ciclos. Al proporcionar más registros y asegurarse de que los compiladores realmente los utilicen, 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 en rendimiento a una CPU convencional.

El lado negativo es que las instrucciones que se eliminaban generalmente realizaban varias "subinstrucciones". Por ejemplo, la ADDinstrucción de un diseño tradicional generalmente vendría en varios estilos, uno que sumaba los números en dos registros y los colocaba en un tercero, otro que sumaba números encontrados en la memoria principal y ponía el resultado en un registro, etc. Los diseños RISC, por otro lado, incluían solo un tipo único de cualquier instrucción en particular; ADDpor ejemplo, siempre usaría registros para todos los operandos. Esto obligó al programador a escribir instrucciones adicionales para cargar los valores desde la memoria, si era necesario, haciendo que un programa RISC fuera "menos denso".

En la era de la memoria cara, esto era una preocupación real, especialmente 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 un guardado), la máquina tendría que acceder mucho más a la memoria para leer las instrucciones adicionales, lo que podría ralentizarla considerablemente. Esto se vio compensado hasta cierto punto por el hecho de que los nuevos diseños utilizaban lo que entonces era una palabra de instrucción muy grande de 32 bits , lo que permitía incorporar pequeñas constantes directamente en la instrucción en lugar de tener que cargarlas por separado. Además, los resultados de una operación suelen ser utilizados poco después por otra, por lo que al omitir la escritura en la memoria y almacenar el resultado en un registro, el programa no terminó siendo mucho más grande y, en teoría, podría ejecutarse mucho más rápido. Por ejemplo, una cadena de instrucciones que llevan a cabo una serie de operaciones matemáticas podría requerir sólo unas pocas cargas de memoria, mientras que la mayoría de los números utilizados serían constantes en las instrucciones o valores intermedios dejados en los registros de cálculos anteriores. En cierto sentido, en esta técnica se utilizan algunos registros para ocultar ubicaciones de memoria, de modo que los registros se utilizan como sustitutos de las ubicaciones de memoria hasta que se hayan determinado sus valores finales después de que se haya determinado un grupo de instrucciones.

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

Donde diferían los dos proyectos, RISC y MIPS, era en el manejo de los registros. MIPS simplemente agregó muchos registros y dejó que los compiladores (o programadores en lenguaje ensamblador ) los utilizaran. RISC, por otro lado, agregó circuitos a la CPU para ayudar al compilador. RISC utilizó 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 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 resultado que deben devolverse. . En la gran mayoría de los casos, estos marcos son pequeños, típicamente con tres o menos entradas y una o ninguna salida (y a veces una entrada se reutiliza como salida). Entonces, en el diseño de Berkeley, una ventana de registro era un conjunto de varios registros, suficientes para que todo el marco de la pila de procedimientos probablemente encajara completamente dentro de la ventana de registro.

En este caso, la entrada y salida de un trámite es sencilla y extremadamente rápida. Se llama a una sola instrucción para configurar un nuevo bloque de registros (una nueva ventana de registro) 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 del mismo extremo y se cierra el procedimiento. Las ventanas de registro están configuradas para superponerse en los extremos, de modo que los resultados de la llamada simplemente "aparecen" en la ventana de la persona que llama, 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.

El lado negativo es que este enfoque significa que los procedimientos con un gran número de variables locales son problemáticos y los que tienen menos conducen a 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 sólo pueden anidarse a muchos 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 ninguna ventana nueva para otra llamada anidada. Y si los procedimientos solo están anidados a unos pocos niveles de profundidad, nunca se podrá acceder a los registros en las ventanas por encima del nivel de anidamiento 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 en lenguaje ensamblador).

RISC I

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 entonces complicado hizo fallar casi todas las herramientas de diseño existentes. El equipo tuvo que dedicar una cantidad considerable de tiempo a mejorar o reescribir las herramientas, e incluso con estas nuevas herramientas tomó poco menos de una hora extraer el diseño en un VAX-11/780 .

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

RISC I también presentó un canal de instrucciones de dos etapas para mayor velocidad, pero sin el complejo reordenamiento de instrucciones de los diseños más modernos. Esto hace que las ramas condicionales sean un problema, porque el compilador tiene que completar la instrucción que sigue a una rama condicional (la llamada ranura de retardo de rama ), con algo seleccionado para que sea "seguro" (es decir, que no dependa del resultado del condicional). A veces la única instrucción adecuada en este caso es NOP. Un número notable de diseños posteriores de estilo RISC todavía requieren la consideración del retraso de la rama.

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 variedad de retrasos los obligaron a abandonar sus máscaras cuatro veces distintas, y las obleas con ejemplos funcionales no llegaron a Berkeley hasta mayo de 1982. La primera "computadora" RISC I en funcionamiento (en realidad, un tablero de pago) funcionó el 11 de junio. , los chips demostraron tener un rendimiento menor de lo esperado. En general, una instrucción tardaría 2 μs en completarse, mientras que el diseño original asignaba aproximadamente 0,4 μs (cinco veces más rápido). Las razones precisas de este problema nunca se explicaron completamente. Sin embargo, durante las pruebas quedó claro que ciertas instrucciones se ejecutaron a la velocidad esperada, lo que sugiere 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 que utilizaron una variedad de programas pequeños compararon el RISC I de 4 MHz con el VAX 11/780 de 5 MHz y 32 bits y el Zilog Z8000 de 5 MHz y 16 bits lo mostraron claramente. El tamaño del programa era aproximadamente un 30% mayor que el del VAX, pero muy cercano al del Z8000, lo que validaba 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 dos veces más rápido que el VAX y aproximadamente cuatro veces más que el Z8000. Los programas terminaron realizando aproximadamente el mismo número total de accesos a la memoria porque el gran archivo de registro mejoró dramáticamente las probabilidades de que el operando necesario ya estuviera en el chip.

Es importante poner esta actuación en contexto. Aunque el diseño RISC fue 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 un chip real utilizando lo que ya era una fábrica más antigua. Los diseños tradicionales simplemente no podían hacer esto; Con gran parte de la 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, IEEE instaló una placa en UC Berkeley para conmemorar la contribución de RISC-I. [5] La placa dice:

RISCII

Si bien el diseño de RISC I sufrió retrasos, el trabajo en Berkeley ya se había centrado en el nuevo diseño Blue . El trabajo en Azul avanzó más lentamente que en Oro, debido tanto a la falta de una necesidad apremiante ahora que Gold iba a ser fabuloso, como a los cambios en las clases y en los estudiantes que atendían el esfuerzo. 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), reduciendo drásticamente el tamaño del archivo de registro. El cambio también requirió tiempos de autobús mucho más ajustados, pero fue un pequeño precio a pagar y para satisfacer las necesidades también se aceleraron varias otras partes del diseño.

Los ahorros gracias al nuevo diseño fueron tremendos. 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 registro aumenta la posibilidad de que un procedimiento determinado pueda acomodar todo su almacenamiento local en registros y aumentar la profundidad de anidamiento. Sin embargo, el archivo de registro más grande requería menos transistores, y el diseño final de Blue, denominado RISC II , implementó todo el conjunto de instrucciones RISC con sólo 40.760 transistores. [6]

El otro cambio importante fue incluir un expansor de formato de instrucciones , que "convertía" de forma invisible instrucciones de 16 bits a un formato de 32 bits. [ cita necesaria ] Esto permitió que instrucciones más pequeñas, generalmente 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 manera invisible a versiones de 32 bits antes de que llegaran a la unidad lógica aritmética (ALU), lo que significa que no se necesitaban cambios en la lógica central. Esta sencilla técnica produjo una sorprendente mejora del 30% en la densidad del código, haciendo 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.

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

Seguimientos

El trabajo en los diseños originales de RISC terminó con RISC II, pero el concepto siguió vivo en Berkeley. El núcleo básico se reutilizó 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 el SPARC el primero en demostrar claramente el poder del concepto RISC; cuando lanzaron 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 conseguir un diseño RISC propio, lo que dio lugar a diseños como DEC Alpha y PA-RISC , mientras que Silicon Graphics (SGI) compró MIPS Computer Systems . En 1986, le siguieron la mayoría de los grandes proveedores de chips, trabajando en esfuerzos como el Motorola 88000 , Fairchild Clipper , AMD 29000 y el PowerPC . El 13 de febrero de 2015, IEEE instaló una placa en Oracle Corporation en Santa Clara. [7] Se lee

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 tradicional x86 "compleja" . 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 ramas 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 "complejas" y RISC se ha vuelto borrosa.

Ver también

Referencias

Citas

  1. ^ Reilly, Edwin D. (2003). Hitos en Informática y Tecnologías de la Información . pag. 50.ISBN​ 1573565210.
  2. ^ Chisnal, David (23 de agosto de 2010). "Comprensión de las arquitecturas ARM". Informar . 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. ^ Echa un vistazo, James B. (2 de junio de 1983). El circuito VLSI de RISC I (PDF) (Reporte técnico). Berkeley, CA, EE. UU.: Universidad de California en Berkeley. págs.13, 59. CSD-83-135.
  5. ^ "objetos de recuerdo [Reunión 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. ^ Vaya, Kelvin. "Oracle recibirá el premio IEEE Milestone por la arquitectura SPARC RISC". blogs.oracle.com . Consultado el 19 de marzo de 2020 .

Bibliografía