gpt4 book ai didi

c++ - 与 openMP 并行化 : shared and critical clauses

转载 作者:行者123 更新时间:2023-11-30 03:01:23 24 4
gpt4 key购买 nike

下面是通过 openMP 并行化的部分代码。数组 ap[]sc[] 被强加于加法赋值,所以我决定让它们共享,然后将它们放在 critical 中子句部分,因为 reduction 子句不接受数组。但它给出的结果与其串行对应物不同。问题出在哪里?

Vector PN, Pf, Nf; // Vector is user-defined structure
Vector NNp, PPp;
Vector gradFu, gradFv, gradFw;
float dynVis_eff, SGSf;
float Xf_U, Xf_H;
float mf_P, mf_N;
float an_diff, an_conv_P, an_conv_N, an_trans;
float sc_cd, sc_pres, sc_trans, sc_SGS, sc_conv_P, sc_conv_N;
float ap_trans;

#pragma omp parallel for
for (int e=0; e<nElm; ++e)
{
ap[e] = 0.f;
sc[e] = 0.f;
}

#pragma omp parallel for shared(ap,sc)
for (int f=0; f<nFaces; ++f)
{
PN = cntE[face_N[f]] - cntE[face_P[f]];
Pf = cntF[f] - cntE[face_P[f]];
Nf = cntF[f] - cntE[face_N[f]];
PPp = Pf - (Pf|norm(PN))*norm(PN);
NNp = Nf - (Nf|norm(PN))*norm(PN);

mf_P = mf[f];
mf_N = -mf[f];

SGSf = (1.f-ifac[f]) * SGSvis[face_P[f]]
+ ifac[f] * SGSvis[face_N[f]];

dynVis_eff = dynVis + SGSf;

an_diff = dynVis_eff * Ad[f] / mag(PN);

an_conv_P = -neg(mf_P);
an_conv_N = -neg(mf_N);

an_P[f] = an_diff + an_conv_P;
an_N[f] = an_diff + an_conv_N;

// cross-diffusion
sc_cd = an_diff * ( (gradVel[face_N[f]]|NNp) - (gradVel[face_P[f]]|PPp) );

#pragma omp critical
{
ap[face_P[f]] += an_N[f];
ap[face_N[f]] += an_P[f];

sc[face_P[f]] += sc_cd + sc_conv_P;
sc[face_N[f]] += -sc_cd + sc_conv_N;
}

最佳答案

您还没有声明并行子句中的所有其他变量是否应该共享。您通常可以使用 default 子句来执行此操作。如果未指定默认值,则所有变量都是共享的,这会导致您的代码出现问题。

在你的情况下,我猜你应该去

#pragma omp parallel for default(none), shared(ap,sc,face_N,face_P,cntF,cntE,mf,ifac,Ad,an_P,an_N,SGSvis,dynVis), private(PN,Pf,Nf,PPp,NNp,mf_P,mf_N,SGSf,dynVis_eff,an_diff,an_conv_P,an_conv_N,sc_cd)

我强烈建议始终使用default(none),这样每次您没有显式声明变量时编译器都会提示并强制您显式考虑它。

关于c++ - 与 openMP 并行化 : shared and critical clauses,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109273/

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