我遇到了有关使用 MPI_Init()的问题。
我想在根处理器上使用下面的上下文中的代码初始化随机数“ randv ”。为了查看我的目标是否已实现,我让程序打印出数组“ randv ”,在“调用RANDOM_NUMBER(randv)”后面立即放置一个do循环。
然而,结果屏幕上显示的是随机数字阵列重复8次(假设处理器数量为8)。我的问题是为什么在调用 MPI_Init()之前初始化除root之外的处理器。如果唤醒所有处理器并且在唤起 MPI_Init 之前具有相同的随机数阵列,为什么还要打电话 MPI_Init()进行初始化?感谢。
利
以下是我使用的示例:
program main
include 'mpif.h'
integer :: i
integer :: ierr
integer :: irank
integer :: nrow, ncol
real, dimension(:,:), allocatable :: randv
nrow = 4
ncol = 2
allocate(randv(nrow,ncol))
call RANDOM_SEED
call RANDOM_NUMBER(randv)
do i = 1, nrow
write(*,'(2(f5.2,x))') randv(i,:)
enddo
call MPI_Init ( ierr )
allocate(row_list(ncol), col_list(nrow))
call MPI_Comm_rank ( MPI_COMM_WORLD, irank, ierr )
if( irank == 0 )then
do i = 1, nrow
write(*,'(2(f5.2,x))') randv(i,:)
enddo
endif
call MPI_Finalize ( ierr )
deallocate( randv )
end program
答案 0 :(得分:6)
我认为你误解了MPI是如何工作的。您编写的程序由每个进程执行。 MPI_Init
初始化MPI环境s.t.这些过程可以互动。初始化后,每个进程都由其 rank 唯一标识。您必须确保基于这些等级,每个过程都可以处理数据的不同部分,或执行不同的任务。
通常,您应该在程序中的任何其他内容之前运行MPI_Init
。
使用MPI_Comm_rank
您可以获取当前进程的ID( rank )。第一个进程的排名始终为0
。因此,如果你想在" master"上运行部分代码。仅限流程,您可以测试irank == 0
:
program main
include 'mpif.h'
integer :: i
integer :: ierr
integer :: irank
integer :: nrow, ncol
real, dimension(:,:), allocatable :: randv
! Initialize MPI
call MPI_Init ( ierr )
! Get process ID
call MPI_Comm_rank ( MPI_COMM_WORLD, irank, ierr )
! Executed on all processes
nrow = 4
ncol = 2
allocate(randv(nrow,ncol))
! Only exectued on the master process
if ( irank == 0 ) then
call RANDOM_SEED
call RANDOM_NUMBER(randv)
do i = 1, nrow
write(*,'(2(f5.2,x))') randv(i,:)
enddo
endif
! Executed on all threads
allocate(row_list(ncol), col_list(nrow))
! Only exectued on the master process
if ( irank == 0 ) then
do i = 1, nrow
write(*,'(2(f5.2,x))') randv(i,:)
enddo
endif
deallocate( randv )
! Finalize MPI, should always be executed last
call MPI_Finalize ( ierr )
end program