Parallel processing 在fortran代码中不当使用OpenMP会增加墙时间
我试图并行化FORTRAN代码,但显然我没有正确使用OpenMP语句。我开始实施OpenMP并行化,只是为了让一个子例程观察到墙时间的预期减少,但它反而增加了程序的总墙时间!这是我试图并行运行的子程序。它有公共变量,在调用渐变之前,会分配ncell、nnode、node(3,mxc)、neigh(3,mxc)、xy(2,mxn)、area(mxc)、mxc和mxn。 我将变量ne、Tneigh、Tface、n1、n2设置为私有变量,因为它们在每个线程中的计算方式不同。这种方法是错误的吗?它是延长墙时间的原因吗 任何帮助都将不胜感激。提前谢谢Parallel processing 在fortran代码中不当使用OpenMP会增加墙时间,parallel-processing,fortran,openmp,gfortran,Parallel Processing,Fortran,Openmp,Gfortran,我试图并行化FORTRAN代码,但显然我没有正确使用OpenMP语句。我开始实施OpenMP并行化,只是为了让一个子例程观察到墙时间的预期减少,但它反而增加了程序的总墙时间!这是我试图并行运行的子程序。它有公共变量,在调用渐变之前,会分配ncell、nnode、node(3,mxc)、neigh(3,mxc)、xy(2,mxn)、area(mxc)、mxc和mxn。 我将变量ne、Tneigh、Tface、n1、n2设置为私有变量,因为它们在每个线程中的计算方式不同。这种方法是错误的吗?它是延长
subroutine GRADIENT
parameter (mxc=5001,mxn=3001)
common /grid/ ncell,nnode,node(3,mxc),neigh(3,mxc),
> xy(2,mxn),area(mxc)
common /var/ time,dt,Tcell(mxc),Tbc(10),outflux(mxc)
common /grad/ dTdx(mxc),dTdy(mxc)
!$OMP PARALLEL
!$OMP DO PRIVATE(ne,Tneigh,Tface,n1,n2)
DO n = 1,ncell
dTdx(n) = 0.
dTdy(n) = 0.
do nf = 1,3
ne = neigh(nf,n)
if(ne .gt. 0) then !..real neighbor
Tneigh = Tcell(ne)
else !..other walls
Tneigh = Tbc(-ne)
endif
Tface = 0.5*(Tcell(n)+Tneigh)
n1 = node(nf,n)
if(nf .lt. 3) then
n2=node(nf+1,n)
else
n2=node(1,n)
endif
dTdx(n) = dTdx(n) + Tface*(xy(2,n2)-xy(2,n1))
dTdy(n) = dTdy(n) - Tface*(xy(1,n2)-xy(1,n1))
enddo
dTdx(n) = dTdx(n)/area(n)
dTdy(n) = dTdy(n)/area(n)
ENDDO
!$OMP END DO !NOWAIT
!$OMP END PARALLEL
return
end
编辑:时间由omp_get_wtime函数测量,以下是测量值:
顺序=0.5秒
平行=8.4秒(平均而言,有时更高,我不知道为什么)
节点、neigh和xy 2D数组通过读取dat文件用浮点数填充,区域1D函数用xy、节点和neigh数组的一些操作填充 展示你的时间测量和你测量时间的方式。还有一些有关硬件(CPU)的详细信息。并显示
neigh
、node
和其他(如果它们是函数)的代码,或它们的声明(如果它们是数组)。严格来说这不是必需的,但我会将n
和nf
添加到private
子句中。很可能,您计算的是函数的CPU时间,而不是函数的实际墙时间。请改用omp\u get\u wtime()
。谢谢您的回复。我编辑了这个问题,但为了简单起见,我没有直接输入代码。我不知道具体的硬件细节,因为我在大学提供的HPC服务器上运行代码。此外,我没有将n和nf添加到private子句中,因为它们是默认的private,不是吗?为了简单起见?当我们不得不猜测实际的代码是什么时,您使我们的工作变得更加困难,如果对您来说更简单的话。我不会在水晶球里寻找解决方案。