I'm trying to parallelize the following code.
subroutine log_likelihood(y, theta, lli, ll) doubleprecision, allocatable, intent(in) :: y(:) doubleprecision, intent(in) :: theta(2) doubleprecision, allocatable, intent(out) :: lli(:) doubleprecision, intent(out) :: ll integer :: i ALLOCATE (lli(size(y))) lli = 0.0d0 ll = 0.0d0 do i = 1, size(y) lli(i) = -log(sqrt(theta(2))) - 0.5*log(2.0d0*pi) & - (1.0d0/(2.0d0*theta(2)))*((y(i)-theta(1))**2) end do ll = sum(lli) end subroutine log_likelihood
To do this, I'm trying to use MPI_ALLGATHER. This is the code I wrote
subroutine log_likelihood(y, theta, lli, ll) doubleprecision, allocatable, intent(in) :: y(:) doubleprecision, intent(in) :: theta(2) doubleprecision, allocatable, intent(out) :: lli(:) doubleprecision, intent(out) :: ll integer :: i, size_y, diff size_y=size(y) ALLOCATE (lli(size_y)) !Broadcasting call MPI_BCAST(theta, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr) call MPI_BCAST(y, 1, MPI_DOUBLE_PRECISION, 0, MPI_COMM_WORLD, ierr) ! Determine how many points to handle with each proc points_per_proc = (size_y + numprocs - 1)/numprocs ! Determine start and end index for this proc's points istart = proc_num * points_per_proc + 1 iend = min((proc_num + 1)*points_per_proc, size_y) diff = iend-istart+1 ALLOCATE(proc_contrib(diff)) do i = istart, iend proc_contrib(i) = -log(sqrt(theta(2))) - 0.5*log(2.0d0*pi) & - (1.0d0/(2.0d0*theta(2)))*((y(i)-theta(1))**2) end do call MPI_ALLGATHER(proc_contrib, diff, MPI_DOUBLE_PRECISION, & lli, diff, MPI_DOUBLE_PRECISION, & MPI_COMM_WORLD, ierr) ll = sum(lli) end subroutine log_likelihood
When I try to run my program, I get the following error.
$ mpiexec -n 2 ./mle.X Fatal error in PMPI_Allgather: Internal MPI error!, error stack: PMPI_Allgather(961)......: MPI_Allgather(sbuf=0x7ff2f251b860, scount=1500000, MPI_DOUBLE_PRECISION, rbuf=0x7ff2f2ad5650, rcount=3000000, MPI_DOUBLE_PRECISION, MPI_COMM_WORLD) failed MPIR_Allgather_impl(807).: MPIR_Allgather(766)......: MPIR_Allgather_intra(560): MPIR_Localcopy(357)......: memcpy arguments alias each other, dst=0x7ff2f2ad5650 src=0x7ff2f251b860 len=12000000 =================================================================================== = BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES = EXIT CODE: 1 = CLEANING UP REMAINING PROCESSES = YOU CAN IGNORE THE BELOW CLEANUP MESSAGES ===================================================================================
Can somebody please explain to me what I'm doing wrong?
Thanks!