在部分代码中使用开放式MPI

时间:2015-03-01 22:01:41

标签: parallel-processing fortran mpi gfortran

我正在编写Fortran 95代码(gfortran作为编译器)。在其中一个子例程中,我通过调用MPI_Init来初始化消息传递接口。我通过在同一子例程中调用MPI_Finalize来关闭接口。在主程序和任何其他子程序中都不使用MPI命令。

代码运行良好;但是,当我运行代码时,主程序中的每个WRITE(*,*) "text"语句都会被执行两次(我在笔记本电脑上测试了两个物理内核的代码)。所以似乎两个核心都在处理主程序的所有命令。

这是人们应该期待的吗?初始化和最终化MPI的正确方法是什么?

我希望一个核心能够处理所有顺序任务,并且只在子例程中使用多核处理。

1 个答案:

答案 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"打印两次。