6

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).
1
  • Did you see any difference in the speed between the blocking operations and the combination of non-blocking operations followed imeddiately by a waits? Commented Jun 18, 2012 at 20:44

2 Answers 2

5

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.

Sign up to request clarification or add additional context in comments.

1 Comment

Also &arraySend is not a pointer to the allocated memory, but a pointer to the pointer of type int *. It's a problem too.
0

if you are using a decent mpi implementation, you can use mpirun -gdb, more doc here

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.