我正在为Fortran程序添加一个选项,以便使用MPI使用多个处理器来运行它。如果用户要并行运行,则用户需要指定不同的输入文件---问题的每个域(处理器)一个文件。默认情况下,程序将查找特定的文件名(名为“serial.inp”的文件)。所以我需要程序知道它何时并行运行,以便它可以改为寻找其他文件名(例如“parallel_1.inp”,“parallel_2.inp”,“parallel_3.inp”等)。我的第一个想法是让用户在执行时向程序传递一个参数,例如:
mpiexec -n 4 myprogram.exe -parallel
这样,当存在该参数时,它将查找并行文件。但这似乎有点多余。如果使用mpiexec调用程序,则毫无疑问用户正在尝试并行运行它。有没有办法让我的程序知道它是用mpiexec开始的?或者命令行参数是我最好的选择?
答案 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
运行,它会给出序列结果,但是根据你的使用情况,这可能不是一个可怕的东西,以换取便携的东西。