OpenMP C and C++ Application Program Interface. Version October 1998.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Métodos y parámetros.
Computadores de alta velocidad (la lista top500).
Introducción al OpenMP
AIC – P9-10 Barreras en Multiprocesadores. Objetivo Programar el acceso a variables compartidas en multiprocesadores Uso de cerrojos en el acceso a las.
Programando con OpenMP*
Fundamentos de la Programación Estructurada
Programación I Teoría III
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
PROGRAMACIÓN DE SISTEMAS DE MEMORIA COMPARTIDA (SMP):
Implementación de Listas
ESTRUCTURAS DE SECUENCIA
Estructuras de Repetición
Vectores en java.
Conceptos Básicos de Java
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Métodos Algoritmos y Desarrollo de Programas I. Cuando utilizar métodos  Los métodos se utilizan para romper un problema en pedazos de forma que este.
Java Orientado a Objetos CLASES,OBJETOS Y MÉTODOS
Universidad de Tarapacá Fundamentos Lenguaje y Programación Rodrigo Cornejo Mejías Jonathan Cea Chávez Marcelo Gómez Gonzales.
Tema 6: Clases Antonio J. Sierra.
SCJP Sun Certified Programmer for Java 6
Lab.5: Taller básico de OpenMP
Semana 5 Subprogramas..
Arrays (introducción)
Matrices Es una estructura homogénea, compuesta por varios elementos, todos del mismo tipo y almacenados consecutivamente en memoria A cada elemento se.
Unidad III Administración de procesos

Aplicado a programas openMP
Algo mas de OPENMP y todo sobre PBS!. Algunas rutinas que devuelven variables de entorno  void omp_set_num_threads(int num_threads); // numero de threads.
Ejemplos openMP.
Capítulo 1 “Elementos de Programación”
Conversión cadena a número
Programación de Memoria Compartida
Clase 10: Estructuras de datos y arreglos.
Programación de Memoria Compartida
El lenguaje de programación C - Vectores y matrices -
INFORMATICA III ESCUELA DE INGENIERIA ELECTRONICA DEPARTAMENTO DE SISTEMAS E INFORMATICA.
Informática Ingeniería en Electrónica y Automática Industrial
Programación con OpenMP* Intel Software College. Copyright © 2006, Intel Corporation. All rights reserved. Intel and the Intel logo are trademarks or.
P rogramación de S istemas P aralelos IF - EHU P ROGRAMACIÓN DE S ISTEMAS DE M EMORIA C OMPARTIDA (SMP): OPENMP.
Paradigma “Shared Address Space” Algoritmos paralelos Glen Rodríguez.
NVA-LNG1 3. SENTENCIAS. NVA-LNG2 Asignación Es una sentencia que almacena: el valor del argumento ubicado a la derecha del símbolo que la representa En.
EXPRESIONES Y SENTENCIAS
Sincronización de Procesos
Unidad II Introducción a la programación en C++
Monitores Cabudare, noviembre de 2010 Universidad Fermín Toro
APRENDIZ: SANDRA L. CAICEDO C. ORDEN: 20194
14 de diciembre de 2005 Universidad de Murcia1 Programación en Memoria Compartida: OpenMP Domingo Giménez Departamento de Informática y Sistemas Universidad.
INFORMATICA III ESCUELA DE INGENIERIA ELECTRONICA DEPARTAMENTO DE SISTEMAS E INFORMATICA.
Elementos básicos del lenguaje
Pertinencia de la enseñanza del cómputo paralelo en el currículo de las ingenierías. Proyecto PAPIME PE
Administrador de procesos
PROGRAMACIÓN MULTIMEDIA
IDENTIFICADORES Un identificador es un "nombre" que nos permite dirigirnos específicamente a una de las entidades propias del lenguaje, es decir, son los.
CARACTERÍSTICAS Es un lenguaje de programación estructurado de propósito general. Está estrechamente asociado al sistema operativo UNIX, ya que el propio.
INTRODUCCION A LA PROGRAMACION
PRINCIPIOS DE PROGRAMACIÓN

Por: Mario Felaco Mercedes Martinez Sistemas Operativos III Ene-Mar 2007.
Programación de Memoria Compartida
Fundamentos de Programación
Fundamentos de Programación
Estructuras de Decisión
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
Informática Ingeniería en Electrónica y Automática Industrial
MEMORIA DINÁMICA.
Programación con OpenMP* Dr. Marco Antonio Ramos Corchado Fuente Intel.
Estructuras de control selectivas Fundamentos de Programación Departamento de Lenguajes y Sistemas Informáticos Versión Práctica 3.
Métodos en Java. Estructura de un programa en Java ► La relación con la vida misma la podemos ver en el siguiente comentario: Imaginemos que dos clases.
PROF. RAFAEL MONTENEGRO B. UNELLEZ-APURE Introducci Ó n a los Arreglos (“arrays”) en C++
Transcripción de la presentación:

PROGRAMACIÓN PARALELA Modelos de programación paralela Programación en memoria compartida: OpenMP OpenMP C and C++ Application Program Interface. Version 1.0 - October 1998. También hay del 2002 Curso de Casiano Rodríguez Tutorial de Mattson, Eigenmann www.openmp.org Programación Paralela Programación en memoria compartida: OpenMP 1

Nociones básicas Entorno de programación para espacio de memoria compartido. Modelo de programación fork-join, con generación de múltiples threads. Inicialmente se ejecuta un thread hasta que aparece el primer constructor paralelo, se crean threads esclavos y el que los pone en marcha es el maestro. Al final del constructor se sincronizan los threads y continúa la ejecución el maestro. Programación Paralela Programación en memoria compartida: OpenMP 2

#pragma omp nombre-directiva [cláusulas] Directivas   Formato: #pragma omp nombre-directiva [cláusulas] Programación Paralela Programación en memoria compartida: OpenMP 3

#pragma omp parallel [cláusulas] Constructor parallel #pragma omp parallel [cláusulas] bloque   Se crea un grupo de threads y el que los pone en marcha actúa de maestro. Si aparece la cláusula if se evalúa su expresión y si da valor distinto de cero se crean los threads, si es cero se hace en secuencial. El número de threads que se crean se obtiene por variables de entorno o llamadas a librería. La función omp_set_dynamic y la variable de entorno OMP_DYNAMIC se pueden usar para permitir el ajuste automático del número de threads. Hay barrera implícita al final de la región. Cuando dentro de una región hay otro constructor paralelo, cada esclavo crearía otro grupo de threads esclavos de los que sería el maestro. El número de threads de estos nuevos grupos es uno (el propio maestro) a no ser que se utilice la rutina de librería omp_set_nested o la variable de entorno OMP_NESTED para indicar otra cosa. Hay una serie de cláusulas (private, firstprivate, default, shared, copyin y reduction) para indicar la forma en que se accede a las variables. Programación Paralela Programación en memoria compartida: OpenMP 4

Constructores: compartición de trabajo #pragma omp for [cláusulas] bucle for   Las iteraciones del bucle se ejecutan en paralelo por threads que ya existen. La parte de inicialización del for debe ser una asignación. La parte de incremento debe ser una suma o resta. La parte de evaluación de la condición debe ser la comparación de una variable entera sin signo con un valor, utilizando un comparador mayor o menor (puede incluir igual). Los valores que aparecen en las tres partes del for deben ser enteros. Hay barrera al final a no ser que se utilice la cláusula nowait. Hay una serie de cláusulas (private, firstprivate, lastprivate y reduction) para indicar la forma en que se accede a las variables. Programación Paralela Programación en memoria compartida: OpenMP 5

#pragma omp for [cláusulas] bucle for    Una cláusula schedule indica la forma como se dividen las iteraciones del for entre los threads: schedule(static,tamaño) indica que las iteraciones se dividen según el tamaño indicado y que la asignación se hace estáticamente a los threads. Si no se indica el tamaño se divide por igual entre los threads. schedule(dynamic,tamaño) indica que las iteraciones se dividen según el tamaño indicado y se asignan a los threads dinámicamente cuando van acabando su trabajo. schedule(guided,tamaño) las iteraciones se asignan dinámicamente a los threads pero con tamaños decrecientes. schedule(runtime) deja la decisión para el tiempo de ejecución, y se obtienen de la variable de entorno OMP_SCHEDULE. Programación Paralela Programación en memoria compartida: OpenMP 6

#pragma omp sections [cláusulas] { [#pragma omp section] bloque ... ] }   Cada sección se ejecuta por un thread. Hay barrera al final a no ser que se utilice la cláusula nowait. Hay una serie de cláusulas (private, firstprivate, lastprivate y reduction) para indicar la forma en que se accede a las variables. Programación Paralela Programación en memoria compartida: OpenMP 7

#pragma omp single [cláusulas] bloque   El bloque se ejecuta por un único thread en el equipo, que no tiene por qué ser el maestro. Hay barrera al final a no ser que se utilice la cláusula nowait. Hay una serie de cláusulas (private y firstprivate) para indicar la forma en que se accede a las variables. Programación Paralela Programación en memoria compartida: OpenMP 8

Constructores combinados de compartición de trabajo #pragma omp parallel for [cláusulas] bucle for   Es forma abreviada de directiva parallel que tiene una única directiva for, y admite sus cláusulas menos la nowait. #pragma omp parallel sections [cláusulas] Es forma abreviada de directiva parallel que tiene una única directiva sections, y admite sus cláusulas menos la nowait. Programación Paralela Programación en memoria compartida: OpenMP 9

Constructores master y de sincronización #pragma omp master bloque   El bloque lo ejecuta el thread maestro. No hay sincronización al entrar ni salir. #pragma omp critical [nombre] Asegura exclusión mutua en la ejecución del bloque. El nombre se puede usar para identificar secciones críticas distintas. Programación Paralela Programación en memoria compartida: OpenMP 10

Sincroniza todos los threads en el equipo. #pragma omp barrier   Sincroniza todos los threads en el equipo. #pragma omp atomic expresión La expresión debe ser x binop=exp, x++, ++x, x-- o –x, donde x es una expresión con valor escalar, y binop es un operador binario. Asegura la ejecución de la expresión de forma atómica. Programación Paralela Programación en memoria compartida: OpenMP 11

#pragma omp flush [lista]   Asegura que las variables que aparecen en la lista quedan actualizadas para todos los threads. Si no hay lista se actualizan todos los objetos compartidos. Se hace flush implícito al acabar barrier, al entrar o salir de critical u ordered, al salir de parallel, for, sections o single. #pragma omp ordered bloque El bloque se ejecuta en el orden en que se ejecutaría en secuencial. Programación Paralela Programación en memoria compartida: OpenMP 12

Constructor de entorno #pragma omp threadprivate (lista)   Usado para declarar variables privadas a los threads. Programación Paralela Programación en memoria compartida: OpenMP 13

Cláusulas de alcance de datos private(lista) las variables de la lista son privadas a los threads, no se inicializan antes de entrar y no se guarda su valor al salir.   firstprivate(lista) las variables de la lista son privadas a los threads, se inicializan al entrar con el valor que tuviera la variable correspondiente. lastprivate(lista) las variables de la lista son privadas a los threads, al salir quedan con el valor de la última iteración o sección. Programación Paralela Programación en memoria compartida: OpenMP 14

Cláusulas de alcance de datos shared(lista) las variables de la lista son compartidas por todos los threads.   default(shared|none) indica cómo serán las variables por defecto. reduction(operador:lista) indica que las variables de la lista se obtienen por la aplicación del operador. Hay una serie de posibles operadores. copyin(lista) para asignar el valor de la variable en el master a variables locales a los threads. Programación Paralela Programación en memoria compartida: OpenMP 15

Funciones de librería Hay que poner al principio: #include <omp.h>   void omp_set_num_threads(int num_threads); Pone el número de threads a usar en la siguiente región paralela. int omp_get_num_threads(void); Obtiene el número de threads que se están usando en una región paralela. int omp_get_max_threads(void); Obtiene la máxima cantidad posible de threads. int omp_get_thread_num(void); Devuelve el número del thread. Programación Paralela Programación en memoria compartida: OpenMP 16

Funciones de librería int omp_get_num_procs(void); Devuelve el máximo número de procesadores que se pueden asignar al programa.   int omp_in_parallel(void); Devuelve valor distinto de cero si se ejecuta dentro de una región paralela. Programación Paralela Programación en memoria compartida: OpenMP 17

Funciones de librería int omp_set_dynamic(void); Permite poner o quitar el que el número de threads se pueda ajustar dinámicamente en las regiones paralelas.   int omp_get_dynamic(void); Devuelve un valor distinto de cero si está permitido el ajuste dinámico del número de threads. int omp_set_nested(void); Para permitir o desautorizar el paralelismo anidado. int omp_get_nested(void); Devuelve un valor distinto de cero si está permitido el paralelismo anidado. Programación Paralela Programación en memoria compartida: OpenMP 18

Funciones de librería void omp_init_lock(omp_lock_t *lock); void omp_init_nest_lock(omp_nest_lock_t *lock); Para inicializar una llave que puede ser simple o anidada. Una llave se inicializa como no bloqueada, y una llave anidada se inicializa a cero.   void omp_init_destroy(omp_lock_t *lock); void omp_init_nest_destroy(omp_nest_lock_t *lock); Para destruir una llave. Programación Paralela Programación en memoria compartida: OpenMP 19

Funciones de librería void omp_set_lock(omp_lock_t *lock); void omp_set_nest_lock(omp_nest_lock_t *lock); Para pedir una llave.   void omp_unset_lock(omp_lock_t *lock); void omp_unset_nest_lock(omp_nest_lock_t *lock); Para soltar una llave. int omp_test_lock(omp_lock_t *lock); int omp_unset_test_lock(omp_nest_lock_t *lock); Intenta pedir una llave pero no se bloquea. Programación Paralela Programación en memoria compartida: OpenMP 20

Variables de entorno OMP_SCHEDULE indica el tipo de scheduling para for y parallel for.   OMP_NUM_THREADS Pone el número de threads a usar, aunque se puede cambiar con la función de librería. OMP_DYNAMIC Autoriza o desautoriza el ajuste dinámico del número de threads. OMP_NESTED Autoriza o desautoriza el anidamiento. Por defecto no está autorizado. Programación Paralela Programación en memoria compartida: OpenMP 21

Hello world #include <omp.h> int main() { int iam =0, np = 1; #pragma omp parallel private(iam, np) { #if defined (_OPENMP) np = omp_get_num_threads(); iam = omp_get_thread_num(); #endif printf(“Hello from thread %d out of %d \n”, iam, np); } Programación Paralela Programación en memoria compartida: OpenMP 22

Búsqueda en array #pragma omp parallel private(i, id, p, load, begin, end) { p = omp_get_num_threads(); id = omp_get_thread_num(); load = N/p; begin = id*load; end = begin+load; for (i = begin; ((i<end) && keepon); i++) if (a[i] == x) keepon = 0; position = i; } #pragma omp flush(keepon) Programación Paralela Programación en memoria compartida: OpenMP 23

Cálculo de integral main() { double local, pi=0.0, w; long i; w = 1.0 / N; #pragma omp parallel private(i, local) #pragma omp single pi = 0.0; #pragma omp for reduction (+: pi) for (i = 0; i < N; i++) local = (i + 0.5)*w; pi = pi + 4.0/(1.0 + local*local); } Programación Paralela Programación en memoria compartida: OpenMP 24