Anterior Siguiente

Cuando se tienen bucles anidados, es posible hacerlos ver como un solo bucle y utilizar una sola estrategia de distribución para toda la construcción. Esto se logra con la cláusula collapse. De esta manera evitamos tener que anidar una región paralela dentro de otra.

Sintaxis básica

#pragma omp parallel for collapse(<num_levels>)
for(...){
    for(...){
        for(...){
            <loop body>
        }
    }
}// implicit barrier here

Ejemplo

Vamos a colapsar dos bucles y distribuir las iteraciones entre los hilos de dos en dos:

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

int main(){
    int m = omp_get_thread_num();
    printf("master thread=%d in serial region\n", m);
    
    #pragma omp parallel for collapse(2) schedule(static,2)
    for(int i=0; i<4 ; i++){
        for(int j=0; j<4 ; j++){
            int f = omp_get_thread_num();
            printf("i,j=%d,%d processed by thread=%d\n", i, j, f);
        }
    } // implicit barrier here
    
    printf("master 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 collapse-000 collapse-000.c

¿Cómo ejecutar?

./collapse-000 

Salida

master thread=0 in serial region
i,j=1,0 processed by thread=2
i,j=1,1 processed by thread=2
i,j=3,0 processed by thread=2
i,j=0,2 processed by thread=1
i,j=1,2 processed by thread=3
i,j=1,3 processed by thread=3
i,j=3,2 processed by thread=3
i,j=3,3 processed by thread=3
i,j=0,3 processed by thread=1
i,j=2,2 processed by thread=1
i,j=2,3 processed by thread=1
i,j=3,1 processed by thread=2
i,j=0,0 processed by thread=0
i,j=0,1 processed by thread=0
i,j=2,0 processed by thread=0
i,j=2,1 processed by thread=0
master thread=0 in serial region

Se crean bloques de 2 iteraciones dentro del loop más interior y se van rotando los hilos que reciben cada bloque.

Preguntas

  • Experimenta con diferentes versiones del tamaño del chunk y diferentes estrategias de scheduling.
  • Intenta paralelizar los bucles sin utilizar collapse.
Anterior Siguiente
Estás en el Nivel 2: Bucles paralelos y tareas concurrentes con OpenMP. ¿Deseas volver al inicio?