【发布时间】:2023-02-01 04:29:46
【问题描述】:
我是非常MPI 编程的新手(两天前),这是我第一次发布有关堆栈溢出的问题。我现在正在处理MPI_ALLREDUCE和MPI_REDUCE。我知道两者之间的区别在于前者将减少变量的最终值传递给所有进程,而在后一种情况下仅传递给目标进程。在许多情况下甚至很难,您不需要将变量的更新值传递给子进程我不明白不这样做(或这样做)有什么好处。我最初虽然使用 MPI_REDUCE 可能会更好,这样就不会浪费计算时间来广播变量的值,但是我在我的代码中没有发现这两种情况有任何区别。我使用 2 到 6 之间的多个进程运行代码。
代码取值n,每个进程的任务是将变量mypartialsumn/num_procs加1次,其中num_procs为进程数。归约后mypartialsum的值聚集在sum中,最终结果为sum=n。
program test
use mpi
IMPLICIT NONE
!include 'mpif.h'
integer:: ierr, num_procs, my_id, status(MPI_STATUS_SIZE), sender(MPI_STATUS_SIZE), root, rank
integer:: i, n
!real:: sum=0., partialsum=0., mypartialsum=0.
integer:: sum=0, partialsum=0, mypartialsum=0
real:: starttime, endtime
root=0
call MPI_INIT ( ierr )
call MPI_COMM_RANK (MPI_COMM_WORLD, my_id, ierr)
call MPI_COMM_SIZE (MPI_COMM_WORLD, num_procs, ierr)
starttime = MPI_WTIME()
if (my_id .eq. root) then
print*, "Running in process 0."
print*, "total numeber of process is", num_procs
n=1d9!1000000000
endif
call MPI_BCAST(n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr)
!print*, "running process", my_id
mypartialsum=0.
do i = my_id+1, n, num_procs
mypartialsum=mypartialsum+int(1)
enddo
partialsum=mypartialsum
print*, "Running process", my_id, "Partial sum is ", partialsum
call MPI_REDUCE(partialsum, sum, 1, MPI_INTEGER, MPI_SUM, ROOT, MPI_COMM_WORLD, ierr)
!call MPI_ALLREDUCE(partialsum, sum, 1, MPI_INTEGER, MPI_SUM, MPI_COMM_WORLD, ierr)
endtime = MPI_WTIME()
if (my_id .eq. 0) then
print*, "sum is", sum, "time spent processing", endtime-starttime
! else if (my_id .gt. 0) then
! print*, "sum on process", my_id, "is", sum , "time spent processing is", endtime-starttime
endif
call MPI_FINALIZE ( ierr )
end program
【问题讨论】:
标签: mpi