用mpiexec开始的程序是否知道它是用mpiexec开始的?

时间:2013-05-02 18:58:38

标签: fortran mpi

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

mpiexec -n 4 myprogram.exe -parallel

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

3 个答案:

答案 0 :(得分:2)

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

查看mpiexec的文档,了解具体细节。微软也有some documentation online

答案 1 :(得分: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的值来查询程序是串行还是并行。

答案 2 :(得分: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

那不完美;如果你使用mpirun -np 1 filenames运行,它会给出序列结果,但是根据你的使用情况,这可能不是一个可怕的东西,以换取便携的东西。

相关问题