- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I am trying to use mpi_sendrecv, but it sets my process ranks to 0.
The c version works fine. Can anyone help?
Here's the code.
program mpi_bug
use mpi
implicit none
integer :: n,i
integer :: mpi_rank,mpi_procs,mpi_status_flag,mpi_error_flag
integer :: src,dest,dsize
integer,allocatable,dimension(:) :: p
call mpi_init(mpi_status_flag)
call mpi_comm_rank(mpi_comm_world, mpi_rank,mpi_status_flag)
call mpi_comm_size(mpi_comm_world, mpi_procs, mpi_status_flag)
n = 2
allocate(p(1:n+1))
p(:) = 0
do i=2,n+1
p(i) = mpi_rank+1
enddo
!! After this p is
!! rank =0 : 0 1 1
!! rank =1 : 0 2 2
dsize = 1
! Send Second Last element to next processor (periodic) which takes and stores it as
! 1st array element.
! Output should be
!! rank =0 : 2 1 1
!! rank =1 : 1 2 2
if (mpi_rank == mpi_procs - 1) then
dest = 0
else
dest = mpi_rank+1
endif
if (mpi_rank == 0) then
src = mpi_procs - 1
else
src = mpi_rank - 1
endif
call MPI_SENDRECV(p(n+1),dsize,MPI_INTEGER,dest,0,&
p(1),dsize,MPI_INTEGER,src,0,MPI_COMM_WORLD,mpi_status_flag,mpi_error_flag)
write(*,*) p
write(*, *) "AFTER :" , mpi_rank
call mpi_finalize(mpi_status_flag)
end program mpi_bug
Link Copied
1 Reply
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Figured it out. mpi_status_flag is not an integer.
integer :: mpi_status_flag (mpi_status_size)
call mpi_init(mpi_error_flag) call mpi_comm_rank(mpi_comm_world, mpi_rank,mpi_error_flag) call mpi_comm_size(mpi_comm_world, mpi_procs, mpi_error_flag)
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page