Parallel processing MPI_Init()的使用

Parallel processing MPI_Init()的使用,parallel-processing,fortran,mpi,Parallel Processing,Fortran,Mpi,我遇到了一个关于使用MPI\u Init()的问题 我只想使用下面上下文中的代码在根处理器上初始化随机数“randv”。为了查看我的目标是否实现,我让程序通过在“调用随机数(randv)行后立即放置do循环来打印数组“randv” 但是,结果屏幕上显示的是随机数数组重复8次(假定处理器数量为8)。我的问题是,为什么在调用MPI_Init()之前初始化除根处理器之外的处理器。如果在调用MPI_Init之前所有处理器都被唤醒并且具有相同的随机数数组,为什么还要费心调用MPI_Init()进行初始化呢

我遇到了一个关于使用MPI\u Init()的问题

我只想使用下面上下文中的代码在根处理器上初始化随机数“randv”。为了查看我的目标是否实现,我让程序通过在“调用随机数(randv)行后立即放置do循环来打印数组“randv

但是,结果屏幕上显示的是随机数数组重复8次(假定处理器数量为8)。我的问题是,为什么在调用MPI_Init()之前初始化除根处理器之外的处理器。如果在调用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

我想你误解了MPI的工作原理。您编写的程序由每个进程执行
MPI_Init
初始化MPI环境s.t。这些进程可以交互。初始化后,每个进程都由其秩唯一标识。您必须确保,基于这些级别,每个流程处理数据的不同部分,或执行不同的任务

通常,您应该先运行
MPI\u Init
,然后再运行其他程序

使用
MPI\u Comm\u rank
可以获得当前进程的ID(其级别)。第一个进程始终具有秩
0
。因此,如果只想在“主”进程上运行部分代码,可以测试
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

我想你误解了MPI的工作原理。您编写的程序由每个进程执行
MPI_Init
初始化MPI环境s.t。这些进程可以交互。初始化后,每个进程都由其秩唯一标识。您必须确保,基于这些级别,每个流程处理数据的不同部分,或执行不同的任务

通常,您应该先运行
MPI\u Init
,然后再运行其他程序

使用
MPI\u Comm\u rank
可以获得当前进程的ID(其级别)。第一个进程始终具有秩
0
。因此,如果只想在“主”进程上运行部分代码,可以测试
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

在集合操作的上下文之外,MPI中没有“根进程”这样的东西。@HristoIliev你说得对。但您可以将第一个进程解释为根进程或主进程。从我到目前为止看到的情况来看,进程0通常被选择用于“管理”任务,例如I/O(当使用串行I/O时)。但我会在答案中更改为精确@HristoIliev根据该线程,某些MPI实现对秩0的处理与其他实现不同。@VladimirF,这是特定于实现的行为,不在MPI标准中定义。标准中“root”的唯一用途是为集体操作指定数据发送方/接收方。@HristoIliev是对的-MPI进程是对等进程,在MPI运行时一起创建。谈论根进程或主进程可能会导致太多的混淆,特别是因为许多MPI用户熟悉OpenMP,OpenMP实际上有一个主线程。在集体操作的上下文之外,MPI中没有“根进程”这样的东西。@hristoilev你说得对。但您可以将第一个进程解释为根进程或主进程。从我到目前为止看到的情况来看,进程0通常被选择用于“管理”任务,例如I/O(当使用串行I/O时)。但我会在答案中更改为精确@HristoIliev根据该线程,某些MPI实现对秩0的处理与其他实现不同。@VladimirF,这是特定于实现的行为,不在MPI标准中定义。标准中“root”的唯一用途是为集体操作指定数据发送方/接收方。@HristoIliev是对的-MPI进程是对等进程,在MPI运行时一起创建。谈论根进程或主进程可能会导致太多的混淆,特别是因为许多MPI用户都熟悉OpenMP,而OpenMP实际上有一个主线程。