gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:32:28 28 4
gpt4 key购买 nike

我有一个算法,我想使用 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 共享所有工作程序之间在外部范围内声明的所有变量。您需要将临时变量移动到内部 block 中(或将它们声明为私有(private))。

关于C++ openmp并行计算计算出错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50885937/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com