Practico2 PIII2023

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

Programación III Período

Licenciatura en Sistemas
Lectivo
2023
UNJu – Facultad PRÁCTICO 2: OPENMP – Memoria Compartida
de Ingeniería

PRÁCTICA
1. Compile y ejecute el siguiente código fuente y describa su funcionamiento.
#include <omp.h>
#include <stdio.h>
int main() {
int threads;
threads = omp_get_num_threads();
printf("Total %d Threads\n", threads);
#pragma omp parallel
{
threads = omp_get_num_threads();
}
printf("Total %d Threads\n", threads);
}
¿Las cantidades totales de threads que se muestran con printf son iguales?
¿Por qué?
¿Qué ocurre si mueve el código de la linea 11 por debajo de la linea 9?
¿Por qué ocurre esta situación?
Sugerencias:
Para compilar
$gcc -fopenmp codigo.c -o codigo
Para ejecutar
$./codigo

2. Compile y ejecute el siguiente código fuente y describa su funcionamiento.


#include <omp.h>
#include <stdio.h>
int main() {
int threads,
id=100;
#pragma omp parallel private(id)
{
id = omp_get_thread_num();
threads = omp_get_num_threads();
printf("Thread ID %d de %d\n", id, threads);
}
printf("ID %d\n", id);
}
¿Qué ocurre si cambia la clausula private por shared? ¿Cuál será el valor
de la variable id al final de la ejecución?
3. Compile y ejecute el siguiente código fuente y describa su funcionamiento.
#include <omp.h>
#include <stdio.h>
int main() {
int TAM = 16;
int i, id, threads;
double vectorY[] = {12,51,11,21,12,13,23,34,100,45,56,11,10,5,17,5};
double vectorX[] = {21,25,31,42,41,23,12,34,23,30,78,99,12,32,1,11};
double vectorZ[TAM];
// omp_set_num_threads(2);
#pragma omp parallel for private(id)
for(i=0; i < TAM; ++i){
vectorZ[i] = vectorX[i] + vectorY[i];
id = omp_get_thread_num();
printf("El thread %d - Procesa el indice: %d\n", id, i);
}
for(i=0; i < TAM; ++i){
printf("VectorZ %f\n", vectorZ[i]);
}
}
¿Cuántos threads se ejecutan en la región paralela?
¿Cuántos índices procesa el thread 0?
¿Qué índices procesa el thread 0?
Si ejecuta el código compilado varias veces. ¿Cómo es el orden en que se
muestran los resultados? ¿Por qué?
4. Descomente la linea 9 //omp_set_num_threads(2); del código fuente del
punto anterior, vuelva a compilar y ejecutar.
¿Cuántos threads pueden se ejecutan en la región paralela?
¿Cuántos índices procesa el thread 0?
5. Cambie la linea 10 por #pragma omp parallel for schedule(static, 1)
private(id) del código fuente del punto 3, vuelva compilar y ejecutar.
¿Qué índices procesa el thread 0?
6. Compile y ejecute el siguiente código fuente y describa su funcionamiento.
#include <stdio.h>
#include <omp.h>
int main (int argc, char *argv[]) {
int i, id;
long int n = 30;
long int suma = 0;
#pragma omp parallel for reduction(+:suma) private (id)
for (i=0; i < n; i++){
if ((i % 2) == 0 ){
suma = suma + i;
#ifdef _OPENMP
id = omp_get_thread_num();
#endif
printf("Suma parcial en el thread: %d es %f\n", id, suma);
}
}
printf("Suma Total = %u\n",suma);
}
Pruebas:
a) Cambie el valor de la variable n por n=1000000000
b) Compile en modo secuencial y ejecútelo.
c) Compile en modo paralelo y ejecútelo.
d) Comente los resultados obtenidos en cada ejecución.
7. Codifique un algoritmo paralelo que permita sumar todos los elementos de un
vector de tamaño n que se ingresado como parámetro. Considere inicializar el
vector con n números aleatorios.
Pruebas:
a) Compile en modo secuencial y ejecútelo. Con los siguientes valores de n:
10000, 100000, 1000000.
b) Compile en modo paralelo y ejecútelo. Con los siguientes valores de n:
10000, 100000, 1000000.
c) Realice una tabla comparativa de tiempos (ejecución secuencial vs ejecución
paralela).
8. Dado el siguiente código fuente:
#include <omp.h>
#include "stdio.h"
int main() {
int TAM=50;
int i,j,k;
long double matrix1[TAM][TAM];
long double matrix2[TAM][TAM];
double matrix3[TAM][TAM];
/* asignamos valores a las las matrices */
for (i=0; i<TAM; i++) {
for (j=0; j<TAM; j++) {
matrix1[i][j]=(double) i * j;
matrix2[i][j]=(double) i - j;
matrix3[i][j]=(double) 0;
}
}
#pragma omp parallel for schedule (static) private (i, j, k)
for(i=0; i<TAM; i++) {
for(j=0; j<TAM; j++) {
for(k=0; k<TAM; k++) {
matrix3[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
}
}

Se pide:
a) Compile en modo secuencial y ejecutarlo.
b) Compile en modo paralelo y ejecutarlo.
c) ¿Cuánto tardo el programa en ejecutarse en modo secuencial?
d) ¿Cuánto tardo el programa en ejecutarse en modo paralelo?
e) Inicialice la variable TAM, del código fuente anterior, en 200 y repita los
items a), b), c), d).
f) Inicialice la variable TAM, del código fuente anterior, en 500 y repita los
items a), b), c), d).
g) Realice una tabla comparativa y comente los resultados.
9. Realice los cambios necesarios al algoritmo de búsqueda de números primos
(Punto 1: Práctico 1) para que el mismo soporte la búsqueda de los mismos
en forma paralela. Realice una tabla comparativa de tiempos (ejecución
secuencial vs ejecución paralela).
10. Realice los cambios necesarios al algoritmo para ordenar un vector de tamaño
n (Punto 2: Práctico 1) para que el mismo soporte la ordenación de los
elementos en forma paralela. Realice una tabla comparativa de tiempos
(ejecución secuencial vs ejecución paralela).
11. Realice los cambios necesarios al algoritmo para aproximar el valor de π
(Punto 4: Práctico 1) para que el mismo aproxime dicho valor en forma
paralela. Realice una tabla comparativa de tiempos (ejecución secuencial
vs ejecución paralela).

Sugerencias:
Para compilar modo paralelo
$gcc -fopenmp codigo.c -o codigoParalelo
Para compilar modo secuencial
$gcc codigo.c -o codigoSecuencial
Para ejecutar
$./codigoParalelo
$./codigoSecuencial

También podría gustarte