Con la directiva #pragma omp for podemos indicar que las iteraciones de un bucle for han de ser repartidas entre las distintas hebras.
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; } } }
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.
OpenMP nos permite controlar el reparto de las iteraciones mediante la clausula schedule, y los parámetros que recibe.
#pragma omp for schedule( static, 4 )
El planificador static recibe por parámetro el numero de iteraciones que reparte a cada hebra, reparte asta que se queda sin iteraciones.
#pragma omp for schedule( dynamic, 4 )
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.
#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.