gpt4 book ai didi

c++ - OpenMP 并行版本运行速度比串行慢

转载 作者:太空宇宙 更新时间:2023-11-04 13:52:05 28 4
gpt4 key购买 nike

<分区>

我有这段代码是我使用 OpenMP 并行化的,它似乎比串行版本运行得慢。这是代码的相关片段:

Out_props ion_out;

#pragma omp parallel for firstprivate(Egx,Egy,vi_inlet,dt,xmin,xmax,ymin,ymax,qmi,dy,Nx) private(ion_out)
for (int i=0;i<Np;i++)
{
ion_out = ApplyReflectionBC(dt,Nx,xmin,xmax,ymin,ymax,qmi,dy,vi_inlet,Egx,Egy,xi_i[2*i],xi_i[1+2*i],vi_i[2*i],vi_i[1+2*i]);

xi_o[1-1+2*i]=ion_out.xout;
xi_o[2-1+2*i]=ion_out.yout;
vi_o[1-1+2*i]=ion_out.vxout;
vi_o[2-1+2*i]=ion_out.vyout;
}

这里的 outprops 只是一个包含 4 个 double 类型成员的结构。 ApplyReflectionBC 函数(如下所示)只是对每个 i 应用一些操作。所有这些操作都是完全独立的。 EgxEgy 是在进入此循环之前定义的 60x60 矩阵,vi_inlet 是 2x1 vector 。我试过使 ion_out 成为大小为 Np 的矩阵以进一步提高独立性,但这似乎没有什么区别。 firstprivate 中的所有其他内容都是在进入此循环之前定义的 double 类型。

我真的很感激任何关于为什么它的运行速度比串行版本慢很多倍的见解。谢谢!

Out_props ApplyReflectionBC(double dt,int Nx,double xmin,double xmax,double ymin, double ymax,double qmp, double dy, double *vp_inlet,double *Egx,double *Egy, double xpx,double xpy,double vpx,double vpy)
{
Out_props part_out;
double Lgy=ymax-ymin;
double xp_inp[2]={xpx,xpy};
double vp_inp[2]={vpx,vpy};
double xp_out[2];
double vp_out[2];

struct vector
{
double x;
double y;
}vnmf,Ep,xnmf;


if((xp_inp[1-1]>xmin) && (xp_inp[1-1]<xmax) && (xp_inp[2-1]<ymin)) //ONLY below lower wall
{
xp_out[1-1]=xp_inp[1-1];
xp_out[2-1]=ymin;

vp_out[1-1]=vp_inp[1-1];
vp_out[2-1]=-vp_inp[2-1];
}
else if((xp_inp[1-1]<xmin) || (xp_inp[1-1]>xmax) || (xp_inp[2-1]>ymax))
{//Simple Boris Push
xnmf.x=xmin;
xnmf.y=ymin+Lgy*rand()/RAND_MAX;

vnmf.x=vp_inlet[0];
vnmf.y=vp_inlet[1];

//Find E field at x,y
double yjp=ymin+dy*floor((xnmf.y-ymin)/(1.0*dy));
double yjp1p=yjp+dy;

int kp=(yjp-ymin)/dy;

int kpp1=kp+1;
double ylg=xnmf.y-yjp;

double wjk=1.0*(dy-ylg)/(1.0*dy);
double wjkp1=1.0*ylg/(1.0*dy);

Ep.x=wjk*Egx[Nx*kp]+wjkp1*Egx[Nx*kpp1];

Ep.y=wjk*Egy[Nx*kp]+wjkp1*Egy[Nx*kpp1];

do
{
double f=1.0*rand()/RAND_MAX;
xp_out[1-1]=xnmf.x+f*dt*(vnmf.x+qmp*Ep.x*f*dt/2.0);
xp_out[2-1]=xnmf.y+f*dt*(vnmf.y+qmp*Ep.y*f*dt/2.0);

vp_out[1-1]=vnmf.x+qmp*Ep.x*(f-0.5)*dt;
vp_out[2-1]=vnmf.y+qmp*Ep.y*(f-0.5)*dt;

} while((xp_out[1-1]<xmin) || (xp_out[1-1]>xmax) || (xp_out[2-1]<ymin) || (xp_out[2-1]>ymax));
}
else
{
xp_out[1-1]=xp_inp[1-1];
xp_out[2-1]=xp_inp[2-1];

vp_out[1-1]=vp_inp[1-1];
vp_out[2-1]=vp_inp[2-1];
}

part_out.xout=xp_out[0];
part_out.yout=xp_out[1];
part_out.vxout=vp_out[0];
part_out.vyout=vp_out[1];

return part_out;
}

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