Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parallel processing 在fortran代码中不当使用OpenMP会增加墙时间_Parallel Processing_Fortran_Openmp_Gfortran - Fatal编程技术网

Parallel processing 在fortran代码中不当使用OpenMP会增加墙时间

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设置为私有变量,因为它们在每个线程中的计算方式不同。这种方法是错误的吗?它是延长

我试图并行化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,不是吗?为了简单起见?当我们不得不猜测实际的代码是什么时,您使我们的工作变得更加困难,如果对您来说更简单的话。我不会在水晶球里寻找解决方案。