Параллельная программа openmp намного медленнее, чем последовательная - PullRequest
0 голосов
/ 12 января 2020
# include <math.h>
# include <stdlib.h>
# include <stdio.h>
# include <omp.h>
# define KE 1000
# define NSTEPS 100000

main()
{
    float ex[KE],hy[KE];
    float bn[NSTEPS];
    int n,k,kc,ke;
    float ddx,dt,T;
    float t0,spread,pulse;
    omp_set_num_threads(4);

    kc = KE/2;
    t0 = 40.0;
    spread = 12;
    T = 0;
    FILE * temp = fopen("Exserial.txt", "w");
    for (k=0; k <= KE; k++ ) {
        ex[k] = 0.0;
        hy[k] = 0.0;
    }
    for (n=1; n<=NSTEPS ; n++) {
        T = T + 1;
        pulse = exp(-.5*(pow( (t0-T)/spread,2.0) ));
        ex[kc] = pulse;
#pragma omp for 
        for (k=1; k <=KE; k++) { 
#pragma omp atomic update
            ex[k] = ex[k] + .5*( hy[k-1] - hy[k] ) ;
        }
#pragma omp for
        for (k=0; k <=KE-1; k++) {
#pragma omp atomic update
            hy[k] = hy[k] + .5*( ex[k] - ex[k+1] ) ;
        }
    }
    for (k=1; k <=KE; k++) { 
        fprintf(temp, "%f\n",ex[k]);
        printf("%f\n",ex[k]);
    }
}
SERIAL RUN
real    0m1.210s
user    0m1.212s
sys 0m0.000s
PARALLEL RUN
real    0m3.194s
user    0m3.188s
sys 0m0.004s

Эта параллельная программа занимает больше времени, чем последовательный прогон.

Как улучшить производительность параллельной работы?

...