[mpich-discuss] Internal memory allocation error?
Gib Bogle
g.bogle at auckland.ac.nz
Sun Oct 19 20:17:36 CDT 2008
Hi Brian,
You don't really send the data pixel-by-pixel do you? If so that would be horrendously inefficient.
Why not send a row or column at a time? Have I misunderstood you?
Cheers
Gib
Brian Harker wrote:
> 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
>>>
>>>
>>
>
>
>
More information about the mpich-discuss
mailing list