lunes, 9 de mayo de 2011

Segmentación, generalidades (Parte I)

Quedó referenciado en el artículo anterior, así que aquí está (la primera parte, ya el enlace está corregido). De nuevo, usamos los términos, tubería, segmentación o incluso pipelining indistintamente y si se les hace confuso, lean este completamente, aquí viene explicado con manzanitas (bueno, con SUVs de hecho). El original lo pueden encontrar aquí, es de Arstechnica (como el anterior) el autor es Jon Stokes. Hoy es lunes, así que les saludo y provecho! 

Entendiendo el rendimiento de la segmentación
El Pentium 4 original fue un diseño radical por una serie de razones, pero quizás su característica más notable y controvertida, fue su segmentación extraordinariamente profunda. Con más de 20 etapas, la segmentación del P4 casi doblaba la profundidad de la segmentación de los competidores. Recientemente Prescott, su sucesor de 90nm, llevó la segmentación al siguiente nivel al agregar otras 10 etapas a la ya increíblemente larga segmentación del Pentium 4.
La estrategia de Intel de profundizar la segmentación del Pentium 4, una práctica que Intel llama "hyperpipelining", ha dado sus frutos en términos de rendimiento, pero no deja de tener sus inconvenientes. En artículos anteriores sobre el Pentium 4 y Prescott, me he referido a las desventajas asociadas con segmentaciones profundas, e incluso he tratado de explicar estos inconvenientes en el contexto de artículos técnicos mas extensos sobre Netburst y otros temas. En la presente serie de artículos, quiero dedicar un tiempo a explicar la segmentación, su efecto sobre el rendimiento de los microprocesadores, y sus desventajas potenciales. Te llevaré a través de una introducción básica al concepto de segmentación y, a continuación voy a explicar lo que se requiere para hacer segmentación con éxito y qué dificultades enfrentan los diseños de segmentaciones profundas como Prescott. Al final del artículo, usted tendrá una idea clara sobre cómo se 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.

El ciclo de vida de una instrucción
La acción básica de cualquier microprocesador a medida que se mueve a través del flujo de instrucciones puede dividirse en una serie de cuatro sencillos pasos, que cada instrucción en el flujo de código atraviesa a fin de ser ejecutada:

 1.- Obtener (fetch) la siguiente instrucción de la dirección almacenada en el contador de programa.
 2.- Almacenar esta instrucción en el registro de instrucciones y decodificarlo, e incrementar la dirección en el contador de programa.
 3.- Ejecutar la operación que está actualmente en el registro de instrucciones. Si la instrucción no es una instrucción de salto, sino una instrucción aritmética, enviarla a la ALU adecuada.
  a). Leer el contenido de los registros de entrada.
  b). Agregue el contenido de los registros de entrada.
4.- Escribir los resultados de la instrucción desde la ALU hacia el registro de destino.

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
  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.

Segmentación básica: una analogía
En esta sección utilizaremos la analogía de una fábrica para explicar la segmentación. Otras personas utilizan analogías mas simples, como lavar la ropa, por ejemplo, para explicar esta técnica, pero hay algunas razones por las que elegí una analogía más elaborada y extensa para ilustrar lo que es en su raíz, un concepto relativamente simple. En primer lugar, las fábricas basadas en lineas de montaje son fáciles de visualizar para los lectores y hay mucho espacio para imágenes mentales interesantes con el fin de enfocar una variedad de puntos relacionados. En segundo lugar, y quizás más importante aún, los muchos problemas relacionados con programación (scheduling), colas y administración de recursos que enfrentan los diseñadores de fábricas tienen analogías directas con la arquitectura de computadores. En muchos casos, los problemas y las soluciones son exactamente iguales, trasladadas simplemente a dominios diferentes. (Tenga en cuenta que ciertos pares de problemas/soluciones similares relacionados con colas también surgen en la industria de los servicios, por lo que las analogías relativas a supermercados y restaurantes de comida rápida también son mis favoritas.)
Digamos que mis amigos y yo hemos decidido entrar en el negocio de fabricación de automóviles, y que nuestro primer producto va a ser un vehículo deportivo utilitario (SUV). Después de algunas investigaciones, determinamos que hay cinco etapas en el proceso de construcción del SUV:

Etapa 1: Construir el chasis. 
Etapa 2: Colocar el motor en el chasis. 
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 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 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. 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.

Un ejemplo sin segmentación.
Los primeros, procesadores sin "segmentación" trabajaban en una instrucción a la vez, moviendo cada instrucción a través de las cuatro fases de su ciclo de vida en el curso de un ciclo de reloj. Así, los procesadores sin "segmentación" también se les llama procesadores de un solo ciclo, porque a todas las instrucciones les toma exactamente un ciclo de reloj para completarse (o,  pasar a través de las cuatro fases de su ciclo de vida).
Debido a que el procesador completa las instrucciones a un ritmo de una por ciclo de reloj, queremos que el reloj de la CPU corra tan rápido como sea posible para que la tasa de completamiento de instrucciones del procesador (es decir, el número de instrucciones completado por nanosegundo) sea tan alta como sea posible. Por lo tanto tenemos que calcular la cantidad mínima de tiempo que toma completar una instrucción, y hacer el tiempo de ciclo de reloj equivalente a ese lapso de tiempo. Lo que pasa es que en nuestro CPU hipotético de ejemplo, las cuatro fases del ciclo de vida de una instrucción toman un total de cuatro nanosegundos para completarse. Por lo tanto, deberíamos establecer la duración del ciclo de reloj de la CPU a cuatro nanosegundos, para que la CPU pueda completar el ciclo de vida de la instrucción, desde el fetch hasta el write-back, en un solo reloj. (Un ciclo de reloj de la CPU es a menudo llamado simplemente un "reloj", para abreviar).
Figura PIPELINING 4: Un procesador de un solo ciclo.
En 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 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 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. 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 "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.

Un ejemplo con segmentación.
Segmentar un procesador implica dividir el proceso de ejecución de la instrucción a lo que le llamamos "ciclo de vida" de la instrucción, en una serie de etapas de segmentos separados, que puede ser completada en una secuencia por hardware especializado. 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:

Etapa 1: Obtener la instrucción desde el almacenamiento de código.
Etapa 2: Decodificar la instrucción. 
Etapa 3: Ejecutar la instrucción. 
Etapa 4: Escribir los resultados de la instrucción de vuelta al archivo del registro.

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.
Figura PIPELINING 5: Segmentación de cuatro etapas.
Al comienzo del primer nanosegundo, la instrucción azul entra en la etapa de "fetch". Después de que el primer nanosegundo es completado, inicia el segundo nanosegundo y la instrucción azul pasa a la fase de decodificación, mientras que la siguiente instrucción, la roja, empieza a hacer su camino desde el almacenamiento de código hacia el procesador (es decir, entra en la etapa de fetch). Al inicio del tercer nanosegundo, la instrucción azul avanza a la fase de ejecución, la instrucción roja avanza a la etapa de decodificación, y la instrucción verde entra en la etapa de fetch. En el cuarto nanosegundo, la instrucción azul entra a la fase de escritura, la roja a la etapa de ejecución, la verde a la fase de decodificación, y la violeta a la etapa de fetch. Después de que el cuarto nanosegundo ha transcurrido totalmente e inicia el quinto nanosegundo, la instrucción azul deja la tubería y concluye su ejecución. Por lo tanto podemos decir que al final de cuatro nanosegundos (= cuatro ciclos de reloj) el procesador segmentado descrito arriba ha completado una instrucción.
Al inicio del quinto nanosegundo, la tubería está ahora llena y el procesador puede empezar a completar las instrucciones a ritmo de una instrucción por nanosegundo. Esta tasa de completamiento de 1 instrucción/ns es una mejora de cuatro veces en la tasa de terminación del procesador de .25 instrucciones/ns (o 4 instrucciones cada 16 nanosegundos).

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 .

Disminución de tiempo de ejecución del programa.
Tenga en cuenta que el tiempo total de ejecución de cada instrucción individual no es alterado por la segmentación. Todavía le tomará a cada instrucción 4ns hacer todo su camino a través del procesador, que 4ns se pueden dividir en 4 ciclos de reloj de 1ns cada uno, o puede cubrir un ciclo de reloj más largo, pero siguen siendo los mismos 4ns. Así, la segmentación no acelera el tiempo de ejecución de la instrucción, pero sí acelera el tiempo 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.