En ingeniería informática , la segmentación de instrucciones es una técnica para implementar el paralelismo a nivel de instrucción dentro de un único procesador. La segmentación busca mantener ocupada a cada parte del procesador con alguna instrucción, dividiendo las instrucciones entrantes en una serie de pasos secuenciales (la denominada " pipeline ") ejecutados por diferentes unidades de procesamiento , procesando distintas partes de las instrucciones en paralelo.
Concepto y motivación
En una computadora segmentada, las instrucciones viajan a través de la unidad central de procesamiento (CPU) por etapas. Por ejemplo, podría tener una etapa para cada paso del ciclo de von Neumann : obtener la instrucción, obtener los operandos, ejecutar la instrucción y escribir los resultados. Una computadora segmentada generalmente tiene registros de segmentación después de cada etapa. Estos almacenan información de la instrucción y los cálculos para que las compuertas lógicas de la siguiente etapa puedan realizar el siguiente paso.
Esta configuración permite que la CPU complete una instrucción en cada ciclo de reloj. Es común que las etapas pares operen en un flanco de la onda cuadrada, mientras que las etapas impares lo hacen en el otro. Esto permite un mayor rendimiento de la CPU que una computadora multiciclo a una frecuencia de reloj determinada , pero puede aumentar la latencia debido a la sobrecarga adicional del propio proceso de segmentación. Además, aunque la lógica electrónica tiene una velocidad máxima fija, una computadora segmentada puede ser más rápida o más lenta variando el número de etapas en la segmentación. Con más etapas, cada etapa realiza menos trabajo, por lo que tiene menos retrasos de las puertas lógicas y podría funcionar a una frecuencia de reloj más alta.
Un modelo de computadora segmentada suele ser el más económico, si se mide el costo en términos de compuertas lógicas por instrucción por segundo. En cada instante, una instrucción se encuentra en una sola etapa de la segmentación, y, en promedio, una etapa de segmentación es menos costosa que una computadora multiciclo. Además, cuando está bien diseñada, la mayor parte de la lógica de la computadora segmentada se utiliza casi todo el tiempo. En cambio, las computadoras con ejecución fuera de orden suelen tener grandes cantidades de lógica inactiva en cualquier instante dado. Cálculos similares generalmente muestran que una computadora segmentada consume menos energía por instrucción.
Sin embargo, una computadora segmentada suele ser más compleja y costosa que una computadora multiciclo comparable. Generalmente cuenta con más puertas lógicas, registros y una unidad de control más compleja. Asimismo, puede consumir más energía total, aunque menos energía por instrucción. Las CPU con ejecución fuera de orden suelen procesar más instrucciones por segundo, ya que pueden ejecutar varias a la vez.
En una computadora con arquitectura de segmentación, la unidad de control gestiona el inicio, la continuación y la finalización del flujo de datos según las órdenes del programa. Los datos de las instrucciones se suelen transmitir mediante registros de segmentación de una etapa a la siguiente, con una lógica de control independiente para cada etapa. La unidad de control también garantiza que las instrucciones de cada etapa no interfieran con el funcionamiento de las instrucciones de las demás etapas. Por ejemplo, si dos etapas deben utilizar los mismos datos, la lógica de control asegura que su uso se realice en la secuencia correcta.
Cuando funciona de manera eficiente, una computadora con arquitectura de segmentación tiene una instrucción en cada etapa. Luego, procesa todas esas instrucciones simultáneamente. Puede completar aproximadamente una instrucción por cada ciclo de su reloj. Pero cuando un programa cambia a una secuencia de instrucciones diferente, la segmentación a veces debe descartar los datos en proceso y reiniciarse. Esto se denomina "bloqueo".
Gran parte del diseño de una computadora con arquitectura de procesamiento en paralelo evita las interferencias entre las etapas y reduce los bloqueos.
Número de pasos
El número de pasos dependientes varía según la arquitectura de la máquina. Por ejemplo:
- El proyecto IBM Stretch de 1956-61 propuso los términos Fetch, Decode y Execute, que se han vuelto comunes.
- La arquitectura clásica de RISC comprende:
- Obtención de instrucciones
- Decodificación de instrucciones y obtención de registros
- Ejecutar
- Acceso a la memoria
- Registrar escritura de retorno
- Tanto el microcontrolador Atmel AVR como el PIC tienen una arquitectura de procesamiento en serie de dos etapas.
- Muchos diseños incluyen tuberías de hasta 7, 10 e incluso 20 etapas (como en el Intel Pentium 4 ).
- Los núcleos NetBurst "Prescott" y "Cedar Mill" de Intel, utilizados en los últimos modelos Pentium 4 y sus derivados Pentium D y Xeon , tienen una arquitectura de procesamiento en paralelo de 31 etapas.
- El procesador de red Xelerated X10q tiene una arquitectura de pipeline de más de mil etapas, aunque en este caso 200 de estas etapas representan CPU independientes con instrucciones programadas individualmente. Las etapas restantes se utilizan para coordinar los accesos a la memoria y a las unidades de función integradas en el chip. [ 1 ] [ 2 ]
A medida que la tubería se hace más "profunda" (con un mayor número de pasos dependientes), un paso dado puede implementarse con circuitos más simples, lo que puede permitir que el reloj del procesador funcione más rápido. [ 3 ] Estas tuberías pueden denominarse supertuberías. [ 4 ]
Se dice que un procesador está completamente segmentado si puede obtener una instrucción en cada ciclo. Por lo tanto, si algunas instrucciones o condiciones requieren demoras que impiden la obtención de nuevas instrucciones, el procesador no está completamente segmentado.
Historia
Los usos seminales de la segmentación se dieron en el proyecto ILLIAC II y en el proyecto IBM Stretch , aunque una versión simple se utilizó anteriormente en el Z1 en 1939 y en el Z3 en 1941. [ 5 ]
La segmentación de instrucciones comenzó a utilizarse en serio a finales de la década de 1970 en supercomputadoras como los procesadores vectoriales y los procesadores de matrices. Una de las primeras supercomputadoras fue la serie Cyber, construida por Control Data Corporation. Su principal arquitecto, Seymour Cray , dirigió posteriormente Cray Research. Cray desarrolló la línea de supercomputadoras XMP, que utilizaba la segmentación de instrucciones tanto para las funciones de multiplicación como para las de suma y resta. Más tarde, Star Technologies añadió el paralelismo (varias funciones segmentadas que trabajan en paralelo), desarrollado por Roger Chen. En 1984, Star Technologies incorporó el circuito de división segmentada desarrollado por James Bradley.
La segmentación no se limitaba a las supercomputadoras. En 1976, el ordenador central de propósito general de la serie 470 de Amdahl Corporation contaba con una segmentación de 7 pasos y un circuito de predicción de bifurcaciones patentado. Elemento central de la filosofía de diseño RISC, [ 6 ] a mediados de la década de 1980, la segmentación también se estaba introduciendo en las arquitecturas CISC tradicionales por sus desarrolladores. [ 7 ]
Peligros
El modelo de ejecución secuencial supone que cada instrucción se completa antes de que comience la siguiente; esta suposición no se cumple en un procesador segmentado. Una situación en la que el resultado esperado es problemático se conoce como riesgo . Imaginemos las siguientes dos instrucciones de registro para un procesador hipotético:
1: suma 1 a R5 2: copiar R5 a R6
Si el procesador tiene los 5 pasos enumerados en la ilustración inicial (la "Pipeline básica de cinco etapas" al comienzo del artículo), la instrucción 1 se obtendría en el tiempo t 1 y su ejecución estaría completa en t 5. La instrucción 2 se obtendría en t 2 y estaría completa en t 6. La primera instrucción podría depositar el número incrementado en R5 como su quinto paso (escritura de registro) en t 5. Pero la segunda instrucción podría obtener el número de R5 (para copiarlo a R6) en su segundo paso (decodificación de instrucción y obtención de registro) en el tiempo t 3. Parece que la primera instrucción no habría incrementado el valor para entonces. El código anterior invoca un riesgo.
Escribir programas informáticos en un lenguaje compilado podría no plantear estas preocupaciones, ya que el compilador podría diseñarse para generar código máquina que evite riesgos.
Soluciones alternativas
En algunos procesadores DSP y RISC antiguos, la documentación aconseja a los programadores evitar tales dependencias en instrucciones adyacentes y casi adyacentes (llamadas ranuras de retardo ), o declara que la segunda instrucción usa un valor antiguo en lugar del valor deseado (en el ejemplo anterior, el procesador podría, de forma poco intuitiva, copiar el valor sin incrementar), o declara que el valor que usa no está definido. El programador puede tener trabajo no relacionado que el procesador puede realizar mientras tanto; o, para garantizar resultados correctos, el programador puede insertar NOPs en el código, anulando parcialmente las ventajas de la segmentación.
Soluciones
Los procesadores segmentados suelen utilizar tres técnicas para funcionar como se espera cuando el programador asume que cada instrucción se completa antes de que comience la siguiente:
- La canalización podría bloquearse o dejar de programar nuevas instrucciones hasta que los valores necesarios estén disponibles. Esto genera espacios vacíos en la canalización, o burbujas , en los que no se realiza ningún trabajo.
- Se puede agregar una ruta de datos adicional que dirija un valor calculado a una instrucción futura en otra parte de la tubería antes de que la instrucción que lo produjo se haya retirado por completo, un proceso llamado reenvío de operandos . [ 8 ] [ 9 ]
- El procesador puede localizar otras instrucciones que no dependen de las actuales y que pueden ejecutarse inmediatamente sin riesgos, una optimización conocida como ejecución fuera de orden .
Sucursales
Una bifurcación fuera de la secuencia normal de instrucciones suele implicar un riesgo. A menos que el procesador pueda ejecutar la bifurcación en un solo ciclo de tiempo, la tubería continuará buscando instrucciones secuencialmente. Dichas instrucciones no pueden ejecutarse porque el programador ha desviado el control a otra parte del programa.
Una bifurcación condicional es aún más problemática. El procesador puede bifurcarse o no, dependiendo de un cálculo que aún no se ha realizado. Varios procesadores pueden bloquearse, intentar predecir la bifurcación y comenzar a ejecutar dos secuencias de programa diferentes ( ejecución inmediata ), cada una asumiendo que la bifurcación se toma o no, descartando todo el trabajo relacionado con la suposición incorrecta. [ a ]
Un procesador con una implementación de predicción de bifurcaciones que generalmente realiza predicciones correctas puede minimizar la penalización de rendimiento derivada de las bifurcaciones. Sin embargo, si las bifurcaciones se predicen incorrectamente, esto puede generar más trabajo para el procesador, como por ejemplo, eliminar de la tubería la ruta de código incorrecta que ha comenzado a ejecutarse antes de reanudar la ejecución en la ubicación correcta.
Los programas escritos para un procesador segmentado evitan deliberadamente las bifurcaciones para minimizar la posible pérdida de velocidad. Por ejemplo, el programador puede manejar el caso habitual con ejecución secuencial y bifurcarse solo al detectar casos inusuales. El uso de programas como gcov para analizar la cobertura del código permite al programador medir con qué frecuencia se ejecutan realmente determinadas bifurcaciones y obtener información para optimizar el código. En algunos casos, un programador puede manejar tanto el caso habitual como el inusual con código sin bifurcaciones .
Situaciones especiales
- Programas automodificables
- La técnica del código automodificable puede resultar problemática en un procesador segmentado. En esta técnica, uno de los efectos de un programa es modificar sus propias instrucciones subsiguientes. Si el procesador dispone de una caché de instrucciones , la instrucción original podría haberse copiado previamente en una cola de precarga , impidiendo que la modificación surta efecto. Algunos procesadores, como el Zilog Z280, pueden configurar sus memorias caché integradas para la lectura de datos únicamente, o como parte de su espacio de direcciones de memoria habitual, evitando así estas dificultades con las instrucciones automodificables.
- Instrucciones ininterrumpibles
- Una instrucción puede ser ininterrumpible para garantizar su atomicidad , como cuando intercambia dos elementos. Un procesador secuencial permite interrupciones entre instrucciones, pero un procesador de segmentación superpone las instrucciones, por lo que la ejecución de una instrucción ininterrumpible también hace ininterrumpibles partes de las instrucciones ordinarias. El error de coma de Cyrix bloqueaba un sistema de un solo núcleo mediante un bucle infinito en el que una instrucción ininterrumpible siempre estaba en la segmentación.
Consideraciones de diseño
- Velocidad
- La segmentación mantiene ocupadas todas las partes del procesador y aumenta la cantidad de trabajo útil que este puede realizar en un tiempo determinado. Generalmente, la segmentación reduce el tiempo de ciclo del procesador y aumenta el rendimiento de las instrucciones. La ventaja de velocidad disminuye en la medida en que la ejecución encuentra riesgos que obligan a ralentizarla por debajo de su velocidad ideal. Un procesador sin segmentación ejecuta solo una instrucción a la vez. El inicio de la siguiente instrucción se retrasa de forma incondicional, no en función de los riesgos.
- La necesidad de un procesador segmentado de organizar todo su trabajo en pasos modulares puede requerir la duplicación de registros, lo que aumenta la latencia de algunas instrucciones.
- Economía
- Al simplificar cada paso dependiente, la segmentación permite realizar operaciones complejas de forma más económica que añadiendo circuitos complejos, como los utilizados para cálculos numéricos. Sin embargo, un procesador que no priorice la velocidad mediante la segmentación puede resultar más sencillo y económico de fabricar.
- Previsibilidad
- En comparación con entornos donde el programador debe evitar o sortear riesgos, el uso de un procesador sin segmentación puede facilitar la programación y la formación de programadores. Además, el procesador sin segmentación facilita la predicción de la temporización exacta de una secuencia de instrucciones determinada.
Ejemplo ilustrado
A la derecha se muestra una canalización genérica con cuatro etapas: búsqueda, decodificación, ejecución y escritura. El recuadro gris superior muestra la lista de instrucciones pendientes de ejecución, el recuadro gris inferior muestra la lista de instrucciones cuya ejecución ya ha finalizado, y el recuadro blanco central muestra la canalización.
La ejecución es la siguiente:

burbuja de oleoducto

Un procesador segmentado puede lidiar con los peligros deteniéndose y creando una burbuja en la segmentación, lo que da como resultado uno o más ciclos en los que no sucede nada útil.
En la ilustración de la derecha, en el ciclo 3, el procesador no puede decodificar la instrucción morada, quizás porque determina que la decodificación depende de los resultados de la ejecución de la instrucción verde. La instrucción verde puede pasar a la etapa de Ejecución y luego a la etapa de Escritura, según lo programado, pero la instrucción morada se detiene durante un ciclo en la etapa de Captura. La instrucción azul, que debía capturarse durante el ciclo 3, también se detiene durante un ciclo, al igual que la instrucción roja que le sigue.
Debido a la burbuja (los óvalos azules en la ilustración), el circuito de decodificación del procesador está inactivo durante el ciclo 3. Su circuito de ejecución está inactivo durante el ciclo 4 y su circuito de escritura está inactivo durante el ciclo 5.
Cuando la burbuja sale de la tubería (en el ciclo 6), la ejecución normal se reanuda. Pero ahora todo está un ciclo retrasado. Se necesitarán 8 ciclos (del 1 al 8) en lugar de 7 para ejecutar completamente las cuatro instrucciones que se muestran en colores. [ b ]
Véase también
Notas
- ↑ Los primeros procesadores segmentados que carecían de estas heurísticas, como elprocesador PA-RISC de Hewlett-Packard , gestionaban los riesgos simplemente advirtiendo al programador; en este caso, que una o más instrucciones posteriores a la bifurcación se ejecutarían independientemente de si se tomaba o no la bifurcación. Esto podía resultar útil; por ejemplo, después de calcular un número en un registro, una bifurcación condicional podía ir seguida de la carga en el registro de un valor más útil para los cálculos posteriores, tanto en el caso de bifurcación como en el caso sin bifurcación.
- ↑ Sin embargo, tenga en cuenta que, incluso con la burbuja, el procesador aún puede, al menos en este caso, ejecutar la secuencia de instrucciones mucho más rápido que un procesador sin segmentación.
Referencias
- ↑ Glaskowsky, Peter (18 de agosto de 2003). "La extraordinaria NPU de Xelerated: el primer procesador de paquetes de 40 Gb/s del mundo tiene 200 CPU" . Microprocessor Report . 18 (8): 12–14 . Recuperado el 20 de marzo de 2017 .
- ↑ "Xelerated lleva la tecnología programable de 40 Gbit/s a la Ethernet convencional" . 31 de mayo de 2003.
- ^ Juan Pablo Shen, Mikko H. Lipasti (2004). Diseño de procesador moderno . Profesional de McGraw-Hill . ISBN 9780070570641.
- ↑ Sunggu Lee (2000). Diseño de computadoras y otros dispositivos digitales complejos . Prentice Hall . ISBN 9780130402677.
- ↑ Rojas, Raúl (abril-junio de 1997). "El legado de Konrad Zuse: la arquitectura de la Z1 y la Z3" (PDF) . IEEE Annals of the History of Computing . 19 (2): 5–16 . doi : 10.1109/85.586067 . Archivado (PDF) del original el 3 de julio de 2022. Consultado el 3 de julio de 2022 .(12 páginas)
- ↑ Slater, Michael (junio de 1990). "¿Qué es RISC?" . IEEE Micro . pp. 96– 95 . Consultado el 20 de marzo de 2023 .
- ↑ Clark, Douglas W. (1987). Segmentación y rendimiento en el procesador VAX 8800. Segunda Conferencia Internacional sobre Soporte Arquitectónico para Lenguajes de Programación y Sistemas Operativos (ASPLOS II). págs. 173–177 . Recuperado el 18 de enero de 2026 .
- ↑ "CMSC 411 Lección 19, Procesamiento en paralelo de datos" . Departamento de Ciencias de la Computación e Ingeniería Eléctrica de la Universidad de Maryland, Condado de Baltimore . Consultado el 22 de enero de 2020 .
- ↑ "Computación de alto rendimiento, Apuntes de la clase 11" . hpc.serc.iisc.ernet.in. Septiembre de 2000. Archivado del original el 27 de diciembre de 2013. Consultado el 8 de febrero de 2014 .
Enlaces externos
- Predicción de ramificaciones en la familia Pentium ( copia de Archive.org )
- Artículo de Ars Technica sobre tuberías
- Arquitectura de procesador de canalización de flujo inverso
- microprocesadores superescalares
- Procesamiento de instrucciones