2012-06-18 14 views
5

Sono nuovo alla programmazione MPI! Ho provato a misurare la larghezza di banda di comunicazione punto-punto tra i processori per il pratico. Ma ora ricevo un errore di segmentazione! Non capisco perché questo accada. Ho anche provato valgrind su Ubuntu, ma non ne ho idea. Così forse qualcuno mi può aiutare!: DErrore di segmentazione MPI in MPI_Isend()

grazie per la risposta veloce, ma questo non cambia il problema :( Ho appena aggiornato l'errore

qui il codice sorgente

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

e qui l'errore aggiornato!

$ 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

Hai visto alcuna differenza nella velocità tra le operazioni di blocco e la combinazione di operazioni non-blocking seguito imeddiately da un attende? –

risposta

5

le dimensioni del tuo array passato è sbagliato.

sizeof(arraySend) dovrebbe essere semplice 25000 come MPI dedurre automaticamente la dimensione come si definisce il tipo di dati (qui MPI_INT). Ony se hai un array di bit normalmente hai bisogno di sizeof (...) nel tuo codice.

Prova per allocare la memoria sulla pila invece del cumulo, per esempio anziché:

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

uso int arraySend [25000];

e quindi utilizzare arraySend anziché &arraySend nelle chiamate mpi.

Se è possibile utilizzare C++, è possibile utilizzare anche le intestazioni mpi boost ottimali in cui la dimensione viene calcolata automaticamente dai dati passati.

+0

ohhh è stato stupido ^^ ma questo non lo risolve :( – samsemilia7

+1

Anche '& arraySend' non è un puntatore alla memoria allocata, ma un puntatore al puntatore di tipo' int * '. Anche questo è un problema .. –

+0

grazie voi tutti, ho appena incasinato le indicazioni: D – samsemilia7

0

se si utilizza un'implementazione mpi decente, è possibile utilizzare mpirun -gdb, più doc here