http://www.tecnodelinglesalcastellano.com
relaciona exactamente la profundidad de la segmentación con el rendimiento del
microprocesador en los diferentes tipos de código.
Tenga en cuenta que si usted lee un artículo anterior mío de hace unos años titulado
"Descripción de la segmentación y ejecución superescalar", encontrará en la primera parte
de este texto específicamente la analogía con la línea de montaje vagamente familiar. El
presente artículo se basa en parte en que el artículo anterior, pero se ha rediseñado desde
cero para ser más claro, más preciso y más actualizado.
En un procesador moderno, los cuatro pasos anteriores se repiten una y otra vez hasta que
el programa termina de ejecutarse. Estos son, de hecho, las cuatro etapas en
la segmentación RISC clásica. (Voy a definir el término "segmentación" en breve, por
ahora, sólo piense en la segmentación como una serie de etapas que cada instrucción en la
secuencia de código debe atravesar cuando el flujo de código está siendo ejecutado.) Aquí
están las cuatro etapas en su forma abreviada, la forma que usted verá más a menudo:
1. Obtener (fetch)
2. Decodificar
3. Ejecutar
http://www.tecnodelinglesalcastellano.com
4. Escribir (o "write-back")
Se puede decir que cada una de las etapas anteriores representa una fase en el "ciclo de
vida" de una instrucción. Una instrucción comienza en la fase de obtención (fetch), se
mueve a la fase de decodificación, luego a la fase de ejecución, y finalmente a la fase de
escritura. Cada fase toma una cantidad de tiempo fijo, pero de ninguna manera igual. En la
mayoría de los procesadores de ejemplo con los que vamos a estar trabajando en este
artículo, las cuatro fases toman una cantidad igual de tiempo, lo cual no suele ser el caso de
los procesadores en el mundo real. En cualquier caso, si un procesador sencillo de ejemplo
tarda exactamente un nanosegundo para completar cada fase, entonces, el procesador que
puede terminar una instrucción cada 4 nanosegundos.
http://www.tecnodelinglesalcastellano.com
Etapa 3: Poner puertas, una capucha, y las cubiertas en el chasis.
Etapa 4: Montar las ruedas.
Etapa 5: Pintar el SUV.
Cada una de las etapas anteriores requiere el uso de trabajadores altamente capacitados y
con habilidades muy especializadas, con el resultado de que los trabajadores que son
buenos en la construcción de chasis no saben mucho acerca de motores, carrocería, ruedas,
o pintura, y también sucede así con los constructores de motores, los pintores, y los otros
equipos. Así que cuando hacemos nuestro primer intento de montar una fábrica de SUV,
contratamos y capacitamos cinco equipos de especialistas, uno para cada etapa del proceso
de construcción del SUV. Hay un equipo para construir el chasis, uno para montar el
motor, otro para las ruedas, y un equipo de pintura. Por último, ya que los equipos son tan
especializados y eficientes, cada etapa del proceso de construcción del SUV le toma a un
equipo exactamente una hora para completarse.
Ahora bien, como mis amigos y yo somos gente de computadoras y no ingenieros
industriales, tenemos mucho que aprender sobre cómo hacer un uso eficiente de los
recursos de la fábrica. Hemos basado el funcionamiento de nuestra primera fábrica en el
siguiente plan: ubicar los cinco equipos en una línea en el piso de la fábrica, y que el primer
equipo empiece una camioneta en la Etapa 1. Después que la etapa 1 se completa, el equipo
de la etapa 1 pasa el SUV parcialmente terminado al equipo de la etapa 2 y luego se va a la
sala de descanso para jugar un futbolín, mientras que el equipo de la etapa 2 fabrica y
monta el motor. Una vez que el equipo de la etapa 2 concluye, la camioneta continua hacia
la Etapa 3 y el equipo 3 se hace cargo, mientras que el equipo 2 se une al equipo 1 en la sala
de descanso.
El SUV se mueve en la línea a través de las cinco etapas de esta manera, con un solo equipo
de trabajo en un mismo escenario en un momento dado, mientras que el resto de los
equipos están inactivos. Una vez que el SUV concluye la fase 5, el equipo de la etapa 1
entonces, comienza el otro SUV. A este ritmo, se necesitan exactamente cinco horas para
terminar un SUV único, y nuestra fábrica completa una SUV cada cinco horas. ?
Adelantémonos un año. Nuestra SUV, el Extinction LE, se está vendiendo como ... bueno,
se está vendiendo como un SUV, lo que significa que lo está haciendo bastante bien. De
hecho, nuestro SUV se está vendiendo tan bien que hemos llamado la atención de los
http://www.tecnodelinglesalcastellano.com
militares y han ofrecido un contrato para proveer SUVs para el Ejército de EE.UU a un
ritmo continuo. Al Ejército le gusta ordenar múltiples SUVs a la vez, puede haber una
orden para 10 SUVs, y otra orden puede ser para 500 vehículos SUV. Mientras más
órdenes podamos llenar cada año fiscal, más dinero podemos hacer durante ese mismo
período y nuestro balance será mejor. Esto, por supuesto, significa que vamos a querer
encontrar una manera de aumentar el número de SUVs que nuestra fábrica puede
completar por hora (es decir, la tasa de terminación de nuestra fábrica de SUVs). Al
completar más SUVs por hora, podemos llenar las órdenes del Ejército más rápido y ganar
más dinero cada año.
La manera más intuitiva de aumentar la tasa de completamiento de nuestra fábrica de SUV
sería tratar de disminuir el tiempo de producción de cada camioneta. Si pudiéramos
conseguir que los equipos trabajen el doble de rápido, entonces, nuestra fábrica podrá
producir el doble de SUVs en la misma cantidad de tiempo. Nuestros equipos están
trabajando tan duro como pueden, de manera que, a menos que haya un avance
tecnológico que incremente la productividad esta opción está fuera de la mesa por ahora.
Puesto que no podemos acelerar nuestro personal, siempre podemos utilizar el método de
la fuerza bruta, y meterle dinero al problema mediante la construcción de una segunda
línea de montaje. Si fuéramos a contratar y capacitar cinco equipos nuevos para formar
una segunda línea de montaje, que también fuera capaz de producir un coche cada cinco
horas, podríamos completar un total de dos camionetas cada cinco horas en el piso de la
fábrica, el doble de la tasa de terminación de SUVs de la fábrica actual. Esto no parece un
uso muy eficiente de los recursos de la fábrica, dado que, ya no sólo tenemos el doble de
equipos que trabajan a la vez, sino que también tendríamos el doble de equipos en la sala
de descanso a la vez. Tiene que haber una manera mejor.
Ante la falta de opciones, contratamos a un equipo de consultores para hallar una forma
inteligente de incrementar la productividad general de la fábrica sin la necesidad de
duplicar el número de equipos o de aumentar la productividad de cada equipo individual.
Un año y miles de horas facturables más tarde, a los consultores se le ocurrió una solución.
¿Por qué dejar que nuestros equipos malgasten cuatro quintas partes de su jornada de
trabajo en la sala de descanso, cuando podrían estar haciendo un trabajo útil durante ese
tiempo? Con la programación adecuada de los actuales cinco equipos, nuestra fábrica
podría completar un SUV cada hora, y así mejorar drásticamente tanto la eficiencia como
http://www.tecnodelinglesalcastellano.com
el rendimiento de nuestra línea de montaje. El flujo de trabajo revisado se vería de la
siguiente manera:
El equipo de la etapa 1 construye un chasis. Una vez que el chasis es completado, lo
envían al equipo de la etapa 2. La Etapa 2 de la tripulación recibe el chasis y comienza a
montar el motor, mientras que el equipo de la etapa 1 inicia un nuevo chasis. Cuando
ambos equipos hayan terminado, el trabajo del equipo de la etapa 2 avanza hacia la etapa
3, los avances del trabajo del equipo de la etapa 1 pasan al equipo de la etapa 2, y el equipo
de la etapa 1 inicia un nuevo chasis.
Así a medida que la línea de montaje comienza a llenarse de SUVs en diversas etapas de
producción, más equipos se ponen a trabajar simultáneamente hasta que todos los equipos
están trabajando en un vehículo diferente en una etapa diferente de la producción. (Por
supuesto, así es como la mayoría de nosotros hoy en día, en la era post-Ford, esperamos
que funcione una linea de ensamblaje eficiente.) Si podemos mantener la línea de montaje
llena, y mantener los cinco equipos trabajando a la vez, entonces, podemos producir un
SUV cada hora: una mejora de cinco veces en la tasa de terminación de SUV sobre la tasa
de terminación anterior de un SUV de cada cinco horas. Eso, en pocas palabras, es la
segmentación.
Mientras que la cantidad total de tiempo que cada SUV individual pasa en la producción no
ha cambiado desde el original, 5 horas, la velocidad a la que la fábrica en su conjunto
completa los SUVs, y por lo tanto la velocidad a la que la fábrica puede cumplir las órdenes
del Ejército de los lotes de SUVs, ha aumentado drásticamente. La segmentación hace su
magia haciendo un uso óptimo de los recursos ya existentes. No necesitamos acelerar cada
una de las etapas del proceso de producción, ni tenemos necesidad de aumentar
drásticamente la cantidad de recursos que gastamos en el problema, todo lo necesario es
trabajar mas con los recursos que ya tenemos.
Llevando la discusión de nuevo a los microprocesadores, será fácil ver cómo este concepto
se aplica a las cuatro fases del ciclo de vida de una instrucción. Al igual que los propietarios
de la fábrica en nuestra analogía querían aumentar el número de SUVs que la fábrica
podría terminar en un período determinado de tiempo, los diseñadores de
microprocesadores están siempre buscando maneras de aumentar el número de
instrucciones que una CPU puede completar en un determinado período de tiempo.
http://www.tecnodelinglesalcastellano.com
Cuando recordamos que un programa es una secuencia ordenada de instrucciones,
entonces es claro que el aumento del número de instrucciones ejecutadas por unidad de
tiempo es una manera de disminuir la cantidad total de tiempo que se tarda en ejecutar un
programa. En términos de nuestra analogía, un programa es como una orden de SUVs de
los militares, al igual que aumentar la producción de nuestra fábrica de camionetas por
hora nos ha permitido cumplir con los pedidos más rápido, aumentar la tasa de realización
de instrucciones de nuestro procesador (es decir, el número de instrucciones completadas
por unidad de tiempo) nos permite ejecutar programas más rápidamente.
http://www.tecnodelinglesalcastellano.com
Figura PIPELINING 4: Un procesador de un solo ciclo.
En
n el diagrama anterior, la instrucción en color azul abandona la zona de almacenamiento
de código, entra en el procesador, y luego avanza a través de las fases de su ciclo de vida en
el transcurso del período de reloj de cuatro nanosegundos, hasta que al final
f del cuarto
nanosegundo se completa la última fase y su ciclo de vida se ha terminado. El final del
cuarto nanosegundo es también el final del primer ciclo de reloj, así que ahora que el
primer ciclo de reloj está terminado y la instrucción azul ha finalizado
finalizado su ejecución, la
instrucción roja puede entra en el procesador en el inicio de un nuevo ciclo de reloj y pasar
por el mismo proceso. Esta secuencia de pasos de cuatro nanosegundos se repite hasta que,
después de un total de 16ns (o cuatro ciclos de reloj), el procesador ha completado las
cuatro instrucciones para una tasa de finalización de instrucciones de 0,25
instrucciones/ns (= 4 instructions/16 ns).
Los procesadores de un solo ciclo como el de la figura PIPELINING.4 son fáciles de
diseñar, pero malgastan muchos recursos de hardware. Todo ese espacio en blanco en el
diagrama representa hardware del procesador que está sentado de brazos cruzados
mientras espera a que la instrucción que actualmente se encuentra en el procesador
finalice su ejecución.
n. Segmentando el procesador de arriba, podemos poner más hardware
a trabajar cada nanosegundo, aumentando así la eficiencia del procesador y su
rendimiento en la ejecución de los programas.
Antes de continuar, debo aclarar algunos aspectos del diagrama anterior que algunos
pueden encontrar confusos. En la parte inferior del diagrama hay una región marcada
http://www.tecnodelinglesalcastellano.com
"Instrucciones completadas". Ahora, las instrucciones completadas en realidad no van a
ninguna parte cuando se han terminado de ejecutar, una vez que han hecho su trabajo de
decirle al procesador cómo modificar el flujo de datos, son simplemente eliminadas del
procesador. (Tenga en cuenta que las instrucciones que se han eliminado del procesador
aún existen en el área de almacenamiento de código y están disponibles para su uso
repetido) Así que el área de "Instrucciones completadas" en la parte inferior de la figura
PIPELINING.4 no representa una parte real del equipo, por lo que he puesto una línea de
puntos alrededor de ella. Esta zona es sólo un lugar para hacer un seguimiento de cuantas
instrucciones el procesador ha completado en un período de tiempo determinado, o la tasa
de completamiento de instrucciones del procesador (o tasa de finalización, para abreviar),
de modo que al comparar los diferentes tipos de procesadores vamos a tener un lugar
donde mirar rápidamente y obtener una sensación instantánea de qué procesador tiene un
mejor rendimiento. Mientras mas instrucciones completa un procesador en un periodo de
tiempo, mejor rendimiento tendrá en los programas, que son una secuencia ordenada de
instrucciones. Así que piense en la caja de "Instrucciones completadas" como una especie
de cuadro de indicadores para el seguimiento de la tasa de finalización de cada procesador,
y marque la casilla en cada uno de los siguientes diagramas para ver cuánto tiempo le toma
al procesador rellenar esta casilla.
Siguiendo con el punto anterior, puede sentir curiosidad en cuanto a por qué la instrucción
azul que ha finalizado en el cuarto nanosegundo no aparece en el cuadro de "Instrucciones
Completadas" hasta el quinto nanosegundo. La razón es sencilla, y se deriva de la
naturaleza de la figura. Debido a que una instrucción gasta un nanosegundo completo, de
principio a fin, en cada etapa de ejecución, la instrucción azul entra en la fase de escritura
en el inicio del cuarto nanosegundo y sale de esta fase al final del cuarto nanosegundo. Esto
significa que el quinto nanosegundo es el primer nanosegundo completo en el que la
instrucción azul es completada . Así, al comienzo del quinto nanosegundo (que coincide
con el final del cuarto nanosegundo) el procesador ha completado una instrucción.
http://www.tecnodelinglesalcastellano.com
Recordemos la manera en que dividimos el proceso de ensamblaje de SUV en cinco pasos
discretos, con un equipo dedicado asignado a completar cada paso, y tendrá la idea.
Debido a que e ciclo de vida de una instrucción se compone de cuatro fases muy distintas,
podemos comenzar por dividir el proceso de ejecución de instrucciones de un procesador
de un solo ciclo en una secuencia de cuatro etapas discretas segmentadas, en la que cada
etapa o segmento corresponde a una fase del ciclo de vida estándar de la instrucción:
Tenga en cuenta que el número de etapas del proceso se conoce como profundidad de
segmentación. Así que nuestras cuatro etapas de segmentación equivalen a una
profundidad de segmentación de cuatro.
Por conveniencia, digamos que a cada una de las cuatro etapas de la segmentación del
ejemplo le toma exactamente un nanosegundo terminar su labor en una instrucción, al
igual que cada equipo en nuestra analogía de la línea de montaje tuvo una hora para
terminar su parte del trabajo en un SUV. Así que el proceso de ejecución de cuatro
nanosegundos de nuestro procesador original de ciclo único, se ha dividido en cuatro
etapas, discretas, secuenciales de segmentos de un nanosegundo de longitud cada uno.
Ahora veamos otro esquema para ver cómo una CPU segmentada ejecutaría las cuatro
instrucciones ilustradas en la figura PIPELINING.4.
http://www.tecnodelinglesalcastellano.com
Figura PIPELINING 5: Segmentación de cuatro etapas.
http://www.tecnodelinglesalcastellano.com
Reduciendo el reloj.
Puede ver en el diagrama anterior que la función del reloj del CPU cambia ligeramente en
un procesador segmentado, en comparación con el procesador de un solo ciclo de la figura
PIPELINING.4. Debido a que todas las etapas de la tubería ahora deben trabajar juntas al
mismo tiempo y estar listas al inicio de cada nuevo nanosegundo para entregar los
resultados de su trabajo a la siguiente etapa del segmento, el reloj es necesario para
coordinar la actividad de la tubería en general. La forma en que esto se hace es simple:
reducir el tiempo de ciclo de reloj para que coincida con el tiempo que tarda cada etapa en
completar su labor, de modo que al inicio de cada ciclo de reloj cada etapa de la tubería
entregue la instrucción en la que estaba trabajando a la siguiente etapa. Debido a que cada
etapa de la tubería en nuestro procesador de ejemplo se toma un nanosegundo para
completar su trabajo, podemos establecer el ciclo de reloj en un nanosegundo de duración.
Este nuevo método de suministrarle reloj al procesador significa que una nueva
instrucción no necesariamente se completará al final de cada ciclo de reloj, como fue el
caso del procesador de un solo ciclo. En vez de eso, una nueva instrucción se
completará sólo al final de los ciclos de reloj en el que la etapa de write-back ha estado
trabajando en una instrucción. Cualquier ciclo de reloj con una etapa write-back vacía no
añadirá ninguna instrucción nueva a la caja de "Instrucciones completadas", y cualquier
ciclo de reloj con una etapa write-back activa añadirá una nueva instrucción a la caja. Por
supuesto, esto significa que cuando el segmento comience a trabajar en un programa,
habrá varios ciclos de reloj, tres para ser exactos, durante los cuales no se completará
ninguna instrucción. Pero una vez que se inicia el cuarto ciclo de reloj, la primera
instrucción entra en la etapa write-back y la tubería puede entonces comenzar a
completar las nuevas instrucciones en cada ciclo de reloj, que, dado que cada ciclo de reloj
es de un nanosegundo, se traduce en una tasa de terminación de una instrucción por
nanosegundo .
http://www.tecnodelinglesalcastellano.com
de ejecución del programa (es decir, el número de nanosegundos que se tarda en ejecutar
un programa completo) al aumentar el número de instrucciones acabadas por unidad de
tiempo. Al igual que la segmentación de nuestra hipotética línea de montaje de SUVs nos
permitió cumplir con los pedidos del Ejército en un lapso corto de tiempo, aunque cada
SUV individual todavía pasaba un total de cinco horas en la línea de montaje, así permite la
segmentación al procesador ejecutar programas en una menor cantidad de tiempo a pesar
de que cada instrucción individual todavía pasa la misma cantidad de tiempo de viaje a
través de la CPU. La segmentación hace un uso más eficiente de los recursos existentes de
la CPU, poniendo todas sus unidades para trabajar de forma simultánea, con lo que podrá
hacer más trabajo total, en cada nanosegundo
http://www.tecnodelinglesalcastellano.com