Tengo este código usando OpenMP y C++. El código se ejecuta correctamente pero a veces se cuelga. Estoy usando secciones. ¿Puedes decirme cuál es el problema? Intenté varias cosas pero ninguna funcionó, como cambiar las variables de privadas a compartidas.
#include <omp.h> #include <stdio.h> #include <stdlib.h> #define N 50 //gcc -fopenmp -o e3 e3.c int main (int argc, char *argv[]) { int i, nthreads, tid, section; float a[N], b[N], c[N]; void print_results(float array[N], int tid, int section); /* Some initializations */ for (i=0; i<N; i++) a[i] = b[i] = i * 1.0; #pragma omp parallel private(c,i,tid,section) { tid = omp_get_thread_num(); //FIXME: how to get the thread id? if (tid == 0) { nthreads = omp_get_num_threads(); //FIXME: how to get the number of threads? printf("Number of threads = %d\n", nthreads); } /*** Use barriers for clean output ***/ #pragma omp barrier printf("Thread %d starting...\n",tid); #pragma omp barrier #pragma omp sections nowait { #pragma omp section { section = 1; for (i=0; i<N; i++) c[i] = a[i] * b[i]; print_results(c, tid, section); } #pragma omp section { section = 2; for (i=0; i<N; i++) c[i] = a[i] + b[i]; print_results(c, tid, section); } } /* end of sections */ /*** Use barrier for clean output ***/ #pragma omp barrier printf("Thread %d exiting...\n",tid); } /* end of parallel section */ printf("I am out of parallel scope\n"); return 0; } void print_results(float array[N], int tid, int section) { int i,j; j = 1; /*** use critical for clean output ***/ #pragma omp critical { printf("\nThread %d did section %d. The results are:\n", tid, section); for (i=0; i<N; i++) { printf("%e ",array[i]); j++; if (j == 6) { printf("\n"); j = 1; } } printf("\n"); } /*** end of critical ***/ #pragma omp barrier printf("Thread %d done and synchronized.\n", tid); }¡Gracias!
Las barreras se utilizan para sincronizar todos los subprocesos. Todos los subprocesos se bloquearán hasta que todos los subprocesos hayan alcanzado la barrera. Como consecuencia de esto, para que su programa finalice, todos los subprocesos deben alcanzar la misma cantidad de barreras durante su vida. Si un subproceso tiene más barreras que los demás, ese subproceso nunca podrá pasar su barrera adicional porque esperará a los otros subprocesos, que nunca llegarán allí porque no tienen esa barrera adicional.
Tiene una barrera en la función print_results , que solo es ejecutada por los subprocesos a los que se les asigna una de las dos secciones. Todos los hilos adicionales tienen una barrera menos. Ese número desigual de barreras bloquea su programa.
Asegúrese de colocar barreras solo en lugares donde sepa que todos los subprocesos lo ejecutarán.
Todavía no estoy seguro de lo que está sucediendo, aunque encontré una "solución alternativa".
Solo usa dos secciones, pero permite más de dos hilos. Si restringe el número de subprocesos a dos cambiando
#pragma omp parallel private(c,i,tid,section)para
#pragma omp parallel private(c,i,tid,section) num_threads(2),el programa terminará. (No pude reproducir el error).
Si establece el número de subprocesos en tres, el programa siempre se bloqueará. (Al menos nunca terminó. Lo intenté unas 20 veces).