Professional Documents
Culture Documents
programas paralelos
Marcelo Arroyo
Estas nuevas tecnologías, ahora al alcance de todos ya que una computadora personal es una
arquitectura paralela, requiren que los desarrolladores de software no pueden ignorar los con-
ceptos y técnicas necesarias para el desarrollo de este tipo de sistemas de software que permitan
explotar los sistemas de computación modernos.
Es posible ver a Internet como un gran sistema multiprocesador, lo cual ha permitido el des-
arrollo de aplicaciones cooperativas, explotando el gran poder computacional de la red. Un
ejemplo de esto son los proyectos del tipo SETI (Search for Extra Terrestrial Inteligence) y
algunos proyectos de secuenciación de genes.
3
Parte I
Conceptos y técnicas
Prólogo 7
Esta parte contiene una introducción a las arquitecturas paralelas, clasificación y modelos de
computación paralela. Se describen los conceptos básicos sobre concurrencia, problemas y solu-
ciones para el desarrollo de programas concurrentes. Se repasan conceptos sobre complejidad
computacional y se desarrollan conceptos y técnicas de análisis y diseño de algoritmos paralelos.
Se analizan casos de estudio y se presenta un método de desarrollo de algoritmos paralelos.
Capítulo 1
Introducción
"The complexity for minimum component costs has increased at a rate of roughly a factor of two
per year. Certainly over the short term this rate can be expected to continue, if not to increase.
Over the longer term, the rate of increase is a bit more uncertain, although there is no reason to
believe it will not remain nearly constant for at least 10 years. That means by 1975, the number
of components per integrated circuit for minimum cost will be 65,000." Gordon Moore, 1965.
En los últimos años hemos sido testigos de grandes avances en las tecnolgías aplicadas al des-
arrollo de microprocesadores. Hemos pasado de frecuencias de reloj de 40 Mhz hasta 3 Ghz.
Además del avance en velocidad, los microprocesadores actuales pueden ejecutar múltiples ins-
trucciones en el mismo ciclo. Los increíbles niveles de integración alcanzados han permitido
incorporar diferentes unidades de procesamiento en el mismo chip. Los más recientes avances
son la replicación de unidades de procesamiento en el mismo chip (multicores).
Las capacidades de memoria se han incrementado prácticamente al mismo ritmo que los
avances en velocidad.
Hoy contamos con comptadoras de escritorio con múltiples procesadores, servidores de bajo
costo con hardware redundante y altas capacidades de procesamiento y almacenamiento. Estas
computadoras pueden contener interfaces de red con tasas de transferencia y bajas latencias que
permiten interconectarlas para lograr un sistema multiprocesador en red con altísima capacidad
de procesamiento.
Actualmente es muy importante para los desarrolladores de software comprender estas arqui-
tecturas y los conceptos y técnicas aplicables al desarrollo de aplicaciones paralelas.
Inicialmente los incrementos del paralelismo en hardware se produjo a nivel de bits. Hemos
pasado de microprocesadores de 4 a 8, 16, 32 y actualmente 64 bits. Estos incrementos permiten
manipular datos de mayor magnitud en una sola instrucción. A partir de mediados de los 90, se
ha incrementado el paralelismo funcional, esto es, incorporando nuevas unidades específicas de
procesamiento (ej: unidades de punto flotante y procesadores vectoriales) las cuales pueden tra-
bajar en paralelo con las demás unidades.
9
10 Introducción
A modo de ejemplo, supongamos que un procesador contiene dos pipelines de 5 etapas cada
uno (IF:instruction fetch, ID:instruction decode, OF:operand fetch, IE:instruction decode y
WB:write-back). La figura 2.1 muestra el pipeline y un fragmento de programa que suma 4
números, almacenados en las direcciones de memoria 1000, 1004, 1008 y 100C.
11
12 Arquitecturas paralelas
Consideremos la ejecución del programa dado. Las dos primeras instrucciones pueden ser eje-
cutadas concurrentemente. Lo mismo ocurre con las instrucciones 3 y 4. Las últimas dos ins-
trucciones no pueden ser ejecutadas concurrentemente, ya que la instrucción 6 depende del resul-
tado (R1) de la instrucción 5.
Las dependencias de datos entre las instrucciones hace que los pipelines no puedan utilizarse
al ciento por ciento, ya que se deberán esperar a que se finalicen la instrucciones previas.
La lógica de control necesaria para determinar las dependencias mencionadas puede ser una
limitante para su incorporación directa en hardware. Por eso muchas optimizaciones pueden
dejarse bajo la responsabilidad de los compiladores, comúnmente llamados compiladores optmi-
zantes. Secuencias de instrucciones que pueden ser ejecutadas en múltiples unidades funcionales
en forma concurrente se empaquetan (o delimitan). Estas secuencias toman la forma de una ins-
trucción de palabra muy larga (very long instruction word ).
La arquitectura IA64 de Intel utiliza esta esta idea.
Los datos necesitados por el procesador se almacenan en la cache. Cada vez que el proce-
sador necesita acceder a una dirección de memoria, la unidad de manejo de la memoria (MMU)
busca los datos requeridos en la cache antes que ir directamente a la RAM.
2.1. Generalmente incluyen selección por una rama (generalmente la verdadera) o ambas ramas (una se inva-
lidará).
2.3 Clasificación de arquitecturas paralelas 13
Una cache puede verse como un dispositivo que implementa una función que va desde un
conjunto de direcciones (tags) en una palabra (en caso de un hit) o falla (miss).
Actualmente es común encontrar arquitecturas con varios niveles de caches, las cuales se
conocen como L1, L2, etc. Los niveles crecientes de cache generalmente tienen mas capacidad de
almacenamiento pero menos ancho de banda y mayor latencia.
Los procesadores actuales generalmente tienen caches de diferentes tipos (ej: caches de ins-
trucciones y caches de datos) y han alcanzado atísimas capacidades de almacenamiento. A modo
de ejemplo, el Intel Core i7 (2008) tiene una cache L3 de 8MB compartida por todos los núcleos.
• MISD: diferentes instrucciones operan sobre los mismos datos en paralelo. Arquitecturas
no muy comunes. Usadas generalmente para proveer redundancia por de hardware para
aumentar la confiabilidad. Ejemplos: computadora del transbordador espacial.
• MIMD: diferentes instrucciones actuando simultáneamente sobre diferentes datos. Esta es
la arquitectura típica de un multiprocesador.
PE CU
Interconection
Interconection
+
PE
Network
Network
PE CU
CU +
PE
... ...
CU
PE +
PE
a) SIMD b) MIMD
Figura 2.2.
La figura 2.2 muestra las diferencias de los modelos SIMD y MIMD (CU=Control Unit,
PE=Processing Element).
Los mecanismos de comunicación (operaciones send y receive) podrán tener las siguientes
características:
a) Sincrónico: la operación deberá esperar (bloquearse) hasta que se complete. Es muy
común usar receive en forma sincrónica.
b) Asincrónica: se continúa inmediatamente con la instrucción siguiente. Es común el uso de
send en esta forma, lo que permite aumentar el paralelismo (realizar simultáneamente
comunicación con ejecución).
• Redes completamente conectadas: existe una conexión entre cada para de procesadores.
• Redes estrella: existe un procesador intermedio que rutea los mensajes entre cualquier par
de procesadores.
• Arreglos: lineales (ej: pipelines), bidimensionales (matrices), cubos, hipercubos, etc.
• Árboles: sistemas de interconexión jerárquicos.
• Hipercubos.
m1 m2 ... mk P1 m1
Compartida
Memoria
estado 1
estado 2
estado s
P1
... ...
...
Pn
... mk
P1 Pn Pn
• Dinámico o reconfigurable
Definición 2.1. El diámetro de una red de interconexión es el máximo de los caminos (paths)
mínimo entre dos nodos cualesquiera de procesamiento.
Definición 2.3. El ancho de bisección es el número mínimo de links que pueden ser remo-
vidos para particionar una red en dos partes iguales.
Definición 2.4. El ancho de un link o canal es el número de bits que éste puede transmitir
simultáneamente.
Definición 2.6. El ancho de banda (bandwidth) es el ancho del canal por la tasa de trans-
ferencia.
2.6 Ejercicios
1. Dado el modelo de procesador y el programa de la figura 2.1 mostrar una ejecución del
programa describiendo los estados de cada etapa de los pipelines en cada ciclo de reloj.
Asuma que en cada ciclo de reloj se ejecuta una etapa del pipeline.
2. Supogamos un procesador operando a 1 GHz (clock de 1 ns) con dos unidades de punto
flotante y es capaz de ejecutar hasta 4 instrucciones por ciclo, conectado a una DRAM
operando a 100 ns (tamaño de bloque de transferencia = 1 word), sin caché. El proce-
sador tiene un rendimiento de hasta 4 GFLOPS2.2. Supongamos una operación de pro-
ducto de dos vectores de reales. ¿Qué tasa de rendimiento alcanza el procesador?
3. Suponiendo que dado el mismo sistema que el ejercicio anterior al que adicionamos una
caché de 32KB con una latencia de 1 ns (igual velocidad que el procesador). Un pro-
grama realiza el producto de dos vectores de 1024 valores en punto flotante cada uno.
¿Qué rendimiento alcanzará el procesador en términos de FLOPS? Asuma que la
memoria cache no sobreescribe valores mientras tenga capacidad libre.
4. Idem al ejercicio anterior pero el programa debe multiplicar dos matrices de 32x32.
5. Suponga que se quiere escribir un programa que sume los elementos de cada columna de
una matriz dejando los resultados correspondientes en un vector. Suponga que las
matrices se almacenan por filas (row-major order).
a) Dar un programa (en pseudo-código) que resuelva el problema.
b) Suponiendo que el vector de resultados entra en la caché: ¿Cómo podría lograr
otra versión del programa que aprovechara mejor la caché?
19
Capítulo 4
Análisis de Algoritmos Paralelos
Así como generalmente es posible hacer análisis de rendimiento de programas secuenciales, es
necesario tener métricas para programas paralelos.
A continuación se presentarán algunas definiciones útiles de medidas de rendimiento que
podrán ser usadas para hacer un análisis de rendimiento teórico en el proceso de desarrollo o
análisis de programas paralelos.
Definición 4.2. Un algoritmo tiene una complejidad temporal O(f (n)) si para cualquier
entrada de tamaño n y dadas las constantes n0 y c tal que n > n0 , el algoritmo no puede eje-
cutar mas pasos que c × f (n).
Esta medida de tiempo de ejecución teórica de un algoritmo es una estimación del pero caso
de ejecución o análisis asintótico. Frecuentemente también se usa para establecer el caso pro-
medio de ejecución.
Por ejemplo, el peor escenario del quicksort es O(n2), pero su caso promedio es O(n log n).
o como la razón de la suma de los tiempos de cada tarea y el número de procesos, es decir
21
22 Análisis de Algoritmos Paralelos
Pp i Pp i Pp i
TP = ( i=1 Tcomp + i=1 Tcomm + i=1 Tidle )/ p
El costo de un programa paralelo refleja la suma de los tiempos de ejecución de cada unidad
de procesamiento.
Se dice que un programa paralelo tiene costo óptimo si tiene costo computacional igual al
programa secuencial más rápido.
4.2 Escalabilidad
4.1. Raramente puede observarse en algunos experimentos que la aceleración es mayor que p debido a que el
programa secuencial deberá hacer más trabajo que las tareas paralelas, como por ejemplo cuando los datos en la
versión secuencial no pueden aprovechar cachés u otra característica de hardware. Esto se conoce como superli-
near speedup.
Parte II
Herramientas
4.2 Escalabilidad 25