我正在尝试并行化FORTRAN代码,但显然我没有正确使用OpenMP语句。我开始只为一个子程序实现OpenMP并行化,以观察预计的墙时间减少,但它增加了程序的总壁时间!这是我试图并行运行的子程序。它具有公共变量,并且在调用梯度之前分配ncell,nnode,node(3,mxc),neigh(3,mxc),xy(2,mxn),area(mxc),mxc和mxn。 我将变量ne,Tneigh,Tface,n1,n2设为PRIVATE,因为它们在每个线程中的计算方式不同。这种方法是错误的,是否需要更长的时间?
任何帮助将不胜感激。提前谢谢。
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,node和neigh数组填充一些操作。