Commit 78f7914f authored by Jussi Enkovaara's avatar Jussi Enkovaara
Browse files

Simple exercise for exchanging messages with two processes

parent 015fa462
Copyright (C) 2018 CSC - IT Center for Science Ltd.
Licensed under the terms of the GNU General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
Code is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
Copy of the GNU General Public License can be obtained from
<http://www.gnu.org/licenses/>.
## Simple message exchange
a) Write a simple program where two processes send and receive a
message to/from each other using `MPI_Send` and `MPI_Recv`. The message
content is an integer array, where each element is initialized to the
rank of the process. After receiving a message, each process should
print out the rank of the process and the first element in the
received array. You may start from scratch or use as a starting point
the skeleton code found in [exchange.c](exchange.c),
[exchange.F90](exchange.F90) or [exchange.py](exchange.py)
b) Increase the message size to 100,000, recompile and run. It is very likely
that the program will dead lock, try to figure out reason for this, and
how to resolve it.
program exchange
use mpi
implicit none
integer, parameter :: size = 100
integer :: rc, myid, ntasks, count
integer :: status(MPI_STATUS_SIZE)
integer :: message(size)
integer :: receiveBuffer(size)
call mpi_init(rc)
call mpi_comm_rank(MPI_COMM_WORLD, myid, rc)
call mpi_comm_size(MPI_COMM_WORLD, ntasks, rc)
message = myid
! TODO: Implement sending and receiving as defined in the assignment
if ( myid == 0 ) then
write(*,'(A10,I3,A10,I3)') 'Rank: ', myid, &
' received ', receiveBuffer(1)
else if (myid == 1) then
write(*,'(A10,I3,A10,I3)') 'Rank: ', myid, &
' received ', receiveBuffer(1)
end if
call mpi_finalize(rc)
end program exchange
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
int main(int argc, char *argv[])
{
int i, myid, ntasks;
int size = 100;
int *message;
int *receiveBuffer;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
/* Allocate message */
message = malloc(sizeof(int) * size);
receiveBuffer = malloc(sizeof(int) * size);
/* Initialize message */
for (i = 0; i < size; i++) {
message[i] = myid;
}
/* TODO: */
/* Send and receive messages as defined in exercise */
if (myid == 0) {
printf("Rank %i received %i\n", myid, receiveBuffer[0]);
} else if (myid == 1) {
printf("Rank %i received %i\n", myid, receiveBuffer[0]);
}
free(message);
free(receiveBuffer);
MPI_Finalize();
return 0;
}
from __future__ import print_function
from mpi4py import MPI
import numpy
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# Simple message exchange using numpy arrays
n = 100000
data = numpy.zeros(n, int) + rank
buff = numpy.empty(n, int)
# TODO:
# Send and receive messages as defined in exercise
if rank == 0:
elif rank == 1:
print("Rank {0} received an array filled with {1}s.".format(rank, buff[0]))
# Simple message exchange of Python objects
meta = {'rank': rank}
# TODO:
# Send and receive messages as defined in exercise
if rank == 0:
elif rank == 1:
print("Rank {0} received a message from rank {1}.".format(rank, msg['rank']))
program exchange
use mpi
implicit none
integer, parameter :: size = 100000
integer :: rc, myid, ntasks, count
integer :: status(MPI_STATUS_SIZE)
integer :: message(size)
integer :: receiveBuffer(size)
call mpi_init(rc)
call mpi_comm_rank(MPI_COMM_WORLD, myid, rc)
call mpi_comm_size(MPI_COMM_WORLD, ntasks, rc)
message = myid
! Send and receive as defined in the assignment
if ( myid == 0 ) then
call mpi_send(message, size, MPI_INTEGER, 1, &
1, MPI_COMM_WORLD, rc)
call mpi_recv(receiveBuffer, size, MPI_INTEGER, 1, &
2, MPI_COMM_WORLD, status, rc)
write(*,'(A10,I3,A10,I3)') 'Rank: ', myid, &
' received ', receiveBuffer(1)
else if (myid == 1) then
! One MPI tasks needs to start with send and the other one with
! receive, otherwise the program dead locks with large message
! sizes in most MPI implementations
call mpi_recv(receiveBuffer, size, MPI_INTEGER, 0, &
1, MPI_COMM_WORLD, status, rc)
call mpi_send(message, size, MPI_INTEGER, 0, &
2, MPI_COMM_WORLD, rc)
write(*,'(A10,I3,A10,I3)') 'Rank: ', myid, &
' received ', receiveBuffer(1)
end if
call mpi_finalize(rc)
end program exchange
#include<stdio.h>
#include<stdlib.h>
#include<mpi.h>
int main(int argc, char *argv[])
{
int i, myid, ntasks;
int size = 100000;
int *message;
int *receiveBuffer;
MPI_Status status;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &ntasks);
MPI_Comm_rank(MPI_COMM_WORLD, &myid);
/* Allocate message */
message = malloc(sizeof(int) * size);
receiveBuffer = malloc(sizeof(int) * size);
/* Initialize message */
for (i = 0; i < size; i++) {
message[i] = myid;
}
/* Send and receive messages as defined in exercise */
if (myid == 0) {
MPI_Send(message, size, MPI_INT, 1, 1, MPI_COMM_WORLD);
MPI_Recv(receiveBuffer, size, MPI_INT, 1, 2, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
printf("Rank %i received %i\n", myid, receiveBuffer[0]);
} else if (myid == 1) {
/* One MPI tasks needs to start with send and the other one with
* receive, otherwise the program dead locks with large message
* sizes in most MPI implementations */
MPI_Recv(receiveBuffer, size, MPI_INT, 0, 1, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
MPI_Send(message, size, MPI_INT, 0, 2, MPI_COMM_WORLD);
printf("Rank %i received %i\n", myid, receiveBuffer[0]);
}
free(message);
free(receiveBuffer);
MPI_Finalize();
return 0;
}
from __future__ import print_function
from mpi4py import MPI
import numpy
comm = MPI.COMM_WORLD
rank = comm.Get_rank()
# Simple message exchange
meta = {'rank': rank}
if rank == 0:
comm.send(meta, dest=1)
msg = comm.recv(source=1)
elif rank == 1:
msg = comm.recv(source=0)
comm.send(meta, dest=0)
print("Rank {0} received a message from rank {1}.".format(rank, msg['rank']))
# Simple message exchange using numpy arrays
n = 100000
data = numpy.zeros(n, int) + rank
buff = numpy.empty(n, int)
if rank == 0:
comm.Send(data, dest=1)
comm.Recv(buff, source=1)
elif rank == 1:
# One MPI tasks needs to start with send and the other one with
# receive, otherwise the program dead locks with large message
# sizes in most MPI implementations
comm.Recv(buff, source=0)
comm.Send(data, dest=0)
print("Rank {0} received an array filled with {1}s.".format(rank, buff[0]))
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment