es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Duplicados de hilos apareciendo cuando deberían ser únicos (OpenMP)

Tengo que escribir un código que calcule una suma parcial: S (i) = Σ a (j) (j que va de 0 a i). Cada vez, tengo que mostrar el valor de S (i) (llamado somme en el código) en el bucle y lo tengo que codificar con OpenMP. Este es mi código:

Sin embargo, cuando ejecuto el código con 16 hilos, algunos hilos se duplican y el resultado de esos hilos es incorrecto:

He preguntado a mi profesor y no tiene idea de lo que está sucediendo. No entiendo por qué mi código se comporta de esta manera, ¿alguien puede ayudarme?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que el problema en su código está en la inicialización de la variable somme dentro del bucle paralelo. Cada hilo debe tener su propia variable somme, inicializada en 0. De lo contrario, los hilos sobrescribirán los valores de los demás y generarán resultados incorrectos.

    Aquí hay una versión corregida de su código:

    #include <stdio.h>
    #include <omp.h>
    #define n 16
    
    int main(void) {
        int a[n] = {2,3,6,9,4,7,0,2,2,6,8,9,11,0,2,4};
        int i, j, t, somme;
    
        #pragma omp parallel num_threads(16)
        #pragma omp for private(somme) // declare somme as private
        for (i=0; i<n; i++){="" t="omp_get_thread_num();" somme="a[0];" for="" (j="1;"></n;><i+1; j++) somme += a[j];
            printf("<%d>: s(%d) = %d\n", t, i, somme);
        }
        return 0;
    }
    

    note la adición de “private(somme)” en la directiva pragma, que asegura que cada hilo tenga su propia copia de la variable somme. esto debería evitar que los hilos sobrescriban los valores de los demás y produzcan resultados correctos.

    ¡espero que eso ayude! j++)=”” somme=”” +=”a[j];”></i+1; j++) somme += a[j];
    printf(“<%d>: s(%d) = %d\n”, t, i, somme);
    }
    return 0;
    }

    note la adición de “private(somme)” en la directiva pragma, que asegura que cada hilo tenga su propia copia de la variable somme. esto debería evitar que los hilos sobrescriban los valores de los demás y produzcan resultados correctos.

    ¡espero que eso ayude!></omp.h></stdio.h>

Comments are closed.