首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用C++加速代码OpenMP?

如何使用C++加速代码OpenMP?
EN

Stack Overflow用户
提问于 2020-10-13 06:58:15
回答 1查看 339关注 0票数 2

我试图使用C++并行化以下代码OpenMP:

代码语言:javascript
复制
int np = 1000000;
double kk = 1 / pow(2 * pi, 2);
for (int kes = 1; kes <= 100; kes++) {
  double E1 = 0;
  #pragma omp parallel for reduction(+: E1)
  for (int ies = 0; ies < np; ies++) {
    for (int jes = 0; jes < np; jes++) {
      if (ies != jes) {
        float distanes = sqrt(pow(xp[ies] - xp[jes], 2) + pow(yp[ies] - yp[jes], 2) + pow(zp[ies] - zp[jes], 2));
        float distan = kes * distanes;
        if (distan <= 5) {
          float gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];
          E1 = E1 + kk * gpspec * sin(kes * distanes) / (kes * distanes);
        }
      }
    }
  }
  Ees[kes] = exp(-kes * pow(sp, 2) / 2) * E1;
}

此代码是并行化的。然而,计算时间仍然很糟糕。如何用n^2运算来加快计算速度?xp、yp、zp、gpx、gpy、gpz是一维矢量.

EN

回答 1

Stack Overflow用户

发布于 2020-10-13 11:10:57

根据@paddy (put kes循环内部和jes=ies+1)的建议,我对代码进行了如下修改:

代码语言:javascript
复制
double kk = 1 / pow(2 * pi, 2);
int np = 1000000;
//#pragma omp parallel for reduction(+: E1)
for (ies = 0; ies < np; ies++){
    for (jes = ies+1; jes < np; jes++){


        double dxp = xp[ies] - xp[jes];
        double dyp = yp[ies] - yp[jes];
        double dzp = zp[ies] - zp[jes];
        double distance = sqrt( dxp * dxp + dyp * dyp + dzp * dzp );
        double gpspec = gpx[ies] * gpx[jes] + gpy[ies] * gpy[jes] + gpz[ies] * gpz[jes];

        for (kes = 1; kes <= 100; kes++){
        
            double distance_thresh = 5.0/kes;
            if (distance <= distance_thresh){

                double distan = kes * distance;
                E1[kes] = E1[kes] + gpspec * sin(distan) / distan;
            }
        }
}

#pragma omp parallel for
for (kes = 1; kes <= par_spec; kes++){

    Ees[kes] = exp(-kes * pow(sp, 2) / 2) * E1[kes] * kk * 2.0f;
}

看上去好多了。然而,如何并行化呢?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64330128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档