小编Ser*_*pos的帖子

有没有办法加速 openMP

我正在解决一个比较串行、mpi 和 openMP 代码之间的执行时间的问题。问题是openMP版本比mpi慢。有没有办法让下面的 openMP 代码比 mpi 更快?

for(i=0;i<loop;i++)
  {
    #pragma omp parallel for private(k,dx,dy,dz,d,a) schedule(dynamic)
      for(j=0;j<N;j++)
      {
        for(k=0;k<N;k++)
        {
          if(j!=k)
          {
            dx=C[k*3+0]-C[j*3+0];
            dy=C[k*3+1]-C[j*3+1];
            dz=C[k*3+2]-C[j*3+2];

            d=sqrt(pow(dx,2)+pow(dy,2)+pow(dz,2));

            F[j*3+0]-=G*M[j]*M[k]/pow(d,3)*dx;
            F[j*3+1]-=G*M[j]*M[k]/pow(d,3)*dy;
            F[j*3+2]-=G*M[j]*M[k]/pow(d,3)*dz;
          }
        }
      }
      #pragma omp for schedule(dynamic)
        for(j=0;j<N;j++)
        {
          for(k=0;k<3;k++)
          {
            a=F[j*3+k]/M[j];
            V[j*3+k]=V[j*3+k]+a*Dt[i];
            C[j*3+k]=C[j*3+k]+V[j*3+k]*Dt[i];
          }
        }
  }
Run Code Online (Sandbox Code Playgroud)

这段代码的作用是,外循环是该过程将要发生的次数,并且Dt最终也在表中使用。第二个循环描述移动的质量,第三个循环计算系统中存在的其他质量推动它的力。之后的两个循环计算新的位置。考虑到这一点,我无法移动外循环中的并行性,因为在每个i循环中都需要一个新的更新C表。那么是否有什么需要更改的地方,以便此代码可以运行得更快。

有关该问题的更多信息

  • loop:取值在 10.000 - 1,000,000,000 之间(由用户提供)
  • N:取 2 - 10 之间的值(由用户提供)
  • C:取min和之间的随机值max(由用户提供)
  • FV:初始值 0.00
  • G:6.673e-11

桌子的分配 …

c time for-loop openmp

0
推荐指数
1
解决办法
1736
查看次数

标签 统计

c ×1

for-loop ×1

openmp ×1

time ×1