1

我正在向 Fortran 程序添加一个选项,以使用 MPI 使用多个处理器运行它。如果用户要并行运行它,用户需要指定不同的输入文件——为问题的每个域(处理器)指定一个文件。默认情况下,该程序将查找特定的文件名(名为“serial.inp”的文件)。所以我需要程序知道它何时并行运行,以便它可以改为查找其他文件名(例如“parallel_1.inp”、“parallel_2.inp”、“parallel_3.inp”等)。我的第一个想法是让用户在执行程序时将参数传递给程序,例如:

mpiexec -n 4 myprogram.exe -parallel

这样,当该参数存在时,它将查找并行文件。但这似乎有点多余。如果使用 mpiexec 调用程序,则毫无疑问用户正在尝试并行运行它。有什么方法可以让我的程序知道它是使用 mpiexec 启动的?还是命令行参数是我最好的选择?

4

3 回答 3

2

Alex Leach 是正确的,因为您可以使用特定于 MPI 实现的环境变量查找来做到这一点,但没有可移植的方式来做到这一点。

但据我了解,我认为你真的不需要;您只需检查它是否以一个等级运行即可获得大部分您想要的东西:

program filenames
    use mpi
    implicit none

    integer :: comsize, rank, ierr
    character(len=128) :: inputfilename

    call MPI_Init(ierr)

    call MPI_Comm_size(MPI_COMM_WORLD,comsize,ierr)
    call MPI_Comm_rank(MPI_COMM_WORLD,rank,ierr)

    if (comsize == 1) then
        inputfilename = 'serial.inp'
    else
        write(inputfilename, '(A,I0,A)'), 'parallel_',rank,'.imp'
    endif

    write(*,'(I,1X,A)'), rank, trim(inputfilename)

    call MPI_Finalize(ierr)
end program filenames

运行给

$ mpirun -np 4 ./filenames
           0 parallel_0.imp
           1 parallel_1.imp
           2 parallel_2.imp
           3 parallel_3.imp
$ ./filenames
           0 serial.inp

这并不完美。如果您运行 using mpirun -np 1 filenames,它将给出串行结果,但取决于您的用例,这可能不是一件可怕的事情,以换取可移植的东西。

于 2013-05-03T12:37:56.963 回答
2

运行的进程mpiexec将设置各种环境变量,向子进程指示它们是主进程还是从属进程等。

查看您mpiexec的文档以了解具体细节。微软也有一些在线文档

于 2013-05-02T19:06:48.727 回答
2

为什么不以编程方式进行呢?这就是我在我的程序中的做法:

#ifdef MPI
  CALL MPI_Init(ierr)                    ! Initialize MPI
  CALL MPI_Comm_rank(mpicomm,nproc,ierr) ! Who am I?
  CALL MPI_Comm_size(mpicomm,size,ierr)  ! How many processes?
#else
  nproc = 0
  size  = 1
#endif

在程序中的这一点之后,您可以通过查询 的值来查询程序是串行的还是并行的size

于 2013-05-02T19:20:09.173 回答