2011-11-23 14 views
7

का उपयोग करके कम करें I वर्तमान में ग्राफ सिद्धांत समस्या के लिए कुछ एमपीआई कोड पर काम कर रहा हूं जिसमें कई नोड्स में प्रत्येक का उत्तर और उस उत्तर की लंबाई हो सकती है। मास्टर नोड पर सबकुछ वापस पाने के लिए मैं उत्तर के लिए एमपीआई_गैदर कर रहा हूं और MPI_MINLOC ऑपरेशन का उपयोग करके MPI_Reduce करने का प्रयास कर रहा हूं, यह पता लगाने के लिए कि सबसे छोटा समाधान कौन था। अभी मेरी डेटाप्रकार कि लंबाई संग्रहीत करता है और नोड आईडी (http://www.open-mpi.org/doc/v1.4/man3/MPI_Reduce.3.php की तरह कई साइटों पर दिखाए जाने उदाहरणों के अनुसार) के रूप में परिभाषित किया गया है:ओपनएमपीआई MINLOC

struct minType 
{ 
    float len; 
    int index; 
}; 

प्रत्येक नोड मैं निम्नलिखित तरीके से इस struct की स्थानीय कॉपी आरंभ कर रहा हूँ पर:

int commRank; 
MPI_Comm_rank (MPI_COMM_WORLD, &commRank); 
minType solutionLen; 
solutionLen.len = 1e37; 
solutionLen.index = commRank; 

निष्पादन मैं एक MPI_Gather कॉल कि सफलतापूर्वक (मैं स्मृति में से उन्हें बाहर मुद्रित किया है उन्हें सत्यापित करने के) समाधान के सभी नीचे खींचती है के अंत में, और कॉल:

MPI_Reduce (&solutionLen, &solutionLen, 1, MPI_FLOAT_INT, MPI_MINLOC, 0, MPI_COMM_WORLD); 
,210

यह मेरी समझ है कि बहस होने की अपेक्षा की जाती है:

  1. डेटा स्रोत
  2. परिणाम के लिए लक्ष्य (नामित रूट नोड पर केवल महत्वपूर्ण)
  3. द्वारा भेजे गए आइटम्स की संख्या है प्रत्येक नोड
  4. डेटाप्रकार
  5. आपरेशन
  6. रूट (MPI_MINLOC रूप में अच्छी तरह से परिभाषित किया जाना प्रतीत होता है) (MPI_FLOAT_INT ऊपर के लिंक के आधार पर परिभाषित किया गया प्रतीत होता) निर्दिष्ट कम समूह
  7. संचार समूह में नोड की आईडी प्रतीक्षा करने के लिए।

    [compute-2-19.local:9754] *** An error occurred in MPI_Reduce 
    [compute-2-19.local:9754] *** on communicator MPI_COMM_WORLD 
    [compute-2-19.local:9754] *** MPI_ERR_ARG: invalid argument of some other kind 
    [compute-2-19.local:9754] *** MPI_ERRORS_ARE_FATAL (your MPI job will now abort) 
    -------------------------------------------------------------------------- 
    mpirun has exited due to process rank 0 with PID 9754 on 
    node compute-2-19.local exiting improperly. There are two reasons this could occur: 
    
    1. this process did not call "init" before exiting, but others in 
    the job did. This can cause a job to hang indefinitely while it waits 
    for all processes to call "init". By rule, if one process calls "init", 
    then ALL processes must call "init" prior to termination. 
    
    2. this process called "init", but exited without calling "finalize". 
    By rule, all processes that call "init" MUST call "finalize" prior to 
    exiting or it will be considered an "abnormal termination" 
    
    This may have caused other processes in the application to be 
    terminated by signals sent by mpirun (as reported here). 
    -------------------------------------------------------------------------- 
    

    मैं करने के लिए पूरी तरह से इस पर स्टम्प्ड जा रहा स्वीकार करेंगे:

मेरे कोड को कम आपरेशन के लिए बनाता जब मैं इस त्रुटि मिलती है। यदि यह महत्वपूर्ण है तो मैं CentOS 5.5 के आधार पर एक रॉक्स क्लस्टर पर OpenMPI 1.5.3 (जीसीसी 4.4 का उपयोग करके निर्मित) का उपयोग करके संकलित कर रहा हूं।

उत्तर

4

मुझे लगता है कि आपको इनपुट और आउटपुट (पहले दो तर्क) के लिए एक ही बफर का उपयोग करने की अनुमति नहीं है। मैंने मैन पेज (आपके प्रश्न में लिंक) पढ़ा है और यह कहता है:

"जब संवाददाता एक इंट्रा कम्यूनिकेटर होता है, तो आप इनपुट कम करने के लिए इनपुट आउटपुट (आउटपुट बफर का उपयोग इनपुट बफर के रूप में किया जाता है) का उपयोग करें। परिवर्तनीय MPI_IN_PLACE रूट प्रक्रिया sendbuf के मान के रूप में। इस मामले में, इनपुट डेटा प्राप्त बफर से रूट पर लिया जाता है, जहां इसे आउटपुट डेटा द्वारा प्रतिस्थापित किया जाएगा। "

+0

वह था। मैं थोड़ी देर के लिए इस तरह की चीजें कर रहा हूं (भेजने और प्राप्त करने के लिए एक ही वस्तु का उपयोग करके), मुझे वापस जाना चाहिए और सुनिश्चित करना है कि मुझे इसे वैध रूप से करने की अनुमति है। जल्दी जवाब देने का शुक्रिया। – jthecie

+0

अच्छा। (आपको डॉकू को अधिक सावधानी से पढ़ना चाहिए था लेकिन ओपनएमपीआई को एक स्पष्ट त्रुटि संदेश देना चाहिए) – Walter

+0

जहां मैंने अपने आप को पैर में गोली मार दी थी, यह याद कर रहा था कि यह सब कुछ सभी परिचालनों पर ऐसा करने में सक्षम है और यह मानने की मूर्ख गलती कर रहा है यह यहां भी काम करेगा। अब मुझे पता है और यह कोड प्राप्त करने और काम करने में सक्षम था। एक बार फिर, त्वरित उत्तर के लिए धन्यवाद। – jthecie