使用MPI_Init()

时间:2014-05-16 01:57:57

标签: parallel-processing fortran mpi

我遇到了有关使用 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

1 个答案:

答案 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