2010-03-30 17 views
8

मैं एमपीआई प्रोग्रामिंग, स्टाइल सीखने के लिए नया हूं, मैं संरचनाओं को परिभाषित करके व्युत्पन्न डेटा-प्रकार बनाने तक सफल रहा। अब मैं अपनी संरचना में वेक्टर शामिल करना चाहता हूं और प्रक्रिया में डेटा भेजना चाहता हूं। पूर्व के लिए:एमपीआई (सी ++) में वेक्टर उपयोग

struct Structure{ 

//Constructor 
Structure(): X(nodes),mass(nodes),ac(nodes) { 

//code to calculate the mass and accelerations 
} 
//Destructor 
Structure() {} 

//Variables 
double radius; 
double volume; 
vector<double> mass; 
vector<double> area; 

//and some other variables 

//Methods to calculate some physical properties 

अब एमपीआई का उपयोग करके मैं प्रक्रियाओं में संरचना में डेटा भेजना चाहता हूं। क्या मेरे लिए MPI_type_struct वेक्टर शामिल करना संभव है और डेटा भेजना संभव है?

मैंने मंचों के माध्यम से पढ़ने की कोशिश की, लेकिन मैं वहां दिए गए प्रतिक्रियाओं से स्पष्ट तस्वीर प्राप्त नहीं कर पा रहा हूं। उम्मीद है कि मैं डेटा

पीएस: मैं डेटा को व्यक्तिगत रूप से भेज सकता हूं, लेकिन यदि मैं डोमेन को बहुत बड़ा मानता हूं तो MPI_Send/Recieve का उपयोग कर डेटा भेजने का ओवरहेड प्राप्त कर सकता है (10000 * 10000 कहें)

उत्तर

10

एमपीआई में संरचनाओं को परिभाषित करना एक दर्द है। मुझे लगता है कि इस तथ्य का उपयोग करना एक आसान तरीका होगा कि एसटीएल वैक्टरों को आवंटित आवंटित स्मृति की गारंटी दी जाती है। यही है, आप पहले तत्व को पॉइंटर प्राप्त करके सी arrays की तरह उनका इलाज कर सकते हैं।

std::vector<float> data; 
// ... add elements to your vector ... 
MPI_Send(&data.front(), data.size(), MPI_FLOAT, 0, 1, MPI_COMM_WORLD); 
+0

त्वरित प्रतिक्रिया के लिए धन्यवाद, यहां समस्या मैं एक ही समय में पूरी संरचना को वेक्टर और अन्य डेटा-प्रकारों के एक चर भेजने के बजाय भेजना चाहता हूं जिससे प्रक्रियाओं के बीच संचार ओवरहेड कम हो ... और मेरे पास 10 वैक्टर हैं संचार के लिए भेजा जा सकता है .... इसलिए यह धीमी गणना समय और वहां दक्षता – lsk1985

+0

@ lsk1985 को कम करके, ठीक है, मैं एमपीआई के साथ काफी मदद करने के लिए पर्याप्त अनुभव नहीं कर रहा हूं। माफ़ कीजिये। मैं केवल प्रक्रियाओं के बीच पॉइंटर्स भेजने से बचने के लिए सावधान रहूंगा (डेटा के बजाय वे इंगित करते हैं)। –

+0

यदि आपके पास पॉइंटर्स की एक सरणी है, तो MPI_Type_hindexed बनाएं, जो कि बाइट्स में व्यक्त विस्थापन के साथ ब्लॉक की एक पंक्ति है। यह केवल अंकगणित थोड़ा पता लेता है। –

-2

मैं निश्चित रूप से एक एमपीआई डेटा संरचना विशेषज्ञ नहीं हूं, लेकिन मुझे नहीं लगता कि यह किया जा सकता है। इसका कारण यह है कि मूल रूप से आपके पास डेटा भेजने के लिए पॉइंटर्स के साथ एक संरचना होती है। सभी एमपीआई डेटाटाइप कार्यों का मानना ​​है कि जो डेटा आप भेजना चाहते हैं वह स्मृति के एक संगत क्षेत्र में है। वैक्टर एक निश्चित अधिकतम आकार के हैं, और आप

double radius; 
double volume; 
int mass_size; 
int area_size; 
double mass[MASS_MAXLEN]; 
double area[AREA_MAXLEN]; 

करते हैं और उसके बाद ही तत्व में भर रहे हैं भेज सकते हैं।

वैकल्पिक रूप से, तो आप डेटा अपने आप को एक सरणी में से पहले पैक कर सकता है सरणी भेजें और भेजें। यह देखने के लिए कि क्या यह अलग भेजने से तेज था या नहीं, आपको कुछ प्रोफाइलिंग करना होगा।

+0

हां, मुझे कोशिश करने और देखने की ज़रूरत है कि क्या व्यक्तिगत वैक्टर भेजना आसान हो जाता है, सुझाव – lsk1985

+1

के लिए धन्यवाद "सभी एमपीआई डेटाटाइप कार्यों का मानना ​​है कि जो डेटा आप भेजना चाहते हैं वह स्मृति के एक समान क्षेत्र में है।" - जबकि यह सच है, आप कस्टम एमपीआई डेटाटाइप को परिभाषित कर सकते हैं जो मनमाने ढंग से स्मृति लेआउट का प्रतिनिधित्व करते हैं (मेरा जवाब देखें)। इसलिए, आप अपने पॉइंटर्स से डेटाटाइप परिभाषित कर सकते हैं, फिर इस डेटाटाइप के एक उदाहरण के रूप में एक संदेश भेजें, इस प्रकार आवश्यक परिणाम प्राप्त कर सकते हैं। – suszterpatt

0

मैं एक ऐसी ही समस्या यहाँ करने के लिए अपने समाधान का वर्णन:

Message Passing Arbitrary Object Graphs?

याद रखें कि आप prevoiusly परिभाषित कस्टम एमपीआई डेटाटाइप्स से कस्टम एमपीआई डेटाटाइप्स बना सकते हैं। उदाहरण के लिए, आप एक संरचना को परिभाषित कर सकते हैं जो संरचना के एक उदाहरण के लेआउट और सामग्री का वर्णन करता है, फिर ऑब्जेक्ट्स के पूरे वेक्टर के लिए इन स्ट्रक्चर डेटाटाइप से वेक्टर। बिल्ली, यदि आपके पास ऐसे कई वैक्टर हैं, तो आप स्ट्रक्चर के वेक्टरों से एक हिंडेक्सड डेटाटाइप बनाने, और एक ही संदेश के साथ सभी को भेजकर, अमूर्तता की एक तीसरी परत बना सकते हैं।

ऊपर दिए गए पोस्ट में आपको विभिन्न कस्टम एमपीआई डेटाटाइप के विवरणों के लिंक मिलेंगे, जो आपको उचित दृष्टिकोण पर निर्णय लेने में मदद कर सकते हैं।

+0

लिंक के लिए धन्यवाद और आपके विचार को समस्या से कैसे पहुंचे – lsk1985

0

मैं ऐसा करता हूं जैसे आप कर रहे हैं, और मुझे पता है कि मेरे प्रोसेसर आर्किटेक्चर समरूप है। मैं Boost serialization का उपयोग कर बाइट-स्वैपिंग और एमपीआई पैकिंग और अनपॅकिंग के बहुत सारे से बचता हूं।

भेजा जा रहा है:

ostringstream oss; 
    { 
    binary_oarchive oa(oss); 
    oa << BOOST_SERIALIZATION_NVP(myStruct); 
    } 

    MPI::COMM_WORLD.Send(oss.str().c_str(), 
         oss.str().size(), 
         MPI::Datatype(MPI_BYTE), 
         MpiLibWrapper::DEST_PROC_RANK, 
         MpiLibWrapper::MY_STRUCT_TAG); 

प्राप्त:

vector<char> incomingBuffer(MAX_BUFFER_SIZE); 

    MPI::COMM_WORLD.Recv(&incomingBuffer[0], incomingBuffer.size(), 
         MPI::Datatype(MPI_BYTE), 
         MpiLibWrapper::SRC_PROC_RANK, 
         MpiLibWrapper::MY_STRUCT_TAG, 
         msgStatus); 
    if (MpiLibWrapper::ErrorOccurred(msgStatus.Get_error(), 
            info.logging)) { 
     break; 
    } 
    incomingBuffer.resize(msgStatus.Get_count(MPI::Datatype(MPI_BYTE))); 

    if (incomingBuffer.size() > 0) { 
     // Shockingly, this does not result in a memory allocation. 
     istringstream iss(string(&incomingBuffer[0], incomingBuffer.size())); 

     binary_iarchive ia(iss); 

     ia >> BOOST_SERIALIZATION_NVP(myStruct); 
    } 
+0

मुझे बूस्ट सीरियलाइजेशन पर कोई जानकारी नहीं है, मुझे इसे समझने में कुछ समय बिताने की ज़रूरत है और देखें कि यह मेरी समस्या का हल करता है या नहीं। आपके सुझाव के लिए धन्यवाद – lsk1985

0

हम्म ...डेटा की धारा के रूप में सी/सी ++ संरचना भेजना केवल तभी काम करता है जब आप गारंटी देते हैं कि सभी भाग लेने वाली मशीनों पर डेटा लेआउट बिल्कुल वही है। सामान्य में, यह काम नहीं करेगा। इसके अलावा, ऐसे लोग हैं जो तर्क देंगे कि एक एमपीआई व्युत्पन्न डेटा प्रकार के रूप में पैक की गई संरचना भेजना कोड की स्पष्टता के लिए +1 है, और इरादा दिखाने के लिए है।

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