Saltar al contenido

¿Cómo maneja OpenMP los bucles anidados?

Tenemos la mejor información que hemos encontrado en línea. Nuestro deseo es que te sirva de ayuda y si puedes comentarnos alguna mejora hazlo libremente.

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.

Te invitamos a proteger nuestro cometido exponiendo un comentario y dejando una valoración te estamos agradecidos.

¡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 *