Desmitificando la batalla ARM vs x86: ¿cuál es realmente mejor?

Desde que Apple decidió adoptar el set de instrucciones ARM para los microprocesadores de sus ordenadores con el M1 a finales de 2020, muchos fanboys de la marca y algún que otro pseudo-experto no han parado de hablar de la superioridad de dicho set de instrucciones frente ha utilizado en el mundo del PC. Y sinceramente, cada vez que escuchamos o leemos a alguien soltar la ristra de burradas sobre el tema ARM vs x86, no sabemos si reír o llorar.

ARM y x86 no son más que lenguajes

Cuando alguien dice que ARM es mejor que x86, mi pregunta es: ¿a qué se refieren? ARM no es más que un set de instrucciones, al igual que x86. No estamos hablando de la organización y, por tanto, la arquitectura del procesador, sino del “idioma” que hablan, es decir, como han de interpretar el código en binario para ejecutar un programa. Es tan absurdo como decir ¿Qué lengua es mejor, el español o el inglés?

Codigo binario cono enrollado

El lenguaje de los ordenadores es en binario, pero cada bloque corresponde a una acción y a un objeto de la acción. Dado que un ordenador es el que ejecuta siempre, la acción no necesita de sujeto, dado que se sobreentiende y solo usa complemente directo. Por ejemplo, una lectura a memoria es “Lee tal dirección de memoria”. La diferencia entre x86 y ARM es que el código binario tiene diferentes significados, por lo que un programa escrito para ARM no lo entenderá una CPU x86 y viceversa. No tiene nada que ver con la potencia ni nada por el estilo.

El debate RISC versus CISC está más que superado

Claro está que a día de hoy, en todas las CPU contemporáneas, tanto x86 como ARM es una lengua franca, al llegar dichas instrucciones al decodificador del procesador se descomponen en otras mucho más simples y pequeñas de uso exclusivo. Esto se debe al hecho de que los microprocesadores lo que hacen es procesar las instrucciones de forma segmentada, es decir, hay varios ciclos para ejecutar cada una de ellas, pero no se espera a que acabe una instrucción completa para hacerlo con la siguiente, sino que más bien funciona como una cadena de montaje.

Pipeline CPU

En el microprocesador de cada etapa de la instrucción se encarga una parte distinta del mismo, de tal manera que cuando la primera de ellas está en la etapa 3, la segunda lo estará en la 2, la tercera en la 1 y la cuarta estará esperando para entrar. Cada una de estas etapas dura un ciclo de reloj y es aquí donde entra la necesidad de descomponerlas en instrucciones. Cuanto menos tiempo duren las etapas, mayor será la frecuencia que alcanza un microprocesador.

Es por ello que llegado a un punto, toda la pelea CISC contra RISC del que se basan los zelotes de ARM versus x86, es un sinsentido, ya que se ha llegado al punto en que internamente cada CPU las descompone en su propio set de microinstrucciones para funcionar, por lo que al final no dejan de ser lengua franca.

¿Qué dicen los estudios científicos?

Que mejor que un paper científico donde se hace la comparación de ARM vs x86 en microprocesadores actuales. Este data de 2013, por lo que los argumentos de muchos para hablar sandeces a la hora de comparar ambos conjuntos de instrucciones están ya más de una década desfasados.

Render CPU Generica

¿Y qué se deduce de tal estudio? Los podéis encontrar en la página 2 del mismo, en la sección de key findings, y qué traducidos dicen lo siguiente:

Los principales hallazgos de nuestro estudio son:

  • Existen brechas de rendimiento significativas entre las implementaciones, aunque las brechas promedio en el recuento de ciclos son <= 2.5 veces.
  • El recuento y la mezcla de instrucciones son independientes de la ISA en primer orden.
  • Las diferencias de rendimiento son generadas por diferencias en las microarquitecturas independientes de la ISA.
  • El consumo de energía nuevamente es independiente de la ISA.
  • Las diferencias en la ISA tienen implicaciones de implementación, pero las técnicas de microarquitectura modernas las hacen irrelevantes; una ISA no es fundamentalmente más eficiente.
  • Las implementaciones de ARM y x86 son simplemente puntos de diseño optimizados para diferentes niveles de rendimiento.

Por lo que el rendimiento no tiene nada que ver con el set de instrucciones, sea este ARM o x86, sino con la arquitectura y organización interna del procesador. La gente suele decir que ARM es superior por el núcleo de rendimiento para los chips de Apple, pero diseños ARM hay a patadas y han salido diferentes durante años, lo mismo que los x86 y con especificaciones diferenciadas.

La polémica del decodificador de instrucciones

Ahora bien, en los discursos de ARM frente a x86, uno de los puntos clave es el decodificador de instrucciones. El cual es mucho más complejo en x86 y acaba ocupando más espacio que su equivalente en ARM. ¿A qué se debe esto? Pues al hecho que mientras que en uno las instrucciones son de tamaño fijo, en el otro son de tamaño variable. Tal complejidad permite que en algunos diseños ARM como los de Apple sea posible descodificar hasta 10 instrucciones al vuelo, mientras que en x86 el máximo es 8.

Decodificador instrucciones x86

Sin embargo, no podemos olvidar que hay diseños ARM con decodificadores de 4 o 5 instrucciones. Y aquí hay una serie de puntos que hemos de tener en cuenta:

  • El rendimiento final de una instrucción depende de la eficiencia de las unidades de ejecución que la van a procesar en las etapas finales.
  • La predicción de saltos juega un papel importante, un procesador con una mala predicción de saltos puede recortar el rendimiento de forma severa.
  • Que una instrucción se procese lo más rápido posible depende de que las unidades estén disponibles en cada momento, y para ciertos tipos de ellas estás escasean.

Como se puede ver, el debate de ARM vs x86 está más que superado, y no merece la pena perder el tiempo en debates terraplanistas, que la vida sigue y la tecnología avanza.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Scroll al inicio