使用MPI(Fortran)时出现Seg故障
我对MPI和Fortran都很陌生。几个小时来,我一直在努力想办法解决这个问题,但运气不好。在我下面的代码中,一切都很正常(除了我的使用MPI(Fortran)时出现Seg故障,fortran,mpi,fortran90,Fortran,Mpi,Fortran90,我对MPI和Fortran都很陌生。几个小时来,我一直在努力想办法解决这个问题,但运气不好。在我下面的代码中,一切都很正常(除了我的s变量在进程之间是隔离的这一事实。当我尝试实现MPI\u SEND和MPI\u RECV时,我经常遇到seg故障。我似乎不知道问题是什么 SUBROUTINE do_mpi_simpsons(l, u, n) INTEGER, INTENT (in) :: l, u, n ! REAL, INTENT (in) :: func DOUBL
s
变量在进程之间是隔离的这一事实。当我尝试实现MPI\u SEND
和MPI\u RECV
时,我经常遇到seg故障。我似乎不知道问题是什么
SUBROUTINE do_mpi_simpsons(l, u, n)
INTEGER, INTENT (in) :: l, u, n
! REAL, INTENT (in) :: func
DOUBLE PRECISION :: result, walltime
INTEGER :: clock_start, clock_rate, clock_max, clock_end
DOUBLE PRECISION :: h, s, argVal, finalS
INTEGER :: rank, size, ierror, tag, status(MPI_STATUS_SIZE), count, start, stop
walltime = 0.0D0
h = (u - l) / dble(n)
s = func_hw(dble(l)) + func_hw(dble(u))
CALL system_clock(clock_start, clock_rate, clock_max)
CALL MPI_INIT(ierror)
CALL MPI_COMM_SIZE(MPI_COMM_WORLD, size, ierror)
CALL MPI_COMM_RANK(MPI_COMM_WORLD, rank, ierror)
count = n / size
start = rank * count
stop = start + count -1
! WRITE(*,*) "Start: ", start
! WRITE(*,*) "Stop: ", stop
WRITE(*,*) rank
DO i = start, stop, 2
s = s + 4 * func_hw(dble(l)+dble(i)*h)
END DO
DO i = start+1, stop-1, 2
s = s + 2 * func_hw(dble(l)+dble(i)*h)
END DO
! This block is causing the seg faults
IF(rank.eq.0) THEN
finalS = s
DO i = 1, size - 1
CALL MPI_RECV(s, 64, MPI_DOUBLE, i, 1, MPI_COMM_WORLD, status, ierror)
finalS = finalS + s
END DO
ELSE
CALL MPI_SEND(s, 64, MPI_DOUBLE, 0, 1, MPI_COMM_WORLD, ierror)
END IF
CALL MPI_FINALIZE(ierror)
CALL system_clock(clock_end, clock_rate, clock_max)
walltime = walltime + real(clock_end - clock_start) / real(clock_rate)
result = s * h / 3
WRITE(*,*) "walltime = ", walltime, " seconds"
WRITE(*,*) "result = ", result
END SUBROUTINE
s
似乎是一个标量变量,但您将其作为64个双精度数组传递给MPI例程。这就是我没有正确理解参数的原因。这似乎解决了问题。因此,您可能需要查看MPI\u REDUCE
。它的作用与单个MPI调用中的代码块相同,而且肯定更有效这样做很有效率。