Procesamiento Segmentado
Procesamiento Segmentado
Procesamiento Segmentado
FACULTAD DE INGENIERIA
ESCUELA DE INGENIERIA DE SISTEMAS
INTEGRANTES:
TRUJILLO – PERÚ
2018
1
ÍNDICE
I. INTRODUCCIÓN.................................................................................................................................................... 3
II.PROCESAMIENTO PARALELO ............................................................................................................................... 4
III.SEGMENTACIÓN.................................................................................................................................................. 6
IV.REQUISITOS PARA SEGMENTACIÓN………………………………………………………………………………………………………………8
2
I. INTRODUCCIÓN
Todo esto hace que las prestaciones de los computadores deben mejorar
continuamente. Para ver de una forma más palpable la necesidad actual de
computadores más rápidos pondremos un ejemplo: los satélites artificiales
envían información a la tierra al ritmo de 1020 bits/sg. Todo este volumen de
información se utiliza para efectuar predicciones meteorológicas, etc. Si
queremos procesar esta información con el fin de que los resultados de ese
proceso sean útiles, deben procesarse con una velocidad suficiente. Teniendo
en cuenta que los cálculos para este tipo de aplicaciones no son sencillos, se
podría estimar que la velocidad de proceso necesaria, para que los resultados
se obtengan antes de dejar de ser útiles, debe ser de unas 1023 operaciones/sg.
3
II. PROCESAMIENTO PARALELO
4
desventajas: Difícil de programar, La sincronización de datos entre tareas
es difícil, requiere estar al tanto de la organización de la memoria.
Procesamiento paralelo escalable / SPP: Hibrido de SMP y MPP, que
utiliza una memoria jerárquica de dos niveles para alcanzar la
escalabilidad, esto permite reducir el tráfico de bus del sistema. Aprovecha
las ventajas de MPP y SMP (facilitar la programación).
PROGRAMACIÓN CONCURRENTE
Existen algoritmos para la exclusión mutua:
ALGORITMO DE DEKKER
Implementado por Edsger Dijkstra. Le permite a dos procesos: A) Compartir un
recurso sin conflictos. B) Si ambos procesos intentan acceder a la sección critica
al mismo tiempo. Un proceso es elegido según una variable de turno. El otro
proceso espera la finalización del otro proceso.
ALGORITMO DE PETERSON
Desarrollado en 1981 para dos procesos, posteriormente para más de dos
procesos. Le permite a dos procesos, compartir un recurso sin conflictos usando
sólo memoria compartida.
En la EXCLUSIÓN MUTUA, se usa la programación concurrente para evitar que
fragmentos de código accedan al mismo tiempo a recursos que no deben ser
compartidos. Empleando una técnica, inhabilitando las interrupciones durante el
conjunto de instrucciones más pequeño, esto impide la corrupción de la
estructura compartida.
NIVELES DE PARALELISMO:
5
C. PARALELISMO FUNCIONAL
La ejecución de diferentes funciones (lógicas, adición, multiplicación) es
realizada en un mismo procesador, simultáneamente por varias unidades
especiales.
III. SEGMENTACIÓN
El procesamiento segmentado aprovecha la misma filosofía de trabajo de la
fabricación en cadena: cada etapa de la segmentación (o segmento) completa
una parte (subtarea) de la tarea total. Los segmentos están conectados cada uno
con el siguiente, de forma que la salida de uno pasa a ser la entrada del siguiente.
Así, los segmentos configuran un cauce a través del que se va procesando la
tarea deseada (por ello, en algunas ocasiones, a los procesadores segmentados
también se les llama procesadores encauzados o, simplemente, cauces). Lo más
interesante de la segmentación es que las diferentes subtareas pueden
procesarse de forma simultánea, aunque sea sobre diferentes datos.
Una contribución clave de la segmentación es la posibilidad de comenzar una
nueva tarea sin necesidad de que la anterior se haya terminado. La medida de
la eficacia de un procesador segmentado no es el tiempo total transcurrido desde
que se comienza una determinada tarea hasta que se termina (tiempo de latencia
del procesador), sino el tiempo máximo que puede pasar entre la finalización de
dos tareas consecutivas.
Evidentemente, la segmentación no es posible sin incrementar los recursos de
proceso, de la misma manera que la fabricación en cadena no es posible sin
aumentar el número de operarios. Por ello, los procesadores segmentados
necesitan redundancia de muchos recursos: registros, circuitos aritméticos, etc.
Considérese una tarea, compuesta por n subtareas. Si estas subtareas se
procesan de forma totalmente secuencial, el tiempo necesario para procesar la
tarea total será la suma de los tiempos necesarios para la terminación de cada
una de las subtareas.
6
En este esquema Tij representa la subtarea j dentro de la tarea i. Por otra parte,
para comenzar el tratamiento de una nueva tarea será necesario esperar ese
mismo tiempo. Esto se debe a que habrá algunas unidades funcionales que
serán necesarias para llevar a cabo varias de las subtareas y por ello, esas
subtareas no podrán superponerse en el tiempo.
Si, para procesar esa misma tarea, se emplea un procesador segmentado, basta
que se haya terminado la primera subtarea para poder empezar a procesar una
nueva tarea.
7
las subtareas en que se ha dividido la tarea total tarden en procesarse el mismo
tiempo. Esto es debido a que las tareas no podrán evolucionar al segmento
siguiente hasta que no se haya terminado la subtarea más lenta. Por ello, si el
procesador no está equilibrado, los segmentos más rápidos estarán cierto tiempo
sin hacer trabajo alguno, lo que disminuirá el rendimiento del procesador.
La relación de precedencia de un conjunto de subtareas Ti , … , Tn , que
componen cierta tarea T, específica para cada subtarea Tj , que ésta no puede
comenzar hasta que haya terminado ciertas subtareas Ti. Las relaciones de
precedencia para todas las subtareas de T forman su grafo de precedencia.
En el ejemplo de la figura anterior se ha supuesto que las tareas que se procesan
en el cauce tienen un grafo de precedencia lineal. Esto significa que una
subtarea Tj, no puede comenzar hasta que todas las subtareas previas, es decir
Ti, para todas las i menores que j, hayan finalizado. A los procesadores
segmentados que sólo pueden procesar tareas con grafo de precedencia de este
tipo, se les denomina cauces lineales.
8
ejecución de m tareas en un procesador convencional, t(1), y el tiempo de
ejecución de esas mismas m tareas, en un procesador segmentado, t(n). En las
mejores condiciones y si el procesador está equilibrado se puede suponer que
el periodo de reloj es el mismo en ambos casos. Observando la primera figura,
podemos deducir fácilmente que el tiempo empleado en ejecutar m tareas en un
procesador convencional, medido en ciclos de reloj será
t(1) = nm
Por otra parte, para un procesador segmentado, el tiempo empleado en ejecutar
esas m tareas tendrá dos partes: el tiempo empleado en llenar el cauce, o lo que
es lo mismo, el tiempo empleado en ejecutar la primera tarea (n ciclos) y, luego
un ciclo de reloj por cada una de las tareas restantes (m – 1 ciclos). Por tanto:
t(n) = n + (m – 1)
Con estos datos, podemos deducir que la ganancia de velocidad de un
procesador segmentado, respecto a un procesador convencional es
𝑡(1) 𝑛𝑚
𝑆(𝑛)𝑖𝑑𝑒𝑎𝑙 = =
𝑡(𝑛) 𝑛 + 𝑚 − 1
Cuando el número de tareas ejecutadas, m, sea muy grande, es decir, cuando
haya pasado un poco de tiempo, tendremos que la ganancia estacionaria será:
𝑛𝑚 𝑛
𝑆(𝑛)∞ = lim 𝑆𝑖𝑑𝑒𝑎𝑙 = lim = lim =𝑛
𝑚→∞ 𝑚→∞𝑛 + 𝑚 − 1 𝑚→∞ 𝑛 𝑚−1
+
𝑚 𝑚
De esta forma podemos ver que la ganancia ideal estacionaria obtenida con un
procesador segmentado de n etapas es la misma que la que se consigue con un
sistema paralelo de n procesadores no segmentados.
Evidentemente, esta ganancia ideal no se consigue nunca por diversas razones:
Las detenciones del cauce
El desequilibrio entre los segmentos
9
VI. SEGMENTACIÓN DE PROCESADORES
10
instrucciones (evidentemente en diferentes etapas), sería un cauce
dinámicamente configurable.
La tecnología CISC (Complex Instruction Set Computer) nació de la mano de Intel, creador en 1971
del primer microchip que permitiría el nacimiento de la informática personal. Más concretamente, sería
en 1972 cuando aparecería el 8080, primer chip capaz de procesar 8 bits, suficiente para representar
números y letras. Con la posibilidad de colocar todos los circuitos en un solo chip y la capacidad de
manejar número y letras nacería la cuarta generación de ordenadores.
Los microprocesadores CISC tienen un conjunto de instrucciones que se caracteriza por ser muy
amplio y permitir operaciones complejas entre operandos situados en la memoria o en los registros
internos.
Este tipo de arquitectura dificulta el paralelismo entre instrucciones, por lo que en la actualidad la
mayoría de los sistemas CISC de alto rendimiento implementan un sistema que convierte dichas
instrucciones complejas en varias instrucciones simples, llamadas generalmente microinstrucciones.
La microprogramación es una característica importante y esencial de casi todas las arquitecturas CISC.
La microprogramación significa que cada instrucción de máquina es interpretada por un microprograma
localizado en una memoria en el circuito integrado del procesador. Las instrucciones compuestas son
decodificadas internamente y ejecutadas con una serie de microinstrucciones almacenadas en una
ROM interna. Para esto se requieren de varios ciclos de reloj, al menos uno por microinstrucción. Es
11
así entonces como los chips CISC utilizan comandos que incorporan una gran diversidad de pequeñas
instrucciones para realizar una única operación.
Cuando el sistema operativo o una aplicación requiere de una de estas acciones, envía al procesador
el nombre del comando para realizarla junto con el resto de información complementaria que se
necesite. Pero cada uno de estos comandos de la ROM del CISC varían de tamaño y, por lo tanto, el
chip debe en primer lugar verificar cuanto espacio requiere el comando para ejecutarse y poder así
reservárselo en la memoria interna. Además, el procesador debe determinar la forma correcta de
cargar y almacenar el comando, procesos ambos que ralentizan el rendimiento del sistema. El
procesador envía entonces el comando solicitado a una unidad que lo descodifica en instrucciones
más pequeñas que podrán ser ejecutadas por un nanoprocesador, una especie de procesador dentro
del procesador. Y al no ser las instrucciones independientes, pues son instrucciones menores
procedentes de la descodificación de una instrucción mayor, sólo puede realizarse una instrucción
cada vez.
A través de la compleja circuitería del chip, el nanoprocesador ejecuta cada una de las instrucciones
del comando. El desplazamiento por esta circuitería también ralentiza el proceso. Para realizar una
sola instrucción un chip CISC requiere de cuatro a diez ciclos de reloj.
- CARACTERISTICAS
12
VENTAJAS
DESVENTAJAS
Buscando aumentar la velocidad del procesamiento se descubrió en base a experimentos que, con
una determinada arquitectura de base, la ejecución de programas compilados directamente con
microinstrucciones y residentes en memoria externa al circuito integrado resultaban ser más eficientes,
gracias a que el tiempo de acceso de las memorias se fue decrementando conforme se mejoraba su
tecnología de encapsulado.
La idea estuvo inspirada también por el hecho de que muchas de las características que eran incluidas
en los diseños tradicionales de CPU para aumentar la velocidad estaban siendo ignoradas por los
programas que eran ejecutados en ellas. Además, la velocidad del procesador en relación con la
memoria de la computadora que accedía era cada vez más alta.
Debido a que se tiene un conjunto de instrucciones simplificado, éstas se pueden implantar por
hardware directamente en la CPU, lo cual elimina el microcódigo y la necesidad de decodificar
instrucciones complejas.
La arquitectura RISC funciona de modo muy diferente a la CISC, su objetivo no es ahorrar esfuerzos
externos por parte del software con sus accesos a la RAM, sino facilitar que las instrucciones sean
ejecutadas lo más rápidamente posible. La forma de conseguirlo es simplificando el tipo de
instrucciones que ejecuta el procesador. Así, las instrucciones más breves y sencillas de un procesador
13
RISC son capaces de ejecutarse mucho más aprisa que las instrucciones más largas y complejas de
un chip CISC. Sin embargo, este diseño requiere de mucha más RAM y de una tecnología de
compilador más avanzada.
La relativa sencillez de la arquitectura de los procesadores RISC conduce a ciclos de diseño más cortos
cuando se desarrollan nuevas versiones, lo que posibilita siempre la aplicación de las más recientes
tecnologías de semiconductores. Por ello, los procesadores RISC no solo tienden a ofrecer una
capacidad de procesamiento del sistema de 2 a 4 veces mayor, sino que los saltos de capacidad que
se producen de generación en generación son mucho mayores que en los CISC.
Los comandos que incorpora el chip RISC en su ROM constan de varias instrucciones pequeñas que
realizan una sola tarea. Las aplicaciones son aquí las encargadas de indicar al procesador qué
combinación de estas instrucciones debe ejecutar para completar una operación mayor.
Además, los comandos de RISC son todos del mismo tamaño y se cargan y almacenan del mismo
modo. Al ser estas instrucciones pequeñas y sencillas, no necesitan ser descodificadas en
instrucciones menores como en el caso de los chips CISC, pues ya constituyen en sí unidades
descodificadas. Por ello, el procesador RISC no gasta tiempo verificando el tamaño del comando, en
descodificarlo ni en averiguar cómo cargarlo y guardarlo.
El procesador RISC puede además ejecutar hasta 10 comandos a la vez pues el compilador del
software es el que determina qué comandos son independientes y por ello es posible ejecutar varios a
la vez. Y al ser los comandos del RISC más sencillos, la circuitería por la que pasan también es más
sencilla. Estos comandos pasan por menos transistores, de forma que se ejecutan con más rapidez.
Para ejecutar una sola instrucción normalmente les basta con un ciclo de reloj.
CARACTERISTICAS
14
Procesamiento de segmentación
Los procesadores RISC tienen la capacidad de manejar varias instrucciones al mismo tiempo,
por medio de la técnica de segmentación o línea de trabajo
Causas de la Latencia
Instrucciones requieren más de un ciclo de máquina
Instrucciones de longitud variable
Instrucciones de punto flotante
Acceder a operandos desde memoria en vez que desde registros Acceder
a un recurso compartido
El problema de la Dependencia Mutua
La dependencia mutua entre instrucciones impone un orden secuencial en la ejecución
VENTAJAS
Hardware más simple debido a instrucciones más sencillas que requieren menos espacio en
el chip
DESVENTAJAS
15
DIFERENCIAS RISC VS CISC
16
VIII. PROCESADORES SEGMENTADOS
17
de cuatro en la imagen, los resultados de cada comando vienen uno tras otro cada flanco de
reloj y sin latencia extra por estar encadenados dentro del mismo pipe. Todo esto habiendo
maximizado la frecuencia máxima de trabajo.
18
19
IX. TIPOS DE PROCESAMIENTO SEGMENTADO
Puede establecerse una clasificación de los procesadores segmentados
atendiendo al uso que se da a la segmentación. Esta clasificación fue
propuesta por Händler (1977):
SEGMENTACION ARITMETICA:
ALU de un computador puede segmentarse para la ejecución de algoritmos
aritméticos complejos. La segmentación aritmética es muy útil para procesar
instrucciones vectoriales, es decir, operaciones que deben repetirse de la
misma forma sobre todas las componentes de un vector; esto se consigue
provocando que un segmento de la unidad aritmética trabaje sobre una de las
componentes, mientras los demás trabajan sobre las componentes siguientes,
realizándose así las diferentes sub-funciones necesarias para la ejecución de la
operación aritmética. En la actualidad, este tipo de segmentación se emplea en
muchos procesadores para ejecutar operaciones aritméticas con números
representados en punto flotante. Un ejemplo clásico de este tipo de
procesadores es el multiplicador segmentado basado en un árbol de Wallace,
tal como se muestra en la figura 2.3. En esta figura, los bloques CSA
representan a sumadores con salvaguarda de llevadas y los bloques CLA, a
sumadores con generación anticipada de llevadas. Las líneas inclinadas hacia
la izquierda indican que los vectores de llevadas deben desplazarse a la
izquierda un lugar antes de entrar en la etapa siguiente (véase, por ejemplo,
(Bastida, 1995)). Por otra parte, es necesario señalar que las sumas deben
efectuarse con extensión de signo y que es necesario dejar bits de guarda para
tener en cuenta las posibles llevadas salientes.
Las cajas sombreadas representan registros cerrojos (latchs) que, en este
caso, se llaman
20
Fig. 2.3. Multiplicador segmentado basado en un árbol de Wallace.
registros de segmentación. Estos registros retienen las informaciones
salientes de cada etapa durante un ciclo de reloj para que se mantengan en la
entrada de la siguiente etapa.
Se ha supuesto que el retardo del sumador con anticipación es doble que el del
sumador con salvaguarda de llevadas.
21
SEGMENTACION DE INSTRUCCIONES:
La ejecución de un flujo de instrucciones puede adoptar una estructura
segmentada que permita el solapamiento de la ejecución de una instrucción
con la lectura, decodificación, búsqueda de operandos, etc. de las instrucciones
siguientes. Esta técnica también se denomina anticipación de instrucciones
(instruction lookahead).
En la figura 2.4 se muestra un ejemplo de segmentación de instrucciones. La
citada figura corresponde a un computador de tipo registro-registro, es decir, un
computador en que los accesos a memoria están restringidos a instrucciones
específicas (LOAD y STORE), y en que el modo de direccionamiento empleado
para estos accesos a memoria y para las bifurcaciones, es el relativo al
contador de programa. Se supone que el computador dispone de arquitectura
Harvard, es decir, que posee memorias caché separadas para código
22
Fig. 2.4. Ejemplo de segmentación de instrucciones.
y datos. En el ejemplo, se ha dividido la ejecución completa de cada instrucción
en cuatro segmentos:
A. Lectura.
B. Decodificación y lectura de operandos.
C. Ejecución.
D. Acceso a la memoria de datos (si es necesario).
Prácticamente, todos los computadores actuales disponen de segmentación de
instrucciones.
SEGMENTACION DE PROCESADORES:
Este tipo de procesamiento se produce cuando el mismo flujo de datos es
tratado por una serie de procesadores, de forma que cada uno de ellos efectúe
una subtarea del proceso total. Cada procesador dejará sus resultados en una
memoria, que también será accesible desde el siguiente, para que éste
procese esos resultados para ejecutar la siguiente subtarea sobre el flujo de
datos. Este tipo de segmentación se emplea solamente en procesadores
vectoriales de muy altas prestaciones.
Por otra parte, los procesadores segmentados pueden ser tanto monofunción
como multifunción. Los primeros sólo pueden realizar una función fija; por el
contrario, los procesadores segmentados multifunción pueden efectuar
diferentes funciones, en instantes distintos, conectando de formas diferentes
los segmentos del cauce.
Los procesadores segmentados multifunción son estáticamente configurables
si no pueden cambiar su configuración mientras se está ejecutando una
función; esto implica que no pueden ejecutarse varias funciones diferentes al
mismo tiempo. Por el contrario, son dinámicamente configurables si pueden
cambiar su configuración en cualquier momento; por ello, los cauces de este
tipo pueden mantener varias configuraciones simultáneas y, por tanto, ejecutar
varias funciones diferentes a la vez.
Para que estos conceptos puedan apreciarse más claramente, pondremos
como ejemplo el procesador segmentado que se mostró en la figura 2.4. En
este cauce podrían ejecutarse diferentes clases de instrucciones, utilizando
23
cada una de ellas diferentes etapas: por ejemplo, una instrucción de bifurcación
sólo emplearía las etapas A, B y C; sin embargo, una instrucción de
almacenamiento de datos en memoria (STORE) emplearía las etapas A, B, C y
D; por otra parte, una instrucción de carga (LOAD) emplearía las etapas A, B,
C, D y escribiría el resultado en uno de los registros del banco, por lo que
volvería a emplear parte de la etapa B; por último, una instrucción aritmética
pasaría por las etapas A, B, C y depositaría el resultado en un registro, por lo
que tendría que emplear nuevamente la etapa B.
Un cauce multifunción sería capaz de efectuar todas las operaciones anteriores
con los mismos segmentos, combinándolos de forma diferente en cada caso. Si
este cauce pudiera estar ejecutando al mismo tiempo diferentes clases de
instrucciones (evidentemente en diferentes etapas), sería un cauce
dinámicamente configurable.
X. CONFLICTOS DE SEGMENTACION
Hay circunstancias que pueden disminuir el rendimiento de un procesador
segmentado debido a que provocan la detención del cauce. Estas
circunstancias se denominan riesgos o conflictos.
24
compilador tenga en cuenta la estructura del procesador, detecte este tipo de
conflictos y, cuando ello ocurra, intente modificar el orden de ejecución de las
instrucciones, siempre que sea posible, para intentar evitarlos.
25
se muestra en la figura 2.6(a). El problema que se nos plantea es: si
quisiéramos efectuar dos veces sucesivas la misma tarea, ¿Cuántos ciclos
máquina tendríamos que esperar para arrancar dicha tarea por segunda vez?
La solución es sencilla: basta superponer a la tabla de reservas original, la
misma tabla desplazada un lugar a la derecha. Si alguna de las etapas está
ocupada en el mismo ciclo por la tabla original y por la desplazada, significa
que no podrá ejecutarse la tarea la segunda vez, arrancada sólo un ciclo más
tarde, por existir una colisión. Se debe intentar superponer la tabla
desplazándola más lugares hacia la derecha hasta que no haya ningún ciclo
que esté ocupado en ambas tablas al mismo tiempo. El número de
desplazamientos entre ambas tablas nos dará el número de ciclos que habrá
que esperar (también denominado latencia) para arrancar la tarea por segunda
vez sin que haya colisiones. A las latencias en que ocurre colisión se les
denomina latencias prohibidas. Precisamente a partir de esta idea, se
construye el vector de colisiones que es un vector binario cuya componente i
es 1 si, y sólo si, se produce una colisión cuando se arranca la tarea la
segunda vez i ciclos después de haberse iniciado la primera.
26
estará acotado superiormente por el número de ciclos necesarios para
completar la ejecución de la tarea menos uno, ya que no se contempla la
colisión de la ejecución de una tarea consigo misma; en cualquier caso, es
posible omitir las últimas componentes nulas del vector. Ahora estudiaremos la
forma en que puede ayudarnos en la práctica el vector de colisiones para
prevenir éstas. Hay que tener en cuenta que los cálculos necesarios para esa
prevención deben hacerse de forma simultánea y en el mismo tiempo del ciclo
máquina; por ello, los circuitos necesarios deben ser muy sencillos y rápidos.
En la figura 2.7 se muestra el esquema de principio de un circuito para la
prevención de las colisiones. Como puede observarse, este circuito basa su
funcionamiento en un registro de desplazamiento hacia la izquierda con
posibilidad de carga paralela. El funcionamiento comprende los siguientes
pasos (Davidson, 1971):
27
4. Se vuelve al primer paso del proceso.
28
cambiarse la etiqueta de alguno de estos arcos a un valor inferior al
número de componentes del vector de colisiones si, para las latencias
mayores a ese valor, corresponde el mismo arco del diagrama.
29
llamaremos Ni al número de ciclos reservados en la fila i de la tabla de
reservas.
El índice de utilización de la etapa i vendrá dada por rNi. Este índice valdrá,
como máximo, 1 (cuando todas las casillas de esa fila de la tabla de reservas
estén marcadas, aunque no por una sola iniciación de la tarea), es decir
30
31
casillas estarán ocupadas en las siguientes iniciaciones de la tarea. Puede
ocurrir (figura 2.9(g)) que debamos poner una marca en una casilla ya ocupada
(y, por tanto, señalada con una P); en este caso, introduciremos un retardo en
esa etapa (señalado en la tabla con una R) para conseguir que ocupe un lugar
libre. Cuando nos veamos obligados a ello, deberemos tener en cuenta que las
etapas siguientes en el tiempo deberán ser retardadas en la misma medida.
Como resultado de la aplicación de este proceso, llegaremos a una tabla de
reservas con algunas etapas retardadas; para nuestro ejemplo concreto, esta
tabla se muestra en la figura 2.10(a), su vector de colisiones se muestra en (b)
y el diagrama de estados correspondiente puede verse en (c). Con esta tabla
se conseguirá la latencia mínima posible para nuestro cauce, que es 2,
pasando por los estados 100010 y 101010, quedando cíclicamente en éste
último. Muchos de los conceptos anteriores son también aplicables cuando se
ejecutan varias tareas distintas en un cauce multifunción. En este caso, será
necesario calcular los vectores de colisiones de cada función ejecutada
después de cada una de las demás. Para ilustrar esta idea, analicemos lo que
ocurriría en el cauce al que corresponde la tabla de la figura 2.6, si además de
esa función (llamémosla X), pudiera ejecutar otra función Y , con la tabla de
reservas y vector de colisiones que se muestran en la figura 2.11. Para saber
en qué momento podremos arrancar la función Y cuando ya se está ejecutando
la función X, superpondremos las tablas de reservas de ambas operaciones y
desplazaremos la correspondiente a la función Y hacia la derecha hasta que no
32
haya superposiciones (colisiones); de esta forma, podremos construir el vector
de
Con estos vectores, y los vectores de colisiones de las propias funciones (vxx y
vyy), construiremos la llamada matriz de colisiones para una función (MX),
que es una matriz cuyas filas son los vectores de colisiones correspondientes a
esa función cuando después se ejecuta cada una de las demás. Si los vectores
tuvieran diferentes números de componentes, la matriz toma tantas columnas
como corresponda a la longitud del vector más largo, completando los demás
con ceros por la derecha. Para las operaciones anteriores, las matrices de
colisiones serán:
33
Con estas matrices de colisiones, podremos determinar si, en un determinado
ciclo de reloj, se podría admitir el comienzo de una nueva tarea en el
procesador segmentado. Para hacerlo, ampliaremos el circuito mostrado en la
figura 2.7 para tener en cuenta todos los casos posibles en el orden de
ejecución de las funciones. Este circuito ampliado se muestra en la figura 2.12,
y su funcionamiento es completamente análogo al anterior. En general, un
procesador segmentado, en que se puedan ejecutar p funciones diferentes, se
podrá controlar con p registros de desplazamiento.
34
Los nodos, en vez de estar identificados por un vector, están
identificados por una matriz.
El estado inicial no es único, sino que hay tantos estados iniciales
como funciones pueda efectuar el procesador segmentado.
En los arcos que conectan los nodos debe indicarse, además de la
latencia, la operación que se ejecuta.
35
entrada o dominio de la instrucción B (recordar el apartado 1.3.4), habrá
posibilidad de riesgo RAW si:
36
Aunque, como en los casos anteriores, esta condición no es suficiente para la
existencia del riesgo.
Existen técnicas para detectar los conflictos por dependencias de datos. Estas
técnicas precisan algo de hardware adicional: unos buffers, que guarden los
números de los registros implicados en las últimas instrucciones, junto con
unos comparadores. Los buffers tendrán una estructura de registro de
desplazamiento, de forma que la posición del número de registro dentro del
desplazador nos dirá en qué segmento se encuentra y la clase de operación
que se efectúa sobre él (lectura o escritura). Los comparadores analizarán si
coinciden los operandos de la instrucción que va a ejecutarse, con los de
alguna de las anteriores con las que pueda entrar en conflicto. Si existe
conflicto, como primera solución, se detendrá la ejecución de la instrucción
hasta que las anteriores hayan avanzado y la dependencia desaparezca (esto
es lo que se llama insertar una burbuja). Frecuentemente, en este caso, se
dice que se impide la emisión de la instrucción, ya que se llama así al paso
de la instrucción de la etapa de decodificación a la siguiente, donde comienza
la ejecución efectiva de la instrucción (localización de operandos). Una solución
para reducir la duración de estas detenciones es hacer uso del resultado, en
cuanto se disponga de él, aunque no se haya escrito en el registro afectado;
este método se llama anticipación
Existen también técnicas para evitar las posibles detenciones que podría
producir un conflicto. Estos métodos pueden clasificarse en dos grupos:
37
En esta porción de código, y representan dos direcciones de memoria. En el
ejemplo, la instrucción, tiene una dependencia de datos respecto de las
instrucciones que acceden a memoria y hasta que éstas no tengan los datos,
no podrá leer los operandos. En este fragmento de código se puede observar
que las instrucciones son independientes de las siguientes por lo que pueden
ejecutarse en cualquier orden respecto a ellas. Según esto, un compilador que
lleve a cabo planificación estática puede adoptar la solución de reordenar estas
instrucciones de la forma siguiente:
38
El marcaje (scoreboarding): un marcador (scoreboard) es un sistema de
tablas (mantenidas a nivel hardware) que tiene información sobre la
ocupación de los recursos de la máquina. Mediante el marcador podemos
saber cuándo una instrucción tiene o no dependencias pendientes. Si
tuviera alguna dependencia, aplazamos su emisión intentándola con otra
instrucción posterior en que esas dependencias no se produzcan. El
emitir las instrucciones fuera de orden puede tener el inconveniente de
que se pueden producir nuevos riesgos que también deberán ser
considerados por el marcador. Cada instrucción pasa por el marcador (en
una de las primeras fases de la segmentación) donde se mantiene una
tabla con las dependencias de datos. En esta tabla está la información
suficiente para saber cuándo la instrucción puede emitirse o no. Si la
instrucción no se pudiera emitir en ese momento, intenta emitir otra y
controla los cambios producidos para saber cuándo la dependencia de
datos está resuelta. El marcador contiene las siguientes informaciones:
1. La operación a efectuar.
2. Los numero de estaciones de reserva que corresponden a las
unidades funcionales que producirán los operandos de la
instrucción. Debe existir un valor (normalmente 0) para indicar que
alguno de los operandos ya está disponible; para este caso se
activa el campo descrito a continuación.
3. Los valores de los operandos fuentes si es que ya están
disponibles.
39
El algoritmo de Tomasulo utiliza anticipación, es decir, si un operando está
disponible, no se espera a que sea almacenado en el registro de destino, sino
que se lleva a las estaciones de reserva que lo estén esperando; de esa forma,
éstas lo podrán utilizar para sus respectivas operaciones. Otra característica
importante es que todas las estaciones de reserva tienen acceso a un bus,
denominado bus común de resultados, en que las unidades funcionales
dejan los resultados de las operaciones.
Las técnicas de planificación dinámica pueden ser algo más eficaces que las
estáticas, pero también son bastante más complicadas. Una de las misiones
del diseñador de un procesador segmentado será decidir el tipo de planificación
más adecuado, sopesando las ventajas e inconvenientes de cada uno.
40
Conflictos de control
41
idea de la incidencia de los conflictos de control en el rendimiento de un
procesador segmentado:
Otra forma de medir las pérdidas por riesgos de control sería calcular el CPI
teniendo en cuenta estos riesgos (pero prescindiendo de los demás), es decir:
42
Una de las soluciones para evitar estas pérdidas de rendimiento es hacer que
el compilador encuentre algo útil para hacer mientras calcula la dirección del
destino del salto. Esto se conseguirá reordenando las instrucciones de la
misma forma que se hacía en la planificación estática de los riesgos por
dependencias de datos. Si el compilador no pudiera encontrar ninguna
instrucción para ocupar los huecos libres dejados por la instrucción de salto,
rellenaría con instrucciones NOP. Para llevar a cabo este método, denominado
bifurcación retardada, tienen que ponerse de acuerdo en la forma de operar
el hardware y el compilador. En la figura 2.15 se muestra la
Existen otros métodos más sofisticados para mejorar las bifurcaciones. Estos
métodos se basan en la predicción del destino de los saltos para las
instrucciones de bifurcación condicional. Esta predicción puede hacerse a nivel
estático (compilador) o a nivel dinámico (en ejecución). El problema de todos
los métodos de predicción es que, si ésta es incorrecta, hay que descartar las
43
instrucciones que hayan entrado en el cauce equivocadamente, y eso puede
acarrear una pérdida de rendimiento muy grande:
44
XI. TAXONOMÍA DE FLYNN
Características:
45
Computadores SIMD (Single Instruction Multiple Data): Un único flujo de
instrucciones procesa operandos y genera resultados definiendo varios
flujos de datos. Computadores matriciales y vectoriales. Es una técnica
empleada para conseguir paralelismo a nivel de datos.
46
Computadores MIMD (Multiple Instruction Multiple Data): El computador
ejecuta varias secuencias o flujos distintos de instrucciones y cada uno de
ellos procesa operandos y genera resultados de forma que existen también
varios flujos, uno por cada flujo de instrucciones. Computadores
multiprocesadores y multicomputadores.
Es una técnica empleada para lograr paralelismo. Las máquinas que usan
MIMD tienen un número de procesadores que funcionan de manera
asíncrona e independiente. En cualquier momento, cualquier procesador
puede ejecutar diferentes instrucciones sobre distintos datos. La
arquitectura MIMD pueden utilizarse en una amplia gama de aplicaciones
como el diseño asistido, simulación, modelado y en interruptores. Las
computadoras MIMD pueden categorizarse por tener memoria compartida
o distribuida, clasificación que se basa en cómo el procesador MIMD
accede a la memoria. La memoria compartida de las máquinas puede estar
basada en buses, extensiones, o de tipo jerárquico. Las máquinas con
memoria distribuida pueden tener esquemas de interconexión en
hipercubo o malla.
47
Computadores MISD (Multiple Instruction Single Data): Se ejecutan varios
flujos de instrucciones, aunque todos actúan sobre el mismo flujo de datos.
Es un tipo de arquitectura computacional (particularmente de computación
paralela) donde muchas unidades funcionales realizan diferentes
operaciones en los mismos datos. Las arquitecturas segmentadas
pertenecen a este tipo, aunque en un extremo se podría llegar a decir que
los datos son diferentes después de ser procesados por cada etapa en el
pipeline, con lo cual no entraría en esta categoría.
48
XII. TIPOS DE PROCESAMIENTO PARALELISMO SEGÚN LA TAXONOMÍA
DE FLYNN
Paralelismo de datos
Se utiliza cuando una misma función, instrucción, etc… se ejecuta repetidas
veces en paralelo sobre datos diferentes. Se utiliza en máquinas de la clase
MIMD.
Paralelismo funcional.
Se aprovecha cuando las funciones, bloques, instrucciones, etc… que
intervienen se ejecutan en paralelo. Existen distintos niveles de paralelismo
funcional.
Nivel de instrucciones u operaciones. (ILP), las instrucciones de un
programa se ejecutan en paralelo, es de bajo nivel, se explota por el
hardware de forma transparente o por el compilador. Es el nivel de
granularidad más fina en la arquitectura de computadores la granularidad
es la cantidad de trabajo asociado a cada tipo de tarea candidata a la
paralelización.
49
Nivel de bucle. Se ejecutan en paralelo distintas iteraciones de un bucle o
secuencias de instrucciones de un programa, la granularidad es fina-
media.
Nivel de funciones. Los distintos procedimientos que constituyen un
programa se ejecutan simultáneamente, la granularidad es media.
Nivel de programas. Se ejecutan en paralelo programas diferentes que
pueden ser o no de una misma aplicación, la granularidad es gruesa.
50