我正在编写Fortran 95代码(gfortran
作为编译器)。在其中一个子例程中,我通过调用MPI_Init
来初始化消息传递接口。我通过在同一子例程中调用MPI_Finalize
来关闭接口。在主程序和任何其他子程序中都不使用MPI命令。
代码运行良好;但是,当我运行代码时,主程序中的每个WRITE(*,*) "text"
语句都会被执行两次(我在笔记本电脑上测试了两个物理内核的代码)。所以似乎两个核心都在处理主程序的所有命令。
这是人们应该期待的吗?初始化和最终化MPI的正确方法是什么?
我希望一个核心能够处理所有顺序任务,并且只在子例程中使用多核处理。
答案 0 :(得分:2)
嗯,这更像是一个扩展的评论而不是一个答案...
使用MPI,程序将针对每个进程执行一次(在您的情况下为两次),并且您必须确保哪个进程执行哪个代码或对哪个数据块进行操作。这通常通过调用MPI_Comm_rank()
来确定流程的等级来完成。根据使用MPI_Comm_size()
获得的排名和进程数,您可以分配工作负载。
由于您不这样做,每个进程执行完全相同的工作,因此将相同的文本打印到终端上。
这是一个例子来说明这一点:
program test
use mpi
implicit none
integer :: myrank, size, stat
! Init MPI
call MPI_Init(stat)
! Get process ID
call MPI_Comm_rank ( MPI_COMM_WORLD, myrank, stat )
! Get number of processes
call MPI_Comm_size ( MPI_COMM_WORLD, size, stat )
! This is only written by the first process
if ( myrank == 0 ) write(*,*) 'Starting output...'
! This is written by every process
write(*,*) "Hello world"
write(*,*) "I am ",myrank,"of",size
call MPI_Finalize(stat)
end program
输出:
$ mpirun -np 2 ./a.out
Starting output...
Hello world
Hello world
I am 1 of 2
I am 0 of 2
你可以看到,没有检查过程的等级," Hello World"打印两次。