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 MPI只能处理部分代码,而其余部分是单个进程_Parallel Processing_Fortran_Mpi_Gfortran_Intel Fortran - Fatal编程技术网

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()
,因此只有一个任务将完成该工作。如果没有同步,那么您甚至可能不需要MPI
fork&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()
,因此只有一个任务将完成该工作。如果没有同步,那么您甚至可能不需要MPI
fork&exec
如果在一个节点上运行,则选择从节点,否则使用资源管理器生成从节点。