Ayuda: Pipeline,¿Que sucede cuando aparece una interrupción?

Buenas eolianos:

Estoy estudiando para un examen de procesadores DSP, y tengo una duda acerca de pipeline.

El concepto de pipeline y sus fases, es algo que tengo relativamente claro, incluso el criterio que debe cumplir para un flujo de datos correcto. Pues bien, en uno de los exámenes, el profesor preguntó ¿Que sucede si aparece una interrupción en pipeline?
La verdad es que no se la respuesta, he tratado de buscar informacion en internet, pero no he dado con una respuesta mas o menos clara.

Alguin podria echarme una mano?

Muchisimas gracias
No sé sobre DSP, asi que sobre eso exactamente no te puedo ayudar. Ahora bien, tengo alguna que otra noción sobre procesadores segmentados generales, y te tengo que decir que depende mucho de cómo estén implementados. Si tienen capacidad de lanzar instrucciones en desorden, ejecutarlas en desorden pero que finalicen en orden, esto es, implementan Tomasulo con buffer de reordenamiento, entonces las excepciones son tratadas de forma correcta. Sin embargo, si no tienen buffer de reordenamiento (igual lo conoces como ROB Re-order buffer) entonces las excepciones pueden ser imprecisas, porque puede saltar una excepción en un instruction fetch mientras que en la fase de ejecución tienes otra instrucción que no produce excepción y se lanzó antes, pero se va a comer la excepción.

Tampoco sé hasta que nivel de profundidad estudias la segmentación del pipe, porque lo mismo no llegáis al lanzamiento desordenado de instrucciones y entonces todo lo que te he contado antes te habrá sonado a chino XD
De todas maneras, creo que igual en PC-Hardware o en PC-General te podrán ayudar mejor. Espero que te haya servido de algo lo que te he comentado, aunque no sea sobre DSP, y si tienes alguna duda que te pueda resolver, pregunta ;)

Un saludo.
SI, si te refieres a Out of order execution si que lo hemos estudiado. Tambien hemos estudiado la implemetacion de este metodo (OoO) mediante Tomasulo.

Aun asi, por ejemplo supongamos que tenemos una ejecucion pipeline como esta:
Imagen

Que ocurriria si aparece una interrupcion?

No tiene nada que ver con delayed branch o con branch prediction verdad? porque eso es solo para instrucciones que violan la condicion para mantener el pipeline filled...

Muchas gracias por tu respuesta, pero no me ha quedado demasiado claro tio [buuuaaaa]
¿Pero habéis estudiado que las instrucciones tienen que finalizar en orden? Es decir, ¿habéis visto el buffer de reordenamiento (reorder buffer)? Porque si no es así, ya te digo yo que el problema es que las excepciones son imprecisas, y te pongo un ejemplo para que lo veas claro.

Sobre la imagen que pones, siempre suponiendo que no hayáis visto el ROB, imagina que la instrucción 5, en su primera fase, de fetch, produce una excepción (por no encontrarse en cache, por ejemplo). Ahora, si te fijas, en el ciclo 5, que es cuando se ha lanzado el IF de la I5, verás que está ejecutándose I2. Pues si piensas "secuencialmente", que I5 produzca una interrupción no debería perjudicar ni a I2, ni a I3 ni a I4, ya que a priori, si se hubiesen lanzado secuencialmente, habrían terminado sin excepciones (suponiendo que esas instrucciones no vayan a lanzar ninguna excepción). En cambio, se están viendo afectadas, ya que el hw (y esto es lo que no te puedo asegurar, porque no conozco como funcionan DSPs, pero en procesadores generales si es así) va a pasar al tratamiento de la interrupción (o de la excepción) vaciando lo que hay en el pipe, con lo que las instrucciones I2, I3 e I4 se van a ver condicionadas. Para que no le afectasen, lo suyo sería que se parase el lanzamiento de nuevas instrucciones y, una vez finalizadas todas las anteriores a la que ha producido la interrupcion, se hiciese el tratamiento. Que es básicamente lo que pasa cuando hay un ROB, pero de forma algo más sofisticada.

Con respecto a los saltos, ahora mismo no lo recuerdo completamente, pero si hay una predicción errónea, lo único que pasa es que hay que vaciar el pipe, deshacer el trabajo hecho de forma predictiva y cargar las instrucciones de la rama correcta.

Si esto no te ayuda puedo buscar mis apuntes y echarle un ojo más detenidamente, pero vamos, en principio creo que te estoy diciendo lo correcto. Ya me dirás.

¡Un saludo!
Muchas gracias por tu tiempo :D

Si que hemos dado el reordered buffer, así que, a ver si me ha quedado claro:

Imaginemos que la ejecución es la que se muestra en la figura, como tu has sugerido, en la etapa fetch de la I5 se produce la excepción...

¿el procesador atendería inmediatamente la excepción limpiando el pipe, y una vez atendida la excepción y almacenada en el buffer, volvería a empezar con el fetch de la I2,decode de la I2 and fetch de la I3, etc,, y una vez ejecutadas todas las instrucciones (de I2 a I4), mediante el ROB irían saliendo del buffer en orden de I2 a I5??

Espero haberte entendido bien, y haberme expresado correctamente :D

Un saludo y muchísimas gracias
No sé si he entendido muy bien lo que acabas de poner, pero creo que no me has entendido bien XD

Si hay ROB, lo que sucede es lo siguiente:

Supón el ciclo 5, en que I2 está en ejecución, I5 en IF e I5 produce una interrupción. I5 registrará la petición en el ROB. En algún momento posterior, I2 termina. Igual sucede con I3 y con I4. Cuando están todas terminadas, (aunque I3 acabase antes que I2), se sacan del ROB -se hace commit- porque ya han finalizado, y se sacan en orden (esto me imagino que ya lo sabes, y aunque releyéndome creo que lo estoy explicando un poco mal, me entiendes XD). Entonces, I5 queda en la cabecera del ROB, por lo que sabes fehacientemente que no es una instrucción especulada. Es entonces cuando reconoces la interrupción, porque cualquier instrucción anterior habrá finalizado. Por tanto, ninguna instrucción anterior puede provocar una excepción. Por eso, entre otras cosas (además de para rehacerse de los errores en predicción de saltos/especulación) es por lo que se introduce el ROB, para que el tratamiento de interrupciones sea preciso.

Espero haberme explicado mejor ahora. Antes, sin saber si habíais dado ROB o no, estaba especulando [qmparto] [qmparto] .

Y de nada, para esto estamos, ¿no? Siempre es de agradecer que alguien te eche un cable con estas cosas, que no es que sean triviales, precisamente. A mi me costó mi tiempo comprenderlo, ojalá alguien me hubiese ayudado con esto en su momento... XD

EDIT: Otra cosa que no te he dicho, la he dado por supuesta pero ahora me he dado cuenta que igual no lo has visto claro. Atender a la interrupción se hará únicamente si I5 está en la cabecera del ROB, no si está "finalizada". Imagina que I5 lanza la interrupción no en IF sino en ejecución, I2 está en la cabecera del ROB, que I3, I4 e I5 "han terminado", pero I2 era una división en punto flotante y son muchos ciclos, por lo que esa instrucción aún no "ha terminado". Puesto que I2 está en el ROB antes de I3, de I4 y de I5, ni I3 ni I4 ni I5 pueden hacer commit, de modo que no se trata de que I5 llegue a "finalizar" para reconocer la interrupción, sino de que esté en la cabecera.

Si tienes alguna otra duda, no dudes en preguntar, a ver si te la sé contestar ;)
5 respuestas