Nothing Special   »   [go: up one dir, main page]

Ejercicios Tema 3

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Ejercicios Tema 3

Programación Paralela

José María Cecilia

Grado en Informática

Alumno: Tomás José Sánchez Díaz


Ejercicios propuestos
Ejercicio 1. Realice un programa en openmp que pida al usuario el número de hilos a ejecutar y
muestre por pantalla el número de hilos que se están ejecutando en paralelo, el identificador de hilo
al ejecutarse en paralelo. Además en la parte paralela, se debe imprimir el número de hilos que
hay en ejecución una sola vez.

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.

Con # pragma omp barrier, obtenemos:

Comentado la línea anterior, la salida es:

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é?

Figura 1 Código secuencial para el cálculo del número pi

El programa se hace más eficaz con 4 hilos.


Ejercicios Tema 3 – Parte 2

Ejercicio 1. El uso de #pragma omp sections es comúnmente utilizado a la hora de ejecutar


dos funciones o más funciones de forma paralela. Se pide:

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.

b) (Opcional) Describir lo que sucede cuando aumentamos el número de hilos.

int main (){


double timeIni, timeFin; timeIni = omp_get_wtime();
printf("Ejecutando tarea 1\n");
tarea_uno();
printf("Ejecutando tarea 2\n");
tarea_dos();
timeFin = omp_get_wtime();
printf(“Tiempo total = %f segundos\n",timeFin – timeIni);
}
Fig. 1. Función main() de ejecución de dos tareas en secuencial.
Ejercicio 2. Realizar un código paralelo, o con alguno ya realizado en ejercicios anteriores de este u
otro seminario, que demuestre las diferentes maneras de asignar iteraciones a los distintos threads
(static, dynamic o guide). Este proceso se denomina, planificación de tareas o Schedule.
Ejercicio 3. Podemos definir el producto escalar de dos vectores, como el producto de sus
componentes y la suma total de todos ellos.

total += a[i] * b[i];

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.

La parelilización ayuda a mejorar considerablemente los tiempos de cálculo y además permite


mantener unos tiempos relativamente constantes, a pesar de ir aumentando el tamaño.

b) Realizar la paralelización con el uso de la directiva #pragma omp critical en vez de


reducir con la directiva #pragma omp....reduction.

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:

a) Estudiar el rendimiento de la paralelización con tamaños de matriz (1000x1000, 2000x2000 y


3000x3000) y vectores de (1000, 2000 y 3000) elementos, respectivamente. El núcleo de
cálculo se muestra a continuación, con un ejemplo práctico (Fig. 2), junto al núcleo secuencial
del cálculo (Fig. 3).

b) Estudiar el impacto en el rendimiento de aplicar paralelización anidada.

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.

Como se puede observar en la imagen, si desactivamos la permisividad,


Ejercicios Tema 3 – Parte 3
Ejercicio 1. El método de Jacobi es un algoritmo popular para la solución de la ecuación de Laplace
en un dominio diferencial cuadrado regularmente discretizado. El código secuencial, fue realizado
en el seminario 0 de la asignatura, que figura como ejercicio 3. Se pide

a) Analizar el algoritmo secuencial y explicar las distintas opciones de paralelización que


pueden aplicarse. Aplicar dos estrategias distintas y comparar tiempos de ejecución.
Como opciones para parelilización, probamos con #pragma omp parallel for y con #pragma omp
parallel for collapse(2). En ambos casos los tiempos son muy similares.
Tal como se muestran en la imágenes siguientes, con un tamaño de N=10, comprobamos que los
cálculos son los adecuados y los tiempos muy similares.

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?

En ambas estrategias los tiempos son


muy similares como se puede
comprobar tanto en las imágenes.
Ejercicio 2. Dado el núcleo secuencial de la multiplicación de matrices cuadradas en la Fig.1. Se
pide:

a) Completar el programa en C de multiplicación de dos matrices cuadradas y explicar las


distintas opciones de paralelización que pueden aplicarse al problema.

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?.

for (i=0; i<dimensión; i++) {


for (j=0; j<dimension ; j++) {
sum=0.0;
for (k=0; k<dimension; k++)
sum+=A[i][k]*B[k][j];
C[i][j]=sum;
}

Fig 1. Núcleo secuencial de la multiplicación de dos matrices cuadradas.


Como resultados ante las mediciones realizadas, tenemos que:

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.

for (k=0; k<iteraciones; i++) {


for (i=1; i<(filas-1); i++) {
for (j=1; j<(columnas-1) ; j++) {
B[i][j] = A[i-1][j] + A[i+1][j] + A[i][j-1] + A[i][j+1]
}
}
}
Fig 2. Núcleo secuencial stencil de 2D.
a) Completar el programa en C de stencil 2D y explicar las distintas opciones de paralelización
que pueden aplicarse al problema.

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.

RECTIFICACION: El las imágenes de las gráficas la medición escalar, se trata de secuencial.

También podría gustarte