¿Qué es la ejecución especulativa?

Disparo de la CPU Intel Sandy Bridge

Como discusión de laDefectos de Spectre y Meltdownsigue dominando el ciclo de noticias tecnológicas, se ha hecho referencia repetida a una característica específica de las CPU de gama alta: la ejecución especulativa. Es una capacidad clave de los productos ARM de gama alta, los núcleos ARM personalizados de Apple, la familia POWER de IBM y la gran mayoría de los procesadores x86 producidos por Intel y AMD. A continuación, se muestra qué es la ejecución especulativa y cómo se relaciona con otras capacidades clave de los microprocesadores modernos, y cómo el reciente error Meltdown se dirige a las CPU de Intel en particular.

¿Qué es la ejecución especulativa?

La ejecución especulativa es una técnica que utilizan los diseñadores de CPU para mejorar el rendimiento de la CPU. Es uno de los tres componentes de la ejecución fuera de orden, también conocida como ejecución dinámica. Junto con la predicción de múltiples ramas (que se usa para predecir las instrucciones que probablemente se necesitarán en un futuro cercano) y el análisis del flujo de datos (que se usa para alinear las instrucciones para una ejecución óptima, en lugar de ejecutarlas en el orden en que llegaron), la ejecución especulativa entregó un Mejora espectacular del rendimiento con respecto a los procesadores Intel anteriores. Debido a que estas técnicas funcionaron tan bien, AMD las adoptó rápidamente, que utilizó un procesamiento fuera de orden a partir del K5. El enfoque de ARM en los procesadores móviles de baja potencia inicialmente lo mantuvo fuera del campo de juego OOoE, pero la compañía adoptó una ejecución fuera de orden cuando construyó el Cortex A9 y ha continuado expandiendo su uso de la técnica con Cortex posterior y más poderoso. CPU de marca.

Así es como funciona. Las CPU modernas están todas en canalización, lo que significa que son capaces de ejecutar varias instrucciones en paralelo, como se muestra en el siguiente diagrama.



Pipeline-Wikipedia

Imagen de Wikipedia. Este es un diagrama general de una CPU canalizada, que muestra cómo las instrucciones se mueven a través del procesador de un ciclo de reloj a otro.

Imagina que el bloque verde representa una rama si-entonces-si no. El predictor de rama calcula qué rama es más probable que se tome, obtiene el siguiente conjunto de instrucciones asociadas con esa rama y comienza a ejecutarlas especulativamente antes de saber cuál de las dos ramas de código utilizará. En el diagrama de arriba, estas instrucciones especulativas se representan como el cuadro violeta. Si el predictor de bifurcaciones adivinó correctamente, entonces el siguiente conjunto de instrucciones que la CPU necesitaba está alineado y listo para funcionar, sin demora en la ejecución o bloqueo de la tubería.

Sin predicción de rama y ejecución especulativa, la CPU no sabe qué rama tomará hasta que la primera instrucción en la tubería (el cuadro verde) termine de ejecutarse y se mueva a la Etapa 4. En lugar de pasar directamente de un conjunto de instrucciones a la a continuación, la CPU tiene que esperar a que lleguen las instrucciones adecuadas. Esto perjudica el rendimiento del sistema, ya que es hora de que la CPU pueda realizar un trabajo útil.

La razón por la que su ejecución 'especulativa', por supuesto, es porque la CPU podría estar equivocada. Si es así, el sistema carga los datos apropiados y ejecuta esas instrucciones en su lugar. Pero los predictores de rama no se equivocan muy a menudo; las tasas de precisión suelen estar por encima del 95 por ciento.

¿Por qué utilizar la ejecución especulativa?

Hace décadas, antes de que se inventara la ejecución fuera de orden, las CPU eran lo que hoy llamamos diseños 'en orden'. Instrucciones ejecutadas en el orden en que fueron recibidas, sin ningún intento de reordenarlas o ejecutarlas de manera más eficiente. Uno de los principales problemas con la ejecución en orden es que un bloqueo de la tubería detiene toda la CPU hasta que se resuelve el problema.

El otro problema que impulsó el desarrollo de la ejecución especulativa fue la brecha entre la CPU y las velocidades de la memoria principal. El siguiente gráfico muestra la brecha entre la CPU y los relojes de la memoria. A medida que crecía la brecha, también crecía la cantidad de tiempo que la CPU pasaba esperando en la memoria principal para entregar información. Las características como las cachés L1, L2 y L3 y la ejecución especulativa se diseñaron para mantener la CPU ocupada y minimizar el tiempo que pasa inactivo.

mem_gap

Si la memoria pudiera igualar el rendimiento de la CPU, no habría necesidad de cachés.

Funcionó. La combinación de grandes cachés fuera de matriz y ejecución fuera de orden dio a Pentium Pro y Pentium II de Intel oportunidades para estirar las piernas de una manera que los chips anteriores no podían igualar. Este gráfico de una Anandtech de 1997 artículo muestra la ventaja claramente.

cpuben6

Gracias a la combinación de ejecución especulativa y cachés grandes, el Pentium II 166 supera decisivamente a un Pentium 250 MMX, a pesar de que este último tiene una ventaja de velocidad de reloj de 1.51x sobre el primero.

En última instancia, fue el Pentium II el que entregó los beneficios de la ejecución fuera de orden a la mayoría de los consumidores. El Pentium II era un microprocesador rápido en relación con los sistemas Pentium que habían sido de gama alta poco antes. AMD era una opción de segundo nivel absolutamente capaz, pero hasta que se lanzó el Athlon original, Intel tenía un bloqueo en la corona de rendimiento absoluto.

El Pentium Pro y el Pentium II posterior eran mucho más rápidos que las arquitecturas anteriores que usaba Intel. Esto no estaba garantizado. Cuando Intel diseñó el Pentium Pro, gastó una cantidad significativa de su presupuesto de matriz y energía para permitir la ejecución fuera de orden. Pero la apuesta dio sus frutos, a lo grande.

Existen diferencias entre la forma en que Intel, AMD y ARM implementan la ejecución especulativa, y esas diferencias son parte de la razón por la que Intel está expuesta a algunos de estos ataques de una manera que no lo están otros proveedores. Pero la ejecución especulativa, como técnica, es simplemente demasiado valiosa para dejar de usarla. En la actualidad, cada arquitectura de CPU de gama alta (AMD, ARM, IBM, Intel, SPARC) utiliza una ejecución fuera de orden. Y la ejecución especulativa, aunque se implementa de manera diferente de una compañía a otra, es utilizada por cada uno de ellos. Sin la ejecución especulativa, la ejecución fuera de orden como la conocemos no funcionaría.

¿Por qué Meltdown es un problema tan grande para Intel?

La razón por la que Meltdown causa dolores de cabeza tan singulares para Intel es porque Intel permite especulativo ejecución para acceder a la memoria privilegiada que una aplicación de espacio de usuario nunca podría tocar. Así es como MarkCC de Goodmath.org describe el problema:

Código que se ejecuta en ejecución especulativa no compruebe si los accesos a la memoria desde la caché están accediendo a la memoria privilegiada. Empieza a ejecutar las instrucciones sin la verificación de privilegios, y cuando sea el momento de comprometerse con la continuación de la ejecución especulativa, se realizará la verificación. Pero durante esa ventana, tiene la oportunidad de ejecutar un lote de instrucciones en el caché sin verificaciones de privilegios. De modo que puede escribir código con la secuencia correcta de instrucciones de bifurcación para que la predicción de bifurcaciones funcione de la manera que desee; y luego puede usar eso para leer la memoria que no debería poder leer.

Las implementaciones de predicción especulativa de otros proveedores de CPU no permiten que las aplicaciones de espacio de usuario prueben el contenido de la memoria del espacio del kernel en ningún momento. La única forma de mitigar Meltdown en el software es forzar al sistema a realizar un cambio de contexto completo cada vez que cambia entre el kernel y el espacio de memoria del usuario. La razón por la que el impacto en el rendimiento de Meltdown es tan variado es que cuánto duele este parche es una función de la frecuencia con la que una aplicación tiene que cambiar de contexto. Sin embargo, los problemas de rendimiento parecen estar limitados a los servidores y, en general, no se han visto en el lado del consumidor, al menos, no mucho.

Hay impactos en el rendimiento de algunas estrategias de mitigación

Una de las estrategias de mitigación que hemos visto propuestas, particularmente más recientemente, es deshabilitar Hyper-Threading. Apple ha publicado una actualización relacionada con MDS, notificando a sus usuarios que pueden deshabilitar HT si quieren limitar la capacidad de filtración de datos entre varios subprocesos dentro del mismo núcleo de CPU. También han declarado que esto puede afectar el rendimiento hasta en un 40 por ciento. Ese es un caso extremo porque HT generalmente no 'vale' tanto rendimiento para una CPU Intel; esperaríamos que el impacto típico esté en el rango del 20-30 por ciento, pero sigue siendo un golpe significativo y mucho más rendimiento que nosotros. normalmente se ve en una nueva versión de CPU.

Ha habido un genuino desacuerdo entre los expertos sobre el grado en que las personas deben hacer esto para protegerse. Algunos, como Theo de Raadt, que dirige el proyecto FreeBSD, han HT discapacitado por defecto. Otros sistemas operativos aún tienen que dar este paso. Empresas como Apple han evitado decirles a los clientes que también hagan esto, escritura: 'Aunque no hay exploits conocidos que afecten a los clientes en el momento de escribir este artículo, los clientes que creen que su computadora tiene un mayor riesgo de ataque (pueden deshabilitar HT)'. Algunos de los parches asociados con la reparación de Spectre y Meltdown también han tenido impactos en el rendimiento, aunque algunos de los impactos se redujeron luego con parches adicionales, y el grado de desaceleración depende de la carga de trabajo y, hasta cierto punto, de la arquitectura de la CPU en primer lugar.

A largo plazo, esperamos que AMD, Intel y otros proveedores continúen solucionando estos problemas a medida que surjan, con una combinación de actualizaciones de hardware, software y firmware. Conceptualmente, los ataques de canal lateral como estos son extremadamente difíciles, si no imposibles, de prevenir. Se pueden mitigar o solucionar problemas específicos, pero la naturaleza de la ejecución especulativa significa que una cierta cantidad de datos se filtrará en circunstancias específicas. Puede que no sea posible prevenirlo sin renunciar a un rendimiento mucho mayor del que la mayoría de los usuarios querrían aceptar.

Copyright © Todos Los Derechos Reservados | 2007es.com