Escribí un procesador especulativo fuera de servicio en verilog cuando estaba en la universidad, por lo que puedo responder esto con cierto grado de confianza.
Cuando predice una rama, continúa como si su predicción fuera 100% correcta. Esto significa que, si encuentra otra rama, simplemente la pronosticará nuevamente y continuará como siempre. Si se determina que su sucursal es un error de predicción, debe eliminar todas las instrucciones que dependen de la validez de la predicción de la sucursal.
Con respecto a la implementación, en un procesador especulativo fuera de servicio estándar, las instrucciones pueden completarse fuera de servicio. Las salidas de las instrucciones se colocan en algún tipo de búfer de reordenamiento para permitir la confirmación en orden. Por ejemplo, no queremos comprometer escrituras de memoria actualizadas y registrar valores hasta que estemos seguros de que todas nuestras ramas están tomadas. Cuando descubrimos un error de predicción, lo eliminamos simplemente invalidando todas las instrucciones completadas en nuestro búfer de reordenamiento.
- Si pudieras mejorar cualquier producto de Microsoft, ¿qué harías?
- ¿Cuáles son algunos ejemplos concretos de temas de doctorado en bioinformática para alguien con experiencia en CS?
- ¿Qué métodos podrían haber utilizado las agencias de inteligencia para determinar que Rusia fue la fuente de los ataques de DNC?
- ¿Puede una computadora ser lo suficientemente rápida como para detectar una bala en tiempo real? Imagine un círculo en el suelo y se dispara una bala desde fuera del círculo hacia él. ¿Sería una computadora lo suficientemente rápida como para detectar la bala dentro de un par de nanosegundos?
- ¿Tiene sentido una optimización de enjambre de partículas posterior a un algoritmo genético?
Implementar un búfer de reordenamiento en verilog no es demasiado difícil. Es similar a implementar cualquier estructura similar a la cola.
- Tiene un puntero al frente del búfer de reordenamiento. Esto se incrementa cada vez que se compromete la mayor cantidad de instrucciones.
- Tiene otro puntero en la parte posterior del búfer de reordenamiento. Cuando se obtiene una instrucción, este puntero se incrementa y se asigna a esa instrucción.
- Cuando se obtiene una instrucción de bifurcación, le asignamos el valor del segundo puntero.
- A medida que seguimos incrementando el segundo puntero, podemos descubrir que la rama se pronosticó erróneamente. Si es así, simplemente revertimos el segundo puntero a lo que era cuando buscamos la rama (que afortunadamente almacenamos en la viñeta anterior). Esto invalidará efectivamente todas las instrucciones que dependen de esa rama.