Parallel processing MPI只能处理部分代码,而其余部分是单个进程
我正在试图弄清楚如何使Parallel processing MPI只能处理部分代码,而其余部分是单个进程,parallel-processing,fortran,mpi,gfortran,intel-fortran,Parallel Processing,Fortran,Mpi,Gfortran,Intel Fortran,我正在试图弄清楚如何使MPI在Fortran中工作,该代码只需要SELECT CASE语句中的“并行”作业。我最初(错误)的想法是这样做: * some single thread work * SELECT CASE (i) CASE (1) CALL MPI_INIT (ierr) CALL MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr) CALL MPI_COMM_SIZE (MPI_COMM_WORLD, num_procs
MPI
在Fortran
中工作,该代码只需要SELECT CASE
语句中的“并行”作业。我最初(错误)的想法是这样做:
* some single thread work *
SELECT CASE (i)
CASE (1)
CALL MPI_INIT (ierr)
CALL MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr)
CALL MPI_COMM_SIZE (MPI_COMM_WORLD, num_procs, ierr)
IF ( * I am the root process * ) THEN
* distribute work to the children *
* do my own load *
ELSE
* i am a child *
* i get some work from the root here *
* i do my work here *
END IF
CALL MPI_BARRIER( MPI_COMM_WORLD, ierr)
CALL MPI_FINALIZE (ierr)
CASE (2)
* same content as case (1) but a little different work
CASE DEFAULT
* nothing here *
END SELECT
* some other work for a single thread *
但这是错误的,因为在
调用MPI\u FINALIZE(ierr)
之后,其他进程并没有像我预期的那样消亡。我唯一的想法就是把STOP
语句放在孩子们做的ELSE
部分的末尾。行吗?有更好的方法吗?您可以研究MPI中的动态流程管理。但最常见的模型是采用标准的MPI假设(所有进程始终运行),要么在MPI_COMM_WORLD的0级上执行串行工作,要么复制工作,以最方便的为准。但我怀疑这是一个xy问题——你到底想做什么?@IanBush我不确定我是否能更好地解释它。我只想避免所有过程都经过select case
部分。我想让根来做决定。但是我开始觉得没有办法解决这个问题,因为MPI
只是启动进程x次的一种奇特方式,而且开销是不可避免的。重要的是,一旦完成这些工作,进程之间就没有交互,它们只是将数据写入磁盘,就是这样。但是我不希望所有的过程都经过所有的过程,它看起来非常冗余(为什么它要做同样的计算1000次?),你不必做同样的计算1000次。计算一个等级并将结果广播给其他等级。我建议您介绍一下MPI程序通常是如何工作的。有很多教程。@VladimirF您能提供一些关于为MPI编写代码的技巧的教程的参考吗?我发现了一些简单的方法,比如http://condor.cc.ku.edu/~grobe/docs/intro MPI.shtml
,但其他例子并不多。我想看到一些高级示例,用于调整mpi的串行代码(或openmp)(理想情况下是fortran),它还必须处理并行化前后的序列执行和条件。if(my_id.eq.0)do_the_work()
,因此只有一个任务将完成该工作。如果没有同步,那么您甚至可能不需要MPIfork&exec
如果在一个节点上运行,则从节点,否则使用资源管理器生成从节点。您可以在MPI中查看动态流程管理。但最常见的模型是采用标准的MPI假设(所有进程始终运行),要么在MPI_COMM_WORLD的0级上执行串行工作,要么复制工作,以最方便的为准。但我怀疑这是一个xy问题——你到底想做什么?@IanBush我不确定我是否能更好地解释它。我只想避免所有过程都经过select case
部分。我想让根来做决定。但是我开始觉得没有办法解决这个问题,因为MPI
只是启动进程x次的一种奇特方式,而且开销是不可避免的。重要的是,一旦完成这些工作,进程之间就没有交互,它们只是将数据写入磁盘,就是这样。但是我不希望所有的过程都经过所有的过程,它看起来非常冗余(为什么它要做同样的计算1000次?),你不必做同样的计算1000次。计算一个等级并将结果广播给其他等级。我建议您介绍一下MPI程序通常是如何工作的。有很多教程。@VladimirF您能提供一些关于为MPI编写代码的技巧的教程的参考吗?我发现了一些简单的方法,比如http://condor.cc.ku.edu/~grobe/docs/intro MPI.shtml
,但其他例子并不多。我想看到一些高级示例,用于调整mpi的串行代码(或openmp)(理想情况下是fortran),它还必须处理并行化前后的序列执行和条件。if(my_id.eq.0)do_the_work()
,因此只有一个任务将完成该工作。如果没有同步,那么您甚至可能不需要MPIfork&exec
如果在一个节点上运行,则选择从节点,否则使用资源管理器生成从节点。