ISA no perdona errores

–X86 es un malentendido histórico, - el maestro y en 80 no perdió el entusiasmo polémico.
"En realidad, ella posee el 95% del mercado de servidores", le respondí con lentitud. No quería discutir sobre un tema cien veces trillado
- y ya estoy confundido en estos prefijos, - el académico no cedió. - 15 bytes por instrucción, ¡esto es impensable!
- Bueno, no hielo, por supuesto. ¿Pero quién es mejor?
- Sí, cualquiera, al menos ARM-a.
"Todavía no entiendo". Adiciones con multiplicaciones deben ser?
- Debería.
- ¿Y turnos con operaciones lógicas?
- Si.
- Y descargas con guardados también. ¿Cuál es la diferencia en cómo se llaman y codifican?

Como de costumbre, me di cuenta de la corrección del profesor mucho más tarde. Cuando me senté a escribir un decodificador de comandos en una triste noche de invierno para divertirme de alguna manera. Logré representar un decodificador simple para ARM en VHDL (y lo sé más o menos) en un par de días. Es cierto, me arrepiento, tenía una hoja de trucos. :)

imagen

Para X86 no fue posible durante una semana, dos o un mes ... Incluso para el conjunto básico.

La diferencia aquí no es solo en RISC (Computación de conjunto de instrucciones reducido) para ARM y CISC (Conjunto de instrucciones complejas) para X86. La diferencia está más bien en el camino del desarrollo histórico. Hace más de 40 años, y todo comenzó en 1978, el X86 ISA (Instruction Set Architecture) era un conjunto bastante compacto de comandos con su propia lógica interna. Pero el tiempo pasó, la capacidad del autobús aumentó, los registros se expandieron (incluido SIMD), el número de equipos creció constantemente. Entonces un chico hizo un intento interesante de simplemente contar la cantidad de instrucciones en X86. Si era demasiado vago para abrir el manualy contarlos, o él sabía sobre la existencia de códigos de operación "sin nombre" (equipos que ni siquiera tienen un nombre), o creía en la omnipotencia de la lógica. Es fácil entender que la lógica resultó ser impotente. :) Por cierto, traté de encontrar un gráfico del crecimiento en el número de instrucciones X86 por año (o por generación). Todavía no pude (¿tal vez alguien lo tiene?). Pero encontré aquí una imagen así .

imagen

Para ser honesto, no sé cuántas instrucciones hay en el X86 ISA. Pero recuerdo bien todos los que invertí en el desarrollo yo mismo, sin darme cuenta de que cada parte nueva de ISA está etiquetada como "guardar para siempre". Y había varios miles de "creadores" como yo en Intel. Y los bits para codificar todas sus fantasías faltaban constantemente. :) Todos los nuevos prefijos se agregaron al conjunto de comandos existente: REX, VEX ... Se introdujo la última extensión de cuatro bytes (EVEX) para el AVX-512. Por cierto, todo el conjunto de comandos ARM (incluso teniendo en cuenta SVE ) se elimina en estos mismos 4 bytes. ARM inicialmente fue al revés, construyendo su sistema de comando sobre los principios básicos de simplicidad, compacidad y extensibilidad.

La diferencia puede entenderse si cambiamos del punto de vista del programador al punto de vista del diseñador de circuitos. Y se sabe que el transistor es una gran cosa, pero cambia lentamente y disipa la energía descaradamente. Y en igualdad de condiciones, sería mejor si hubiera menos. Ahora, eche un vistazo al algoritmo de decodificación para instrucciones x86 (el problema que estaba tratando de resolver).

imagen

Y como dicen, sienta la diferencia en las rutas de entrada (front end) para ARM y X86. Aquí se puede argumentar que el front-end es una parte muy pequeña del núcleo, solo alrededor del 10%. Sí, pero no olvides que toda esta lógica se multiplica por el número de núcleos en el chip. Y esto es serio.

Otra consideración es que el front-end es solo la parte responsable de la compatibilidad con versiones anteriores. Puedes palear o incluso tirar con seguridad. Intel, por cierto, aprovechó esto a principios de la década de 2000, reemplazando la arquitectura NetBurst (P4) con Core-M (P3). Pero el extremo frontal no se puede reducir en gran medida. Aunque a veces realmente quiero, debido a la ISA X86 existente, ahora se usa alrededor del 20%. El resto son restos del pasado.

Otra desventaja de la gran cantidad de instrucciones son las fallas relativamente frecuentes en el caché de instrucciones. En términos generales, con el mismo tamaño de cachés, el número de errores será mayor, mayor será la duración de la instrucción. Por supuesto, el tamaño de los cachés se puede aumentar. Pero, de nuevo, estos son transistores que podrían no haber sido si las instrucciones fueran más cortas. Por la misma razón, desconfío de varios tipos de arquitecturas VLIW (Very Long Instruction World). Sin embargo, también tienen la desventaja de que les es muy difícil desarrollar compiladores. Hasta ahora, evité deliberadamente el tema de los compiladores, ya que nunca los desarrollé yo mismo. Me gustaría escuchar lo que la gente experta dirá sobre las delicias de desarrollar compiladores para RISC, CISC y VLIW.

Y, sin embargo, a pesar de la enorme carga de legado acumulada, y tal vez gracias a él, los desarrolladores de X86 estaban en lo cierto. El principio de compatibilidad con versiones anteriores se ha respetado en la arquitectura desde el principio. Todo el software existente funciona en el nuevo hardware de fábrica. Esto es lo que hizo posible construir un ecosistema tan profundo y desarrollado alrededor de la arquitectura. Y solo queda quitarse el sombrero frente a los ingenieros de Intel y AMD, quienes, a pesar del diseño ISA nada perfecto, han mantenido el liderazgo en el segmento de servidores durante muchos años. Sin embargo, la carga heredada se está volviendo más difícil.

All Articles