¿Qué sucede si una predicción de rama sobrescribe un valor?

1

Estamos aprendiendo sobre la predicción de las ramas, por lo que es posible que no entienda totalmente cómo funcionan, pero, según tengo entendido, las ramas están listas para predecir si se toman o no. La tubería comenzará a procesar la siguiente instrucción o dos antes de que se decida la rama. Una vez que se decide la rama, si la predicción era correcta, no pasa nada, pero si la predicción es incorrecta, la tubería simplemente pasa a procesar la instrucción correcta en el siguiente reloj.

Esto me lleva a mi pregunta.

Di que tuve un ensamblaje como este:

loop: addi r1 r1 1
sub r2 $0 r3
...
...(other random things)
...
bne r1 $0 loop
sw r2 0(r1)

Si la rama se predijera como tomada, los valores de r1 y r2 se sobrescribirían antes de que la rama se resolviera y luego sw tendría los valores incorrectos. ¿Cómo lidiar con esto? ¿Es esto solo un problema inherente en la predicción de la rama o existe un protocolo para almacenar esos valores hasta que la rama se haya decidido?

¡Gracias!

    
pregunta Indigo

2 respuestas

2

Predicción de rama es una Técnica de microarquitectura para mejorar el rendimiento de procesadores optimizados .

Conozco 3 formas en que una persona puede diseñar un procesador con predicción de bifurcación para manejar la predicción errónea: cancelación de instrucciones, cambio de nombre de registro o ranuras de retardo. (¿Hay alguna otra forma?)

ranuras de retardo

El MIPS y el DSP de SHARC y varios otros procesadores utilizan ranuras de retardo . Las ranuras de retardo se pueden ver como un tipo muy simple de predicción de rama: una que siempre predice que nunca se tomará una rama. Si hay una predicción errónea de la rama, si la rama se toma realmente, las instrucciones en la ranura de retardo se ejecutan incondicionalmente de todos modos. Este es un problema inherente con las ranuras de retardo.

Sin embargo, no es un problema inherente con la predicción de rama.

compatibilidad del conjunto de instrucciones

La mayoría de las CPU están diseñadas para ser binarias compatibles con algunas CPU anteriores. Dado que muchas CPU tempranas terminaron completamente de ejecutar una instrucción antes de pasar a la siguiente, muchas CPU modernas intentan mantener la ilusión. La mayoría de los procesadores actúan "como si" ejecutaran una instrucción completamente antes de pasar a la siguiente, actuando de manera efectiva "como si" no ejecutaran ninguna de esas instrucciones erróneas en el lado incorrecto de la rama. (Algunas personas consideran que las ranuras de retardo son "ilógicas" porque las ranuras de retardo rompen la ilusión de ejecutar una instrucción completamente antes de pasar a la siguiente).

En un procesador canalizado, los resultados no se escriben (confirman) en el archivo de registro o en la memoria hasta que última etapa de la tubería: la etapa de reescritura.

cancelación de instrucciones

Con la cancelación de instrucciones, cuando hay una predicción errónea de bifurcación, un cable de retroalimentación desde la etapa de resolución de bifurcación a todas las etapas previas indica que hubo una predicción errónea. En la siguiente marca de reloj, cuando cada instrucción en la tubería avanza a la siguiente etapa, todas las instrucciones en la tubería "detrás" de la rama se transforman simultáneamente en una "burbuja", el equivalente a una instrucción NOP. Mientras tanto, el buscador de instrucciones comienza a cargar la tubería con instrucciones de la "rama de la derecha". Una a la vez, cada instrucción llega a la etapa de reescritura. Las instrucciones que han sido canceladas (transformadas en una burbuja) no escriben nada en el archivo de registro o en la memoria. Eso evita que se muestren valores erróneos en el archivo de registro o en la memoria. Una vez que las burbujas se han agotado, las instrucciones de la rama de la derecha comienzan a llegar a la fase de escritura y escriben los valores correctos en el archivo de registro o en la memoria.

registrar cambio de nombre

Escucho rumores de que algunos procesadores superscalar con ejecución fuera de orden use cambio de nombre de registro para habilitar ejecución ansiosa - para obtener instrucciones de ambos lados de la rama. A medida que las instrucciones se cargan en la tubería, el decodificador de instrucciones expande / renombra nombres de registros lógicos cortos en las instrucciones a nombres físicos más largos. El mismo nombre de registro en dos instrucciones diferentes en dos lados de la rama se expande a dos nombres de registro físico diferentes.

Cuando la instrucción de bifurcación llega a la etapa de resolución que finalmente resuelve en qué dirección realmente irá, Todas las instrucciones de almacenamiento de memoria en la rama incorrecta se cancelan. Mientras tanto, el buscador de instrucciones deja de extraer instrucciones de la rama incorrecta y se enfoca solo en la rama correcta.

A medida que cada instrucción llega a la etapa de reescritura, los que eran de la rama incorrecta pueden (en algunos diseños) escribir en un registro físico, pero los datos de manera incorrecta en esos registros físicos nunca influyen en las instrucciones de TIENDA que se ejecutan realmente - cualquier instrucción de TIENDA con una dependencia directa o indirecta en esa forma incorrecta, los datos se convertirán en una burbuja que no hace nada en el momento en que llega a la fase de reescritura. Todas las TIENDAS en la rama de la derecha se ejecutarán correctamente, porque solo usan registros físicos influenciados por las instrucciones de la rama de la derecha. Esos registros físicos nunca son sobrescritos por ninguna instrucción en la rama incorrecta.

    
respondido por el davidcary
2

Es muy posible que la instrucción se ejecute, ya que su pregunta se refiere específicamente a MIPS en las etiquetas. Se encuentra en lo que se denomina ranura de retardo de rama , y se ejecuta sin tener en cuenta el resultado de la rama inmediatamente anterior . Esto podría considerarse un predictor de rama primitivo con efectos secundarios, donde la predicción es no ramificarse y el efecto secundario es que la tubería no se vacíe por completo y todas las acciones se "deshacen". En general, los compiladores serán conscientes de esto para una arquitectura determinada y reordenarán las instrucciones (o insertarán un nop) de manera apropiada.

En el otro lado de la moneda, hay procesadores que realmente tienen el riesgo de sobrescribir los registros necesarios cuando se predice una rama de forma incorrecta. Esto se puede manejar mediante una forma de registro de cambio de nombre , en el que ocurre una de dos cosas:

  • Los valores escritos se escriben en un conjunto diferente de registros con datos especulativos; ese conjunto de registros se utiliza luego si la predicción de rama fue correcta (Archivo futuro)
  • Los valores antiguos se escriben en un historial búfer para ser restaurados si la predicción de la rama sucedió para predecir erróneamente la ruta a tomar.

Por supuesto, el cambio de nombre de los registros a los buffers especulativos o históricos se puede combinar con técnicas de cambio de nombre más avanzadas que eliminan el riesgo de sobrescritura de valor y mejoran el rendimiento de alguna otra manera al eliminar la serialización de Instrucciones utilizando un registro, uno tras otro.

    
respondido por el Andrey Akhmetov

Lea otras preguntas en las etiquetas