2012-06-18 13 views
5

मैं एमपीआई प्रोग्रामिंग में नया हूं! मैंने पॉइंट-टू-पॉइंट संचार बैंडविड्थ को व्यावहारिक के लिए प्रोसेसर के बीच मापने की कोशिश की। लेकिन अब मुझे सेगमेंटेशन फॉल्ट मिल गया है! मुझे समझ में नहीं आता कि ऐसा क्यों होता है। मैंने उबंटू पर भी वाल्ग्रिंड की कोशिश की, हालांकि कोई विचार नहीं। तो हो सकता है किसी ने मुझे मदद कर सकते हैं: डी तेजी से प्रतिक्रिया के लिएएमपीआई सेगमेंटेशन गलती()

धन्यवाद, लेकिन इस समस्या को :( त्रुटि परिवर्तन नहीं करता है मैं तो बस अद्यतन

यहाँ स्रोत कोड

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

और यहाँ त्रुटि अद्यतन!

$ 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

आप अवरुद्ध संचालन और गैर-अवरुद्ध आपरेशन के संयोजन के बीच गति में कोई अंतर दिखाई एक प्रतीक्षा करता है के द्वारा imeddiately पीछा किया था? –

उत्तर

5

आकार आपके पास सरणी का गलत है।

sizeof(arraySend) सरल 25000 होना चाहिए क्योंकि MPI स्वचालित रूप से आकार को घटा देता है क्योंकि आप डेटाटाइप (यहां MPI_INT) को परिभाषित करते हैं। ओनी अगर आपके पास थोड़ा सरणी है तो आपको सामान्य रूप से अपने कोड में आकार (...) की आवश्यकता होती है।

कोशिश ढेर के बजाय ढेर, बजाय, उदा, पर स्मृति को आबंटित करने:

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

उपयोग पूर्णांक arraySend [25000];

और फिर arraySend का उपयोग अपने एमपीई कॉल में &arraySend के बजाय करें।

यदि आप सी ++ का उपयोग कर सकते हैं तो आप अच्छे बूस्ट एमपीआई हेडर का भी उपयोग कर सकते हैं जहां आकार को स्वचालित रूप से पास किए गए डेटा से गणना की जाती है।

+0

ओह यह बेवकूफ था ^^ लेकिन यह इसे हल नहीं करता है :( – samsemilia7

+1

इसके अलावा '& arraySend' आवंटित स्मृति के लिए सूचक नहीं है, लेकिन 'int *' प्रकार के सूचक के लिए एक सूचक है। यह भी एक समस्या है। –

+0

धन्यवाद आप सब, मैंने बस पॉइंटर्स को गड़बड़ कर दिया: डी – samsemilia7

0

यदि आप एक सभ्य एमपीआई कार्यान्वयन का उपयोग कर रहे हैं, तो आप mpirun -gdb, अधिक दस्तावेज़ का उपयोग कर सकते here

संबंधित मुद्दे