代码之家  ›  专栏  ›  技术社区  ›  sarema

C++ OpenMP并行计算计算错误结果

  •  0
  • sarema  · 技术社区  · 7 年前

    OMP_NUM_THREADS=1 for

    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 回复  |  直到 7 年前
        1
  •  2
  •   Florian Weimer    7 年前