【发布时间】:2021-06-27 16:09:56
【问题描述】:
我正在尝试并行运行此代码,以优化“挂钟时间”
在不做任何更改的情况下运行它大约 0.00775 秒
原代码段:
for (it=1;it<=itmax;it++)
{
dphimax=0.;
for (k=1;k<kmax;k++)
{
for (i=1;i<imax;i++)
{
dphi=(phi[i+1][k]+phi[i-1][k]-2.*phi[i][k])*dy2i
+(phi[i][k+1]+phi[i][k-1]-2.*phi[i][k])*dx2i;
dphi=dphi*dt;
dphimax=max(dphimax,dphi);
phin[i][k]=phi[i][k]+dphi;
}
}
/* save values */
for (k=1;k<kmax;k++)
{
for (i=1;i<imax;i++)
{
phi[i][k]=phin[i][k];
}
}
if(dphimax<eps) break;
}
t2=clock();
# ifdef _OPENMP
wt2=omp_get_wtime();
# endif
gettimeofday(&tv2, &tz);
printf("\nphi after %d iterations\n",it);
heatpr(phi);
printf( "CPU time (clock) = %12.4g sec\n", (t2-t1)/1000000.0 );
# ifdef _OPENMP
printf( "wall clock time (omp_get_wtime) = %12.4g sec\n", wt2-wt1 );
# endif
printf( "wall clock time (gettimeofday) = %12.4g sec\n", (tv2.tv_sec-tv1.tv_sec) + (tv2.tv_usec-tv1.tv_usec)*1e-6 );
}
当我尝试使用 openmp 进行优化时,它只会变得更糟。
挂钟时间上升到大约 0.01644 秒,我不知道我做错了什么?
这样做了:
#pragma omp parallel private(it, k, i), shared(phi, phin, dy2i, dx2i, dphi) //tried also with shared(dphi, dphimax, phi, phin)
{
for (it=1;it<=itmax;it++)
{
dphimax=0.;
//pragma omp parallel for
for (k=1;k<kmax;k++)
{
for (i=1;i<imax;i++)
{
dphi=(phi[i+1][k]+phi[i-1][k]-2.*phi[i][k])*dy2i
+(phi[i][k+1]+phi[i][k-1]-2.*phi[i][k])*dx2i;
dphi=dphi*dt;
dphimax=max(dphimax,dphi);
phin[i][k]=phi[i][k]+dphi;
}
}
如何优化?
【问题讨论】:
-
即使您在此示例中正确使用 OpenMP,您也可能不会在如此小的测试用例上看到太多的加速。并行化有一些开销,当事情需要几分之一秒时,它可能占总执行时间的很大一部分。
-
@Carol 你不应该需要那个障碍,你增加了输入大小吗?顺便说一句,你能分享一个代码链接看看有什么问题吗?
标签: c multithreading performance parallel-processing openmp