在fortran代码中不正确地使用OpenMP会增加挂起时间

时间:2016-01-24 11:35:53

标签: 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设为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数组填充一些操作。

0 个答案:

没有答案