Ejercicios Tema 3

Ejercicios Tema 3 Programación Paralela José María Cecilia Grado en Informática Alumno: Tomás José Sánchez Díaz Ejer

Views 137 Downloads 3 File size 643KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

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 #include 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