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

C++ openmp parallel computation calculates wrong results

本文关键字:结果 错误 计算 openmp 并行计算 C++      更新时间:2023-10-16

>我有一个算法,我想使用 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;
}

编辑:错别字

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