小编use*_*327的帖子

OpenMP调用线程中的子程序

我面临的问题如下所述:

module k
  integer :: l,m
end module k

program p4
  use k
  integer :: i,j,omp_get_thread_num,cr

  i = 2
  j = 3

  !$omp parallel num_threads(2) shared(l,m) private(i,j,cr)
  cr = omp_get_thread_num()
  if (cr == 0) goto 1111
  call sub1(i)
  write(*,*) l
  goto 2222
1111 call sub2(j)
  write(*,*) m
2222 continue
  !$omp end parallel
end program p4

subroutine sub1(a)
  use k
  integer :: a

  l = a**2
  write(*,*) 'entered sub1'
end subroutine sub1

subroutine sub2(b)
  use k
  integer :: b

  m = …
Run Code Online (Sandbox Code Playgroud)

parallel-processing fortran openmp

2
推荐指数
1
解决办法
4304
查看次数

在子例程中使用MPI

我正在处理可多次调用子例程(依次执行迭代)的代码。我希望并行化子例程中的迭代。mpi的问题是只允许我初始化一次。因此,我无法在子例程中对其进行初始化,该子例程被多次调用。有人可以提出解决方案吗?

我的问题大致如下:

program p

...

do i=1,10000
    call subroutine s(i)
end do

end program p

subroutine s(j)  

...

do i=1,10000
    ...
end do

end subroutine s
Run Code Online (Sandbox Code Playgroud)

我希望将这一过程并行化。

非常感谢。有帮助!但是,让我重新思考一下问题:在主程序的迭代中,连同子例程s,我必须调用另一个子例程s2(不需要并行化)。我以为可以这样做:

  !initialize mpi

  do i=1:1000

  if rank!=0

  call s

  else call s2

  end if

  end do

  !finalize mpi
Run Code Online (Sandbox Code Playgroud)

但是这里的主要问题是,尽管其余进程缓慢进行,但进程0将快速进行。因此,是否有可能让进程0在每次迭代之后等待,直到另一个进程完成其迭代呢?

fortran mpi subroutine

0
推荐指数
1
解决办法
2485
查看次数

标签 统计

fortran ×2

mpi ×1

openmp ×1

parallel-processing ×1

subroutine ×1