Ejercicios Tema 3
Ejercicios Tema 3
Ejercicios Tema 3
Programación Paralela
Grado en Informática
Ejercicio 2. Realice un programa omp que muestre la diferencia entre firstprivate y lastprivate.
¿Cuál es esta diferencia?
- Con firstprivate, cogemos como valor de referencia para una variable, el valor que tenía antes de empezar la
parte de código paralelo.
- Con lastprivate, cogemos el último valor que una variable toma dentro de la zona paralela y lo muestra fuera
de esa zona.
Ejercicio 3. Realice un programa en omp que realice la suma de vectores de tamaño N (1024,
2048, 4096) utilizando 2, 4, 6 y 8 procesos. Tome tiempos de ejecución y muestre un gráfico que
indique la escalabilidad del sistema.
Con el objetivo de conseguir unas mediciones fiables, para todas las gráficas generadas, se
han realizado una media entre 7 y 9 mediciones de cada configuración medida.
Ejercicio 4. Realice un programa en omp que realice el código saxpy; y[i] = x[i]*alpha + y[i] para
arrays de tamaño N (1024, 2048, 4096) utilizando 2, 4, 6 y 8 procesos. Tome tiempos de ejecución
y muestre un gráfico que indique la escalabilidad del sistema.
Ejercicio 5. Realice un código que reduzca un vector de tamaño N (1024, 2048, 4096) utilizando 2,
4, 6 y 8 procesos. Tome tiempos de ejecución y muestre un gráfico que indique la escalabilidad del
sistema.
Ejercicio 6. Realice un código paralelo en omp que contenga una sección paralela y dentro de esta
sección imprima el id del master thread. El resto de hilos deben imprimir su id después del maestro
deben realizar ninguna acción.
Ejercicio 7. Dado el código secuencial de la Figura 1 para el cálculo del número pi, realice una
implementación en omp que paralelice el código. Ejecute distintos configuración de hilos y muestre
una tabla de tiempos. ¿Con cuántos hilos es más eficiente el programa? ¿Por qué?
a) Realizar el código paralelo para ejecutar dos funciones en dos secciones distintas,
mostrando para cada hilo, el tiempo total consumido en cada sección. El código secuencial
se aporta en la (Fig. 1). En el ejemplo figura omp_get_wtime(),que se utiliza para medir
tiempos, al igual que wtime() vista en clase.
a) Se pide realizar la paralelización con OpenMP del producto escalar de dos vectores con
tamaños (3000, 4000 y 5000), variando el número de hilos hasta un máximo de 8. Se debe
estudiar la evolución del tiempo de ejecución con respecto a la versión secuencial.
c) Realizar una gráfica o tabla comparativa de los tiempos de la versión secuencial, paralela
(apartado a) y paralela (apartado b).
La parelilización con #pragma omp critical, provoca un aumento en los tiempos de ejecución.
Ejercicio 4. Realizar un código paralelo en OpenMP que obtenga máximo o el mínimo del vector.
Ejercicio 5. Realizar un código paralelo de la multiplicación de un vector por una matriz. Se pide:
En el caso de realizar un paralelismo anidado, los tiempos de ejecución superan a los tiempos
de la ejecución secuencial.
SEC; Para 8 hilos, y 3000 elementos, el tiempo es: 0.026000
OMP; Para 8 hilos, y 3000 elementos, el tiempo es: 0.528000
Ejercicio 6. Ejecutar el código de (Fig 4) en Hertz y comentar lo que sucede si dejamos activada la
permisividad de paralelismo anidado con omp_set_nested(1) o por el contrario la desactivamos.
#include <omp.h>
#include <stdio.h>
void threads_por_nivel(int nivel)
{
printf("Nivel %d: Número de hilos en el nivel %d -
%d\n",nivel,nivel,omp_get_num_threads());
}
int main()
{
omp_set_nested(1)
omp_set_num_threads(2);
#pragma omp parallel
{
threads_por_nivel(1);
omp_set_num_threads(2);
#pragma omp parallel
{
threads_por_nivel(2);
omp_set_num_threads(2);
#pragma omp parallel
{
threads_por_nivel(3);
}
}
}
return(0);
}
Fig. 4. Código ejemplo de paralelismo anidado.
A continuación, escoger alguna de las implementaciones vistas en clase u otra que el alumno
quiera plantear, y aplicar esta técnica.
b) Ejecutar el código paralelizado para tamaños de matriz (1024 x 1024, 2048 x 2048 y 4096 x
4096). ¿Ofrece más rendimiento la misma estrategia paralela en todos los casos?.
Observamos que la estrategia escogida con schedule(static,50), es la mejor en todos los casos. Incluso
habiendo realizado estudios de un Schedule (static), obtenemos unos tiempos similares a schedule
(dynamic, 50).
Ejercicio 3. Los patrones stencil o plantilla son muy utilizados en una amplia variedad de campos de
ingeniería, sobre todo para la resolución de ecuaciones diferenciales en derivadas parciales. En el
ejercicio 1 del seminiario 0 se planteaba la implementación de un patrón stencil de 1D. En este
ejercicio se pide la paralelización de un patrón stencil 2D cuyo núcleo secuencial se aporta en Fig.
2.
b) Ejecutar el código paralelizado para tamaños de matriz (1024 x 1024, 2048 x 2048 y 4096 x
4096), con 100 iteraciones. ¿Ofrece más rendimiento la misma estrategia paralela en todos
los casos?.
Al trabajar el ejercicio 1 parte 3 (jacobi 2D), ya se ha trabajado con el mismo código, por tanto, no se
desarrolla toma de tiempos para este caso.