Practica2-Prog Paralela
Practica2-Prog Paralela
Practica2-Prog Paralela
Introducción a OpenMP
1. OBJETIVO.
• Conocer la programación paralela en arquitecturas de memoria compartida.
• Utilizar la API OpenMP para hacer programas paralelos.
2. BASE TEORICA COMPLEMENTARIA.
2.1. Memoria compartida en una computadora.
En el hardware de una computadora, la memoria compartida se refiere a un
bloque de memoria de acceso aleatorio a la que se puede acceder por varias
unidades de procesamiento diferentes. Tal es el caso de las computadoras
multicore donde se tienen varios núcleos que comparten la misma memoria
principal (ver Fig 1).
4. DESARROLLO DE LA PRÁCTICA
Para el desarrollo de la práctica de utilizará el compilador Visual C++ del Visual Studio
versión 2013 o superior.
4.1. ACTIVIDAD 1.
4.1.1. El constructor parallel.
El primer constructor a revisar es el más importante, parallel, el cual permite
crear regiones paralelas, es decir generar un número de hilos que ejecutarán
ciertas instrucciones y cuando terminen su actividad se tendrá solo al maestro.
(Ver Fig.3)
Hilo Maestro
Hilo Maestro
#include <iostream>
int main()
{
std::cout << "Hola Mundo...!\n" << std::endl;
std::cout << "Adios...!\n" << std::endl;
getchar();
return 0;
}
#include <iostream>
#include <omp.h>
int main()
{
#pragma omp parallel
{
std::cout << "Hola Mundo...!\n" << std::endl;
}
#include <iostream>
#include <omp.h>
int main()
{
#pragma omp parallel num_threads(5)
{
std::cout << "Hola Mundo...!\n" << std::endl;
}
4.3.3. Ejercicio 5.
En el siguiente ejercicio la definición de la variable i trasladamos antes de la
región paralela, por lo tanto, ahora la variable i se convierte en global a la que
todos los hilos tienen acceso.
#include <iostream>
#include <omp.h>
using namespace std;
int main()
{
int i; //--variable global
#pragma omp parallel
{
std::cout << "Imprime ciclo...!\n" << std::endl;
4.4. ACTIVIDAD 4.
Existen dos cláusulas que pueden forzar a que una variable privada sea
compartida y una compartida sea privada y son las siguientes:
4.4.1. La cláusula shared().
Las variables colocadas separadas por coma dentro del paréntesis serán
compartidas entre todos los hilos de la región paralela. Sólo existe una copia, y
todos los hilos acceden y modifican dicha copia.
4.4.2. La cláusula private().
Las variables colocadas separadas por coma dentro del paréntesis serán
privadas. Se crean p copias, una por hilo, las cuales no se inicializan y no tienen
un valor definido al final de la región paralela ya que se destruyen al finalizar la
ejecución de los hilos.
4.4.3. Ejercicio 6.
En el siguiente ejercicio se fuerza a que la variable i sea compartida
#include <iostream>
#include <omp.h>
using namespace std;
int main()
{
int i;
4.5. ACTIVIDAD 5.
Dentro de una región paralela hay un número de hilos generados y cada uno
tiene asignado un identificador. Estos datos se pueden conocer durante la
ejecución con la llamada a las funciones de la biblioteca
omp_get_num_threads() y omp_get_thread_num() respectivamente.
4.5.1. Ejercicio 8.
En el siguiente ejemplo para su buen funcionamiento se debe indicar que la
variable tid sea privada dentro de la región paralela, ya que de no ser así todos
los hilos escribirán en la dirección de memoria asignada a dicha variable sin un
control (race condition), es decir “competirán” para ver quién llega antes y el
resultado visualizado puede ser inconsistente e impredecible.
#include <iostream>
#include <omp.h>
using namespace std;
int main()
{
int tid, nth;
getchar();
return 0;
}
5. TAREA
Se requiere realizar la suma de dos arreglos unidimensionales de N elementos de
forma paralela utilizando solo dos hilos. Para ello se utilizará un paralelismo de datos
o descomposición de dominio, es decir, cada hilo trabajará con diferentes elementos
de los arreglos a sumar, pero ambos utilizarán el mismo algoritmo para realizar la
suma.