takeda escribió:Si alguien lee la noticia que me explique las consecuencias....'como si fuese un niño de 5 años'...
oido cocina!!!!
la 'ejecucion fuera de orden' se viene usando desde los PentiumII +o-
mas o menos viene de la necesidad de hacer el pipeline mas grande mientras se mantiene la misma velocidad de ejecucion...
todo procesador tiene lo que se denomina 'pipeline', que es su hilo de ejecucion... dicho en plata, lo que ejecuta el codigo.
pero claro, ese codigo debe ser decodificado a un estado en el que la CPU sepa que hacer con el, realizar los accesos a memoria, ejecuta propiamente el codigo, y sacar el resultado a memoria o al registro implicado. hemos llegado al punto en el que la CPU no es capaz de hacer el proceso de alimentarse, decodificar, acceder a ram, ejecutar la instruccion y provocar la salida en un solo ciclo de reloj. entonces se crearon pipelines (o hilos de ejecucion) de varias etapas. digamos, por ejemplo, que una CPU usa una pipeline de 5 etapas (que son pocas), en la cual hace:
- decodificacion (analiza el codigo recibido para acceder a lo necesario)
- prefetch (prepara los accesos a RAM o a registros a un estado estable)
- Fetch (realiza los accesos a RAM o registros)
- Ejecuta (ejecuta propiamente el codigo)
- Salida (realiza la escritura al registro pertinente para dar por finalizada la ejecucion)
con una pipeline de 5 etapas, tu codigo entraria en decodificacion en el primer ciclo, en el segundo ciclo el codigo entraria en prefetch, pero ya estaria entrando otro codigo en decodificacion... por decirlo asi, es como si una pipeline estubiera ejecutando 5 instrucciones a la vez... pero en cola...
el problema llega cuando la hay una bifurcacion. si en la etapa de ejecucion se descubre que hay un salto en la ejecucion a otra parte del codigo, el trabajo que esta realizando las etapas de decodificacion, de prefetch y de fetch es basura, porque es codigo que no se deberia ejecutar debido al salto, en tal caso, la pipeline se va a la mierda y debe ser descartada, porque despues del salto, la pipeline debe llenarse de nuevo antes de que la CPU vuelva a procesar datos, con lo cual se dice que un salto tiene una penalizacion de 'x ciclos' que es el tiempo que tarda la pipeline en llenarse de nuevo.
esto se alivia realizando 'ejecucion fuera de orden', cuando hay un salto, el salto se detecta en la etapa de 'decodificacion', no en la de ejecucion, con lo cual la CPU 'intenta adivinar' hacia donde va a ir el salto y empieza a llenar la pipeline con donde ella cree que va a ir, entonces se dice que el salto solo tiene una penalizacion de '1 ciclo' o 'ciclo de decodificacion'. pero claro, cuando se realiza un salto condicional (o sea, salta solo si tal valor es tal...) la CPU solo puede determinar la direccion real del salto en el momento de ejecucion, en tal caso, la CPU tiene que 'apostar' por donde empezar a llenar el pipeline... si acierta, pues solo tiene de penalizacion el 'ciclo de decodificacion', si falla la prediccion, tiene que volver a llenar la pipeline...
ahora, lo normal es que los CPUs actuales tengan pipelines de hasta 30 (TREINTA!!) etapas, con lo cual un error en la ejecucion fuera de orden hace que se tenga la CPU ociosa durante 30 ciclos de CPU hasta que se llene otra vez la pipeline... por ponerte un ejemplo, un P4 que no use ejecucion fuera de orden, seria unas 20 veces mas lento de lo que actualmente es...
pues ese es el problema de la PS3 al parecer... el trabajo de mantener la CPU constantemente ocupada recae en el compilador, que debe intentar que todo el codigo que se ejecute de forma continua quede secuencialemente colocado para que no halla ningun salto que eche a perder esa maravillosa pipeline de unas 30 etapas... con lo cual el compilador, ademas de ser compilador, debe ser interprete para hacer un analisis de la ejecucion y ver cuantas 'pipelines basura' se generan e intentar reordenar el codigo para aliviarlo lo maximo posible...