I am
completely new to MPI so I hope I’m not asking anything too silly.
I have two computers, one running Ubuntu and the other running Scientific
Linux. They recognise each other as hosts, I can ssh from each
without a password and have disabled any firewalls.
Although I
can run a simple Hello World application, the trouble starts when I
try to use MPI_SEND and MPI_RECV. I am trying a simple program to
send an int variable from one node to the other (see source code
below).
If I run
the code with two processes on the same computer I get the correct
output:
dan@siriusa:~/mpich2/tutorial2$
mpiexec -n 2 ./result2
Process 0
sending number 4
Process 1
received number 4 from process 0
However,
if I try to run the code using both computers, I get:
dan@siriusa:~/mpich2/tutorial2$
mpiexec -n 2 -f hosts ./result2
Process 0
sending number 4
Process 1
received number -1078477356 from process 0
My host
file:
dan@siriusa:~/mpich2/tutorial2$
cat hosts
192.168.88.1
192.168.88.2
So there is some sort of problem with using the send/recieve functions over the network. As I said
I am a beginner at this, so any help will be greatly appreciated. Thanks in advance.
Code:
#include
<mpi.h>
#include
<stdio.h>
#include
<stdlib.h>
int
main(int argc, char** argv) {
//
Initialize the MPI environment
MPI_Init(NULL, NULL);
// Find
out rank, size
int
world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int
world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
// Get
the name of the processor
char
processor_name[MPI_MAX_PROCESSOR_NAME];
int
name_len;
MPI_Get_processor_name(processor_name, &name_len);
// We
are assuming at least 2 processes for this task
if
(world_size < 2) {
fprintf(stderr, "World size must be greater than 1 for %s\n",
argv[0]);
MPI_Abort(MPI_COMM_WORLD, 1);
}
int
number;
if
(world_rank == 0) {
// If
we are rank 0, set the number to -1 and send it to process 1
number
= 4;
printf("Process 0 sending number %d\n",number);
MPI_Send(&number, 1, MPI_INT, 1, 0, MPI_COMM_WORLD);
} else
if (world_rank == 1) {
MPI_Recv(&number, 1, MPI_INT, 0, 0, MPI_COMM_WORLD,
MPI_STATUS_IGNORE);
printf("Process 1 received number %d from process 0\n",
number);
}
MPI_Finalize();
}