Hi
all Open MPI users,
I
write a simple MPI program to send a text message to another process. The code
is below.
(test.c)
#include
"mpi.h"
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
int
main(int argc, char* argv[]) {
int dest, noProcesses, processId;
MPI_Status status;
char* buffer;
char* text = "ABCDEF";
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &noProcesses);
MPI_Comm_rank(MPI_COMM_WORLD, &processId);
buffer = (char*) malloc(256 * sizeof(char));
if (processId == 0) {
fprintf(stdout, "Master: sending %s to %d\n", text, 1);
MPI_Send((void *)&text, strlen(text) + 1, MPI_CHAR, 1, 0,
MPI_COMM_WORLD);
} else {
MPI_Recv(&buffer, 128, MPI_CHAR, MPI_ANY_SOURCE, MPI_ANY_TAG,
MPI_COMM_WORLD, &status);
fprintf(stdout, "Slave: received %s from %d\n", buffer,
status.MPI_SOURCE);
}
MPI_Finalize();
return 0;
}
After
compiling and executing it I get the following output:
[root@cluster
Desktop]# mpicc -o test test.c
[root@cluster
Desktop]# mpirun -np 2 test
Master:
sending ABCDEF to 1
Slave:
received ABCDEF from 0
In
the source code above, I replace
char*
text = "ABCDEF";
by
char*
text = argv[1];
then
compile and execute it again with the following commands:
[root@cluster
Desktop]# mpicc -o test test.c
[root@cluster
Desktop]# mpirun -np 2 test ABCDEF
Then
I get the following output:
Master:
sending ABCDEF to 1
[cluster:03917]
*** Process received signal ***
[cluster:03917]
Signal: Segmentation fault (11)
[cluster:03917]
Signal code: Address not mapped (1)
[cluster:03917]
Failing at address: 0xbfa445a2
[cluster:03917]
[ 0] [0x959440]
[cluster:03917]
[ 1] /lib/libc.so.6(_IO_fprintf+0x22) [0x76be02]
[cluster:03917]
[ 2] test(main+0x143) [0x80488b7]
[cluster:03917]
[ 3] /lib/libc.so.6(__libc_start_main+0xdc) [0x73be8c]
[cluster:03917]
[ 4] test [0x80486c1]
[cluster:03917]
*** End of error message ***
--------------------------------------------------------------------------
mpirun
noticed that process rank 1 with PID 3917 on node cluster.hpc.org exited on
signal 11 (Segmentation fault).
--------------------------------------------------------------------------
I’m
very confused because the only difference between the two source codes is the
difference between
char*
text = "ABCDEF";
and
char*
text = argv[1];
Can
any one help me why the results are so different? How can I send argv[i] to
another process?
Thank
you very much!