【发布时间】:2018-04-17 08:11:12
【问题描述】:
嗨,我是 C++ 新手,我编写了一个可以运行的代码,但由于许多嵌套的 for 循环,它很慢,我想通过 openmp 任何可以指导我的人来加速它。我尝试在 ip 循环之前使用“#pragma omp parallel”,在此循环中我在之前使用了“#pragma omp parallel for” >it 循环,但它不起作用
#pragma omp parallel
for(int ip=0; ip !=nparticle; ip++){
inf14>>r>>xp>>yp>>zp;
zp/=sqrt(gamma2);
counter++;
double para[7]={0,0,Vz,x0-xp,y0-yp,z0-zp,0};
if(ip>=0 && ip<=43){
#pragma omp parallel for
for(int it=0;it<NT;it++){
para[6]=PosT[it];
for(int ix=0;ix<NumX;ix++){
para[3]=PosX[ix]-xp;
for(int iy=0;iy<NumY;iy++){
para[4]=PosY[iy]-yp;
for(int iz=0;iz<NumZ;iz++){
para[5]=PosZ[iz]-zp;
int position=it*NumX*NumY*NumZ+ix*NumY*NumZ+iy*NumZ+iz;
rotation(para,&Field[3*position]);
MagX[position] +=chg*Field[3*position];
MagY[position] +=chg*Field[3*position+1];
MagZ[position] +=chg*Field[3*position+2];
}
}
}
}
}
}enter code here
我的旋转函数也有无限积分循环,如下所示
for(int i=1;;i++){
gsl_integration_qag(&F, 10*i, 10*i+10, 1.0e-8, 1.0e-8, 100, 2, w, &temp, &error);
result+=temp;
if(abs(temp/result)<ACCURACY){
break;
}
}
我也在使用 gsl 库。那么如何加快这个过程或如何制作openmp?
【问题讨论】:
-
在开始并行化你的代码之前,首先要确保没有相互依赖。例如。当第一个语句之一是
para[6]=PosT[it];时,我看不出如何并行运行 for 循环。当您为并行计算准备代码时,请确保将__restrict__用于函数参数,例如如果 MagX、MagY、MagZ 和 Field 是参数并且从不重叠。 (或__restrict取决于您使用的编译器)
标签: c++ parallel-processing openmp nested-loops