[mpich-discuss] Internal memory allocation error?
Brian Harker
brian.harker at gmail.com
Sun Oct 19 19:27:59 CDT 2008
Hi Rajeev-
The code I have posted is pared down quite a bit. I print the
"numsent" variable after each send and receive to make sure the
correct pixel has been dispatched. I guess I should mention that if I
run the same program on some other data that I have, which has only
68K pixels, it works flawlessly.
On Sun, Oct 19, 2008 at 5:57 PM, Rajeev Thakur <thakur at mcs.anl.gov> wrote:
> Brian,
> This code should not even need an Irecv because the master and slave
> operate in lock step. And if you call Irecv followed by a Wait immediately,
> you could as well call Recv.
>
> Since it fails with even one slave, run the 1 master 1 slave version and add
> print statements after the sends and receives to see how many sends and
> receives are happening.
>
> Rajeev
>
>
>> -----Original Message-----
>> From: owner-mpich-discuss at mcs.anl.gov
>> [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Brian Harker
>> Sent: Sunday, October 19, 2008 6:05 PM
>> To: mpich-discuss at mcs.anl.gov
>> Subject: Re: [mpich-discuss] Internal memory allocation error?
>>
>> Hi list-
>>
>> Here's my sample code for those that are wary of opening
>> email attachments :) Didn't think about that until just now.
>>
>> PROGRAM mpi_main
>>
>> USE subroutines ! contains subroutine "invert_pixel"
>> IMPLICIT NONE
>>
>> INCLUDE "mpif.h"
>>
>> ! total number of pixels
>> INTEGER, PARAMETER :: np = nx * ny !nx,ny specified in
>> module "subroutines"
>>
>> ! parameter at each pixel
>> DOUBLE PRECISION :: par
>>
>> ! full-size parameter array
>> DOUBLE PRECISION, DIMENSION(nx,ny) :: map
>>
>> ! pixel coordinates
>> INTEGER, DIMENSION(2) :: pxl
>>
>> ! dummy termination message
>> INTEGER, PARAMETER :: term = 0
>>
>> ! MPI-related
>> INTEGER :: proc_id
>> INTEGER :: proc_num
>> INTEGER :: master
>> INTEGER :: ierr
>> INTEGER :: sender
>> INTEGER :: tag
>> INTEGER :: numsent
>> INTEGER :: request
>> INTEGER, DIMENSION(MPI_STATUS_SIZE) :: status
>>
>> ! local indices
>> INTEGER :: i
>>
>> !********************************************************************!
>> !************************** BEGIN PROGRAM ***************************!
>> !********************************************************************!
>> master = 0
>>
>> ! initialize MPI libraries...
>> CALL MPI_Init( ierr )
>> CALL MPI_Comm_size( MPI_COMM_WORLD, proc_num, ierr ) CALL
>> MPI_Comm_rank( MPI_COMM_WORLD, proc_id, ierr )
>>
>> ! --------------------------------------------- !
>> ! master process code !
>> ! --------------------------------------------- !
>> IF ( proc_id == master ) THEN
>>
>> ! dispatch first group of pixels to slave processes...
>> numsent = 0
>> DO i = 1, proc_num - 1
>>
>> pxl(1) = INT(numsent/ny) + 1
>> pxl(2) = MOD(numsent,ny) + 1
>> CALL MPI_Send( pxl, 2, MPI_INTEGER, i, numsent+1,
>> MPI_COMM_WORLD, ierr )
>> numsent = numsent + 1
>>
>> END DO
>>
>> mstr: DO
>>
>> ! receive inferred parameter back from a slave...
>> CALL MPI_Recv( par, 1, MPI_DOUBLE_PRECISION,
>> MPI_ANY_SOURCE, MPI_ANY_TAG, MPI_COMM_WORLD, status, ierr )
>> sender = status(MPI_SOURCE)
>> tag = status(MPI_TAG)
>>
>> ! assemble into full-size array...
>> x = INT(tag/ny) + 1
>> y = MOD(tag,ny) + 1
>>
>> map(x,y) = par
>>
>> IF ( tag == np ) THEN
>> ! all done, send termination message...
>> DO j = 1, proc_num - 1
>> CALL MPI_Send( term, 1, MPI_INTEGER, j, 0,
>> MPI_COMM_WORLD, ierr )
>> END DO
>> EXIT mstr
>> END IF
>>
>> ! send the next available pixel to same slave...
>> pxl(1) = INT((numsent+1) / ny) + 1
>> pxl(2) = MOD((numsent+1), ny) + 1
>>
>> CALL MPI_Send( pxl, 2, MPI_INTEGER, sender,
>> numsent+1, MPI_COMM_WORLD, ierr )
>> numsent = numsent + 1
>>
>> END DO mstr
>> ! --------------------------------------------- !
>> ! slave process code !
>> ! --------------------------------------------- !
>> ELSE
>>
>> slv: DO
>>
>> ! receive pixel coordinates from master...
>> CALL MPI_Irecv( pxl, 2, MPI_INTEGER, master,
>> MPI_ANY_TAG, MPI_COMM_WORLD, request, ierr )
>> CALL MPI_Wait( request, status, ierr )
>> tag = status(MPI_TAG)
>> IF ( tag == 0 ) THEN
>> ! all done, exit program...
>> EXIT slv
>> END IF
>>
>> ! call genetic algorithm for inversion...
>> CALL invert_pixel( pxl, par )
>>
>> ! send parameter result back to master...
>> CALL MPI_Send( par, 1, MPI_DOUBLE_PRECISION, master,
>> tag, MPI_COMM_WORLD, ierr )
>> END DO slv
>>
>> END IF
>>
>> ! shut down MPI...
>> CALL MPI_Finalize( ierr )
>> WRITE(*,*) ""
>> IF ( ierr == 0 ) WRITE(*,*) "Goodbye from process",proc_id
>>
>> !********************************************************************!
>> !**************************** END PROGRAM ***************************!
>> !********************************************************************!
>>
>> STOP
>> END PROGRAM mpi_main
>>
>>
>>
>>
>> --
>> Cheers,
>> Brian
>> brian.harker at gmail.com
>>
>>
>> "In science, there is only physics; all the rest is stamp-collecting."
>>
>> -Ernest Rutherford
>>
>>
>
>
--
Cheers,
Brian
brian.harker at gmail.com
"In science, there is only physics; all the rest is stamp-collecting."
-Ernest Rutherford
More information about the mpich-discuss
mailing list