使用MPI_Init()

Li-Pin Juan

我遇到了有关MPI_Init()的使用的问题

我只想在根处理器上使用以下上下文中的代码初始化随机数“ randv ”。为了查看我的目标是否实现,我让程序通过在“调用RANDOM_NUMBER(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环境。初始化后,每个进程都由其等级唯一标识您必须确保基于这些等级,每个过程都可以处理数据的不同部分,或执行不同的任务。

通常,您应该先运行MPI_Init程序。

使用,MPI_Comm_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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MPI_Init()的使用

来自分类Dev

MPI_Init()与MPI_Init_thread()

来自分类Dev

MPI_Init()之前的初始化变量,MPI_Finanlize()之后的cout

来自分类Dev

MPI_Init必须仅由一个线程调用

来自分类Dev

在MPI中使用循环

来自分类Dev

使用MPI分配流程

来自分类Dev

使用MPI分配流程

来自分类Dev

Mvapich MPI_Init_thread(支持多线程)失败

来自分类Dev

减少mpi使用的JVM数量

来自分类Dev

使用MPI_COMM_SELF

来自分类Dev

使用支持CUDA的MPI的要求

来自分类Dev

使用MPI_PACK()的优势

来自分类Dev

使用machinefile的MPI集群的ipython

来自分类Dev

在 MPI 中使用默认整数

来自分类Dev

使用MPI_TYPE_VECTOR代替MPI_GATHER

来自分类Dev

使用太多文件句柄打开MPI和Boost MPI

来自分类Dev

使用MPI_Bcast时出现MPI分段错误

来自分类Dev

使用过多的文件句柄打开MPI和Boost MPI

来自分类Dev

使用mpi4py嵌套mpi调用

来自分类Dev

MPI使用MPI_Send和MPI_Reduce发送消息

来自分类Dev

使用MPI_MAXLOC的MPI_Reduce函数时MPI程序出错

来自分类Dev

使用MPI_Send和MPI_Recv实现MPI_Reduce会导致错误的结果

来自分类Dev

在map()中使用init()

来自分类Dev

使用foldr实现init

来自分类Dev

使用MPI_Probe进行线程安全

来自分类Dev

使用MPI的不同大小的散布矩阵块

来自分类Dev

在C ++中使用MPI解析大文件

来自分类Dev

强制MPI使用指定的编号。核心

来自分类Dev

使用valgrind发现MPI代码中的错误