1. Indice de pagina
  2. 1. Objetivos
  3. 2. Explicación
  4. 2.1. Código Ejemplo
  5. 2.2. Salida
  6. 2.3. Ejercicios propuestos
  7. 2.4. Funciones necesarias
  8. 3. Solución
  9. 3.1. Apartado A
  10. 3.2. Apartado B
  11. 3.3. Apartado C
  12. 3.4. Apartado D

For paralelo

Objetivos

Explicación

Con la directiva #pragma omp for podemos indicar que las iteraciones de un bucle for han de ser repartidas entre las distintas hebras.

Código Ejemplo Descarga

A continuación tenemos un código de ejemplo.

#include <omp.h>
#include <iostream>
 
#define N 10
#define nthreads 4
 
int main (){
  int thread;
  omp_set_num_threads(nthreads);
  #pragma omp parallel private(thread)
  {
      thread = omp_get_thread_num();
 
      #pragma omp for
      for (int i = 0 ; i < N; i++){
      std::cout<<"Soy el proceso "<<thread<<" ejecuto al iteracion "<<i<<std::endl;
      }
 
  }
}

Salida

> g++ -fopenmp 01.cpp -o holaMundo
> ./holaMundo
Soy el proceso 0 ejecuto al iteracion 0
Soy el proceso 0 ejecuto al iteracion 1
Soy el proceso 0 ejecuto al iteracion 2
Soy el proceso 1 ejecuto al iteracion 3
Soy el proceso 1 ejecuto al iteracion 4
Soy el proceso 1 ejecuto al iteracion 5
Soy el proceso 2 ejecuto al iteracion 6
Soy el proceso 2 ejecuto al iteracion 7
Soy el proceso 2 ejecuto al iteracion 8
Soy el proceso 3 ejecuto al iteracion 9

La ejecución de este programa a dado como resultado el reparto de las iteraciones hechas por OpenMP el cual a dividido las 10 iteraciones en bloques de 3 y las a repartido entre las hebras disponibles.

Ejercicios propuestos

OpenMP nos permite controlar el reparto de las iteraciones mediante la clausula schedule, y los parámetros que recibe.

Funciones necesarias

Solución

Apartado A

Directiva

El planificador static recibe por parámetro el numero de iteraciones que reparte a cada hebra, reparte asta que se queda sin iteraciones.

Salida

Soy el proceso 0 ejecuto al iteracion 0
Soy el proceso 0 ejecuto al iteracion 1
Soy el proceso 0 ejecuto al iteracion 2
Soy el proceso 0 ejecuto al iteracion 3
Soy el proceso 1 ejecuto al iteracion 4
Soy el proceso 1 ejecuto al iteracion 5
Soy el proceso 1 ejecuto al iteracion 6
Soy el proceso 1 ejecuto al iteracion 7
Soy el proceso 2 ejecuto al iteracion 8
Soy el proceso 2 ejecuto al iteracion 9

Apartado B

Directiva

El planificador dinamic recibe por parámetro el numero de iteraciones por bloque. Cuando una hebra se queda sin trabajo pide un nuevo bloque, así hasta que no hay mas iteraciones.

Salida

Soy el proceso 1 ejecuto al iteracion 0
Soy el proceso 1 ejecuto al iteracion 1
Soy el proceso 1 ejecuto al iteracion 2
Soy el proceso 1 ejecuto al iteracion 3
Soy el proceso 0 ejecuto al iteracion 4
Soy el proceso 0 ejecuto al iteracion 5
Soy el proceso 0 ejecuto al iteracion 6
Soy el proceso 0 ejecuto al iteracion 7
Soy el proceso 1 ejecuto al iteracion 8
Soy el proceso 1 ejecuto al iteracion 9

Apartado C

Directiva

#pragma omp for schedule( guidec, 1 )

El planificador guidec recibe por parámetro el numero mínimo de iteraciones por bloque. Actúa por demanda como el planificador dinamic pero el decide el tamaño de bloque inicial, y lo va reduciendo hasta el tamaño mínimo pasado por parametro.

Apartado D

Directiva

La planificación se deja en manos del sistema.

Creado por: Daniel Guerrero Martínez y Sergio Rodríguez Lumley 2010

Valid HTML 4.01 Transitional