我正在解决一个比较串行、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(由用户提供)F和V:初始值 0.00G:6.673e-11桌子的分配 …