cccccccccccccccccccccccccccccccccccccccccccccccc
c Matrix Multiplication MPI Program c
c For this simple version, # of procssors c
c equals # of columns in matrix c
c c
c To run, mpirun -np 4 a.out c
cccccccccccccccccccccccccccccccccccccccccccccccc
include 'mpif.h'
parameter (ncols=4, nrows=4)
integer a(ncols,nrows), b(ncols,nrows), c(ncols,nrows)
integer buf(ncols),ans(nrows)
integer myid, root, numprocs, ierr, status(MPI_STATUS_SIZE)
integer sender, count
call MPI_INIT(ierr)
call MPI_COMM_RANK( MPI_COMM_WORLD, myid, ierr )
call MPI_COMM_SIZE( MPI_COMM_WORLD, numprocs, ierr )
if(numprocs.ne.4) then
print *, "Please run this exercise on 4 processors"
call MPI_FINALIZE(ierr)
stop
endif
root = 0
tag = 100
count = nrows*ncols
c Master initializes and then dispatches to others
IF ( myid .eq. root ) then
do j=1,ncols
do i=1,nrows
a(i,j) = 1
b(i,j) = j
enddo
enddo
c send a to all other process
call MPI_BCAST(a,count,MPI_INTEGER,root,MPI_COMM_WORLD,ierr)
c send one column of b to each other process
do j=1,numprocs-1
do i = 1,nrows
buf(i) = b(i,j+1)
enddo
call MPI_SEND(buf,nrows,MPI_INTEGER,j,tag,MPI_COMM_WORLD,ierr)
enddo
c Master does his own part here
do i=1,nrows
ans(i) = 0
do j=1,ncols
ans(i) = ans(i) + a(i,j) * b(i,1)
enddo
c(i,1) = ans(i)
enddo
c then receives answers from others
do j=1,numprocs-1
call MPI_RECV(ans, nrows, MPI_INTEGER, MPI_ANY_SOURCE,
$ MPI_ANY_TAG, MPI_COMM_WORLD, status, ierr)
sender = status(MPI_SOURCE)
do i=1,nrows
c(i,sender+1) = ans(i)
enddo
enddo
do i=1,nrows
write(6,*)(c(i,j),j=1,ncols)
enddo
ELSE
c slaves receive a, and one column of b, then compute dot product
call MPI_BCAST(a,count,MPI_INTEGER,root,MPI_COMM_WORLD,ierr)
call MPI_RECV(buf, nrows, MPI_INTEGER, root,
$ MPI_ANY_TAG, MPI_COMM_WORLD, status, ierr)
do i=1,nrows
ans(i) = 0
do j=1,ncols
ans(i) = ans(i) + a(i,j) * buf(j)
enddo
enddo
call MPI_SEND(ans,nrows,MPI_INTEGER,root,0,MPI_COMM_WORLD,ierr)
ENDIF
call MPI_FINALIZE(ierr)
stop
end