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