我遇到了有关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] 删除。
我来说两句