在部分代码中使用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" 被打印了两次。
我正在编写 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" 被打印了两次。