2016-04-03 15 views
5

मैं प्रक्रिया 0 से प्रक्रिया 0 से डेटा भेजने की कोशिश कर रहा हूं। यह प्रोग्राम सफल होता है जब बफर आकार 64kb से कम होता है, लेकिन अगर बफर बहुत बड़ा हो जाता है तो लटकता है। निम्नलिखित कोड इस समस्या को पुनः चाहिए (हैंग चाहिए), लेकिन अगर n कम से कम 8000.एमपीआई भेजें और रिकव बफर आकार के साथ 64kb से अधिक हैं

int main(int argc, char *argv[]){ 
    int world_size, world_rank, 
     count; 
    MPI_Status status; 


    MPI_Init(NULL, NULL); 

    MPI_Comm_size(MPI_COMM_WORLD, &world_size); 
    MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); 
    if(world_size < 2){ 
    printf("Please add another process\n"); 
    exit(1); 
    } 

    int n = 8200; 
    double *d = malloc(sizeof(double)*n); 
    double *c = malloc(sizeof(double)*n); 
    printf("malloc results %p %p\n", d, c); 

    if(world_rank == 0){ 
    printf("sending\n"); 
    MPI_Send(c, n, MPI_DOUBLE, 1, 0, MPI_COMM_WORLD); 
    printf("sent\n"); 
    } 
    if(world_rank == 1){ 
    printf("recv\n"); 
    MPI_Recv(d, n, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &status); 

    MPI_Get_count(&status, MPI_DOUBLE, &count); 
    printf("recved, count:%d source:%d tag:%d error:%d\n", count, status.MPI_SOURCE, status.MPI_TAG, status.MPI_ERROR); 
    } 

    MPI_Finalize(); 

} 

Output n = 8200; 
malloc results 0x1cb05f0 0x1cc0640 
recv 
malloc results 0x117d5f0 0x118d640 
sending 

Output n = 8000; 
malloc results 0x183c5f0 0x184c000 
recv 
malloc results 0x1ea75f0 0x1eb7000 
sending 
sent 
recved, count:8000 source:0 tag:0 error:0 

होने के लिए संशोधित किया गया है मैं इस question और इस question जो समान हैं पाया सफल होने चाहिए, लेकिन मैं वहाँ इस मुद्दे का मानना ​​है deadlocks बनाने के साथ है। मैं यहां एक समान समस्या की अपेक्षा नहीं करता क्योंकि प्रत्येक प्रक्रिया केवल एक भेज या प्राप्त कर रही है।

संपादित करें: जोड़ा गया स्थिति की जांच।

EDIT2: ऐसा लगता है कि मेरे पास ओपनएमपीआई स्थापित है, लेकिन जब मैंने एमकेएल स्थापित किया तो इंटेल से एमपीआई के कार्यान्वयन को भी स्थापित किया। मेरा कोड ओपनएमपीआई हेडर और पुस्तकालयों के साथ संकलित किया जा रहा था, लेकिन इंटेल के mpirun के साथ चलाया। जब मैं सुनिश्चित करता हूं कि मैं OpenPI से निष्पादन योग्य mpirun के साथ भागता हूं तो सभी काम अपेक्षित हैं।

+1

कोड ठीक दिखता है और वास्तव में मेरे ओपनएमपीआई इंस्टॉलेशन में ठीक है। कृपया अपनी स्थापना के बारे में अधिक जानकारी प्रदान करें। क्या आप उस इंस्टॉलेशन के साथ किसी भी पर्याप्त जटिल एमपीआई कोड को चलाने में सक्षम थे? कृपया यह जानकारी भी प्रदान करें जहां यह लटका हुआ है। आउटपुट, और फांसी प्रक्रियाओं को डीबग करने का प्रयास भी मदद करेगा। – Zulan

+0

मैं @ जुलन से सहमत हूं, लेकिन मैं रुवु से 'स्थिति' की जांच करने के लिए कहूंगा। – gsamaras

+0

इसके अलावा: ** ** मॉलोक के परिणाम ** मूल्यों की जांच करें! – Zulan

उत्तर

3

मुद्दा दोनों इंटेल की MPI और openmpi स्थापित होने के साथ किया गया था। मैंने देखा कि/usr/include/mpi।ज openmpi के स्वामित्व में था, लेकिन mpicc और mpirun इंटेल के कार्यान्वयन से थे:

$ which mpicc 
/opt/intel/composerxe/linux/mpi/intel64/bin/mpicc 
$ which mpirun 
/opt/intel/composerxe/linux/mpi/intel64/bin/mpirun 

मैं

/usr/bin/mpicc 

और

/usr/bin/mpirun 

चल रहा इस्तेमाल किया सुनिश्चित करने के द्वारा इस मुद्दे को हल करने में सक्षम था openmpi।

मेरी स्थापना की जांच के लिए @Zulan और @gsamaras के लिए धन्यवाद।

+0

आपका स्वागत है रुवु! अच्छी बात यह है कि आपने इसे हल करने के लिए कड़ी मेहनत की, +2। – gsamaras

+0

मैं आपको [पर्यावरण मॉड्यूल] (https://en.wikipedia.org/wiki/Environment_Modules_ (सॉफ़्टवेयर) की जांच करने के लिए दृढ़ता से अनुशंसा करता हूं)। यह आपको एक ही सॉफ्टवेयर के कई संस्करणों और प्रतिष्ठानों को रखने की अनुमति देता है। बाद में, आप तय कर सकते हैं कि आप किस संस्करण का उपयोग करना चाहते हैं, इस पर चिंता किए बिना कि आपने पैथ को सही तरीके से सेट किया है या नहीं। –

1

कोड ठीक है! मैं सिर्फ संस्करण 3.1.3 (mpiexec --version) के साथ की जाँच:

linux16:/home/users/grad1459>mpicc -std=c99 -O1 -o px px.c -lm 
linux16:/home/users/grad1459>mpiexec -n 2 ./px 
malloc results 0x92572e8 0x9267330 
sending 
sent 
malloc results 0x9dc92e8 0x9dd9330 
recv 
recved, count:8200 source:0 tag:0 error:1839744 

नतीजतन, समस्या अपने स्थापना के साथ आता है। निम्नलिखित समस्या निवारण विकल्पों के माध्यम से चलाएँ:

  1. malloc के परिणाम की जांच*
  2. चेक status

मैं शर्त लगा सकता है कि malloc() की वापसी मान, NULL है आप के बाद से उल्लेख करें कि यदि आप अधिक स्मृति का अनुरोध करते हैं तो यह विफल हो जाता है। यह हो सकता है कि सिस्टम उस स्मृति को देने से इंकार कर देता है।


मैं आंशिक रूप से सही था, समस्या स्थापना के साथ आया है, लेकिन ओ पी के रूप में कहा:

ऐसा लगता है मुद्दा यह है कि मैं openmpi स्थापित किया है था, लेकिन यह भी इंटेल से एमपीआई के एक कार्यान्वयन स्थापित जब मैंने एमकेएल स्थापित किया। मेरा कोड ओपनएमपीआई हेडर और पुस्तकालयों के साथ संकलित किया जा रहा था, लेकिन इंटेल के mpirun के साथ चलाया। जब मैं सुनिश्चित करता हूं कि मैं OpenPI से निष्पादन योग्य mpirun के साथ भागता हूं तो सभी काम अपेक्षित हैं।

* checking that `malloc` succeeded in C

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