Saltar al contenido

¿Cómo maneja OpenMP los bucles anidados?

Hola usuario de nuestro sitio, tenemos la respuesta a tu interrogante, has scroll y la verás un poco más abajo.

Solución:

Las líneas que ha escrito paralelizarán solo el bucle exterior. Para paralelizar ambos necesita agregar un collapse cláusula:

#pragma omp parallel for collapse(2)
    for (int i=0;i

Es posible que desee consultar las especificaciones de OpenMP 3.1 (sección 2.5.1) para obtener más detalles.

Podrá comprender mejor esto con el siguiente ejemplo. Hagamos esto con dos hilos.

#pragma omp parallel for num_threads(2)
for(int i=0; i< 3; i++) 
    for (int j=0; j< 3; j++) 
        printf("i = %d, j= %d, threadId = %d n", i, j, omp_get_thread_num());
    

entonces el resultado será,

i = 0, j= 0, threadId = 0 
i = 0, j= 1, threadId = 0 
i = 0, j= 2, threadId = 0 
i = 1, j= 0, threadId = 0 
i = 1, j= 1, threadId = 0 
i = 1, j= 2, threadId = 0 
i = 2, j= 0, threadId = 1 
i = 2, j= 1, threadId = 1 
i = 2, j= 2, threadId = 1

Eso significa que, cuando agrega #pragma omp paralelo for al bucle for superior, el índice de ese bucle for se divide entre los subprocesos. Como puede ver, cuando el índice de i es el mismo, el ID del hilo también es el mismo.

En lugar de eso, podemos poner en paralelo las combinaciones que tenemos en un bucle for anidado. En este ejemplo podemos tener las siguientes combinaciones de i y j.

i = 0, j= 0
i = 0, j= 1
i = 0, j= 2
i = 1, j= 0
i = 1, j= 1
i = 1, j= 2
i = 2, j= 0
i = 2, j= 1
i = 2, j= 2

Para paralelizar la combinación de código, podemos agregar la palabra clave collapse de la siguiente manera.

#pragma omp parallel for num_threads(2) collapse(2)
for(int i=0; i< 3; i++) 
    for (int j=0; j< 3; j++) 
        printf("i = %d, j= %d, threadId = %d n", i, j, omp_get_thread_num());
    

entonces el resultado será el siguiente.

i = 0, j= 0, threadId = 0 
i = 0, j= 1, threadId = 0 
i = 1, j= 2, threadId = 1 
i = 2, j= 0, threadId = 1 
i = 2, j= 1, threadId = 1 
i = 2, j= 2, threadId = 1 
i = 0, j= 2, threadId = 0 
i = 1, j= 0, threadId = 0 
i = 1, j= 1, threadId = 0 

Entonces puede ver que, a diferencia de antes, para el mismo índice i, puede haber diferentes ID de subproceso (cuando (i = 1 y j = 2 threadId = 1) también (i = 1 y j = 0 threadId = 0)). Eso significa que en este escenario, las combinaciones de i y j se dividen entre los subprocesos.

OpenMP solo paraleliza el bucle junto al pragma. También puede paralelizar el bucle interno si lo desea, pero no se hará automáticamente.

Si guardas alguna perplejidad o forma de limar nuestro ensayo eres capaz de añadir un informe y con mucho placer lo analizaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *