进一步加速openmp减少循环

时间:2016-09-05 15:26:38

标签: c openmp

是否有更好的方法来执行还原操作或进一步提高此代码的性能。我应该使用崩溃条款吗? 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 */

}

1 个答案:

答案 0 :(得分:0)

您可以考虑使用collapse子句将两个循环合并为一个并行循环区域。根据第58页的OpenMP 4.5 manual,第25-29行:

  

折叠子句可用于指定循环的数量   与循环26构造相关联。崩溃的参数   子句必须是常量正整数表达式。 27如果是   使用大于1的参数值指定collapse子句,   然后是子句所关联的28个关联循环的迭代   apply被折叠成一个更大的迭代空间,然后是29   根据时间表条款划分