1 Primitivas básicas de OpenMP

Documentos relacionados
Laboratorio de Paralelismo OpenMP: ejemplos y ejercicios

Arquitectura de Computadores: Exámenes y Controles

Computación Matricial y Paralela

2º curso / 2º cuatr. Arquitectura de Computadores. Grado en Ing. Informática. Seminario 1. Herramientas de programación paralela I: Directivas OpenMP

Cómputo en paralelo con OpenMP 1

TEMA 5: PARALELISMO A NIVEL DE HILOS, TAREAS Y PETICIONES (TLP, RLP) (primera parte).

Punteros. Definición Un puntero es un dato que contiene una dirección de memoria.

Laboratorio de Paralelismo Prácticas MPI

Lusitania. Pensando en Paralelo. César Gómez Martín

El lenguaje de Programación C. Fernando J. Pereda

Heterogénea y Jerárquica

Programación Híbrida e Introducción a la Programación de GPUs

Middlewar Middlew es par ar a es par Sistemas de Alto Re R ndimiento José M. Peña

Programación. Test Autoevaluación Tema 3

Primeros pasos con CUDA. Clase 1

Fundamentos de programación

Tema ADQUISICIÓN Y TRATAMIENTO DE DATOS. Departamento de Ciencias de la Computación e IA. Subprogramas en C

Procesos e Hilos en C

Programación en Paralelo con MPI en Clusters Linux

TIPOS DE DATOS BASICOS EN LENGUAJE C

Paso de Borland Turbo C (bajo DOS) a Anjuta (Linux) 1.

Sistemas Operativos Práctica 3

Uso avanzado de punteros

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Caracteres y Cadenas Conversión de Datos Funciones y procedimientos Archivos cabecera. Fundamentos de programación

Paradigma de paso de mensajes

<tipo> Tipo de dato de los elementos del vector

Lenguaje de programación C. Introducción

Tema 13: Apuntadores en C

Multiplicación de Matrices en Sistemas cc-numa Multicore. Autor: Jesús Cámara Moreno Director: Domingo Giménez Cánovas

Solución - práctico 10

EQUIVALENCIAS EN C DE CONSTRUCCIONES SECUENICIALES EN PSEUDOCÓDIGO

Esquema de un programa en C: bloques básicos

Introducción al lenguaje C

Programación en C. Algoritmo y Estructura de Datos. Ing. M. Laura López. Programación en C

Escuela Politécnica Superior de Elche

LENGUAJE. Tema 1 - Introducción

Introducción a la programación orientada a objetos

Apuntadores (Punteros)

Preliminares. Tipos de variables y Expresiones

Prof. Dr. Paul Bustamante

Actividades de Divulgación del Centro Atómico Bariloche. Qué hay detrás de un programa de computadora? Daniela Arnica Pablo E. Argañaras.

UNIVERSIDAD AUTÓNOMA DE BAJA CALIFORNIA FACULTAD DE CIENCIAS PRACTICA DE PROCESOS HERRAMIENTAS

1. Cuestiones. Ejercicios resueltos de C. Diego Rodríguez-Losada 1. //a) #include <stdio.h> main( ) { int x = 0, y = 0; //b) #include <stdio.

Estructuras de control

Elementos de un programa en C

Sistemas Operativos (prácticas) E.U. Informática en Segovia Universidad de Valladolid

Programación Paralela: LU Decomposition usando la biblioteca de funciones PVM

Instituto Politécnico Nacional

SEGUNDO PARCIAL INFORMATICA II

EDITRAN/TR. Windows/Unix. Manual de referencia

TEMA 2. EL LENGUAJE C. ELEMENTOS BÁSICOS

Optimización de Rutinas Multinivel de Álgebra Lineal en Sistemas Multicore

APUNTADORES. Un apuntador es un objeto que apunta a otro objeto. Es decir, una variable cuyo valor es la dirección de memoria de otra variable.

Prueba de Laboratorio Modelo B01 Semáforos y Memoria Compartida

Taller de Sistemas Operativos Introducción

Lenguajes de programación

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

Contenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE

ANEXO XVII DE LA RESOLUCION N

Programación En Lenguaje C

Fundamentos de Programación 2017-I

TEMA 4. ESTRUCTURAS DE CONTROL

INTRODUCCIÓN AL LENGUAJE C

Introducción al lenguaje C. Procesadores Digitales de Señal

Adolfo J. Banchio. FaMAF, IFEG-CONICET, Universidad Nacional de Córdoba Seminario de grupo 1

Práctica de gsoap. int ns enviar (unsigned nodo, std::string cadena, std::string &resultado); int ns recibir(unsigned nodo, std::string &resultado);

Programación Estructurada

Tema 2. El lenguaje JAVA

El Lenguaje de Programación C

#include <stdio.h> /* Factorial de un número - versión 1- */

Clases y Objetos en Java. ELO329: Diseño y Programación Orientados a Objetos

Práctica 0 Introducción a la programación en C

Reglas básicas de la programación en lenguaje C

FUNDAMENTOS DE PROGRAMACIÓN

Ejercicio 1 (2 puntos. Tiempo: 25 minutos)

Introducción a C Primera parte Sofía Vitale

ESTRUCTURAS REPETITIVAS

Introducción a C++ y Code::Blocks

Sistemas Operativos: Programación de Sistemas. Curso Oscar Déniz Suárez Alexis Quesada Arencibia Francisco J.

Modelos de Computación I. Ingeniería Informática

INTRODUCCIÓN AL LENGUAJE C++

Unidad Didáctica 2. Elementos básicos del lenguaje Java Tipos, declaraciones, expresiones y asignaciones

Introducción a Sistemas Operativos: Procesos

Contenido. Capítulo 1. Introducción a lenguaje C 1

Repaso sobre lectura de datos desde la línea de comandos, manejo de memoria dinámica e introducción a la librería GSL

Cálculo de distancia entre aviones que se mueven en el espacio aéreo

Analista Universitario en Sistemas. Taller de Programación II. Instituto Politécnico Superior PUNTEROS

Estructuras de Datos Declaraciones Tipos de Datos

La Máquina de Acceso Aleatorio (Random Access Machine)

!! Identificar las señales que llegan a la consola.

Se guardan en archivos con extencion c y los cabezales con extension h

Introducción al Lenguaje de Programación C

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Introducción a Lenguaje C. Jornadas de Octubre 2009 Grupo de Usuarios de Linux Universidad Carlos III Tania Pérez

GL-PCS2201-L05M FUNCIONES Y LA ESTRUCTURA DEL PROGRAMA EN LENGUAJE C

Memoria Dinámica. Jornadas de Marzo 2010 Grupo de Usuarios de Linux Tania Pérez

Funciones. Parámetros por valor

Problemas de Redes de Computadores. Conjunto de problemas 1

ESCUELA POLITÉCNICA SUPERIOR PRÁCTICA 2: EXPRESIONES, PRINTF Y SCANF

Transcripción:

1 Primitivas básicas de OpenMP Consultar la página oficial de la plataforma OpenMP http://www.openmp.org/drupal/ Pragmas Es una directiva para el compilador que permite la definición de nuevas directivas #pragma omp parallel for [private (<listavariables>)] [firstprivate (<listavariables>)] [lastprivate (<listavariables>]) En su versión más simple, intenta distribuir el número de iteraciones del for entre el número máximo de threads existentes (en principio número de procesadores). Si no se indica la cláusula private, la única variable local a los threads que ejecutan el for será el propio índice de dicho for. A continuación, se muestra una inicialización de un vector con valores aleatorios: #pragma omp parallel for for (i=0; i<numelementos; i++) V[i] = random(); La cláusula firstprivate fuerza que las variables indicadas se inicialicen con los valores que tenían las correspondientes variables globales tan sólo al principio del lazo sólo una vez por thread-. La cláusula lastprivate fuerza que el thread que ejecuta la última iteración del for, copie los valores de las variables locales indicadas en las correspondientes variables globales. #pragma omp critical Define una región crítica. A continuación se ve un ejemplo de uso: #pragma omp parallel for private (x) for (i=0; i<n; i++) { x = (i+0.5) / N; #pragma omp critical area = += 4.0 / (1.0 + x*x); pi = area / N; #pragma omp parallel for [reduction (<op>:<variable>)]

Esta cláusula adicional del pragma parallel, permite especificar una operación de reducción sobre una variable global. En realidad lo que hace es operar internamente con variables locales y luego componer los valores locales en la variable global mediante la operación que se indique. La operación se restringe a: +, *, &,, ^, && y. El trozo de código que utilizamos para explicar el pragma critical, puede ahora reescribirse como: #pragma omp parallel for private (x) reduction (+:area) for (i=0; i<n; i++) { x = (i+0.5) / N; area = += 4.0 / (1.0 + x*x); pi = area / N; #pragma omp parallel [private (<listavariables>)] Con este pragma se indica que el bloque que le sigue sea ejecutado por todos los threads activos. A continuación se muestra un ejemplo: #pragma omp parallel private (numero) { numero = random(); printf ( Hola, mi numero ha sido el %d\n, numero); 1.1 Funciones int omp_set_num_threads (int cuantos) Fija el número de threads que se desea estén activos para el resto de regiones a ejecutar en paralelo. En principio, está fijado al número de CPU s de la máquina y será el utilizado en las regiones paralelas cuando no se fije otro de forma explícita. int omp_get_num_threads (void) Devuelve el número de threads que están activos en ese punto. int omp_get_thread_num (void) Devuelve el identificador del thread. Los identificadores van de 0 a omp_get_num_threads(). omp_set_num_threads( 4 );

#pragma omp parallel { int yo; yo = omp_get_thread_num(); if (yo == 0) maestro(); else esclavo();

Ejercicio: Cálculo de PI con el método de MonteCarlo El método de MonteCarlo consiste en realizar un experimento aleatorio un determinado número de veces. Como sabemos que la frecuencia con que ocurre un suceso se acerca a su probabilidad, a medida que aumenta el número de ensayos nos iremos acercando más y más al valor buscado. Puede utilizarse para estimar probabilidades que serían muy difíciles de calcular de forma teórica, o para corroborar que ocurrirá lo que nosotros esperamos de un determinado experimento. Para calcular el número π, podemos seguir los siguientes pasos: Inscribir un círculo en un cuadrado de lado 2. El radio del círculo será 1. Elegir al azar un punto del cuadrado y observar si este punto pertenece o no al círculo. La probabilidad de que el punto esté dentro del circulo es la razón entre las áreas, π/4. Multiplica por 4 la frecuencia de este suceso y tendrás una aproximación de π. La aproximación será mejor cuanto mayor sea el número de ensayos. Versión Secuencial // piuno.c: Programa que calcula el numero PI mediante el metodo // de Monte Carlo basado en circulo de radio 1 inscrito en // cuadrado de lado 2. // Terminacion controlada por: Numero de iteraciones #include <assert.h> #include <math.h> #include <stdlib.h> #include <stdio.h> #include <sys/time.h> //-------------------------------------------------------------------- int main( int argc, char *argv[] ) { int i, iteraciones, encirculo=0; double x, y, pi; struct timeval t0, t1, t; // Control parametro => Numero de iteraciones if (argc!= 2) { printf ("Uso: piuno numiteraciones \n"); exit(0); iteraciones = atoi(argv[1]); assert (gettimeofday (&t0, NULL) == 0); for (i=1; i<=iteraciones; i++) { x = (double) random() / (double) RAND_MAX; y = (double) random() / (double) RAND_MAX; if ((x*x + y*y) <= 1.0) encirculo++; assert (gettimeofday (&t1, NULL) == 0); timersub(&t1, &t0, &t); pi = (4.0 * encirculo) / (double) i; printf ("Valor de PI = %.6lf\n", pi); printf ("Error = %.6lf\n", fabs(pi-m_pi)); printf ("Tiempo = %ld:%ld(seg:mseg)\n", t.tv_sec, t.tv_usec/1000); return 0; Transforme la versión secuencial del cálculo de PI usando el paradigma de programación de memoria compartida.

Ejercicio: Multiplicación de Matriz usando Programación de Memoria Compartida