C ++ openmp并行计算计算错误的结果

时间:2018-06-16 07:36:30

标签: c++ gcc openmp

我有一个算法,我想用openmp并行执行。我可以验证单线程执行的结果(OMP_NUM_THREADS=1),但是一旦我将线程数设置为2或更高,结果就会略有不同。我也尝试并行化内部for - 循环,但这也不会产生正确的结果。

我对openmp和多线程一般都很新。我怀疑我的实现在线程之间以某种方式不正确地共享变量,但我无法弄明白。

extern "C" double *lomb_scargle(double *x, double *y, double *f, int NX, int NF) {
    double *result = (double*) malloc(2 * NF * sizeof(double));
    double w, tau, SS, SC, SST1, SST2, SCT1, SCT2, Ai, Bi;
    int i, j;

    #pragma omp parallel for
    for (i=0; i<NF; i++) {
        w = 2 * M_PI * f[i];
        SS = 0.;
        SC = 0.;
        for (j=0; j<NX; j++) {
            SS += sin(2*w*x[j]);
            SC += cos(2*w*x[j]);
        }
        tau = atan2(SS, SC) / (2 * w);
        SCT1 = 0.;
        SCT2 = 0.;
        SST1 = 0.;
        SST2 = 0.;
        for (j=0; j<NX; j++) {
           SCT1 += y[j] * cos(w * (x[j] - tau)); 
           SCT2 +=    pow(cos(w * (x[j] - tau)),2); 
           SST1 += y[j] * sin(w * (x[j] - tau)); 
           SST2 +=    pow(sin(w * (x[j] - tau)),2); 
        }
        Ai = SCT1 / SCT2;
        Bi = SST1 / SST2;
        // result contains the amplitude first, and then the phase 
        result[i] = sqrt(Ai*Ai + Bi*Bi);
        result[i+NF] = - (atan2(Bi, Ai) + w * tau);
    }
    return result;
}

编辑:错字

1 个答案:

答案 0 :(得分:2)

默认情况下,OpenMP共享在所有工作者之间的外部作用域中声明的所有变量。您需要将临时变量移动到内部块(或将它们声明为私有)。