2012-06-18 2 views
5

Ich bin neu in MPI-Programmierung! Ich versuchte, die Punkt-zu-Punkt-Kommunikationsbandbreite zwischen Prozessoren für praktische zu messen. Aber jetzt bekomme ich eine Segmentation Fault! Ich verstehe nicht, warum das passiert. Ich habe auch Valgrind auf Ubuntu versucht, aber keine Ahnung. Vielleicht kann mir jemand helfen: DMPI Segmentierungsfehler in MPI_Isend()

Dank für die schnelle Antwort, aber das ändert sich nicht das Problem :( ich gerade aktualisiert den Fehler

hier den Quellcode

#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; 
} 

und hier der Fehler aktualisiert!

$ 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). 
+0

Haben Sie einen Unterschied in der Geschwindigkeit zwischen den Sperroperationen und der Kombination von nicht-blockierenden Operationen gefolgt imeddiately durch ein wartet? –

Antwort

5

die Größe von Ihrem übergebenen Array ist falsch.

sizeof(arraySend) sollte einfach sein 25000 als MPI automatisch die Größe abziehen, wie Sie den Datentyp (hier MPI_INT) definieren. Nur wenn Sie ein Bit-Array haben, benötigen Sie normalerweise sizeof (...) in Ihrem Code.

Try der Speicher auf dem Stapel anstelle des Haufens zuzuteilen, z.B. Statt:

int *arraySend = (int *)malloc(25000*sizeof(int)); 

Verwendung arraySend int [25000];

und dann arraySend anstelle von &arraySend in Ihren MPI-Anrufe verwenden.

Wenn Sie C++ verwenden könnten, können Sie auch die netten Boost-Mpi-Header verwenden, bei denen die Größe automatisch aus den übergebenen Daten berechnet wird.

+0

ohhh das war dumm ^^ aber das löst es nicht :( – samsemilia7

+1

Auch '& arraySend' ist kein Zeiger auf den allokierten Speicher, sondern ein Zeiger auf den Zeiger vom Typ' int * '. Es ist auch ein Problem. –

+0

thank Sie alle, ich habe nur die Zeiger vermasselt: D – samsemilia7

0

wenn Sie eine anständige mpi Implementierung verwenden, können Sie verwenden mpirun -gdb, mehr doc here