I'm new to MPI programming! I tried to measure the point-to-point communication bandwidth beetween to processors for practical. But now I get a Segmentation Fault! I don't understand why this is happen. I also tried valgrind on ubuntu, however no idea. So maybe someone can help me :D
thanks for the fast response, but this doesn't change the problem :( I just updated the error!
Here the source code
#include "mpi.h"
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
int myrank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int *arraySend = (int *)malloc(25000*sizeof(int));
int *arrayRecv = (int *)malloc(25000*sizeof(int));
double startTime = 0.0, endTime = 0.0;
MPI_Status status,statusSend, statusRecv;
MPI_Request requestSend, requestRecv;
if(size != 2){
if(myrank == 0){
printf("only two processors!\n");
MPI_Finalize();
return 0;
}
}
if(myrank == 0){
startTime = MPI_Wtime();
MPI_Send(&arraySend, 25000, MPI_INT, 1, 0,MPI_COMM_WORLD);
}else{
MPI_Recv(&arrayRecv, 25000, MPI_INT, 0, 0, MPI_COMM_WORLD, &status);
}
if(myrank == 0){
endTime = MPI_Wtime();
printf("100k Bytes blocking: %f Mb/s\n", 0.1/(endTime-startTime));
startTime = MPI_Wtime();
MPI_Isend(&arraySend, 25000, MPI_INT, 1, 0, MPI_COMM_WORLD, &requestSend);
MPI_Wait(&requestSend, &statusSend);
}else{
MPI_Irecv(&arrayRecv,25000,MPI_INT,0,0,MPI_COMM_WORLD, &requestRecv);
MPI_Wait(&requestRecv, &statusRecv);
}
if(myrank == 0){
endTime = MPI_Wtime();
printf("100k Bytes non-blocking: %f Mb/s\n", 0.1/(endTime-startTime));
}
free(arraySend);
free(arrayRecv);
MPI_Finalize();
return 0;
}
and here the error updated!
$ mpirun -np 2 nr2
[P90:05046] *** Process received signal ***
[P90:05046] Signal: Segmentation fault (11)
[P90:05046] Signal code: Address not mapped (1)
[P90:05046] Failing at address: 0x7fff54fd8000
[P90:05046] [ 0] /lib/x86_64-linux-gnu/libpthread.so.0(+0x10060) [0x7f8474777060]
[P90:05046] [ 1] /lib/x86_64-linux-gnu/libc.so.6(+0x131b99) [0x7f84744f7b99]
[P90:05046] [ 2] /usr/lib/libmpi.so.0(ompi_convertor_pack+0x14d) [0x7f84749c75dd]
[P90:05046] [ 3] /usr/lib/openmpi/lib/openmpi/mca_btl_sm.so(+0x1de8) [0x7f846fe14de8]
[P90:05046] [ 4] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0xd97e) [0x7f8470c6c97e]
[P90:05046] [ 5] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x8900) [0x7f8470c67900]
[P90:05046] [ 6] /usr/lib/openmpi/lib/openmpi/mca_btl_sm.so(+0x4188) [0x7f846fe17188]
[P90:05046] [ 7] /usr/lib/libopen-pal.so.0(opal_progress+0x5b) [0x7f8473f330db]
[P90:05046] [ 8] /usr/lib/openmpi/lib/openmpi/mca_pml_ob1.so(+0x6fd5) [0x7f8470c65fd5]
[P90:05046] [ 9] /usr/lib/libmpi.so.0(PMPI_Send+0x195) [0x7f84749e1805]
[P90:05046] [10] nr2(main+0xe1) [0x400c55]
[P90:05046] [11] /lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed) [0x7f84743e730d]
[P90:05046] [12] nr2() [0x400ab9]
[P90:05046] *** End of error message ***
--------------------------------------------------------------------------
mpirun noticed that process rank 0 with PID 5046 on node P90 exited on signal 11
(Segmentation fault).
The size of your passed array is wrong.
sizeof(arraySend)
should be simple 25000
as MPI automatically deduct the size as you define the Datatype (here MPI_INT). Only if you have a bit array you normally need sizeof()
in your code.
Try to allocate the memory on the stack instead of the heap, e.g instead of:
int *arraySend = (int *)malloc(25000*sizeof(int));
use:
int arraySend[25000];
and then use arraySend
instead of &arraySend
in your mpi calls.
If you could use C++ you can also use the nice boost mpi headers where the size is automatically calculated from the passed data.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With