[mpich-discuss] Internal memory allocation error?
Brian Harker
brian.harker at gmail.com
Sun Oct 19 18:04:59 CDT 2008
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