是否有更好的方法来执行还原操作或进一步提高此代码的性能。我应该使用崩溃条款吗? MAX只是找到两者之间的最大值,EPS只是一个浮点数,而fdm是一个结构
void cal_beta(float *beta, float **gd0, float **gd1, float **cg, fdm2d fdm)
/*< calculate beta for nonlinear conjugate gradient algorithm >*/
{
int ix,iz;
float a, b, c ;
a=0.0,b=0.0,c=0.0 ;
#ifdef _OPENMP
#pragma omp parallel for private(ix,iz) \
schedule(static,fdm->ompchunk) shared(gd0,gd1,cg) \
reduction(+:a,b,c)
#endif
for(ix=0;ix<fdm->nxpad;ix++){
for(iz=0;iz<fdm->nzpad;iz++){
a+=gd1[ix][iz]*(gd1[ix][iz]-gd0[ix][iz]);
b+=cg[ix][iz]*(gd1[ix][iz]-gd0[ix][iz]);
c+=gd1[ix][iz]*gd1[ix][iz];
}
}
float beta_HS=0.0;
float beta_DY=0.0;
if(fabs(b)>EPS)
{
beta_HS=a/b;
beta_DY=c/b;
}
*beta=MAX(0.0, MIN(beta_HS, beta_DY));/* Hybrid HS-DY method combined with iteration restart */
}
答案 0 :(得分:0)
您可以考虑使用collapse
子句将两个循环合并为一个并行循环区域。根据第58页的OpenMP 4.5 manual,第25-29行:
折叠子句可用于指定循环的数量 与循环26构造相关联。崩溃的参数 子句必须是常量正整数表达式。 27如果是 使用大于1的参数值指定collapse子句, 然后是子句所关联的28个关联循环的迭代 apply被折叠成一个更大的迭代空间,然后是29 根据时间表条款划分