CP Trabajo de Investigacion Unidad II EJ2022

Descargar como docx, pdf o txt
Descargar como docx, pdf o txt
Está en la página 1de 16

Tecnológico Nacional de México

Instituto Tecnológico de Veracruz

Departamento de Sistemas y Computación

Cómputo Paralelo.

Unidad 2: Open MP
Trabajo de Investigación

No. de Control Nombre completo


19020300 Brayan Bonilla Martinez

FECHA DE ENTREGA 26 ABRIL 2022

H. Veracruz, Ver. a 26 de Abril del 2022.

1. 1 DEFINICIÓN DEL PROBLEMA


Realice un Trabajo de Investigación elaborando un reporte en
formato doc y pdf de los tópicos empleados en “OpenMP”, así
como, realice una presentación (ppt) con la síntesis de los mismos.

Elaborar una presentación con la síntesis de los siguientes


tópicos:
 Programación de threads
 ¿Qué es OpenMP?
 Directivas de OpenMP.
o Constructor parallel.
o Constructor for
o Constructor sections
o Constructor single,…
 Sincronización.
o barrier, critical , atomic, flush,…
 Biblioteca de funciones.
 Variables de entorno.
 Ejemplos de aplicación.
o Constructor for
o Constructor sections

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
MATERIA: COMPUTO PARALELO.

RUBRICA: Trabajo de investigación.

UNIDAD 2. OpenMP.

NOMBRE DEL ALUMNO: Brayan Bonilla Martinez

Categoría Bueno Suficiente Insuficiente Puntos Total


(100%) (50%) (0%)
Presenta La presentación muestra alguna
La presentación es agradable a la La presentación está
ción audiencia en el aspecto estético y
estructura, pero la información
aparece aglomerada, mal
congestionada, confusa, mala 8
contribuye a llevar el mensaje del distribución de espacios que
distribuida y/o el fondo o plantilla
tema o se relaciona con el mismo afectan la legibilidad.
distrae la atención de la audiencia.
El Contenido está escrito de El contenido es vago, no comunica El contenido carece de un punto de
Contenid
o
manera clara y concisa con un
desarrollo lógico y progresivo de
punto de vista alguno y no muestra
sentido alguno.
vista claro y secuencia lógica del
desarrollo de la información.
18
ideas sustentadas por las fuentes Incluye poca información y uno o
de información. dos datos relacionados al tema.
Incluye poca información
persuasiva y pocos datos. Algunos
La información es exacta, reciente datos no concuerdan entre sí. La Información incompleta, pasada de
y proviene en su mayor parte de fuente de información primaria no fechas y/o incorrecta. Secuencia de
una fuente primaria de información. está clara. ideas no clara.
Referenci
Las fuentes de información están Algunas veces la información no No existe forma de verificar la
as o
fuentes
apropiadamente citadas, la está citada y/o documentada validez de la información. 4
audiencia puede determinar la apropiadamente
de credibilidad y autoridad de la
informaci información. Todas las fuentes de
ón información están claramente
identificadas usando los manuales
APA .

TOTAL 30
ING. ROMO MEDINA MARCO ALBERTO

Programación de threads
Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo
Medina
Una thread es un único flujo de control dentro de un programa. Algunas veces es
llamado contexto de ejecución porque cada thread debe tener sus propios
recursos, como el program counter y el stack de ejecución, como el contexto de
ejecución. 

Sin embargo, toda thread en un programa aún comparte muchos recursos,


tales como espacio de memoria  y archivos abiertos. Threads también son
llamadas procesos livianos (lightweight process).

NOTA: Es mucho más simple crear y destruir una thread que un proceso.

¿Qué es OpenMP?
OpenMP (Open Multi-Processing) es una interfaz de programación de aplicaciones
(API) para la programación multiproceso de memoria compartida en múltiples
plataformas. También podría definirse como un modelo de programación portable
y escalable que proporciona a los programadores una interfaz simple y flexible
para el desarrollo de aplicaciones paralelas para las plataformas que van desde
las computadoras de escritorio hasta los supercomputadores.

Es una solución de programación multiproceso para sistemas paralelos de


memoria compartida. Los lenguajes de programación admitidos incluyen C, C ++ y
Fortran. OpenMP proporciona una descripción abstracta de alto nivel de
algoritmos paralelos, que es particularmente adecuada para la programación
paralela en máquinas con CPU de varios núcleos.

El compilador procesa automáticamente el programa en paralelo de acuerdo con


las instrucciones pragma agregadas al programa, y el uso de OpenMP reduce la
dificultad y complejidad de la programación paralela. Cuando el compilador no es
compatible con OpenMP, el programa degenerará en un programa normal (en
serie).

Directivas de OpenMP
Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo
Medina
OpenMP comienza a través de directivas, con funciones propias (que pueden
ser condicionalmente compiladas) y variables de entorno, que pueden modificar
el comportamiento en tiempo de ejecución.

1. Directiva de formato. Cada directiva inicia con #pragma omp ...

#pragma omp directive-name[clause[,] clause]...

2. Constructor paralelo. Las siguientes directivas definen una región


paralela, la cual es una parte del programa que puede ser ejecutada por
multiples threads en paralelo. Este es el constructor fundamental que
inicia la ejecución paralela.

#pragma omp parallel [clause[,] clause]...

bloque de codigo

La clausula puede ser:

 if(expresión escalar)
 private(lista de variables)
 firstprivate(lista de variables)
 default(shared | none)
 shared(lista de variables)
 copyin(lista de variables)
 reduction(operador:lista de variables)
 num_threads(expresión entera)

Entre las clausulas que se pueden utilizar, las mas usadas son:

a. private(lista de variables) En esta la lista de variables puede ser


separada por "," y para cada una de ellas se genera una copia en
cada thread, esta copia no tiene relación con la original y no es
inicializada a menos que se utilice firstprivate.

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
b. shared(lista de variables) En esta las variables de la lista son
comunes a todos los threads y cada uno de ellos puede modificarla
afectandola en forma global.
c. threadprivate(lista de variables) Hace que la lista sea privada a
cada thread pero globales dentro de un thread.
d. reduction(operador:lista de variables) Realiza una operación de
reducción sobre las variables que aparecen en la lista utilizando el
operador/intrínseco especificado. El operador puede ser: +, *, -,
&(and), |(or), ^(eqv), &&(neqv). El intrínseco puede ser: || (Max),
(min), (and), (or).

Al final de una región paralela hay una sincronización implícita. Solo el


thread master continua la ejecución. Cuando un thread encuentra un
constructor paralelo, un grupo de threads es creado si uno de los
siguientes casos es verdadero:

 No esta la clausula if presente.


 Si al evaluar la expresión de if tiene un valor diferente de cero.

Este thread se convierte en el thread maestro de un grupo, con el


numero de thread 0, y todos los threads, incluyendo el maestro ejecutan
la región paralela. Si el valor de la expresión if se hace cero la región es
serializada nuevamente. Para determinar el numero de threads
necesarios, las siguientes reglas deben ser consideradas en orden. La
primera regla que cumple la condición es aplicada:

a. Si la clausula num_threads esta presente, entonces la expresión


entera en la clausula es el numero de threads requerido.
b. Si la función omp_set_num_threads de la librería es llamada,
entonces el valor del argumento es el numero de threads
requeridos.
c. Si la variable de entorno OMP_NUM_THREADS es definida
entonces el valor de esta variable de entorno es el numero de
threads requeridos.

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
d. Si ninguno de los métodos anteriormente mencionados es usado,
entonces el numero de threads requeridos en el definido por
defecto.

2. Constructor for La directiva for identifica un constructor de trabajo


compartido el cual especifica que las iteraciones del ciclo asociado deben
ser ejecutadas en paralelo.

#pragma omp for[clause[,] clause]...


{
ciclo for

Las clausulas que se pueden utilizar son las siguientes:

 private(lista de variables)
 firstprivate(lista de variables)
 lastprivate(lista de variables)
 reduction(operador:lista de variables)
 ordered
 schedule(categoria, tamaño_tramo)
 nowait

La clausula lastprivate hace que la lista se comporte como si hubiese sido


declarada privada, pero el ultimo thread que ejecuta la sentencia de
distribucion de trabajo, actualiza con su valor privado (de la lista) el que
hubiera antes del constructor.

La clausula ordered es una instancia donde una parte de un ciclo puede


ser ejecutada en orden serial, cuando el resto del ciclo se ejecuta en
paralelo.

La clausula schedule especifica cuantas iteraciones del for son divididas


entre el numero de threads, el valor de tamaño_tramo es especificado en
el for, es invariante y es un numero positivo. Las categorias utilizadas en
esta clausula puede ser una de las siguientes:

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
 static: cuando esta es usada, el numero de iteraciones es dividido
en tramos de tamaño "tamaño_tramo" y es asignado en forma de
"Round Robin".
 dynamic: cuando se usa esta categoria, la cantidad de iteraciones
es dividida en una serie de tramos, cada una contiene
"tamaño_tramo" iteraciones. Cada thread ejecuta su tramo y
espera por mas trabajo asignado.
 guided: para esta categoria las iteraciones son asignadas a los
threads en tramos con tamaño decreciente. Cuando un thread
finaliza el tramo de iteraciones asignado, a este se le asigna otro
tramo dinámicamente hasta que se termine la repartición.
 runtime: cuando se usa runtime, las categorias de schedule son
obtenidas en tiempo de ejecución con la configuración dada en la
variable de entorno OMP_SCHEDULE.

Finalmente la clausula nowait evita que haya una sincronización entre


threads al final de la directiva de distribución de trabajo.

Constructor parallel Constructor for


Define una región paralela, que es código que será Hace que el trabajo realizado en un for bucle dentro
ejecutado por multiples subprocesos en paralelo. de una región paralela se divida entre subprocesos.

Constructor sections Constructor single


Le permite especificar que una sección de código
Identifica las secciones de código que se
debe ejecutarse en un solo subproceso, no
dividirán entre todos los subprocesos.
necesariamente en el subproceso maestro.

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Sincronización

Barrier Critical
Sincroniza todos los subprocesos en un Especifica que el código solo se ejecuta
equipo; todos los subprocesos se detienen en la en un subproceso a la vez.
barrera, hasta que todos los subprocesos ejecutan la
barrera.

Atomic Flush

Especifica que una ubicación de memoria se Especifica que todos los subprocesos
actualizará de forma atómica. tienen la misma vista de la memoria
para todos los objetos compartidos.

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Biblioteca de funciones

 int omp_get_threads_num(void) Devuelve el identificador del thread.


 int omp_get_num_threads(void) Devuelve cuantos threads se están
utilizando
 int omp_get_num_procs(void) Devuelve el numero de procesadores
accesibles
 void omp_set_num_threads(int) Indica el numero de threads a utilizar
 int omp_get_max_threads(void) Devuelve el maximo posible de threads

Variables de entorno

Las variables de entorno relacionadas en OpenMP, controlan la ejecución del


código en paralelo. Los nombres de las variables de entorno se deben escribir en
mayúscula.

 OMP_NUM_THREADS Indica el numero de threads a usar. Este valor


también se puede cambiar a través de una función de librería.

export OMP_NUM_THREADS=4

setenv OMP_NUM_THREADS 4

set OMP_NUM_THREADS=4

 OMP_SCHEDULE Indica el tipo de scheduling para for y parallel for


 OMP_DYNAMIC Autoriza o desautoriza el ajuste dinámico del numero de
threads.
 OMP_NESTED Autoriza o desautoriza el anidamiento. Por defecto no esta
autorizado.

COMPILACION
Los comandos de compilación son:

 ompcc OpenMP compilador por defecto de C.


 ompf77 OpenMP Compilador por defecto de Fortran 77
 icpc OpenMP para un compilador Intel

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
 g++-4.2 OpenMP compilador por defecto de g++.
 sunCC OpenMP compilador de Sun

 Ejemplos de aplicación.
o Constructor for

Hace que el trabajo realizado en un for bucle dentro de una región paralela se
divida entre subprocesos.

Parámetros

Cláusulas
(Opcional) Cero o más cláusulas.

for_statement
Un for bucle. Se producirá un comportamiento indefinido si el código de usuario en
el for bucle cambia la variable de índice.

Observaciones

La for directiva admite las siguientes cláusulas:

 private
 firstprivate
 lastprivate
 reduction
 ordered
 schedule
 nowait
Si parallel también se especifica, clauses puede ser cualquier cláusula aceptada
por las directivas parallel o , excepto .for nowait

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Ejemplo:
// omp_for.cpp

// compile with: /openmp

#include <stdio.h>

#include <math.h>

#include <omp.h>

#define NUM_THREADS 4

#define NUM_START 1

#define NUM_END 10

int main() {

int i, nRet = 0, nSum = 0, nStart = NUM_START, nEnd = NUM_END;

int nThreads = 0, nTmp = nStart + nEnd;

unsigned uTmp = (unsigned((abs(nStart - nEnd) + 1)) *

unsigned(abs(nTmp))) / 2;

int nSumCalc = uTmp;

if (nTmp < 0)

nSumCalc = -nSumCalc;

omp_set_num_threads(NUM_THREADS);

#pragma omp parallel default(none) private(i) shared(nSum, nThreads, nStart, nEnd)

#pragma omp master

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
nThreads = omp_get_num_threads();

#pragma omp for

for (i=nStart; i<=nEnd; ++i) {

#pragma omp atomic

nSum += i;

if (nThreads == NUM_THREADS) {

printf_s("%d OpenMP threads were used.\n", NUM_THREADS);

nRet = 0;

else {

printf_s("Expected %d OpenMP threads, but %d were used.\n",

NUM_THREADS, nThreads);

nRet = 1;

if (nSum != nSumCalc) {

printf_s("The sum of %d through %d should be %d, "

"but %d was reported!\n",

NUM_START, NUM_END, nSumCalc, nSum);

nRet = 1;

else

printf_s("The sum of %d through %d is %d\n",

NUM_START, NUM_END, nSum);

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Output
4 OpenMP threads were used.

The sum of 1 through 10 is 55

o Constructor sections

Identifica las secciones de código que se dividirán entre todos los subprocesos.

PARÁMETROS

CLÁUSULAS
(Opcional) Cero o más cláusulas.

OBSERVACIONES

La sectionsdirectiva puede contener cero o más sectiondirectivas.

La sectionsdirectiva admite las siguientes cláusulas:

 privado
 primeroprivado
 ultimoprivado
 reducción
 no, espera

Si parallel también se especifica, clauses puede ser cualquier cláusula aceptada


por las directivas parallel o , excepto .sections nowait

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Ejemplo:

// omp_sections.cpp

// compile with: /openmp

#include <stdio.h>

#include <omp.h>

int main() {

#pragma omp parallel sections num_threads(4)

printf_s("Hello from thread %d\n", omp_get_thread_num());

#pragma omp section

printf_s("Hello from thread %d\n", omp_get_thread_num());

Output

Hello from thread 0

Hello from thread 0

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina
Bibliografia

Curso DCC, Universidad de Chile. (s/f). Uchile.cl. Recuperado el 26 de abril de

2022, de https://users.dcc.uchile.cl/~mmarin/parallel/openMP/index.html

Explicación detallada del uso de OpenMP - programador clic. (s/f).

Programmerclick.com. Recuperado el 26 de abril de 2022, de

https://programmerclick.com/article/58941552399/

¿Qué es OpenMP? (2010, mayo 21). CénitS - COMPUTAEX.

http://www.cenits.es/faq/preguntas-generales/que-es-openmp

TylerMSFT. (s/f). OpenMP directives. Translate.Goog. Recuperado el 26 de abril

de 2022, de

https://docs-microsoft-com.translate.goog/en-us/cpp/parallel/openmp/

reference/openmp-directives?view=msvc-

170&_x_tr_sl=en&_x_tr_tl=es&_x_tr_hl=es-419&_x_tr_pto=sc

Cómputo Paralelo. Unidad 2 Ing. Marco Alberto Romo


Medina

También podría gustarte