我有一个算法,我想用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;
}
编辑:错字
答案 0 :(得分:2)
默认情况下,OpenMP共享在所有工作者之间的外部作用域中声明的所有变量。您需要将临时变量移动到内部块(或将它们声明为私有)。