Anterior Siguiente

Con estas directivas podemos asignar diferentes porciones del código de una región paralela a diferentes hilos. La asignación de hilos a secciones se hace de manera rotatoria (round-robin fashion).

Sintaxis básica

<serial region code>
#pragma omp parallel
{
    #pragma omp sections
    {
        #pragma omp section
        {
        }

        #pragma omp section
        {
        }
    } // implicit barrier here
} 
<serial region code>

Ejemplo:

Vamos a ejecutar 3 secciones diferentes en paralelo:

#include <stdio.h>
#include <omp.h>

int main(){
    int m = omp_get_thread_num();
    printf("thread=%d in serial region\n", m);
    
    #pragma omp parallel 
    {
        #pragma omp sections
        {
            #pragma omp section
            {
                int t = omp_get_thread_num();
                printf("Section 0 executed by thread=%d\n", t);
            }

            #pragma omp section
            {
                int t = omp_get_thread_num();
                printf("Section 1 executed by thread=%d\n", t);
            }

            #pragma omp section
            {
                int t = omp_get_thread_num();
                printf("Section 2 executed by thread=%d\n", t);
            }
        } // implicit barrier here
    } 
    
    m = omp_get_thread_num();
    printf("thread=%d in serial region\n", m);
}

Descarga el código aquí.

¿Cómo compilar?
clang -fopenmp -I/home/user/llvm/llvm-build/projects/openmp/runtime/src/ 
     -o sections-000 sections-000.c
¿Cómo ejecutar?
./sections-000 
Salida 1
thread=0 in serial region
Section 0 executed by thread=0
Section 2 executed by thread=2
Section 1 executed by thread=1
thread=0 in serial region
Salida 2
thread=0 in serial region
Section 2 executed by thread=2
Section 0 executed by thread=0
Section 1 executed by thread=1
thread=0 in serial region
  • Cada sección fue ejecutada por un hilo diferente de manera paralela.
  • La asignación de las secciones a los hilos del equipo se hizo de manera rotatoria, por lo que en ejecuciones diferentes, los hilos siempre se encargarán de la misma sección: hilo 0 con sección 0, hilo 1 con sección 1, etc…

Preguntas

  • ¿En qué situaciones la estrategia de asignación rotatoria puede resultar siendo ineficiente?
  • Modifica el programa de tal manera que haya una sección para cada hilo.
Anterior Siguiente
Estás en el Nivel 1: Introducción a la programación paralela con OpenMP. ¿Deseas volver al inicio?