Beruflich Dokumente
Kultur Dokumente
FACULTAD DE INGENIERÍA
E.P. INGENIERÍA DE SISTEMAS E INFORMÁTICA
TÓPICO I
Algoritmos Paralelos
CICLO
VII
AUTORES
Baes Vásquez Diego
Medina Charcape Andrés
Saavedra Altuna Kenny
Ramírez Cava Shanira
ASESOR
Ing. Luis Enrique Ramírez Milla
CHIMBOTE – PERÚ
2019
ÍNDICE
I. INTRODUCCIÓN ........................................................................................................................ 3
II. JUSTIFICACIÓN ...........................................................................Error! Bookmark not defined.
III. MARCO TEORICO ................................................................................................................. 4
3.1. DEFINICIÓN DEL ALGORITMOS PARALELOS .............................................................. 4
3.2. ETAPAS DE LOS ALGORITMOS PARALELOS ................................................................ 4
3.2.1. PARTICIÓN: ................................................................................................................... 4
3.2.2. COMUNICACIÓN: .......................................................................................................... 5
3.2.3. AGRUPAMIENTO: ......................................................................................................... 6
3.2.4. ASIGNACIÓN:................................................................................................................. 7
3.3. TÉCNICAS ALGORITMICAS PARALELAS ....................................................................... 8
3.4. MODELOS DE ALGORITMOS PARALELOS .................................................................. 11
IV. CONCLUSIONES................................................................................................................... 19
V. LINKOGRAFÍA ......................................................................................................................... 20
I. INTRODUCCIÓN
La mayoría de los algoritmos actuales son secuenciales, es decir, especifican una
secuencia de pasos en los que cada paso consiste en una sola operación. Estos
algoritmos se adaptan bien a las computadoras actuales, que básicamente realizan
operaciones de forma secuencial.
Aunque la velocidad a la que operan las computadoras secuenciales ha mejorado a
una tasa exponencial durante muchos años, ahora la mejora tiene un costo cada vez
mayor. Como consecuencia, los investigadores han buscado mejoras más rentables
mediante la construcción de computadoras "paralelas": computadoras que realizan
operaciones múltiples en un solo paso.
Para resolver un problema de manera eficiente en una máquina paralela,
generalmente es necesario diseñar un algoritmo que especifique operaciones
múltiples en cada paso, es decir, un algoritmo paralelo
II. MARCO TEORICO
2.3.2. COMUNICACIÓN:
Las tareas generadas por una partición pueden ejecutarse concurrentemente pero
no pueden, en general, ejecutarse independientemente. Los cálculos en la ejecución
de una tarea normalmente requerirán de datos asociados con otras tareas. Los
datos deben transferirse entre las tareas y así permitir que los cálculos procedan.
En la descomposición por dominio, la comunicación puede ser difícil de determinar
(hay que identificar las operaciones que requieren datos de diferentes fuentes). En
cambio, en la descomposición funcional, es fácil de determinar, ya que las
interrelaciones entre las tareas vienen dadas por las funciones que realiza cada
una, y de las cuales quizás la otra depende. (J. Aguilar, E. Leiss, 2004).
Los tipos de comunicación está categorizada de la siguiente manera:
Comunicación local y global: Cuando un número pequeño de tareas necesitan
valores de otras tareas se crean canales entre las tareas envueltas. Una tarea se
comunica solamente con sus vecinos. Esta es comunicación local. Y la
comunicación global ocurre cuando todas o casi todas tareas necesitan valores
de las otras tareas, es decir, cada tarea se comunica con todas, o casi todas. Así,
en una comunicación global, muchas tareas pueden participar, lo que puede
conllevar a muchas comunicaciones.
Comunicación estructurada y no estructurada: En este tipo de
comunicación, el patrón de comunicación de una tarea con sus vecinos forma
una estructura regular, por ejemplo, del tipo árbol o malla. Las no estructuradas
pueden generar grafos de comunicación arbitrarios.
Comunicación estática o dinámica: La comunicación estática establece
patrones de comunicación que no cambian en el tiempo, mientras que la
dinámica puede ser solamente determinada durante el tiempo de ejecución de
la aplicación.
Comunicación síncrona o asíncrona: La comunicación síncrona implica que
las tareas se ejecutan coordinadamente (es decir, se deben sincronizar entre
ellas), y la asíncrona significa que cada tarea puede ejecutarse al obtener los
datos que requiere, sin tener que esperar por otras tareas. (J. Aguilar, E. Leiss,
2004).
2.3.3. AGRUPAMIENTO:
Las tareas y las estructuras de comunicación definidas en las dos primeras etapas
del diseño son evaluadas con respecto a los requerimientos de ejecución y costos
de implementación: Si es necesario, las tareas son combinadas en tareas más
grandes para mejorar la ejecución o para reducir los costos de comunicación y
sincronización.
Reduciendo el número de mensajes, a pesar de que se envíe la misma cantidad de
información, se reduce el costo de crear un nuevo canal de comunicación. (J.
Aguilar, E. Leiss, 2004).
2.3.4. ASIGNACIÓN:
En esta etapa, cada tarea es asignada a un procesador de tal modo que intente
satisfacer las metas de competencia al maximizar la utilización del procesador y
minimizar los costos de comunicación. (J. Aguilar, E. Leiss, 2004).
La asignación puede ser estática (se establece antes de la ejecución del programa)
o en tiempo de ejecución mediante algoritmos de balanceo de carga.
La asignación de tareas puede ser realizada de las siguientes maneras:
Asignación estática: Aquí, las tareas son asignadas a un procesador al
comienzo de la ejecución del algoritmo paralelo y corren ahí hasta el final.
En ciertos casos puede resultar en un tiempo de ejecución menor respecto
a asignaciones dinámicas y también puede reducir el costo de creación de
procesos, sincronización y terminación.
Asignación dinámica: Se hacen cambios en la distribución de las tareas
entre los procesadores a tiempo de ejecución, o sea, hay migración de
tareas a tiempo de ejecución. Esto es con el fin de balancear la carga del
sistema y reducir el tiempo de ejecución. Sin embargo, el costo de
balanceo puede ser significativo y por ende incrementar el tiempo de
ejecución. (Hoeger Herbert, sf).
Entre los puntos que hay que revisar en esta etapa encontramos:
Si se han considerado algoritmos con un número estático de tareas y
algoritmos de creación dinámica de tareas.
Si se usan algoritmos centralizados de balanceo, hay que asegurarse
de que no sea un cuello de botella.
Evaluar los costos de las diferentes alternativas de balanceo dinámico,
en caso de que se usen, y que su costo no sea mayor que los beneficios.
(Hoeger Herbert, sf).
2.4.2. ALEATORIZACION
Los números aleatorios se utilizan en algoritmos paralelos para garantizar que los
procesadores puedan tomar decisiones locales que, con alta probabilidad, se
suman a buenas decisiones globales. Aquí consideramos tres usos de la
aleatoriedad.
Muestreo: Un uso de la aleatoriedad es seleccionar una muestra
representativa de un conjunto de elementos. A menudo, un problema se
puede resolver seleccionando una muestra, resolviendo el problema en esa
muestra y luego usando la solución para la muestra para guiar la solución
para el conjunto original. Por ejemplo, supongamos que queremos ordenar
una colección de claves enteras. Esto se puede lograr dividiendo las llaves
en cubetas y luego clasificando dentro de cada cubeta. Para que esto
funcione bien, las cubetas deben representar intervalos no superpuestos de
valores enteros, y cada cubeta debe contener aproximadamente el mismo
número de llaves El muestreo aleatorio se usa para determinar los límites
de los intervalos. Primero, cada procesador selecciona una muestra
aleatoria de sus claves. A continuación, todas las claves seleccionadas se
ordenan juntas.
Finalmente, estas claves se utilizan como límites. Tal muestreo aleatorio
también se usa en muchos algoritmos de comparación de geometría
computacional, grafos y cadenas en paralelo.
La ruptura de la simetría: otro uso de la aleatoriedad es la ruptura de la
simetría. Por ejemplo, considere el problema de seleccionar un gran
conjunto independiente de vértices en un grafo en paralelo. (Un conjunto
de vértices es independiente si no hay dos vecinos.) Imagine que cada
vértice debe decidir, en paralelo con todos los demás vértices, si unirse al
conjunto o no. Por lo tanto, si un vértice elige unirse al conjunto, todos sus
vecinos deben elegir no unirse al conjunto. La elección es difícil de realizar
simultáneamente por cada vértice si la estructura local en cada vértice es
la misma, por ejemplo, si cada vértice tiene la misma cantidad de vecinos
Como resultado, el punto muerto se puede resolver mediante el uso de la
aleatoriedad para romper la simetría entre los vértices.
Equilibrio de carga: un tercer uso de la aleatoriedad es el equilibrio de
carga. Una forma de dividir rápidamente una gran cantidad de elementos
de datos en una colección de subconjuntos de tamaño aproximadamente
uniforme es asignar aleatoriamente cada elemento a un subconjunto. Esta
técnica funciona mejor cuando el tamaño promedio de un subconjunto es
al menos logarítmico en el tamaño del conjunto original.
2.4.3. TÉCNICAS DE PUNTERO PARALELAS
Muchas de las técnicas secuenciales tradicionales para manipular listas, árboles y
grafos no se traducen fácilmente en técnicas paralelas. Por ejemplo, técnicas como
atravesar los elementos de una lista vinculada, visitar los nodos de un árbol en
postorden o realizar un recorrido en profundidad de un grafo parecen ser
inherentemente secuenciales. Afortunadamente, estas técnicas a menudo pueden
ser reemplazadas por técnicas paralelas con aproximadamente el mismo poder.
Puntero saltando: Una de las más antiguas técnicas de punteros paralelos es el
puntero saltando [88]. Esta técnica se puede aplicar a listas o árboles. En cada paso
de salto del puntero, cada nodo en paralelo reemplaza su puntero con el de su
sucesor (o padre). Por ejemplo, una forma de etiquetar cada nodo de una lista n-
nodo (o árbol) con la etiqueta del último nodo (o raíz) es usar el salto del puntero.
Después de la mayoría de los pasos de ⌉ log n⌉ , cada nodo apunta al mismo nodo,
el final de la lista (o la raíz del árbol).
Recorrido de Euler: Un recorrido de Euler por un grafo dirigido es una
ruta a través del grafo en el que cada borde se atraviesa exactamente una
vez. En un grafo no dirigido, cada borde se reemplaza típicamente con dos
bordes opuestos. El recorrido por Euler de un árbol no dirigido sigue el
perímetro del árbol visitando cada borde dos veces, una vez en el camino
hacia abajo y una vez en el camino hacia arriba. Al mantener una estructura
enlazada que representa el recorrido de Euler por un árbol, es posible
calcular muchas funciones en el árbol, como el tamaño de cada subárbol.
Esta técnica usa trabajo lineal y profundidad paralela que es independiente
de la profundidad del árbol. El recorrido de Euler a menudo se puede
utilizar para reemplazar un recorrido estándar de un árbol, como un
recorrido transversal en profundidad.
Contracción del grafo: La contracción del grafo es una operación en la cual
un grafo se reduce en tamaño mientras se mantiene parte de su estructura
original. Normalmente, después de realizar una operación de contracción
del grafo, el problema se resuelve recursivamente en el grafo contratado.
La solución al problema en el grafo contratado se usa para formar la
solución final. Por ejemplo, una forma de dividir un grafo en sus
componentes conectados es primero contraer el grafo fusionando algunos
de los vértices con los vértices vecinos, luego encontrar los componentes
conectados del grafo contratado y finalmente deshacer la operación de
contracción. Muchos problemas pueden resolverse contrayendo árboles,
en cuyo caso la técnica se llama contracción de árbol.
Descomposición del oído: Una descomposición de oído de un grafo es una
partición de sus bordes en una colección ordenada de caminos. El primer
camino es un ciclo, y los otros se llaman orejas. Los puntos finales de cada
oreja están anclados en caminos anteriores. Una vez que se encuentra la
descomposición de un grafo en un oído, no es difícil determinar si dos
bordes se encuentran en un ciclo común. Esta información puede usarse en
algoritmos para determinar biconnectividad, triconnectividad, 4-
conectividad y planaridad. Se puede encontrar una descomposición de la
oreja en paralelo usando trabajo lineal y profundidad logarítmica,
independientemente de la estructura del grafo. Por lo tanto, esta técnica se
puede utilizar para reemplazar la técnica secuencial estándar para resolver
estos problemas, búsqueda de profundidad en primer lugar.
2.4.4. OTRAS
Muchas otras técnicas han demostrado ser útiles en el diseño de algoritmos
paralelos. Encontrar separadores de grafos pequeños es útil para dividir datos
entre procesadores y reducir la comunicación. La función hash es útil para
equilibrar la carga y asignar direcciones a la memoria
Paralelización Automática:
Con opción de compilación si no hay dependencia de datos o el compilador
detecta que se puede resolver.
Con Pragma (t(n,p)=n/p):
s=0;
#pragma omp parallel for priate(i) reduction(+:s)
for (i=0; i<n; i++)
S=s+a[i]
endfor
Ejemplo:
Método de Montecarlo
Este algoritmo consiste en generar experimentos aleatorios independientes
consistentes en generar N puntos x, y que pertenezcan de 0 a 1 y contabilizar
C los números que caen dentro del cuadrante de un circulo de radio 1.
El área del circulo es igual a pi*radio **2, el área del cuadrante es pi/4, y la
probabilidad es C/N = pi/4 osea pi = 4C/N.
def pi(n):
c = 0
for i in range(n):
x = random.random()
y = random.random()
acierta = enCirculo(x, y)
if acierta:
c = c + 1
return (4.0 * c)/n
print pi(10000000)
Paralelización
Este reparto consiste en la generación de N experimentos en un conjunto de
P procesadores. Cada procesador puede generar puntos y contar cuales C
caen en el rango del círculo con 1 de radio.
Al iniciar solo el proceso principal conoce cuales son los valores de N, osea
el número de pruebas que se quiere hacer, y cuantos procesadores se van a
tener.
Después se envían a los procesos esclavos la N, para que empiecen a calcular.
Inicialmente el proceso maestro del programa paralelo conoce los
valores de N y P.
Paso 1: Envío de N y P a los procesos esclavos del programa paralelo
Paso 2: Cada proceso del programa paralelo realiza el trabajo que le
corresponde. Cálculo del número de experimentos Np = N/P.
Realización de los experimentos para calcular Cp.
En donde señaletotal
que =sean
0 5 procesadores, osea 5 hilos que realicen la tarea
indicada. for i in range(q.qsize()):
Y la ejecución se ve así:
num = q.get(i)
print num #aqui se imprime la suma que obtiene cada
hilo individual
total = num + total
pi = (4.0 * total)/n # formula para obtener el pi tomando
el total de aciertos y dividiendo
print "Pi en colaboracion " + str(pi)
2.5.5. MODELO DE PIPELINE O PRODUCTO-CONSUMIDOR
El problema se divide en una serie de etapas. Cada etapa se ejecuta, por
ejemplo, en un procesador, y pasa resultados a la siguiente.
Condiciones:
-- que se ejecute más de una vez el mismo problema.
-- que se procese una serie larga de datos.
-- que se pueda pasar datos a la siguiente fase mucho antes del final del
cálculo de cada fase.
--que el tiempo de proceso asociado a cada fase sea similar (load balancing).
Algunos ejemplos:
-- procesado de señal (sonido, vídeo...)
-- simulaciones de procesos segmentados (computación)
2.6.3. ELEMENTOS
Tiempo de Ejecución:
Formulas de diapo 12
Ocupación de Memoria
Formulas de diapo 13
Conteo de Instrucciones
Diapos 14 y 15
Notación Asíntota
Diapo 16
Tiempos de comunicación
Diapos 19 y 20
III. CONCLUSIONES
IV. LINKOGRAFÍA