在部分代码中使用open MPI

Using open MPI in a part of the code

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

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

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

我想要一个核心来处理所有的顺序任务,只在子程序中使用多核处理。

好吧,与其说这是一个答案,不如说这是一个扩展评论...

使用 MPI,程序为每个进程执行一次(在您的情况下是两次),并且 必须确保哪个进程执行哪个代码或操作哪个数据块.这通常是通过调用 MPI_Comm_rank() 确定进程的 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" 被打印了两次。