Hi Jody,

I tried your suggestion but it still failed. Attached is the modified code.
If your machine has fortran compiler as well, you can try it.

BTW, how many processors did you use for testing your C code?


Thanks,
Kan




On Thu, Feb 25, 2010 at 3:35 AM, jody <jody....@gmail.com> wrote:

> Hi
> Just wanted to let you know:
>
> I translated your program to C ran it, and it crashed at MPI_FILE_SET_VIEW
> in a similar way than yours did.
> then i added an if-clause to prevent the call of MPI_FILE_WRITE with
> the undefined value.
>    if (myid == 0) {
>        MPI_File_write(fh, temp, count, MPI_DOUBLE, &status);
>    }
> After this it ran without crash.
> However, the output is not what you expected:
> The number 2122010.0 was not there - probably overwritten by the
> MPI_FILE_WRITE_ALL.
> But this was fixed by replacing the line
>  disp=0
> by
>  disp=8
> and removing the
>   if (single_no .gt. 0) map = map + 1
> statement.
>
> So here's what all looks like:
>
> ===========================================================================================================
> program test_MPI_write_adv2
>
>
>  !-- Template for any mpi program
>
>  implicit none
>
>  !--Include the mpi header file
>  include 'mpif.h'              ! --> Required statement
>
>  !--Declare all variables and arrays.
>  integer :: fh, ierr, myid, numprocs, itag, etype, filetype, info
>  integer :: status(MPI_STATUS_SIZE)
>  integer :: irc, ip
>  integer(kind=mpi_offset_kind) :: offset, disp
>  integer :: i, j, k
>
>  integer :: num
>
>  character(len=64) :: filename
>
>  real(8), pointer :: q(:), temp(:)
>  integer, pointer :: map(:)
>  integer :: single_no, count
>
>
>  !--Initialize MPI
>  call MPI_INIT( ierr )         ! --> Required statement
>
>  !--Who am I? --- get my rank=myid
>  call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
>
>  !--How many processes in the global group?
>  call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
>
>  if ( myid == 0 ) then
>     single_no = 4
>  elseif ( myid == 1 ) then
>     single_no = 2
>  elseif ( myid == 2 ) then
>     single_no = 2
>  elseif ( myid == 3 ) then
>     single_no = 3
>  else
>     single_no = 0
>  end if
>
>  if (single_no .gt. 0) allocate(map(single_no))
>
>  if ( myid == 0 ) then
>     map = (/ 0, 2, 5, 6 /)
>  elseif ( myid == 1 ) then
>     map = (/ 1, 4 /)
>  elseif ( myid == 2 ) then
>     map = (/ 3, 9 /)
>  elseif ( myid == 3 ) then
>     map = (/ 7, 8, 10 /)
>  end if
>
>  if (single_no .gt. 0) allocate(q(single_no))
>
>  if (single_no .gt. 0) then
>     do i = 1,single_no
>        q(i) = dble(myid+1)*100.0d0 + dble(map(i)+1)
>     end do
>  end if
>
>
>   if ( myid == 0 ) then
>     count = 1
>  else
>     count = 0
>  end if
>
>  if (count .gt. 0) then
>     allocate(temp(count))
>     temp(1) = 2122010.0d0
>  end if
>
>  write(filename,'(a)') 'test_write.bin'
>
>  call MPI_FILE_OPEN(MPI_COMM_WORLD, filename,
> MPI_MODE_RDWR+MPI_MODE_CREATE, MPI_INFO_NULL, fh, ierr)
>
>   if (my_id == 0) then
>     call MPI_FILE_WRITE(FH, temp, COUNT, MPI_REAL8, STATUS, IERR)
>   endif
>
>  call MPI_TYPE_CREATE_INDEXED_BLOCK(single_no, 1, map,
> MPI_DOUBLE_PRECISION, filetype, ierr)
>  call MPI_TYPE_COMMIT(filetype, ierr)
>   disp = 8  ! ---> size of MPI_REAL8 (number written when my_id = 0)
>   call MPI_FILE_SET_VIEW(fh, disp, MPI_DOUBLE_PRECISION, filetype,
> 'native', MPI_INFO_NULL, ierr)
>  call MPI_FILE_WRITE_ALL(fh, q, single_no, MPI_DOUBLE_PRECISION, status,
> ierr)
>  call MPI_FILE_CLOSE(fh, ierr)
>
>
>  if (single_no .gt. 0) deallocate(map)
>
>  if (single_no .gt. 0) deallocate(q)
>
>  if (count .gt. 0) deallocate(temp)
>
>  !--Finilize MPI
>  call MPI_FINALIZE(irc)        ! ---> Required statement
>
>  stop
>
>
> end program test_MPI_write_adv2
>
> ===========================================================================================================
>
> Regards
>   jody
>
> On Thu, Feb 25, 2010 at 2:47 AM, Terry Frankcombe <te...@chem.gu.se>
> wrote:
> > On Wed, 2010-02-24 at 13:40 -0500, w k wrote:
> >> Hi Jordy,
> >>
> >> I don't think this part caused the problem. For fortran, it doesn't
> >> matter if the pointer is NULL as long as the count requested from the
> >> processor is 0. Actually I tested the code and it passed this part
> >> without problem. I believe it aborted at MPI_FILE_SET_VIEW part.
> >>
> >
> > For the record:  A pointer is not NULL unless you've nullified it.
> > IIRC, the Fortran standard says that any non-assigning reference to an
> > unassigned, unnullified pointer is undefined (or maybe illegal... check
> > the standard).
> >
> >
> > _______________________________________________
> > users mailing list
> > us...@open-mpi.org
> > http://www.open-mpi.org/mailman/listinfo.cgi/users
> >
>
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
>
program test_MPI_write_adv2


  !-- Template for any mpi program

  implicit none    

  !--Include the mpi header file
  include 'mpif.h'              ! --> Required statement

  !--Declare all variables and arrays.
  integer :: fh, ierr, myid, numprocs, itag, etype, filetype, info
  integer :: status(MPI_STATUS_SIZE)
  integer :: irc, ip
  integer(kind=mpi_offset_kind) :: offset, disp
  integer :: i, j, k
  
  integer :: num
  
  character(len=64) :: filename
  
  real(8), pointer :: q(:), temp(:)
  integer, pointer :: map(:)
  integer :: single_no, count
  
  
  !--Initialize MPI
  call MPI_INIT( ierr )         ! --> Required statement
  
  !--Who am I? --- get my rank=myid
  call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
  
  !--How many processes in the global group?
  call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
  
  if ( myid == 0 ) then
     single_no = 4
  elseif ( myid == 1 ) then
     single_no = 2
  elseif ( myid == 2 ) then
     single_no = 2
  elseif ( myid == 3 ) then
     single_no = 3
  else
     single_no = 0
  end if

  if (single_no .gt. 0) allocate(map(single_no))

  if ( myid == 0 ) then
     map = (/ 0, 2, 5, 6 /)
  elseif ( myid == 1 ) then
     map = (/ 1, 4 /)
  elseif ( myid == 2 ) then
     map = (/ 3, 9 /)
  elseif ( myid == 3 ) then
     map = (/ 7, 8, 10 /)
  end if

  if (single_no .gt. 0) allocate(q(single_no))
    
  if (single_no .gt. 0) then
     do i = 1,single_no
        q(i) = dble(myid+1)*100.0d0 + dble(map(i)+1) 
     end do
  end if
  
  !if (single_no .gt. 0) map = map + 1

  if ( myid == 0 ) then
     count = 1
  else
     count = 0
  end if

  if (count .gt. 0) then
     allocate(temp(count))
     temp(1) = 2122010.0d0
  end if

  write(filename,'(a)') 'test_write.bin' 
  
  call MPI_FILE_OPEN(MPI_COMM_WORLD, filename, MPI_MODE_RDWR+MPI_MODE_CREATE, 
MPI_INFO_NULL, fh, ierr)

  if (myid == 0) then
     call MPI_FILE_WRITE(FH, temp, COUNT, MPI_REAL8, STATUS, IERR)
     write(*,*) "myid =", myid, "right after writing temp!"
  end if

  call MPI_TYPE_CREATE_INDEXED_BLOCK(single_no, 1, map, MPI_DOUBLE_PRECISION, 
filetype, ierr)
  call MPI_TYPE_COMMIT(filetype, ierr)
  disp = 8
  call MPI_FILE_SET_VIEW(fh, disp, MPI_DOUBLE_PRECISION, filetype, 'native', 
MPI_INFO_NULL, ierr)
  write(*,*) "myid = ", myid, "after MPI_FILE_SET_VIEW!"
  call MPI_FILE_WRITE_ALL(fh, q, single_no, MPI_DOUBLE_PRECISION, status, ierr)
  call MPI_FILE_CLOSE(fh, ierr)  


  !print*, 'myid =', myid, 'q=', q
  
  if (single_no .gt. 0) deallocate(map)

  if (single_no .gt. 0) deallocate(q)
  
  if (count .gt. 0) deallocate(temp)
  
  !--Finilize MPI
  call MPI_FINALIZE(irc)        ! ---> Required statement
  
  stop
  
  
end program test_MPI_write_adv2

Reply via email to