[mvapich-discuss] MVAPICH Assertion Error
OShea, Thomas T.
THOMAS.T.O'SHEA at saic.com
Thu Jul 5 16:58:50 EDT 2007
Any luck debugging this problem?
Thanks,
Tom
------------------------------------------------------------------------
--------------------------------
Hi, I posted about a problem with mvapich2 and communicating inside a
node using smp. My computer died and along with it my email, so I'm
using this email account to post a test code that I put together to
illustrate the error I'm getting.
This code builds 2 arrays on each processor, and then tries to have
the master process (rank = 0) grab the arrays from each other ranks
using remote memory communication with passive synchrization.
On our system this code will run until it gets to a process that is on
the same node and then it gives the SMP assertion error.
It was a hard bug to track down because so many things will make it go
away, such as switching the order of the 2 arrays that are passed. If
you pass the larger array first (buff_x), there is no error.
Hope this helps, and thanks for you time in looking into this.
Thomas O'Shea
SAIC
-------------- next part --------------
program smp_test
c use mpi
include 'mpif.h'
parameter(iu_bnd=20,ju_bnd=20,ku_bnd=20,maxblocks=2)
parameter(len_x=iu_bnd*ju_bnd*ku_bnd,len_x2=iu_bnd)
integer mype,nprocs,jproc,i,j,k,mb,ierr,winx,winx2
integer(kind=MPI_ADDRESS_KIND) winsize,targ_disp
common/var/x(iu_bnd,ju_bnd,ku_bnd,maxblocks),
1 x2(iu_bnd,maxblocks)
real*8 ,target :: x
real*8 ,target :: x2
call MPI_INIT(ierr)
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
call MPI_COMM_RANK(MPI_COMM_WORLD, mype, ierr)
do mb = 1,maxblocks
do k = 1,ku_bnd
do j = 1,ju_bnd
do i = 1,iu_bnd
x(i,j,k,mb) =10*mb+ mype+0.01*i+0.0001*j+.000001*k
enddo
enddo
x2(k,mb) = 10*mb+mype+0.01*k
enddo
enddo
call test(mype)
call MPI_BARRIER(MPI_COMM_WORLD,ierr)
print *,'Final Barrier',mype
CALL MPI_FINALIZE()
end
c ---------------------------------------------------------------------
subroutine test(mype)
c use mpi
include 'mpif.h'
parameter(iu_bnd=20,ju_bnd=20,ku_bnd=20,maxblocks=2)
parameter(len_x=iu_bnd*ju_bnd*ku_bnd,len_x2=iu_bnd)
integer mype,nprocs,jproc,i,j,k,mb,ierr,winx,winx2
integer(kind=MPI_ADDRESS_KIND) winsize,targ_disp
common/var/x(iu_bnd,ju_bnd,ku_bnd,maxblocks),
1 x2(iu_bnd,maxblocks)
real*8 ,target :: x
real*8 ,target :: x2
real*8 x0(iu_bnd,ju_bnd,ku_bnd)
real*8 x20(iu_bnd)
real*8 buff_x,buff_x2
pointer(p_x,buff_x(iu_bnd,ju_bnd,ku_bnd,maxblocks))
pointer(p_x2,buff_x2(iu_bnd,maxblocks))
call MPI_COMM_SIZE(MPI_COMM_WORLD, nprocs, ierr)
winsize = 8*len_x*maxblocks
CALL MPI_ALLOC_MEM(winsize, MPI_INFO_NULL, p_x, ierr)
winsize = 8*len_x2*maxblocks
CALL MPI_ALLOC_MEM(winsize, MPI_INFO_NULL, p_x2, ierr)
winsize = 8*len_x*maxblocks
CALL MPI_WIN_CREATE(buff_x,winsize,8,MPI_INFO_NULL,
& MPI_COMM_WORLD,winx,ierr)
winsize = 8*len_x2*maxblocks
CALL MPI_WIN_CREATE(buff_x2,winsize,8,MPI_INFO_NULL,
& MPI_COMM_WORLD,winx2,ierr)
buff_x = x
buff_x2 = x2
if(mype.eq.0) then ! collect arrays from other ranks
do jproc=0,(nprocs-1)
do mb = 1,2
targ_disp = len_x2*(mb-1)
CALL MPI_WIN_LOCK(MPI_LOCK_SHARED,jproc,0,winx2,ierr)
CALL MPI_GET(x20,len_x2,MPI_DOUBLE_PRECISION,jproc,targ_disp,
& len_x2,MPI_DOUBLE_PRECISION,winx2,ierr)
CALL MPI_WIN_UNLOCK(jproc,winx2,ierr)
print *,'2nd RMA: jproc, mb',jproc,mb
targ_disp = len_x*(mb-1)
CALL MPI_WIN_LOCK(MPI_LOCK_SHARED,jproc,0,winx,ierr)
CALL MPI_GET(x0,len_x,MPI_DOUBLE_PRECISION,jproc,targ_disp,
& len_x,MPI_DOUBLE_PRECISION,winx,ierr)
CALL MPI_WIN_UNLOCK(jproc,winx,ierr)
enddo ! mb
enddo ! jproc
endif ! mype=0
! Freeing Windows and Memory
CALL MPI_WIN_FREE(winx,ierr)
CALL MPI_WIN_FREE(winx2,ierr)
CALL MPI_FREE_MEM(buff_x,ierr)
CALL MPI_FREE_MEM(buff_x2,ierr)
end subroutine test
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.cse.ohio-state.edu/pipermail/mvapich-discuss/attachments/20070705/82734987/attachment-0001.html
More information about the mvapich-discuss
mailing list